Git Product home page Git Product logo

everycode's Introduction

All_Language_Code_Source

不区分编程语言,分享的代码段均可以push

开卷有益

Wiki

读书时候弄的博客

文件说明

就和文件夹命名一致

everycode's People

Contributors

holdyounger avatar fole-del avatar

Watchers

 avatar

everycode's Issues

Procmon 过滤用法

Procmon 过滤用法

  • Application Details
    • – Process Name:产生事件的那个进程的名字
    • – Image Path:进程镜像的完整路径
    • – Command Line:命令行,用于启动进程
    • – Company Name:进程镜像文件中的企业名称。这个文本是由应用程序的开发者来定义的
    • – Description:进程镜像文件中的产品描述信息。这个文本是由应用程序的开发者定义的
    • – Version:进程镜像文件中的产品版本号。这个文本是由应用程序的开发者定义的
  • Event Details
    • – Sequence Number:操作在全体事件中的相对位置,也包括当前的过滤
    • – Event Class:事件的类别(文件,注册表,进程)
    • – Operation:特殊事件操作,比如Read、RegQueryValue等
    • – Date & Time:操作的日期和时间
    • – Time of Day:只是操作的时间
    • – Path:一个事件引用资源的路径
    • – Detail:事件的附加信息
    • – Result:一个完成了的操作的状态码
    • – Relative Time:一个操作相对于Process Monitor的启动后的时间,或者相对于Process Monitor的信息清除后的时间
    • – Duration:一个已经完成了的操作所持续的时间
  • Process Management
    • – User Name:正在执行操作的进程的用户账户名
    • – Session ID:正在执行操作的进程的Windows会话ID
    • – Authentication ID:正在执行操作的进程的登录会话ID
    • – Process ID:执行了操作的进程的进程ID
    • – Thread ID:执行了操作的线程的线程ID
    • – Integrity Level:正在运行的进程执行操作时的可信级别(仅支持Vista以上系统)
    • – Virtualized:执行了操作的进程的虚拟化状态

删除文件

  • 删除
    1. _del.
  • 重命名并删除
    1. trustdservice.exe -> trustservice_del.exe (以下文件均改为"文件名_del.ext")
    2. trustfixservice.exe
    3. ServiceDetect.dll
    4. libgcommon.dll
    5. TrustAgent.exe
    6. TrustAgentApp.dll
    7. trustcore.dll
    8. trustnc.dll
    9. trustproxy.dll
    10. trustproxyserver.dll
    11. trustcheck.exe
    12. trustproxy64.sys
    13. trustproxy.sys
    14. vpnvnic.sys
    15. QInstUtils.exe
    16. ClientLogTool.exe
    17. QtWebEngineProcess.exe
    18. TrustAgent.config
    19. TrustAgentExtra.config

重命名完成之后会删除以上文件

结束进程

  1. trustservice
  2. TrustAgent
  3. QtWebEngineProcess
  4. trustdservice
  5. trustfixservice

释放文件

  • 文件
    1. 虚拟网卡驱动
    2. 代理驱动
    3. trustservice
    4. trustfixservice.exe
    5. ServiceDetect.dll
    6. libgcommon.dll
    7. TrustAgent.exe
    8. TrustAgentApp.dll
    9. trustcore.dll
    10. trustnc.dll
    11. trustproxy.dll
    12. trustproxyserver.dll
    13. trustcheck.exe
    14. trustproxy64.sys
    15. trustproxy.sys
    16. vpnvnic.sys
    17. QInstUtils.exe
    18. ClientLogTool.exe
    19. QtWebEngineProcess.exe
  • 目录
    1. qtdepends
    2. oemdepends
    3. cert

删除旧的快捷方式

  1. 国信安全接入.lnk
  2. 青鸾安全接入.lnk
  3. TrustAgent.lnk
  4. 零信任客户端.lnk

清理路由

调用安装目录下 ClearHost.exe

更新配置文件

  1. TrustAgent.config
  2. TrustAgentExtra.config

更新注册表

注册表路径

!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"

更新字段

  1. DisplayName
  2. Publisher
  3. DisplayIcon
  4. UninstallString
  5. DisplayVersion
  6. InstallDir
  7. ProxyVersion
  8. InstParams

配置崩溃状态

配置系统LocalDumps,设置相关注册表项

创建快捷方式

以更新程序的快捷方式命名为主。

更新 TrustService

调用 Trustservice.exe /update 更新。

更新TrustFixService

调用 TrustFixservice.exe /update 更新。

启动 TrustService

调用 Trustservice.exe /start 更新。

启动 YMDbg.exe

直接启动 $INSTALLDIR\Dbg\Ymdbg.exe

Exec YMDbg.exe -i1

刷新 Windows 图标缓存

blog link Procmon 过滤用法

**马克思主义科学技术观 # issue 标题模板 默认: **马克思主义科学技术观

[toc]

第四章、科学技术社会论

1. 为什么说“科学是一种在历史上起推动作用的、革命的力量”?

>   科学技术是历史发展的火车头,改变了社会历史进程,造就了新的社会形态;推动了生产力内部各要素的变革,引发了产业结构的调整、经济形式的变化和经济增长方式的转变,造就了经济转型;产生了技术异化现象,要对异化的资本主义制度展开批判,更好地发挥科学技术的社会功能。
>   科学技术作为社会发展的动力,是马克思主义的基木观点。科学是生产力的“知识的形态”。作为生产力的科学技术,能够大大提高社会生产力水平,推动着整个人类物质生产的迅猛发展。
>   作为强大的精神力量的科学技术,能够促进人类**的解放,在产业革命的基础上,推动社会变革,对社会生产关系产生有力影响。
>   作为人类最终走向白由的科学技术,能够作为解放的杠杆,增进人类精神生活的丰富性和自我发展能力,有助于实现人的全面自由的发展。

2. 如何看待科学技术对人的异化和对自然的异化?

>   科技异化实质上是在资本主义制度下劳动异化和人的异化一种必然结果。由于劳动是人的最根本最现实的实践活动,是人及人类社会存在的根本方式,劳动的异化必然带来人的其他社会活动和社会关系的全面异化,科学技术也不例外,因为“宗教、家庭、国家、法、道德、科学、艺术等等,都不过是生产的一些特殊的方式,并且受生产的普遍规律的支配。”
>
>   因此,科学技术作为劳动亦即人处理自身与自然界关系的社会活动的产物,也必然随着资本主义社会劳动的异化而表现出异化的现象。最根本的是要消灭对科学技术的资本主义利用方式,把现代科学技术从资本主义制度下解放出来。也就是说只有通过无产阶级革命来最终解决资本主义的科技异化问题。当然,在马克思看来,异化的完全克服只有在共产主义社会制度中才能最终实现。

3. 科学技术的社会体制和组织机构对科学技术的发展有何意义?

>   科学技术的社会建制有一个历史过程。经济支持制度、法律保障体系等科学技术体制是根本,各种组织机构及其科研组织运行是保证,科学技术的伦理规范是导引。在科学技术发展应用的新阶段,科学技术的社会建制呈现出一些新特点,因此必须进行科学技术体制改革,以保证科学技术的良好运行。
>   作为社会建制的科学技术体制是在一定社会价值观念支配下,依据相应的物质设备条件形成的一种社会组织制度,旨在支持推动人类对自然的认识和利用。科学技术的体制化以相应的职业化为核心,其内涵随着科学技术的发展而不断拓展和丰富。科学技术的社会体制包括:组织领导体制、经济支持制度、法律保障体制、交流与传播体制、人才教育培养制度等。科学技术与其他各种事业密切相关,需要建立相应的组织机构以保证科学技术活动的顺利进行。科学技术组织机构随着历史的演化而变化,具有各白的特点和功能,是实现科学技术现代化的组织保证。在科学技术社会史上形成与发展起来的组织机构有:科学技术决策、管理与咨询机构,科学技术活动组织机构,科学技术传播机构,科学技术人才培养机构。
>
> ---
>
> 【以下摘白百度贴吧帖子“科学技术的社会体制化及其对科学发展的意义”】
> 科学技术体制化的内容包括:科学技术的投入体制、科技研究的结构比例、科学技术的法律制度、科技研究的管理体制。
> 科学技术的社会体制化对科学发展的意义:1、它可以积聚社会上的力量来进行柑应的科学研究;2、当代科技活动的结构中基础研究将会有大量的人员参l与j;3、明确的法律以及管理制度将会更进一步促进科学技术的发展。

4. 为什么要对科学技术工作者进行伦理规范?

>   科学技术活动与人类其他活动一样,建立在诚信和道德的基础上。现阶段,默顿的科学的精神气质受到挑战,科学技术工作者有失范行为,需要制定相关科研诚信指南和工程师伦理准则加以规范。科学工作者进行科学研究和医学实践,尤其是进行人体实验和动物实验,应该遵循社会伦理、生命伦理、动物伦理等。技术工作者,尤其是工程师,在工程技术活动中,应该遵循一定的职业伦理和社会伦理准则,应该承担对社会、专业、雇主和同事的责任,应该对工程的环境影响负有特别的责任,规范白己的行为,为人类福祉和环境保护服务。

5. 如何理解科学技术文化与人文文化之间的冲突与协调?

> (一)社会文化对科学技术的影响
>   科学技术的产生和发展需要一定的社会文化环境。社会文化与科学技术文化紧密关联,并由此影响科学技术的发展及其应用。默顿在《十七世纪英格兰的科学、技术与社会》中提出的“清教主义促进英国近代科学的制度变化”,以及“李约瑟难题”——“近代科学为什么没有在**诞生”的解答,就说明了这一点。
>
> (二)科学文化与人文文化的协调
>   1.要防止科学在生活世界、自然世界对人文的僭越所造成的科学文化与人文文化之间的冲突,深刻理解科学的限度,用正确的人文理念指导我们的生活。
>   2.必须以社会先进文化来引领科学技术文化,使科学技术发展和应用为经济社会健康全面发展服务。得到广泛提倡的环境科学技术就是为了协调人与自然之间的关系所做的努力,是科学技术文化与人文文化——绿色文化的良性互动产物。

6. 科学技术的风险有哪些?如何恰当地进行科学技术风险评价与决策?

>   科学技术的风险包括环境风险、政治风险、经济风险、健康风险和伦理风险等。这些风险会引发一系列争论,造成评价和决策上的困难。***指出:“要加快建立科技咨询支撑行政决策的科技决策机制,加强科技决策咨询系统,建设高水平科技智库。要加快推进重大科技决策制度化,解决好实际存在的部门领导拍脑袋、科技专家看颜色行事等问题。”
>
> 要恰当进行科学技术风险评价与决策,就应该全面评价科学技术风险—收益的多个方面,批判性地考察“内部"存有争议的科学知识或技术知识,分析相互竞争的利益集团和社会结构的"外部"政治学,理解科学技术专家知识和决策的局限性、公众理解科学的必要性以及外行知识的优势,明确政府、科学技术专家以及公众在与科学技术风险相关的公共决策中的不同作用,确立公众参与决策的可能方式,从而形成最优化的科学技术公共政策模式,以达到对科学技术风险社会有效治理的目的。

第五章、**马克思主义科学技术观

1. 为什么说新时代**马克思主义科学技术是一个科学、完整的**理论体系?

>   ***、***、……、胡锦涛、***的科学技术**,是在**共产党领导我国科学技术事业发展和进行社会主义现代化建设的伟大时间中,逐渐形成、发展和完善的。
>
>   **马克思主义科学技术观是基于马克思、恩格斯的科学技术**,对当代科学技术机器发展规律的概括和总结,是马克思主义科学技术论的重要组成部分。
>
>   **马克思主义科学技术观是**共产党人集体智慧的结晶,是对***、***、……、***科学技术**的概括和总结,是他们科学技术**的理论升华和飞跃,是他们科学技术**的凝练和精髓。
>
>   **马克思主义科学技术观的内容丰富,涉及了科学技术的功能、目标、机制、战略、人才和方针等重大问题,是一个科学、完整的**理论体系。

2. 如何理解**马克思主义科学技术观的理论精髓?

>  **马克思主义科学技术观概括和总结了***、***、···、***等的科学技术**,包括科学技术的功能观、战略观、人才观、和谐观和创新观的基木内容,体现出时代性、实践性、科学性、创新性、自主性、人本性等特征,建设**特色的创新型国家,是**马克思主义科学技术观的具体体现。**马克思主义科学技术观,是马克思主义科学技术观与**具体科学技术实践相结合的产物,是马克思主义科学技术论的重要组成部分。

3. 如何理解***新时代**特色社会主义**中的科学技术观的时代意义?

>   **马克思主义科学技术观的三个历史阶段是其各自所处的历史条件所决定的,是对时代背景实事求是的反映,因此科学技术**都镌刻了时代的烙印,反映了时代的需求。
>
>   ***新时代**特色社会主义**中的科学技术观,是在**特色社会主义进入新时代的历史条件下形成的。新时代之“新",一是在于我们进入了一个新的发展阶段,发展环境、发展条件都发生了新的变化,目标任务也发生了新的变化;二是在于我们面临着新的社会主义主要矛盾;三是我们迈向新的奋斗目标。正是基于这一新时代的"新"特征时代背景,***立足于我贵哦科学技术与社会发展的现实需要,提出了一系列关于科学技术发展的理论观点,形成了***新时代**特色社会主义科学技术观。

参考链接:

2019自然辩证法课后思考题及答案_文档之家

png和jpg格式的图片(二) # issue 标题模板 默认: png和jpg格式的图片(二)

[TOC]

背景

在上篇文章{% post_link 'png和jpg格式图片.md' %}中笔者就 jpgpng 两种格式进行了说明,但是关于 Qt 打开改后缀文件名之后图片的问题依然没有说明。要探究Qt为何不能打开改了后缀的图片文件,这个还是得从多方面去定位。前文说了,通过三种方式设置了 QLabel 的图片。

场景复现

> 这里还是先说明一下设置不成功的场景如何复现:
>
> 1. 找一张 .jpg 的图片,修改后缀也就是文件属性为 .png
> 1. 通过以下三种方式中的任意一种去设置 QLabel 为图片。
>
> Qt 版本是 5.9
>
> 编译器试了 MSVCmingw 都不好使。

QLabel 设置图片方法

  1. 通过 QPixmap设置 QLabel 的图片
QPixmap img(":/Win11.png");

ui->label->setPixmap(img);
ui->label->setScaledContents(true);
  1. 通过 QImage 设置 QLabel 的图片
QImage img;
img.load(":/Win11.png");
ui->label->setPixmap(QPixmap::fromImage(img))
  1. 通过 QLabel.setStyleSheet() 的图片
ui->label->setStyleSheet(QString("QLabel{"
                                 "border-image:url(:/Win11.png) 4 4 4 4 stretch stretch;"
                                 "}"));

当然还有第四种方法,通过 QSvgRenderer 设置:

#include <QSvgRenderer>

QSvgRenderer svgRender(QString(":/Win11.svg"));
QPixmap pixmap(20,20);
QPainter painter(&pixmap);
svgRender.render(&painter);
ui->label->setPixmap(pixmap);

场景是描述完了,可以动手尝试了

操作

接着就是去查看几种实现方式中的源码是如何是设置的了,这里先猜一下结论

> 就是 pngjpg 格式的算法不同,格式问题导致的读取的算法不一致,因此Qt内部实现的读取图片的算法只能根据图片文件的后缀所对应的算法去读取算法,而 setStyleSheet 算法也是基于这么一个逻辑,因此三种读取方式都不成功。
>
> 关于图片算法的问题,在上篇文章{% post_link png和jpg格式图片 png和jpg格式的图片(一) %}中也略微提到,这个我们不深做研究,只需知道 jpgpng 不是同一种算法,也不通用即可。

初步验证

因为上述几种步骤笔者都做过尝试,因此在验证过程中我们不纠结于使用哪一种方式,直接看结果。

  1. 那如何去验证呢,我们还是看代码,这次我们在 Qt 的 qrc 文件中,去掉图片的后缀名,不带后缀属性去读取图片看看其是否可以读取成功。

去掉后缀属性

<mark>运行结果</mark>: QLabel 读取成功

如上图所示,在 qrc 文件中去掉图片的后缀,读取图片设置到 QLabel 依然是成功的。

  1. 我们接着操作,在代码中修改图片后缀为 png,看看这次能不能读取成功。

<img src="../../images/Qt%E5%9B%BE%E7%89%87/image-20220423143916480.png" alt="修改后缀为png" style="zoom:50%;" />

<mark>运行结果</mark>:读取失败

如上图所示,添加后缀后反而还展示不成功了。

初步验证的结果

这就基本上说明了:

> 在 Qt 的内部有很大的几率是通过文件的后缀去判断调用哪个图片读取算法的。也就是说,当你人为的修改了 png-&gt;jpg 时,在 Qt 中就会出现设置图片失败的问题。目前看来,在代码没有问题,但是图片设置后不显示的情况下,最好的方式是,就是去掉图片的后缀,让 Qt 自己去判断调用哪个算法读取图片。

源码分析

这里有关于 Qt 图片 I\O 的描述可以看看Qt帮助手册中关于图像文件读写的文档。

读写图片文件

源码部分,我们只需查看两个Qt 类就行,个人感觉看一个就知道了。两者识别图片的算法应该是一致的。包括 setStyleSheet()接口中设置图片的接口应该都是一致的。

> 1. QPixmap依赖于所在的平台的绘图引擎,故例如反锯齿等一些效果在不同的平台上可能会有不同的显示效果,QImage使用Qt自身的绘图引擎,可在不同平台上具有相同的显示效果
>2. 目前的Qt会把QPixmap都存储在graphics memory中,QImage是存储在客户端的,是独立于硬件的。在X11, Mac 以及 Symbian平台上,QPixmap 是存储在服务器端,而QImage则是存储在客户端,在Windows平台上,QPixmap和QImage都是存储在客户端,并不使用任何的GDI资源。
> 3. 由于QImage是独立于硬件的,也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,使用这一方式可以很大幅度提高UI响应速度。

QPixmap

查询到QPixmap的源文件,一般存放在 Qt 安装目录下 ${安装目录}\5.9.9\Src\qtbase\src\gui\image,文件名为 qpixmap.h qpixmap.cpp

先看一下 QPixmap 的 构造函数中读取图片文件的方法。

  1. QPixmap::QPixmap(const QString&amp; fileName, const char *format, Qt::ImageConversionFlags flags)的源码

    QPixmap::QPixmap(const QString&amp; fileName, const char *format, Qt::ImageConversionFlags flags)
        : QPaintDevice()
       {
            doInit(0, 0, QPlatformPixmap::PixmapType);
            if (!qt_pixmap_thread_test())
                return;
    
            load(fileName, format, flags); // 这里看到调用了load()的接口,接着查看load是如何实现的
        }
  2. load()函数源码

    /*!
        Loads a pixmap from the file with the given \a fileName. Returns
        true if the pixmap was successfully loaded; otherwise invalidates
        the pixmap and returns \c false.
    
        The loader attempts to read the pixmap using the specified \a
        format. If the \a format is not specified (which is the default),
        the loader probes the file for a header to guess the file format.
    
        The file name can either refer to an actual file on disk or to one
        of the application&#39;s embedded resources. See the
        \l{resources.html}{Resource System} overview for details on how to
        embed pixmaps and other resource files in the application&#39;s
        executable.
    
        If the data needs to be modified to fit in a lower-resolution
        result (e.g. converting from 32-bit to 8-bit), use the \a flags to
        control the conversion.
    
        Note that QPixmaps are automatically added to the QPixmapCache
        when loaded from a file; the key used is internal and can not
        be acquired.
    
        \sa loadFromData(), {QPixmap#Reading and Writing Image
        Files}{Reading and Writing Image Files}
    */
    
    /* 翻译过来就是
    从给定的文件名的文件中加载一个像素图。如果pixmap成功加载,则为True;否则返回无效pixmap并返回\c false。
    
    加载器尝试使用指定的\a读取pixmap格式。如果没有指定\a格式(这是默认的),
    加载器探测文件的头,以猜测文件的格式。
    
    文件名可以指向磁盘上的实际文件,也可以指向磁盘上的实际文件应用程序的嵌入式资源。看到\l{resources.html}{Resource System}概述如何嵌入pixmap和其他资源文件在应用程序的可执行文件。
    
    如果数据需要修改以适应低分辨率结果(例如从32位转换到8位),使用\a标志来控制转换。
    
    注意,qpixmap会自动添加到QPixmapCache中
    当从文件加载时;使用的密钥是内部的,不能被收购。
    
    \sa loadFromData(), {QPixmap#读写图像读写图像文件}
    */
    
    // loadFromdata的源码我也补充到了文末
    bool QPixmap::load(const QString &amp;fileName, const char *format, Qt::ImageConversionFlags flags)
    {
        if (!fileName.isEmpty()) {
    
            QFileInfo info(fileName);
            // Note: If no extension is provided, we try to match the
            // file against known plugin extensions
            if (info.completeSuffix().isEmpty() || info.exists()) {
    
                QString key = QLatin1String(&quot;qt_pixmap&quot;)
                        % info.absoluteFilePath()
                        % HexString&lt;uint&gt;(info.lastModified().toSecsSinceEpoch())
                        % HexString&lt;quint64&gt;(info.size())
                        % HexString&lt;uint&gt;(data ? data-&gt;pixelType() : QPlatformPixmap::PixmapType);
    
                if (QPixmapCache::find(key, this))
                    return true;
    
                data = QPlatformPixmap::create(0, 0, data ? data-&gt;pixelType() : QPlatformPixmap::PixmapType);
    
                if (data-&gt;fromFile(fileName, format, flags)) {
                    QPixmapCache::insert(key, *this);
                    return true;
                }
            }
        }
    
        if (!isNull()) {
            if (isQBitmap())
                *this = QBitmap();
            else
                data.reset();
        }
        return false;
    }

一看源码是不是就清晰多了。在 load()函数的实现中:①判断文件名是不是为空;②不为空时,首先就是读取文件的后缀。这里我们可以细细查一下第二个 if 判断中 QString 类型的 key 到底是进行了一个什么操作。

QString key = QLatin1String(&quot;qt_pixmap&quot;)
                    % info.absoluteFilePath() // 返回文件名的绝对路径
                    % HexString&lt;uint&gt;(info.lastModified().toSecsSinceEpoch()) // 返回文件最后一次修改的日期和时间
                    % HexString&lt;quint64&gt;(info.size()) // 返回文件的大小
                    % HexString&lt;uint&gt;(data ? data-&gt;pixelType() : QPlatformPixmap::PixmapType); // 这里的data是成员变量,就是说如果设置了data的pixelType的值就读取,没设置的话就是默认值 QPlatformPixmap::PixmapType

上述的 HexString&lt;type&gt;就是 ASCII 的数组形式,16进制 的数组。<u>上述代码中的 % 操作如果不是求余的话会是什么呢。如果是求余,QString 会报错才是呀???</u>

这里最终还是通过设置和查看 QPixmap 的内置变量 data 中的标志去查看当前文件是不是图片,如果是图片,则会修改当前的 QPixmap 指针,如果不是就会返回 <mark style="background:red;">false</mark>。

if (QPixmapCache::find(key, this))
                return true;

这里补充一个QPixmapCache的demo:

/*在缓存中查找与给定键关联的缓存pixmap。如果找到了pixmap,函数将pixmap设置为该pixmap并返回true;否则,它将保留pixmap并返回false。*/
QPixmap pm;
if (!QPixmapCache::find(&quot;my_big_image&quot;, &amp;pm)) {
    pm.load(&quot;bigimage.png&quot;);
    QPixmapCache::insert(&quot;my_big_image&quot;, pm);
}
painter-&gt;drawPixmap(0, 0, pm);

最终判断当前文件是不是图片应该是在 data-&gt;fromFile() 中实现的。

这个data的定义:

QExplicitlySharedDataPointer&lt;QPlatformPixmap&gt; data;

<mark>未完成</mark>这篇文章还在编辑中

补充

> 补充一下
>
> load()的函数有必要读一下。
>
> QPixmap::loadFromData() 的源码。
>
> ~~~cpp
> /*!
> \fn bool QPixmap::loadFromData(const uchar *data, uint len, const char *format, Qt::ImageConversionFlags flags)
>
> Loads a pixmap from the \a len first bytes of the given binary \a
> data. Returns \c true if the pixmap was loaded successfully;
> otherwise invalidates the pixmap and returns \c false.
>
> The loader attempts to read the pixmap using the specified \a
> format. If the \a format is not specified (which is the default),
> the loader probes the file for a header to guess the file format.
>
> If the data needs to be modified to fit in a lower-resolution
> result (e.g. converting from 32-bit to 8-bit), use the \a flags to
> control the conversion.
>
> \sa load(), {QPixmap#Reading and Writing Image Files}{Reading and
> Writing Image Files}
> */
>
> bool QPixmap::loadFromData(const uchar *buf, uint len, const char *format, Qt::ImageConversionFlags flags)
> {
> if (len == 0 || buf == 0) {
> data.reset();
> return false;
> }
>
> data = QPlatformPixmap::create(0, 0, QPlatformPixmap::PixmapType);
>
> if (data->fromData(buf, len, format, flags))
> return true;
>
> data.reset();
> return false;
> }
> ~~~
>
>

Git 速查手册 # issue 标题模板 默认: Git 速查手册

查看远程仓

git remote -v

分支

查看

# 查看本地分支
git branch

# 查看远程分支
git branch -r

# 查看所有分支
git branch -a

删除

# 删除远程分支
git push origin --delete [branch_name]

2. 删除本地分支区别
git branch -d 会在删除前检查merge状态(其与上游分支或者与head)。
git branch -D 是git branch --delete --force的简写,它会直接删除。

共同点
都是删除本地分支的方法(与删除远程分支命令相独立,要想本地和远程都删除,必须得运行两个命令)。

3. git查看分支:
查看本地分支 git branch
查看远程分支 git branch -r
查看本地和远程分支 git branch -a

4.git删除分支:
删除本地分支 git branch -d 本地分支名
删除远程分支 git push origin --delete 远程分支名
推送空分支到远程(删除远程分支另一种实现)git push origin :远程分支

Config

# 查看git config
git config -l 

stash

git stash

git stash pop

拉取

# 拉取远端分支到本地分支 Develop分支到本地Develop分支
git fetch origin Develop:Develop

查看已push但未提交的内容

git cherry -v

合并

合并某个分支上的某一个文件

  1. 切换到当前分支(即:要合并文件到的分支)
git checkout current_branch
  1. 合并指定分支上的文件到当前分支
git checkout --patch zhiding_branch f.txt

合并 zhiding_branch 分支上的 f.txt 文件到 current_branch

git log 最强语句

git config --global alias.lg &quot;log --graph --pretty=format:&#39;%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&lt;%an&gt;%Creset&#39; --abbrev-commit --date=relative&quot;

批处理获取ip到剪切板

批处理获取ip到剪切板

获取当前ip到剪切板

> 客户端开发远程调试每次都需要获取机器的ip,然后手动填写,较为麻烦,因此简单做了一个可以获取ip到剪切板当中的批处理脚本,可以获取系统当前ip到剪切板中。

[toc]

获取ip

获取ip的命令有多种,最终实现就是只要能打印出当前系统ip的命令都可以。

  • ipconfig
  • route print

以下两个脚本就是从上述两个命令当中获取ip地址:

ipconfig

@echo off

for /f &quot;tokens=2 delims=:&quot; %%a in (&#39;ipconfig ^| findstr ^^IPv4&#39;) do (set IP=%%a)

echo %IP%

pause

route print

@echo off

for /f &quot;tokens=4&quot; %%a in (&#39; route print ^| findstr 0.0.0.0.*0.0.0.0 ^| findstr /v &quot;默认&quot; &#39;) do (set IP=%%a)

echo 你的局域网IP是: %IP%

pause

> <span style="font-weight:900">for /f</span>的用法:
>
> 在For命令语踞饽参数F中,最难理解的就是DelimsTokens两个选项,本文简单的做一个比较和总拮。
> “For /f”常用来解析文本,读取字符串。分工上,delims负责切分字符串,而tokens负责提取字符串。如果把字符串当作蛋糕,Delims像刀子,用来切蛋糕,tokens像叉子,用来取切好的蛋糕。

powershell

(ipconfig|select-string &quot;IPv4&quot;|out-string).Split(&quot;:&quot;)[-1]

输入到剪切板

剪切板的关键字为:clip

使用 clip \? 可以查看帮助

c:\windows\system32&gt;clip /?
 
clip
 
描述:
    将命令行工具的输出重定向到 windows 剪贴板。这个文本输出可以被粘贴
    到其他程序中。
 
参数列表:
    /?                  显示此帮助消息。
 
示例:
    dir | clip          将一份当前目录列表的副本放入 windows 剪贴板。
 
    clip &lt; readme.txt   将 readme.txt 的一份文本放入 windows 剪贴板。
 
c:\windows\system32&gt;

结合以上两个命令,脚本稍微修改一下就能实现获取ip到剪切版的功能。
blog link 批处理获取ip到剪切板

Windows聚焦不更新 # issue 标题模板 默认: Windows聚焦不更新

[toc]

方案一

在应用商店安装 dynamic theme

方案二

先将个性化锁屏界面选项由"Windows 聚焦"改为"图片"。

然后去删除

C:\Users\你自己的用户名\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_***\Settings (***为随机数字)目录下settings.datroaming.lock 这两个文件。(注:AppData 等是隐藏的文件夹或文件)

再然后回到个性化锁屏界面将选项由"图片"改回"Windows 聚焦"。

稍等,OK!

随后应该可以看到 :...\Microsoft.Windows.ContentDeliveryManager_***\LocalState\Assets 文件夹里下载了一批聚焦图片

..\Microsoft.Windows.ContentDeliveryManager_***\settings 目录下重新生成了 settings.dat 文件。

热补丁支持 # issue 标题模板 默认: 热补丁支持

[TOC]

补丁

定义

补丁是指衣服、被褥上为遮掩破洞而钉补上的小布块。明白了吗?

> 现在也指对于大型软件系统(如微软操作系统)在使用过程中暴露的问题(一般由黑客病毒设计者发现)而发布的解决问题的小程序。就像衣服烂了就要打补丁一样,人编写程序不可能十全十美的,所以软件也免不了会出现BUG,而补丁是专门修复这些BUG做的因为原来发布的软件存在缺陷,发现之后另外编制一个小程序使其完善,这种小程序俗称补丁。补丁是由软件的原来作者制作的,可以访问网站下载补丁。
>
> 补丁一般都是 .exe 文件

微软补丁

微软Windows操作系统比较大,比较复杂。因此总有考虑不周的地方。有些病毒或者黑客就利用微软的漏洞进行攻击。微软发现漏洞后就发布一些补丁程序。 我们得到微软的补丁程序后安装到计算机上就叫打补丁。

> 什么是微软补丁?
>
> 微软发布的系统补丁有两种类型:HotfixService Pack,下面介绍它们之间的区别和联系。
>
> - hotfix 是微软针对某一个具体的系统漏洞或安全问题而发布的专门解决程序,Hotfix的程序文件名有严格的规定,一般格式为“产品名-KBXXXXXX-处理器平台-语言版本.exe”。现在一个例子来详细说明:微软针对震荡病毒而发布的Hotfix程序名为“Win2K-KB835732-X86-CHS.exe”,我们知道这个补丁是针对Win2000系统的,其知识库编号为 835732,应用于 X86 处理器平台,语言版本为简体中文。
> - Hotfix 是针对某一个具体问题而发布的解决程序,因此它会经常发布,数量非常大。用户想要知道目前已经发布了哪些Hotfix程序是一件非常麻烦的事。因此微软将这些Hotfix补丁全部打包成一个程序提供给用户安装,这就是Service Pack,简称SPService Pack包含了发布日期以前所有的Hotfix程序,因此只要安装了它,就可以保证自己不会漏掉一个Hotfix程序。而且发布时间晚的Service Pack程序会包含以前的Service Pack,例如 SP3会包含SP1SP2的所有补丁。

热补丁支持

> 重新引导一台机器以便把最新的补丁都应用上,这对于服务器来说可能会意味着一段显著的宕机时间,这也正是为什么Windows要支持运行时刻的补丁方法,称为热补丁(hot patch,或简化为hotpatch)。与之相反的是冷补丁(coldpatch),它要求一次重新引导。热补丁并非只是简单地允许文件可在执行过程中被覆盖;相反地,它包括了一系列可能会被请求执行的复杂操作(这些操作也可能会组合起来)。

热补丁执行操作

下表列出了这些操作:

操作 含义 用途
映像文件改名称<br />(Rename Image) 替换磁盘上一个正在被其他应用程序使用的DLL,或者替换磁盘上一个已经被内核加载到系统中的驱动程序 当一个用户模式的库需要完整地被替换的时候,内核可以检测到哪些进程和服务正在引用该库,将它们卸载出内存,然后更新DLL,再重新启动这些程序和服务(通过<u>重启管理器</u>[restart manager]来完成)。当一个驱动程序需要被替换的时候,内核可以卸载该驱动程序(该驱动程序要求有一个卸载例程),更新驱动程序,然后重新加载替换后的驱动程序
对象交换<br />(Object Swap) 以原子操作的方式更改对象目录名字空间中的一个对象 当一个文件(往往是已知的DLL)需要被原子凡事修改名称,但不影响任何可能正在使用该文件的进程时(所以,这些进程可以立即使用新的文件,且仍然使用老的句柄,但不要求应用程序重新启动)
补丁函数代码<br />(Patch Function Code) 将一个映像文件中的一个或多个函数的代码替换为新的版本 如果在运行时刻一个DLL或驱动程序不能被替换或修改名称,则该映像中的函数可以直接被打上补丁。对于一个包含了新代码的热补丁DLL,当老的函数被调用时,它会跳转到新的代码中。
刷新系统DLL<br />(Refresh System DLL) 重新为Ntdll.dll加载内存映射区对象 Windows的系统原生库Ntdll.dll只在系统引导过程中被加载一次,以后只是被简单地复制到每个新进程的地址空间中。如果它呗热补丁了,那么,系统必须刷新这一内存区对象,以便加载新的版本

特性

<mark style="background-color:red">运行时刻卸载</mark>

热补丁文件的构成除了包括要替换的函数部分,还包括一个<u>Update.exe的程序</u>以及<u>一个额外的.hp热补丁文件</u>。

  • Update.exe:完成该补丁的提取工作,也执行相应的更新过程。
  • .hp热补丁文件:此文件包含一个特殊的PE头,称为.HOT1。该PE头包含了一个数据结构,描述了该文件中出现的各种补丁描述符(patch descriptor)。每一个补丁描述述符指明了在原始文件中需要被补丁的偏移位置、一个验证机制(它可以包含一份老数据的简单比较、一个校验和,或者一个散列值),以及待补丁的新数据。内核将解析这些描述符,并且执行恰当的修改动作。若是被保护的进程(protected process,有关进程的更多信息,参见《深入理解Windows操作系统》第5章),或者其他经过数字签名的二进制映像,在这些情况下,热补丁也必须被经过数字签名,以避免针对敏感文件或进程执行“伪造的”补丁。

在编译时刻对热补丁的支持,是通过在每个函数的开始处加入7个额外的字节来做到的。其中5个字节被看做前一个函数的结束部分,2个字节被看作函数前缀(function prolog)部分,也就是函数的开始。

限制

使用热补丁也存在一些限制:

  1. 与安全软件的不兼容。像安全软件类的第三方应用程序可能会阻止这样的补丁;补丁也可能与第三方应用程序的操作系统不兼容
  2. 补丁要修改一个文件的导出表或导入表
  3. 补丁要改变数据结构,修正无限循环,或者包含内联的汇编代码

返回值类型的规范 # issue 标题模板 默认: 返回值类型的规范

参照 Windows 对程序错误的处理中,函数常用返回值的设置,作为C++开发,也应该参照这一标准。

> 当调用一个 Windows 函数时,它首先要检验传递给它的的各个参数的有效性,然后再设法
>
> 执行任务。如果传递了一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就
>
> 会返回一个值,指明该函数在某种程度上运行失败了。表 1 - 1列出了大多数 Windows 函数使用
>
> 的返回值的数据类型

<center>Windows 函数常用的返回值类型</center>

数据类型 表示失败的值
void 该函数的运行不可能失败。Windows 函数的返回值类型很少是 void
bool 如果函数运行失败,那么返回值是0,否则返回的是非0值。最好对返回值进行测试,以确定它是0还是非0。不要测试返回值是否为TRUE
HANDLE 如果函数运行失败,则返回值通常是 NULL,否则返回值为 HANDLE,用于标识你可以操作的一个对象。注意,有些函数会返回一个句柄值 INVALID_ HANDLE_VALUE,它被定义为 -1。函数的Platform SDK 文档将会清楚地说明该函数运行失败时返回的是 NULL 还是 INVALID_HANDLE_VALID
PVOID 如果函数运行失败,则返回值是 NULL,否则返回PVOID,以标识数据块的内存地址
LONG/DWORD 这是个难以处理的值。返回数量的函数通常返回LONG或DWORD。如果由于某种原因,函数无法对想要进行计数的对象进行计数,那么该函数通常返回 0或-1(根据函数而定)。如果调用的函数反悔了LONG/DWORD,那么需要阅读相应的函数说明,以确保能正确检查潜在的错误。

一个 Windows 函数返回的错误代码对了解该函数为什么会运行失败尝尝很有用。

> 从系统内部来讲,当一个Windows函数检测到一个错误时,它会使用一个称为线程本地存储器(thread-local storage)的机制,将相应的错误代码号码与调用的线程关联起来。这将使线程能够互相独立运行,而不会影响各自的错误代码。当函数返回时,它的返回值就能指明一个错误已经发生。若要确定这是个什么错误,则需要调用 GetLastError 函数:
>
> ~~~cpp
> DWORD GetLastError
> ~~~
>
>

自然辩证法 # issue 标题模板 默认: 自然辩证法

参考链接:2019自然辩证法课后思考题及答案_文档之家

[toc]

第一章 自然辩证法(byself)

1.如何理解朴素唯物主义自然观、机械唯物主义自然观和辩证唯物主义自然观的辩证关系?

(1)古代朴素自然观以直观性、思辨性和猜测性的方式从整体把握认识自然界的本源和发展,但缺乏系统的、以实验为基础的科学依据,尤其是将非物质性的东西当做限于物质世界的独立存在,并认为物质世界是它的派生物,为唯心主义的产生提供了借口,最终导致人类认识的分化。

(2)机械唯物主义自然观的核心是自然界绝对不变,虽然在实证科学的基础上继承和坚持了古代朴素唯物主义的**,但是不懂得一般与个别、运动和静止等的辩证关系,以一种片面的、孤立的和静止的方法观察自然界,挤不动的自然界的辩证法,自然不能吧唯物主义坚持到底。

(3)辩证唯物主义自然克服了以往哲学自然观的缺陷,坚持了物质世界的客观实在性的唯物主义一元论原则,突出了物质世界的整体性和矛盾性,提示了物质世界的普遍联系,强调了人类起源于自然界、依赖于自然并在把握自然界发展规律的基础上能移动地和改造自然,强调了人与自然界的和谐统一。

2.如何理解系统自然观、人工自然观和生态自然观的辩证关系?

第一,它们都围绕人与自然界关系的主题,丰富和发展了马克思注意自然观的本体论、认识论和方法论;它们都坚持人类与自然界、人工自然界和天然自然界、人与生态系统的辩证统一,都为实现可持续发展和生态文明建设奠定了理论基础。

第二,它们在研究人与自然界关系的各方面各有其侧重点;系统自然观为正确认识和处理人与自然地关系提供了新的思维方式,人工自然观突出并反思了人的主体性和创造性;自然生态馆站在人类文明的立场,强调了人与自然界的协调与发展。

第三,它们在研究人与自然界的关系方面相互关联;系统自然观通过系统思维方式,为人工自然观和生态自然观提供了方法论基础;人工自然观通过突出人的主体性和实践性,为系统自然观和生态自然观提供了认识论前提;生态自然观通过强调人与自然界的统一性、协调性关系为系统自然观和人工自然观指明了发展方向和目标。

3.如何认识生态自然观和生态文明建设之间的辩证关系?

生态文明是人类文明的一种形式。它以尊重和维护生态环境为主旨,以可持续发展为根据,以未来人类的继续发展为着眼点。人类对生态文明的探索,是对人与自然和谐关系的表现。生态文明与生态自然观有着紧密的联系,生态文明是生态自然观的应有之义,生态自然观对现今世界生态文明发展及实践有着广泛的指导意义。生态文明的提出,是人们对可持续发展问题认识深化的必然结果。人类通过遵守可持续性、共同性和公平性等原则,通过实施节能减排和发展低碳经济,构建和谐社会和建设生态文明,实现人类社会与生态系统的协调发展;人与生态系统的协调发展仍应以人类为主体,仍应包括改造自然的内容,注重保护生态环境和防灾减灾;生态自然界是天然自然界和人工自然界的统一,是人类文明发展的目标,生态文明的提出,是人们对可持续发展问题认识深化的必然结果。生态自然观指出,人与自然都是生态系统中不可或缺的重要组成部分,人与自然是相互依存、和谐共处、共同促进的关系。人类的发展应该是人与社会、人与环境、当代人与后代人的协调发展。人类的发展不仅要讲究代内公平,而且要讲究代际之间的公平,不能以当代人的利益为中心,甚至为了当代人的利益而不惜牺牲后代人的利益。而必须讲究生态文明,牢固树立起可持续发展的生态文明观。

4.如何理解“绿水青山就是金山银山”?

简单的来说,"绿水青山就是金山银山”就是指生态可持续发展。蓝天白云、青山绿水是人类赖以生存的环境,是社会长远发展的最大本钱,生态优势可以变成经济优势、发展优势,形成了一种浑然一体、和谐统一的关系。因此保护绿水青山,才能保住人们赖以生存的生态环境,从而赢得长远的经济可持续发展。

***总书记关于绿水青山就是金山银山的辩证论是生态环境生产力理论生动、朴实和富含哲理的印证:“绿水青山可以源源不断地带来金山银山,绿水青山本身就是金山银山,我们种的常青树就是摇钱树,生态优势变成经济优势。”

“如果能够把这些生态环境优势转化为生态农业、生态工业、生态旅游等生态经济的优势,那么绿水青山也就变成了金山银山。”当然,绿水青山和金山银

山之间也有矛盾,绿水青山是真正的金不换,“绿水青山可带来金山银山,但金山银山却买不到绿水青山”。

因此,当绿水青山和金山银山之间有不可调和的矛盾时,我们宁要绿水青山,不要金山银山。要像对待生命一样对待生态环境,统筹山水林田湖草系**理,实行最严格的生态环境保护制度,形成绿色发展方式和生活方式,坚定走生产发展、生活富裕、生态良好的文明发展道路,建设美丽**。

绿水青山就是金山银山的理念,一头是人类赖以生存的自然环境,另一头牵着财富生产;一头连着生态环境,另一头是人类活动的产物。从人与自然是生命共同体出发,将生态环境内化为生产力的内生变量与价值目标,蕴含着尊重自然、顺应自然、保护自然,谋求人与自然和谐发展的生态理念和价值诉求。

揭示了生态环境与生产力之间的辩证统一关系,突破了把保护生态与发展生产力对立起来的僵化思维,内含了保护、改善与建设生态环境和保护与发展生产力的有机统一,鲜活地概括了有**气派、**风格和**话语特色的绿色发展内涵,是**化马克思主义理论的光辉典范。

第一章 自然辩证法

1.如何理解朴素唯物主义自然观、机械唯物主义自然观和辩证唯物主义自然观的辩证关系?

朴素唯物主义自然观是古代自然哲学家们以科学技术为基础,概括和总结自然界及其与人类的关系形成的总的观点。它是马克思主义自然观形成的最初**渊源。它具有①整体性和直观性,②思辨性和臆测性,③自发性和不彻底性。朴素唯物主义自然观的**渊源是原始宗教神话自然观,其理论基础是自然哲学。朴素唯物主义自然观具有一定的缺陷:①不能彻底地坚持唯物主义,具有唯心主义因素,如泰勒斯的"水本原说”②不能满足民众的需要,掺杂着宿命和迷信等因素。③不能科学地说明自然界。

机械唯物主义自然观是近代自然科学家们以近代科学技术为基础,概括和总结自然界及其与人类的关系形成的总的观点。它是马克思主义自然观形成的重要**渊源。它具有①机械性②不彻底性③形而上学性。机械唯物主义自然观①为辩证唯物主义自然观的形成创造了条件。他以近代自然科学为基础,强调自然界存在的客观性,物质性和发展的规律性,传承了朴素唯物主义自然观的**传统。③为辩证唯物主义自然观的形成提供了前提。它所培植的崇尚理性的科学精神促进了辩证唯物主义自然观的形成。

辩证唯物主义自然观是马克思恩格斯以近代科学技术为基础,概括和总结自然界及其与人类关系形成的总的观点。它是马克思主义自然观形成的重要标志。辩证唯物主义自然观具有①实践性②历史性③辩证性④批判性。辩证唯物主义自然观“扬弃”了机械唯物主义自然观,在更高层次上实现了向古希腊朴素唯物主义自然观的回归。

三种自然观的发展本质是人类认识的发展,辩证唯物主义自然观是对朴素唯物主义自然观的否定之否定,是对机械唯物主义自然观的否定。任何一种自然观的产生都脱离不了当时科学的发展水平,也离不开人们的认识水平。而更先进的自然观对科学的发展又具有指导性意义。这个发展是螺旋上升的,在我们的认识中还会进行补充和丰富,在运动中发展自己。

2.如何理解系统自然观、人工自然观和生态自然观的辩证关系?

P42

3.如何认识生态自然观和生态文明建设之间的辩证关系?

生态文明是人类文明的一种形式。它以尊重和维护生态环境为主旨,以可持续发展为根据,以未来人类的继续发展为着眼点。人类对生态文明的探索,是对人与自然和谐关系的表现。生态文明与生态自然观有着紧密的联系,生态文明是生态自然观的应有之义,生态自然观对现今世界生态文明发展及实践有着广泛的指导意义。生态文明的提出,是人们对可持续发展问题认识深化的必然结果。人类通过遵守可持续性、共同性和公平性等原则,通过实施节能减排和发展低碳经济,构建和谐社会和建设生态文明,实现人类社会与生态系统的协调发展;人与生态系统的协调发展仍应以人类为主体,仍应包括改造自然的内容,注重保护生态环境和防灾减灾;生态自然界是天然自然界和人工自然界的统一,是人类文明发展的目标,生态文明的提出,是人们对可持续发展问题认识深化的必然结果。生态自然观指出,人与自然都是生态系统中不可或缺的重要组成部分,人与自然是相互依存、和谐共处、共同促进的关系。人类的发展应该是人与社会、人与环境、当代人与后代人的协调发展。人类的发展不仅要讲究代内公平,而且要讲究代际之间的公平,不能以当代人的利益为中心,甚至为了当代人的利益而不惜牺牲后代人的利益。而必须讲究生态文明,牢固树立起可持续发展的生态文明观。

4.如何理解“绿水青山就是金山银山”?

“绿水青山就是金山银山”的重要**,触及到了一个人类社会发展的大难题,即:金山银山是人的物质追求,绿水青山是人赖以生存的自然条件,这两者都是人生存和发展所需要的,而这两者对于人来说又很难兼得。自工业革命以来,人类以牺牲绿水青山来实现自己的物质追求,曾经创造了前所未有的文明奇迹。但是,这种不可持续的经济增长方式造成了许多灾难性的后果,促使人们在对传统的增长方式和发展理论进行反思的同时,开始重新研究发展理论,重新研究发展中人与自然的关系。

以我国为例,我们在过去实行的是“先增长后治污”模式,在“两座山”问题上实际上是采取了“为了金山银山可以暂时牺牲绿水青山”的做法;后来认识到这样做不仅不可持续,而且治污的代价要大于增长获得的收益,于是许多地方提出了“宁要绿水青山,不要金山银山”的口号,即下决心改变“先增长后治污”的模式,优化环境,保护生态。这样的口号,这样的做法,虽然也讲“可持续发展”,但实际上是把“可持续”与“发展”割裂开来,这不利于生产力的发展。

“绿水青山就是金山银山”,则以“就是”一词把“绿水青山”和“金山银山”辩证地连接起来,以积极的而不是悲观的态度阐明了这两者之间的关系,讲清楚了发展中人与自然的辩证统一关系绿水青山就是金山银山”这一重要**,所表达的则是环境、生态应该是社会生产力内部的一个有机组成部分。也就是说,***把环境、生态纳入了社会生产力的范畴。这种态度就是马克思主义的态度,这种认识就是马克思主义的认识。。

因此,我们说***关于“绿水青山就是金山银山”的重要**,以一种新颖的发展理念,坚持和发展了马克思主义创始人以积极乐观的态度认识和处理发展中人与自然关系问题的科学**。

5.简述辩证唯物主义自然观战胜机械论自然观的历史必然性。

机械论自然观的产生有其历史的必然性和合理性,但它用孤立的,静止的,片面的观点去看待世界,否认事物的联系和发展变化,否认事物的内部矛盾。实践是检验真理的唯一标准,机械论自然观的这些特点与近代自然科学已经相悖,应当摒弃。人类社会的大趋势是发展,在目前的历史环境下,机械论自然观的存在只会阻碍这种发展,所以必将被适应当前自然科学的辩证唯物主义自然观所取代,这是历史必然性。

P28

第二章 科学技术观(byself)

6.如何理解18.19世纪科学技术发展与马克思恩格斯科学技术**产生的关系?

p45

从18世纪60年代起始于英国的第一头次技术革命和继之而来的产业革命,既向科学提出了新的要求,也为科学提供了新的事实,更为科学提供了新的交流方法,从而使科学在19世纪获得了长足的进步,取得了影响深远的一些重要发现,为辩证唯物主义自然观的产生提供了丰富的物质基础

19世纪的自然科学成就为辩证唯物主义自然观产生提供了科学前提。如在天文学上,1755年康德和拉普拉斯(1796年)分别提出的关于太阳系起源的星去假设。在地质学上,英国科学家莱伊尔1830年发表“地球演化学说”,在物理学上焦耳发现能量转化和守恒定律,从而动摇了形而上学的基础,在化学上1824年由维等人合成尿素,在生物上,1838年施旺提出细胞是生命 的基本结构单位,1958年达尔文创立特种起源论,对于这些重要的发现,恩格斯经过反复研究,从自然观的高度提出了运动形式及其相互转化的学说。恩格斯关于运动形式的学说把蕴含在当时诸多科学发现中的**精华作了概念性升华,从而提供了一种观察研究自然的哲学方式

综上所述,辩证唯物主义自然观的产生反映了科学技术发展的历史必然性。

7.怎样认识马克思恩格斯的科学技术**在马克思主义理论体系中的重要地位?

马克思主义理论体系,是关于全世界无产阶级和全人类彻底解放的学说。它由马克思主义哲学、马克思主义政治经济学和科学社会主义三大部分组成,是马克思、恩格斯在批判地继承和吸收人类关于自然科学、思维科学、社会科学优秀成果的基础上于19世纪40年代创立的,并在实践中不断地丰富、发展和完善的无产阶级**的科学体系。

马克思恩格斯科学技术**表明了科学技术是推动社会发展的革命力量,通过对科学技术的理解、科学的分类、科学技术与哲学的关系、科学技术是生产力、科学技术的生产动因、科学技术的社会功能、科学技术与社会制度、科学与技术的相互关系、科学技术异化等方面观点的阐述,极大的丰富和发展了马克思主义理论,有助于指导我们正确分析科学技术及其发展的理论和现实问题。

8.马恩与国外学者关于科技的本质区别p51-55

9.如何理解科学技术一体化的特征?

在人类历史上,科学与技术经历了几次分合。科学与技术源起于人类的社会生产实践,本来是内在统一的,但随着生产力的发展,出现了脑力劳动与体力劳动的分工,一部分人从单纯的体力劳动中分化出来,专门从事政治、宗教、艺术、哲学等活动,科学与技术从此分道扬镳,科学活动由学者们承担,技术研究则由工匠们掌握。在古代,科学对技术的影响甚微,无论是自然经济条件下的农业技术,还是工匠的手工业技术,都是凭经验掌握和积累的,那时几乎没有以科学的应用为特征的技术,而只有手艺、技能——尽管这些经验可能发展到惊人的水平。

从15世纪下半叶近代自然科学产生以后,直到19世纪的上半叶,科学的实际应用才逐步显现效能。正如马克思所说:只有在资本主义条件下,才第一次产生了只有用科学方法才能解决的实际问题,才第一次达到使科学的应用成为可能和必要的那样一种规模,科学获得了成为致富手段的使用,发明成为一种特殊的职业,科学成为生产过程的因素,生产过程成为科学的应用。15世纪以后,科学实验活动融入科学研究20科学成就是在技术基础上的“技术科学化”的结果,技术可以产生科学,“技术科学化”表明:技术是科学发展的动力 ,科学需要推动技术前进;技术为科学的发展提供研究手段,特别是科学实

10.为什么说科学发展表现为继承与创新的统一?(p62)

11.怎样认识技术发展的动力?对技术具有双刃剑作用的看法?

技术发展史不断证明,技术像一把双刃剑,既有有益于人类发展的一面,也有危害人类利益的一面。一方面,技术的进步推动了生产力内部各要素的变革,促进了产业结构的调整、经济形式的变化和经济增长方式的变化,实现了经济转型;变革了生产关系,增进了人类自由而全面的发展,推动人类社会进入发展的新阶段;将人类从繁重的劳动中解放出来,对人类的生活方式产生了深刻的影响。另一方面,技术的进步也产生了一些道德和伦理问题,如克隆人的伦理问题、基因治疗和基因增强的伦理问题、网络伦理问题、核伦理问题等。

因此,必须以人民为中心,大力发展事关国计民生的科学技术;必须以先进的文化来引导,协调科学文化与人文文化的冲突;必须改变单纯有利于经济增长的倾向,走经济增长与环境保护双赢之路;必须客观全面评价科学技术的风险和收益,指定恰当的科学技术公共政策。

第二章 科学技术观

1.如何理解18、19世纪科学技术发展与马克思、恩格斯科学技术**产生的关系?

18、19世纪,天文学、地理学、物理学、化学、解剖学、生物学等都有了长足的发展,特别是能量守恒与转化定律、细胞学说和生物进化论三大发现,使自然科学的发展进入了一个新时期,两次科技革命使人类进入了工业文明时代。马克思、恩格斯在总结和概括19世纪科学技术成果的基础上,形成了以辩证唯物主义为理论基础的科学技术**。

2.怎样认识马克思、恩格斯的科学技术**在马克思主义理论体系中的地位?

马克思主义科学技术观是基于马克思、恩格斯的科学技术**,对科学基础机器发展规律的概括和总结,是马克思主义关于科学技术的本体论和认识论。

从辩证唯物主义和历史唯物主义的基本立场出发,在总体上把握马克思、恩格斯的科学技术**;马克思主义认为科学是一般生产力,技术是现实生产力;科学是认识世界,技术是改造世界。现代科学和技术形成既有区别又有联系的体系结构。

3.马克思、恩格斯和国外学者关于科学技术本质的分析有何主要差异?

(1)马克思、恩格斯关于技术本质特征的分析

马克思、恩格斯认为技术在本质上体现了“人类对自然的实践关系”,技术是人的本质力量的对象化。
第一,劳动资料延长了人的自然的肢体。
第二,工艺学在本质上揭示出人对自然的能动关系。
第三,技术的发展引起生产关系的变革。

(2)国外学者对技术本质特征的研究

欧美技术哲学存在工程学的和人文主义的两种技术研究路线;日本的技术论在技术的本质问题上形成了“方法技能说”、“劳动手段说”、“知识应用说”等观点。这些观点各有特色,但大都表现出对技术理解的单一性。
我们需要用马克思主义科学技术观进行分析评价。马克思主义认为,技术是人类为满足自身的需要,在实践活动中根据实践经验或科学原理所创造发明的各种手段和方式方法的总和。主要体现在两个方面:一是技术活动,狭义的技术是指人类在利用自然、改造自然的劳动过程中所掌握的方法和手段;广义的技术是指人类改造自然、改造社会和改造人类自身的方法和手段。二是技术成果,包括技术理论、技能技巧、技术工艺与技术产品(物质设备)。
技术在本质上体现了人对自然的实践关系,是人的本质力量的展现,属于直接生产力,是自然性和社会性、物质性和精神性、中立性与价值性、主体性和客体性、跃迁性和积累性的统一。

4.如何理解科学技术一体化的特征?

(1)现代科学的体系结构由学科结构和知识结构组成

学科结构由基础科学、技术科学、工程科学构成。知识结构由科学事实、科学概念、科学定律、科学假说、科学理论构成。现代科学的体系结构表现出现代科学的发展过程,其中学科结构形成立体的架构,知识结构各要素渗透在学科结构相对应的要素之中。基础科学、技术科学、工程科学都是系统化的知识,都会经过一个由科学事实到科学理论的形成过程。

(2)现代技术的体系结构由门类结构和形态结构组成

门类结构由实验技术、基本技术和产业技术构成。
形态结构由经验形态的技术、实体形态的技术和知识形态的技术构成。
现代技术的体系结构表现出现代技术的发展过程,其中门类结构是立体的架构,形态结构的各要素同样渗透咋门类结构相对应的要素当中。实验技术、基本技术和产业技术都包含经验技能,都使用工具机器,都蕴含了知识。
现代科学技术体系结构的研究表明,科学技术在各自的发展中,不但日益多样化和系统化,而且越来越呈现出科学技术一体化的特征。

5.为什么说科学发展表现为继承与创新的统一?

继承:市科学技术发展中的量变,它可使科学知识延续、扩大和加深。科学是个开放系统,它在时间上有继承性,在空间上有积累性。只有继承已发现的科学事实、已有理论中的正确东西,科学才能发展、不断完善。

创新:是人类对自然的认识出现新的飞跃,引起科学发展中的质变。创新是继承的必然趋势和目的。

在科学技术的发展模式及动力问题上,马克思主义认为科学发展在纵向上表现为渐进与飞跃的统一,在横向上表现为分化与综合的统一,在总体趋势上表现为继承与创新的统一。

技术的发展由社会需要、技术目的及科学进步等多种因素共同推动。其中社会需求与技术发展水平之间的矛盾是技术发展的基本动力,技术目的和技术手段之间的矛盾是技术发展的直接动力,科学进步是技术发展的重要推动力。

6.怎样认识技术发展的动力?

马克思主义认为,技术的发展由社会需要、技术目的以及科学进步等多种因素共同推动。

(1)社会需求与技术发展水平之间的矛盾是技术发展的基本动力
任何技术,最早都源于人类的需要。正是为了生存发展的需要,人类起初模仿自然,进而进行创造,发明了各种技术。同时,文化对技术发展具有明显的张力作用。先进的**文化会推动技术的发展,而落后的**文化则会制约和阻碍技术的发展,包括影像技术决策、技术研发以及技术成果的产业化各方面。

(2)技术目的和技术手段之间的矛盾是技术发展的直接动力
技术目的就是在技术实践过程中在观念上预先建立的技术结果的主观形象,是技术实践的内在要求,影响并贯穿技术实践的全过程。技术手段即实现技术目的中介因素,包括实现技术目的的工具和实用工具的形式。技术目的的提出和实现,必须依赖于与之相匹配的技术手段。技术手段是实现技术目的的中介和保证,它包括达到技术功能要求所使用的工具以及应用工具的方式。

(3)科学进步是技术发展的重要推动力
19世纪中期以后,科学走到了技术前面,成为技术发展的理论向导。科学革命导致技术革命,技术发展对科学进步的依赖程度越来越高,技术已成为科学的应用。尤其是当今社会的发展,已形成了科学技术一体化的双向互动过程。

第三章 科学技术方法论

1.如何理解马克思主义科学技术方法论与科学研究中的具体方法的关系?

马克思主义的科学技术方法论是以辩证唯物主义立场、观点为基础,吸取具体科学技术研究中的基本方法,并对其进行概括和升华的方法论。

科学技术研究,离不开辩证思维。分析与综合、归纳与演绎、从抽象到具体、历史与逻辑的统一,这些辩证思维的形式体现和贯彻在科学家、工程师的具体科学技术研究中。自觉的认识和提升这些辩证思维的形式,对于树立,马克思主义科学技术观,深入研究科学技术,建设创新型国家具有重要意义。

2.如何理解辩证思维渗透在科学研究的全部过程中?

马克思主义科学技术方法论的核心就是辩证思维。马克思主义科学技术方法论的基本原则就是把辩证法贯彻到科学技术研究中,以对立统一、质量互变和否定之否定的辩证**渗透到具体的科学技术研究中,把握具体科学技术的研究过程。

3.如何把握创造性思维特性?

创造是科学研究和技术发明最重要特性之一。创造性思维不是在所有辩证思维和科学研究方法之外独立的一种思维方式或方法,是能够提出创见的思维,与一般性思维相比,是在思维特征方面不刻板,组合各种思维、灵活调用思维的特性。

创造性思维的特点是思维方向的求异性,思维结构的灵活性、思维进程的飞跃性、思维效果的整体性、思维表达的新颖性等。

创造性思维特别注重逻辑思维与非逻辑思维的统一、抽象思维与形象思维的辩证统一。

4.注意多学科的交叉与融贯有何方法论意义?

移植和学科交叉或跨学科的研究方法,是创造性思维的两种非常有效的研究方法。当代科学研究和技术发明变得越来越复杂,进行移植与交叉,通过多学科或跨学科的研究,常常能够获得单一学科研究无法获得的创新成果。多学科融合或通过跨学科研究问题也是当代科学和技术解决问题的创造性方法,体现了广泛联系和发展的辩证法。

当代各门科学之间的交叉型越来越大,通过学科之间的交叉往往可以获得新的认识,带来创新。学科交叉成为一种新的思考方式和研究方法。

所谓学科交叉方法,就是两门以上的学科之间在面对同一研究对象时,从不同学科的角度进行比对研究的方法。借鉴其他学科的研究,思考本学科的问题和对象,融合其他学科的研究方法,以达到对研究对象的新认识。

所谓跨学科方法就是通过多学科的协作共同解决同一问题的方法,跨学科也是一种学科融合的方法,也可以称为多维融贯的方法。

5.战略性思维对于科学研究有何意义?

战略性思维是对战略科学家的思维要求。同时对于一个从事一般科学研究、技术发明和工程建设的科学家也有重要意义。***非常重视战略性思维的重要作用与深刻意义,是其提出的“六大思维”之一,战略性思维对于科学研究而言,非常重要。

战略性思维是高瞻远瞩、统揽全局、善于把握事物发展总体趋势和方向的思维方法,展示的是看问题的高度和深度。古人讲:“不谋万世者,不足谋一时;不谋全局者,不足谋一域。”科学家与工程师没有战略性思维、具有什么样的战略性思维,一定程度上决定着在**特色社会主义伟大事业中的科学技术研究能登多高、能走多远、将抵达何处。战略性思维能力的强弱,取决于思考问题的高度、理论研究的深度、知识视野的广度,以及对于科学技术发展全局的时间跨度的认识与把握。

对于国家而言,科学技术的总体规划是一种科学技术研究的战略,战略科学家需要掌握国家科学技术的基本战略,按照国家需要,结合自己及其研究团队的研究确定科学研究方向。

第四章 科学技术社会论

1.为什么说“科学是一种在历史上起推动作用的、革命的力量”?

科学技术是历史发展的火车头,改变了社会历史进程,造就了新的社会形态;推动了生产力内部各要素的变革,引发了产业结构的调整、经济形式的变化和经济增长方式的转变,造就了经济转型;产生了技术异化现象,要对异化的资本主义制度展开批判,更好地发挥科学技术的社会功能。
科学技术作为社会发展的动力,是马克思主义的基木观点。科学是生产力的“知识的形态”。作为生产力的科学技术,能够大大提高社会生产力水平,推动着整个人类物质生产的迅猛发展。
作为强大的精神力量的科学技术,能够促进人类**的解放,在产业革命的基础上,推动社会变革,对社会生产关系产生有力影响。
作为人类最终走向白由的科学技术,能够作为解放的杠杆,增进人类精神生活的丰富性和自我发展能力,有助于实现人的全面自由的发展。

2.如何看待科学技术对人的异化和对自然的异化?

科技异化实质上是在资本主义制度下劳动异化和人的异化一种必然结果。由于劳动是人的最根本最现实的实践活动,是人及人类社会存在的根本方式,劳动的异化必然带来人的其他社会活动和社会关系的全面异化,科学技术也不例外,因为“宗教、家庭、国家、法、道德、科学、艺术等等,都不过是生产的一些特殊的方式,并且受生产的普遍规律的支配。”

因此,科学技术作为劳动亦即人处理自身与自然界关系的社会活动的产物,也必然随着资本主义社会劳动的异化而表现出异化的现象。最根本的是要消灭对科学技术的资本主义利用方式,把现代科学技术从资本主义制度下解放出来。也就是说只有通过无产阶级革命来最终解决资本主义的科技异化问题。当然,在马克思看来,异化的完全克服只有在共产主义社会制度中才能最终实现。

3.科学技术的社会体制和组织机构对科学技术的发展有何意义?

科学技术的社会建制有一个历史过程。经济支持制度、法律保障体系等科学技术体制是根本,各种组织机构及其科研组织运行是保证,科学技术的伦理规范是导引。在科学技术发展应用的新阶段,科学技术的社会建制呈现出一些新特点,因此必须进行科学技术体制改革,以保证科学技术的良好运行。
作为社会建制的科学技术体制是在一定社会价值观念支配下,依据相应的物质设备条件形成的一种社会组织制度,旨在支持推动人类对自然的认识和利用。科学技术的体制化以相应的职业化为核心,其内涵随着科学技术的发展而不断拓展和丰富。科学技术的社会体制包括:组织领导体制、经济支持制度、法律保障体制、交流与传播体制、人才教育培养制度等。科学技术与其他各种事业密切相关,需要建立相应的组织机构以保证科学技术活动的顺利进行。科学技术组织机构随着历史的演化而变化,具有各白的特点和功能,是实现科学技术现代化的组织保证。在科学技术社会史上形成与发展起来的组织机构有:科学技术决策、管理与咨询机构,科学技术活动组织机构,科学技术传播机构,科学技术人才培养机构。

> 【以下摘白百度贴吧帖子“科学技术的社会体制化及其对科学发展的意义”】
> 科学技术体制化的内容包括:科学技术的投入体制、科技研究的结构比例、科学技术的法律制度、科技研究的管理体制。
> 科学技术的社会体制化对科学发展的意义:1、它可以积聚社会上的力量来进行柑应的科学研究;2、当代科技活动的结构中基础研究将会有大量的人员参l与j;3、明确的法律以及管理制度将会更进一步促进科学技术的发展。

4.为什么要对科学技术工作者进行伦理规范?

科学技术活动与人类其他活动一样,建立在诚信和道德的基础上。现阶段,默顿的科学的精神气质受到挑战,科学技术工作者有失范行为,需要制定相关科研诚信指南和工程师伦理准则加以规范。科学工作者进行科学研究和医学实践,尤其是进行人体实验和动物实验,应该遵循社会伦理、生命伦理、动物伦理等。技术工作者,尤其是工程师,在工程技术活动中,应该遵循一定的职业伦理和社会伦理准则,应该承担对社会、专业、雇主和同事的责任,应该对工程的环境影响负有特别的责任,规范白己的行为,为人类福祉和环境保护服务。

5.如何理解科学技术文化与人文文化之间的冲突与协调?

(一)社会文化对科学技术的影响

科学技术的产生和发展需要一定的社会文化环境。社会文化与科学技术文化紧密关联,并由此影响科学技术的发展及其应用。默顿在《十七世纪英格兰的科学、技术与社会》中提出的“清教主义促进英国近代科学的制度变化”,以及“李约瑟难题”——“近代科学为什么没有在**诞生”的解答,就说明了这一点。

(二)科学文化与人文文化的协调
1.要防止科学在生活世界、自然世界对人文的僭越所造成的科学文化与人文文化之间的冲突,深刻理解科学的限度,用正确的人文理念指导我们的生活。
2.必须以社会先进文化来引领科学技术文化,使科学技术发展和应用为经济社会健康全面发展服务。得到广泛提倡的环境科学技术就是为了协调人与自然之间的关系所做的努力,是科学技术文化与人文文化——绿色文化的良性互动产物。

6.科学技术的风险有哪些?如何恰当地进行科学技术风险评价与决策?

科学技术的风险包括环境风险、政治风险、经济风险、健康风险和伦理风险等。这些风险会引发一系列争论,造成评价和决策上的困难。***指出:“要加快建立科技咨询支撑行政决策的科技决策机制,加强科技决策咨询系统,建设高水平科技智库。要加快推进重大科技决策制度化,解决好实际存在的部门领导拍脑袋、科技专家看颜色行事等问题。”

要恰当进行科学技术风险评价与决策,就应该全面评价科学技术风险—收益的多个方面,批判性地考察“内部"存有争议的科学知识或技术知识,分析相互竞争的利益集团和社会结构的"外部"政治学,理解科学技术专家知识和决策的局限性、公众理解科学的必要性以及外行知识的优势,明确政府、科学技术专家以及公众在与科学技术风险相关的公共决策中的不同作用,确立公众参与决策的可能方式,从而形成最优化的科学技术公共政策模式,以达到对科学技术风险社会有效治理的目的。

第五章 **马克思主义科学技术观

1.为什么说新时代**马克思主义科学技术是一个科学、完整的**理论体系?

***、***、……、胡锦涛、***的科学技术**,是在**共产党领导我国科学技术事业发展和进行社会主义现代化建设的伟大时间中,逐渐形成、发展和完善的。

**马克思主义科学技术观是基于马克思、恩格斯的科学技术**,对当代科学技术机器发展规律的概括和总结,是马克思主义科学技术论的重要组成部分。

**马克思主义科学技术观是**共产党人集体智慧的结晶,是对***、***、……、***科学技术**的概括和总结,是他们科学技术**的理论升华和飞跃,是他们科学技术**的凝练和精髓。

**马克思主义科学技术观的内容丰富,涉及了科学技术的功能、目标、机制、战略、人才和方针等重大问题,是一个科学、完整的**理论体系。

2.如何理解**马克思主义科学技术观的理论精髓?

**马克思主义科学技术观概括和总结了***、***、···、***等的科学技术**,包括科学技术的功能观、战略观、人才观、和谐观和创新观的基木内容,体现出时代性、实践性、科学性、创新性、自主性、人本性等特征,建设**特色的创新型国家,是**马克思主义科学技术观的具体体现。**马克思主义科学技术观,是马克思主义科学技术观与**具体科学技术实践相结合的产物,是马克思主义科学技术论的重要组成部分。

3.如何理解***新时代**特色社会主义**中的科学技术观的时代意义?

**马克思主义科学技术观的三个历史阶段是其各自所处的历史条件所决定的,是对时代背景实事求是的反映,因此科学技术**都镌刻了时代的烙印,反映了时代的需求。

***新时代**特色社会主义**中的科学技术观,是在**特色社会主义进入新时代的历史条件下形成的。新时代之“新",一是在于我们进入了一个新的发展阶段,发展环境、发展条件都发生了新的变化,目标任务也发生了新的变化;二是在于我们面临着新的社会主义主要矛盾;三是我们迈向新的奋斗目标。正是基于这一新时代的"新"特征时代背景,***立足于我贵哦科学技术与社会发展的现实需要,提出了一系列关于科学技术发展的理论观点,形成了***新时代**特色社会主义科学技术观。

UnSplash 获取随机图片的API

UnSplash 获取随机图片的API

我经常会使用 unsplash, 这里面的图片非常清爽,我的大多数文章的图片都是在这个网上找的,虽然也有同类型网站,但是用过一段时间以后基本都放弃了,图片质量参差不齐,筛选过程太费劲。

但是 unsplash 访问速度是个大问题,我经常会因为图片无法加载而被劝退。

今天一时手痒,顺手搜了 unsplash api 这个关键字,看官方有没有提供相关的 api 服务,还真有!

unsplash 提供了 2 个版本的 API。 一个是简单版,主要是给小型应用,流量比较少的 app 使用,可以通过 source.unsplash.com 进入;一个是进阶版的开发者中心 API, 支持更多流量的 app 使用,可以通过 unsplash.com/developers 进入。

Source API

source api 提供的功能比较简单。如果想获取一张随机图片,可以访问地址:

https://source.unsplash.com/random

这个地址会重定向到一张图片的地址,可以通过响应直接获取到一张图片。

如果图片太大,加载速度也会比较慢。你可以在 url 后面添加尺寸,控制返回的图片大小:

https://source.unsplash.com/random/800x600

如果原图片不是这种长宽比,unsplash 会对图片进行裁剪,某些部分就会丢失。如果你想保持图片的原始比例,可以把高度设成 0 :

https://source.unsplash.com/random/800x0

> 小提示
>
> 无论是什么 API, 你都可以在最后使用 /800x0 这样的方式控制图片的大小。

你可以指定获取某位作者的图片。比如我特别喜欢 Raamin ka 拍摄的照片。

我可以把它的用户名小写以后再去掉空格,添加到 /user 的后面:

https://source.unsplash.com/user/raaminka

这样我就能获取到这位作者拍摄的随机妹子照片了。不要忘了,你同样是可以控制图片尺寸的。

获取某个用户喜欢的照片:

https://source.unsplash.com/user/raaminka/like

unsplash api 还支持搜索。通常来说,我都会根据要写的文章的主题在 unsplash 上搜索图片。比如我要写一篇关于加密的文章,那我就会去搜索 encryption 相关的图片:

https://source.unsplash.com/800x0/?encryption

你也可以组合多个不同的关键字。如果没有图片同时包含这些关键字,则会优先匹配最后的关键字。

https://source.unsplash.com/800x0/?encryption,girl

现在我们每次访问同一个 API, 得到图片都不一样,因为是随机生成的。但是如果我们在每个 API 的后面添加 /daily 或者 /weekly, 则可以得到固定的一张图。需要注意,这并不是说这些图片更加热门或者质量更高,只是每天/每周保持不变的随机图片而已。

https://source.unsplash.com/800x0/daily?sports

blog link UnSplash 获取随机图片的API

常见编程命名缩写 # issue 标题模板 默认: 常见编程命名缩写

通用 缩写 翻译 控件 缩写 翻译
address addr 地址 calendar cdr 日历
application app 应用程序 messageDialog msgdlg 消息框
asynchronization asyn 异步 drawer drw 抽屉
average avg 平均数 buttonGroup btngrp 按钮分组
bitmap bmp 位图 checkBox chk 复选框
buffer buf 缓冲区 container cntr 容器
character char 字符 button btn 按钮
color clr 颜色 comboBox cmb 下拉框
command cmd 命令 lable lbl 标签
delete del 删除 progressBar prg 进度条
destination dest/dst 目的地 pageIndicator pgindic Tab分页控件
decrease dec 减少 radioButton rdo 单选框
device dev 设备 rangeSlider rngsld 滑块
different diff 不同的 scrollView svw 视图滚动
directory dir 目录 scrollBar vsb(垂直)/hsb(水平) 滚动条
document doc 文档 slider sld 滑动器
dynamic dyna 动态的 spinBox spn 旋转框
environment env 环境 splitView spltvw 分割视图
error err 错误 stackView stackvw 堆栈视图
execute exec 执行 statusBar statbr 状态条
group grp swipeView swpvw 滑动控件
image img 图像 switch sw 开关
information info 信息 tabBar tbbr tab栏
initialize init 初始化 textField txtfld 文本输入框
library lib toolBar tlbr 工具栏
maximum max 最大值 toolTip tltp 提示框
minimum min 最小值 toolButton tlbtn 工具按钮
message msg 消息 treeView trvw 树形视图
number num 数字,数,数量 layout lyt 布局
object obj 对象 mainMenu mmnu 菜单栏
parameter Param 参数(形参) groupBox gbx 组合框
package pkg 打包 pictureBox pic 图片框
position pos 位置 listView lvw 列表视图
previous pre 前一个 window win(wnd) 窗口
process/Procedure proc 进程/过程 form frm 表单
pointer ptr 指针 textBox txt 文本框
password pwd 密码 linkLabel llbl 超链接标签框
public pub 公共的 dialog dlg 对话框
reference ref 引用 scrollIndicator scrlindic 滚动指示器
source src
string str 字符串
summation sum
synchronization sync 同步
system sys 系统
table tbl 表格
temporary tmp 临时
text txt 文本
variable var 变量
addition add 加法/添加
argument arg 实参
array arr 数组
calculate calc 计算
configuration config 配置
column col
control ctrl 控制
hexadecimal hex 十六进制
original orig 原件
return rtn 返回
repeat rpt 重复
signal sig 信号
status stat 状态
stack stk 栈区
standard std 标准
trigger trig 触发
background bg 背景
escape esc 退出
user usr 用户
list lst 列表
server srv 服务
manager mgr 管理者
insert ins 插入
point pt
function func 函数
back bk 返回
break brk 间断
date dat 日期
edit edt 编辑
flag flg 标志
grid grd 网格
increment inc 增量
length len 长度
oracle ora 甲骨文数据库
panorama pano 全景
print prn 打印
program prg 程序
statistic stat 统计
administrator adm 管理员
database db 数据库
change chg 改变
click clk 点击
compare cmp 比较
coordinates coord 坐标
copy cpy 复制
current cur 当前的
dictionary dict 字典
display disp 显示
driver drv 驱动
extend ex/ext 扩展
frame frm 框架/帧
index idx/ndx 索引
horizontal horz 水平
instance ins 实例
increase inc 增加
link lnk 链接
middle mid 中间
multiply mul
resource res 资源
select sel 选择
test tst 测试
vertical vert 垂直
英文术语 描述
abstract 抽象的
abstraction 抽象性
access 访问
access level 访问级别
access function 访问函数
adapter 适配器
address 地址
address-of operator 取地址操作符
aggregation 聚合
algorithm 算法
allocate 分配
allocator 分配器
application 应用程序
architecture 体系结构
argument 实参
array 数组
arrow operator 箭头操作符
assembly language 汇编语言
assert(-ion) 断言
assign(-ment) 赋值
assignment operator 赋值操作符
base class 基类
base type 基类型
binary search 二分查找
binary tree 二叉树
binary operator 二元操作符
binding 绑定
bit
bitwise 以 bit 为单元逐一......
block 区块
boolean 布尔值
breakpoint 断点
build 构建
build-in 内置
bus 总线
byte 字节
cache 高速缓存(区)
call 调用
callback 回调
call operator call 操作符
character 字符
child class 子类
class
class template 类模板
client 客户(端)
code 代码
compatible 兼容
compiler time 编译期
compiler 编译器
component 组件
composition 复合
concrete 具象的
concurrent 并发
configuration 配置
connection 连接
constraint 约束(条件)
construct 构件
container 容器
const C++ 关键字,constant 的缩写
constant 常量
constructor 构造函数
copy 拷贝(动词/名词),副本(名词)
create 创建
custom 定制
data 数据
database 数据库
data member 数据成员(变量)
data structure 数据结构
debug 调试
debugger 调试器
declaration 声明式
default 缺省(默认)
definition 定义式
delegate 委托
dereference 提领(解参考)
derived class 派生类
design pattern 设计模式
destroy 销毁
destructor 析构函数
directive 指示符
document 文档
dynamic binding 动态绑定
entity 物体
encapsulation 封装
enum(-eration) 枚举
equality 相等
equivalence 等价
evaluate 核定、核算
exception 异常
explicit 显式
expression 表达式
file 文件
framework 框架
full specialization 全特化
function 函数
function object 函数对象
function template 函数模板
generic 泛型、泛化、一般化
getter 取值函数
global 全局的
handle 句柄
handler 处理函数
hash table 哈希表、散列表
header(file) 头文件
heap
hierarchy 继承体系
identifier 标识符
implement(-ation) 实现
implicit 隐喻的、暗自的、隐式
information 信息
inheritance 继承
inline 内联
initialization list 初始化列表
initialize 初始化
instance 实体
instantiate 实体化
interface 接口
Internet 互联网
interpreter 解释器
invariants 恒常性
invoke 调用
iterator 迭代器
library 程序库
linker 连接器
literal 字面常量
list 链表
load 装载
local 局部的
lock 机锁
loop 循环
lvalue 左值
macro
member 成员
member function 成员函数
memory 内存
memory leak 内存泄漏
meta
meta-programming 元编程
modeling 塑膜
module 模块
modifier 修饰符
multi-tasking 多任务
namespace 命名空间
native 固有的
nested 嵌套的
object 对象
object based 基于对象的
object model 对象模型
object oriented 面对对象
operand 操作数
operating system 操作系统
operator 操作符
overflow 溢出
overhead 额外开销
overload 重载
override 覆写
package
parallel 并行
parameter 参数、形参
parent class 父类
parse 解析
partial specialization 偏特化
pass by reference 按址传递
pass by value 按值传递
pattern 模式
placement delete (某种特殊形式的 delete operatoe)
placement new (某种特殊形式的 new operatoe)
pointer 指针
polymorphism 多态
preprocessor 预处理器
print 打印
printer 打印机
process 进程
program 程序
programer 程序员
programming 编程
project 项目
pseudo code 伪代码
quality 质量
queue 队列
raw 原始的、未经处理的
recursive 递归
refer to 指向、指称
reference 引用
regular expression 正则表达式
resolve 解析
return 返回
return type 返回类型
return value 返回值
runtime 运行期
rvalue 右值
save 保存
schedule 调度
scheduler 调度器
scope 作用域
search 查找
semantics 语义
setter 设值函数
signature 签名
smart pointer 智能指针
specialization 特化
source 源码
stack
standard library 标准程序库
statement 语句
static 静态的
string 字符串
subtype 子类型
support 支持
template 模板
temporary object 临时对象
text 文本
thread 线程
thread safe 多线程安全
throw 抛出
token 语汇单元
type 类型
unary function 单参函数
underflow 下溢
unqualified 未经资格修饰
user 用户
user interface 用户界面
value
variable 变量
vector 矢量
virtual function 虚拟函数
virtual machine 虚拟机

Visual Assist 快捷键整理 # issue 标题模板 默认: Visual Assist 快捷键整理

Visual Assist 快捷键:

shift+alt+F 查找引用
alt+M 查看当前文件下函数列表
alt+up 将当前行的代码放到上一行
alt+down 将当前行的代码放到下一行
alt+O .h/.cpp文件的切换
Ctrl + -:光标回到上一处
Ctrl + Shift + -:光标回到下一处
Alt + G:快速跳到定义

shift+alt+O 打开解决方案文件对话框
shift+alt+S 查找某个对象或是变量
shift+alt+Q 鼠标定位到函数名上,若是在cpp文件中,则按此快捷键会弹出右键菜单,里面有一个选项--创建声明。 与Alt+O配合会比较方便。
shift+alt+F 找到对象的所有引用
shift+alt+R 找到所有对象并重命名

代码规范 # issue 标题模板 默认: 代码规范

TrustClient 相关

1) win api使用宏控制

#ifdef Q_OS_WIN
	#include &lt;Windows.h&gt;
#endif

内存相关

函数段

  1. 申请内存
void *zallloc(size_t len) {
    void *p = malloc(len);
    if(p) {
        memset(p, 0, len);
    }
    
    return p;
}

常用的宏

#define safe_free(p) {\
	free(p);\
	p = NULL;\
}\

线程的资源竞争

  1. 链表、边界资源、临界区域的操作一定要<mark style="background-color:red">加锁</mark>
std::mutex mtx; // 保护counter

mtx.lock();

// 要进行的资源操作
todo();

mtx.unlock();

内存泄漏分析实战 # issue 标题模板 默认: 内存泄漏分析实战

[toc]

前言

本文为项目中服务程序的内存泄漏,挑了其中一部分比较常见的内存泄漏进行分析和修改。

关于内存泄漏和分析的文章可查看博客相关文章,有 UMDHvld 两种方式,可根据个人需求展开分析。

泄漏分类

# malloc 内存泄漏

下述日志为一次 malloc 未正确释放导致的内存泄漏。这种问题比较常见,不用多说。

    ntdll.dll!RtlAllocateHeap()
    ***\heap\malloc_base.cpp (34): XXX.dll!_malloc_base() + 0xF bytes
    XXX.dll!_event_debugx() + 0x1A7 bytes

<mark style="background:green;border-radius:10px;color:white;border:none">解决方案:</mark>

根据提示的位置找到并释放该内存。

char *ch = (char*)malloc(sizeof(8));
free ch;
ch = NULL;

另外,也可以使用智能指针管理该指针:

char *ch = (char*)malloc(sizeof(8));
shared_ptr&lt;char&gt; spCh(ch);

# new 内存泄漏

关于 new 的内存泄漏分析写了一段代码用来展示一下:

<font size=1>注:代码 Section2 部分为一个崩溃代码,堆内存申请后使用时一处,而在堆内存申请和释放时以及程序结束时释放堆内存时,都 <mark>存在堆溢出检查</mark> ,检查点会抛出异常,导致程序奔溃。</font>

// 代码 Section2
// 该函数代码还涉及奔溃问题
int* test_heap_alloc()
{
	int* pTable = new int(256); // 申请一个int结构体变量,初始值为256;
	for (int i = 0; i &lt; 256; i++)
		pTable[i] = i;
	return pTable;
}

int main ()
{
   	test_heap_alloc();
    // 执行上述代码之后再去下边这句申请堆内存会奔溃。
    char* p = new char(0); // 申请一个字节,内容初始化为0
	return 0;
}

以下为 vld 生成的泄漏日志:

WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x010AAC68: 4 bytes ----------
  Leak Hash: 0x03729B3D, Count: 1, Total 4 bytes
  Call Stack (TID 33760):
    ucrtbase.dll!malloc()
    d:\agent\_work\3\s\src\vctools\crt\vcstartup\src\heap\new_scalar.cpp (35): vldforptr.exe!operator new() + 0x8 bytes
    d:\code_source\c++\vs2019\vldforptr\vldforptr.cpp (45): vldforptr.exe!main() + 0x7 bytes
    KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
    ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
    ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
  Data:
    00 00 00 00                                                  ........ ........

<mark style="background:green;border-radius:10px;color:white;border:none">解决方案:</mark>

调用 delete 释放 new 出来的内存。

  1. 问题:不确定变量什么时候使用完的,如何释放?

    // 使用智能指针
    char *ch = new char[256];
    std::shared_ptr&lt;char&gt; spCh(ch);

# strdup 内存泄漏

strdup函数说明:

功能:将字符串拷贝到新建的位置处

返回值 :返回一个指向新字符串的指针,该字符串是字符串s的副本,如果分配空间失败,则返回NULL值。新字符串的内存由strdup函数原型内部的malloc()获得,需用free()释放。

ntdll.dll!RtlAllocateHeap()
minkernel\crts\ucrt\src\appcrt\heap\malloc_base.cpp (34): XXX.dll!_malloc_base() + 0xF bytes
XXX.dll!BUF_strndup() + 0x8A bytes

把返回内存地址的释放权交给了别的变量,这就很容易忘记释放,所以 strdup 这个函数也很容易造成内存泄漏。

整理

# _malloc_base

_malloc_base 就是编译器编译之后的 malloc

查看vld的log可以看到,堆栈显示的 _malloc_base 所在的文件夹为 minkernel\crts\ucrt\src\appcrt\heap\malloc_base.cpp,这个文件就是 malloc 声明和定义的文件。

领导您好!
以下内容为本次绩效期间我的工作概述以及自我评价。

本次绩效期间,我的主要工作内容集中在零信任国信版本和天擎零信任插件部分,同时也负责了部分工行、标板的需求开发(SPA、异常告警、命令行登录等)。零信任国信版本共计发布版本两次,均在发布版本之前完成了需求的开发和bug的修复,涉及的需求十多项,需求提测均通过,在完成需求的同时,整理编写了相应的技术开发文档十多篇,同时也补充了零信任客户端部分配置文件的说明文档。开发同时,针对国信零信任版本的升级故障问题(升级失败,升级检测问题),优化了该部分的逻辑,对整个客户端的无逻辑代码和日志部分进行了优化,以便于后续快速定位和分析问题,国信发布版本期间,为保证出包顺利,解决临时出现的问题,与团队一起解决问题并完成版本发布的任务;零信任插件部分,插件的开发让我学习到了较多框架方面的知识,了解了插件的开发以及团队联调的过程,零信任插件的开发在团队帮助下开发较为顺利,并且按时提测,且完成度较高,故障部分相对较少,调整部分基本为业务方面的逻辑调整。工行和标板的需求也是在计划内完成了需求的开发并提测成功,本次绩效期间,工作充实,如期完成了各项需求开发。不足就是多个需求的开发和提测过程相对较慢,由于环境(tac)问题,在开发自测和提测过程中出现了效果不一致的情况,在以后开发中需要注意该方面问题对开发提测的影响,提测前尽量保证自测完整,需求完善。

以上就是本期自我评价。

英雄联盟语录 # issue 标题模板 默认: 英雄联盟语录

  1. 仁义道德,也是一种奢侈。——亚索
  2. 千军万马一将在,探囊取物有何难。——皇子
  3. 落叶的一生,只是为了归根么。——亚索
  4. 我对你的爱就如闪电,狂暴而剧烈,飞出的飞镖,是我向你传达的思念。——狂暴之心
  5. 且听风吟,御剑于心。——亚索
  6. 一曲终了,繁花散尽,伊人已逝,只余一声空叹。——死亡颂唱者
  7. 我只是部落遗子,你确是高贵公主,我愿把我生命的力量化为三刀为你而战,只为证明我,配的上你。——蛮族之王
  8. 我对你的爱就如闪电,狂暴而剧烈,飞出的飞镖是向你传达的思念。——狂暴之心
  9. 无情的岁月慢慢的侵蚀你我的生命,在这尽头请允许我为你弹下那回忆的肖邦。——琴瑟仙女
  10. 从我手中脱离的刀刃一直在飞舞,我不断的变强,只是为了守护我们的家园,我等候你的归来。——刀锋意志
  11. 放马过来吧!你会死的很光荣的!——盖伦
  12. 即使一无所有,也要未雨绸缪!——法外狂徒
  13. 征战沙场,只为守护我们的家园。只为解甲归田后,可以在墓前守护你一辈子。——德邦
  14. 我们不受岁月左右。——马尔扎哈
  15. 我可以想去哪就去哪,但是我只想进入你的心里。——祖安狂人
  16. 想要再来一发吗,我可不会留下任何悬念。——女警
  17. 体型并不能说明一切!——提莫
  18. 妩媚倾城的面容,我蛊惑万千众生,孰不知,心里,早有了一个人。却只能无尽的思念,你送我的宝珠,我一直带着,只因为我能看见你的身影。——九尾妖狐
  19. 规则就是用来打破的!——金克丝
  20. 你的遗体将慢慢消散,化为永恒,就像沙漠中的沙砾那样。——狗头
  21. 不管是怎么样的天气,不管是什么样的环境,不管有什么样的危险,我的伙伴,雪人,一直都会陪着我。——雪人骑士
  22. 世界上最痛苦的事情,莫过于爱你,却不能对你说出,我只能倾注于我的琴,让我的旋律诉说我的爱。——琴瑟仙女
  23. 下了手中的武器,我知道你已厌倦。目送你离开,我亮起黄昏的路灯,照亮你回家的路。——武器大师
  24. 他们会像迎接英雄一般迎接你们。——暗裔剑魔
  25. 这个故事还没有完结。——亚索
  26. 我宁愿犯错误,也不愿什么都不做。——艾克
  27. 断剑重铸之日,其势归来之时!——瑞文
  28. 我追逐的是你的背影,我跟随的是你的微笑,就算暴风雨到来我依然能在你左右。——雷霆咆哮
  29. 只有蠢货才会犹豫不决。——卡特琳娜
  30. 入体冰凉的月光都比不上你绝情的目光,为了击碎你伪装的表面,我只能用尽全身力气挥出那惊鸿的半月弧光。——皎月女神
  31. 念当年有爱的我,可惜啊,你们看不到啦。——水晶先锋
  32. 夜,雪花飘落;我,孤独风中;凛冽的寒风,割裂着我的皮肤。不知绝对的零度是否能冻结对你的思念。——雪人骑士
  33. 人生最痛苦的事莫过于你明知要失去,却还没发生。——基兰
  34. 即使是一无所有的人也会为自己所珍惜的一切而献出生命。——暗裔剑魔
  35. 人们向往天堂,可天堂没有你。于是我堕落凡间追寻你的脚步,只因有你的地方才是天堂。——堕落天使
  36. 这只是一场战役,而我,已经赢下了战争!——丽桑卓
  37. 我来自深海,我没有朋友,大家都不和我玩,只有巨鲨是我的朋友,你愿意和它一起玩吗?——潮汐海灵
  38. 征战沙场,只为守护我们的家园。只为解甲归田后,可以在墓前守护你一辈子。——德邦总管
  39. 哼,一个能打的都没有!——武器大师
  40. 别看我的眼睛,里面只有愤怒和痛苦。我诅咒着一切,也诅咒着自己。——魔蛇之拥
  41. 我一直急速前行,穿梭于人人之间,试图叫应接不暇的风景让我褪去对你的思念。——无极剑圣
  42. 太阳不会揭露真相。它的光芒只会让人灼伤和致盲。——黛安娜
  43. 我一直急速前行穿梭于人人之间试图叫应接不暇的风景让我褪去对你的思念——无极剑圣
  44. 死后能做的最棒的事情是什么?就是碾碎你的敌人,看着他们先你一步而去,并聆听他们怯懦的哭喊。——赛恩
  45. 你有一双摄人心魄的眼睛。我非常喜欢。——赏金猎人
  46. 命运已做出了它的选择!——赵信
  47. 你总说我太小,但是出现危险我都会跳跃到你身边,将危险推开。用手中的炮筒,守护我小小的爱。——麦林炮手
  48. 你们不能逮捕我,我爹是瓦罗兰的抗把子。——奥拉夫
  49. 悄悄的我走了,正如我悄悄的来;我摸一摸戒指,再带走一次五杀。——剑圣
  50. 你们知道最强的武器是什么?没错,就是补丁!——武器大师
  51. 我在时光中穿梭,只为找回曾经美好的时光。——时光守护者
  52. 你们这种战斗力,我建议你们还是投降算了。——拉克丝
  53. 炙热的铁拳砸不开你面前的牢笼,不甘放弃的努力,只为了有一天能砸开牢笼见你一面。——皮城执法官
  54. 想攻击我?先试试和影子玩拳击吧。——暗夜猎手
  55. 我疯狂的奔跑,只想为你承受一切的伤害,我竖起了山丘,不愿你看见我丑陋的脸庞。——诅咒巨魔
  56. 哪一个比较沉重,你的剑刃,还是你的过去?——亚索
  57. 物是人非,可我依旧穿着嫁衣,在黑夜中寻找你的身影。你我的约定我一直记得,那一道道璀璨的光束,都是为你所亮。——寡妇制造者
  58. 断剑可以重铸,破镜是否可以重圆?心碎可以可以无痕?——放逐之刃
  59. 不要测试你的运气,召唤师!——卡特琳娜
  60. 曾经,我们错过了,但是,我希望你的未来有我,有我来守护着你。——未来守护者
  61. 没有你的世界,我感到孤独。我一次次地想随你而去,但是又一次次地重生。长生不死对我而言是一件多么痛苦的事情。——暗裔剑魔
  62. 吾之荣耀,离别已久。——亚索
  63. 这场流星雨,只是想给你看,没想到却是伤害了你。——众星之子
  64. 你将忘记呼吸,你将忘记爱情。——卡尔萨斯
  65. 在瓦罗兰,我是一个无恶不作的大海盗。而成为海盗的原因是为你保驾护航。——海盗船长
  66. 外表可是具有欺骗性的。——妖姬
  67. 那拿枪的海盗,是记忆里的核心;浩空里的流星,在我的脑海闪过。——赏金猎人
  68. 守护你是我最后的希望,束缚着的是思念,丢弃的是无奈,最后我会留下一个圈摆放你我的回忆,直到我也干枯,你也远去!——扭曲树精
  69. 时间不在于你拥有多少,而在于你怎样使用。——艾克
  70. 我每向你射出一支箭,便代表我对你的爱多一分,而你,是否会接受我万千的爱?——寒冰射手
  71. 我一直急速前行,穿梭于人人之间。试图借应接不暇的风景让我褪去对你的思念。——无极剑圣
  72. 死亡如风,常伴吾身。——亚索
  73. 顺我者昌,逆我者亡,此乃天意。——卡牌
  74. 即使丑陋的外表也掩盖不了我对召唤师的感激之情,即使在很危险的情况下我也会挺身而出。——诅咒巨魔
  75. 那双枪下的弹幕,不是烟花,是琴上律;爆发在好运间,释放着海盗似的野。——赏金猎人
  76. 人终归是要死的,为什么不选择一种死亡的方式呢?——卡尔萨斯
  77. 过去那个爱笑的我已经不在了,现在的我只剩下魔法与记忆以及这个丑陋不堪的身躯,孤独的在这个世界徘徊。——水晶先锋
  78. 这不仅仅只是屠杀,而是我的杰作。——暗裔剑魔
  79. 我是一个影子,当我潜入阴影之中,没有人能够看见我,但是我希望你是个例外!——影流之主
  80. 甲板上的脚印,稳稳的在船上蔓延;在碧海的波浪里,我如愿做一条飞鱼!——赏金猎人
  81. 朋友,有我在你就是不死的。即使我死了。也要让你活着离开。——众星之子
  82. 我没有过多的抱怨,漫天的乌鸦都是我的朋友,有这个,就足够了——末日使者
  83. 我的剑比什么都重要,除了美酒。——亚索
  84. 我也希望变成蝴蝶的那一天,不再灰色,不再痛苦。不会再让我丑陋的外表吓到美丽的你。——深渊巨口
  85. 我愚蠢的以为,头上的金箍圈可以圈住你所有的爱,可惜我手中的金箍棒改变不了那个开始,也决定不了这个结局,根本没有齐天大圣,我只是一只猴子。——齐天大圣
  86. 冰冷的锁链,无情的束缚,黑色的羽毛,血色的双眼,所有的一切都是因为那颗冷寂的心。——堕落天使
  87. 狂野将使他们感到畏惧。——豹女
  88. 我不顾一切的冲出去……为你开辟一条安稳的路。我满腔热血的拍打着……为你抛开任何绊脚的石。最后,我坦然微笑着用躯体为你抵挡一切……因为我的身体上旋转着我们的誓言!——牛头酋长
  89. 我不会怀着耻辱而死!——亚索
  90. 断刃可以修复,残心如何弥补。——放逐之刃
  91. 冰封千年的心,只为等待那瞬间的融化。日夜凄美的呼唤。也换不回你微笑的回眸。——冰晶凤凰
  92. 树叶的一生只是为了归根么?——疾风剑豪
  93. 闭上眼睛,你会看到更多。——仙灵女巫璐璐
  94. 炽热的铁拳砸不开你面前的牢笼,不甘放弃的努力,只为了有一天能砸开牢笼见你一面。——皮城执法官蔚
  95. 我能在空气中嗅到敌人的味道,我很努力了,可是,为什么还是找不到你的踪迹呢!——嗜血猎手
  96. 放下了手中的武器,我知道你已厌倦,目送你离开,亮起黄昏的路灯,照亮你回家的路。——武器大师
  97. 你一直在畏惧我的毒刺,别怕,让我用我的毒刺把你牵引到我的身边。——水晶先锋
  98. 追逐的是你的背影,我跟随的是你的微笑,就算黑夜到来我依然能在你左右。——永恒梦魇
  99. 我日复一日地把自己弄得伤痕累累,只是为了看到你为我查看伤口时的柔情。——阿木木
  100. 像英雄一样战斗,或者像懦夫一样死去。——暗裔剑魔
  101. 我和战争一样永恒。——暗裔剑魔
  102. 我筑起高墙,只为了跟你锁在一起,不离不弃。——皇子
  103. 谁说笑着就是愉悦,在我微笑的面具下,是已为你风干了伤痕的心,之所以逗万千人开心,只不过是为了等你转世之后对我的,轻浅一笑。——恶魔小丑
  104. 明日安在,无人能允。——亚索
  105. 在无人注视的角落,独自默默的弹奏。琴音带着我的思恋,妄图拉住你转身而去的袖角。——琴瑟仙女
  106. 生命,不过只是一场骗局,从你开始呼吸的那一刻起,你就已经在慢慢死亡了。——死亡颂唱者
  107. 这场战争,将会是我的杰作!——暗裔剑魔
  108. 无形之刃,最为致命。——劫
  109. 妩媚倾城的面容,我蛊惑万千众生。殊不知心里早有了一个人,却只能无尽的思念。你送我的宝珠我一直带着,只因为我能看见你的身影。——九尾妖狐
  110. 永远不要质疑我的忠诚,你不会了解我为之忍受的一切。——卡特琳娜
  111. 如果你赢不了,试试换一把大点的剑!通常都有用。——咆啸深渊
  112. 我披上坚甲,挡在你前面。万千的关心,只化为一句小心。——披甲龙龟
  113. 大地的融化,海水的暴涨,星辰的坠落。我虚空的眼睛无法先知你的足迹。——虚空先知
  114. 我在时空中穿梭,只为找回曾经美好的时光……——时光老人
  115. 在诺克萨斯有一个残忍的杀手,但是你们都不明白他其实是为了国家在战斗,他的苦楚有几人懂?——诺克萨之手
  116. 有我在就不允许别人伤害你,即使我死了,也要你活着离开。——众星之子
  117. 刀光剑影,铁石心肠,只有你知道在隐雾下的我,还是那么脆弱,容易感伤。——刀锋之影
  118. 如果我俩角色互换,我会让你看看,什么叫残忍!——维嘉
  119. 我没有过多的抱怨,漫天的乌鸦都是我的朋友,有这个,就足够了。——末日使者
  120. 世间万物,表里如一者,又有几何?——婕拉
  121. 卑微的我拿起手弩隐匿在你的左右,守护着你,即使你永远也不知道。——瘟疫之源
  122. 每一张牌,都是对你的思念。我赌赢了所有,却赢不回你的爱。——卡牌大师
  123. 那手中的冥火,是坦克中的噩梦;无极里的鬼影,在我的身边穿梭。——剑圣
  124. 每一张牌,都是对你的一份思念,我赌赢了所有,却赢不回你的爱。——卡牌大师
  125. 行走于虚空,我彷徨,我迷茫。我不知何去何从,只有飘飘荡荡。——虚空行者
  126. 不要错把仁慈当做弱小。——冰女
  127. 我们该怎么进行,这令人预约的折磨呢?——魂锁典狱长
  128. 我一路种下了蘑菇,只为让你知道回家的路。——迅捷斥候
  129. 邪恶的外表,其实并不是我的内心。你总是说我困住了你,你会为我停留么?——邪恶小法师
  130. 心怀恐惧的死去,或者手染鲜血的获胜。——暗裔剑魔
  131. 恩......你们的肉非常可口。--嗜血猎手
  132. 我是一个影子,当我潜入阴影之中,没有人能够看见我,但是,我希望你是个例外!--影流之主
  133. 液压系统已开启。--首领之傲
  134. 我披上坚甲,挡在你的身前,万千的关心只化为一句:小心。--披甲龙龟
  135. 让我们合伙干吧!--猩红收割者
  136. 要协调。--琴瑟仙女
  137. 你一直在畏惧我的毒刺,别怕,让我用我的毒刺把你牵引到我的身边。--水晶先锋
  138. 我敢打赌,你的味道和鸡肉差不多。--策士统领
  139. 众星啊......我......回来......了......--众星之子
  140. 面具的笑容,遮挡不住我的悲伤,谁能看到我面具下的眼泪。--恶魔小丑
  141. 妩媚倾城的面容,我蛊惑万千众生,孰不知心里早已有了一个人,却只能无尽的思念,你送我的宝珠我一直带着,只因为我能看见你的身影。--九尾妖狐
  142. 你要来几发么?--寒冰射手
  143. 野性的本能,指引着我们的拳头。--野兽之灵
  144. 血块变厚了。--猩红收割者
  145. 我可以在空气中嗅到敌人的味道,我很努力了,可是,为什么还是找不到你的踪迹。--嗜血猎手
  146. 我们的本能如同剃刀般锋利!--野兽之灵
  147. 命运已做出了它的选择!--德邦总管
  148. 恶作剧的对象,是你哟!--恶魔小丑
  149. 没错,我知道我让你无法呼吸。--风暴女神
  150. 在无尽的虚空中,我感到了前所未有的孤独,我可以掠夺任何生命,但是却掠夺他们的心。--虚空掠夺者
  151. 现在他们可以死了!--蛮族之王
  152. 听我说,召唤师。我并没有兄弟,也不认识特斯拉!我的瞬移以及分身靠的都是魔法!--恶魔小丑
  153. 我的剑刃不但准,而且狠!--刀锋意志
  154. 愿意送我点血吗?--猩红收割者
  155. 艾欧尼亚不会灭亡。--刀锋意志
  156. 血液正在慢慢滴落。--猩红收割者
  157. 当黑色的玫瑰悄悄绽放,除了镜花水月,又有谁能了解我的心。--诡术妖姬
  158. 瞧瞧你的背后~--恶魔小丑
  159. 刀光剑影,铁石心肠,只有你知道在隐雾下的我,还是那么脆弱,容易感伤。--刀锋之影
  160. 血流成河!--猩红收割者
  161. 团结起来吧,我们必将凯旋。--天启者
  162. 击鼓,进军!--德邦总管
  163. 我没有过多的抱怨,漫天的乌鸦都是我的朋友,有这个就足够了。--末日使者
  164. 我会尽情享受他们的骨头的。--嗜血猎手
  165. 他们的胜利必将成为奢望!--刀锋意志
  166. 你们打架的时候总是这么不给力么?--众星之子
  167. 缓慢的步伐,踉跄的脚步,满嘴的胡话,还有嘴角那一抹苦涩的微笑,为何酒精都不能解脱我对你的思念。--酒桶
  168. 没有地方可以安生!--扭曲树精
  169. 你笑我为何拿上锤和盾,你说有你在,我不会受到伤害。可是你不知道,让我受伤的人,是你。--钢铁大使
  170. 收获之月,多美妙的名字啊。--猩红收割者
  171. 宝石们显露着它们的锋芒。--宝石骑士
  172. 你们只是玻璃制品,一碰就碎。--宝石骑士
  173. 我很想陪伴在你的身边,只是你不允许,没关系,在你需要帮助时,我还是会出现在你的身边。--暮光之眼
  174. 提莫队长正在待命!--迅捷斥候
  175. 要优美。--琴瑟仙女
  176. 我追逐的是你的背影,我跟随的是你的微笑,就算暴风雨到来,我依然在你的左右。--雷霆咆哮
  177. 下了手中的武器,我知道你已厌倦,目送你离开,亮的起黄昏的路灯,照亮你回家的路。--武器大师
  178. 为荣誉而战!--战争女神
  179. 您果然深思熟虑,召唤师。--暮光之眼
  180. 噢,你想要什么?--瘟疫之源
  181. 精彩的二重唱。--琴瑟仙女
  182. 我的剑刃从不颤抖。--刀锋意志
  183. 只有飞速的旋转,才可以止住我的泪水,忘记你的模样。--不祥之刃
  184. 给我找些更强的敌人!--嘉文四世
  185. 可以接受的冒险。--策士统领
  186. 让我来引领您走向胜利。--众星之子
  187. 选牌吧!--卡牌大师
  188. 我喜欢有心脏的勇士,并且绝对不会让他们过期。--猩红收割者
  189. 我知道自己一身的痛苦,我没有选择,我只有带着你的灵魂离去。--金属大师
  190. 将他们冲散!--牛头酋长
  191. 在漆黑的夜里你需要一道光照亮夜行的路,我燃烧了自己,但也造就了你我不能相拥。--复仇焰魂
  192. 当水晶箭射像你的时候,请不要害怕,只是为了让你片刻的驻足,好让我追赶你的脚步。--寒冰射手
  193. 目标已被标记。--暮光之眼
  194. 保护忠良!--嘉文四世
  195. 哪里有战斗,哪里就有我。--天启者
  196. 是啊!哈哈哈哈哈!--邪恶小法师
  197. 一曲终了,繁花散尽,伊人已逝,只余一声空叹。--死亡颂唱者
  198. 魔法!它在召唤我!--邪恶小法师
  199. 我来自深海,我没有朋友,大家都不和我玩,只有巨鲨是我的朋友,你愿意和他一起玩吗?--潮夕海灵
  200. 我是魔鬼!不许笑!--邪恶小法师
  201. 一切尽在卡牌之中。--卡牌大师
  202. 是摇,还是不摇,这是一个问题。--炼金术士
  203. 吃我一记重击!--亡灵勇士
  204. 中场休息时间!--琴瑟仙女
  205. 我想我会让你难受一阵子的!--宝石骑士
  206. 我用意念传达给您。--琴瑟仙女
  207. 这首是慢板曲,召唤师。--琴瑟仙女
  208. 完美的节拍。--琴瑟仙女
  209. 我会悼念你的。--宝石骑士
  210. 如果善待动物协会问起来的话,我们就说这些皮毛是仿制的。--野兽之灵
  211. 我宁愿相信一切,也不愿再相信世人,只有野兽能告诉我什么叫感情。--野兽之灵
  212. 忠诚之心永不停息。--首领之傲
  213. 我的`道路,清澈无比。--众星之子
  214. 我会下达命令。--策士统领
  215. 俺很生气,后果很严重!--牛头酋长
  216. 视死如归,就在今天!--嘉文四世
  217. 正做着呢!--卡牌大师
  218. 如果我能休息就好了。--扭曲树精
  219. 要象征美好时光,请找琥珀。--宝石骑士
  220. 你是没有机会赢我的。--蛮族之王
  221. 没有退路了!--刀锋意志
  222. 亡命天涯,只是为了追寻你的足迹。却不想命运的捉弄,总是让你我天各一方。--法外狂徒
  223. 永恒痛苦的赠品。--首领之傲
  224. 战斗吧!--战争女神
  225. 这就是我收养那些流浪剑刃的结果。--刀锋意志
  226. 我好想射点儿什么!--麦林炮手
  227. 狩猎的时候到了。--嗜血猎手
  228. 我也试图终结过这困扰,但它总会卷土重来。--扭曲树精
  229. 执行均衡之令。--暮光之眼
  230. 德玛西亚,永世长存!--嘉文四世
  231. 是,长官!--迅捷斥候
  232. 不要否认你的本能,召唤师。--野兽之灵
  233. 你我的约定,我一直记得。那一道道璀璨的光辉,都是为你所亮。--光辉女郎
  234. 我愚蠢的以为,头上的金箍圈可以圈住你所有的爱,可是我手中的金箍棒改变不了那个开始,也决定不了这个结局,根本没有齐天大圣,我只是一只猴子。--齐天大圣
  235. 这很好玩吖!--恶魔小丑
  236. 我对你的爱就如闪电,狂暴而剧烈,飞出的飞镖,是我向你传达的思念。--狂暴之心
  237. 我醒来了,但是什么都不记得,我很害怕,我包裹住自己的身体,独自在黑暗中哭泣。--殇之木乃伊
  238. 为了内心的安宁。--众星之子
  239. 像节拍器一样准确无误。--琴瑟仙女
  240. 稳步前进!--刀锋意志
  241. 来次魔术戏法,咋样?--恶魔小丑
  242. 你的亲友们正在饱受折磨!--邪恶小法师
  243. 物是人非,可是我依然穿着嫁衣,在黑暗中寻找你的身影。--寡妇制造者
  244. 好极了!--猩红收割者
  245. 我不顾一切的冲出去,为你开辟一条安稳的路,我满腔热血的拍打着,为你抛开任何绊脚的石,最后,我坦然的微笑着用我的身体为你抵挡一切...因为我的身体上旋转着我们的誓言。--牛头酋长
  246. 你们跌倒了没?崩溃了么?--麦林炮手
  247. 胜利在望。--策士统领
  248. 攘除奸邪!--嘉文四世
  249. 我自人类诞生,却被人类抛弃,孤独的徘徊于世间,却与世间格格不入,于是我只能试图抓住每个遇到的生命,去倾诉那颗从不被理解的心。--蒸气机器人
  250. 为了父王!--嘉文四世
  251. 这局胜负已定。--嗜血猎手
  252. 漫天的冰雪冻结了我的心,但它冻结不了我心中的正义,我愿用我严寒的身躯冰冻这世间的邪恶。--冰晶凤凰
  253. 奉吾王之命!--德邦总管
  254. 我对你的爱就如闪电,狂暴而剧烈,飞出的飞镖是对你的思念。--狂暴之心
  255. 你必须跟着俺!--牛头酋长
  256. 开战吧!--蛮族之王
  257. 从我手中脱离的刀刃一直在飞舞,我不断在变强,只是为了守护我们的家园,等候你的归来。--刀锋意志
  258. 真正的意志是不会被击败的!--刀锋意志
  259. 我也希望变成蝴蝶的那一天,不再灰色,不再痛苦,不再让我丑陋的外表吓到美丽的你。--深渊巨口
  260. 我会在那儿的。--瘟疫之源
  261. 我可以想去哪里就去哪里,但是我只想去你心里。--祖安狂人
  262. 随心而动,随刃而行!--蛮族之王
  263. 我的目标很纯粹。--策士统领
  264. 我觉得我......变回人类了......--嗜血猎手
  265. 是的,只要998,就能让你爽到不能呼吸哟。--风暴女神
  266. 我们不知道何为怜悯,即使对象是你!--野兽之灵
  267. 你已经死了......只是你还没发觉而已。--暮光之眼
  268. 生存,就是折磨。--首领之傲
  269. 诺克萨斯人从来不会闲逛。--策士统领
  270. 哦好的,好的!--瘟疫之源
  271. 非常荣幸。--暮光之眼
  272. 有情况!--迅捷斥候
  273. 入体冰凉的月光,都比不上你绝情的目光。为了击碎你伪装的表面,我只能用尽全身力气挥出那惊鸿的半月弧光。——皎月女神
  274. 我束缚住了你的人,却束缚不住你的心。所以我只能远远跳离你身边,因为我知道,离你越近,我的心就会越痛。——皮城女警
  275. 沙漠中的太阳,是我对你爱的象征。——沙漠死神
  276. 在无人注视的角落,独自默默的弹奏。琴音带着我的思恋,妄图拉住你转身而去的袖角。——琴瑟仙女
  277. 我追逐的是你的背影,我跟随的是你的微笑。就算暴风雨到来,我依然能在你左右。——雷霆咆哮
  278. 默默的在背后望着你的背影,当你有危险时我会毫不犹豫的从天而降。哪怕双腿震得生疼,我依然会咬紧牙关再次跳向对手,抛出手中的战矛。哪怕是死,我也要保护你的安全。——战争之王
  279. 别看我的眼睛,里面只有愤怒和痛苦。我诅咒着一切,也诅咒着自己。——魔蛇之拥
  280. 金色的长驽陪伴我的一生,沾满鲜血的双手却磨灭不了心中的伤痛,我翻腾着身影在人群中闪烁,寻找一句最真心的问候。然后我悄悄的隐没、隐没,隐没在那孤寂的草丛……——暗夜猎手
  281. 行走于虚空,我彷徨,我迷茫。我不知何去何从,只有飘飘荡荡。——虚空行者
  282. 逝于晨,诞于暮。追寻着芳香的血液,环于世与墓之间。——猩红收割着
  283. 尘封千年,肉体早已湮灭,意识已然不清。探索了全部魔法的奥秘,只为能开辟虚空,寻找早已失去的你。——远古巫灵
  284. 你总说我太小,但是出现危险我都会跳跃到你身边,将危险推开。用手中的炮筒,守护我小小的爱。——麦林炮手
  285. 炙热的铁拳砸不开你面前的牢笼,不甘放弃的努力,只为了有一天能砸开牢笼见你一面。——皮城执法官

Typora Emoji # issue 标题模板 默认: Typora Emoji

[toc]

People

😄 :smile: 😆 :laughing:
😊 :blush: 😃 :smiley: ☺️ :relaxed:
😏 :smirk: 😍 :heart_eyes: 😘 :kissing_heart:
😚 :kissing_closed_eyes: 😳 :flushed: 😌 :relieved:
😆 :satisfied: 😁 :grin: 😉 :wink:
😜 :stuck_out_tongue_winking_eye: 😝 :stuck_out_tongue_closed_eyes: 😀 :grinning:
😗 :kissing: 😙 :kissing_smiling_eyes: 😛 :stuck_out_tongue:
😴 :sleeping: 😟 :worried: 😦 :frowning:
😧 :anguished: 😮 :open_mouth: 😬 :grimacing:
😕 :confused: 😯 :hushed: 😑 :expressionless:
😒 :unamused: 😅 :sweat_smile: 😓 :sweat:
😥 :disappointed_relieved: 😩 :weary: 😔 :pensive:
😞 :disappointed: 😖 :confounded: 😨 :fearful:
😰 :cold_sweat: 😣 :persevere: 😢 :cry:
😭 :sob: 😂 :joy: 😲 :astonished:
😱 :scream: 😫 :tired_face:
😠 :angry: 😡 :rage: 😤 :triumph:
😪 :sleepy: 😋 :yum: 😷 :mask:
😎 :sunglasses: 😵 :dizzy_face: 👿 :imp:

显示详细信息

😈 :smiling_imp: 😐 :neutral_face: 😶 :no_mouth:
😇 :innocent: 👽 :alien: 💛 :yellow_heart:
💙 :blue_heart: 💜 :purple_heart: ❤️ :heart:
💚 :green_heart: 💔 :broken_heart: 💓 :heartbeat:
💗 :heartpulse: 💕 :two_hearts: 💞 :revolving_hearts:
💘 :cupid: 💖 :sparkling_heart: :sparkles:
⭐️ :star: 🌟 :star2: 💫 :dizzy:
💥 :boom: 💥 :collision: 💢 :anger:
❗️ :exclamation: :question: :grey_exclamation:
:grey_question: 💤 :zzz: 💨 :dash:
💦 :sweat_drops: 🎶 :notes: 🎵 :musical_note:
🔥 :fire: 💩 :hankey: 💩 :poop:
💩 :shit: 👍 :+1: 👍 :thumbsup:
👎 :-1: 👎 :thumbsdown: 👌 :ok_hand:
👊 :punch: 👊 :facepunch: :fist:
✌️ :v: 👋 :wave: :hand:
:raised_hand: 👐 :open_hands: ☝️ :point_up:
👇 :point_down: 👈 :point_left: 👉 :point_right:
🙌 :raised_hands: 🙏 :pray: 👆 :point_up_2:
👏 :clap: 💪 :muscle: 🤘 :metal:
🖕 :fu: 🚶 :walking: 🏃 :runner:
🏃 :running: 👫 :couple: 👪 :family:
👬 :two_men_holding_hands: 👭 :two_women_holding_hands: 💃 :dancer:
👯 :dancers: 🙆 :ok_woman: 🙅 :no_good:
💁 :information_desk_person: 🙋 :raising_hand: 👰 :bride_with_veil:
🙎 :person_with_pouting_face: 🙍 :person_frowning: 🙇 :bow:
💏 :couplekiss: 💑 :couple_with_heart: 💆 :massage:
💇 :haircut: 💅 :nail_care: 👦 :boy:
👧 :girl: 👩 :woman: 👨 :man:
👶 :baby: 👵 :older_woman: 👴 :older_man:
👱 :person_with_blond_hair: 👲 :man_with_gua_pi_mao: 👳 :man_with_turban:
👷 :construction_worker: 👮 :cop: 👼 :angel:
👸 :princess: 😺 :smiley_cat: 😸 :smile_cat:
😻 :heart_eyes_cat: 😽 :kissing_cat: 😼 :smirk_cat:
🙀 :scream_cat: 😿 :crying_cat_face: 😹 :joy_cat:
😾 :pouting_cat: 👹 :japanese_ogre: 👺 :japanese_goblin:
🙈 :see_no_evil: 🙉 :hear_no_evil: 🙊 :speak_no_evil:
💂 :guardsman: 💀 :skull: 🐾 :feet:
👄 :lips: 💋 :kiss: 💧 :droplet:
👂 :ear: 👀 :eyes: 👃 :nose:
👅 :tongue: 💌 :love_letter: 👤 :bust_in_silhouette:
👥 :busts_in_silhouette: 💬 :speech_balloon: 💭 :thought_balloon:

显示详细信息

Nature

☀️ :sunny: ☔️ :umbrella: ☁️ :cloud:
❄️ :snowflake: ⛄️ :snowman: ⚡️ :zap:
🌀 :cyclone: 🌁 :foggy: 🌊 :ocean:
🐱 :cat: 🐶 :dog: 🐭 :mouse:
🐹 :hamster: 🐰 :rabbit: 🐺 :wolf:
🐸 :frog: 🐯 :tiger: 🐨 :koala:
🐻 :bear: 🐷 :pig: 🐽 :pig_nose:
🐮 :cow: 🐗 :boar: 🐵 :monkey_face:
🐒 :monkey: 🐴 :horse: 🐎 :racehorse:
🐫 :camel: 🐑 :sheep: 🐘 :elephant:
🐼 :panda_face: 🐍 :snake: 🐦 :bird:
🐤 :baby_chick: 🐥 :hatched_chick: 🐣 :hatching_chick:
🐔 :chicken: 🐧 :penguin: 🐢 :turtle:
🐛 :bug: 🐝 :honeybee: 🐜 :ant:
🐞 :beetle: 🐌 :snail: 🐙 :octopus:
🐠 :tropical_fish: 🐟 :fish: 🐳 :whale:
🐋 :whale2: 🐬 :dolphin: 🐄 :cow2:
🐏 :ram: 🐀 :rat: 🐃 :water_buffalo:
🐅 :tiger2: 🐇 :rabbit2: 🐉 :dragon:
🐐 :goat: 🐓 :rooster: 🐕 :dog2:
🐖 :pig2: 🐁 :mouse2: 🐂 :ox:
🐲 :dragon_face: 🐡 :blowfish: 🐊 :crocodile:
🐪 :dromedary_camel: 🐆 :leopard: 🐈 :cat2:
🐩 :poodle: 🐾 :paw_prints: 💐 :bouquet:
🌸 :cherry_blossom: 🌷 :tulip: 🍀 :four_leaf_clover:
🌹 :rose: 🌻 :sunflower: 🌺 :hibiscus:
🍁 :maple_leaf: 🍃 :leaves: 🍂 :fallen_leaf:
🌿 :herb: 🍄 :mushroom: 🌵 :cactus:
🌴 :palm_tree: 🌲 :evergreen_tree: 🌳 :deciduous_tree:
🌰 :chestnut: 🌱 :seedling: 🌼 :blossom:
🌾 :ear_of_rice: 🐚 :shell: 🌐 :globe_with_meridians:
🌞 :sun_with_face: 🌝 :full_moon_with_face: 🌚 :new_moon_with_face:
🌑 :new_moon: 🌒 :waxing_crescent_moon: 🌓 :first_quarter_moon:
🌔 :waxing_gibbous_moon: 🌕 :full_moon: 🌖 :waning_gibbous_moon:
🌗 :last_quarter_moon: 🌘 :waning_crescent_moon: 🌜 :last_quarter_moon_with_face:
🌛 :first_quarter_moon_with_face: 🌔 :moon: 🌍 :earth_africa:
🌎 :earth_americas: 🌏 :earth_asia: 🌋 :volcano:
🌌 :milky_way: ⛅️ :partly_sunny:

显示详细信息

Objects

🎍 :bamboo: 💝 :gift_heart: 🎎 :dolls:
🎒 :school_satchel: 🎓 :mortar_board: 🎏 :flags:
🎆 :fireworks: 🎇 :sparkler: 🎐 :wind_chime:
🎑 :rice_scene: 🎃 :jack_o_lantern: 👻 :ghost:
🎅 :santa: 🎄 :christmas_tree: 🎁 :gift:
🔔 :bell: 🔕 :no_bell: 🎋 :tanabata_tree:
🎉 :tada: 🎊 :confetti_ball: 🎈 :balloon:
🔮 :crystal_ball: 💿 :cd: 📀 :dvd:
💾 :floppy_disk: 📷 :camera: 📹 :video_camera:
🎥 :movie_camera: 💻 :computer: 📺 :tv:
📱 :iphone: ☎️ :phone: ☎️ :telephone:
📞 :telephone_receiver: 📟 :pager: 📠 :fax:
💽 :minidisc: 📼 :vhs: 🔉 :sound:
🔈 :speaker: 🔇 :mute: 📢 :loudspeaker:
📣 :mega: ⌛️ :hourglass: :hourglass_flowing_sand:
:alarm_clock: ⌚️ :watch: 📻 :radio:
📡 :satellite: :loop: 🔍 :mag:
🔎 :mag_right: 🔓 :unlock: 🔒 :lock:
🔏 :lock_with_ink_pen: 🔐 :closed_lock_with_key: 🔑 :key:
💡 :bulb: 🔦 :flashlight: 🔆 :high_brightness:
🔅 :low_brightness: 🔌 :electric_plug: 🔋 :battery:
📲 :calling: ✉️ :email: 📫 :mailbox:
📮 :postbox: 🛀 :bath: 🛁 :bathtub:
🚿 :shower: 🚽 :toilet: 🔧 :wrench:
🔩 :nut_and_bolt: 🔨 :hammer: 💺 :seat:
💰 :moneybag: 💴 :yen: 💵 :dollar:
💷 :pound: 💶 :euro: 💳 :credit_card:
💸 :money_with_wings: 📧 :e-mail: 📥 :inbox_tray:
📤 :outbox_tray: ✉️ :envelope: 📨 :incoming_envelope:
📯 :postal_horn: 📪 :mailbox_closed: 📬 :mailbox_with_mail:
📭 :mailbox_with_no_mail: 🚪 :door: 🚬 :smoking:
💣 :bomb: 🔫 :gun: 🔪 :hocho:
💊 :pill: 💉 :syringe: 📄 :page_facing_up:
📃 :page_with_curl: 📑 :bookmark_tabs: 📊 :bar_chart:
📈 :chart_with_upwards_trend: 📉 :chart_with_downwards_trend: 📜 :scroll:
📋 :clipboard: 📆 :calendar: 📅 :date:
📇 :card_index: 📁 :file_folder: 📂 :open_file_folder:
✂️ :scissors: 📌 :pushpin: 📎 :paperclip:
✒️ :black_nib: ✏️ :pencil2: 📏 :straight_ruler:
📐 :triangular_ruler: 📕 :closed_book: 📗 :green_book:
📘 :blue_book: 📙 :orange_book: 📓 :notebook:
📔 :notebook_with_decorative_cover: 📒 :ledger: 📚 :books:
🔖 :bookmark: 📛 :name_badge: 🔬 :microscope:
🔭 :telescope: 📰 :newspaper: 🏈 :football:
🏀 :basketball: ⚽️ :soccer: ⚾️ :baseball:
🎾 :tennis: 🎱 :8ball: 🏉 :rugby_football:
🎳 :bowling: ⛳️ :golf: 🚵 :mountain_bicyclist:
🚴 :bicyclist: 🏇 :horse_racing: 🏂 :snowboarder:
🏊 :swimmer: 🏄 :surfer: 🎿 :ski:
♠️ :spades: ♥️ :hearts: ♣️ :clubs:
♦️ :diamonds: 💎 :gem: 💍 :ring:
🏆 :trophy: 🎼 :musical_score: 🎹 :musical_keyboard:
🎻 :violin: 👾 :space_invader: 🎮 :video_game:
🃏 :black_joker: 🎴 :flower_playing_cards: 🎲 :game_die:
🎯 :dart: 🀄️ :mahjong: 🎬 :clapper:
📝 :memo: 📝 :pencil: 📖 :book:
🎨 :art: 🎤 :microphone: 🎧 :headphones:
🎺 :trumpet: 🎷 :saxophone: 🎸 :guitar:
👞 :shoe: 👡 :sandal: 👠 :high_heel:
💄 :lipstick: 👢 :boot: 👕 :shirt:
👕 :tshirt: 👔 :necktie: 👚 :womans_clothes:
👗 :dress: 🎽 :running_shirt_with_sash: 👖 :jeans:
👘 :kimono: 👙 :bikini: 🎀 :ribbon:
🎩 :tophat: 👑 :crown: 👒 :womans_hat:
👞 :mans_shoe: 🌂 :closed_umbrella: 💼 :briefcase:
👜 :handbag: 👝 :pouch: 👛 :purse:
👓 :eyeglasses: 🎣 :fishing_pole_and_fish: ☕️ :coffee:
🍵 :tea: 🍶 :sake: 🍼 :baby_bottle:
🍺 :beer: 🍻 :beers: 🍸 :cocktail:
🍹 :tropical_drink: 🍷 :wine_glass: 🍴 :fork_and_knife:
🍕 :pizza: 🍔 :hamburger: 🍟 :fries:
🍗 :poultry_leg: 🍖 :meat_on_bone: 🍝 :spaghetti:
🍛 :curry: 🍤 :fried_shrimp: 🍱 :bento:
🍣 :sushi: 🍥 :fish_cake: 🍙 :rice_ball:
🍘 :rice_cracker: 🍚 :rice: 🍜 :ramen:
🍲 :stew: 🍢 :oden: 🍡 :dango:
🥚 :egg: 🍞 :bread: 🍩 :doughnut:
🍮 :custard: 🍦 :icecream: 🍨 :ice_cream:
🍧 :shaved_ice: 🎂 :birthday: 🍰 :cake:
🍪 :cookie: 🍫 :chocolate_bar: 🍬 :candy:
🍭 :lollipop: 🍯 :honey_pot: 🍎 :apple:
🍏 :green_apple: 🍊 :tangerine: 🍋 :lemon:
🍒 :cherries: 🍇 :grapes: 🍉 :watermelon:
🍓 :strawberry: 🍑 :peach: 🍈 :melon:
🍌 :banana: 🍐 :pear: 🍍 :pineapple:
🍠 :sweet_potato: 🍆 :eggplant: 🍅 :tomato:
🌽 :corn:

显示详细信息

Places

🏠 :house: 🏡 :house_with_garden: 🏫 :school:
🏢 :office: 🏣 :post_office: 🏥 :hospital:
🏦 :bank: 🏪 :convenience_store: 🏩 :love_hotel:
🏨 :hotel: 💒 :wedding: ⛪️ :church:
🏬 :department_store: 🏤 :european_post_office: 🌇 :city_sunrise:
🌆 :city_sunset: 🏯 :japanese_castle: 🏰 :european_castle:
⛺️ :tent: 🏭 :factory: 🗼 :tokyo_tower:
🗾 :japan: 🗻 :mount_fuji: 🌄 :sunrise_over_mountains:
🌅 :sunrise: 🌠 :stars: 🗽 :statue_of_liberty:
🌉 :bridge_at_night: 🎠 :carousel_horse: 🌈 :rainbow:
🎡 :ferris_wheel: ⛲️ :fountain: 🎢 :roller_coaster:
🚢 :ship: 🚤 :speedboat: ⛵️ :boat:
⛵️ :sailboat: 🚣 :rowboat: ⚓️ :anchor:
🚀 :rocket: ✈️ :airplane: 🚁 :helicopter:
🚂 :steam_locomotive: 🚊 :tram: 🚞 :mountain_railway:
🚲 :bike: 🚡 :aerial_tramway: 🚟 :suspension_railway:
🚠 :mountain_cableway: 🚜 :tractor: 🚙 :blue_car:
🚘 :oncoming_automobile: 🚗 :car: 🚗 :red_car:
🚕 :taxi: 🚖 :oncoming_taxi: 🚛 :articulated_lorry:
🚌 :bus: 🚍 :oncoming_bus: 🚨 :rotating_light:
🚓 :police_car: 🚔 :oncoming_police_car: 🚒 :fire_engine:
🚑 :ambulance: 🚐 :minibus: 🚚 :truck:
🚋 :train: 🚉 :station: 🚆 :train2:
🚅 :bullettrain_front: 🚄 :bullettrain_side: 🚈 :light_rail:
🚝 :monorail: 🚃 :railway_car: 🚎 :trolleybus:
🎫 :ticket: ⛽️ :fuelpump: 🚦 :vertical_traffic_light:
🚥 :traffic_light: ⚠️ :warning: 🚧 :construction:
🔰 :beginner: 🏧 :atm: 🎰 :slot_machine:
🚏 :busstop: 💈 :barber: ♨️ :hotsprings:
🏁 :checkered_flag: 🎌 :crossed_flags: 🏮 :izakaya_lantern:
🗿 :moyai: 🎪 :circus_tent: 🎭 :performing_arts:
📍 :round_pushpin: 🚩 :triangular_flag_on_post: 🇯🇵 :jp:
🇰🇷 :kr: 🇨🇳 :cn: 🇺🇸 :us:
🇫🇷 :fr: 🇪🇸 :es: 🇮🇹 :it:
🇷🇺 :ru: 🇬🇧 :gb: 🇬🇧 :uk:
🇩🇪 :de:

显示详细信息

Symbols

1️⃣ :one: 2️⃣ :two: 3️⃣ :three:
4️⃣ :four: 5️⃣ :five: 6️⃣ :six:
7️⃣ :seven: 8️⃣ :eight: 9️⃣ :nine:
🔟 :keycap_ten: 🔢 :1234: 0️⃣ :zero:
#️⃣ :hash: 🔣 :symbols: ◀️ :arrow_backward:
⬇️ :arrow_down: ▶️ :arrow_forward: ⬅️ :arrow_left:
🔠 :capital_abcd: 🔡 :abcd: 🔤 :abc:
↙️ :arrow_lower_left: ↘️ :arrow_lower_right: ➡️ :arrow_right:
⬆️ :arrow_up: ↖️ :arrow_upper_left: ↗️ :arrow_upper_right:
:arrow_double_down: :arrow_double_up: 🔽 :arrow_down_small:
⤵️ :arrow_heading_down: ⤴️ :arrow_heading_up: ↩️:leftwards_arrow_with_hook:
↪️ :arrow_right_hook: ↔️ :left_right_arrow: ↕️ :arrow_up_down:
🔼 :arrow_up_small: 🔃 :arrows_clockwise: 🔄 :arrows_counterclockwise:
:rewind: :fast_forward: ℹ️ :information_source:
🆗 :ok: 🔀 :twisted_rightwards_arrows: 🔁 :repeat:
🔂 :repeat_one: 🆕 :new: 🔝 :top:
🆙 :up: 🆒 :cool: 🆓 :free:
🆖 :ng: 🎦 :cinema: 🈁 :koko:
📶 :signal_strength: 🈹 :u5272: 🈴 :u5408:
🈺 :u55b6: 🈯️ :u6307: 🈷️ :u6708:
🈶 :u6709: 🈵 :u6e80: 🈚️ :u7121:
🈸 :u7533: 🈳 :u7a7a: 🈲 :u7981:
🈂️ :sa: 🚻 :restroom: 🚹 :mens:
🚺 :womens: 🚼 :baby_symbol: 🚭 :no_smoking:
🅿️ :parking: ♿️ :wheelchair: 🚇 :metro:
🛄 :baggage_claim: 🉑 :accept: 🚾 :wc:
🚰 :potable_water: 🚮 :put_litter_in_its_place: ㊙️ :secret:
㊗️ :congratulations: Ⓜ️ :m: 🛂 :passport_control:
🛅 :left_luggage: 🛃 :customs: 🉐 :ideograph_advantage:
🆑 :cl: 🆘 :sos: 🆔 :id:
🚫 :no_entry_sign: 🔞 :underage: 📵 :no_mobile_phones:
🚯 :do_not_litter: 🚱 :non-potable_water: 🚳 :no_bicycles:
🚷 :no_pedestrians: 🚸 :children_crossing: ⛔️ :no_entry:
✳️ :eight_spoked_asterisk: ✴️ :eight_pointed_black_star: 💟 :heart_decoration:
🆚 :vs: 📳 :vibration_mode: 📴 :mobile_phone_off:
💹 :chart: 💱 :currency_exchange: ♈️ :aries:
♉️ :taurus: ♊️ :gemini: ♋️ :cancer:
♌️ :leo: ♍️ :virgo: ♎️ :libra:
♏️ :scorpius: ♐️ :sagittarius: ♑️ :capricorn:
♒️ :aquarius: ♓️ :pisces: :ophiuchus:
🔯 :six_pointed_star: :negative_squared_cross_mark: 🅰️ :a:
🅱️ :b: 🆎 :ab: 🅾️ :o2:
💠:diamond_shape_with_a_dot_inside: ♻️ :recycle: 🔚 :end:
🔛 :on: 🔜 :soon: 🕐 :clock1:
🕜 :clock130: 🕙 :clock10: 🕥 :clock1030:
🕚 :clock11: 🕦 :clock1130: 🕛 :clock12:
🕧 :clock1230: 🕑 :clock2: 🕝 :clock230:
🕒 :clock3: 🕞 :clock330: 🕓 :clock4:
🕟 :clock430: 🕔 :clock5: 🕠 :clock530:
🕕 :clock6: 🕡 :clock630: 🕖 :clock7:
🕢 :clock730: 🕗 :clock8: 🕣 :clock830:
🕘 :clock9: 🕤 :clock930: 💲 :heavy_dollar_sign:
©️ :copyright: ®️ :registered: ™️ :tm:
:x: ❗️ :heavy_exclamation_mark: ‼️ :bangbang:
⁉️ :interrobang: ⭕️ :o: ✖️ :heavy_multiplication_x:
:heavy_plus_sign: :heavy_minus_sign: :heavy_division_sign:
💮 :white_flower: 💯 :100: ✔️ :heavy_check_mark:
☑️ :ballot_box_with_check: 🔘 :radio_button: 🔗 :link:
:curly_loop: 〰️ :wavy_dash: 〽️ :part_alternation_mark:
🔱 :trident: :black_square: :black_square: :white_square: :white_square:
:white_check_mark: 🔲 :black_square_button: 🔳 :white_square_button:
⚫️ :black_circle: ⚪️ :white_circle: 🔴 :red_circle:
🔵 :large_blue_circle: 🔷 :large_blue_diamond: 🔶 :large_orange_diamond:
🔹 :small_blue_diamond: 🔸 :small_orange_diamond: 🔺 :small_red_triangle:
🔻 :small_red_triangle_down:

显示详细信息

前端样式配置 style # issue 标题模板 默认: 前端样式配置 style

1
&lt;span class=&quot;fas faa-ring animated-hover&quot; style=&quot;border-bottom:3px solid green&quot;&gt;《半小时漫画**哲学史》&lt;/span&gt;
2
&lt;span  style=&quot;text-align:center;font-size:20px;font:30px 书体坊兰亭体;color:blueviolent;word-spacing:30px;&quot;&gt;“ 既许一人以偏爱,愿尽余生之慷慨 ”&lt;/span&gt;
3
&lt;span style=&quot;class: faa-bounce animated-hover;border-bottom: 5px solid #8F81EF;&quot;&gt;[data.json文件链接](https://pan.baidu.com/s/1omzU65YMpJr0jPPFItZ7SA )&lt;/span&gt;
 4  
&lt;mark style=&quot;background:royalBlue;border-bottom:lightblue 2px solid;color:white;font-family:consolas&quot;&gt;当使用重做日志文件来进行数据库恢复时,ORACLE将读取其中的重做记录(包括其中的修改向量),并且将这些修改用于相关的块中。&lt;/mark&gt;
5
&lt;span style=&quot;background: PaleVioletRed;border-radius:10px;padding:1px 5px;color:white;font-weight:900&quot;&gt;存储结构管理主要就是通过对表空间的管理来实现的&lt;/span&gt;
6
&lt;mark style=&quot;background:green;border-radius:10px;color:white&quot;&gt;效果如下:&lt;/mark&gt;
7
&lt;font size=10px style=&quot;font-weight:700;font-family:&#39;华文彩云&#39;;color:rgb(100,190,100)&quot;&gt;基本语言(一)&lt;/font&gt;
8
&lt;span style=&quot;border-bottom: 2px dashed #000000&quot;&gt;代码段、数据段、BSS段、堆区、文件映射区以及栈区&lt;/span&gt;
9
&lt;div style=&quot;background:black;font:conloas;color:white;&quot;&gt;
 数组长度为:3&lt;br&gt;
 请按任意键继续. . .
&lt;/div&gt;
10
&lt;mark style=&quot;color:white;background:red;font-weight:600;border_radius:100px&quot;&gt;但效率更高&lt;/mark&gt;

1

<span class="fas faa-ring animated-hover" style="border-bottom:3px solid green">《半小时漫画**哲学史》</span>

2

<span style="text-align:center;font-size:20px;font:30px 书体坊兰亭体;color:blueviolent;word-spacing:30px;">“ 既许一人以偏爱,愿尽余生之慷慨 ”</span>

3

<span style="class: faa-bounce animated-hover;border-bottom: 5px solid #8F81EF;">data.json文件链接</span>

4

<mark style="background:royalBlue;border-bottom:lightblue 2px solid;color:white;font-family:consolas">当使用重做日志文件来进行数据库恢复时,ORACLE将读取其中的重做记录(包括其中的修改向量),并且将这些修改用于相关的块中。</mark>

5

<span style="background: PaleVioletRed;border-radius:10px;padding:1px 5px;color:white;font-weight:900">存储结构管理主要就是通过对表空间的管理来实现的</span>

6

<mark style="background:green;border-radius:10px;color:white">效果如下:</mark>

7

<font size=10px style="font-weight:700;font-family:'华文彩云';color:rgb(100,190,100)">基本语言(一)</font>

8

<span style="border-bottom: 2px dashed #000000">代码段、数据段、BSS段、堆区、文件映射区以及栈区</span>

9

<div style="background:black;font:conloas;color:white;"> 数组长度为:3<br> 请按任意键继续. . .</div>

10

<mark style="color:white;background:red;font-weight:600;border_radius:100px">但效率更高</mark>

编程常用英语词汇 # issue 标题模板 默认: 编程常用英语词汇

编程常用英语整理

一、交互式环境与print输出

1、print:打印/输出
2、coding:编码
3、syntax:语法
4、error:错误
5、invalid:无效
6、identifier:名称/标识符
7、character :字符

二、字符串的操作

1、user:用户
2、name:姓名/名称
3、attribute:字段/属性
4、value:值

三、重复/转换/替换/原始字符串

1、upper:上面
2、lower:下面
3、capitalize:用大写字母写或印刷
4、title:标题
5、replace:替换
6、old:旧的
7、new:新的
8、count:计数
9、swap:互换
10、case:情形
11、path:路径
12、new:新的\新建
13、project:项目
14、test:测试
15、file:文件
16、data:数据

四、去除/查询/计数

1、strip:去除
2、index:索引
3、find:查找
4、count:计数
5、start:开始
6、end:结束
7、chars:字符
8、sub:附属

五、获取输入/格式化

1、input:输入
2、prompt:提示
3、ID:身份证
4、format:格式化
5、args(argument):参数
6、kwargs:关键字参数
7、year:年
8、month:月
9、day:日

六、元祖

1、tuple:元组
2、max:最大
3、min:最小
4、iterable:可迭代
5、key:关键字
6、function:方法/函数
7、stop:停止
8、object:对象

七、列表

1、list:列表
2、reverse:反向
3、true:真
4、false:假
5、append:附加
6、extend:扩展
7、insert:插入
8、pop:取出
9、remove:移除
10、del(delete):删除
11、clear:清除
12、sort:排序

八、集合

1、set:集合/设置
2、add:添加
3、update:更新
4、discard:丢弃
5、intersection:相交
6、union:联合
7、difference:差数
8、symmetric:对称
9、in:在…里面
10、not:不/不是
11、disjoint:不相交
12、subset:子集
13、superset:父集/超集
14、copy:复制

九、字典

1、dict:字典
2、key:键/关键字
3、value:值
4、item:项
5、mapping:映射
6、seq(sequence):序列
7、from:从/来自
8、get:获取
9、default:默认
10、none:没有
11、arg:可变元素
12、kwargs(keyword args):可变关键字元素

十、常用的一些必备的英语单词

  • Projects :项目
  • Process finished with exit code 0 进程结束,退出代码为0,一般是执行成功的过程
  • Process: 过程
  • code :代码
  • Traceback:回溯
  • File:文件
  • line:行
  • module:模块['mɑdʒul]
  • NameError:名称错误
  • is not defined:没有定义
  • SyntaxError:语法错误
  • literal:文字,文字的
  • string:字符串
  • scanning:扫描
  • EOL :寿命终止
  • IndentationError:缩减错误
  • unindent:取消缩进
  • match:匹配
  • indentation:缩进 [,ɪndɛn'teʃən]缩进
  • unindent does not match any outer indentation level: 未缩进不匹配任何外部缩进级别
  • invalid syntax:无效的语法

十一、扇贝

扇贝上有专门整理好的pyhon常用单词,但是要支付199贝壳。

我写了个爬虫,免199贝壳去支付...拿下网页的单词,下面是代码:

import requests

import re

file = open(&quot;vocabulary.doc&quot;, &quot;w&quot;, encoding=&quot;utf-8&quot;)

def spider(url):

    res = requests.get(url).text

    pattern = &#39;&lt;strong&gt;([a-z,A-Z]*?)&lt;/strong&gt;\s*&lt;/td&gt;\s*&lt;td class=&quot;span10&quot;&gt;(.*?)&lt;/td&gt;&#39;

    vocabulary_list = re.findall(pattern, res)

    for vocabulary in vocabulary_list:

 file.writelines((vocabulary[0].strip(&#39;&#39;), vocabulary[1].strip(&#39;&#39;), &quot;\n&quot;))

url_list = [&quot;[词串list 1](https://www.shanbay.com/wordlist/104899/202159/?page=)&quot;,

     &quot;[词串list 2](https://www.shanbay.com/wordlist/104899/202162/?page=)&quot;,

     ]

for url in url_list:

    for i in range(1, 10):

 url = &quot;[词串list 1](https://www.shanbay.com/wordlist/104899/202159/?page=)&quot; + str(i)

 spider(url)

file.close()

会生成一个word的结果文档在代码运行的同一目录下,结果如下,没有可以排版,最好是放在excel下。

十二、程序员常用单词600个

A

application 应用程式 应用、应用程序
application framework 应用程式框架、应用框架 应用程序框架
architecture 架构、系统架构 体系结构
argument 引数(传给函式的值)。叁见 parameter 叁数、实质叁数、实叁、自变量
array 阵列 数组
arrow operator arrow (箭头)运算子 箭头操作符
assembly 装配件
assembly language 组合语言 汇编语言
assert (ion) 断言
assign 指派、指定、设值、赋值 赋值
assignment 指派、指定 赋值、分配
assignment operator 指派(赋值)运算子 = 赋值操作符
associated 相应的、相关的 相关的、关联、相应的
associative container 关联式容器(对应 sequential container) 关联式容器
atomic 不可分割的 原子的
attribute 属性 属性、特性
audio 音讯 音频
A.I. 人工智慧 人工智能

B

background 背景 背景(用於图形着色) 后台(用於行程)
backward compatible 回溯相容 向下兼容
bandwidth 频宽 带宽
base class 基础类别 基类
base type 基础型别 (等同於 base class)
batch 批次(意思是整批作业) 批处理
benefit 利益 收益
best viable function 最佳可行函式 最佳可行函式 (从 viable functions 中挑出的最佳吻合者)
binary search 二分搜寻法 二分查找
binary tree 二元树 二叉树
binary function 二元函式 双叁函数
binary operator 二元运算子 二元操作符
binding 系结 绑定
bit 位元 位
bit field 位元栏 位域
bitmap 位元图 位图
bitwise 以 bit 为单元逐一┅
bitwise copy 以 bit 为单元进行复制;位元逐一复制 位拷贝
block 区块,区段 块、区块、语句块
boolean 布林值(真假值,true 或 false) 布尔值
border 边框、框线 边框
brace (curly brace) 大括弧、大括号 花括弧、花括号
bracket (square brakcet) 中括弧、中括号 方括弧、方括号
breakpoint 中断点 断点
build 建造、构筑、建置(MS 用语)
build-in 内建 内置
bus 汇流排 总线
business 商务,业务 业务
buttons 按钮 按钮
byte 位元组(由 8 bits 组成) 字节

C

cache 快取 高速缓存
call 呼叫、叫用 调用
callback 回呼 回调
call operator call (函式呼叫)运算子调用操作符 (同 function call operator)
candidate function 候选函式 候选函数 (在函式多载决议程序中出现的候选函式)
chain 串链(例 chain of function calls) 链
character 字元 字符
check box 核取方块 (i.e. check button) 复选框
checked exception 可控式异常(Java)
check button 方钮 (i.e. check box) 复选按钮
child class 子类别(或称为derived class, subtype) 子类
class 类别 类
class body 类别本体 类体
class declaration 类别宣告、类别宣告式 类声明
class definition 类别定义、类别定义式 类定义
class derivation list 类别衍化列 类继承列表
class head 类别表头 类头
class hierarchy 类别继承体系, 类别阶层 类层次体系
class library 类别程式库、类别库 类库
class template 类别模板、类别范本 类模板
class template partial specializations 类别模板偏特化 类模板部分特化
class template specializations 类别模板特化 类模板特化
cleanup 清理、善后 清理、清除
client 客端、客户端、客户 客户
client-server 主从架构 客户/服务器
clipboard 剪贴簿 剪贴板
clone 复制 克隆
collection 群集 集合
combo box 复合方块、复合框 组合框
command line 命令列 命令行 (系统文字模式下的整行执行命令)
communication 通讯 通讯
compatible 相容 兼容
compile time 编译期 编译期、编译时
compiler 编译器 编译器
component 组件 组件
composition 复合、合成、组合 组合
computer 电脑、计算机 计算机、电脑
concept 概念 概念
concrete 具象的 实在的
concurrent 并行 并发
configuration 组态 配置
connection 连接,连线(网络,资料库) 连接
constraint 约束(条件)
construct 构件 构件
container 容器 容器(存放资料的某种结构如 list, vector…)
containment 内含 包容
context 背景关系、周遭环境、上下脉络 环境、上下文
control 控制元件、控件 控件
console 主控台 控制台
const 常数(constant 的缩写,C++ 关键字)
constant 常数(相对於 variable) 常量
constructor (ctor) 建构式 构造函数 (与class 同名的一种 member functions)
copy (v) 复制、拷贝 拷贝
copy (n) 复件, 副本
cover 涵盖 覆盖
create 创建、建立、产生、生成 创建
creation 产生、生成 创建
cursor 游标 光标
custom 订制、自定 定制

D

data 资料 数据
database 资料库 数据库
database schema 数据库结构纲目
data member 资料成员、成员变数 数据成员、成员变量
data structure 资料结构 数据结构
datagram 资料元 数据报文
dead lock 死结 死锁
debug 除错 调试
debugger 除错器 调试器
declaration 宣告、宣告式 声明
deduction 推导(例:template argument deduction) 推导、推断
default 预设 缺省、默认
defer 延缓 推迟
define 定义 预定义
definition 定义、定义区、定义式 定义
delegate 委派、委托、委任 委托
delegation (同上)
demarshal 反编列 散集
dereference 提领(取出指标所指物体的内容) 解叁考
dereference operator dereference (提领)运算子 * 解叁考操作符
derived class 衍生类别 派生类
design by contract 契约式设计
design pattern 设计范式、设计样式 设计模式 ※ 最近我比较喜欢「设计范式」一词
destroy 摧毁、销毁
destructor 解构式 析构函数
device 装置、设备 设备
dialog 对话窗、对话盒 对话框
directive 指令(例:using directive) (编译)指示符
directory 目录 目录
disk 碟 盘
dispatch 分派 分派
distributed computing 分布式计算 (分布式电算) 分布式计算 分散式计算 (分散式电算)
document 文件 文档
dot operator dot (句点)运算子 . (圆)点操作符
driver 驱动程式 驱动(程序)
dynamic binding 动态系结 动态绑定

E

efficiency 效率 效率
efficient 高效 高效
end user 终端用户
entity 物体 实体、物体
encapsulation 封装 封装
enclosing class 外围类别(与巢状类别 nested class 有关)外围类
enum (enumeration) 列举(一种 C++ 资料型别) 枚举
enumerators 列举元(enum 型别中的成员) 枚举成员、枚举器
equal 相等 相等
equality 相等性 相等性
equality operator equality (等号)运算子 == 等号操作符
equivalence 等价性、等同性、对等性 等价性
equivalent 等价、等同、对等 等价
escape code 转义码 转义码
evaluate 评估、求值、核定 评估
event 事件 事件
event driven 事件驱动的 事件驱动的
exception 异常情况 异常
exception declaration 异常宣告(ref. C++ Primer 3/e, 11.3) 异常声明
exception handling 异常处理、异常处理机制 异常处理、异常处理机制
exception specification 异常规格(ref. C++ Primer 3/e, 11.4) 异常规范
exit 退离(指离开函式时的那一个执行点) 退出
explicit 明白的、明显的、显式 显式
export 汇出 引出、导出
expression 运算式、算式 表达式

F

facility 设施、设备 设施、设备
feature 特性
field 栏位,资料栏(Java) 字段, 值域(Java)
file 档案 文件
firmware 韧体 固件
flag 旗标 标记
flash memory 快闪记忆体 闪存
flexibility 弹性 灵活性
flush 清理、扫清 刷新
font 字型 字体
form 表单(programming 用语) 窗体
formal parameter 形式叁数 形式叁数
forward declaration 前置宣告 前置声明
forwarding 转呼叫,转发 转发
forwarding function 转呼叫函式,转发函式 转发函数
fractal 碎形 分形
framework 框架 框架
full specialization 全特化(ref. partial specialization)
function 函式、函数 函数
function call operator 同 call operator
function object 函式物件(ref. C++ Primer 3/e, 12.3) 函数对象
function overloaded resolution 函式多载决议程序 函数重载解决(方案)
functionality 功能、机能 功能
function template 函式模板、函式范本 函数模板
functor 仿函式 仿函式、函子

G

game 游戏 游戏
generate 生成
generic 泛型、一般化的 一般化的、通用的、泛化
generic algorithm 泛型演算法 通用算法
getter (相对於 setter) 取值函式
global 全域的(对应於 local) 全局的
global object 全域物件 全局对象
global scope resolution operator 全域生存空间(范围决议)运算子 :: 全局范围解析操作符
group 群组
group box 群组方块 分组框
guard clause 卫述句 (Refactoring, p250) 卫语句
GUI 图形介面 图形界面

H

hand shaking 握手协商
handle 识别码、识别号、号码牌、权柄 句柄
handler 处理常式 处理函数
hard-coded 编死的 硬编码的
hard-copy 硬拷图 屏幕截图
hard disk 硬碟 硬盘
hardware 硬体 硬件
hash table 杂凑表 哈希表、散列表
header file 表头档、标头档 头文件
heap 堆积 堆
hierarchy 阶层体系 层次结构(体系)
hook 挂钩 钩子
hyperlink 超链结 超链接

I

icon 图示、图标 图标
IDE 整合开发环境 集成开发环境
identifier 识别字、识别符号 标识符
if and only if 若且唯若 当且仅当
Illinois 伊利诺 伊利诺斯
image 影像 图象
immediate base 直接的(紧临的)上层 base class。 直接上层基类
immediate derived 直接的(紧临的)下层 derived class。 直接下层派生类
immutability 不变性
immutable 不可变(的)
implement 实作、实现 实现
implementation 实作品、实作体、实作码、实件 实现
implicit 隐喻的、暗自的、隐式 隐式
import 汇入 导入
increment operator 累加运算子 ++ 增加操作符
infinite loop 无穷回圈 无限循环
infinite recursive 无穷递回 无限递归
information 资讯 信息
infrastructure 公共基础建设
inheritance 继承、继承机制 继承、继承机制
inline 行内 内联
inline expansion 行内展开 内联展开
initialization 初始化(动作) 初始化
initialization list 初值列 初始值列表
initialize 初始化 初始化
inner class 内隐类别 内嵌类
instance 实体 实例 (根据某种表述而实际产生的「东西」)
instantiated 具现化、实体化(常应用於 template) 实例化
instantiation 具现体、具现化实体(常应用於 template) 实例
integer (integral) 整数(的) 整型(的)
integrate 整合 集成
interacts 交谈、互动 交互
interface 介面 接口
for GUI 介面 界面
interpreter 直译器 解释器
invariants 恒常性,约束条件 约束条件
invoke 唤起 调用
iterate 迭代(回圈一个轮回一个轮回地进行) 迭代
iterative 反覆的,迭代的
iterator 迭代器(一种泛型指标) 迭代器
iteration 迭代(回圈每次轮回称为一个 iteration) 迭代
item 项目、条款 项、条款、项目

L

laser 雷射 激光
level 阶 层 (级) 例 high level 高阶 高层
library 程式库、函式库 库、函数库
lifetime 生命期、寿命 生命期、寿命
link 联结、连结 连接,链接
linker 联结器、连结器 连接器
literal constant 字面常数(例 3.14 或 “hi” 这等常数值) 字面常数
list 串列(linked-list) 列表、表、链表
list box 列表方块、列表框 列表框
load 载入 装载
loader 载入器 装载器、载入器
local 区域的(对应於 global) 局部的
local object 区域物件 局部对象
lock 机锁
loop 回圈 循环
lvalue 左值 左值

M

macro 巨集 宏
magic number 魔术数字 魔法数
maintain 维护 维护
manipulator 操纵器(iostream 预先定义的一种东西) 操纵器
marshal 编列 列集 叁考 demarshal
mechanism 机制 机制
member 成员 成员
member access operator 成员取用运算子(有 dot 和 arrow 两种) 成员存取操作符
member function 成员函式 成员函数
member initialization list 成员初值列 成员初始值列表
memberwise 以 member 为单元┅、members 逐一┅ 以成员为单位
memberwise copy 以 members 为单元逐一复制
memory 记忆体 内存
menu 表单、选单 菜单
message 讯息 消息
message based 以讯息为基础的 基於消息的
message loop 讯息回圈 消息环
method (Java) 方法、行为、函式 方法
meta
micro
middleware 中介层 中间件
modeling 模塑
modeling language 塑模语言,建模语言
modem 数据机 调制解调器
module 模组 模块
modifier 饰词 修饰符
most derived class 最末层衍生类别 最底层的派生类
mouse 滑鼠 鼠标
mutable 可变的 可变的
multi-tasking 多工 多任务

N

namespace 命名空间 名字空间、命名空间
native 原生的 本地的、固有的
nested class 巢状类别 嵌套类
network 网路 网络
network card 网路卡 网卡

O

object 物件 对象
object based 以物件为基础的 基於对象的
object file 目的档 目标文件
object model 物件模型 对象模型
object oriented 物件导向的 面向对象的
online 线上 在线
opaque 不透明的
operand 运算元 操作数
operating system (OS) 作业系统 操作系统
operation 操作、操作行为 操作
operator 运算子 操作符、运算符
option 选项,可选方案 选项
ordinary 常规的 常规的
overflow 上限溢位(相对於 underflow) 溢出(underflow:下溢)
overhead 额外负担、额外开销 额外开销
overload 多载化、多载化、重载 重载
overloaded function 多载化函式 重载的函数
overloaded operator 多载化运算子 被重载的操作符
overloaded set 多载集合 重载集合
override 改写、覆写 重载、改写、重新定义 (在 derived class 中重新定义虚拟函式

P

package 套件 包
pair 对组
palette 调色盘、组件盘、工具箱
pane 窗格 窗格(有时为嵌板之意,例 Java Content Pane)
parallel 平行 并行
parameter 叁数(函式叁数列上的变数) 叁数、形式叁数、形叁
parameter list 叁数列 叁数列表
parent class 父类别(或称 base class) 父类
parentheses 小括弧、小括号 圆括弧、圆括号
parse 解析 解析
part 零件 部件
partial specialization 偏特化(ref. C++ Primer 3/e, 16.10) 局部特化 (ref. full specialization)
pass by address 传址(函式引数的传递方式)(非正式用语)传地址
pass by reference 传址(函式引数的一种传递方式) 传地址, 按引用传递
pass by value 传值(函式引数的一种传递方式) 按值传递
pattern 范式、样式 模式
performance 效率、性能兼而有之 性能
persistence 永续性 持久性
pixel 图素、像素 像素
placement delete ref. C++ Primer3/e, 15.8.2
placement new ref. C++ Primer 3/e, 15.8.2
platform 平台 平台
pointer 指标 指针 址位器(和址叁器 reference 形成对映,满好)
poll 轮询 轮询
polymorphism 多型 多态
pop up 冒起式、弹出式 弹出式
port 埠 端口
postfix 后置式、后序式 后置式
precedence 优先序(通常用於运算子的优先执行次序)
prefix 前置式、前序式 前置式
preprocessor 前处理器 预处理器
prime 质数 素数
primitive type 基本型别 (不同於 base class,基础类别)
print 列印 打印
printer 印表机 打印机
priority 优先权 (通常用於执行绪获得 CPU 时间的优先次序)
procedure 程序 过程
procedural 程序性的、程序式的 过程式的、过程化的
process 行程 进程
profile 评测 评测
profiler 效能(效率)评测器 效能(性能)评测器
programmer 程式员 程序员
programming 编程、程式设计、程式化 编程
progress bar 进度指示器 进度指示器
project 专案 项目、工程
property 属性
protocol 协定 协议
pseudo code 假码、虚拟码、伪码 伪码

Q

qualified 经过资格修饰(例如加上 scope 运算子) 限定
qualifier 资格修饰词、饰词 限定修饰词
quality 品质 质量
queue 伫列 队列

R

radian 径度 弧度
radio button 圆钮 单选按钮
raise 引发(常用来表示发出一个 exception) 引起、引发
random number 随机数、乱数 随机数
range 范围、区间(用於 STL 时) 范围、区间
rank 等级、分等(ref. C++Primer 3/e 9,15章) 等级
raw 生鲜的、未经处理的 未经处理的
record 记录 记录
recordset 记录集 记录集
recursive 递回 递归
re-direction 重导向 重定向
refactoring 重构、重整 重构
refer 取用 叁考
refer to 指向、指涉、指代
reference (C++ 中类似指标的东西,相当於 “化身”) 引用、叁考 址叁器, see pointer
register 暂存器 寄存器
reflection 反射 反射、映像
relational database 关联式资料库 关系数据库
represent 表述,表现 表述,表现
resolve 决议(为算式中的符号名称寻找 解析 对应之宣告式的过程)
resolution 决议程序、决议过程 解析过程
resolution 解析度 分辨率
restriction 局限
return 传回、回返 返回
return type 回返型别 返回类型
return value 回返值 返回值
robust 强固、稳健 健壮
robustness 强固性、稳健性 健壮性
routine 常式 例程
runtime 执行期 运行期、运行时
common language runtime (CLR) 译为「通用语言执行层」
rvalue 右值 右值

S

save 储存 存储
schedule 排程 调度
scheduler 排程器 调度程序
scheme 结构纲目、组织纲目
scroll bar 卷轴 滚动条
scope 生存空间、生存范围、范畴、作用域 生存空间
scope operator 生存空间(范围决议)运算子 :: 生存空间操作符
scope resolution operator 生存空间决议运算子 生存空间解析操作符 (与scope operator同)
screen 萤幕 屏幕
search 搜寻 查找
semantics 语意 语义
sequential container 序列式容器 顺序式容器 (对应於 associative container)
server 伺服器、伺服端 服务器、服务端
serial 串行
serialization 次第读写,序列化 序列化 (serialize)
setter (相对於 getter) 设值函式
signal 信号
signature 标记式、签名式、署名式 签名
slider 滚轴 滑块
slot 条孔、槽 槽
smart pointer 灵巧指标、精灵指标 智能指针
snapshot 萤幕快照(图) 屏幕截图
specialization 特殊化、特殊化定义、特殊化宣告 特化
specification 规格 规格、规范
splitter 分裂视窗 切分窗口
software 软体 软件
solution 解法,解决方案 方案
source 原始码 源码、源代码
stack 堆叠 栈
stack unwinding 堆叠辗转开解(此词用於 exception 主题) 栈辗转开解 *
standard library 标准程式库
standard template library 标准模板程式库
statement 述句 语句、声明
status bar 状态列、状态栏 状态条
STL 见 standard template library
stream 资料流、串流 流
string 字串 字符串
subroutine 子路由
subscript operator 下标运算子 [ ] 下标操作符
subtype 子型别 子类型
support 支援 支持
suspend 虚悬 挂起
symbol 符号 记号
syntax 语法 语法

T

tag 标签 标记 索引标签,页签
target 标的(例 target pointer:标的指标) 目标
task switch 工作切换 任务切换
template 模板、范本 模板
template argument deduction 模板引数推导 模板叁数推导
template explicit specialization 模板显式特化(版本) 模板显式特化
template parameter 模板叁数 模板叁数
temporary object 暂时物件 临时对象

C++ 常见错误——无法解析的外部符号

C++ 常见错误——无法解析的外部符号

> 关于C++常见错误“无法解析的外部符号”这一问题如何解决的思考与方法。
>
> 本文就使用libevent中遇到的相似问题着手进行分析该如何解决,其他情况仍需按实际情况进行分析处理。常见的原因无外乎缺少编译库。

LNK2001

LNK2001详细列表

  1. 如上图所示,报错为无法解析的外部符号,符号为 __imp__if_nametoindex@4, 一般这种符号就是缺少导出的接口,导出接口一般为 函数名@导出序号。基本可以确定是缺少一个链接库。其次 <mark style="background:green;border-radius:10px;color:white">出现字符_imp,说明不是真正的静态库,而是某个动态库的导入库,导入函数和自己不同名,所以加了字符_imp</mark>。这里可以确定导出函数名为 if_nametoindex

  2. 确定了导出函数名为 if_nametoindex 之后,可以百度查看一下有没有相关函数的信息;
    <img src="../../../../images/%E6%97%A0%E6%B3%95%E8%A7%A3%E6%9E%90%E7%9A%84%E5%A4%96%E9%83%A8%E7%AC%A6%E5%8F%B7%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86/image-20230128162026923.png" alt="if_nametoindex函数查询结果" style="zoom:67%;" />

    一搜发现为windows系统函数,是网络相关的接口函数,负责将ANSI接口转换为接口的本地索引。其声明需要包含的静态库文件为 Netio.lib。但是笔者这边测试之后发现无法打开 Netio.lib 这个静态库,再查找,找到其相关索引为 IP Helper Functions

  3. 至此,基本上可以确定其缺少的静态库和网络部分相关,找到相关函数(这里查看的函数为 AddIPAddress),查看其函数使用要求,需要引用 Iphlpapi.lib,引入到代码中,编译成功。
    函数要求

blog link C++ 常见错误——无法解析的外部符号

C++ 枚举 # issue 标题模板 默认: C++ 枚举

[toc]

枚举

C++的枚举工具提供了另一种创建符号常量的方式,这种方式可以代替const。还允许定义新类型,但必须按严格的限制执行。使用enum的句法与struct类似。

enum color { red, orange, blue, green, red, black}

这条语句定义了一个名为color的新类型,它的取值范围为red, orange, blue, green, red, black,称为符号常量,同时将0~5分别对应于red~black。在默认情况下,0对应的是red,5对应的是black,其他以此类推。

声明与使用

color cor1; //定义了一个类型为color的变量cor1
//枚举变量的赋值
cor1 = red; //正常赋值
cor1 = 20; //非法,20不是枚举变量

由此可以看出,枚举变量的赋值受到限制,与程序员的定义有关。

  • 对枚举而言,它的操作符只有赋值运算符=,这就意味着枚举变量不能执行++、--、+、—等号以外的操作。

  • 枚举量是整形,可被提升为int类型,但int类型不能自动转换为枚举类型

  • 枚举可以进行强制类型转换,但不确定其结果,如cor1 = spectrum(100);

  • 如果只打算使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称 enum {red,orange}

设置枚举的值

可以使用赋值运算符显式地来设置枚举量的值:

enum bits {one = 1, two = 2, three = 3};

但是,指定的值必须是整数。也可以只显式的设置其中一部分的值,默认情况下,枚举的 第一个常量始终是从0开始的,这一点需要注意。

enum digits {zero, one = 0, two, three = 1};

这里,zeroone的枚举量都为0,twothree都是1

除了可以将int类型的值赋值给枚举量,还可以使用longlong long类型的值。

枚举的取值范围

现在有指定了枚举量的枚举如下所示:

enum bits(one = 1, two = 2,four = 4,eight = 8};
bits myflag;
myflag = bits(6);

问:

<div align=center style="filter:blur(5);">
上述赋值是否合法

	合法,虽然`6`不是枚举量,但它位于枚举定义的取值范围内。

</div>

关于取值范围的定义(参考C++ primer 第六版):

enum bigstep(firat,second = 100, third};

> 首先,要找出上限,需要知道枚举量的最大值。找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。例如,定义的bigstep的最大值枚举值是101。在2的幂中,比这个数大的最小值为128,因此取值范围的上限为127。要计算下限,需要知道枚举量的最小值。如果它不小于0,则取值范围的下限为0∶否则,采用与寻找上限方式相同的方式,但加上负号。
>
> ---
>
> 例如,如果最小的枚举量为-6,而比它小的、最大的2的幂是-8(加上负号),因此下限为-7。选择用多少空间来存储枚举由编译器决定。对于取值范围较小的枚举,使用一个字节或更少的空间∶而对于包含 long类型值的枚举,则使用4个字节。

应用实例

#include &lt;iostream&gt;
#include &quot;main.h&quot;
using namespace std;
enum myFlag {
	one,
	two = 0,
	three,
	four = 1
};
int main()
{
	cout &lt;&lt; three &lt;&lt; endl;
	myFlag flag = myFlag(0);
	cout &lt;&lt; flag &lt;&lt; endl;
	system(&quot;pause&quot;);
	return 0;
}

输出结果:

<div style="background:black;color:white">1<br>0<br></div>


#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
int main()
{
 
    enum color { red=1, green, blue };
 
    enum  color favorite_color;
 
    /* 用户输入数字来选择颜色 */
    printf(&quot;请输入你喜欢的颜色: (1. red, 2. green, 3. blue): &quot;);
    scanf(&quot;%u&quot;, &amp;favorite_color);
 
    /* 输出结果 */
    switch (favorite_color)
    {
    case red:
        printf(&quot;你喜欢的颜色是红色&quot;);
        break;
    case green:
        printf(&quot;你喜欢的颜色是绿色&quot;);
        break;
    case blue:
        printf(&quot;你喜欢的颜色是蓝色&quot;);
        break;
    default:
        printf(&quot;你没有选择你喜欢的颜色&quot;);
    }
 
    return 0;
}

<div style="background:black;color:white">请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
<br>你喜欢的颜色是红色</div>

枚举进阶

1. 位运算支持

> 在使用枚举时结合到 <mark>2进制</mark> 的强大,对枚举值自由的进行异或运算。

举例一:

enum AttributeTargets
{
     Assembly = 0x0001,
     Class = 0x0002,
     Struct = 0x0004
     ...
};

举例二:

但是在

enum FileAccess
{
     Read = 0x1,
     Write = 0x2,
     ReadWrite = Read | Write
};

2. 0值

为简单枚举提供一个 0 值枚举量,可以考虑将其命名为 None。如果这个名对于特定的枚举不合适的时候,可以自行找一个准确的。

enum Compression
{
     None = 0,
     GZip,
     Deflate
};

3. 用枚举代替define

> 在合适的情况下尽量使用枚举类型,而不是静态常量或 “#define” 值 。枚举 类型是一个具有一个静态常量集合的结构体。如果遵守这些规范,定义枚举类型,而不是带 有静态常量的结构体,您便会得到额外的编译器和反射支持,在调试代码时也能更加直观。

Good:

enum Color
{
     Red,
     Green,
     Blue
};

bad:

const int RED = 0;
const int GREEN = 1;
const int BLUE = 2;

#define RED 0
#define GREEN 1
#define BLUE 2

使用 UMDH 定位用户模式内存泄漏 # issue 标题模板 默认: 使用 UMDH 定位用户模式内存泄漏

[toc]

UMDH

> UMDH(用户模式转储堆),是与操作系统一起用于分析特性进程Windows堆分配。UMDH查找特定进程中的哪个例程正在泄漏内存。特别要注意的事:使用UMDH显示堆栈跟踪数据之前,必须使用 GFlags 正确配置系统。Windows的调试工具中包含了 GFlags

使用

启用 UMDH stack 跟踪:

  1. 在 GFlags 图形界面中,选择 "图像文件" 选项卡,键入进程名称 (包括文件扩展名) ,按 TAB 键,选择 " 创建用户模式堆栈跟踪数据库",然后选择 " 应用"。或者,在命令行界面使用 gflags 命令设置。

    glags /i imageName +ust

    当完成分析后,使用 - 清楚设置:

    glags /i imageName -ust
  2. 默认情况下,在 x86 处理器上 Windows 收集的堆栈跟踪数据量限制为 32 MB,在 x64 处理器上限制为 64 mb。 如果必须增加此数据库的大小,请选择 "GFlags" 图形界面中的 " 映像文件 " 选项卡,键入进程名称,按 tab 键,选中 " Stack Backtrace (Megs) " 复选框,在 "关联" 文本框中键入值 (,以) MB 为单位),然后选择 " 应用"。 仅在必要时增加此数据库,因为它可能会耗尽有限的 Windows 资源。 如果不再需要更大的大小,则将此设置返回到其原始值。

  3. 如果更改了 "系统注册表" 选项卡上的任何标志,则必须重新启动 Windows 以使这些更改生效。 如果更改了 " 图像文件 " 选项卡上的任何标志,则必须重新启动该过程才能使更改生效。 对内核标志选项卡所做的更改会立即生效,但下次重新启动 Windows,它们会丢失。

在使用 UMDH 之前,必须有权访问应用程序的正确符号。UMDH 使用环境变量指定的符号路径 _NT_SYMBOL_PATH。将此变量设置为包含应用程序的符号的路径。如果还包括 Windows 符号的路径,则分析可能更完整。此符号路径的语法与调试器使用的语法相同。

例如,如果你的应用程序的符号位于 C:\MySymbols,并且你想要为你的 Windows 符号使用公共 Microsoft 符号存储区,则使用 C:\MyCache 作为下游存储,你将使用以下命令设置你的符号路径:

set _NT_SYMBOL_PATH=c:\mysymbols;srv*c:\mycache*https://msdl.microsoft.com/download/symb

此外,若需要确保准确的结果,必须禁用 BSTR 缓存。为此,请将 OANOCACHE 环境变量的值设置为 1(需要在启动跟踪其分配的应用程序之前进行设置)。如果需要跟踪服务所做的分配,则必须将 OANOCACHE 设置为西戎环境变量,然后重新启动 Windows 以使此设置生效。

检测通过 UMDH 增加的堆分配

1. 确认进程ID (PID)

tlist | finstr &quot;进程名&quot;

2. 保存日志文件

使用 UMDH 分析此进程的堆内存分配,并将其保存到日志文件。将 -p 开关与 PID 一起使用,并将 -f 开关与日志文件的名称一起使用。例如,如果 PID 为123,并且你想要将日志文件命名为 Log1.txt ,请使用以下命令:

umdh -p:123 -f:log1.txt

3. 查看日志

使用记事本或其他程序打开日志文件。 此文件包含每个堆分配的调用堆栈、通过该调用堆栈进行的分配数,以及通过该调用堆栈使用的字节数。

4. 前后两次日志对比结果

由于您正在查找内存泄漏,因此,单个日志文件的内容是不够的。 你必须比较在不同时间记录的日志文件,以确定哪些分配正在增长。

UMDH 可以比较两个不同的日志文件,并在各自的分配大小中显示更改。 您可以使用大于符号 (>) 将结果重定向到第三个文本文件。 你可能还需要包含-d 选项,该选项将字节和分配计数从十六进制转换为十进制。 例如,若要比较 Log1.txt 和 Log2.txt,将比较结果保存到文件 LogCompare.txt,请使用以下命令:

umdh log1.txt log2.txt &gt; logcompare.txt 

5. 分析内存泄漏

+ 5320 ( f110 - 9df0) 3a allocs BackTrace00B53 
Total increase == 5320 

对于每个调用堆栈 (在 UMDH 日志文件中标记为 "BackTrace" ) ,这两个日志文件之间有比较。 在此示例中,第一个日志文件 (Log1.txt) 为 BackTrace00B53 分配的0x9DF0 字节,而第二个日志文件记录了0xF110 字节,这意味着在捕获两个日志的时间之间分配有0x5320 的额外字节。 这些字节来自 BackTrace00B53 标识的调用堆栈。

6. 查看泄漏堆栈

若要确定该 backtrace 中的内容,请打开一个原始日志文件 (例如 Log2.txt) ,然后搜索 "BackTrace00B53"。结果类似于以下数据:

00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00B53
ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!DisplayMyGraphics+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D 

> 上述泄漏内存分析:
>
> 此 UMDH 输出显示有) (十进制21280从调用堆栈中分配的总字节数。 这些字节是从 0x14 (十进制 20) 单独分配的,每个 0x428 (十进制 1064) 字节。
>
> 将为调用堆栈提供 "BackTrace00B53" 的标识符,并显示此堆栈中的调用。 在检查调用堆栈时,可以看到 DisplayMyGraphics 例程正在通过 new 运算符分配内存,该运算符调用例程 malloc,后者使用 Visual C++ 运行时库从堆中获取内存。
>
> 确定要在源代码中显式显示的最后一个调用。 在这种情况下,它可能是 new 运算符,因为调用 malloc 是作为 的实现的一部分而不是作为单独的分配。 因此, DisplayMyGraphics例程中new运算符的此实例会重复分配未释放的内存。

参考链接

使用 UMDH 查找用户模式内存泄漏 - Windows drivers | Microsoft Docs

Windows 降权 # issue 标题模板 默认: Windows 降权

[toc]

背景说明

在服务程序中调用了某一个程序的安装程序,由于权限的问题,这个安装程序也继承了服务的 SYSTEM 权限,导致安装程序与预期不符合。

解决方案

最终实现的目标就是在服务中以普通用户的权限去启动安装程序,要以普通用户去启动,就涉及到降权的问题,需要获取用户的信息。在任务管理器详细信息中可以看到,资源管理器是以普通用户的身份启动的,因此可以在服务中以 Explore.exe 的权限去调用安装程序。

实现逻辑

此逻辑也可以用于解决 UAC 弹窗的问题。

  1. 获取token
  2. 通过token获取用户的会话ID
  3. 通过token和ID启动进程

代码

接口

最终调用的接口为: CreateProcessAsUser

int ExecutePackage(LPCSTR pszPath, LPCSTR pszParams)
{
	if (nullptr == pszPath)
		return -1;

	wstring szPath = stringToWstring(pszPath);

	wstring szParams;
	if (pszParams)
	{
		szParams = stringToWstring(pszParams);
	}

	CreateProcessWithAdmin(szPath.c_str(), szParams.c_str());
	return 0;
}

实现

实现如下所示:

/*
* @fn           
* @brief        CreateProcessWithAdmin
* @param[in]    
*   strpath: 程序路径
*   strParams: 程序执行命令
* @param[out]   
* @return       
*               
* @detail      
*/
bool CreateProcessWithAdmin(LPCWSTR lpExePath, LPCWSTR lpParam)
{
    HANDLE hExplorerToken = GetExplorerToken();
    HANDLE hTokenDup = NULL;
    LPVOID pEnvironment = nullptr;
    bool res{ false };

    char	szErr[256] = { 0 };
    int		iErrCode = 0;
    do
    {
        if (hExplorerToken == NULL)
        {
            iErrCode = GetLastError();
            break;
        }
        // 复制令牌,把调用方有效的所有访问权限给复制后的令牌.
        DWORD dwReturnBytes = 0;
        DWORD dwReturnLen = 0;
        DWORD dwTokenSessionId = 0;
        
        // 通过token获取sessionId
        if (::GetTokenInformation(hExplorerToken, TokenSessionId, &amp;dwTokenSessionId, sizeof(DWORD), &amp;dwReturnLen) == FALSE)
        {
            break;
        }

        // 通过 SessionId 和 Token运行程序
-		res = _CreateProcessAsSystemBySession(lpExePath, lpParam, NULL, dwTokenSessionId, hExplorerToken); // 改动如下所示
        
        // 改动
        // 判断当前特权token是否已提升,如果已经提升,则直接通过当前的token启动,如果未提升,则通过提升后的token启动
+        HANDLE hNewToken = NULL;
+		if (GetElevatedToken(hExplorerToken, &amp;hNewToken) &amp;&amp; hNewToken)
+		{
+			res = CreateProcessByToken(hNewToken, hExplorerToken, lpExePath, lpParam, NULL, FALSE);
+			CloseHandle(hNewToken);
+		}
+		else
+		{
+			res = CreateProcessAsSystemBySession(lpExePath, lpParam, NULL, dwTokenSessionId, hExplorerToken);
+		}
+		CloseHandle(hExplorerToken);
        
    } while (false);


    return res;
}

判断token是否被提升:

BOOL IsElevatedToken(HANDLE hToken, PBOOL pbElevated)
{
	DWORD dwReturnBytes = 0;
	DWORD dwElevateionType = 0;
	BOOL bElevated = FALSE;

	if (hToken &amp;&amp; pbElevated)
	{
		if (GetTokenInformation(hToken, TokenElevationType, &amp;dwElevateionType, sizeof(dwElevateionType), &amp;dwReturnBytes))
		{
			if (dwElevateionType == TokenElevationTypeFull)
				bElevated = TRUE;
			else if (dwElevateionType == TokenElevationTypeDefault)
			{
				TOKEN_ELEVATION te;
				ZeroMemory(&amp;te, sizeof(te));

				if (GetTokenInformation(hToken, TokenElevation, &amp;te, sizeof(te), &amp;dwReturnBytes))
				{
					if (te.TokenIsElevated)
						bElevated = TRUE;
				}
			}
		}

		if (pbElevated)
			*pbElevated = bElevated;

		return TRUE;
	}

	return FALSE;
}

BOOL GetElevatedToken(HANDLE hToken, PHANDLE phNewToken)
{
	BOOL bElevated = FALSE;

	IsElevatedToken(hToken, &amp;bElevated);

	if (bElevated)
	{
		return DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, phNewToken);
	}
	else
	{
		DWORD dwReturnBytes = 0;
		return GetTokenInformation(hToken, TokenLinkedToken, phNewToken, sizeof(HANDLE), &amp;dwReturnBytes);
	}

	return FALSE;
}

获取资源管理器的 token

HANDLE GetExplorerToken()
{
    PromotePrivilege();

    HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)
    {
        return NULL;
    }

    HANDLE hExplorerToken = NULL;
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(pe);

    BOOL bMore = ::Process32First(hSnapshot, &amp;pe);
    while (bMore)
    {
        if (StrCmpI(L&quot;explorer.exe&quot;, pe.szExeFile) == 0)
        {
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
            if (hProcess == NULL)
            {
                continue;
            }
            if (OpenProcessToken(hProcess, TOKEN_QUERY, &amp;hExplorerToken))
            {
                CloseHandle(hProcess);
                break;
            }
        }
        bMore = ::Process32Next(hSnapshot, &amp;pe);
    }
    CloseHandle(hSnapshot);

    return hExplorerToken;
}

给本进程特权,以便访问系统进程

/*
* @fn       PromotePrivilege
* @brief    调整进程权限      
*               
* @detail   将进程权限提升成具有调试权限的进程,这个权限应该是进程所能具有的最大权限
*           前提启动这个进程的账户必须是一个管理员,否则没法提升
*/
BOOL PromotePrivilege()
{
    // 附给本进程特权,以便访问系统进程  
    HANDLE hToken;
    // 打开一个进程的访问令牌  
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &amp;hToken))
    {
        // 取得特权名称为&quot;SetDebugPrivilege&quot;的LUID  
        LUID uID;
        if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &amp;uID))
        {
            CloseHandle(hToken);
            return FALSE;
        }
        // 调整特权级别  
        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount = 1; // 只启动调试权限,所以权限的个数是一个
        tp.Privileges[0].Luid = uID;
        
        //当Attributes = SE_PRIVILEGE_ENABLE时,激活权限
        //当Attributes = 0时,关闭权限
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        
		// AdjustTokenPrivileges函数激活或者关闭tp中给定的权限
        if (!AdjustTokenPrivileges(hToken, FALSE, &amp;tp, sizeof(tp), NULL, NULL))
        {
            CloseHandle(hToken);
            return FALSE;
        }
        // 关闭访问令牌句柄  
        CloseHandle(hToken);
        return TRUE;
    }
    return FALSE;
}

设置当前进程的会话信息:

bool CreateProcessAsSystemBySession(LPCTSTR pszAppName, LPCTSTR pszCmd, LPCTSTR pszCwd, DWORD dwSession, HANDLE hEnvToken)
{
    if (pszCmd == NULL)
        return false;

    bool bRet = false;

    HANDLE hTokenThis = NULL;
    bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &amp;hTokenThis);
    if (!bRet || hTokenThis == NULL)
        return false;

    HANDLE hTokenDup = NULL;
    bRet = DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &amp;hTokenDup);
    CloseHandle(hTokenThis);
    if (!bRet || hTokenDup == NULL)
        return false;

    if (!SetTokenInformation(hTokenDup, TokenSessionId, &amp;dwSession, sizeof(DWORD)))
    {
        CloseHandle(hTokenDup);
        return false;
    }

    bRet = CreateProcessByToken(hTokenDup, hEnvToken, pszAppName, pszCmd, pszCwd, TRUE);
    CloseHandle(hTokenDup);

    return bRet;
}

调用接口创建进程:

typedef BOOL(STDMETHODCALLTYPE FAR* LPFNCREATEENVIRONMENTBLOCK) (LPVOID* lpEnvironment, HANDLE  hToken, BOOL    bInherit);
typedef BOOL(STDMETHODCALLTYPE FAR* LPFNDESTROYENVIRONMENTBLOCK) (LPVOID lpEnvironment);

bool CreateProcessByToken(HANDLE hToken, HANDLE hEnvToken, LPCTSTR pszAppName, LPCTSTR pszCmd, LPCTSTR pszCwd, BOOL bWndHide/* = FALSE*/)
{
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi = { 0 };

    si.lpDesktop = (LPWSTR)L&quot;Winsta0\\Default&quot;;

    if (bWndHide)
    {
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_HIDE;
    }
    DWORD  dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
    LPVOID pEnvironment = NULL;
    LPFNCREATEENVIRONMENTBLOCK  lpfnCreateEnvironmentBlock = NULL;
    LPFNDESTROYENVIRONMENTBLOCK lpfnDestroyEnvironmentBlock = NULL;
    HMODULE hUserEnvLib = NULL;
    hUserEnvLib = LoadLibrary(L&quot;userenv.dll&quot;);
    if (NULL != hUserEnvLib)
    {
        lpfnCreateEnvironmentBlock = (LPFNCREATEENVIRONMENTBLOCK)GetProcAddress(hUserEnvLib, &quot;CreateEnvironmentBlock&quot;);
        lpfnDestroyEnvironmentBlock = (LPFNDESTROYENVIRONMENTBLOCK)GetProcAddress(hUserEnvLib, &quot;DestroyEnvironmentBlock&quot;);
    }

    if (NULL != lpfnCreateEnvironmentBlock)
    {
        if (lpfnCreateEnvironmentBlock(&amp;pEnvironment, hEnvToken, FALSE))
        {
            dwCreationFlag |= CREATE_UNICODE_ENVIRONMENT; // must specify				
        }
        else
            pEnvironment = NULL;
    }


    bool bRet = false;
    BOOL bDisableRedirect = FALSE;

    if (CreateProcessAsUser(hToken, pszAppName, (LPTSTR)pszCmd, NULL, NULL, FALSE, dwCreationFlag, pEnvironment, pszCwd, &amp;si, &amp;pi))
    {
        CloseHandle(pi.hThread);

        DWORD dwRet = WaitForSingleObject(pi.hProcess, 2 * 60 * 60 * 1000);
        if (WAIT_TIMEOUT == dwRet)
        {


        }
        else if (WAIT_OBJECT_0 == dwRet)
        {

            bRet = true;
        }
        CloseHandle(pi.hProcess);
    }

    if (NULL != lpfnDestroyEnvironmentBlock)
        lpfnDestroyEnvironmentBlock(pEnvironment);
    if (NULL != hUserEnvLib)
        FreeLibrary(hUserEnvLib);

    return bRet;
}

ls命令详解

ls命令详解

[toc]

参数

> ls :列出文件或者目录

  • -l,使用长格式显示
  • -a,显示文件名以.开头的隐藏文件
  • -h,以human易读格式显示,主要是看容量的时候使用KB MB GB,指当前文件夹目录的大小
  • -lh ,文件或者目录大小的, 方便识别
  • -lhS ,文件从大到小排序
  • -lg ,不打印所有者信息
  • -ln ,打印UID和GID
  • -l --si si以1000为单位,而-h以1024为单位。
  • -l --block-size=M: 设置文件显示单位
  • -li,显示inode号
  • -r,reverse,改变归类的顺序,例如和-t配合使用,-tr和-t显示顺序是颠倒的。
  • -R,递归列出子目录
  • -lX/ -l --sort=extension:扩展名排序
  • -t,按照修改时间顺序归类文件。
  • -d,列出目录本身的信息,而不是目录里边的内容。

字节

> 字节相关单位:

K = Kilobyte 千字节
M = Megabyte 兆字节
G = Gigabyte 十亿字节
T = Terabyte 兆兆字节
P = Petabyte 10的15次方字节
E = Exabyte 艾字节
Z = Zettabyte 泽它字节或皆字节
Y = Yottabyte 尧字节

命令

  • -a: 显示所有档案以及目录(ls内定将档案或目录名称为“./..”的视为隐藏)

  • -A: 显示除隐藏文件“./..”以外的所有文件列表

  • -b: 将文件中的不可输出的字符以反斜线加字符编码的方式输出

  • -c : 与”-lt“ 选项连用时,按照文件状态时间排序输出目录内容, 排序的依据是文件的索引节点中的ctime 字段。 与”-l“连用时,排序的依据是文件的状态改变时间。

  • -C: 多列显示输出结果(只有文件名信息)

  • -d : 仅显示目录名,而不显示目录下的内容列表, 显示符号链接文件本身, 而不显示其指定的目录列表。

  • -F: 在每个输出项后最佳文件的类型标识符, * 可执行权限的普通文件,/ 表示目录, @ 表示符号链接,|表示命令管道, = 表示sockets 套接字, 普通文件不输出标识符。

  • -h: 以human易读格式显示, 文件大小以kb,mb显示

  • -i : 显示文件索引节点号(inode),一个索引节点代表一个文件

  • -l : 以长格式显示目录下的内容列表,输出信息:文件名,文件类型,权限模式,硬链接数,所有者,组,文件大小, 文件最后修改时间。<span style="border-bottom: 2px dashed #000000"> ls - l 命令就是常用 ll</span>

  • -L : 如果遇到性质为符号链接的文件或目录, 直接列出该链接所造的原始文件或目录

  • -m: 以逗号分隔每个文件和目录的名称

  • -n : 以用户标志码和群组识别码替代其名称uid /gid

  • -r : 以文件名反序排序并输出目录内容列表

  • -R:递归处理,将制定目录下的所有文件及子目录一并处理

  • -s : 显示文件和目录的大小, 以区块为单位

  • -t : 用文件和目录的更改时间排序
    blog link ls命令详解

【不敢说一文搞懂】VLD 内存泄漏定位 # issue 标题模板 默认: 【不敢说一文搞懂】VLD 内存泄漏定位

[toc]

半学半练,定位了一把内存泄漏的问题。

内存泄漏工具的想必大家都知道了,主要使用 VLD 这个工具。

VLD 下载安装和使用

1. 下载和安装

Visual Leak Detector | Enhanced Memory Leak Detection for Visual C++

点击上方链接下载和安装 vld 工具,记住安装的位置,后续有很多文件会使用到,需要拷贝移动到相应的文件中。

2. 使用

  1. 安装完成后,找到安装所在的文件夹
  2. 找到 vs studio 中 <mark>标准头文文件</mark> 所在的文件夹,一般会在对应的 windows kits 所在的文件夹中找到。如: C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt。拷贝安装目录下 include 中的 头文件到该目录,注意有几个 kits 环境就尽量拷贝几个,万一用到呢
  3. 找到 vs studio 中 <mark>库文件</mark> 所在的文件夹,一般会在对应的 windows kits 所在的文件夹中找到。如: C:\Program Files (x86)\Windows Kits\10\Lib\(kits 版本号)\um\。拷贝安装目录下 lib 目录下对应位数的 lib 文件到 kits 对应的 um\x64um\x86 文件夹中。

image-20220913162958861

到这一步,只要在程序中引入 vld 头文件就可以正常使用了。

#include &lt;vld.h&gt;

3. 在 vs2015 以上的版本中使用

> 安装的时候就可以看到 vld 只支持到 vs2015。所以在 vs 更高的版本中使用时,需要一些额外的操作。
>
> 影响:在vs高版本中使用时,虽然能定位泄漏问题,但是不显示文件名和行号。

解决办法:

在 vs 工程设置中按下图设置:

vs-vld-config

4. release 模式下进行内存泄漏检测

在 Debug 模式下,直接在工程中源文件中任意位置引入 &lt;vld.h&gt; 即可,编译之后的可执行文件就带有泄漏检测的功能。

但是在 Release 模式下则需要做一下额外的处理。

  1. 同 Debug 版本在 VS 中一样配置好 VLD 的相关信息

  2. 拷贝 VLD 安装目录下 bin\win32 目录下所有的文件和 vld.ini 到工程目标路径下(可执行文件的目录)。

  3. 在程序入口处的 cpp 文件中,定义强制检测宏和包含 vld 头文件

    #define VLD_FORCE_ENABLE
    #include &lt;vld.h&gt;
  4. 在程序启动和退出时,分别增加以下函数调用

    {
        ...
        VLDGlobalEnable();
        VLDReportLeaks();
        //some code...
        VLDGlobalDisable();
    }
  5. 增加检测模块(如加载的 dll 文件)

    > 以上配置后,默认情况下只会检测主线程的模块,要想增加其他模块的内存泄漏检测,需要配置 vld.ini 配置文件中的 ForceIncludeModules 配置项。在该配置项后增加需要检测的模块。如:ForceIncludeModules=demo1.dll;demo2.dll

  6. 配置输出方式

    同样还是配置文件中修改。设置配置文件中 ReportTo 的值即可:

    • debugger:控制台
    • file: 文件 (默认会输出在运行程序的目录下,也可能会输出在 syswow64 这个系统目录下,<kbd>Win+R</kbd> 输入 syswow64即可打开这个目录。默认文件名:memory_leak_report.txt
    • both:控制台和文件

    > 关于 VLD 的配置文件:
    >
    > Vld 的库会检查程序所运行的当前目录是否存在 vld.ini 的配置文件,如果有,则加载里头的配置进行内存检测运行,如果没有取默认的配置参数运行,我们可以手动将 vld.ini 的文件拷贝到程序的运行目录中即可。
    >
    > 关于 vld.ini 的几个注意的参数:
    >
    > 1. VLD = on 总开关,是否启用 VLD 功能,默认为 yes
    > 2. MaxDataDump = 256 用来显示检测到的内在泄露的块的地址大小,默认256,其实就是显示多少个byte的内容。
    > 3. MaxTraceFrames = 64 设置 VLD 检测到堆栈的最大层极,也就是frame的深度
    > 4. ReportFile = xxx设置 VLD 生成报告的位置和报告的文件名,默认为:.\memory_leak_report.txt ,程序当前运行目录中。
    > 5. ReportTo = debugger 设置 VLD 生成报告的方式,debugger为在控制台输出 VLD 的报告信息,file在指定目录下生成报告文件,both为即输出也生成报告。如果你的程序为带窗体的程序,需要设置为file或both.

问题1:不显示文件名和行号

缺少 pdb 文件

如果程序运行之后生成的 memory_leak_report 中还是不显示行号,则试试把pdb文件放在程序的运行目录试试。

参考文章

  1. 【VS2019】C/C++内存泄漏检测工具:Visual Leak Detector超详细安装教程(for windows)_执行x的博客-CSDN博客_vs2019内存泄漏检测

  2. 使用VLD进行内存泄漏检测(release + debug)_OH,CGWLMXUP的博客-CSDN博客_release vld

Wiki自动更新脚本 # issue 标题模板 默认: Wiki自动更新脚本

@echo off
:reInput

echo                                      Git自动更新脚本(输入序号选择命令)
echo ===================================================================================
echo 1 (:memo: 更新文档)
echo 2 (:fire:)
echo 3 (:wrench: 部署)
echo 4 (:bug:)
echo 5 (手动添加commit信息)
echo ===================================================================================
echo.

echo=
choice /c:12345 /m:&quot;请输入Git 数字命令更新变动:&quot;
if %errorlevel% == 1 set change=&quot;:memo: 更新文档&quot;
if %errorlevel% == 2 set change=&quot;:bug:&quot;
if %errorlevel% == 3 set change=&quot;:wrench: 部署&quot;
if %errorlevel% == 4 set change=&quot;:bug:&quot;
if %errorlevel% == 5 set /p change=&quot;请输入Commit信息:&quot;

if %change%==&quot;&quot; (
cls
echo -------
echo 提交信息不能为空!
echo -------
goto reInput 
)

echo.

:: cd &quot;D:\\wiki\\&quot;

git pull

git add .

git commit -m %change%

git push

echo.
echo ===================================================================================
echo                                      更新完毕
echo.
title &quot; update SUCCESS&quot;
pause

提权 # issue 标题模板 默认: 提权

BOOL  EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable)
{
    int nResult = FALSE;
    int nRetCode = FALSE;
    HANDLE hToken = NULL;
    TOKEN_PRIVILEGES tkp = { 0 };

    do
    {
        nRetCode = ::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &amp;hToken);
        if (!nRetCode)
            break;

        nRetCode = ::LookupPrivilegeValue(NULL, lpszPrivilegeName, &amp;tkp.Privileges[0].Luid);
        if (!nRetCode)
            break;

        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
        nRetCode = ::AdjustTokenPrivileges(hToken, FALSE, &amp;tkp, sizeof(tkp), NULL, NULL);
        if (!nRetCode)
            break;

        nResult = TRUE;
    } while (FALSE);

    if (hToken != NULL)
    {
        CloseHandle(hToken);
    }

    return nResult;
}

HANDLE GetExplorerToken()
{
    EnablePrivilege(SE_DEBUG_NAME, TRUE);

    HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)
    {
        return NULL;
    }

    HANDLE hExplorerToken = NULL;
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(pe);

    BOOL bMore = ::Process32First(hSnapshot, &amp;pe);
    while (bMore)
    {
        if (_tcsicmp(&quot;explorer.exe&quot;, pe.szExeFile) == 0)
        {
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
            if (hProcess == NULL)
            {
                continue;
            }
            if (OpenProcessToken(hProcess, TOKEN_QUERY, &amp;hExplorerToken))
            {
                CloseHandle(hProcess);
                break;
            }

            CloseHandle(hProcess);
        }
        bMore = ::Process32Next(hSnapshot, &amp;pe);
    }
    CloseHandle(hSnapshot);

    return hExplorerToken;
}

使用

HANDLE hExplorerToken = GetExplorerToken();
if (hExplorerToken == NULL)
    break;

char szUserProfilePath[MAX_PATH] = { 0 };
DWORD cchSize = MAX_PATH;
if (!GetUserProfileDirectoryA(hExplorerToken, szUserProfilePath, &amp;cchSize))
{
    CloseHandle(hExplorerToken);
    break;
}

三黑豆浆

三黑豆浆

  1. 配料表
  • 黑豆 25克

  • 黑米 20克

  • 黑芝麻 15克

  • 核桃 25克

  • 冰糖 15克

  • 凉水 800ml
    blog link 三黑豆浆

git emoji手册 # issue 标题模板 默认: git emoji手册

emoji emoji 代码 commit 说明
🎨 (调色板) :art: 改进代码结构 / 代码格式
⚡️ (闪电) 🐎 (赛马) :zap: :racehorse: 提升性能
🔥 (火焰) :fire: 移除代码或文件
🐛 (bug) :bug: 修复 bug
🚑 (急救车) :ambulance: 重要补丁
✨ (火花) :sparkles: 引入新功能
📝 (备忘录) :memo: 撰写文档
🚀 (火箭) :rocket: 部署功能
💄 (口红) :lipstick: 更新 UI 和样式文件
🎉 (庆祝) :tada: 初次提交
✅ (白色复选框) :white_check_mark: 更新测试
🔒 (锁) :lock: 修复安全问题
🍎 (苹果) :apple: 修复 macOS 下的问题
🐧 (企鹅) :penguin: 修复 Linux 下的问题
🏁 (旗帜) :checkered_flag: 修复 Windows 下的问题
🤖(机器人) :robot: 修复 Android 下的问题
🍏 (绿苹果) :green_apple: 修复 iOS 下的问题
🔖 (书签) :bookmark: 发行 / 版本标签
🚨 (警车灯) :rotating_light: 移除 linter 警告
🚧 (施工) :construction: 工作进行中
👷 (工人) :construction_worker: 添加 CI 构建系统
💚 (绿心) :green_heart: 修复 CI 构建问题
⬆️ (上升箭头) :arrow_up: 升级依赖
⬇️ (下降箭头) :arrow_down: 降级依赖
📌 (图钉) :pushpin: 将依赖项固定到特定版本
📈 (上升趋势图) :chart_with_upwards_trend: 添加分析或跟踪代码
♻️ (回收) :recycle: 重构代码
🐳 (鲸鱼) :whale: Docker 相关工作
🌐 (带子午线的地球仪) :globe_with_meridians: 国际化与本地化
➕ (加号) :heavy_plus_sign: 增加一个依赖
➖ (减号) :heavy_minus_sign: 减少一个依赖
🔧 (扳手) :wrench: 修改配置文件
🔨 (锤子) :hammer: 重大重构
✏️ (铅笔) :pencil2: 修复 typo
💩 (粑粑…) :hankey: 写了辣鸡代码需要优化
⏪ (倒带) :rewind: 恢复更改
🔀 (交叉向右的箭头) :twisted_rightwards_arrows: 合并分支
📦 (包裹) :package: 更新编译的文件或包
👽 (外星人) :alien: 由于外部 API 更改而更新代码
🚚 (货车) :truck: 移动或者重命名文件
📄 (正面朝上的页面) :page_facing_up: 增加或更新许可证书
💥 (爆炸) :boom: 引入突破性的变化
🍱 (铅笔) :bento: 增加或更新资源
👌 (OK 手势) :ok_hand: 由于代码审查更改而更新代码
♿️ (轮椅) :wheelchair: 改善无障碍交互
💡 (灯泡) :bulb: 给代码添加注释
🍻 (啤酒) :beers: 醉醺醺地写代码…
💬 (消息气泡) :speech_balloon: 更新文本文档
🗃 (卡片文件盒) :card_file_box: 执行与数据库相关的更改
🔊 (音量大) :loud_sound: 增加日志
🔇 (静音) :mute: 移除日志
👥 (轮廓中的半身像) :busts_in_silhouette: 增加贡献者
🚸 (孩童通行) :children_crossing: 优化用户体验、可用性
🏗 (建筑建造) :building_construction: 结构变动
📱 (iPhone) :iphone: 做响应式设计
🤡 (小丑脸) :clown_face: 嘲弄事物(直译,这个没明白)
🥚 (鸡蛋) :egg: 增加彩蛋
🙈 (看不见邪恶) :see_no_evil: 增加或更改 gitignore
📸 (照相机闪光灯) :camera_flash: 增加或更新截图
⚗️ (蒸馏器) :alembic: 尝试新东西
🔍 (放大镜) :mag: SEO 优化
☸️ (船的方向盘) :wheel_of_dharma: 关于 Kubernetes 的工作
🏷 (标签) :label: 增加类型(FLow、Typescript)

libevent——evconnlistener_new_bind(1)

libevent——evconnlistener_new_bind(1)

libevent封装了监听套接字,将套接字和struct event统一管理。

官方的解释是:

> The evonnlistener mechanism gives you a way to listen for and accept incoming TCP connections

首先还是学习怎么去使用evconnlistener

(一)接口

//创建
struct evconnlistener *evconnlistener_new(struct event_base*base,evconnlistener_cb cb,
void *ptr,unsigned flags ,int backlog,evutil_socket_t fd);
struct evconnlistener*evconnlistener_new_bind(struct event_base*base,evconnlistener_cb cb,
void *ptr,unsigned flags,int backlog,const struct sockaddr*sa,int socklen);
void evconnlistener_free(struct evconnlistener*lev)
//其中callback的定义如下:
typedef void (*evconnlistener_cb)(struct evconnlistener *listener,evutil_socket_t sock,
        struct sockaddr*addr,int len,void *ptr);
//enable 和 disable
int evconnlistener_disable(struct evconnlistener *lev);
int evconnlistener_enable(struct evconnlistener *lev);
//调整callback
void evconnlistener_set_cb(struct evconnlistener*lev,evconnlistener_cb cb,void *arg)
//检查evconnlistener
evutil_socket_t evconnlistener_get_fd(struct evconnlistener *lev)
struct event_base *evconnlistener_get_base(struct evconnlistener*lev)

evconnlistener是对 <u>套接字和event</u> 的封装,可以想见,在这些接口中,除了调用socket api之外,还会关联套接子到event上进而注册到event_base上去

不过接口封装好了这些行为,只需要了解这些参数的含义即可。

> base:即event_base
> cb:当有新连接时调用的回调函数
> ptr:callback的参数
> flags:控制listner的行为
> backlog:同 listen(2)中backlog的含义
> fd:已经bind的fd,传入api让libevent做listen调用

(二)例子

使用evconnlistener管理监听套接字构建一个简单的 <mark>echo server</mark>
代码也可参考gayhub

#include &lt;event2/listener.h&gt;
#include &lt;event2/bufferevent.h&gt;
#include &lt;event2/buffer.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;errno.h&gt;
#include &lt;assert.h&gt;
static void 
echo_read_cb(struct bufferevent*bev,void*ctx)
{
    struct evbuffer*input=bufferevent_get_input(bev);
    struct evbuffer*output=bufferevent_get_output(bev);
    evbuffer_add_buffer(output,input);
}
static void
echo_event_cb(struct bufferevent*bev,short events,void*ctx)
{
    if(events&amp;BEV_EVENT_ERROR)
    perror(&quot;Error from bufferevent&quot;);
    if(events&amp;(BEV_EVENT_EOF|BEV_EVENT_ERROR))
    {
    bufferevent_free(bev);
    }
}
static void
accept_error_cb(struct evconnlistener*listener,void*ctx)
{
    struct event_base*base=evconnlistener_get_base(listener);
    event_base_loopexit(base,NULL);
}
void accept_conn_cb(struct evconnlistener*listener,evutil_socket_t fd,struct sockaddr*address,int socklen,void*ctx)
{
    struct event_base*base=evconnlistener_get_base(listener);
    struct bufferevent*bev = bufferevent_socket_new(base,
        fd,
        BEV_OPT_CLOSE_ON_FREE);
    bufferevent_setcb(bev,echo_read_cb,NULL,echo_event_cb,NULL);
    bufferevent_enable(bev,EV_READ|EV_WRITE);
}
int main(int argc,char**argv)
{
    struct event_base *base;
    struct evconnlistener *listener;
    struct sockaddr_in sin;
    int port = 1025;
    base = event_base_new();
    assert(base!=NULL);
    memset(&amp;sin,0,sizeof(sin));
    sin.sin_family=AF_INET;
    sin.sin_addr.s_addr=htonl(0);
    sin.sin_port=htons(port);
    listener=evconnlistener_new_bind(base,//event_base
        accept_conn_cb,//cb
        NULL,// ptr
        LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE,//flag
        -1,//backlog
        (struct sockaddr*)&amp;sin,
        sizeof(sin));
    assert(listener!=NULL);
    evconnlistener_set_error_cb(listener,accept_error_cb);
    event_base_dispatch(base);
    return 0;
}

(三)源码

看看evconnlistenr做了哪些封装

3.1结构体

struct evconnlistener {
    const struct evconnlistener_ops *ops; //一些回调函数
    void *lock;
    evconnlistener_cb cb;//
    evconnlistener_errorcb errorcb;
    void *user_data;//
    unsigned flags;
    short refcnt;
    unsigned enabled : 1;
};
struct evconnlistener_event {
    struct evconnlistener base;
    struct event listener;
};

evconnlistener结构体将一些基本的回调函数、用户数据等封装,然后evconnlistener_event将这些东西和struct event封装在一起

3.2创建一个evconnlistener

看一下初始化有哪些内容:

struct evconnlistener *
evconnlistener_new(struct event_base *base,
    evconnlistener_cb cb, void *ptr, unsigned flags, int backlog,
    evutil_socket_t fd)
{
    struct evconnlistener_event *lev;
    if (backlog &gt; 0) {
        if (listen(fd, backlog) &lt; 0)//调用listen
            return NULL;
    } else if (backlog &lt; 0) {
        if (listen(fd, 128) &lt; 0)
            return NULL;
    }
    lev = mm_calloc(1, sizeof(struct evconnlistener_event));
    if (!lev)
        return NULL;
        //lev-&gt;base是一个evconnlistener结构体
    lev-&gt;base.ops = &amp;evconnlistener_event_ops;//设置ops参数
    lev-&gt;base.cb = cb;//设置回调
    lev-&gt;base.user_data = ptr;//ptr
    lev-&gt;base.flags = flags;//flag
    lev-&gt;base.refcnt = 1;
    if (flags &amp; LEV_OPT_THREADSAFE) {
        EVTHREAD_ALLOC_LOCK(lev-&gt;base.lock, EVTHREAD_LOCKTYPE_RECURSIVE);
    }
    //将fd关联到struct event上去 lev-&gt;listener是struct event结构体
    //这样assigh将listener_read_cb设置到event的cb中,并将struct evconnlistner做为参数
    //这是一个比较复杂的过程,首先由于event激活,将先调用listener_read_cb
    //在listener_read_cb通过传入的struct evconnlistner调用用户自定义回调
    event_assign(&amp;lev-&gt;listener, base, fd, EV_READ|EV_PERSIST,
        listener_read_cb, lev);
        //这里底层调用event_enable
    evconnlistener_enable(&amp;lev-&gt;base);
    return &amp;lev-&gt;base;
}

在另外一个接口evconnlistener_new_bind中由于指定了套接字结构体,因此在底层还调用了bind

3.3 listener_read_cb

这个底层的回调函数先于用户回调函数调用,在这个回调中会调用用户回调,并且会将已连接的套接字作为参数传入用户回调,
这也正是evconnlistener的精髓,无需要用户进行listen、bind、accept等操作

static void
listener_read_cb(evutil_socket_t fd, short what, void *p)
{
    struct evconnlistener *lev = p;
    int err;
    evconnlistener_cb cb;
    evconnlistener_errorcb errorcb;
    void *user_data;
    LOCK(lev);
    while (1) {
        struct sockaddr_storage ss;
        socklen_t socklen = sizeof(ss);
        evutil_socket_t new_fd = accept(fd, (struct sockaddr*)&amp;ss, &amp;socklen);//accept
        if (new_fd &lt; 0)
            break;
        if (socklen == 0) {
            /* This can happen with some older linux kernels in
             * response to nmap. */
            evutil_closesocket(new_fd);
            continue;
        }
        if (!(lev-&gt;flags &amp; LEV_OPT_LEAVE_SOCKETS_BLOCKING))
            evutil_make_socket_nonblocking(new_fd);//non blocking
        if (lev-&gt;cb == NULL) {
            UNLOCK(lev);
            return;
        }
        ++lev-&gt;refcnt;
        cb = lev-&gt;cb;//拿到用户回调
        user_data = lev-&gt;user_data;
        UNLOCK(lev);
        cb(lev, new_fd, (struct sockaddr*)&amp;ss, (int)socklen,
            user_data);//调用用户回调并将connfd传入用户回调
        LOCK(lev);
        if (lev-&gt;refcnt == 1) {
            int freed = listener_decref_and_unlock(lev);
            EVUTIL_ASSERT(freed);
            return;
        }
        --lev-&gt;refcnt;
    }
}

(四)参考

1.libevent programming
2.libevent 深入浅出
blog link libevent——evconnlistener_new_bind(1)

切换shell

切换shell

[toc]

zsh安装

  1. 查看当前系统装了哪些shell
cat /etc/shell
  1. 当前正在运行的是哪个版本的shell
echo $SHELL
  1. 安装zsh
sudo apt-get -y install zsh
  1. 切换zsh
chsh -s /bin/zsh(非实时,需重启)
  1. 查看zsh的主题有哪些
ls ~/.oh-my-zsh/themes/

blog link 切换shell

Win7 使用未签名驱动程序 # issue 标题模板 默认: Win7 使用未签名驱动程序

win7使用未签名驱动程序

操作

具体方法如下:

1、在 win7 64 位系统上,安装某些驱动程序无法成功时,考虑禁用数字签名,重新启动计算机;这是与 XP 系统不同的地方,XP 系统没有这个功能,不用考虑禁用数字签名;

2、在电脑启动的过程中,不用等到进去输入用户登陆框,按键盘上面的按键 F8,就会出现系统启动项,供我们进行选择;

3、然后选择,禁用数字签名,启动电脑,数字签名被禁用后,驱动就能成功安装了。但是重启电脑之后,设置又会恢复成启用数字签名。有些电脑的禁用,是一次性的;

4、我们也可以强制关闭数字签名,进入系统后,使用管理员,在 CMD 运行器中,输入 bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS ;然后会出现禁用成功的提示;

5、再重启电脑,那么系统就会一直默认关闭数字签名了。安装驱动就会成功了。

以上内容就是 win7 64 位系统禁用数字签名的详细步骤,关闭数字签名后,应用程序就可以安装成功了。

可能存在的问题

win7 X64 系统中对驱动程序要求有数字签名,否则无法正常使用。但有时需要用到没有数字签名的驱动程序,可正常安装后驱动是无法使用的,

具体表现如下:

1、无法自动识别硬盘控制器

使用非正版的个别操作系统光盘,在安装系统时,容易出现此错误。原因是非正版光盘自动加载的硬盘控制器驱动不符合电脑自身需要的驱动。这种情况就建议换正版光盘安装操作系统。

2、手动更新错误的驱动程序

windows操作系统正常使用,但手动更新驱动程序把硬盘控制器的驱动程序更新错误,导致此故障。解决方法是进入windows系统高级菜单,选择最后一次的正常配置,即可正常进入系统。

3、bios 设置变化后所导致

windows 操作系统正常,但是由于某些原因,用户修改了 bios 设置,导致 0x0000007b 故障。

①如果只是一次性禁用驱动程序的认证签名,可以在开机时按 <kbd>F8</kbd> 键,在弹出的菜单中有 禁用驱动程序签名强制 选项,使用上下键选中之后,再按回车键确认,进入系统即可使用自己的驱动程序更新设备的驱动程序了。

②尤其是不需要微软的签名驱动程序,还可以这样打开系统属性进行设置:

运行中输入:sysdm.cpl <kbd>→</kbd> 确定

③硬件→设备安装设置

④从不安装来自 Windows Update 的驱动程序软件→保存更改

建议:使用完毕,再改回使用 Windows Update 更新驱动选项,毕竟很多设备都需要使用微软认证签名的驱动程序。

⑤还可以使用命令:

开始→所有程序→附件→右键命令提示符→以管理员身份运行

⑥打开命令提示符,复制以下的命令,右键点击空白处→粘贴→在按回车键:

bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS

命令正确,有操作成功完成的提示。

⑦除此之外,还可以在组策略中进行相关设置:

开始→运行→输入: gpedit.msc 回车打开组策略编辑器。

⑧在窗体左侧选择: 用户配置→管理模板→系统→驱动程序安装→再双击右侧窗口的 设备驱动的代码签名 策略进行设置。

⑨点选→已启用→这里还有三个选择项:警告、忽略、组织(默认是警告)→确定

typora bluebook 自定义修改主题代码 # issue 标题模板 默认: typora bluebook 自定义修改主题代码

说明

  1. 修改了目录中 代码块 的颜色
  2. 修改了编辑页面的最小宽度

代码

@charset &quot;UTF-8&quot;;

/* 自定义表格 */
tr.md-end-block:hover {
  background-color: dodgerblue;
  font-weight: 700;
  color: white;
}

/*** Custom fonts ***/
@import url(&#39;./blubook/fonts.css&#39;);

/*** Color setting ***/
:root {
  --side-bar-bg-color: #183055;
  --active-file-bg-color: #2f4566;
  --active-file-text-color: #ffffff;
  --active-file-border-color: #757575;
  --active-search-item-bg-color: #23242b;
  --item-hover-bg-color: #ececec;
  --item-hover-text-color: #000000;
  --control-text-color: #ddd;
  --window-border: 1px solid #183055;
  --code-cursor: #f0f0f0;
}

/*** Btn in search bar ***/
#filesearch-case-option-btn,
#filesearch-word-option-btn {
  background: var(--side-bar-bg-color);
}

/****** #write basic ******/
#write {
  position: static;
  width: 90%;
  min-width: 90%;
  max-width: 700px;
  line-height: 1.6;
  transform: none;
  height: auto;
}

/****** #write h1-h6 ******/
#write h1,
#write h2,
#write h3,
#write h4,
#write h5,
#write h6,
#write p,
#write pre {
  width: auto;
}

#write h1::before,
#write h2::before,
#write h3::before,
#write h4::before,
#write h5::before,
#write h6::before {
  position: absolute;
  right: calc(100% + 10px);
  bottom: 0;
  color: #b4b4b4;
  font-size: 1rem;
  font-weight: bold;
  font-variant: &#39;small-caps&#39;;
  border: 0;
  border-radius: 0;
  left: auto;
  float: none;
  padding: 0;
}

#write h1 {
  font-size: 2.2rem;
  font-style: normal;
  font-weight: 800;
  line-height: 2;
  margin-top: 14px;
  margin-bottom: 14px;
}

#write h1::before {
  content: &#39;H1&#39;;
  bottom: 1rem;
}

#write h2 {
  font-size: 2rem;
  font-weight: 800;
  font-style: normal;
  line-height: 2;
  margin-top: 14px;
  margin-bottom: 14px;
}

#write h2::before {
  content: &#39;H2&#39;;
  bottom: .85rem;
}

#write h3 {
  font-size: 1.6rem;
  font-weight: 800;
  line-height: 2;
  font-style: normal;
  margin-top: 14px;
  margin-bottom: 14px;
}

#write h3::before {
  content: &#39;H3&#39;;
  top: .44rem;
  padding: 3px 0 3px 0;
}

#write h4 {
  font-size: 1.4rem;
  font-weight: 800;
  line-height: 2;
  font-style: normal;
  margin-top: 14px;
  margin-bottom: 14px;
}

#write h4::before {
  content: &#39;H4&#39;;
  top: .4rem;
}

#write h5,
#write h6 {
  font-size: 1.2rem;
  font-weight: 800;
  line-height: 2;
  font-style: normal;
  margin-top: 14px;
  margin-bottom: 14px;
}

#write h5::before,
#write h6::before {
  top: .2rem;
}

#write h5::before {
  content: &#39;H5&#39;;
}

#write h6::before {
  content: &#39;H6&#39;;
}

h3.md-focus:before,
h4.md-focus:before,
h5.md-focus:before,
h6.md-focus:before {
  color: #ddd;
  color: var(--heading-char-color);
  border: 1px solid;
  border-radius: 3px;
  position: absolute;
  left: -1.642857143rem;
  top: .357142857rem;
  float: left;
  font-size: 9px;
  padding-left: 2px;
  padding-right: 2px;
  vertical-align: bottom;
  font-weight: 400;
  line-height: 2;
}

/****** Global Style ******/
body {
  margin: 0;
  font-family: &#39;Glow Sans SC&#39;, -apple-system, sans-serif;
  font-weight: 500;
  text-rendering: geometricPrecision;
  -webkit-font-smoothing: antialiased;
  -webkit-text-size-adjust: 100%
}

html,
body {
  color: #242A31;
  /* width: 100%; */
  height: 100%;
  margin: 0;
  padding: 0;
  font-size: 14px;
  background: #ffffff;
  box-sizing: border-box;
  line-height: 1rem;
  text-size-adjust: 100%;
  -moz-osx-font-smoothing: grayscale;
  -webkit-text-size-adjust: 100%;
}

hr {
  border-color: #e6ecf1;
  height: 2px;
  border-top: 2px solid #e6ecf1;
}

img {
  max-width: 80%;
  margin-top: 0.2rem;
  margin-bottom: 0.2rem;
}

/****** ul ol Style ******/

ul&gt;li&gt;ul&gt;li {
  list-style-type: circle;
}

ul&gt;li&gt;ul&gt;li&gt;ul&gt;li {
  list-style-type: square;
}

ol,
ul {
  padding-left: 2rem;
  line-height: 1;
}

ol&gt;li {
  list-style-type: decimal
}

ol&gt;li&gt;ol&gt;li {
  list-style-type: lower-alpha
}

ol&gt;li&gt;ol&gt;li&gt;ol&gt;li {
  list-style-type: lower-roman
}

/****** Table Style ******/

table {
  padding: 0;
  word-break: initial;
}

table tr {
  border-top: 1px solid #dfe2e5;
  margin: 0;
  padding: 0;
}

table tr:nth-child(2n),
thead {
  background-color: #f5f7f9;
}

table tr th {
  font-weight: bold;
  border: 1px solid #dfe2e5;
  border-bottom: 0;
  margin: 0;
  padding: 6px 13px;
}

table tr td {
  border: 1px solid #dfe2e5;
  margin: 0;
  padding: 6px 13px;
}

table tr th:first-child,
table tr td:first-child {
  margin-top: 0;
}

table tr th:last-child,
table tr td:last-child {
  margin-bottom: 0;
}


/****** YAML Style ******/
pre.md-meta-block {
  font-size: .85rem !important;
  color: #5d5d5d;
  min-height: .8rem;
  white-space: pre-wrap;
  background: #f5f7f9;
  display: block;
  overflow-x: hidden;
  padding: 1rem;
  border-radius: 8px;
}



/****** Global Text ******/
p {
  font-size: 16px;
  font-family: &quot;Glow Sans SC&quot;, -apple-system, sans-serif;
  font-weight: 500;
  line-height: 1.6;
  font-style: normal;
  color: rgb(59, 69, 78);
}

a {
  /* color: rgb(164, 78, 237); */
  color: rgb(56, 132, 254);
  font-weight: 500;
  text-decoration: none;
  text-decoration-style: none;
  cursor: pointer;
  padding: 0 3px 0 3px;
}

#write a:hover {
  color: rgb(56, 132, 254);
  text-decoration: underline;
  text-decoration-style: solid;
}

strong {
  font-weight: 700;
}

mark {
  background: #87CEFA;
  padding: 0 2px 0 2px;
  margin: 0 2px 0 2px;
}

h1 {
  font-size: 2rem;
  font-style: normal;
  font-weight: 800;
  line-height: 2;
  margin-top: 14px;
  margin-bottom: 14px;
}

h2 {
  font-size: 1.8rem;
  font-weight: 800;
  font-style: normal;
  line-height: 2;
  margin-top: 14px;
  margin-bottom: 14px;
}

h3 {
  font-size: 1.6rem;
  font-weight: 800;
  line-height: 2;
  font-style: normal;
  margin-top: 14px;
  margin-bottom: 14px;
}

h4 {
  font-size: 1.2rem;
  font-weight: 800;
  line-height: 2;
  font-style: normal;
  margin-top: 14px;
  margin-bottom: 14px;
}

h5,
h6 {
  font-size: 1rem;
  font-weight: 800;
  line-height: 2;
  font-style: normal;
  margin-top: 14px;
  margin-bottom: 14px;
}


/****** Print header ******/
@media print {
  .typora-export * {
    -webkit-print-color-adjust: exact;
  }

  #write h1::before {
    content: &#39;&#39;;
    bottom: 1rem;
  }

  #write h2::before {
    content: &#39;&#39;;
    bottom: 1rem;
  }

  #write h3::before {
    content: &#39;&#39;;
    bottom: 1rem;
  }

  #write h4::before {
    content: &#39;&#39;;
    bottom: 1rem;
  }

  #write h5::before {
    content: &#39;&#39;;
    bottom: 1rem;
  }

  #write h6::before {
    content: &#39;&#39;;
    bottom: 1rem;
  }


}


/****** #write Code Fences ******/
#write .md-fences {
  -webkit-font-smoothing: initial;
  margin: 1rem 0 1rem 0 !important;
  line-height: 1.43rem;
  border-radius: 3px;
  font-size: 0.95rem;
  word-wrap: normal;
}


#write .CodeMirror-wrap .CodeMirror-code pre {
  padding-left: 30px;
  line-height: 1.55rem;
}

#write .CodeMirror-cursors .CodeMirror-cursor {
  border-left: 2px solid var(--code-cursor);
}

#write code,
tt {
  margin: 0 2px;
  padding: 4px 6px;
  border-radius: 6px;
  font-size: 0.92rem !important;
  background: #f5f7f9;
  display: inline;
  vertical-align: bottom;
  line-height: 1.8;
}

#write .md-footnote {
  color: var(--main-5);
  background-color: var(--main-1);
}

.cm-s-inner.CodeMirror,
.cm-s-inner .CodeMirror-gutters {
  padding: 0.75rem 0.15rem 0.75rem 0.15rem;
  background-color: #183055 !important;
  color: #f8f8f2 !important;
  border: none;
  border-radius: 6px;
}


.code-tooltip {
  box-shadow: 0 1px 1px 0 rgba(0, 28, 36, .3);
  border-top: 1px solid #eef2f2;
  background: #183055;
  border-radius: 6px;
}

.md-fences {
  font-size: .9rem;
  position: relative !important;
  display: block;
  page-break-inside: avoid;
  text-align: left;
  overflow: visible;
  white-space: pre;
  background: inherit;
}

.md-fences {
  background-color: #f8f8f8;
  margin-bottom: 15px;
  margin-top: 15px;
  padding-top: 8px;
  padding-bottom: 6px;
}

.md-fences,
tt {
  border-radius: 3px;
  /* color: #f0f0f0; */
  padding: 0;
  font-size: 0.9rem;
}

/****** Sidebar ******/
#typora-sidebar * {
  /* color: #f0f0f0; */
  color: white;
}

code {
  color: #3399CC!important;
  font-weight: 700;
}

#typora-sidebar .file-tree-node.file-library-file-node.active .file-node-background {
  border-left: 5px solid #3884ff;
  height: 2.2rem;
}

#sidebar-files-menu {
  border: 1px solid rgba(0, 2, 3, 0.7);
}

.file-list-item {
  border-bottom: var(--window-border);
}

.file-list-item {
  overflow: hidden;
  padding: 12px;
  border-bottom: 1px solid #eee;
  border-bottom: var(--window-border);
  cursor: pointer;
  padding-right: 8px;
  padding-top: 12px;
  padding-left: 24px;
  transition: top .5s;
  -webkit-transition: top .5s;
}

.file-list-item.active {
  background: #2f4566;
  /* background: var(--active-file-bg-color); */
  color: var(--active-file-text-color);
  border-radius: 12px;
}

.file-list-item:not(.active) {
  opacity: .9;
}

.file-node-content {
  padding-top: 6px;
  margin: 0 0 8px 0;
  cursor: default;
  color: var(--control-text-color);
  white-space: nowrap;
  height: 2.2rem;
  line-height: 1.5;
}

.ty-on-drag-enter {
  background-color: #2f4566;
  color: var(--item-hover-text-color);
}

.file-node-content:active {
  border-radius: 0px !important;
  background: #2f4566;
}

.active .file-node-content {
  font-weight: bold;
}

.file-node-content:hover {
  cursor: pointer;
  border-radius: 0px !important;
}

.file-node-icon,
.file-node-open-state {
  display: block;
  float: left;
  line-height: 1.5;
  min-height: 15px;
}

.file-node-icon {
  margin-right: 6px;
}

.file-list-item-file-name {
  font-weight: 700;
  margin-bottom: 3px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  width: 100%;
  line-height: 2;
}

.sidebar-footer {
  background: var(--side-bar-bg-color);
  border-top: 1px #555 solid;
}

.html-for-mac #file-library-search-input {
  border: 0;
  border-bottom: 1px solid #ccc;
  line-height: 16px;
  margin: 5px 16px 0px 0;
  width: 0;
  /* -webkit-flex: 1; */
  flex: 1;
  background: 0 0;
  color: #bbc0ca !important;
  /* transform: translateY(-3px); */
  /* overflow: auto; */
  padding-top: 6px;
}

#typora-sidebar #ty-sidebar-footer .sidebar-footer-item:hover {
  background: #021d43;
}

#typora-sidebar #outline-content .outline-item:hover {
  background: #202020;
}

#typora-sidebar #ty-sidebar-footer #sidebar-files-menu .show+.menuitem-group-label.show {
  border-color: #202020;
}

#typora-sidebar #ty-sidebar-footer {
  border-top: 1px solid #19191c;
}

#typora-sidebar #ty-sidebar-footer #sidebar-files-menu li&gt;a:hover {
  background: #021d43;
}

#typora-sidebar #ty-sidebar-footer #sidebar-files-menu .ty-side-sort-btn.active,
#typora-sidebar #ty-sidebar-footer #sidebar-files-menu .ty-side-sort-btn:hover {
  color: #3884FF;
}

#typora-sidebar #ty-sidebar-footer #sidebar-files-menu .ty-side-sort-btn.active {
  background: #001129;
}

#typora-sidebar .file-list-item.file-library-node:not(.active):hover {
  background: #243959;
  border-radius: 12px;
}

#typora-sidebar .file-tree-node.file-library-file-node:not(.active):hover .file-node-background {
  background: #243959;
  border-radius: 12px;
  height: 2.2rem;
}

/****** Quote style ******/
blockquote {
  position: relative;
  /*  margin: 1rem 1 1rem 2rem; */
  padding: 1rem;
  color: #827676;
  background-color: #f5f7f9;
  border-radius: 6px;
  line-height: 1;
}

blockquote::before {
  content: &#39;&#39;;
  position: absolute;
  top: 0rem;
  left: 0rem;
  height: 100%;
  width: .30rem;
  background: #3884ff;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}

/****** task list style ******/
.task-list {
  padding-left: 0;
}

.md-task-list-item&gt;input {
  top: -0.2rem;
  margin-left: -1.6rem;
  margin-top: calc(1rem + 1px);
  -webkit-appearance: initial;
}

.md-task-list-item&gt;input:before {
  border: 1px solid#0185ff;
  border-radius: 1rem;
  width: 1rem;
  height: 1rem;
  background: #fff;
  content: &#39; &#39;;
  transition: background-color 200ms ease-in-out;
  display: block;
}

.md-task-list-item&gt;input:checked:before,
.md-task-list-item&gt;input[checked]:before {
  background: #0185ff;
  border-width: 1px;
  transition: background-color 200ms ease-in-out;
}

.md-task-list-item&gt;input:checked:after,
.md-task-list-item&gt;input[checked]:after {
  opacity: 1;
}

.md-task-list-item&gt;input:after {
  opacity: 1;
  -webkit-transition: opacity 0.05s ease-in-out;
  -moz-transition: opacity 0.05s ease-in-out;
  transition: opacity 0.05s ease-in-out;
  -webkit-transform: rotate(-45deg);
  -moz-transform: rotate(-45deg);
  transform: rotate(-45deg);
  position: absolute;
  top: 0.25rem;
  left: 0.19rem;
  width: 0.6rem;
  height: 0.375rem;
  border: 2px solid #fff;
  border-top: 0;
  border-right: 0;
  content: &#39; &#39;;
  opacity: 0;
}

/****** Source style ******/
.typora-sourceview-on #write {
  display: none
}

#typora-source {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: inherit;
  padding-right: 0;
  padding-left: 0;
  padding-top: 0;
  display: none;
  line-height: 1.5
}

.mac-seamless-mode #typora-source {
  top: 20px
}

#typora-source .CodeMirror {
  height: 100%;
  overflow-x: hidden
}

#typora-source .CodeMirror-gutters {
  left: initial !important
}

#typora-source .CodeMirror-lines {
  padding-top: 30px;
  padding-bottom: 60px;
  padding-left: 60px;
  padding-right: 30px;
  max-width: 800px;
  margin: 0 auto
}

#typora-source .CodeMirror-wrap .CodeMirror-scroll {
  overflow-y: auto
}

.CodeMirror-activeline .cm-trailing-space-new-line:after {
  opacity: .6
}

.CodeMirror-activeline .cm-starttab .cm-tab:after {
  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
  background-position: right;
  background-repeat: no-repeat;
  width: 100%;
  opacity: 1
}

.CodeMirror-activeline .cm-startspace:after,
.CodeMirror-activeline .cm-trailing-space-new-line:after {
  opacity: .2
}

.cm-s-inner .CodeMirror-vscrollbar {
  display: none !important
}

#typora-source .CodeMirror-gutter-wrapper {
  position: absolute !important;
  left: -6ch !important;
  min-width: 4ch !important;
  text-align: right;
  font-family: monospace;
  font-size: .8rem;
  margin-top: .1rem;
  display: inline-block;
  opacity: .6
}

#typora-source .CodeMirror-linenumber {
  width: auto !important;
  visibility: hidden
}

#typora-source .CodeMirror-sizer {
  margin-left: 0 !important
}

#typora-source .CodeMirror-gutter {
  min-width: 4ch !important
}

#typora-source .CodeMirror-activeline .CodeMirror-linenumber,
#typora-source .CodeMirror-linenumber.CodeMirror-linenumber-show {
  visibility: visible
}

#typora-source .CodeMirror-code&gt;.CodeMirror-activeline::before,
#typora-source .CodeMirror-code&gt;:first-child::before,
#typora-source .CodeMirror-code&gt;:last-child::before,
#typora-source .CodeMirror-code&gt;:nth-child(10n)::before {
  visibility: visible
}

.cm-s-typora-default .cm-header1:not(.cm-atom):not(.cm-s-inner) {
  font-size: 2.2rem;
}

.cm-s-typora-default .cm-header2:not(.cm-atom):not(.cm-s-inner) {
  font-size: 2rem;
}

.cm-s-typora-default .cm-header3:not(.cm-atom):not(.cm-s-inner) {
  font-size: 1.6rem;
}

.cm-s-typora-default .cm-header4:not(.cm-atom):not(.cm-s-inner) {
  font-size: 1.4rem;
}

.cm-s-typora-default .cm-header5:not(.cm-atom):not(.cm-s-inner) {
  font-size: 1.2rem;
}

.cm-s-typora-default .cm-header6:not(.cm-atom):not(.cm-s-inner) {
  font-size: 1.2rem;
}

.cm-s-typora-default .cm-header,
.cm-s-typora-default .cm-property {
  color: #183055 !important;
}

pre.CodeMirror-line {
  page-break-inside: avoid;
}

/****** Code style ******/
code {
  font-size: .9rem;
  /*   color: #333333; /*  #537AA2;  
      border: 1px solid #d0d0d0;  */
  font-family: &#39;Cascadia Code&#39;, Consolas, &#39;Noto Sans SC&#39;, &#39;Courier New&#39;, monospace;
  padding: .2rem .2rem;
  border-radius: 3px;
  background: #f5f7f9 !important;
  display: inline;
  vertical-align: bottom;
  line-height: 1.8;
}

code,
pre {
  font-size: 95% !important;
  font-weight: normal;
  font-family: &#39;Cascadia Code&#39;, Consolas, &#39;Noto Sans SC&#39;, &#39;Courier New&#39;, monospace;
  -webkit-font-smoothing: initial;
  -moz-osx-font-smoothing: initial
}

/****** The flow chart ******/
pre.md-fences[lang=sequence].md-focus .md-diagram-panel,
pre.md-fences[lang=flow].md-focus .md-diagram-panel,
pre.md-fences[lang=mermaid].md-focus .md-diagram-panel {
  position: -webkit-sticky;
  border: 1px solid #777;
  border-radius: 6px;
  margin-top: 6px;
}

.code-tooltip .ty-input,
.code-tooltip input {
  background-color: transparent;
  border: 0;
  margin-top: 2px;
  margin-bottom: 2px;
  margin-left: 0;
  margin-right: 0;
  border-radius: 3px;
  text-align: center;
  min-width: 140px;
  display: inline-block;
  padding: 0 4px;
  line-height: 1.5;
  color: #fff;
}

.enable-diagrams pre.md-fences[lang=sequence] .code-tooltip,
.enable-diagrams pre.md-fences[lang=flow] .code-tooltip,
.enable-diagrams pre.md-fences[lang=mermaid] .code-tooltip {
  right: 8px;
  bottom: -2.2em;
}

/****** Windows contral ******/
.megamenu-menu-list li a.active,
.megamenu-menu-list:not(.saved) li a:hover {
  background-color: #285e8e;
}

/****** Fix ******/
.md-tab {
  display: inline-block;
  white-space: pre;
  font-family: initial;
}

div.md-mathjax-preview.mathjax-candidate.mathjax-candidate-show {
  background-color: white !important;
  -webkit-user-modify: read-only;
}

.mathjax-candidate {
  text-align: center;
  padding-top: inherit;
  overflow-x: auto;
  padding: 10px 0;
  background-color: white;
}

input {
  font-weight: bold;
  background-color: inherit;
  background-color: var(--bg-color);
  color: var(--text-color) !important;
}

#write input {
  transform: translateY(-6.5px);
}

.task-list {
  padding-left: 0;
}

.md-task-list-item&gt;input {
  top: -0.2rem;
  margin-left: -1.6rem;
  margin-top: calc(1rem + 1px);
}

.auto-suggest-container li {
  padding: 1px;
  padding-left: 10px;
  padding-right: 10px;
  cursor: pointer;
  -webkit-user-select: none;
  user-select: none;
  min-width: 124px;
  position: relative;
  line-height: 1.4;
}

.auto-suggest-container {
  border: 1px solid #ddd;
  border-radius: 3px;
  box-shadow: 0 0 1px rgba(0, 0, 0, .1);
  position: fixed;
  background-color: #fff;
  background-color: var(--bg-color);
  z-index: 10;
  font-size: .9rem;
  display: none;
  padding: 4px 6px 4px 6px;
  line-height: 20px;
}

/****** Code highlight ******/
.cm-s-inner .CodeMirror-guttermarker,
.cm-s-inner .CodeMirror-guttermarker-subtle,
.cm-s-inner .CodeMirror-linenumber {
  color: #596774;
}

.cm-s-inner .CodeMirror-cursor {
  border-left: 1px solid #f8f8f0;
}

.cm-s-inner div.CodeMirror-selected {
  background: rgba(255, 255, 255, 0.15);
}

.cm-s-inner.CodeMirror-focused div.CodeMirror-selected {
  background: rgba(255, 255, 255, 0.10);
}

.cm-s-inner .CodeMirror-line::selection,
.cm-s-inner .CodeMirror-line&gt;span::selection,
.cm-s-inner .CodeMirror-line&gt;span&gt;span::selection {
  background: rgba(255, 255, 255, 0.10);
}

.cm-s-inner .CodeMirror-line::-moz-selection,
.cm-s-inner .CodeMirror-line&gt;span::-moz-selection,
.cm-s-inner .CodeMirror-line&gt;span&gt;span::-moz-selection {
  background: rgba(255, 255, 255, 0.10);
}

.cm-s-inner .CodeMirror-activeline-background {
  background: rgba(0, 0, 0, 0);
}

.cm-s-inner .cm-keyword {
  color: rgba(199, 146, 234, 1);
}

.cm-s-inner .cm-operator {
  color: rgba(233, 237, 237, 1);
}

.cm-s-inner .cm-variable-2 {
  color: #80CBC4;
}

.cm-s-inner .cm-variable-3 {
  color: #82B1FF;
}

.cm-s-inner .cm-builtin {
  color: #DECB6B;
}

.cm-s-inner .cm-atom {
  color: #F77669;
}

.cm-s-inner .cm-number {
  color: #F77669;
}

.cm-s-inner .cm-def {
  color: rgba(233, 237, 237, 1);
}

.cm-s-inner .cm-string {
  color: #C3E88D;
}

.cm-s-inner .cm-string-2 {
  color: #80CBC4;
}

.cm-s-inner .cm-comment {
  color: #aebcc2;
}

.cm-s-inner .cm-variable {
  color: #82B1FF;
}

.cm-s-inner .cm-tag {
  color: #80CBC4;
}

.cm-s-inner .cm-meta {
  color: #80CBC4;
}

.cm-s-inner .cm-attribute {
  color: #FFCB6B;
}

.cm-s-inner .cm-property {
  color: #80CBAE;
}

.cm-s-inner .cm-qualifier {
  color: #DECB6B;
}

.cm-s-inner .cm-variable-3 {
  color: #DECB6B;
}

.cm-s-inner .cm-tag {
  color: rgba(255, 83, 112, 1);
}

.cm-s-inner .cm-error {
  color: rgba(255, 255, 255, 1.0);
  background-color: #EC5F67;
}

.cm-s-inner .CodeMirror-matchingbracket {
  text-decoration: underline;
  color: white !important;
}

.cm-s-inner .cm-header,
.cm-s-inner.cm-header {
  color: #334EEA;
}

.md-fences .code-tooltip {
  background-color: #263238;
}

共享文件夹

共享文件夹

最近由于项目需求,需要编写一个监控本机共享文件夹的变化的模块,经过查询资料,找到并实现了一个较为稳定的方式
项目实现是使用Win32 C++的,测试平台是Win 7 64和Win 10 64,XP测试也是好使的。下面是具体实现

首先要获取并监控系统共享文件夹的路径,相关注册表路径为 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Share ,他的值的格式为如图所示,

共享文件注册表

C++ 获取共享文件夹目录

BOOL GetSharedFoldersList(map&lt;CString, HANDLE&gt; &amp;theList)
{
	BOOL bFlag = FALSE;
	HKEY hKey = NULL;
	do
	{
		//清空列表
		theList.clear();
 
		//HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Share
		//通过注册表获取共享文件夹列表
		HKEY rootKey = REG_SHARE_KEY;
		CString szRegPath = REG_SHARE_PATH;
		
		int ErrCode;
		if (ERROR_SUCCESS != (ErrCode = RegOpenKeyEx(rootKey, szRegPath, 0, KEY_READ | KEY_WOW64_64KEY, &amp;hKey)))
		{
			break;
		}
 
		TCHAR szValue[MAX_VALUE_NAME] = { 0 };
		DWORD dwValueSize = MAX_VALUE_NAME;
		int index = 0;
		DWORD dwBufferSize = 255;
		DWORD dwType;
		TCHAR *szValBuffer = NULL;
		DWORD dwSize;
		while (ERROR_NO_MORE_ITEMS != RegEnumValue (
			hKey, index, szValue, &amp;dwValueSize, NULL, &amp;dwType, NULL, &amp;dwBufferSize))
		{
			//判断值类型
			switch(dwType)
			{
				//只找多个串的值
			case REG_MULTI_SZ:
				{
					dwSize = dwBufferSize + 1;
					szValBuffer = new TCHAR[dwSize];
					ZeroMemory(szValBuffer, dwSize);
					if (ERROR_SUCCESS != RegQueryValueEx(hKey, szValue, 0, &amp;dwType, (LPBYTE)szValBuffer, &amp;dwBufferSize))
					{
						break;
					}
					int j = 0;
 
					CString TmpValue;
 
					for(int i = 0;szValBuffer[i] != &#39;\0&#39; ;i += j + 1)
					{	
						for (j = 0;szValBuffer[i + j] != &#39;\0&#39;;j ++)
						{
							TmpValue += szValBuffer[i + j];
						}
						
						//如果找到共享路径,则直接放入容器,然后进行下一个路径的查找
						if (TmpValue.Find(_T(&quot;Path=&quot;)) == 0)
						{
							//m_vSharedList.push_back(TmpValue.Right(TmpValue.GetLength() - 5));
							CString Tmp = TmpValue.Right(TmpValue.GetLength() - 5);
							CString szTmp = Tmp;
							Tmp.MakeLower();
 
							break;
						}
						TmpValue = _T(&quot;&quot;);
					}
					delete szValBuffer;
					szValBuffer = NULL;
					break;
				}
 
			//其他类型跳过
			default:
				{
					break;
				}
			}
			dwValueSize = MAX_VALUE_NAME;
			dwBufferSize = 255;
			index ++;
		}
		bFlag = TRUE;
	}while(FALSE);
 
	if (hKey != NULL)
	{
		RegCloseKey(hKey);
	}
 
	return bFlag;
}

C++监控共享注册表变化

//监控注册表项以更新共享文件夹列表
DWORD WINAPI SharedMonitor::RefreshThread(LPVOID lpParam)
{
	SharedMonitor *pThis = (SharedMonitor *)lpParam;
 
	//只监控值的改变
	DWORD  dwFilter = REG_NOTIFY_CHANGE_LAST_SET;
 
	HKEY hKey;
	HKEY rootKey = REG_SHARE_KEY;
	CString szRegPath = REG_SHARE_PATH;
 
	//等待10分钟
	int iWaitTime = 10 * 60 * 1000;
	while (TRUE)
	{
		//监控注册表项改变
		//Sleep(iWaitTime);
		HANDLE hEvent;
		BOOL bFlag = FALSE;
		do
		{
			if (ERROR_SUCCESS != RegOpenKeyEx(rootKey, szRegPath, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &amp;hKey))
			{
				MyDebugA (&quot;RegMonitorThread--- RegOpenKeyEx ERR!&quot;);
				break;
			}
 
			if (NULL == (hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
			{
				MyDebugA (&quot;CreateEvent ERR&quot;);
				break;
			}
 
			if (ERROR_SUCCESS != RegNotifyChangeKeyValue (hKey, TRUE, dwFilter, hEvent, TRUE))
			{
				MyDebugA (&quot;RegNotifyChangeKeyValue ERR&quot;);
				break;
			}
 
			if (WAIT_FAILED == WaitForSingleObject (hEvent, INFINITE))
			{
				MyDebugA (&quot;WaitForSingleObject ERR&quot;);
				break;
			}
 
			bFlag = TRUE;
		}while(FALSE);
		
		RegCloseKey (hKey);
 
		CloseHandle (hEvent);
 
		//如果监控失败,则重新再来
		if (!bFlag)
		{
			continue;
		}
 
		//等待系统将注册表消息发放完毕,否则有时候添加或删除的注册表项无法被枚举到
		Sleep(200);
 
		//进行共享列表枚举和比较
		map&lt;CString, HANDLE&gt; theNewList;
		//获取新列表
		pThis-&gt;GetSharedFoldersList(theNewList);
		map&lt;CString, HANDLE&gt; &amp;theOldList = pThis-&gt;GetListInstance();
 
		BOOL bFindNew = FALSE;
		//比较两个列表
		//添加旧列表中没有的共享
		for (map&lt;CString, HANDLE&gt;::iterator it = theNewList.begin();
				it != theNewList.end(); ++it)
		{
			if (theOldList.find(it-&gt;first) == theOldList.end())
			{
				MyDebug(_T(&quot;----------Find New Share----------&quot;));
				MyDebug(it-&gt;first);
				theOldList[it-&gt;first] = 0;
				bFindNew = TRUE;
			}
		}
 
		//MyDebug(_T(&quot;---------Start Delete--------&quot;));
 
		//需要删除的列表,map不支持循环删除多个元素
		vector&lt;CString&gt; theDeleteList;
 
		//删除旧列表中已经取消的共享
		for (map&lt;CString, HANDLE&gt;::iterator it = theOldList.begin();
			it != theOldList.end(); ++it)
		{
			if (theNewList.find(it-&gt;first) == theNewList.end())
			{
				//结束监控线程
				if (!TerminateThread(it-&gt;second, 0))
				{
					MyDebug(_T(&quot;TerminateThread ERR&quot;));
					MyDebug(it-&gt;first);
				}
 
				//将线程占用的共享目录句柄释放
				if (gs_mpDirHandleList[it-&gt;first])
				{
					CloseHandle(gs_mpDirHandleList[it-&gt;first]);
				}
				
				CloseHandle(it-&gt;second);
				
				theDeleteList.push_back(it-&gt;first);
			}
		}
 
		MyDebug(_T(&quot;-----------DeleteList-------------&quot;));
		//删除旧列表中的过期共享
		for (vector&lt;CString&gt;::iterator it = theDeleteList.begin();
				it != theDeleteList.end(); ++it)
		{
			theOldList.erase(*it);
			MyDebug(*it);
		}
 
		//如果有新的共享
		if (bFindNew)
		{
			pThis-&gt;SetSharedMonitor();
		}
	}
 
	return 0;
}

共享文件夹内文件监控

最后就是最终的目的,对共享文件夹内文件的变化进行监控操作。这里使用的是 WIN32 API ReadDirectoryChangesW ,这个的具体使用在我之前的一篇文章里有介绍,这里就不多说了,需要注意的一点是 ReadDirectoryChangesW 函数的第一个参数所需的句柄需要 CreateFile 去创建,而且创建后需要一直占用着不能释放,而创建时所需的权限(第三个参数) 必须设置为 "FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE",因为如果少任意一个就有可能导致某些第三方软件的使用出现异常,例如迅雷下载,浏览器下载之类的。

//监控线程
DWORD WINAPI ATSharedMonitor::MonitorThread(LPVOID lpParam)
{
	CString szRootPath = *(CString *)lpParam;
 
 
	HANDLE hRootHandle = CreateFile(
		szRootPath,		//监控路径
		FILE_LIST_DIRECTORY, 
		FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
		NULL,
		OPEN_EXISTING,
		FILE_FLAG_BACKUP_SEMANTICS/* | FILE_FLAG_OVERLAPPED*/,
		NULL);
	if(FAILED_HANDLE(hRootHandle))
	{
		MyDebug(_T(&quot;CreateFile Fail&quot;));
		return 0;
	}
 
	//将目录句柄放到线程对应容器中
	gs_mpDirHandleList[szRootPath] = hRootHandle;
 
//	OUTPUT_PARAM_DEBUGA(&quot;The CurrentThread:%X&quot;, GetCurrentThread());
 
	szRootPath += _T(&quot;\\&quot;);
 
	wchar_t notify[1024];
	ZeroMemory(notify, 1024);
	DWORD dwBytes;
	FILE_NOTIFY_INFORMATION *pNotify = (FILE_NOTIFY_INFORMATION *)notify;
 
	//过滤同一个文件的操作 
	CString szLastFile = _T(&quot;&quot;);
 
	while (TRUE)
	{
		if (ReadDirectoryChangesW (hRootHandle, &amp;notify, sizeof(notify), TRUE,
			FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_FILE_NAME | 
			FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE,
			&amp;dwBytes, NULL, NULL))
		{
			MyDebug(_T(&quot;---------Change Happened!------------&quot;));
			
 
			pNotify-&gt;FileName[pNotify-&gt;FileNameLength / 2] = &#39;\0&#39;;
			//CString tmp = pNotify-&gt;FileName;
			//tmp.MakeLower ();
 
			CString TmpPath = szRootPath + pNotify-&gt;FileName;
 
			switch(pNotify-&gt;Action)
			{
				//重命名获取
 			case FILE_ACTION_RENAMED_OLD_NAME:
 				{
 					MyDebug (TEXT(&quot;文件更名 :&quot;) + TmpPath);
 					PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify-&gt;NextEntryOffset);
 					p-&gt;FileName[p-&gt;FileNameLength/2] = &#39;\0&#39;;
 					CString newName = szRootPath + p-&gt;FileName;
 					MyDebug(newName);
 
 					break;
 				}
				
 
				//删除
// 			case FILE_ACTION_REMOVED:
// 				{
// 					MyDebug (TEXT(&quot;文件删除 :&quot;) + TmpPath);
// 				}
 
				//修改..略过文件夹的修改,过滤同一个文件的修改
			case FILE_ACTION_MODIFIED:
				{
 
					if (!PathIsDirectory(TmpPath) /*&amp;&amp; szLastFile.CompareNoCase(pNotify-&gt;FileName) != 0*/)
					{
						//szLastFile = pNotify-&gt;FileName;
						MyDebug (TEXT(&quot;文件修改 :&quot;) + TmpPath);
						
					}
					break;
				}
 
				//新建文件获取
			case FILE_ACTION_ADDED:
			 	{
					if (!PathIsDirectory(TmpPath) /*&amp;&amp; szLastFile.CompareNoCase(pNotify-&gt;FileName) != 0*/)
					{
			 			MyDebug (TEXT(&quot;文件添加 :&quot;) + TmpPath);
						
					}
			 		break;
			 	}
 
			default:
				{
					break;
				}
 
			}
		}
	}
	return 0;
}

blog link 共享文件夹

windows 查看进程启动参数命令行 # issue 标题模板 默认: windows 查看进程启动参数命令行

Windows 查看进程启动参数命令行

使用wmic查看

wmic process where caption=&quot;【进程名】&quot; get caption,commandline /value

也可以通过打印所有的命令行参数之后进行筛选

wmic process get caption,commandline /value | findstr &quot;【进程名,特征字符串等】&quot;

使用任务管理器查看

打开任务管理器,在<kbd>详细信息</kbd>栏,右击标题列-&gt;选择列,找到命令行,勾选即可。

选择命令行列

第7章 网络安全

第7章 网络安全

本章只是对计算机网络安全问题进行初步的介绍。

本章最重要的内容是:

  1. 计算机完了过面临的安全性威胁和计算机网络安全的主要问题
    blog link 第7章 网络安全

函数声明 # issue 标题模板 默认: 函数声明

函数声明

/*
* @fn           $MethodName$
* @brief        
* @param[in]    
* @param[out]   
* @return       
*               
* @detail      
*/

文件声明

/********************************************************************************
 *
 *        Copyright (C) 2022 QIANXIN
 *        All rights reserved
 *
 *        filename:    $FILE$
 *        description: 
 *
 *        created by  shi.mingming on $DATE$
 *
 ********************************************************************************/

TODO

// TODO([email protected]): what: when:? how:?

友元

友元

[toc]

友元

C++ 提供了另外一种形式的访问权限:友元。友元有3种:

  • 友元函数
  • 友元类
  • 友元成员函数

通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。

为何需要友元

> 在为类重载二元运算符时(带两个参数的运算符)常常需要友元。将 Time 对象乘以实数就属于这种情况。

下面的语句:

A = B * 2.75

将被转换成:

A = B.operator*(2.75);

但下面的语句又如何呢?

A = 2.75 * B;

从概念上说,2.75*BB*2.75 相同,但第一个表达式不对应于成员函数,因为2.75不是 Timer 类型的对象。记住,左侧的操作数应是调用对象,但2.75不是对象。因此,编译器不能使用成员函数调用来替换该表达式。

解决这个难题的一种方式是,告知每个人(包括程序员自己),只能按 B*2.75 的格式编写,不能写成2.75*B。这是一种对服务器友好-客户警惕的(server-friendly, client-beware)解决方案,与OOP无关。

当然,上述的问题也有解决方案——非成员函数。非成员函数不是由对象调用的,它使用的所有值(包括对象)都是显式参数。这样,编译器能够将下面的表达式:

A = 2.75 * B;

与下面的非成员函数调用匹配:

A = operator*(2.75,B);

该函数的原型如下:

Time operator*(double m, const Time &amp;t);

对于非成员重载运算符函数来说,运算符表达式左边的操作数对应于运算符函数的第一个参数,运算符表达式右边的操作数对应于运算符函数的第二个参数。而原来的成员函数可以访问类的私有成员,它们被称为友元函数。

创建友元

创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字 friend:

friend Time operator*(double m, const Time &amp; t);

该原型意味着下面两点:

  • 虽然 operator*() 函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;
  • 虽然 operator*() 函数不是成员函数,但它与成员函数的访问权限相同。

第二步是编写函数定义。因为它不是成员函数,所以不要使用 Time:: 限定符。另外,不要在定义中使用关键字 friend,定义如下:

Time operator*(double m,const Tlme &amp; t)// frlend not ued in definition
{
    Time result; 
    long totalminutes = t.hours * m * 60 + t.minutes * m;
    result.hours = totalminutes/60;
    result.minutes = totalminutes % 60;
    return result;
}

总之,类的友元函数是非成员函数,其访问权限与成员函数相同。
blog link 友元

密钥分配

密钥分配

密钥分配

由于密码算法是公开的,网路的安全性就完全基于密钥的安全保护上。因此在密码学中出现了一个重要的分支——密钥管理。密钥管理包括:密钥的产生、分配、注入、验证和使用。本节只讨论密钥的分配。

> 密钥分配(或密钥分发)是密钥管理中最大的问题。密钥必须通过最安全的通路进行分配。
>
> 例如,可以派非常可靠的信使携带密钥分配给互相通信的各用户。这种方法称为网外分配方式。但随着用户的增多和网络流量的增大,密钥更换频繁(密钥必须定期更换才能做到可靠),派信使的办法已不再使用,而应采用网内分配方式,即对密钥自动分配。
blog link 密钥分配

临时文件 # issue 标题模板 默认: 临时文件

[toc]

人文环境的形成是常年累月的积淀,是人的改造与自然的打磨巧妙结合形成的,因此也蕴含了独特的精神力量和难得的物质底色。从物质文化和精神文化两个角度来看,对人文环境中的建筑进行设计所受到的牵制较多。纵向看,有历史文化的影响;横向看,有地域因素的制约;另一个方面,观者的审美角度、使用者的生活习惯,以及人们道德规范的约束都是人文环境中对建筑消隐的重要因素。在这种情况下,做到“消隐”,需要设计师考虑各方面的因素,从而做出更能突出建筑特,又能达到“消隐”目的的设计方案。以下结合三个相对典型的案例进行具体的分析。

建筑设计环节需要考虑的因素除了人文环境、造价、风格之外,也应考虑到建筑技术对建筑设计的提升。不仅如此,建筑技术可以说是建筑创作中重要的一个环节,其最终体现在建筑的空间形态上,建筑形态是否优美、是否达到了效果,又可以直接反馈出建筑技术的使用情况。建筑技术的要素包括材料、结构、施工等不同的类别,从选材到施工,每一个技术环节都有其对应的使用环境,充分利用这一特定环境,从而有效地利用建筑技术对每个环节进行改造和提升。这也能充分体现环境整体观的理念。

社会访谈: 一名工程师眼中的新时代及启示

深入访谈一个自己的长辈,请其介绍职业经历和人生阅历,并通过这个切入点,以小见大介绍其对国家发展的看法感受,记述其访谈内容及对自己未来的启示。

访谈对象:

访谈对象:同学的舅舅

性别:男

年龄:48

职业:结构工程师

单位:中建一局某分公司

职务:工程师

从业年数:22

访谈时间:2022.11.26

访谈形式:电话

访谈内容:

  1. 您是如何找到这份工作的?

当时工作还是包分配的,毕业后我选择了去中建。

  1. 就您的工作而言,您最喜欢什么?最不喜欢什么?

喜欢的是自己和大家一起努力工作之后,出现的问题被解决,工程一日日逐渐被完成,最终被交付的那种喜悦。

不喜欢工作中的与人打交道,在工作中会产生内耗,需要处理好复杂的人际关系。还有就是工作常年在外,全国各地地跑,和家人是聚少离多。不过工作这么些年,也习惯了,有空间就会回家看看家人,这两年因为疫情的原因,回去的更少了。在单位,就是想着怎么把工作干好。保质保量完成建设任务。

  1. 您的职位是什么?你的主要职责是什么?

目前是项目部的工程师,主要职责就是负责工程上的项目进行监工以及项目部规划等内容。

  1. 大学期间可以做的准备有什么?

学好自己的专业知识,尽量拓展知识面。这个岗位对专业的对口性一般要求不高,但是不论是经济类、管理类还是工程类的专业,还是需要认真学习的,它虽然要求的面广,但你总得有一方面是要有核心竞争力的。尽量多学习其他知识,做到“见多识广”,因为这个岗位会遇到很多人,很多不同种类的项目,这样工作起来思维会比较快,沟通也会变得容易些。

有侧重的锻炼自己的沟通、写作、表达能力。多参加社团活动,和一些有意义的比赛,历练自己。

  1. 在行业内,先从什么样的工作岗位做起,能学到最多的知识,最有益于发展?

先应聘资料员或质检员、施工员,能利用在校学到的知识,工作起来顺手,工作后通过自学尽快掌握各种工程软件的应用,掌握后根据自己的爱好,可转行预算员、技术员、测量员等.

  1. 工作地点在哪里?主要工作场所是什么?有哪些特征?

工作地点有工地,项目部。主要场所是项目部。忙的时候来回奔波,也会加班赶工期。

  1. 您在做这份工作时,日常面临的问题是什么,什么最有挑战性?

这个很多,比如刚开始工作的时候,要慢慢适应工厂的环境;还要和同事打好关系等等。特别是厂里的一些老师傅在我们正式上岗前经行培训的时候,老师傅传授了一些我们在学校里没见过的加工方法,我们只能从头学起。我想说的是学校里的教材之类的不能太过相信,有些老旧的教材的内容已经逐渐被淘汰,因此要不断地学习,要关注行业发展动态。

  1. 在您的工作领域里初级职位和略高级别职位的薪水一般是什么水平?

收入还可以,包括基本工资+年底奖金。主要还是根据工程难度,工期长短,以及工作地点等因素影响。初级平均可以拿到8000左右,年底5~20万不等。

  1. 在这个职位上,如果想获得成功必须拥有并保持什么样的能力?

需要有坚实的基础学科知识,更需要有不断学习的能力,去挑战的新的建设需求。其次的话就是有一定的与人交往的能力。

  1. 目前还缺乏的必须改进的能力有哪些?

需要的技能:CAD及各种计算软件,比如PKPM、YJK、3D3S、MIDAS等(至少学会一到两种,各软件有相通之处)。

  1. 您认为什么样的个人品质、性格和能力对做好这份工作来讲是重要的?

能坚持下去,有创新**,常与人沟通交流,通过工作不断积累自己的经验。

  1. 您认为做好这份工作应该具备哪些知识、技能和经验?

要掌握一些基本的专业知识,比如制图(包括CAD),金属加工的技艺,还有就是一些行业规定,行业语言等,之后当然要考取这种证书来表明已经掌握了这些内容。当然,经验也是很重要的,特别是出现一些课本上或平时没出现过的情况时,经验显得尤为重要。

  1. 目前,行业内要求从事这份工作的人应该有什么准备?

首先梳理自己已有的专业知识能力,客观地评价自己的优势和劣势,尽可能做到扬长补短。其次有目的地提前锁定一些目标实习单位,有针对性地进行一些关注和调研,做到有的放矢。最后可以阅读一些人际交往或社交礼仪的知识,力求在细节方面也做到位,也可以向往届师兄师姐讨教实习的一些鲜活的经验,以利于较快地适应角色和心态的转变。

  1. 学校中的哪些课程对这个行业比较有帮助?

总的来说是有帮助的,但是大家都知道,书上的知识永远赶不上技术的发展,所有如果你向在这个行业有好的发展的话,就不能局限于书本上的东西,要多动手,这样能学到的东西比你课程上所能学到的多很多。

  1. 行业内,单位对刚进入该领域工作的员工一般会提供哪些培训?

每一个新进入的员工都会进行一系列相关的培训,内容主要是对新来员工培训相关技能,让员工能够更好的将学校中所学到的知识更好的转化为想用的技能。除了部门自己组织的学习以外,公司每年都会组织一些培训,让大家更好的了解当前行业的新技术,新动态。正式进入工作岗位后,要求每个人都有一定的技能,能够独立面对一些问题,在技术方面要求会比较多。在深造方面,公司是比较支持大家进行更加高层的学习。

  1. 这个行业存在的困难及前景如何?

目前这一行业工作较为辛苦,有很多人难以坚持下来,现有的人员构成并不是非常合理,尽管做这个方面的人相当多,但是很缺少能够独当一面的优秀人才,总的来说就是,高层然才比较欠缺,低层人员泛滥。所以,对于每一个想要在此行业有所发展的人来说,机遇和挑战是同时并存的。

声网参赛经历记录——白板插件开发(前端) # issue 标题模板 默认: 声网参赛经历记录——白板插件开发(前端)

title

[toc]

# 比赛创意

最开始讨论的结果时做一个会议记录相关的插件,结合声望原本提供的白板插件功能,可以实时的进行展示,多人操作、互动,音视频通话。区别于现有会议模式的一点就是,除了音视频通话,还可以在通话的同时,在白板上进行操作,类似于Web上 <mark>在线文档</mark>、<mark>在线会议</mark>、<mark>在线画板</mark> 三者功能集一身的一款白板插件,当然这里在线白板的功能是由声望的 SDK 提供了这个能力,在线文档的这些具体的在线同步的逻辑还是要以声望提供的为基准。

1. 最终结果

最终由于我们人力有限,并且都是兼职参加比赛,所以完成上是大打折扣。

  • 调用了讯飞的实时语音识别接口实现了插件的 <mark>语音转写</mark> 功能,可以进行多人语音识别到插件内部
  • 可以对会议内容和识别记录进行 <mark>一键导出</mark> 的功能

最后呢,由于实现的功能过于单调,又新增了一个 Markdown 的编辑器,插件启动后可以编辑,但是这个内容是不同步的。

# 技术总结

总结一下我个人在比赛中学习和使用到的一些技术,由于我本人是 C++客户端 开发,之前虽然也有学习过VUE和前端知识,但是 VUE3 的改动还是挺大,使用起来颇有些不太习惯的地方。主要的前端框架以及代码功能都是由我比赛的队友去完成的。我负责后台数据相关的一些工作。主要面向于音视频录制、存储、发送等,以及调用语音识别接口。

  1. AgoraRTC(声网的sdk,提供实时音视频服务)
  2. IatRecorder(讯飞封装的一个语音识别接口)
  3. Vue
  4. 前端三剑客(js、h5、CSS)这三个在调试过程中占比很大

# 实现

实现部分主要讲关于音频传输、录音、实时语音转写这三点:

音频传输

音频传输方面。声网有现成的demo提供学习,使用起来相对比较简单。

API-Examples-Web/Demo/selfRendering at main · AgoraIO/API-Examples-Web

管道demo # issue 标题模板 默认: 管道demo

[toc]

管道类

.h

#pragma once

#include &lt;stdio.h&gt;
#include &lt;tchar.h&gt;

#include &lt;iostream&gt;
#include &lt;Windows.h&gt;
#include &lt;string&gt;
#include &lt;thread&gt;
#include &lt;memory&gt;

#define TIME_ASECOND 1000

enum PIPEUSERTYPE {
	USER_CLIENT, //客户端
	USER_SERVER, //服务端
};

class PipeIPC {
public:
	explicit PipeIPC(PIPEUSERTYPE role) :m_Role(role), m_hPipeHandle(INVALID_HANDLE_VALUE) {};
	~PipeIPC();

	bool WriteData(__in const std::string&amp; datas); //写入数据
	void Release();
	bool ReadData(__out std::string&amp; datas, __out bool bIsPipeEnd); //读取数据
	bool InitPipeIPC(); //初始化管道通信

	bool IsInit();

	BOOL InitSecurityAttributes();

	void Connect();
	void DisConnect();
private:
	PIPEUSERTYPE m_Role;
	HANDLE m_hPipeHandle;
	SECURITY_ATTRIBUTES m_sec_attr;  //security attributes 
};

.cpp

#include &quot;PipeIPC.h&quot;
#include &lt;AccCtrl.h&gt;
#include &lt;AclAPI.h&gt;

using namespace std;

#define PIPE_SERVER_NAME       &quot;\\\\.\\pipe\\TrustAgent\\pipe.ToFixService&quot;
#define PIPE_CLIENT_NAME       &quot;\\\\.\\pipe\\TrustAgent\\pipe.ToTrustAgent&quot;

PipeIPC::~PipeIPC()
{
	if (m_hPipeHandle != INVALID_HANDLE_VALUE)
	{
		DisconnectNamedPipe(m_hPipeHandle);
		CloseHandle(m_hPipeHandle);
	}
}

bool PipeIPC::InitPipeIPC()
{
	if (USER_SERVER == m_Role &amp;&amp; nullptr != m_hPipeHandle)
	{
		InitSecurityAttributes();
		// cout &lt;&lt; &quot;ser&quot; &lt;&lt; endl;
		m_hPipeHandle = CreateNamedPipeA(PIPE_SERVER_NAME, PIPE_ACCESS_DUPLEX, //双向模式
			PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE/* | PIPE_NOWAIT*/,
			PIPE_UNLIMITED_INSTANCES,//设置最大容纳实例数目
			0,
			0,
			NULL, (LPSECURITY_ATTRIBUTES)&amp;m_sec_attr);
		//如果管道创建失败
		if (m_hPipeHandle == INVALID_HANDLE_VALUE)
		{
			return false;
		}

#if 0
		if (!ConnectNamedPipe(m_hPipeHandle, nullptr)) {
			cout &lt;&lt; &quot;ConnectNamedPipe failed&quot; &lt;&lt; endl;
			return false;
		}
#endif
	}
	else
	{
		if (WaitNamedPipeA(PIPE_CLIENT_NAME, TIME_ASECOND * 5) == FALSE)
			return 0;

		m_hPipeHandle = CreateFileA(
			PIPE_CLIENT_NAME,
			GENERIC_READ | GENERIC_WRITE,
			0,
			NULL,
			OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL,
			NULL);

		//如果管道创建失败
		if (m_hPipeHandle == INVALID_HANDLE_VALUE)
		{
			return false;
		}

		WriteData(&quot;[PIPE] ------ V10 Init ------&quot;);
	}

	return true;
}

bool PipeIPC::IsInit()
{
	return m_hPipeHandle == INVALID_HANDLE_VALUE ? false : true;
}

/*
	[details] 创建管道去管理员权限
*/
BOOL PipeIPC::InitSecurityAttributes()
{
	PSID pEveryoneSID = NULL;
	PACL pACL = NULL;
	EXPLICIT_ACCESS ea;
	PSECURITY_DESCRIPTOR pSD = NULL;
	void* ea_addr = NULL;
	void* acl_addr = NULL;
	void* sd_addr = NULL;
	SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;

	if (!AllocateAndInitializeSid(&amp;SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &amp;pEveryoneSID))
	{
		return FALSE;
	}
	ZeroMemory(&amp;ea, sizeof(EXPLICIT_ACCESS));
	ea.grfAccessPermissions = SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL;
	ea.grfAccessMode = SET_ACCESS;
	ea.grfInheritance = NO_INHERITANCE;
	ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
	ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
	ea.Trustee.ptstrName = (LPTSTR)pEveryoneSID;
	ea_addr = &amp;ea;
	if (ERROR_SUCCESS != SetEntriesInAcl(1, &amp;ea, NULL, &amp;pACL))
	{
		goto cleanup;
	}
	acl_addr = &amp;pACL;
	pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
	if (NULL == pSD)
	{
		goto cleanup;
	}
	if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
	{
		goto cleanup;
	}
	sd_addr = &amp;pSD;
	if (!SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE))
	{
		goto cleanup;
	}
	m_sec_attr.nLength = sizeof(SECURITY_ATTRIBUTES);
	m_sec_attr.lpSecurityDescriptor = pSD;
	m_sec_attr.bInheritHandle = FALSE;
	return TRUE;

cleanup:
	if (pEveryoneSID)
		FreeSid(pEveryoneSID);
	if (pACL)
		LocalFree(pACL);
	if (pSD)
		LocalFree(pSD);
	return FALSE;
}

void PipeIPC::Connect()
{
	ConnectNamedPipe(m_hPipeHandle, nullptr);
}

void PipeIPC::DisConnect()
{
	DisconnectNamedPipe(m_hPipeHandle);
}

//读取数据
bool PipeIPC::ReadData(__out std::string&amp; datas, __out bool bIsPipeEnd)
{
	if (INVALID_HANDLE_VALUE == m_hPipeHandle || nullptr == m_hPipeHandle)
	{
		InitPipeIPC();
	}

	DWORD cbRead = 0;//定义数据长度
	DWORD cbData = 0;
	if (ReadFile(m_hPipeHandle, &amp;cbData, sizeof(cbData), &amp;cbRead, nullptr) &amp;&amp; sizeof(cbData) == cbRead)
	{
		DWORD error = GetLastError();
		bIsPipeEnd = (error == ERROR_BROKEN_PIPE ? true : false);

		datas.resize(cbData);

		if (ReadFile(m_hPipeHandle, (LPVOID)datas.data(), cbData, &amp;cbRead, nullptr) &amp;&amp; cbData == cbRead)
		{
			return true;
		}
	}
	else
	{
		DWORD dwError = GetLastError();
		bIsPipeEnd = (dwError == ERROR_BROKEN_PIPE) ? true : false;
	}

	datas.resize(0);
	return false;
}

//写入数据
bool PipeIPC::WriteData(__in const std::string&amp; datas)
{
	if (m_Role == USER_SERVER)
	{
		bool connect = ConnectNamedPipe(m_hPipeHandle, NULL);
		if (!connect)
		{
			if (!InitPipeIPC())
			{
				DWORD error = GetLastError();
				if (error != ERROR_PIPE_CONNECTED)
				{
					//cout &lt;&lt; &quot;客户端还没连接&quot; &lt;&lt; endl;
					//连接失败
					return false;
				}
			}
		}
	}

	if (!IsInit())
	{
		if (!InitPipeIPC())
		{
			return false;
		}
	}

	//连接成功!
	DWORD wLen;
	const DWORD cbData = datas.size() * sizeof(datas[0]);

	if (!WriteFile(m_hPipeHandle, &amp;cbData, sizeof(cbData), &amp;wLen, NULL))
	{
		return false;
	}
	if (!WriteFile(m_hPipeHandle, datas.c_str(), datas.size() * sizeof(datas[0]), &amp;wLen, NULL))
	{
		return false;
	}

	return true;
}

void PipeIPC::Release()
{
	if (m_hPipeHandle)
	{
		DisconnectNamedPipe(m_hPipeHandle);
		CloseHandle(m_hPipeHandle); // 关闭句柄
		m_hPipeHandle = NULL;
	}
}

定义与声明

__declspec(selectany) PipeIPC* pRead = new PipeIPC(USER_SERVER);
__declspec(selectany) PipeIPC* pWrite = new PipeIPC(USER_CLIENT);

使用

监听管道

> 随程序同时启动

   
BOOL StartPipeRead()
{
	EventLog(LOG_ALL, &quot;[IPC][THREAD] ,Create PipeReadThread Success, pipe = %p&quot;, pRead );
	EventLog(LOG_ALL, &quot;pipe = %p, pipe-&gt;IsInit()=%d&quot;, pRead, pRead-&gt;IsInit());

	bool isPipeEnd = true;
	while (true)
	{
		if (isPipeEnd)
		{
			pRead-&gt;Connect();
		}

		std::string datas;
		if (!pRead-&gt;ReadData(datas, isPipeEnd))
		{
			if (isPipeEnd)
			{
				EventLog(LOG_ALL, &quot;-----------[PIPE END]----------&quot;);
				pRead-&gt;DisConnect();
			}
		}

		datas = &quot;Add&quot;;

		// 数据处理
		if (datas.find(&quot;start&quot;) != std::string::npos) // 启动成功
		{
			EventLog(LOG_ALL, &quot; [PIPE] [REC] TrustAgentStart&quot;);
			// 启动 管道客户端
			if (!StartPipeWrite())
			{
				EventLog(LOG_ALL, &quot; [PIPE] Failed to Create Client Pipe, GetLastError()=&quot;, GetLastError());
			}
		}
		else if (!datas.empty())
		{
			EventLog(LOG_ALL, &quot;[PIPE] [RECV] datas: %s&quot;, datas.c_str());
			// 调用导出的接口
			{
				std::thread th(HandleFix, datas);
				th.detach();

			}
			// NSPTRUST::SendRpcMsgToPlugin(POLICY_SENDTQA_USER, datas.c_str());
		}
	}
}

写管道

启动时机,同名管道的监听管道启动后再启动

BOOL StartPipeWrite()
{
	if (pWrite-&gt;IsInit())
		return true;
	else
		return pWrite-&gt;InitPipeIPC();
}

写数据

	std::string datas = &quot;Send data to PIPE Read&quot;;
	pWrite-&gt;WriteData(datas);

写作协作手册 # issue 标题模板 默认: 写作协作手册

[toc]

>暂时我不想知道你在想什么!

  • 你想知道什么?
#include&lt;iostream&gt;
using namespace std;
int main(int argc,const char *argv[]){
    cout &lt;&lt; &quot;Hello World&quot;;
    return 0;
}

<img src="https://img.shields.io/badge/难度-困难-red" align="left" />

<img src="https://img.shields.io/badge/难度-中等-yellow" align="left" />

<img src="https://img.shields.io/badge/难度-简单-green" align="left" />


绿2
红3

常用颜色代码

<div style="background:marnoon;color:black">color=maroon</div>

<div style="background:grey;">color=grey</div>
<div style="background:silver;">color=silver</div>
<div style="background:lightgrey;">color=lightgrey</div>
<div style="background:HotPink;">color=HotPink</div>
<div style="background:DeepPink;">color=DeepPink</div>
<div style="background:VioletRed;">color=VioletRed</div>
<div style="background:Purple;">color=Purple</div>
<div style="background:navy;">color=navy</div>
<div style="background:Blue;">color=Blue</div>
<div style="background:DeepSkyBlue;">color=DeepSkyBlue</div>
<div style="background:LightSkyBlue;">color=LightSkyBlue</div>
<div style="background:aqua;">color=aqua</div>
<div style="background:DarkTurquoise;">color=DarkTurquoise</div>
<div style="background:LightSeaGreen;">color=LightSeaGreen</div>
<div style="background:YellowGreen;">color=YellowGreen</div>
<div style="background:GreenYellow;">color=GreenYellow</div>
<div style="background:Yellow;">color=Yellow</div>
<div style="background:Tomato;">color=Tomato</div>
<div style="background:red;">color=red</div>
<div style="background:fuchsia;">color=fuchsia</div>
<div style="background:MediumOrchid;">color=MediumOrchid</div>
<div style="background:DarkViolet;">color=DarkViolet</div>

https://img.shields.io/badge/个人主页-fole_del.github.io-blue

色彩名

常用模板(复杂度)

brightgreengreenyellowgreenyelloworangeredbluelightgrey
successimportantcriticalinformationalinactive
bluevioletff69b49cf

?style=plastic&amp;logo=appveyor plastic
?style=flat&amp;logo=appveyor flat
?style=flat-square&amp;logo=appveyor flat-square
?style=for-the-badge&amp;logo=appveyor for-the-badge
?style=social&amp;logo=appveyor social

<font color=rgb(25,26,35) face="华文彩云" size=100px>其他快捷方式</font>

^_^

/* default */
<div class="note icon custom iconfont icon-QQ2" style="background: #f7f7f7;border-left-color: #777;"><p>default</p></div>

/* success */
<div class="note icon custom iconfont icon-QQ2" style="background: #eff8f0;border-left-color: #5cb85c;"><p>success</p></div>

/* primary */
<div class="note icon custom iconfont icon-QQ2" style="background: #f5f0fa;border-left-color: #6f42c1;"><p>primary</p></div>

/* info */
<div class="note icon custom iconfont icon-QQ2" style="background: #eef7fa;border-left-color: #428bca;"><p>info</p></div>

/* warning */
<div class="note icon custom iconfont icon-QQ2" style="background: #fdf8ea;border-left-color: #f0ad4e;"><p>warning</p></div>

/* danger */

<div class="note icon custom iconfont icon-QQ2" style="background: #fcf1f2;border-left-color: #d9534f;"><p>danger</p></div>

<font color=rgb(25,26,35) face="华文彩云" size=100px>动画</font>

> 需要注意的是在使用时需要添加fas的属性,如&lt;span class=&quot;fas faa-wrench animated&quot;&gt;&lt;/span&gt;

小康博客

On DOM load On hover On parent hover
faa-wrench animated faa-wrench animated-hover faa-wrench
faa-ring animated faa-ring animated-hover faa-ring
faa-horizontal animated faa-horizontal animated-hover faa-horizontal
faa-vertical animated faa-vertical animated-hover faa-vertical
faa-flash animated faa-flash animated-hover faa-flash
faa-bounce animated faa-bounce animated-hover faa-bounce
faa-spin animated faa-spin animated-hover faa-spin
faa-float animated faa-float animated-hover faa-float
faa-pulse animated faa-pulse animated-hover faa-pulse
faa-shake animated faa-shake animated-hover faa-shake
faa-tada animated faa-tada animated-hover faa-tada
faa-passing animated faa-passing animated-hover faa-passing
faa-passing-reverse animated faa-passing-reverse animated-hover faa-passing-reverse
faa-burst animated faa-burst animated-hover faa-burst
faa-falling animated faa-falling animated-hover faa-falling
faa-rising animated faa-rising animated-hover faa-rising

外挂标签

checkbox

{% checkbox 纯文本测试 %}
{% checkbox checked, 支持简单的 [markdown](https://guides.github.com/features/mastering-markdown/) 语法 %}
{% checkbox red, 支持自定义颜色 %}
{% checkbox green checked, 绿色 + 默认选中 %}
{% checkbox yellow checked, 黄色 + 默认选中 %}
{% checkbox cyan checked, 青色 + 默认选中 %}
{% checkbox blue checked, 蓝色 + 默认选中 %}
{% checkbox plus green checked, 增加 %}
{% checkbox minus yellow checked, 减少 %}
{% checkbox times red checked, 叉 %}
{% radio 纯文本测试 %}
{% radio checked, 支持简单的 [markdown](https://guides.github.com/features/mastering-markdown/) 语法 %}
{% radio red, 支持自定义颜色 %}
{% radio green, 绿色 %}
{% radio yellow, 黄色 %}
{% radio cyan, 青色 %}
{% radio blue, 蓝色 %}

image-20210611120738604


<font color=rgb(25,26,35) face="华文彩云">所有表情</font>

🅰️ 🆎 🔤 🔡 🉑 🚡 🇦🇫 ✈️ 🇨🇫 🌍 🇿🇦 🇦🇽 ⏰ ⚗️

😄 :smile: 😆 :laughing:
😊 :blush: 😃 :smiley: ☺️ :relaxed:
😏 :smirk: 😍 :heart_eyes: 😘 :kissing_heart:
😚 :kissing_closed_eyes: 😳 :flushed: 😌 :relieved:
😆 :satisfied: 😁 :grin: 😉 :wink:
😜 :stuck_out_tongue_winking_eye: 😝 :stuck_out_tongue_closed_eyes: 😀 :grinning:
😗 :kissing: 😙 :kissing_smiling_eyes: 😛 :stuck_out_tongue:
😴 :sleeping: 😟 :worried: 😦 :frowning:
😧 :anguished: 😮 :open_mouth: 😬 :grimacing:
😕 :confused: 😯 :hushed: 😑 :expressionless:
😒 :unamused: 😅 :sweat_smile: 😓 :sweat:
😥 :disappointed_relieved: 😩 :weary: 😔 :pensive:
😞 :disappointed: 😖 :confounded: 😨 :fearful:
😰 :cold_sweat: 😣 :persevere: 😢 :cry:
😭 :sob: 😂 :joy: 😲 :astonished:
😱 :scream: 😫 :tired_face:
😠 :angry: 😡 :rage: 😤 :triumph:
😪 :sleepy: 😋 :yum: 😷 :mask:
😎 :sunglasses: 😵 :dizzy_face: 👿 :imp:
😈 :smiling_imp: 😐 :neutral_face: 😶 :no_mouth:
😇 :innocent: 👽 :alien: 💛 :yellow_heart:
💙 :blue_heart: 💜 :purple_heart: ❤️ :heart:
💚 :green_heart: 💔 :broken_heart: 💓 :heartbeat:
💗 :heartpulse: 💕 :two_hearts: 💞 :revolving_hearts:
💘 :cupid: 💖 :sparkling_heart: :sparkles:
⭐️ :star: 🌟 :star2: 💫 :dizzy:
💥 :boom: 💥 :collision: 💢 :anger:
❗️ :exclamation: :question: :grey_exclamation:
:grey_question: 💤 :zzz: 💨 :dash:
💦 :sweat_drops: 🎶 :notes: 🎵 :musical_note:
🔥 :fire: 💩 :hankey: 💩 :poop:
💩 :shit: 👍 :+1: 👍 :thumbsup:
👎 :-1: 👎 :thumbsdown: 👌 :ok_hand:
👊 :punch: 👊 :facepunch: :fist:
✌️ :v: 👋 :wave: :hand:
:raised_hand: 👐 :open_hands: ☝️ :point_up:
👇 :point_down: 👈 :point_left: 👉 :point_right:
🙌 :raised_hands: 🙏 :pray: 👆 :point_up_2:
👏 :clap: 💪 :muscle: 🤘 :metal:
🖕 :fu: 🚶 :walking: 🏃 :runner:
🏃 :running: 👫 :couple: 👪 :family:
👬 :two_men_holding_hands: 👭 :two_women_holding_hands: 💃 :dancer:
👯 :dancers: 🙆 :ok_woman: 🙅 :no_good:
💁 :information_desk_person: 🙋 :raising_hand: 👰 :bride_with_veil:
🙎 :person_with_pouting_face: 🙍 :person_frowning: 🙇 :bow:
💏 :couplekiss: 💑 :couple_with_heart: 💆 :massage:
💇 :haircut: 💅 :nail_care: 👦 :boy:
👧 :girl: 👩 :woman: 👨 :man:
👶 :baby: 👵 :older_woman: 👴 :older_man:
👱 :person_with_blond_hair: 👲 :man_with_gua_pi_mao: 👳 :man_with_turban:
👷 :construction_worker: 👮 :cop: 👼 :angel:
👸 :princess: 😺 :smiley_cat: 😸 :smile_cat:
😻 :heart_eyes_cat: 😽 :kissing_cat: 😼 :smirk_cat:
🙀 :scream_cat: 😿 :crying_cat_face: 😹 :joy_cat:
😾 :pouting_cat: 👹 :japanese_ogre: 👺 :japanese_goblin:
🙈 :see_no_evil: 🙉 :hear_no_evil: 🙊 :speak_no_evil:
💂 :guardsman: 💀 :skull: 🐾 :feet:
👄 :lips: 💋 :kiss: 💧 :droplet:
👂 :ear: 👀 :eyes: 👃 :nose:
👅 :tongue: 💌 :love_letter: 👤 :bust_in_silhouette:
👥 :busts_in_silhouette: 💬 :speech_balloon: 💭 :thought_balloon:

Nature

☀️ :sunny: ☔️ :umbrella: ☁️ :cloud:
❄️ :snowflake: ⛄️ :snowman: ⚡️ :zap:
🌀 :cyclone: 🌁 :foggy: 🌊 :ocean:
🐱 :cat: 🐶 :dog: 🐭 :mouse:
🐹 :hamster: 🐰 :rabbit: 🐺 :wolf:
🐸 :frog: 🐯 :tiger: 🐨 :koala:
🐻 :bear: 🐷 :pig: 🐽 :pig_nose:
🐮 :cow: 🐗 :boar: 🐵 :monkey_face:
🐒 :monkey: 🐴 :horse: 🐎 :racehorse:
🐫 :camel: 🐑 :sheep: 🐘 :elephant:
🐼 :panda_face: 🐍 :snake: 🐦 :bird:
🐤 :baby_chick: 🐥 :hatched_chick: 🐣 :hatching_chick:
🐔 :chicken: 🐧 :penguin: 🐢 :turtle:
🐛 :bug: 🐝 :honeybee: 🐜 :ant:
🐞 :beetle: 🐌 :snail: 🐙 :octopus:
🐠 :tropical_fish: 🐟 :fish: 🐳 :whale:
🐋 :whale2: 🐬 :dolphin: 🐄 :cow2:
🐏 :ram: 🐀 :rat: 🐃 :water_buffalo:
🐅 :tiger2: 🐇 :rabbit2: 🐉 :dragon:
🐐 :goat: 🐓 :rooster: 🐕 :dog2:
🐖 :pig2: 🐁 :mouse2: 🐂 :ox:
🐲 :dragon_face: 🐡 :blowfish: 🐊 :crocodile:
🐪 :dromedary_camel: 🐆 :leopard: 🐈 :cat2:
🐩 :poodle: 🐾 :paw_prints: 💐 :bouquet:
🌸 :cherry_blossom: 🌷 :tulip: 🍀 :four_leaf_clover:
🌹 :rose: 🌻 :sunflower: 🌺 :hibiscus:
🍁 :maple_leaf: 🍃 :leaves: 🍂 :fallen_leaf:
🌿 :herb: 🍄 :mushroom: 🌵 :cactus:
🌴 :palm_tree: 🌲 :evergreen_tree: 🌳 :deciduous_tree:
🌰 :chestnut: 🌱 :seedling: 🌼 :blossom:
🌾 :ear_of_rice: 🐚 :shell: 🌐 :globe_with_meridians:
🌞 :sun_with_face: 🌝 :full_moon_with_face: 🌚 :new_moon_with_face:
🌑 :new_moon: 🌒 :waxing_crescent_moon: 🌓 :first_quarter_moon:
🌔 :waxing_gibbous_moon: 🌕 :full_moon: 🌖 :waning_gibbous_moon:
🌗 :last_quarter_moon: 🌘 :waning_crescent_moon: 🌜 :last_quarter_moon_with_face:
🌛 :first_quarter_moon_with_face: 🌔 :moon: 🌍 :earth_africa:
🌎 :earth_americas: 🌏 :earth_asia: 🌋 :volcano:
🌌 :milky_way: ⛅️ :partly_sunny:

Objects

🎍 :bamboo: 💝 :gift_heart: 🎎 :dolls:
🎒 :school_satchel: 🎓 :mortar_board: 🎏 :flags:
🎆 :fireworks: 🎇 :sparkler: 🎐 :wind_chime:
🎑 :rice_scene: 🎃 :jack_o_lantern: 👻 :ghost:
🎅 :santa: 🎄 :christmas_tree: 🎁 :gift:
🔔 :bell: 🔕 :no_bell: 🎋 :tanabata_tree:
🎉 :tada: 🎊 :confetti_ball: 🎈 :balloon:
🔮 :crystal_ball: 💿 :cd: 📀 :dvd:
💾 :floppy_disk: 📷 :camera: 📹 :video_camera:
🎥 :movie_camera: 💻 :computer: 📺 :tv:
📱 :iphone: ☎️ :phone: ☎️ :telephone:
📞 :telephone_receiver: 📟 :pager: 📠 :fax:
💽 :minidisc: 📼 :vhs: 🔉 :sound:
🔈 :speaker: 🔇 :mute: 📢 :loudspeaker:
📣 :mega: ⌛️ :hourglass: :hourglass_flowing_sand:
:alarm_clock: ⌚️ :watch: 📻 :radio:
📡 :satellite: :loop: 🔍 :mag:
🔎 :mag_right: 🔓 :unlock: 🔒 :lock:
🔏 :lock_with_ink_pen: 🔐 :closed_lock_with_key: 🔑 :key:
💡 :bulb: 🔦 :flashlight: 🔆 :high_brightness:
🔅 :low_brightness: 🔌 :electric_plug: 🔋 :battery:
📲 :calling: ✉️ :email: 📫 :mailbox:
📮 :postbox: 🛀 :bath: 🛁 :bathtub:
🚿 :shower: 🚽 :toilet: 🔧 :wrench:
🔩 :nut_and_bolt: 🔨 :hammer: 💺 :seat:
💰 :moneybag: 💴 :yen: 💵 :dollar:
💷 :pound: 💶 :euro: 💳 :credit_card:
💸 :money_with_wings: 📧 :e-mail: 📥 :inbox_tray:
📤 :outbox_tray: ✉️ :envelope: 📨 :incoming_envelope:
📯 :postal_horn: 📪 :mailbox_closed: 📬 :mailbox_with_mail:
📭 :mailbox_with_no_mail: 🚪 :door: 🚬 :smoking:
💣 :bomb: 🔫 :gun: 🔪 :hocho:
💊 :pill: 💉 :syringe: 📄 :page_facing_up:
📃 :page_with_curl: 📑 :bookmark_tabs: 📊 :bar_chart:
📈 :chart_with_upwards_trend: 📉 :chart_with_downwards_trend: 📜 :scroll:
📋 :clipboard: 📆 :calendar: 📅 :date:
📇 :card_index: 📁 :file_folder: 📂 :open_file_folder:
✂️ :scissors: 📌 :pushpin: 📎 :paperclip:
✒️ :black_nib: ✏️ :pencil2: 📏 :straight_ruler:
📐 :triangular_ruler: 📕 :closed_book: 📗 :green_book:
📘 :blue_book: 📙 :orange_book: 📓 :notebook:
📔 :notebook_with_decorative_cover: 📒 :ledger: 📚 :books:
🔖 :bookmark: 📛 :name_badge: 🔬 :microscope:
🔭 :telescope: 📰 :newspaper: 🏈 :football:
🏀 :basketball: ⚽️ :soccer: ⚾️ :baseball:
🎾 :tennis: 🎱 :8ball: 🏉 :rugby_football:
🎳 :bowling: ⛳️ :golf: 🚵 :mountain_bicyclist:
🚴 :bicyclist: 🏇 :horse_racing: 🏂 :snowboarder:
🏊 :swimmer: 🏄 :surfer: 🎿 :ski:
♠️ :spades: ♥️ :hearts: ♣️ :clubs:
♦️ :diamonds: 💎 :gem: 💍 :ring:
🏆 :trophy: 🎼 :musical_score: 🎹 :musical_keyboard:
🎻 :violin: 👾 :space_invader: 🎮 :video_game:
🃏 :black_joker: 🎴 :flower_playing_cards: 🎲 :game_die:
🎯 :dart: 🀄️ :mahjong: 🎬 :clapper:
📝 :memo: 📝 :pencil: 📖 :book:
🎨 :art: 🎤 :microphone: 🎧 :headphones:
🎺 :trumpet: 🎷 :saxophone: 🎸 :guitar:
👞 :shoe: 👡 :sandal: 👠 :high_heel:
💄 :lipstick: 👢 :boot: 👕 :shirt:
👕 :tshirt: 👔 :necktie: 👚 :womans_clothes:
👗 :dress: 🎽 :running_shirt_with_sash: 👖 :jeans:
👘 :kimono: 👙 :bikini: 🎀 :ribbon:
🎩 :tophat: 👑 :crown: 👒 :womans_hat:
👞 :mans_shoe: 🌂 :closed_umbrella: 💼 :briefcase:
👜 :handbag: 👝 :pouch: 👛 :purse:
👓 :eyeglasses: 🎣 :fishing_pole_and_fish: ☕️ :coffee:
🍵 :tea: 🍶 :sake: 🍼 :baby_bottle:
🍺 :beer: 🍻 :beers: 🍸 :cocktail:
🍹 :tropical_drink: 🍷 :wine_glass: 🍴 :fork_and_knife:
🍕 :pizza: 🍔 :hamburger: 🍟 :fries:
🍗 :poultry_leg: 🍖 :meat_on_bone: 🍝 :spaghetti:
🍛 :curry: 🍤 :fried_shrimp: 🍱 :bento:
🍣 :sushi: 🍥 :fish_cake: 🍙 :rice_ball:
🍘 :rice_cracker: 🍚 :rice: 🍜 :ramen:
🍲 :stew: 🍢 :oden: 🍡 :dango:
🥚 :egg: 🍞 :bread: 🍩 :doughnut:
🍮 :custard: 🍦 :icecream: 🍨 :ice_cream:
🍧 :shaved_ice: 🎂 :birthday: 🍰 :cake:
🍪 :cookie: 🍫 :chocolate_bar: 🍬 :candy:
🍭 :lollipop: 🍯 :honey_pot: 🍎 :apple:
🍏 :green_apple: 🍊 :tangerine: 🍋 :lemon:
🍒 :cherries: 🍇 :grapes: 🍉 :watermelon:
🍓 :strawberry: 🍑 :peach: 🍈 :melon:
🍌 :banana: 🍐 :pear: 🍍 :pineapple:
🍠 :sweet_potato: 🍆 :eggplant: 🍅 :tomato:
🌽 :corn:

Places

🏠 :house: 🏡 :house_with_garden: 🏫 :school:
🏢 :office: 🏣 :post_office: 🏥 :hospital:
🏦 :bank: 🏪 :convenience_store: 🏩 :love_hotel:
🏨 :hotel: 💒 :wedding: ⛪️ :church:
🏬 :department_store: 🏤 :european_post_office: 🌇 :city_sunrise:
🌆 :city_sunset: 🏯 :japanese_castle: 🏰 :european_castle:
⛺️ :tent: 🏭 :factory: 🗼 :tokyo_tower:
🗾 :japan: 🗻 :mount_fuji: 🌄 :sunrise_over_mountains:
🌅 :sunrise: 🌠 :stars: 🗽 :statue_of_liberty:
🌉 :bridge_at_night: 🎠 :carousel_horse: 🌈 :rainbow:
🎡 :ferris_wheel: ⛲️ :fountain: 🎢 :roller_coaster:
🚢 :ship: 🚤 :speedboat: ⛵️ :boat:
⛵️ :sailboat: 🚣 :rowboat: ⚓️ :anchor:
🚀 :rocket: ✈️ :airplane: 🚁 :helicopter:
🚂 :steam_locomotive: 🚊 :tram: 🚞 :mountain_railway:
🚲 :bike: 🚡 :aerial_tramway: 🚟 :suspension_railway:
🚠 :mountain_cableway: 🚜 :tractor: 🚙 :blue_car:
🚘 :oncoming_automobile: 🚗 :car: 🚗 :red_car:
🚕 :taxi: 🚖 :oncoming_taxi: 🚛 :articulated_lorry:
🚌 :bus: 🚍 :oncoming_bus: 🚨 :rotating_light:
🚓 :police_car: 🚔 :oncoming_police_car: 🚒 :fire_engine:
🚑 :ambulance: 🚐 :minibus: 🚚 :truck:
🚋 :train: 🚉 :station: 🚆 :train2:
🚅 :bullettrain_front: 🚄 :bullettrain_side: 🚈 :light_rail:
🚝 :monorail: 🚃 :railway_car: 🚎 :trolleybus:
🎫 :ticket: ⛽️ :fuelpump: 🚦 :vertical_traffic_light:
🚥 :traffic_light: ⚠️ :warning: 🚧 :construction:
🔰 :beginner: 🏧 :atm: 🎰 :slot_machine:
🚏 :busstop: 💈 :barber: ♨️ :hotsprings:
🏁 :checkered_flag: 🎌 :crossed_flags: 🏮 :izakaya_lantern:
🗿 :moyai: 🎪 :circus_tent: 🎭 :performing_arts:
📍 :round_pushpin: 🚩 :triangular_flag_on_post: 🇯🇵 :jp:
🇰🇷 :kr: 🇨🇳 :cn: 🇺🇸 :us:
🇫🇷 :fr: 🇪🇸 :es: 🇮🇹 :it:
🇷🇺 :ru: 🇬🇧 :gb: 🇬🇧 :uk:
🇩🇪 :de:

Symbols

1️⃣ :one: 2️⃣ :two: 3️⃣ :three:
4️⃣ :four: 5️⃣ :five: 6️⃣ :six:
7️⃣ :seven: 8️⃣ :eight: 9️⃣ :nine:
🔟 :keycap_ten: 🔢 :1234: 0️⃣ :zero:
#️⃣ :hash: 🔣 :symbols: ◀️ :arrow_backward:
⬇️ :arrow_down: ▶️ :arrow_forward: ⬅️ :arrow_left:
🔠 :capital_abcd: 🔡 :abcd: 🔤 :abc:
↙️ :arrow_lower_left: ↘️ :arrow_lower_right: ➡️ :arrow_right:
⬆️ :arrow_up: ↖️ :arrow_upper_left: ↗️ :arrow_upper_right:
:arrow_double_down: :arrow_double_up: 🔽 :arrow_down_small:
⤵️ :arrow_heading_down: ⤴️ :arrow_heading_up: ↩️:leftwards_arrow_with_hook:
↪️ :arrow_right_hook: ↔️ :left_right_arrow: ↕️ :arrow_up_down:
🔼 :arrow_up_small: 🔃 :arrows_clockwise: 🔄 :arrows_counterclockwise:
:rewind: :fast_forward: ℹ️ :information_source:
🆗 :ok: 🔀 :twisted_rightwards_arrows: 🔁 :repeat:
🔂 :repeat_one: 🆕 :new: 🔝 :top:
🆙 :up: 🆒 :cool: 🆓 :free:
🆖 :ng: 🎦 :cinema: 🈁 :koko:
📶 :signal_strength: 🈹 :u5272: 🈴 :u5408:
🈺 :u55b6: 🈯️ :u6307: 🈷️ :u6708:
🈶 :u6709: 🈵 :u6e80: 🈚️ :u7121:
🈸 :u7533: 🈳 :u7a7a: 🈲 :u7981:
🈂️ :sa: 🚻 :restroom: 🚹 :mens:
🚺 :womens: 🚼 :baby_symbol: 🚭 :no_smoking:
🅿️ :parking: ♿️ :wheelchair: 🚇 :metro:
🛄 :baggage_claim: 🉑 :accept: 🚾 :wc:
🚰 :potable_water: 🚮 :put_litter_in_its_place: ㊙️ :secret:
㊗️ :congratulations: Ⓜ️ :m: 🛂 :passport_control:
🛅 :left_luggage: 🛃 :customs: 🉐 :ideograph_advantage:
🆑 :cl: 🆘 :sos: 🆔 :id:
🚫 :no_entry_sign: 🔞 :underage: 📵 :no_mobile_phones:
🚯 :do_not_litter: 🚱 :non-potable_water: 🚳 :no_bicycles:
🚷 :no_pedestrians: 🚸 :children_crossing: ⛔️ :no_entry:
✳️ :eight_spoked_asterisk: ✴️ :eight_pointed_black_star: 💟 :heart_decoration:
🆚 :vs: 📳 :vibration_mode: 📴 :mobile_phone_off:
💹 :chart: 💱 :currency_exchange: ♈️ :aries:
♉️ :taurus: ♊️ :gemini: ♋️ :cancer:
♌️ :leo: ♍️ :virgo: ♎️ :libra:
♏️ :scorpius: ♐️ :sagittarius: ♑️ :capricorn:
♒️ :aquarius: ♓️ :pisces: :ophiuchus:
🔯 :six_pointed_star: :negative_squared_cross_mark: 🅰️ :a:
🅱️ :b: 🆎 :ab: 🅾️ :o2:
💠:diamond_shape_with_a_dot_inside: ♻️ :recycle: 🔚 :end:
🔛 :on: 🔜 :soon: 🕐 :clock1:
🕜 :clock130: 🕙 :clock10: 🕥 :clock1030:
🕚 :clock11: 🕦 :clock1130: 🕛 :clock12:
🕧 :clock1230: 🕑 :clock2: 🕝 :clock230:
🕒 :clock3: 🕞 :clock330: 🕓 :clock4:
🕟 :clock430: 🕔 :clock5: 🕠 :clock530:
🕕 :clock6: 🕡 :clock630: 🕖 :clock7:
🕢 :clock730: 🕗 :clock8: 🕣 :clock830:
🕘 :clock9: 🕤 :clock930: 💲 :heavy_dollar_sign:
©️ :copyright: ®️ :registered: ™️ :tm:
:x: ❗️ :heavy_exclamation_mark: ‼️ :bangbang:
⁉️ :interrobang: ⭕️ :o: ✖️ :heavy_multiplication_x:
:heavy_plus_sign: :heavy_minus_sign: :heavy_division_sign:
💮 :white_flower: 💯 :100: ✔️ :heavy_check_mark:
☑️ :ballot_box_with_check: 🔘 :radio_button: 🔗 :link:
:curly_loop: 〰️ :wavy_dash: 〽️ :part_alternation_mark:
🔱 :trident: :black_square: :black_square: :white_square: :white_square:
:white_check_mark: 🔲 :black_square_button: 🔳 :white_square_button:
⚫️ :black_circle: ⚪️ :white_circle: 🔴 :red_circle:
🔵 :large_blue_circle: 🔷 :large_blue_diamond: 🔶 :large_orange_diamond:
🔹 :small_blue_diamond: 🔸 :small_orange_diamond: 🔺 :small_red_triangle:
🔻 :small_red_triangle_down:

span list

1
&lt;span class=&quot;fas faa-ring animated-hover&quot; style=&quot;border-bottom:3px solid green&quot;&gt;《半小时漫画**哲学史》&lt;/span&gt;
2
&lt;span  style=&quot;text-align:center;font-size:20px;font:30px 书体坊兰亭体;color:blueviolent;word-spacing:30px;&quot;&gt;“ 既许一人以偏爱,愿尽余生之慷慨 ”&lt;/span&gt;
3
&lt;span style=&quot;class: faa-bounce animated-hover;border-bottom: 5px solid #8F81EF;&quot;&gt;[data.json文件链接](https://pan.baidu.com/s/1omzU65YMpJr0jPPFItZ7SA )&lt;/span&gt;
 4  
&lt;mark style=&quot;background:royalBlue;border-bottom:lightblue 2px solid;color:white;font-family:consolas&quot;&gt;当使用重做日志文件来进行数据库恢复时,ORACLE将读取其中的重做记录(包括其中的修改向量),并且将这些修改用于相关的块中。&lt;/mark&gt;
5
&lt;span style=&quot;background: PaleVioletRed;border-radius:10px;padding:1px 5px;color:white;font-weight:900&quot;&gt;存储结构管理主要就是通过对表空间的管理来实现的&lt;/span&gt;
6
&lt;mark style=&quot;background:green;border-radius:10px;color:white&quot;&gt;效果如下:&lt;/mark&gt;
7
&lt;font size=10px style=&quot;font-weight:700;font-family:&#39;华文彩云&#39;;color:rgb(100,190,100)&quot;&gt;基本语言(一)&lt;/font&gt;
8
&lt;span style=&quot;border-bottom: 2px dashed #000000&quot;&gt;代码段、数据段、BSS段、堆区、文件映射区以及栈区&lt;/span&gt;
9
&lt;div style=&quot;background:black;font:conloas;color:white;&quot;&gt;
&amp;nbsp;数组长度为:3&lt;br&gt;
&amp;nbsp;请按任意键继续. . .
&lt;/div&gt;
10
&lt;mark style=&quot;color:white;background:red;font-weight:600;border_radius:100px&quot;&gt;但效率更高&lt;/mark&gt;

  1. <span class="fas faa-ring animated-hover" style="border-bottom:3px solid green">《半小时漫画**哲学史》</span>

  1. <span style="text-align:center;font-size:20px;font:30px 书体坊兰亭体;color:blueviolent;word-spacing:30px;">“ 既许一人以偏爱,愿尽余生之慷慨 ”</span>

  1. <span style="class: faa-bounce animated-hover;border-bottom: 5px solid #8F81EF;">data.json文件链接</span>

  1. <mark style="background:royalBlue;border-bottom:lightblue 2px solid;color:white;font-family:consolas">当使用重做日志文件来进行数据库恢复时,ORACLE将读取其中的重做记录(包括其中的修改向量),并且将这些修改用于相关的块中。</mark>

  1. <span style="background: PaleVioletRed;border-radius:10px;padding:1px 5px;color:white;font-weight:900">存储结构管理主要就是通过对表空间的管理来实现的</span>

  1. <mark style="background:green;border-radius:10px;color:white;padding: 5px">效果如下:</mark>

  1. <font size=10px style="font-weight:700;font-family:'华文彩云';color:rgb(100,190,100)">基本语言(一)</font>

  1. <span style="border-bottom: 2px dashed #000000">代码段、数据段、BSS段、堆区、文件映射区以及栈区</span>

  1. <div style="background:black;font:conloas;color:white;">
    &nbsp;
    数组长度为:3
    <br>
    &nbsp;
    请按任意键继续. . .
    </div>

  2. <mark style="color:white;background:red;font-weight:600;border_radius:100px">但效率更高</mark>

For the Badge

For the Badge

《深入理解Windows操作系统》一书附录中英语单词整理 # issue 标题模板 默认: 《深入理解Windows操作系统》一书附录中英语单词整理

> 摘自《深入理解Windows操作系统》附录章节的英语对照。

《深入理解Windows操作系统》术语对照表

英文 对照
access token 访问令牌
access validation 访问验证
access-control entry,ACE 访问控制项
access-control list,ACL 访间控制列表
Active Directory 活动目录
Address Windowing Extension,AWE 地址窗口 context switch 环境切换扩展
affinity 亲和性
alert 警醒
assertion 断言
asymmetric multiprocessing,ASMP 非对称多处理
asynchronous procedure call,APC 异步过程调用
attach 附载
authentication 认证
balance set manager 平衡集管理器
bin 巢箱
bind, binding 绑定
blue screen 蓝屏
boost 提升
boot 引导
boot partition 引导分区
boot sector 引导扇区
boot volume 引导卷
bucket
bug check 错误检查
bus driver 总线型驱动程序
cable 线缆
cache manager 缓存管理器
cache miss 缓存未命中
Careful Write file system 谨慎写文件系统
catalog file 编目文件
cel 巢室
change journal 变化日志
class driver 类驱动程序
cluster 簇(用于磁盘存储单元),集群
COM 组件对象模型
committed memory 提交的内存
Common Internet File System, CIFS Internet 文件系统
compatibility 兼容性
concurrency 并发性
context 环境
copy-on-write 写时复制
crash analysis 崩溃分析
crash dump 崩溃转储
credential 凭证
critical section 临界区
cryptographic service provider,CSP 密码服务提供者
cyclic redundancy checksum, CRC 循环冗余检验和
DCOM 分布式组件对象模型
deadlock 死锁
debugger 调试器
deferred procedure call,DPC 延迟过程调用
defragmenter 碎片整理器
deliver 交付(针对APC&DPC)
dependency 相依性
desktop 桌面
device driver 设备驱动程序
Device Enumeration 设备列举
Discretionary access control,DAC 自主访问控制
disk spanning 磁盘跨展
dismount 卸载
dispatcher 分发器
dispatching 分发
Distributed File System,DFS 分布式文件系统
docking station 插接站
double-freeing 两次释放
drive letter 驱动器字母
Driver Verifier 驱动程序检验器
dynamic link library,DLL 动态链接库
Encrypting File System, EFS 加密文件系统
environment subsystem 环境子系统
ETW, Event Tracing for Windows Windows 事件跟踪
event 事件
Event Log 事件日志
exception 异常
exception dispatching 异常分发
exception frame 异常帧
exception handler 异常处理器
exception handling 异常处理
executive 执行体
executive object 执行体对象
extended partition 扩展分区
extensibility 扩展性
Extensible Firmware Interface,EFI 可扩展的固件接口
fast mutex 快速互斥体
fault tolerance 容错
fiber 纤程
fibre channel 光纤通道
file allocation table 文件分配表
file encryption key,FEK 文件加密密钥
file mapping object 文件映射对象
file system driver, FSD 文件系统驱动程序
file system recognizer 文件系统识别器
filter driver 过滤型驱动程序
firmware 固件
footprint 印迹
free list 空闲(页面)列表
function driver 功能型驱动程序
GINA 图形化标识和认证
Group Policy 组策略
guard page 守护页面
GUID 全局唯一标识符
GUID Partition Table,GPT GUID 分区表
handle 句柄
handle table 句柄表
handler 处理器
hardware abstraction layer 硬件抽象层(HAL)
heap manager 堆管理器
hive 储巢
hotfix 热补丁
Hyper-Threading 超线程
I/O request packet,IRP I/O 请求包
idle process 空闲进程
idle thread 空闲线程
impersonation 模仿
inter-processor interrupt,IPI 处理器间的中断
interrupt controller 中断控制器
interrupt dispatch table 中断分发表
interrupt handler 中断处理器
interrupt request level,IRQL 中断请求级别
Interrupt service routine,ISR 中断服务例程
interupt 中断
job 作业
junction 交接
kernel 内核
kernel mode 内核模式
kernel object 内核对象
key ring 密钥环
keystroke 键击
last known good,LKG 最后已知的好配置,最后已知的好控制集
lazy write file system 延迟写文件系统
lazy writer 延迟写出器
Lightweight Directory Acess Protocol, LDAP 轻量的目录访问协议
local procedure call,LPC 本地过程调用
local security authentication 本地安全认证
lock convoy 锁封护
loCompletion I/O 完成
logical cluster number.LCN 逻辑簇号
Logical Disk Manager.LDM 逻辑磁盘管理器
logical prefetcher 逻辑预取器
logical sequence number,LSN 逻辑序列号
logon 登录
look-aside list 预读列表
Low Fragmentation Heap,LFH 低碎片堆
LUID 本地唯一标识符
mailslot 邮件槽
managed code 托管代码
manifest 清单
mapped file 映射的文件
master boot record.MBR 主引导记录
master file table 主文件表
mechanism 机制
memory 内存
memory descriptor list.MDL 内存描述符列表
memory mapped file 内存映射文件
metadata 元数据
microkernel 微内核
minidump 小转储
miniport 小端口
miniport driver 小端口驱动程序
mirrored volume 镜像卷
MMC snap-in MMC 加载件
modified page writer 已修改页面写出器
mount 挂载
mount point 挂载点
multimaster replication 多主复制
Multiple Provider Router 多提供者转发器
Multiple UNC Provider,MUP 多UNC提供者
multiprocessing 多处理
multitasking 多任务
mutant 突变体
mutex 互斥体
named pipe 命名管道
native 原生的
network address translation.NAT 网络地址转译
Network Driver Interface Specification, NDIS 网络驱动程序接口规范
Network Monitor 网络监视器
network share 网络共享体
NTFS object atribute NTFS 对象属性
NUMA(non-uniform memory architecture) 非一致的内存结构
objcct manager 对象管理器
object linking and embedding. OLE 对象链接和嵌入
ommit 提交
on-disk structure 磁盘上的结构
Open System Interconnection, OSI 开放系统互联
opportunistic locking,oplock 机会锁
overlapped 可重叠的
page 页面
page directory 页目录
page directory entry,PDE 页目录项
page fault 页面错误
page file,paging file 页面文件
page frame number,PFN 页面帧编号
page table 页表
page table entry,PTE 页表项
pageable 换页的
paged pool, nonpaged pool 换页内存池,非换页内存池
pager 换页器
parition 分区
partition table 分区表
payload 有效载荷
Performance Monitor 性能监视器
Performance tool 性能工具
Physical Address Extension,PAE 物理地址扩展
placement policy 放置策略
plug and play 即插即用
pool tracking 内存池跟踪
port driver 端口驱动程序
portability 可移植性
preempt 抢占
preemptive 抢先式
prefetcher 预取器
principal 安全个体
priority boost 优先级提升
priority inversion 优先级倒置
privilege 特权
procedure 过程
process 进程
Process environment block,PEB 进程环境块
process explorer 进程管理器(视上下文
process manager 进程管理器(视上下文
processor 处理器
profile 轮廓,性能剖析
prototype page table entry,prototype PTE 原型页表项
push lock 推锁
quality of service,QOS 服务质量
quantum 时限
quantum boosting 时限增大
queue 队列
quota 配额
quota charges 配额花费
RAM Optimizer RAM 优化器
read-ahead 预读
record 记录
recoverability 可恢复性
Recovery Console 恢复控制台
redirector 重定向器
redo 重做
reference count 引用计数
reference monitor 引用监视器
registry 注册表
registry key 注册表键
registry value 注册表值
reliability 可靠性
Remote Direct Memory Access, RDMA 远程直接内存访问
Remote NDIS 外接NDIS
remote procedure call,RPC 远过程调用
reparse 重解析
reparse point 重解析点
reserved memory 保留的内存
resource accounting 资源记账
resource gate 资源门控
Resource Reservation Protocol,RSVP 资源预留协议
robustness 健壮性
routine 例程
run 行串(用于NTFS结构中)
scalability 可伸缩性
scatter/gather LI/O 分散/聚集 I/O
scheduler 调度器
schema 表结构
secondary object namespace 从属对象名字空间
section object 内存区对象
section, memory section 内存区
sector sparing 扇区备用
secure attention sequence.SAS 安全注意序列
Security Accounts Manager, SAM 安全账户管
security credential 安全凭证
Security descriptor 安全描述符
security identifier, SID 安全标识符
security quality of service, SQOS 安全服务质量
Security reference monitor 安全引用监视器
Security Support Provider Interface,SSPI 安全支持提供者接口
security validation 安全验证
Semaphore 信号量
serial port 串行口
server 服务器
service 服务
Service Control Manager,SCM 服务控制管理器
service descriptor table 服务描述符表
Service Pack 服务补丁包
session manager 会话管理器
session namespace 会话名字空间
shared memory 共享的内存
shim 铺垫
shutdown 停机
socket 套接字
sof fault 软错误
Software Restriction Policy 软件限制策略
spanned volume 跨距卷
spin-down 停止旋转
spinlock 自旋锁
splash screen 启动屏幕
stack frame 栈帧
stack location 栈单元
stack overrun 栈溢出
stack trash 栈破坏
standby list 备用(页面)列表
startup 启动
starvation 饥饿
storage area network,SAN 存储区域网络
striped volume 条带卷
stub 存根
symbolic link 符号链接
symmetric multiprocessing, SMP 对称多处理
synchronization 同步
system service 系统服务
system service call 系统服务调用理器
system service dispatching 系统服务分发
system volume 系统卷
targeted DPC 定向的DPC(与特定的CPU相关联)
Task Manager 任务管理器
task ofloading 任务外移
TDI transport TD 1传输器
terminal service 终端服务
thread 线程
Thread environment block,TEB 线程环境块
thread scheduling 线程调度
thread-thrashing 线程频繁轮换
tick 嘀嗒
time slice 时间片
timer 定时器
TLS 线程局部存储区
transaction 事务
transition 转移,转换
Translation Look-aside Buffer,TLB 地址转译快查缓冲区
Transport Driver Interface, TDI 传输驱动程序接口
trap 捕获(动词),陷阱(名词)
trap frame 陷阱帧
trap handler 陷阱处理器
trigger 触发器
trim 修剪
truncate 截断、截短
undo 撤销
unicast 单播
Universal Disk Format, UDF 通用磁盘格式
Universal Naming Convention, UNC 统一命名规范
Universal Plug and Play.UPnP 通用即插即用
unmanaged code 非托管代码
user mode 用户模式
view 视图(确切含义视上下文)
virtual address control block,VACB 虚拟地址控制块
Virtual address descriptor,VAD 虚拟地址描述符
virtual cluster number,VCN 虚拟簇号
volatile 易失的、易失性
window station 窗口站
Windows 管理规范
Windows Driver Model, WDM Windows 驱动程序模型
Windows Error Reporting Windows 错误报告
Windows File Protection, WFP Windows 文件保护机制
Windows Global Flags Windows 全局标志
Windows Internet 名称服务
Windows Internet Name Service WINS,Windows管理规范
Windows Management Instrumentation Windows管理规范
Windows Sockets Direct, WSD Windows 套接字直接访问
working set 工作集
working set trimming 工作集修剪
write throtling 写节流
write-behind 滞后写
write-through 直写
yield 放弃
zero list 零(页面)列表
zero page thread 零页面线程

加载动态库 (loadlibrary) # issue 标题模板 默认: 加载动态库 (loadlibrary)

[toc]

加载

> using的用法参考 使用using起别名

#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &quot;PipeIPC/PipeIPC.h&quot;

int main()
{
    std::cout &lt;&lt; &quot;--- DLL Test ---\n&quot;;

    HINSTANCE hDLL; // Handle to DLL
    using Face = int * (*)(int,int);

    hDLL = LoadLibrary(L&quot;mydll.dll&quot;);
     if (hDLL != NULL)
    {
        Face faceSum = (Face)GetProcAddress(hDLL,
            &quot;mySum&quot;);

        if (!faceSum)
        {
            // handle the error
            FreeLibrary(hDLL);
            return 0;
        }
        else
        {
            // call the function
           	faceSum(1,1);
        }
    }
    return 0;
}

生成动态库

dllmain.cpp

#ifdef __cplusplus
extern &quot;C&quot;
{
#endif	 

#define MYIMAPI extern &quot;C&quot; __declspec(dllimport)

#define MYEXAPI extern &quot;C&quot; __declspec(dllexport)

#ifdef __cplusplus
}
#endif

MYEXAPI int Add(int numa, int numb)
{
    return numa + numb;
}

MYEXAPI int Sub(int numa, int numb)
{
	return (numa - numb);
}

配置多个账号 # issue 标题模板 默认: 配置多个账号

[toc]

生成多个密钥

  1. 生成多个密钥,生成时修改密钥文件的文件名

    ssh-keygen -t rsa -C &quot;邮箱&quot;

    注意上述命令执行完之后第一个输入要求的是输入的保存的文件名

    示例:

    ssh-keygen -t rsa -C &quot;[email protected]&quot;
    # 保存的时候可以选择保存文件的名称设置为 id_rsa_qq
    
    # 接着执行另外一个账号
    ssh-keygen -t rsa -C &quot;[email protected]&quot;
    # 保存的时候可以选择保存文件的名称设置为 id_rsa_163
  2. 添加密钥

    # 切换
    ssh-agent bash
    
    # 添加
    ssh-add ~/.ssh/id_rsa_qq
    ssh-add ~/.ssh/id_rsa_163
  3. 将密钥添加到账户中

    使用 cat 查看对应账户的 pub 文件。将其内容添加到账户中。

    校验

    简单点就是ssh:

    ssh -T &quot;[email protected]&quot;

    返回 Hi (用户名)! You&#39;ve successfully authenticated, but GitHub does not provide shell access. 开头样式的表示添加密钥成功了。

png和jpg格式的图片(一) # issue 标题模板 默认: png和jpg格式的图片(一)

[toc]

jpgpng 图片格式

在写这篇文章之前,笔者在编写一个简单的 Qt 程序时遇到了这样一个问题:

> 问题:一个png格式的图片改成后缀为jpg格式的图片时,QLabel无法读取的问题。笔者是通过setStyleSheet()QImageQPixmap的接口均尝试过将改后缀后图片设置到QLabel中,均以<mark style="background-color:red">失败</mark>告终。

特此研究了一下这jpgpng两者之间的区别,后续再研究一下Qt关于相关格式图片读取的问题。

图片会有jpgpng两种格式,那么这俩种格式的图片又有着什么样的区别呢?下面就给大家分享一下。 pngjpg都是常用的图片格式,其中png属于无损压缩,jpg是有损压缩,使用中两者最明显的一个区别是:

  • png支持透明通道
  • jpg的图片更适合在网络中传播和使用。

jpg格式

> **jpg:**是JPEG标准的产物,也是目前网络最为流行的图片格式,jpg格式的图片可以将图像文件压缩到最小格式,在高度压缩率的同时,可以展现是分丰富生动的图像,但是随着压缩比的增大,图片的品质会逐渐降低的。我们现在常用的jpg的标准全程为JPEG 2000标准,有以下几点特性:
>
> 1. 高压缩率
> 2. 无损压缩和有损压缩
> 3. 渐进传输
> 4. 感兴趣区域压缩
> 5. 码流的随机访问和处理
> 6. 容错性
> 7. 基于内容的描述

png格式

> **png:**是一种采用无损压缩算法的位图模式,其设计目的是视图替代GIF和TIFF文件格式,同时增加一下GIF文件格式所不具备的特性。PNG使用从LZ77派生的无损数据压缩算法,一般应用于JAVA程序、网页或S60程序中,原因就是因为png的压缩比更高,生成文件体积小。png图片也有一些特性:
>
> 1. 体积小
> 2. 无损压缩
> 3. 索引彩色模式
> 4. 更优化的网络传输显示
> 5. 支持透明模式

关于 png 格式还需要说明的是:

png格式有8位、24位、32位三种形式,其中8位PNG支持两种不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基础上增加了8位透明通道,因此可展现256级透明程度。

PNG8和PNG24后面的数字则是代表这种PNG格式最多可以索引和存储的颜色值。8代表2的8次方也就是256色,而24则代表2的24次方大概有1600多万色。

区别:pngjpg

> 转自百度百科:
>
> 1、JPEG可以对照片(或类似)图像生成更小的文件,这是由于JPEG采用了一种针对照片图像的特定有损编码方法,这种编码适用于低对比,图像颜色过渡平滑,噪声多,且结构不规则的情况下。如果在这种情况下用PNG代替JPEG,文件尺寸增大很多,而图像质量的提高有限。相应的,如果保存文本,线条或类似的边缘清晰,有大块相同颜色区域的图像,PNG格式的压缩效果就要比JPEG好很多,并且不会出现JPEG那样的高对比度区域的图像有损。如果图像既有清晰边缘,又有照片图像的特点,就在在这两种格式之间权衡一下了。JPEG不支持透明度。
>
> 2、由于JPEG是有损压缩,会产生迭代有损,在重复压缩和解码的过程中会不断丢失信息使图像质量下降。由于PNG是无损的,保存将要被编辑的图像来说更加合适。虽然PNG压缩照片图像也有效,但有专门针对照片图像设计的无损压缩格式,比如无损JPEG2000,Adobe DNG等。总的来说这些格式都不能做到适用所有图像。对于将要发布的图像可以保存成JPEG,用JPEG编码一次不会造成明显的图像有损。

总结就是:

  1. jpg格式的图片能在高度压缩率的同时,展现十分丰富生动的图像,但是随着压缩比的增大,图片的品质会逐渐降低的。而png图片的特性就是体积小,节约空间,与jpg图片相比,png图片时无损压缩,在不损失图片数据的情况下,可以快速的获取自己想要的图片,而且图片的质量并不会下降。
  2. png格式的图片可以编辑,比如图片中的字体、线条等,可以通过ps等软件更改。但是jpg格式的图片则不可以更改,pngjpg图片相比png格式的图片更大。

OSI参考模型 # issue 标题模板 默认: OSI参考模型

OSI 参考模型是一个理想化的方案。这么说是因为很少有系统是完全按照它来实现(关于这一点可以后续再讨论),但是它通常被用来作为网络原理讨论的框架。

> 一台机器上的每一层都假设它在跟另一台机器上的同一层“通话”。在同一层次上,两台机器“说”的是同一种语言或协议。

每一次网络传输必须都要向下传输,通过客户机器的每一层,再传输到网络上,然后再目标机器上向上传递,直至到达某一可以理解和执行该请求的层。

在 OSI 模型中,每一层的目的是:向更高的层提供服务,并且对如何在低层上实现这些服务进行抽象。

以下内容为 OSI 七层中每一层的介绍:

  1. 物理层
  2. 数据链路层
  3. 网络层
  4. 传输层
  5. 会话层
  6. 表示层
  7. 应用层

# issue 标题模板 默认:

学习|记录|分享

🤗🙂🤩🤔🤨😗🥰😘😀😁😂🤣😃😄😅😆😗🥰😘😍😎😋😊😉😙😚😐😑😶🙄🙂🤗😏🤩😣🤔😥🤨😮😛😌😴😫🥱😪😯🤐😜😝🤤😒😓😔😕🙃🤑😲☹🙁😞😖😟😤😬🤯😩😨😧😦😭😢😰😱🥵🥶😳🤪😵🥴🤮🤢🤕🤒😷🤬😡😠🤧😇🥳🥺🤠🤡🤥🤫💀👺👹👿😈🤓🧐🤭☠👻👽👾🤖💩😺😸🐱‍👤😾😿🙀😽😼😻😹

> 个人维护的wiki,涉及工作、学习中用到的技术和方案以及工具

👉 Xmind文件


🎵 私藏音乐


🎨 封面


🔎 资源


👍 Demo

Curl 请求 Https

Curl 请求 Https

使用 curl 发送 https 请求时,如下命令就会报错:

curl &quot;https://www.baidu.com&quot;

错误代码:

<div style="background:black;font:conloas;color:white;">
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html
</div>

一般的解决办法就是下载CA证书。但是使用C++代码调用 libcurl 发送 https 请求,只需要在设置一下这个就可以关闭 ssl 验证,从而能够发送 https 请求。

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);

blog link Curl 请求 Https

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.