不区分编程语言,分享的代码段均可以push
就和文件夹命名一致
All Code Language Source of MING
Procmon 过滤用法
重命名完成之后会删除以上文件
调用安装目录下 ClearHost.exe
注册表路径
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
更新字段
配置系统LocalDumps,设置相关注册表项
以更新程序的快捷方式命名为主。
调用 Trustservice.exe /update
更新。
调用 TrustFixservice.exe /update
更新。
调用 Trustservice.exe /start
更新。
直接启动 $INSTALLDIR\Dbg\Ymdbg.exe
Exec YMDbg.exe -i1
blog link Procmon 过滤用法
[toc]
> 科学技术是历史发展的火车头,改变了社会历史进程,造就了新的社会形态;推动了生产力内部各要素的变革,引发了产业结构的调整、经济形式的变化和经济增长方式的转变,造就了经济转型;产生了技术异化现象,要对异化的资本主义制度展开批判,更好地发挥科学技术的社会功能。
> 科学技术作为社会发展的动力,是马克思主义的基木观点。科学是生产力的“知识的形态”。作为生产力的科学技术,能够大大提高社会生产力水平,推动着整个人类物质生产的迅猛发展。
> 作为强大的精神力量的科学技术,能够促进人类**的解放,在产业革命的基础上,推动社会变革,对社会生产关系产生有力影响。
> 作为人类最终走向白由的科学技术,能够作为解放的杠杆,增进人类精神生活的丰富性和自我发展能力,有助于实现人的全面自由的发展。
> 科技异化实质上是在资本主义制度下劳动异化和人的异化一种必然结果。由于劳动是人的最根本最现实的实践活动,是人及人类社会存在的根本方式,劳动的异化必然带来人的其他社会活动和社会关系的全面异化,科学技术也不例外,因为“宗教、家庭、国家、法、道德、科学、艺术等等,都不过是生产的一些特殊的方式,并且受生产的普遍规律的支配。”
>
> 因此,科学技术作为劳动亦即人处理自身与自然界关系的社会活动的产物,也必然随着资本主义社会劳动的异化而表现出异化的现象。最根本的是要消灭对科学技术的资本主义利用方式,把现代科学技术从资本主义制度下解放出来。也就是说只有通过无产阶级革命来最终解决资本主义的科技异化问题。当然,在马克思看来,异化的完全克服只有在共产主义社会制度中才能最终实现。
> 科学技术的社会建制有一个历史过程。经济支持制度、法律保障体系等科学技术体制是根本,各种组织机构及其科研组织运行是保证,科学技术的伦理规范是导引。在科学技术发展应用的新阶段,科学技术的社会建制呈现出一些新特点,因此必须进行科学技术体制改革,以保证科学技术的良好运行。
> 作为社会建制的科学技术体制是在一定社会价值观念支配下,依据相应的物质设备条件形成的一种社会组织制度,旨在支持推动人类对自然的认识和利用。科学技术的体制化以相应的职业化为核心,其内涵随着科学技术的发展而不断拓展和丰富。科学技术的社会体制包括:组织领导体制、经济支持制度、法律保障体制、交流与传播体制、人才教育培养制度等。科学技术与其他各种事业密切相关,需要建立相应的组织机构以保证科学技术活动的顺利进行。科学技术组织机构随着历史的演化而变化,具有各白的特点和功能,是实现科学技术现代化的组织保证。在科学技术社会史上形成与发展起来的组织机构有:科学技术决策、管理与咨询机构,科学技术活动组织机构,科学技术传播机构,科学技术人才培养机构。
>
> ---
>
> 【以下摘白百度贴吧帖子“科学技术的社会体制化及其对科学发展的意义”】
> 科学技术体制化的内容包括:科学技术的投入体制、科技研究的结构比例、科学技术的法律制度、科技研究的管理体制。
> 科学技术的社会体制化对科学发展的意义:1、它可以积聚社会上的力量来进行柑应的科学研究;2、当代科技活动的结构中基础研究将会有大量的人员参l与j;3、明确的法律以及管理制度将会更进一步促进科学技术的发展。
> 科学技术活动与人类其他活动一样,建立在诚信和道德的基础上。现阶段,默顿的科学的精神气质受到挑战,科学技术工作者有失范行为,需要制定相关科研诚信指南和工程师伦理准则加以规范。科学工作者进行科学研究和医学实践,尤其是进行人体实验和动物实验,应该遵循社会伦理、生命伦理、动物伦理等。技术工作者,尤其是工程师,在工程技术活动中,应该遵循一定的职业伦理和社会伦理准则,应该承担对社会、专业、雇主和同事的责任,应该对工程的环境影响负有特别的责任,规范白己的行为,为人类福祉和环境保护服务。
> (一)社会文化对科学技术的影响
> 科学技术的产生和发展需要一定的社会文化环境。社会文化与科学技术文化紧密关联,并由此影响科学技术的发展及其应用。默顿在《十七世纪英格兰的科学、技术与社会》中提出的“清教主义促进英国近代科学的制度变化”,以及“李约瑟难题”——“近代科学为什么没有在**诞生”的解答,就说明了这一点。
>
> (二)科学文化与人文文化的协调
> 1.要防止科学在生活世界、自然世界对人文的僭越所造成的科学文化与人文文化之间的冲突,深刻理解科学的限度,用正确的人文理念指导我们的生活。
> 2.必须以社会先进文化来引领科学技术文化,使科学技术发展和应用为经济社会健康全面发展服务。得到广泛提倡的环境科学技术就是为了协调人与自然之间的关系所做的努力,是科学技术文化与人文文化——绿色文化的良性互动产物。
> 科学技术的风险包括环境风险、政治风险、经济风险、健康风险和伦理风险等。这些风险会引发一系列争论,造成评价和决策上的困难。***指出:“要加快建立科技咨询支撑行政决策的科技决策机制,加强科技决策咨询系统,建设高水平科技智库。要加快推进重大科技决策制度化,解决好实际存在的部门领导拍脑袋、科技专家看颜色行事等问题。”
>
> 要恰当进行科学技术风险评价与决策,就应该全面评价科学技术风险—收益的多个方面,批判性地考察“内部"存有争议的科学知识或技术知识,分析相互竞争的利益集团和社会结构的"外部"政治学,理解科学技术专家知识和决策的局限性、公众理解科学的必要性以及外行知识的优势,明确政府、科学技术专家以及公众在与科学技术风险相关的公共决策中的不同作用,确立公众参与决策的可能方式,从而形成最优化的科学技术公共政策模式,以达到对科学技术风险社会有效治理的目的。
> ***、***、……、胡锦涛、***的科学技术**,是在**共产党领导我国科学技术事业发展和进行社会主义现代化建设的伟大时间中,逐渐形成、发展和完善的。
>
> **马克思主义科学技术观是基于马克思、恩格斯的科学技术**,对当代科学技术机器发展规律的概括和总结,是马克思主义科学技术论的重要组成部分。
>
> **马克思主义科学技术观是**共产党人集体智慧的结晶,是对***、***、……、***科学技术**的概括和总结,是他们科学技术**的理论升华和飞跃,是他们科学技术**的凝练和精髓。
>
> **马克思主义科学技术观的内容丰富,涉及了科学技术的功能、目标、机制、战略、人才和方针等重大问题,是一个科学、完整的**理论体系。
> **马克思主义科学技术观概括和总结了***、***、···、***等的科学技术**,包括科学技术的功能观、战略观、人才观、和谐观和创新观的基木内容,体现出时代性、实践性、科学性、创新性、自主性、人本性等特征,建设**特色的创新型国家,是**马克思主义科学技术观的具体体现。**马克思主义科学技术观,是马克思主义科学技术观与**具体科学技术实践相结合的产物,是马克思主义科学技术论的重要组成部分。
> **马克思主义科学技术观的三个历史阶段是其各自所处的历史条件所决定的,是对时代背景实事求是的反映,因此科学技术**都镌刻了时代的烙印,反映了时代的需求。
>
> ***新时代**特色社会主义**中的科学技术观,是在**特色社会主义进入新时代的历史条件下形成的。新时代之“新",一是在于我们进入了一个新的发展阶段,发展环境、发展条件都发生了新的变化,目标任务也发生了新的变化;二是在于我们面临着新的社会主义主要矛盾;三是我们迈向新的奋斗目标。正是基于这一新时代的"新"特征时代背景,***立足于我贵哦科学技术与社会发展的现实需要,提出了一系列关于科学技术发展的理论观点,形成了***新时代**特色社会主义科学技术观。
参考链接:
[TOC]
在上篇文章{% post_link 'png和jpg格式图片.md' %}中笔者就 jpg
和 png
两种格式进行了说明,但是关于 Qt 打开改后缀文件名之后图片的问题依然没有说明。要探究Qt为何不能打开改了后缀的图片文件,这个还是得从多方面去定位。前文说了,通过三种方式设置了 QLabel
的图片。
> 这里还是先说明一下设置不成功的场景如何复现:
>
> 1. 找一张 .jpg
的图片,修改后缀也就是文件属性为 .png
> 1. 通过以下三种方式中的任意一种去设置 QLabel
为图片。
>
> Qt 版本是 5.9
>
> 编译器试了 MSVC
和 mingw
都不好使。
QLabel
设置图片方法QPixmap
设置 QLabel
的图片QPixmap img(":/Win11.png");
ui->label->setPixmap(img);
ui->label->setScaledContents(true);
QImage
设置 QLabel
的图片QImage img;
img.load(":/Win11.png");
ui->label->setPixmap(QPixmap::fromImage(img))
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);
场景是描述完了,可以动手尝试了
接着就是去查看几种实现方式中的源码是如何是设置的了,这里先猜一下结论
> 就是 png
和 jpg
格式的算法不同,格式问题导致的读取的算法不一致,因此Qt内部实现的读取图片的算法只能根据图片文件的后缀所对应的算法去读取算法,而 setStyleSheet
算法也是基于这么一个逻辑,因此三种读取方式都不成功。
>
> 关于图片算法的问题,在上篇文章{% post_link png和jpg格式图片 png和jpg格式的图片(一) %}中也略微提到,这个我们不深做研究,只需知道 jpg
和 png
不是同一种算法,也不通用即可。
因为上述几种步骤笔者都做过尝试,因此在验证过程中我们不纠结于使用哪一种方式,直接看结果。
qrc
文件中,去掉图片的后缀名,不带后缀属性去读取图片看看其是否可以读取成功。<mark>运行结果</mark>: QLabel
读取成功
如上图所示,在 qrc
文件中去掉图片的后缀,读取图片设置到 QLabel
依然是成功的。
png
,看看这次能不能读取成功。<img src="../../images/Qt%E5%9B%BE%E7%89%87/image-20220423143916480.png" alt="修改后缀为png" style="zoom:50%;" />
<mark>运行结果</mark>:读取失败
如上图所示,添加后缀后反而还展示不成功了。
这就基本上说明了:
> 在 Qt
的内部有很大的几率是通过文件的后缀去判断调用哪个图片读取算法的。也就是说,当你人为的修改了 png->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的源文件,一般存放在 Qt
安装目录下 ${安装目录}\5.9.9\Src\qtbase\src\gui\image
,文件名为 qpixmap.h qpixmap.cpp
先看一下 QPixmap
的 构造函数中读取图片文件的方法。
QPixmap::QPixmap(const QString& fileName, const char *format, Qt::ImageConversionFlags flags)
的源码
QPixmap::QPixmap(const QString& 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是如何实现的
}
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'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'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 &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("qt_pixmap")
% info.absoluteFilePath()
% HexString<uint>(info.lastModified().toSecsSinceEpoch())
% HexString<quint64>(info.size())
% HexString<uint>(data ? data->pixelType() : QPlatformPixmap::PixmapType);
if (QPixmapCache::find(key, this))
return true;
data = QPlatformPixmap::create(0, 0, data ? data->pixelType() : QPlatformPixmap::PixmapType);
if (data->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("qt_pixmap")
% info.absoluteFilePath() // 返回文件名的绝对路径
% HexString<uint>(info.lastModified().toSecsSinceEpoch()) // 返回文件最后一次修改的日期和时间
% HexString<quint64>(info.size()) // 返回文件的大小
% HexString<uint>(data ? data->pixelType() : QPlatformPixmap::PixmapType); // 这里的data是成员变量,就是说如果设置了data的pixelType的值就读取,没设置的话就是默认值 QPlatformPixmap::PixmapType
上述的 HexString<type>
就是 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("my_big_image", &pm)) {
pm.load("bigimage.png");
QPixmapCache::insert("my_big_image", pm);
}
painter->drawPixmap(0, 0, pm);
最终判断当前文件是不是图片应该是在 data->fromFile()
中实现的。
这个data
的定义:
QExplicitlySharedDataPointer<QPlatformPixmap> 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 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 :远程分支
# 查看git config
git config -l
git stash
git stash pop
# 拉取远端分支到本地分支 Develop分支到本地Develop分支
git fetch origin Develop:Develop
git cherry -v
git checkout current_branch
git checkout --patch zhiding_branch f.txt
合并 zhiding_branch
分支上的 f.txt
文件到 current_branch
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
批处理获取ip到剪切板
> 客户端开发远程调试每次都需要获取机器的ip,然后手动填写,较为麻烦,因此简单做了一个可以获取ip到剪切板当中的批处理脚本,可以获取系统当前ip到剪切板中。
[toc]
获取ip的命令有多种,最终实现就是只要能打印出当前系统ip的命令都可以。
ipconfig
route print
以下两个脚本就是从上述两个命令当中获取ip地址:
@echo off
for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr ^^IPv4') do (set IP=%%a)
echo %IP%
pause
@echo off
for /f "tokens=4" %%a in (' route print ^| findstr 0.0.0.0.*0.0.0.0 ^| findstr /v "默认" ') do (set IP=%%a)
echo 你的局域网IP是: %IP%
pause
> <span style="font-weight:900">for /f
</span>的用法:
>
> 在For
命令语踞饽参数F中,最难理解的就是Delims
和Tokens
两个选项,本文简单的做一个比较和总拮。
> “For /f
”常用来解析文本,读取字符串。分工上,delims
负责切分字符串,而tokens
负责提取字符串。如果把字符串当作蛋糕,Delims
像刀子,用来切蛋糕,tokens
像叉子,用来取切好的蛋糕。
(ipconfig|select-string "IPv4"|out-string).Split(":")[-1]
剪切板的关键字为:clip
使用 clip \?
可以查看帮助
c:\windows\system32>clip /?
clip
描述:
将命令行工具的输出重定向到 windows 剪贴板。这个文本输出可以被粘贴
到其他程序中。
参数列表:
/? 显示此帮助消息。
示例:
dir | clip 将一份当前目录列表的副本放入 windows 剪贴板。
clip < readme.txt 将 readme.txt 的一份文本放入 windows 剪贴板。
c:\windows\system32>
结合以上两个命令,脚本稍微修改一下就能实现获取ip到剪切版的功能。
blog link 批处理获取ip到剪切板
[toc]
在应用商店安装 dynamic theme
先将个性化锁屏界面选项由"Windows 聚焦"改为"图片"。
然后去删除
C:\Users\你自己的用户名\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_***\Settings
(***为随机数字)目录下settings.dat
和 roaming.lock
这两个文件。(注:AppData
等是隐藏的文件夹或文件)
再然后回到个性化锁屏界面将选项由"图片"改回"Windows 聚焦"。
稍等,OK!
随后应该可以看到 :...\Microsoft.Windows.ContentDeliveryManager_***\LocalState\Assets
文件夹里下载了一批聚焦图片
..\Microsoft.Windows.ContentDeliveryManager_***\settings
目录下重新生成了 settings.dat
文件。
[TOC]
补丁是指衣服、被褥上为遮掩破洞而钉补上的小布块。明白了吗?
> 现在也指对于大型软件系统(如微软操作系统)在使用过程中暴露的问题(一般由黑客或病毒设计者发现)而发布的解决问题的小程序。就像衣服烂了就要打补丁一样,人编写程序不可能十全十美的,所以软件也免不了会出现BUG,而补丁是专门修复这些BUG做的因为原来发布的软件存在缺陷,发现之后另外编制一个小程序使其完善,这种小程序俗称补丁。补丁是由软件的原来作者制作的,可以访问网站下载补丁。
>
> 补丁一般都是 .exe
文件
微软的Windows操作系统比较大,比较复杂。因此总有考虑不周的地方。有些病毒或者黑客就利用微软的漏洞进行攻击。微软发现漏洞后就发布一些补丁程序。 我们得到微软的补丁程序后安装到计算机上就叫打补丁。
> 什么是微软补丁?
>
> 微软发布的系统补丁有两种类型:Hotfix
和 Service Pack
,下面介绍它们之间的区别和联系。
>
> - hotfix
是微软针对某一个具体的系统漏洞或安全问题而发布的专门解决程序,Hotfix
的程序文件名有严格的规定,一般格式为“产品名-KBXXXXXX-处理器平台-语言版本.exe”。现在一个例子来详细说明:微软针对震荡病毒而发布的Hotfix
程序名为“Win2K-KB835732-X86-CHS.exe”,我们知道这个补丁是针对Win2000系统的,其知识库编号为 835732,应用于 X86 处理器平台,语言版本为简体中文。
> - Hotfix
是针对某一个具体问题而发布的解决程序,因此它会经常发布,数量非常大。用户想要知道目前已经发布了哪些Hotfix
程序是一件非常麻烦的事。因此微软将这些Hotfix
补丁全部打包成一个程序提供给用户安装,这就是Service Pack
,简称SP
。Service Pack
包含了发布日期以前所有的Hotfix
程序,因此只要安装了它,就可以保证自己不会漏掉一个Hotfix
程序。而且发布时间晚的Service Pack
程序会包含以前的Service Pack
,例如 SP3
会包含SP1
、SP2
的所有补丁。
> 重新引导一台机器以便把最新的补丁都应用上,这对于服务器来说可能会意味着一段显著的宕机时间,这也正是为什么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)部分,也就是函数的开始。
使用热补丁也存在一些限制:
参照 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
> ~~~
>
>
[toc]
(1)古代朴素自然观以直观性、思辨性和猜测性的方式从整体把握认识自然界的本源和发展,但缺乏系统的、以实验为基础的科学依据,尤其是将非物质性的东西当做限于物质世界的独立存在,并认为物质世界是它的派生物,为唯心主义的产生提供了借口,最终导致人类认识的分化。
(2)机械唯物主义自然观的核心是自然界绝对不变,虽然在实证科学的基础上继承和坚持了古代朴素唯物主义的**,但是不懂得一般与个别、运动和静止等的辩证关系,以一种片面的、孤立的和静止的方法观察自然界,挤不动的自然界的辩证法,自然不能吧唯物主义坚持到底。
(3)辩证唯物主义自然克服了以往哲学自然观的缺陷,坚持了物质世界的客观实在性的唯物主义一元论原则,突出了物质世界的整体性和矛盾性,提示了物质世界的普遍联系,强调了人类起源于自然界、依赖于自然并在把握自然界发展规律的基础上能移动地和改造自然,强调了人与自然界的和谐统一。
第一,它们都围绕人与自然界关系的主题,丰富和发展了马克思注意自然观的本体论、认识论和方法论;它们都坚持人类与自然界、人工自然界和天然自然界、人与生态系统的辩证统一,都为实现可持续发展和生态文明建设奠定了理论基础。
第二,它们在研究人与自然界关系的各方面各有其侧重点;系统自然观为正确认识和处理人与自然地关系提供了新的思维方式,人工自然观突出并反思了人的主体性和创造性;自然生态馆站在人类文明的立场,强调了人与自然界的协调与发展。
第三,它们在研究人与自然界的关系方面相互关联;系统自然观通过系统思维方式,为人工自然观和生态自然观提供了方法论基础;人工自然观通过突出人的主体性和实践性,为系统自然观和生态自然观提供了认识论前提;生态自然观通过强调人与自然界的统一性、协调性关系为系统自然观和人工自然观指明了发展方向和目标。
生态文明是人类文明的一种形式。它以尊重和维护生态环境为主旨,以可持续发展为根据,以未来人类的继续发展为着眼点。人类对生态文明的探索,是对人与自然和谐关系的表现。生态文明与生态自然观有着紧密的联系,生态文明是生态自然观的应有之义,生态自然观对现今世界生态文明发展及实践有着广泛的指导意义。生态文明的提出,是人们对可持续发展问题认识深化的必然结果。人类通过遵守可持续性、共同性和公平性等原则,通过实施节能减排和发展低碳经济,构建和谐社会和建设生态文明,实现人类社会与生态系统的协调发展;人与生态系统的协调发展仍应以人类为主体,仍应包括改造自然的内容,注重保护生态环境和防灾减灾;生态自然界是天然自然界和人工自然界的统一,是人类文明发展的目标,生态文明的提出,是人们对可持续发展问题认识深化的必然结果。生态自然观指出,人与自然都是生态系统中不可或缺的重要组成部分,人与自然是相互依存、和谐共处、共同促进的关系。人类的发展应该是人与社会、人与环境、当代人与后代人的协调发展。人类的发展不仅要讲究代内公平,而且要讲究代际之间的公平,不能以当代人的利益为中心,甚至为了当代人的利益而不惜牺牲后代人的利益。而必须讲究生态文明,牢固树立起可持续发展的生态文明观。
简单的来说,"绿水青山就是金山银山”就是指生态可持续发展。蓝天白云、青山绿水是人类赖以生存的环境,是社会长远发展的最大本钱,生态优势可以变成经济优势、发展优势,形成了一种浑然一体、和谐统一的关系。因此保护绿水青山,才能保住人们赖以生存的生态环境,从而赢得长远的经济可持续发展。
***总书记关于绿水青山就是金山银山的辩证论是生态环境生产力理论生动、朴实和富含哲理的印证:“绿水青山可以源源不断地带来金山银山,绿水青山本身就是金山银山,我们种的常青树就是摇钱树,生态优势变成经济优势。”
“如果能够把这些生态环境优势转化为生态农业、生态工业、生态旅游等生态经济的优势,那么绿水青山也就变成了金山银山。”当然,绿水青山和金山银
山之间也有矛盾,绿水青山是真正的金不换,“绿水青山可带来金山银山,但金山银山却买不到绿水青山”。
因此,当绿水青山和金山银山之间有不可调和的矛盾时,我们宁要绿水青山,不要金山银山。要像对待生命一样对待生态环境,统筹山水林田湖草系**理,实行最严格的生态环境保护制度,形成绿色发展方式和生活方式,坚定走生产发展、生活富裕、生态良好的文明发展道路,建设美丽**。
绿水青山就是金山银山的理念,一头是人类赖以生存的自然环境,另一头牵着财富生产;一头连着生态环境,另一头是人类活动的产物。从人与自然是生命共同体出发,将生态环境内化为生产力的内生变量与价值目标,蕴含着尊重自然、顺应自然、保护自然,谋求人与自然和谐发展的生态理念和价值诉求。
揭示了生态环境与生产力之间的辩证统一关系,突破了把保护生态与发展生产力对立起来的僵化思维,内含了保护、改善与建设生态环境和保护与发展生产力的有机统一,鲜活地概括了有**气派、**风格和**话语特色的绿色发展内涵,是**化马克思主义理论的光辉典范。
朴素唯物主义自然观是古代自然哲学家们以科学技术为基础,概括和总结自然界及其与人类的关系形成的总的观点。它是马克思主义自然观形成的最初**渊源。它具有①整体性和直观性,②思辨性和臆测性,③自发性和不彻底性。朴素唯物主义自然观的**渊源是原始宗教神话自然观,其理论基础是自然哲学。朴素唯物主义自然观具有一定的缺陷:①不能彻底地坚持唯物主义,具有唯心主义因素,如泰勒斯的"水本原说”②不能满足民众的需要,掺杂着宿命和迷信等因素。③不能科学地说明自然界。
机械唯物主义自然观是近代自然科学家们以近代科学技术为基础,概括和总结自然界及其与人类的关系形成的总的观点。它是马克思主义自然观形成的重要**渊源。它具有①机械性②不彻底性③形而上学性。机械唯物主义自然观①为辩证唯物主义自然观的形成创造了条件。他以近代自然科学为基础,强调自然界存在的客观性,物质性和发展的规律性,传承了朴素唯物主义自然观的**传统。③为辩证唯物主义自然观的形成提供了前提。它所培植的崇尚理性的科学精神促进了辩证唯物主义自然观的形成。
辩证唯物主义自然观是马克思恩格斯以近代科学技术为基础,概括和总结自然界及其与人类关系形成的总的观点。它是马克思主义自然观形成的重要标志。辩证唯物主义自然观具有①实践性②历史性③辩证性④批判性。辩证唯物主义自然观“扬弃”了机械唯物主义自然观,在更高层次上实现了向古希腊朴素唯物主义自然观的回归。
三种自然观的发展本质是人类认识的发展,辩证唯物主义自然观是对朴素唯物主义自然观的否定之否定,是对机械唯物主义自然观的否定。任何一种自然观的产生都脱离不了当时科学的发展水平,也离不开人们的认识水平。而更先进的自然观对科学的发展又具有指导性意义。这个发展是螺旋上升的,在我们的认识中还会进行补充和丰富,在运动中发展自己。
P42
生态文明是人类文明的一种形式。它以尊重和维护生态环境为主旨,以可持续发展为根据,以未来人类的继续发展为着眼点。人类对生态文明的探索,是对人与自然和谐关系的表现。生态文明与生态自然观有着紧密的联系,生态文明是生态自然观的应有之义,生态自然观对现今世界生态文明发展及实践有着广泛的指导意义。生态文明的提出,是人们对可持续发展问题认识深化的必然结果。人类通过遵守可持续性、共同性和公平性等原则,通过实施节能减排和发展低碳经济,构建和谐社会和建设生态文明,实现人类社会与生态系统的协调发展;人与生态系统的协调发展仍应以人类为主体,仍应包括改造自然的内容,注重保护生态环境和防灾减灾;生态自然界是天然自然界和人工自然界的统一,是人类文明发展的目标,生态文明的提出,是人们对可持续发展问题认识深化的必然结果。生态自然观指出,人与自然都是生态系统中不可或缺的重要组成部分,人与自然是相互依存、和谐共处、共同促进的关系。人类的发展应该是人与社会、人与环境、当代人与后代人的协调发展。人类的发展不仅要讲究代内公平,而且要讲究代际之间的公平,不能以当代人的利益为中心,甚至为了当代人的利益而不惜牺牲后代人的利益。而必须讲究生态文明,牢固树立起可持续发展的生态文明观。
“绿水青山就是金山银山”的重要**,触及到了一个人类社会发展的大难题,即:金山银山是人的物质追求,绿水青山是人赖以生存的自然条件,这两者都是人生存和发展所需要的,而这两者对于人来说又很难兼得。自工业革命以来,人类以牺牲绿水青山来实现自己的物质追求,曾经创造了前所未有的文明奇迹。但是,这种不可持续的经济增长方式造成了许多灾难性的后果,促使人们在对传统的增长方式和发展理论进行反思的同时,开始重新研究发展理论,重新研究发展中人与自然的关系。
以我国为例,我们在过去实行的是“先增长后治污”模式,在“两座山”问题上实际上是采取了“为了金山银山可以暂时牺牲绿水青山”的做法;后来认识到这样做不仅不可持续,而且治污的代价要大于增长获得的收益,于是许多地方提出了“宁要绿水青山,不要金山银山”的口号,即下决心改变“先增长后治污”的模式,优化环境,保护生态。这样的口号,这样的做法,虽然也讲“可持续发展”,但实际上是把“可持续”与“发展”割裂开来,这不利于生产力的发展。
“绿水青山就是金山银山”,则以“就是”一词把“绿水青山”和“金山银山”辩证地连接起来,以积极的而不是悲观的态度阐明了这两者之间的关系,讲清楚了发展中人与自然的辩证统一关系绿水青山就是金山银山”这一重要**,所表达的则是环境、生态应该是社会生产力内部的一个有机组成部分。也就是说,***把环境、生态纳入了社会生产力的范畴。这种态度就是马克思主义的态度,这种认识就是马克思主义的认识。。
因此,我们说***关于“绿水青山就是金山银山”的重要**,以一种新颖的发展理念,坚持和发展了马克思主义创始人以积极乐观的态度认识和处理发展中人与自然关系问题的科学**。
机械论自然观的产生有其历史的必然性和合理性,但它用孤立的,静止的,片面的观点去看待世界,否认事物的联系和发展变化,否认事物的内部矛盾。实践是检验真理的唯一标准,机械论自然观的这些特点与近代自然科学已经相悖,应当摒弃。人类社会的大趋势是发展,在目前的历史环境下,机械论自然观的存在只会阻碍这种发展,所以必将被适应当前自然科学的辩证唯物主义自然观所取代,这是历史必然性。
P28
p45
从18世纪60年代起始于英国的第一头次技术革命和继之而来的产业革命,既向科学提出了新的要求,也为科学提供了新的事实,更为科学提供了新的交流方法,从而使科学在19世纪获得了长足的进步,取得了影响深远的一些重要发现,为辩证唯物主义自然观的产生提供了丰富的物质基础
19世纪的自然科学成就为辩证唯物主义自然观产生提供了科学前提。如在天文学上,1755年康德和拉普拉斯(1796年)分别提出的关于太阳系起源的星去假设。在地质学上,英国科学家莱伊尔1830年发表“地球演化学说”,在物理学上焦耳发现能量转化和守恒定律,从而动摇了形而上学的基础,在化学上1824年由维等人合成尿素,在生物上,1838年施旺提出细胞是生命 的基本结构单位,1958年达尔文创立特种起源论,对于这些重要的发现,恩格斯经过反复研究,从自然观的高度提出了运动形式及其相互转化的学说。恩格斯关于运动形式的学说把蕴含在当时诸多科学发现中的**精华作了概念性升华,从而提供了一种观察研究自然的哲学方式
综上所述,辩证唯物主义自然观的产生反映了科学技术发展的历史必然性。
马克思主义理论体系,是关于全世界无产阶级和全人类彻底解放的学说。它由马克思主义哲学、马克思主义政治经济学和科学社会主义三大部分组成,是马克思、恩格斯在批判地继承和吸收人类关于自然科学、思维科学、社会科学优秀成果的基础上于19世纪40年代创立的,并在实践中不断地丰富、发展和完善的无产阶级**的科学体系。
马克思恩格斯科学技术**表明了科学技术是推动社会发展的革命力量,通过对科学技术的理解、科学的分类、科学技术与哲学的关系、科学技术是生产力、科学技术的生产动因、科学技术的社会功能、科学技术与社会制度、科学与技术的相互关系、科学技术异化等方面观点的阐述,极大的丰富和发展了马克思主义理论,有助于指导我们正确分析科学技术及其发展的理论和现实问题。
在人类历史上,科学与技术经历了几次分合。科学与技术源起于人类的社会生产实践,本来是内在统一的,但随着生产力的发展,出现了脑力劳动与体力劳动的分工,一部分人从单纯的体力劳动中分化出来,专门从事政治、宗教、艺术、哲学等活动,科学与技术从此分道扬镳,科学活动由学者们承担,技术研究则由工匠们掌握。在古代,科学对技术的影响甚微,无论是自然经济条件下的农业技术,还是工匠的手工业技术,都是凭经验掌握和积累的,那时几乎没有以科学的应用为特征的技术,而只有手艺、技能——尽管这些经验可能发展到惊人的水平。
从15世纪下半叶近代自然科学产生以后,直到19世纪的上半叶,科学的实际应用才逐步显现效能。正如马克思所说:只有在资本主义条件下,才第一次产生了只有用科学方法才能解决的实际问题,才第一次达到使科学的应用成为可能和必要的那样一种规模,科学获得了成为致富手段的使用,发明成为一种特殊的职业,科学成为生产过程的因素,生产过程成为科学的应用。15世纪以后,科学实验活动融入科学研究20科学成就是在技术基础上的“技术科学化”的结果,技术可以产生科学,“技术科学化”表明:技术是科学发展的动力 ,科学需要推动技术前进;技术为科学的发展提供研究手段,特别是科学实
技术发展史不断证明,技术像一把双刃剑,既有有益于人类发展的一面,也有危害人类利益的一面。一方面,技术的进步推动了生产力内部各要素的变革,促进了产业结构的调整、经济形式的变化和经济增长方式的变化,实现了经济转型;变革了生产关系,增进了人类自由而全面的发展,推动人类社会进入发展的新阶段;将人类从繁重的劳动中解放出来,对人类的生活方式产生了深刻的影响。另一方面,技术的进步也产生了一些道德和伦理问题,如克隆人的伦理问题、基因治疗和基因增强的伦理问题、网络伦理问题、核伦理问题等。
因此,必须以人民为中心,大力发展事关国计民生的科学技术;必须以先进的文化来引导,协调科学文化与人文文化的冲突;必须改变单纯有利于经济增长的倾向,走经济增长与环境保护双赢之路;必须客观全面评价科学技术的风险和收益,指定恰当的科学技术公共政策。
18、19世纪,天文学、地理学、物理学、化学、解剖学、生物学等都有了长足的发展,特别是能量守恒与转化定律、细胞学说和生物进化论三大发现,使自然科学的发展进入了一个新时期,两次科技革命使人类进入了工业文明时代。马克思、恩格斯在总结和概括19世纪科学技术成果的基础上,形成了以辩证唯物主义为理论基础的科学技术**。
马克思主义科学技术观是基于马克思、恩格斯的科学技术**,对科学基础机器发展规律的概括和总结,是马克思主义关于科学技术的本体论和认识论。
从辩证唯物主义和历史唯物主义的基本立场出发,在总体上把握马克思、恩格斯的科学技术**;马克思主义认为科学是一般生产力,技术是现实生产力;科学是认识世界,技术是改造世界。现代科学和技术形成既有区别又有联系的体系结构。
(1)马克思、恩格斯关于技术本质特征的分析
马克思、恩格斯认为技术在本质上体现了“人类对自然的实践关系”,技术是人的本质力量的对象化。
第一,劳动资料延长了人的自然的肢体。
第二,工艺学在本质上揭示出人对自然的能动关系。
第三,技术的发展引起生产关系的变革。
(2)国外学者对技术本质特征的研究
欧美技术哲学存在工程学的和人文主义的两种技术研究路线;日本的技术论在技术的本质问题上形成了“方法技能说”、“劳动手段说”、“知识应用说”等观点。这些观点各有特色,但大都表现出对技术理解的单一性。
我们需要用马克思主义科学技术观进行分析评价。马克思主义认为,技术是人类为满足自身的需要,在实践活动中根据实践经验或科学原理所创造发明的各种手段和方式方法的总和。主要体现在两个方面:一是技术活动,狭义的技术是指人类在利用自然、改造自然的劳动过程中所掌握的方法和手段;广义的技术是指人类改造自然、改造社会和改造人类自身的方法和手段。二是技术成果,包括技术理论、技能技巧、技术工艺与技术产品(物质设备)。
技术在本质上体现了人对自然的实践关系,是人的本质力量的展现,属于直接生产力,是自然性和社会性、物质性和精神性、中立性与价值性、主体性和客体性、跃迁性和积累性的统一。
(1)现代科学的体系结构由学科结构和知识结构组成
学科结构由基础科学、技术科学、工程科学构成。知识结构由科学事实、科学概念、科学定律、科学假说、科学理论构成。现代科学的体系结构表现出现代科学的发展过程,其中学科结构形成立体的架构,知识结构各要素渗透在学科结构相对应的要素之中。基础科学、技术科学、工程科学都是系统化的知识,都会经过一个由科学事实到科学理论的形成过程。
(2)现代技术的体系结构由门类结构和形态结构组成
门类结构由实验技术、基本技术和产业技术构成。
形态结构由经验形态的技术、实体形态的技术和知识形态的技术构成。
现代技术的体系结构表现出现代技术的发展过程,其中门类结构是立体的架构,形态结构的各要素同样渗透咋门类结构相对应的要素当中。实验技术、基本技术和产业技术都包含经验技能,都使用工具机器,都蕴含了知识。
现代科学技术体系结构的研究表明,科学技术在各自的发展中,不但日益多样化和系统化,而且越来越呈现出科学技术一体化的特征。
继承:市科学技术发展中的量变,它可使科学知识延续、扩大和加深。科学是个开放系统,它在时间上有继承性,在空间上有积累性。只有继承已发现的科学事实、已有理论中的正确东西,科学才能发展、不断完善。
创新:是人类对自然的认识出现新的飞跃,引起科学发展中的质变。创新是继承的必然趋势和目的。
在科学技术的发展模式及动力问题上,马克思主义认为科学发展在纵向上表现为渐进与飞跃的统一,在横向上表现为分化与综合的统一,在总体趋势上表现为继承与创新的统一。
技术的发展由社会需要、技术目的及科学进步等多种因素共同推动。其中社会需求与技术发展水平之间的矛盾是技术发展的基本动力,技术目的和技术手段之间的矛盾是技术发展的直接动力,科学进步是技术发展的重要推动力。
马克思主义认为,技术的发展由社会需要、技术目的以及科学进步等多种因素共同推动。
(1)社会需求与技术发展水平之间的矛盾是技术发展的基本动力
任何技术,最早都源于人类的需要。正是为了生存发展的需要,人类起初模仿自然,进而进行创造,发明了各种技术。同时,文化对技术发展具有明显的张力作用。先进的**文化会推动技术的发展,而落后的**文化则会制约和阻碍技术的发展,包括影像技术决策、技术研发以及技术成果的产业化各方面。
(2)技术目的和技术手段之间的矛盾是技术发展的直接动力
技术目的就是在技术实践过程中在观念上预先建立的技术结果的主观形象,是技术实践的内在要求,影响并贯穿技术实践的全过程。技术手段即实现技术目的中介因素,包括实现技术目的的工具和实用工具的形式。技术目的的提出和实现,必须依赖于与之相匹配的技术手段。技术手段是实现技术目的的中介和保证,它包括达到技术功能要求所使用的工具以及应用工具的方式。
(3)科学进步是技术发展的重要推动力
19世纪中期以后,科学走到了技术前面,成为技术发展的理论向导。科学革命导致技术革命,技术发展对科学进步的依赖程度越来越高,技术已成为科学的应用。尤其是当今社会的发展,已形成了科学技术一体化的双向互动过程。
马克思主义的科学技术方法论是以辩证唯物主义立场、观点为基础,吸取具体科学技术研究中的基本方法,并对其进行概括和升华的方法论。
科学技术研究,离不开辩证思维。分析与综合、归纳与演绎、从抽象到具体、历史与逻辑的统一,这些辩证思维的形式体现和贯彻在科学家、工程师的具体科学技术研究中。自觉的认识和提升这些辩证思维的形式,对于树立,马克思主义科学技术观,深入研究科学技术,建设创新型国家具有重要意义。
马克思主义科学技术方法论的核心就是辩证思维。马克思主义科学技术方法论的基本原则就是把辩证法贯彻到科学技术研究中,以对立统一、质量互变和否定之否定的辩证**渗透到具体的科学技术研究中,把握具体科学技术的研究过程。
创造是科学研究和技术发明最重要特性之一。创造性思维不是在所有辩证思维和科学研究方法之外独立的一种思维方式或方法,是能够提出创见的思维,与一般性思维相比,是在思维特征方面不刻板,组合各种思维、灵活调用思维的特性。
创造性思维的特点是思维方向的求异性,思维结构的灵活性、思维进程的飞跃性、思维效果的整体性、思维表达的新颖性等。
创造性思维特别注重逻辑思维与非逻辑思维的统一、抽象思维与形象思维的辩证统一。
移植和学科交叉或跨学科的研究方法,是创造性思维的两种非常有效的研究方法。当代科学研究和技术发明变得越来越复杂,进行移植与交叉,通过多学科或跨学科的研究,常常能够获得单一学科研究无法获得的创新成果。多学科融合或通过跨学科研究问题也是当代科学和技术解决问题的创造性方法,体现了广泛联系和发展的辩证法。
当代各门科学之间的交叉型越来越大,通过学科之间的交叉往往可以获得新的认识,带来创新。学科交叉成为一种新的思考方式和研究方法。
所谓学科交叉方法,就是两门以上的学科之间在面对同一研究对象时,从不同学科的角度进行比对研究的方法。借鉴其他学科的研究,思考本学科的问题和对象,融合其他学科的研究方法,以达到对研究对象的新认识。
所谓跨学科方法就是通过多学科的协作共同解决同一问题的方法,跨学科也是一种学科融合的方法,也可以称为多维融贯的方法。
战略性思维是对战略科学家的思维要求。同时对于一个从事一般科学研究、技术发明和工程建设的科学家也有重要意义。***非常重视战略性思维的重要作用与深刻意义,是其提出的“六大思维”之一,战略性思维对于科学研究而言,非常重要。
战略性思维是高瞻远瞩、统揽全局、善于把握事物发展总体趋势和方向的思维方法,展示的是看问题的高度和深度。古人讲:“不谋万世者,不足谋一时;不谋全局者,不足谋一域。”科学家与工程师没有战略性思维、具有什么样的战略性思维,一定程度上决定着在**特色社会主义伟大事业中的科学技术研究能登多高、能走多远、将抵达何处。战略性思维能力的强弱,取决于思考问题的高度、理论研究的深度、知识视野的广度,以及对于科学技术发展全局的时间跨度的认识与把握。
对于国家而言,科学技术的总体规划是一种科学技术研究的战略,战略科学家需要掌握国家科学技术的基本战略,按照国家需要,结合自己及其研究团队的研究确定科学研究方向。
科学技术是历史发展的火车头,改变了社会历史进程,造就了新的社会形态;推动了生产力内部各要素的变革,引发了产业结构的调整、经济形式的变化和经济增长方式的转变,造就了经济转型;产生了技术异化现象,要对异化的资本主义制度展开批判,更好地发挥科学技术的社会功能。
科学技术作为社会发展的动力,是马克思主义的基木观点。科学是生产力的“知识的形态”。作为生产力的科学技术,能够大大提高社会生产力水平,推动着整个人类物质生产的迅猛发展。
作为强大的精神力量的科学技术,能够促进人类**的解放,在产业革命的基础上,推动社会变革,对社会生产关系产生有力影响。
作为人类最终走向白由的科学技术,能够作为解放的杠杆,增进人类精神生活的丰富性和自我发展能力,有助于实现人的全面自由的发展。
科技异化实质上是在资本主义制度下劳动异化和人的异化一种必然结果。由于劳动是人的最根本最现实的实践活动,是人及人类社会存在的根本方式,劳动的异化必然带来人的其他社会活动和社会关系的全面异化,科学技术也不例外,因为“宗教、家庭、国家、法、道德、科学、艺术等等,都不过是生产的一些特殊的方式,并且受生产的普遍规律的支配。”
因此,科学技术作为劳动亦即人处理自身与自然界关系的社会活动的产物,也必然随着资本主义社会劳动的异化而表现出异化的现象。最根本的是要消灭对科学技术的资本主义利用方式,把现代科学技术从资本主义制度下解放出来。也就是说只有通过无产阶级革命来最终解决资本主义的科技异化问题。当然,在马克思看来,异化的完全克服只有在共产主义社会制度中才能最终实现。
科学技术的社会建制有一个历史过程。经济支持制度、法律保障体系等科学技术体制是根本,各种组织机构及其科研组织运行是保证,科学技术的伦理规范是导引。在科学技术发展应用的新阶段,科学技术的社会建制呈现出一些新特点,因此必须进行科学技术体制改革,以保证科学技术的良好运行。
作为社会建制的科学技术体制是在一定社会价值观念支配下,依据相应的物质设备条件形成的一种社会组织制度,旨在支持推动人类对自然的认识和利用。科学技术的体制化以相应的职业化为核心,其内涵随着科学技术的发展而不断拓展和丰富。科学技术的社会体制包括:组织领导体制、经济支持制度、法律保障体制、交流与传播体制、人才教育培养制度等。科学技术与其他各种事业密切相关,需要建立相应的组织机构以保证科学技术活动的顺利进行。科学技术组织机构随着历史的演化而变化,具有各白的特点和功能,是实现科学技术现代化的组织保证。在科学技术社会史上形成与发展起来的组织机构有:科学技术决策、管理与咨询机构,科学技术活动组织机构,科学技术传播机构,科学技术人才培养机构。
> 【以下摘白百度贴吧帖子“科学技术的社会体制化及其对科学发展的意义”】
> 科学技术体制化的内容包括:科学技术的投入体制、科技研究的结构比例、科学技术的法律制度、科技研究的管理体制。
> 科学技术的社会体制化对科学发展的意义:1、它可以积聚社会上的力量来进行柑应的科学研究;2、当代科技活动的结构中基础研究将会有大量的人员参l与j;3、明确的法律以及管理制度将会更进一步促进科学技术的发展。
科学技术活动与人类其他活动一样,建立在诚信和道德的基础上。现阶段,默顿的科学的精神气质受到挑战,科学技术工作者有失范行为,需要制定相关科研诚信指南和工程师伦理准则加以规范。科学工作者进行科学研究和医学实践,尤其是进行人体实验和动物实验,应该遵循社会伦理、生命伦理、动物伦理等。技术工作者,尤其是工程师,在工程技术活动中,应该遵循一定的职业伦理和社会伦理准则,应该承担对社会、专业、雇主和同事的责任,应该对工程的环境影响负有特别的责任,规范白己的行为,为人类福祉和环境保护服务。
(一)社会文化对科学技术的影响
科学技术的产生和发展需要一定的社会文化环境。社会文化与科学技术文化紧密关联,并由此影响科学技术的发展及其应用。默顿在《十七世纪英格兰的科学、技术与社会》中提出的“清教主义促进英国近代科学的制度变化”,以及“李约瑟难题”——“近代科学为什么没有在**诞生”的解答,就说明了这一点。
(二)科学文化与人文文化的协调
1.要防止科学在生活世界、自然世界对人文的僭越所造成的科学文化与人文文化之间的冲突,深刻理解科学的限度,用正确的人文理念指导我们的生活。
2.必须以社会先进文化来引领科学技术文化,使科学技术发展和应用为经济社会健康全面发展服务。得到广泛提倡的环境科学技术就是为了协调人与自然之间的关系所做的努力,是科学技术文化与人文文化——绿色文化的良性互动产物。
科学技术的风险包括环境风险、政治风险、经济风险、健康风险和伦理风险等。这些风险会引发一系列争论,造成评价和决策上的困难。***指出:“要加快建立科技咨询支撑行政决策的科技决策机制,加强科技决策咨询系统,建设高水平科技智库。要加快推进重大科技决策制度化,解决好实际存在的部门领导拍脑袋、科技专家看颜色行事等问题。”
要恰当进行科学技术风险评价与决策,就应该全面评价科学技术风险—收益的多个方面,批判性地考察“内部"存有争议的科学知识或技术知识,分析相互竞争的利益集团和社会结构的"外部"政治学,理解科学技术专家知识和决策的局限性、公众理解科学的必要性以及外行知识的优势,明确政府、科学技术专家以及公众在与科学技术风险相关的公共决策中的不同作用,确立公众参与决策的可能方式,从而形成最优化的科学技术公共政策模式,以达到对科学技术风险社会有效治理的目的。
***、***、……、胡锦涛、***的科学技术**,是在**共产党领导我国科学技术事业发展和进行社会主义现代化建设的伟大时间中,逐渐形成、发展和完善的。
**马克思主义科学技术观是基于马克思、恩格斯的科学技术**,对当代科学技术机器发展规律的概括和总结,是马克思主义科学技术论的重要组成部分。
**马克思主义科学技术观是**共产党人集体智慧的结晶,是对***、***、……、***科学技术**的概括和总结,是他们科学技术**的理论升华和飞跃,是他们科学技术**的凝练和精髓。
**马克思主义科学技术观的内容丰富,涉及了科学技术的功能、目标、机制、战略、人才和方针等重大问题,是一个科学、完整的**理论体系。
**马克思主义科学技术观概括和总结了***、***、···、***等的科学技术**,包括科学技术的功能观、战略观、人才观、和谐观和创新观的基木内容,体现出时代性、实践性、科学性、创新性、自主性、人本性等特征,建设**特色的创新型国家,是**马克思主义科学技术观的具体体现。**马克思主义科学技术观,是马克思主义科学技术观与**具体科学技术实践相结合的产物,是马克思主义科学技术论的重要组成部分。
**马克思主义科学技术观的三个历史阶段是其各自所处的历史条件所决定的,是对时代背景实事求是的反映,因此科学技术**都镌刻了时代的烙印,反映了时代的需求。
***新时代**特色社会主义**中的科学技术观,是在**特色社会主义进入新时代的历史条件下形成的。新时代之“新",一是在于我们进入了一个新的发展阶段,发展环境、发展条件都发生了新的变化,目标任务也发生了新的变化;二是在于我们面临着新的社会主义主要矛盾;三是我们迈向新的奋斗目标。正是基于这一新时代的"新"特征时代背景,***立足于我贵哦科学技术与社会发展的现实需要,提出了一系列关于科学技术发展的理论观点,形成了***新时代**特色社会主义科学技术观。
UnSplash 获取随机图片的API
我经常会使用 unsplash, 这里面的图片非常清爽,我的大多数文章的图片都是在这个网上找的,虽然也有同类型网站,但是用过一段时间以后基本都放弃了,图片质量参差不齐,筛选过程太费劲。
但是 unsplash 访问速度是个大问题,我经常会因为图片无法加载而被劝退。
今天一时手痒,顺手搜了 unsplash api 这个关键字,看官方有没有提供相关的 api 服务,还真有!
unsplash 提供了 2 个版本的 API。 一个是简单版,主要是给小型应用,流量比较少的 app 使用,可以通过 source.unsplash.com 进入;一个是进阶版的开发者中心 API, 支持更多流量的 app 使用,可以通过 unsplash.com/developers 进入。
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
通用 | 缩写 | 翻译 | 控件 | 缩写 | 翻译 |
---|---|---|---|---|---|
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 | 全景 | |||
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 | 预处理器 |
打印 | |
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 快捷键:
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 找到所有对象并重命名
#ifdef Q_OS_WIN
#include <Windows.h>
#endif
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;\
}\
链表、边界资源、临界区域
的操作一定要<mark style="background-color:red">加锁</mark>std::mutex mtx; // 保护counter
mtx.lock();
// 要进行的资源操作
todo();
mtx.unlock();
[toc]
本文为项目中服务程序的内存泄漏,挑了其中一部分比较常见的内存泄漏进行分析和修改。
关于内存泄漏和分析的文章可查看博客相关文章,有 UMDH
和 vld
两种方式,可根据个人需求展开分析。
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<char> 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 < 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
出来的内存。
问题:不确定变量什么时候使用完的,如何释放?
// 使用智能指针
char *ch = new char[256];
std::shared_ptr<char> 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)问题,在开发自测和提测过程中出现了效果不一致的情况,在以后开发中需要注意该方面问题对开发提测的影响,提测前尽量保证自测完整,需求完善。
以上就是本期自我评价。
[toc]
😄 :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: |
显示详细信息
☀️ :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: |
显示详细信息
🎍 :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: |
显示详细信息
🏠 :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: |
显示详细信息
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: |
显示详细信息
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文件链接](https://pan.baidu.com/s/1omzU65YMpJr0jPPFItZ7SA )</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>
<span class="fas faa-ring animated-hover" style="border-bottom:3px solid green">《半小时漫画**哲学史》</span>
<span style="text-align:center;font-size:20px;font:30px 书体坊兰亭体;color:blueviolent;word-spacing:30px;">“ 既许一人以偏爱,愿尽余生之慷慨 ”</span>
<span style="class: faa-bounce animated-hover;border-bottom: 5px solid #8F81EF;">data.json文件链接</span>
<mark style="background:royalBlue;border-bottom:lightblue 2px solid;color:white;font-family:consolas">当使用重做日志文件来进行数据库恢复时,ORACLE将读取其中的重做记录(包括其中的修改向量),并且将这些修改用于相关的块中。</mark>
<span style="background: PaleVioletRed;border-radius:10px;padding:1px 5px;color:white;font-weight:900">存储结构管理主要就是通过对表空间的管理来实现的</span>
<mark style="background:green;border-radius:10px;color:white">效果如下:</mark>
<font size=10px style="font-weight:700;font-family:'华文彩云';color:rgb(100,190,100)">基本语言(一)</font>
<span style="border-bottom: 2px dashed #000000">代码段、数据段、BSS段、堆区、文件映射区以及栈区</span>
<div style="background:black;font:conloas;color:white;"> 数组长度为:3<br> 请按任意键继续. . .</div>
<mark style="color:white;background:red;font-weight:600;border_radius:100px">但效率更高</mark>
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):可变关键字元素
扇贝上有专门整理好的pyhon常用单词,但是要支付199贝壳。
我写了个爬虫,免199贝壳去支付...拿下网页的单词,下面是代码:
import requests
import re
file = open("vocabulary.doc", "w", encoding="utf-8")
def spider(url):
res = requests.get(url).text
pattern = '<strong>([a-z,A-Z]*?)</strong>\s*</td>\s*<td class="span10">(.*?)</td>'
vocabulary_list = re.findall(pattern, res)
for vocabulary in vocabulary_list:
file.writelines((vocabulary[0].strip(''), vocabulary[1].strip(''), "\n"))
url_list = ["[词串: list 1](https://www.shanbay.com/wordlist/104899/202159/?page=)",
"[词串: list 2](https://www.shanbay.com/wordlist/104899/202162/?page=)",
]
for url in url_list:
for i in range(1, 10):
url = "[词串: list 1](https://www.shanbay.com/wordlist/104899/202159/?page=)" + str(i)
spider(url)
file.close()
会生成一个word的结果文档在代码运行的同一目录下,结果如下,没有可以排版,最好是放在excel下。
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. | 人工智慧 人工智能 |
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 组成) 字节 |
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 | 订制、自定 定制 |
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 | 动态系结 动态绑定 |
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 | 运算式、算式 表达式 |
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 | 仿函式 仿函式、函子 |
game | 游戏 游戏 |
---|---|
generate | 生成 |
generic | 泛型、一般化的 一般化的、通用的、泛化 |
generic algorithm | 泛型演算法 通用算法 |
getter | (相对於 setter) 取值函式 |
global | 全域的(对应於 local) 全局的 |
global object | 全域物件 全局对象 |
global scope resolution operator | 全域生存空间(范围决议)运算子 :: 全局范围解析操作符 |
group | 群组 |
group box | 群组方块 分组框 |
guard clause | 卫述句 (Refactoring, p250) 卫语句 |
GUI | 图形介面 图形界面 |
hand shaking | 握手协商 |
---|---|
handle | 识别码、识别号、号码牌、权柄 句柄 |
handler | 处理常式 处理函数 |
hard-coded | 编死的 硬编码的 |
hard-copy | 硬拷图 屏幕截图 |
hard disk | 硬碟 硬盘 |
hardware | 硬体 硬件 |
hash table | 杂凑表 哈希表、散列表 |
header file | 表头档、标头档 头文件 |
heap | 堆积 堆 |
hierarchy | 阶层体系 层次结构(体系) |
hook | 挂钩 钩子 |
hyperlink | 超链结 超链接 |
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 | 项目、条款 项、条款、项目 |
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 | 左值 左值 |
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 | 多工 多任务 |
namespace | 命名空间 名字空间、命名空间 |
---|---|
native | 原生的 本地的、固有的 |
nested class | 巢状类别 嵌套类 |
network | 网路 网络 |
network card | 网路卡 网卡 |
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 中重新定义虚拟函式 |
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,基础类别) |
列印 打印 | |
printer | 印表机 打印机 |
priority | 优先权 (通常用於执行绪获得 CPU 时间的优先次序) |
procedure | 程序 过程 |
procedural | 程序性的、程序式的 过程式的、过程化的 |
process | 行程 进程 |
profile | 评测 评测 |
profiler | 效能(效率)评测器 效能(性能)评测器 |
programmer | 程式员 程序员 |
programming | 编程、程式设计、程式化 编程 |
progress bar | 进度指示器 进度指示器 |
project | 专案 项目、工程 |
property | 属性 |
protocol | 协定 协议 |
pseudo code | 假码、虚拟码、伪码 伪码 |
qualified | 经过资格修饰(例如加上 scope 运算子) 限定 |
---|---|
qualifier | 资格修饰词、饰词 限定修饰词 |
quality | 品质 质量 |
queue | 伫列 队列 |
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 | 右值 右值 |
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 | 语法 语法 |
tag | 标签 标记 索引标签,页签 |
---|---|
target | 标的(例 target pointer:标的指标) 目标 |
task switch | 工作切换 任务切换 |
template | 模板、范本 模板 |
template argument deduction | 模板引数推导 模板叁数推导 |
template explicit specialization | 模板显式特化(版本) 模板显式特化 |
template parameter | 模板叁数 模板叁数 |
temporary object | 暂时物件 临时对象 |
C++ 常见错误——无法解析的外部符号
> 关于C++常见错误“无法解析的外部符号”这一问题如何解决的思考与方法。
>
> 本文就使用libevent中遇到的相似问题着手进行分析该如何解决,其他情况仍需按实际情况进行分析处理。常见的原因无外乎缺少编译库。
如上图所示,报错为无法解析的外部符号,符号为 __imp__if_nametoindex@4
, 一般这种符号就是缺少导出的接口,导出接口一般为 函数名@导出序号
。基本可以确定是缺少一个链接库。其次 <mark style="background:green;border-radius:10px;color:white">出现字符_imp
,说明不是真正的静态库,而是某个动态库的导入库,导入函数和自己不同名,所以加了字符_imp
</mark>。这里可以确定导出函数名为 if_nametoindex
;
确定了导出函数名为 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。
至此,基本上可以确定其缺少的静态库和网络部分相关,找到相关函数(这里查看的函数为 AddIPAddress
),查看其函数使用要求,需要引用 Iphlpapi.lib
,引入到代码中,编译成功。
blog link 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};
这里,zero
和one
的枚举量都为0
,two
和three
都是1
。
除了可以将int
类型的值赋值给枚举量,还可以使用long
和long 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 <iostream>
#include "main.h"
using namespace std;
enum myFlag {
one,
two = 0,
three,
four = 1
};
int main()
{
cout << three << endl;
myFlag flag = myFlag(0);
cout << flag << endl;
system("pause");
return 0;
}
输出结果:
<div style="background:black;color:white">1<br>0<br></div>
#include <stdio.h>
#include <stdlib.h>
int main()
{
enum color { red=1, green, blue };
enum color favorite_color;
/* 用户输入数字来选择颜色 */
printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
scanf("%u", &favorite_color);
/* 输出结果 */
switch (favorite_color)
{
case red:
printf("你喜欢的颜色是红色");
break;
case green:
printf("你喜欢的颜色是绿色");
break;
case blue:
printf("你喜欢的颜色是蓝色");
break;
default:
printf("你没有选择你喜欢的颜色");
}
return 0;
}
<div style="background:black;color:white">请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
<br>你喜欢的颜色是红色</div>
> 在使用枚举时结合到 <mark>2进制</mark> 的强大,对枚举值自由的进行异或运算。
举例一:
enum AttributeTargets
{
Assembly = 0x0001,
Class = 0x0002,
Struct = 0x0004
...
};
举例二:
但是在
enum FileAccess
{
Read = 0x1,
Write = 0x2,
ReadWrite = Read | Write
};
为简单枚举提供一个 0 值枚举量,可以考虑将其命名为 None
。如果这个名对于特定的枚举不合适的时候,可以自行找一个准确的。
enum Compression
{
None = 0,
GZip,
Deflate
};
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
[toc]
> UMDH(用户模式转储堆),是与操作系统一起用于分析特性进程Windows堆分配。UMDH查找特定进程中的哪个例程正在泄漏内存。特别要注意的事:使用UMDH显示堆栈跟踪数据之前,必须使用 GFlags 正确配置系统。Windows的调试工具中包含了 GFlags。
UMDH stack
跟踪:在 GFlags 图形界面中,选择 "图像文件" 选项卡,键入进程名称 (包括文件扩展名) ,按 TAB 键,选择 " 创建用户模式堆栈跟踪数据库",然后选择 " 应用"。或者,在命令行界面使用 gflags
命令设置。
glags /i imageName +ust
当完成分析后,使用 -
清楚设置:
glags /i imageName -ust
默认情况下,在 x86 处理器上 Windows 收集的堆栈跟踪数据量限制为 32 MB,在 x64 处理器上限制为 64 mb。 如果必须增加此数据库的大小,请选择 "GFlags" 图形界面中的 " 映像文件 " 选项卡,键入进程名称,按 tab 键,选中 " Stack Backtrace (Megs) " 复选框,在 "关联" 文本框中键入值 (,以) MB 为单位),然后选择 " 应用"。 仅在必要时增加此数据库,因为它可能会耗尽有限的 Windows 资源。 如果不再需要更大的大小,则将此设置返回到其原始值。
如果更改了 "系统注册表" 选项卡上的任何标志,则必须重新启动 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 以使此设置生效。
tlist | finstr "进程名"
使用 UMDH 分析此进程的堆内存分配,并将其保存到日志文件。将 -p
开关与 PID 一起使用,并将 -f
开关与日志文件的名称一起使用。例如,如果 PID 为123,并且你想要将日志文件命名为 Log1.txt
,请使用以下命令:
umdh -p:123 -f:log1.txt
使用记事本或其他程序打开日志文件。 此文件包含每个堆分配的调用堆栈、通过该调用堆栈进行的分配数,以及通过该调用堆栈使用的字节数。
由于您正在查找内存泄漏,因此,单个日志文件的内容是不够的。 你必须比较在不同时间记录的日志文件,以确定哪些分配正在增长。
UMDH 可以比较两个不同的日志文件,并在各自的分配大小中显示更改。 您可以使用大于符号 (>) 将结果重定向到第三个文本文件。 你可能还需要包含-d 选项,该选项将字节和分配计数从十六进制转换为十进制。 例如,若要比较 Log1.txt 和 Log2.txt,将比较结果保存到文件 LogCompare.txt,请使用以下命令:
umdh log1.txt log2.txt > logcompare.txt
+ 5320 ( f110 - 9df0) 3a allocs BackTrace00B53
Total increase == 5320
对于每个调用堆栈 (在 UMDH 日志文件中标记为 "BackTrace" ) ,这两个日志文件之间有比较。 在此示例中,第一个日志文件 (Log1.txt) 为 BackTrace00B53 分配的0x9DF0 字节,而第二个日志文件记录了0xF110 字节,这意味着在捕获两个日志的时间之间分配有0x5320 的额外字节。 这些字节来自 BackTrace00B53 标识的调用堆栈。
若要确定该 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运算符的此实例会重复分配未释放的内存。
[toc]
在服务程序中调用了某一个程序的安装程序,由于权限的问题,这个安装程序也继承了服务的 SYSTEM
权限,导致安装程序与预期不符合。
最终实现的目标就是在服务中以普通用户的权限去启动安装程序,要以普通用户去启动,就涉及到降权的问题,需要获取用户的信息。在任务管理器详细信息中可以看到,资源管理器是以普通用户的身份启动的,因此可以在服务中以 Explore.exe
的权限去调用安装程序。
此逻辑也可以用于解决 UAC
弹窗的问题。
最终调用的接口为: 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, &dwTokenSessionId, sizeof(DWORD), &dwReturnLen) == FALSE)
{
break;
}
// 通过 SessionId 和 Token运行程序
- res = _CreateProcessAsSystemBySession(lpExePath, lpParam, NULL, dwTokenSessionId, hExplorerToken); // 改动如下所示
// 改动
// 判断当前特权token是否已提升,如果已经提升,则直接通过当前的token启动,如果未提升,则通过提升后的token启动
+ HANDLE hNewToken = NULL;
+ if (GetElevatedToken(hExplorerToken, &hNewToken) && 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 && pbElevated)
{
if (GetTokenInformation(hToken, TokenElevationType, &dwElevateionType, sizeof(dwElevateionType), &dwReturnBytes))
{
if (dwElevateionType == TokenElevationTypeFull)
bElevated = TRUE;
else if (dwElevateionType == TokenElevationTypeDefault)
{
TOKEN_ELEVATION te;
ZeroMemory(&te, sizeof(te));
if (GetTokenInformation(hToken, TokenElevation, &te, sizeof(te), &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, &bElevated);
if (bElevated)
{
return DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, phNewToken);
}
else
{
DWORD dwReturnBytes = 0;
return GetTokenInformation(hToken, TokenLinkedToken, phNewToken, sizeof(HANDLE), &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, &pe);
while (bMore)
{
if (StrCmpI(L"explorer.exe", pe.szExeFile) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
if (hProcess == NULL)
{
continue;
}
if (OpenProcessToken(hProcess, TOKEN_QUERY, &hExplorerToken))
{
CloseHandle(hProcess);
break;
}
}
bMore = ::Process32Next(hSnapshot, &pe);
}
CloseHandle(hSnapshot);
return hExplorerToken;
}
给本进程特权,以便访问系统进程
/*
* @fn PromotePrivilege
* @brief 调整进程权限
*
* @detail 将进程权限提升成具有调试权限的进程,这个权限应该是进程所能具有的最大权限
* 前提启动这个进程的账户必须是一个管理员,否则没法提升
*/
BOOL PromotePrivilege()
{
// 附给本进程特权,以便访问系统进程
HANDLE hToken;
// 打开一个进程的访问令牌
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
// 取得特权名称为"SetDebugPrivilege"的LUID
LUID uID;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &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, &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, &hTokenThis);
if (!bRet || hTokenThis == NULL)
return false;
HANDLE hTokenDup = NULL;
bRet = DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup);
CloseHandle(hTokenThis);
if (!bRet || hTokenDup == NULL)
return false;
if (!SetTokenInformation(hTokenDup, TokenSessionId, &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"Winsta0\\Default";
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"userenv.dll");
if (NULL != hUserEnvLib)
{
lpfnCreateEnvironmentBlock = (LPFNCREATEENVIRONMENTBLOCK)GetProcAddress(hUserEnvLib, "CreateEnvironmentBlock");
lpfnDestroyEnvironmentBlock = (LPFNDESTROYENVIRONMENTBLOCK)GetProcAddress(hUserEnvLib, "DestroyEnvironmentBlock");
}
if (NULL != lpfnCreateEnvironmentBlock)
{
if (lpfnCreateEnvironmentBlock(&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, &si, &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命令详解
[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命令详解
[toc]
半学半练,定位了一把内存泄漏的问题。
内存泄漏工具的想必大家都知道了,主要使用 VLD 这个工具。
Visual Leak Detector | Enhanced Memory Leak Detection for Visual C++
点击上方链接下载和安装 vld 工具,记住安装的位置,后续有很多文件会使用到,需要拷贝移动到相应的文件中。
windows kits
所在的文件夹中找到。如: C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
。拷贝安装目录下 include
中的 头文件到该目录,注意有几个 kits
环境就尽量拷贝几个,万一用到呢windows kits
所在的文件夹中找到。如: C:\Program Files (x86)\Windows Kits\10\Lib\(kits 版本号)\um\
。拷贝安装目录下 lib
目录下对应位数的 lib
文件到 kits
对应的 um\x64
或um\x86
文件夹中。到这一步,只要在程序中引入 vld
头文件就可以正常使用了。
#include <vld.h>
> 安装的时候就可以看到 vld 只支持到 vs2015。所以在 vs 更高的版本中使用时,需要一些额外的操作。
>
> 影响:在vs高版本中使用时,虽然能定位泄漏问题,但是不显示文件名和行号。
解决办法:
在 vs 工程设置中按下图设置:
在 Debug 模式下,直接在工程中源文件中任意位置引入 <vld.h>
即可,编译之后的可执行文件就带有泄漏检测的功能。
但是在 Release 模式下则需要做一下额外的处理。
同 Debug 版本在 VS 中一样配置好 VLD 的相关信息
拷贝 VLD 安装目录下 bin\win32
目录下所有的文件和 vld.ini
到工程目标路径下(可执行文件的目录)。
在程序入口处的 cpp
文件中,定义强制检测宏和包含 vld
头文件
#define VLD_FORCE_ENABLE
#include <vld.h>
在程序启动和退出时,分别增加以下函数调用
{
...
VLDGlobalEnable();
VLDReportLeaks();
//some code...
VLDGlobalDisable();
}
增加检测模块(如加载的 dll
文件)
> 以上配置后,默认情况下只会检测主线程的模块,要想增加其他模块的内存泄漏检测,需要配置 vld.ini
配置文件中的 ForceIncludeModules
配置项。在该配置项后增加需要检测的模块。如:ForceIncludeModules=demo1.dll;demo2.dll
配置输出方式
同样还是配置文件中修改。设置配置文件中 ReportTo
的值即可:
syswow64
这个系统目录下,<kbd>Win+R</kbd> 输入 syswow64
即可打开这个目录。默认文件名:memory_leak_report.txt
)> 关于 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.
缺少 pdb
文件
如果程序运行之后生成的 memory_leak_report
中还是不显示行号,则试试把pdb文件放在程序的运行目录试试。
@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:"请输入Git 数字命令更新变动:"
if %errorlevel% == 1 set change=":memo: 更新文档"
if %errorlevel% == 2 set change=":bug:"
if %errorlevel% == 3 set change=":wrench: 部署"
if %errorlevel% == 4 set change=":bug:"
if %errorlevel% == 5 set /p change="请输入Commit信息:"
if %change%=="" (
cls
echo -------
echo 提交信息不能为空!
echo -------
goto reInput
)
echo.
:: cd "D:\\wiki\\"
git pull
git add .
git commit -m %change%
git push
echo.
echo ===================================================================================
echo 更新完毕
echo.
title " update SUCCESS"
pause
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, &hToken);
if (!nRetCode)
break;
nRetCode = ::LookupPrivilegeValue(NULL, lpszPrivilegeName, &tkp.Privileges[0].Luid);
if (!nRetCode)
break;
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
nRetCode = ::AdjustTokenPrivileges(hToken, FALSE, &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, &pe);
while (bMore)
{
if (_tcsicmp("explorer.exe", pe.szExeFile) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
if (hProcess == NULL)
{
continue;
}
if (OpenProcessToken(hProcess, TOKEN_QUERY, &hExplorerToken))
{
CloseHandle(hProcess);
break;
}
CloseHandle(hProcess);
}
bMore = ::Process32Next(hSnapshot, &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, &cchSize))
{
CloseHandle(hExplorerToken);
break;
}
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封装了监听套接字,将套接字和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 <event2/listener.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <assert.h>
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&BEV_EVENT_ERROR)
perror("Error from bufferevent");
if(events&(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(&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*)&sin,
sizeof(sin));
assert(listener!=NULL);
evconnlistener_set_error_cb(listener,accept_error_cb);
event_base_dispatch(base);
return 0;
}
看看evconnlistenr做了哪些封装
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
封装在一起
看一下初始化有哪些内容:
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 > 0) {
if (listen(fd, backlog) < 0)//调用listen
return NULL;
} else if (backlog < 0) {
if (listen(fd, 128) < 0)
return NULL;
}
lev = mm_calloc(1, sizeof(struct evconnlistener_event));
if (!lev)
return NULL;
//lev->base是一个evconnlistener结构体
lev->base.ops = &evconnlistener_event_ops;//设置ops参数
lev->base.cb = cb;//设置回调
lev->base.user_data = ptr;//ptr
lev->base.flags = flags;//flag
lev->base.refcnt = 1;
if (flags & LEV_OPT_THREADSAFE) {
EVTHREAD_ALLOC_LOCK(lev->base.lock, EVTHREAD_LOCKTYPE_RECURSIVE);
}
//将fd关联到struct event上去 lev->listener是struct event结构体
//这样assigh将listener_read_cb设置到event的cb中,并将struct evconnlistner做为参数
//这是一个比较复杂的过程,首先由于event激活,将先调用listener_read_cb
//在listener_read_cb通过传入的struct evconnlistner调用用户自定义回调
event_assign(&lev->listener, base, fd, EV_READ|EV_PERSIST,
listener_read_cb, lev);
//这里底层调用event_enable
evconnlistener_enable(&lev->base);
return &lev->base;
}
在另外一个接口evconnlistener_new_bind
中由于指定了套接字结构体,因此在底层还调用了bind
这个底层的回调函数先于用户回调函数调用,在这个回调中会调用用户回调,并且会将已连接的套接字作为参数传入用户回调,
这也正是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*)&ss, &socklen);//accept
if (new_fd < 0)
break;
if (socklen == 0) {
/* This can happen with some older linux kernels in
* response to nmap. */
evutil_closesocket(new_fd);
continue;
}
if (!(lev->flags & LEV_OPT_LEAVE_SOCKETS_BLOCKING))
evutil_make_socket_nonblocking(new_fd);//non blocking
if (lev->cb == NULL) {
UNLOCK(lev);
return;
}
++lev->refcnt;
cb = lev->cb;//拿到用户回调
user_data = lev->user_data;
UNLOCK(lev);
cb(lev, new_fd, (struct sockaddr*)&ss, (int)socklen,
user_data);//调用用户回调并将connfd传入用户回调
LOCK(lev);
if (lev->refcnt == 1) {
int freed = listener_decref_and_unlock(lev);
EVUTIL_ASSERT(freed);
return;
}
--lev->refcnt;
}
}
1.libevent programming
2.libevent 深入浅出
blog link libevent——evconnlistener_new_bind(1)
切换shell
[toc]
cat /etc/shell
echo $SHELL
sudo apt-get -y install zsh
chsh -s /bin/zsh(非实时,需重启)
ls ~/.oh-my-zsh/themes/
blog link 切换shell
具体方法如下:
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
回车打开组策略编辑器。
⑧在窗体左侧选择: 用户配置→管理模板→系统→驱动程序安装→再双击右侧窗口的 设备驱动的代码签名 策略进行设置。
⑨点选→已启用→这里还有三个选择项:警告、忽略、组织(默认是警告)→确定
@charset "UTF-8";
/* 自定义表格 */
tr.md-end-block:hover {
background-color: dodgerblue;
font-weight: 700;
color: white;
}
/*** Custom fonts ***/
@import url('./blubook/fonts.css');
/*** 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: 'small-caps';
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: 'H1';
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: 'H2';
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: 'H3';
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: 'H4';
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: 'H5';
}
#write h6::before {
content: 'H6';
}
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: 'Glow Sans SC', -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>li>ul>li {
list-style-type: circle;
}
ul>li>ul>li>ul>li {
list-style-type: square;
}
ol,
ul {
padding-left: 2rem;
line-height: 1;
}
ol>li {
list-style-type: decimal
}
ol>li>ol>li {
list-style-type: lower-alpha
}
ol>li>ol>li>ol>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: "Glow Sans SC", -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: '';
bottom: 1rem;
}
#write h2::before {
content: '';
bottom: 1rem;
}
#write h3::before {
content: '';
bottom: 1rem;
}
#write h4::before {
content: '';
bottom: 1rem;
}
#write h5::before {
content: '';
bottom: 1rem;
}
#write h6::before {
content: '';
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>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: '';
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>input {
top: -0.2rem;
margin-left: -1.6rem;
margin-top: calc(1rem + 1px);
-webkit-appearance: initial;
}
.md-task-list-item>input:before {
border: 1px solid#0185ff;
border-radius: 1rem;
width: 1rem;
height: 1rem;
background: #fff;
content: ' ';
transition: background-color 200ms ease-in-out;
display: block;
}
.md-task-list-item>input:checked:before,
.md-task-list-item>input[checked]:before {
background: #0185ff;
border-width: 1px;
transition: background-color 200ms ease-in-out;
}
.md-task-list-item>input:checked:after,
.md-task-list-item>input[checked]:after {
opacity: 1;
}
.md-task-list-item>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: ' ';
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>.CodeMirror-activeline::before,
#typora-source .CodeMirror-code>:first-child::before,
#typora-source .CodeMirror-code>:last-child::before,
#typora-source .CodeMirror-code>: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: 'Cascadia Code', Consolas, 'Noto Sans SC', 'Courier New', 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: 'Cascadia Code', Consolas, 'Noto Sans SC', 'Courier New', 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>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>span::selection,
.cm-s-inner .CodeMirror-line>span>span::selection {
background: rgba(255, 255, 255, 0.10);
}
.cm-s-inner .CodeMirror-line::-moz-selection,
.cm-s-inner .CodeMirror-line>span::-moz-selection,
.cm-s-inner .CodeMirror-line>span>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 ,他的值的格式为如图所示,
BOOL GetSharedFoldersList(map<CString, HANDLE> &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, &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, &dwValueSize, NULL, &dwType, NULL, &dwBufferSize))
{
//判断值类型
switch(dwType)
{
//只找多个串的值
case REG_MULTI_SZ:
{
dwSize = dwBufferSize + 1;
szValBuffer = new TCHAR[dwSize];
ZeroMemory(szValBuffer, dwSize);
if (ERROR_SUCCESS != RegQueryValueEx(hKey, szValue, 0, &dwType, (LPBYTE)szValBuffer, &dwBufferSize))
{
break;
}
int j = 0;
CString TmpValue;
for(int i = 0;szValBuffer[i] != '\0' ;i += j + 1)
{
for (j = 0;szValBuffer[i + j] != '\0';j ++)
{
TmpValue += szValBuffer[i + j];
}
//如果找到共享路径,则直接放入容器,然后进行下一个路径的查找
if (TmpValue.Find(_T("Path=")) == 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("");
}
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;
}
//监控注册表项以更新共享文件夹列表
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, &hKey))
{
MyDebugA ("RegMonitorThread--- RegOpenKeyEx ERR!");
break;
}
if (NULL == (hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
{
MyDebugA ("CreateEvent ERR");
break;
}
if (ERROR_SUCCESS != RegNotifyChangeKeyValue (hKey, TRUE, dwFilter, hEvent, TRUE))
{
MyDebugA ("RegNotifyChangeKeyValue ERR");
break;
}
if (WAIT_FAILED == WaitForSingleObject (hEvent, INFINITE))
{
MyDebugA ("WaitForSingleObject ERR");
break;
}
bFlag = TRUE;
}while(FALSE);
RegCloseKey (hKey);
CloseHandle (hEvent);
//如果监控失败,则重新再来
if (!bFlag)
{
continue;
}
//等待系统将注册表消息发放完毕,否则有时候添加或删除的注册表项无法被枚举到
Sleep(200);
//进行共享列表枚举和比较
map<CString, HANDLE> theNewList;
//获取新列表
pThis->GetSharedFoldersList(theNewList);
map<CString, HANDLE> &theOldList = pThis->GetListInstance();
BOOL bFindNew = FALSE;
//比较两个列表
//添加旧列表中没有的共享
for (map<CString, HANDLE>::iterator it = theNewList.begin();
it != theNewList.end(); ++it)
{
if (theOldList.find(it->first) == theOldList.end())
{
MyDebug(_T("----------Find New Share----------"));
MyDebug(it->first);
theOldList[it->first] = 0;
bFindNew = TRUE;
}
}
//MyDebug(_T("---------Start Delete--------"));
//需要删除的列表,map不支持循环删除多个元素
vector<CString> theDeleteList;
//删除旧列表中已经取消的共享
for (map<CString, HANDLE>::iterator it = theOldList.begin();
it != theOldList.end(); ++it)
{
if (theNewList.find(it->first) == theNewList.end())
{
//结束监控线程
if (!TerminateThread(it->second, 0))
{
MyDebug(_T("TerminateThread ERR"));
MyDebug(it->first);
}
//将线程占用的共享目录句柄释放
if (gs_mpDirHandleList[it->first])
{
CloseHandle(gs_mpDirHandleList[it->first]);
}
CloseHandle(it->second);
theDeleteList.push_back(it->first);
}
}
MyDebug(_T("-----------DeleteList-------------"));
//删除旧列表中的过期共享
for (vector<CString>::iterator it = theDeleteList.begin();
it != theDeleteList.end(); ++it)
{
theOldList.erase(*it);
MyDebug(*it);
}
//如果有新的共享
if (bFindNew)
{
pThis->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("CreateFile Fail"));
return 0;
}
//将目录句柄放到线程对应容器中
gs_mpDirHandleList[szRootPath] = hRootHandle;
// OUTPUT_PARAM_DEBUGA("The CurrentThread:%X", GetCurrentThread());
szRootPath += _T("\\");
wchar_t notify[1024];
ZeroMemory(notify, 1024);
DWORD dwBytes;
FILE_NOTIFY_INFORMATION *pNotify = (FILE_NOTIFY_INFORMATION *)notify;
//过滤同一个文件的操作
CString szLastFile = _T("");
while (TRUE)
{
if (ReadDirectoryChangesW (hRootHandle, &notify, sizeof(notify), TRUE,
FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE,
&dwBytes, NULL, NULL))
{
MyDebug(_T("---------Change Happened!------------"));
pNotify->FileName[pNotify->FileNameLength / 2] = '\0';
//CString tmp = pNotify->FileName;
//tmp.MakeLower ();
CString TmpPath = szRootPath + pNotify->FileName;
switch(pNotify->Action)
{
//重命名获取
case FILE_ACTION_RENAMED_OLD_NAME:
{
MyDebug (TEXT("文件更名 :") + TmpPath);
PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
p->FileName[p->FileNameLength/2] = '\0';
CString newName = szRootPath + p->FileName;
MyDebug(newName);
break;
}
//删除
// case FILE_ACTION_REMOVED:
// {
// MyDebug (TEXT("文件删除 :") + TmpPath);
// }
//修改..略过文件夹的修改,过滤同一个文件的修改
case FILE_ACTION_MODIFIED:
{
if (!PathIsDirectory(TmpPath) /*&& szLastFile.CompareNoCase(pNotify->FileName) != 0*/)
{
//szLastFile = pNotify->FileName;
MyDebug (TEXT("文件修改 :") + TmpPath);
}
break;
}
//新建文件获取
case FILE_ACTION_ADDED:
{
if (!PathIsDirectory(TmpPath) /*&& szLastFile.CompareNoCase(pNotify->FileName) != 0*/)
{
MyDebug (TEXT("文件添加 :") + TmpPath);
}
break;
}
default:
{
break;
}
}
}
}
return 0;
}
blog link 共享文件夹
/*
* @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([email protected]): what: when:? how:?
友元
[toc]
C++ 提供了另外一种形式的访问权限:友元。友元有3种:
通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。
> 在为类重载二元运算符时(带两个参数的运算符)常常需要友元。将 Time 对象乘以实数就属于这种情况。
下面的语句:
A = B * 2.75;
将被转换成:
A = B.operator*(2.75);
但下面的语句又如何呢?
A = 2.75 * B;
从概念上说,2.75*B
与 B*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 &t);
对于非成员重载运算符函数来说,运算符表达式左边的操作数对应于运算符函数的第一个参数,运算符表达式右边的操作数对应于运算符函数的第二个参数。而原来的成员函数可以访问类的私有成员,它们被称为友元函数。
创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字 friend
:
friend Time operator*(double m, const Time & t);
该原型意味着下面两点:
operator*()
函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;operator*()
函数不是成员函数,但它与成员函数的访问权限相同。第二步是编写函数定义。因为它不是成员函数,所以不要使用 Time:: 限定符。另外,不要在定义中使用关键字 friend
,定义如下:
Time operator*(double m,const Tlme & 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 密钥分配
[toc]
人文环境的形成是常年累月的积淀,是人的改造与自然的打磨巧妙结合形成的,因此也蕴含了独特的精神力量和难得的物质底色。从物质文化和精神文化两个角度来看,对人文环境中的建筑进行设计所受到的牵制较多。纵向看,有历史文化的影响;横向看,有地域因素的制约;另一个方面,观者的审美角度、使用者的生活习惯,以及人们道德规范的约束都是人文环境中对建筑消隐的重要因素。在这种情况下,做到“消隐”,需要设计师考虑各方面的因素,从而做出更能突出建筑特,又能达到“消隐”目的的设计方案。以下结合三个相对典型的案例进行具体的分析。
建筑设计环节需要考虑的因素除了人文环境、造价、风格之外,也应考虑到建筑技术对建筑设计的提升。不仅如此,建筑技术可以说是建筑创作中重要的一个环节,其最终体现在建筑的空间形态上,建筑形态是否优美、是否达到了效果,又可以直接反馈出建筑技术的使用情况。建筑技术的要素包括材料、结构、施工等不同的类别,从选材到施工,每一个技术环节都有其对应的使用环境,充分利用这一特定环境,从而有效地利用建筑技术对每个环节进行改造和提升。这也能充分体现环境整体观的理念。
深入访谈一个自己的长辈,请其介绍职业经历和人生阅历,并通过这个切入点,以小见大介绍其对国家发展的看法感受,记述其访谈内容及对自己未来的启示。
访谈对象:同学的舅舅
性别:男
年龄:48
职业:结构工程师
单位:中建一局某分公司
职务:工程师
从业年数:22
访谈时间:2022.11.26
访谈形式:电话
当时工作还是包分配的,毕业后我选择了去中建。
喜欢的是自己和大家一起努力工作之后,出现的问题被解决,工程一日日逐渐被完成,最终被交付的那种喜悦。
不喜欢工作中的与人打交道,在工作中会产生内耗,需要处理好复杂的人际关系。还有就是工作常年在外,全国各地地跑,和家人是聚少离多。不过工作这么些年,也习惯了,有空间就会回家看看家人,这两年因为疫情的原因,回去的更少了。在单位,就是想着怎么把工作干好。保质保量完成建设任务。
目前是项目部的工程师,主要职责就是负责工程上的项目进行监工以及项目部规划等内容。
学好自己的专业知识,尽量拓展知识面。这个岗位对专业的对口性一般要求不高,但是不论是经济类、管理类还是工程类的专业,还是需要认真学习的,它虽然要求的面广,但你总得有一方面是要有核心竞争力的。尽量多学习其他知识,做到“见多识广”,因为这个岗位会遇到很多人,很多不同种类的项目,这样工作起来思维会比较快,沟通也会变得容易些。
有侧重的锻炼自己的沟通、写作、表达能力。多参加社团活动,和一些有意义的比赛,历练自己。
先应聘资料员或质检员、施工员,能利用在校学到的知识,工作起来顺手,工作后通过自学尽快掌握各种工程软件的应用,掌握后根据自己的爱好,可转行预算员、技术员、测量员等.
工作地点有工地,项目部。主要场所是项目部。忙的时候来回奔波,也会加班赶工期。
这个很多,比如刚开始工作的时候,要慢慢适应工厂的环境;还要和同事打好关系等等。特别是厂里的一些老师傅在我们正式上岗前经行培训的时候,老师傅传授了一些我们在学校里没见过的加工方法,我们只能从头学起。我想说的是学校里的教材之类的不能太过相信,有些老旧的教材的内容已经逐渐被淘汰,因此要不断地学习,要关注行业发展动态。
收入还可以,包括基本工资+年底奖金。主要还是根据工程难度,工期长短,以及工作地点等因素影响。初级平均可以拿到8000左右,年底5~20万不等。
需要有坚实的基础学科知识,更需要有不断学习的能力,去挑战的新的建设需求。其次的话就是有一定的与人交往的能力。
需要的技能:CAD及各种计算软件,比如PKPM、YJK、3D3S、MIDAS等(至少学会一到两种,各软件有相通之处)。
能坚持下去,有创新**,常与人沟通交流,通过工作不断积累自己的经验。
要掌握一些基本的专业知识,比如制图(包括CAD),金属加工的技艺,还有就是一些行业规定,行业语言等,之后当然要考取这种证书来表明已经掌握了这些内容。当然,经验也是很重要的,特别是出现一些课本上或平时没出现过的情况时,经验显得尤为重要。
首先梳理自己已有的专业知识能力,客观地评价自己的优势和劣势,尽可能做到扬长补短。其次有目的地提前锁定一些目标实习单位,有针对性地进行一些关注和调研,做到有的放矢。最后可以阅读一些人际交往或社交礼仪的知识,力求在细节方面也做到位,也可以向往届师兄师姐讨教实习的一些鲜活的经验,以利于较快地适应角色和心态的转变。
总的来说是有帮助的,但是大家都知道,书上的知识永远赶不上技术的发展,所有如果你向在这个行业有好的发展的话,就不能局限于书本上的东西,要多动手,这样能学到的东西比你课程上所能学到的多很多。
每一个新进入的员工都会进行一系列相关的培训,内容主要是对新来员工培训相关技能,让员工能够更好的将学校中所学到的知识更好的转化为想用的技能。除了部门自己组织的学习以外,公司每年都会组织一些培训,让大家更好的了解当前行业的新技术,新动态。正式进入工作岗位后,要求每个人都有一定的技能,能够独立面对一些问题,在技术方面要求会比较多。在深造方面,公司是比较支持大家进行更加高层的学习。
目前这一行业工作较为辛苦,有很多人难以坚持下来,现有的人员构成并不是非常合理,尽管做这个方面的人相当多,但是很缺少能够独当一面的优秀人才,总的来说就是,高层然才比较欠缺,低层人员泛滥。所以,对于每一个想要在此行业有所发展的人来说,机遇和挑战是同时并存的。
[toc]
最开始讨论的结果时做一个会议记录相关的插件,结合声望原本提供的白板插件功能,可以实时的进行展示,多人操作、互动,音视频通话。区别于现有会议模式的一点就是,除了音视频通话,还可以在通话的同时,在白板上进行操作,类似于Web上 <mark>在线文档</mark>、<mark>在线会议</mark>、<mark>在线画板</mark> 三者功能集一身的一款白板插件,当然这里在线白板的功能是由声望的 SDK
提供了这个能力,在线文档的这些具体的在线同步的逻辑还是要以声望提供的为基准。
最终由于我们人力有限,并且都是兼职参加比赛,所以完成上是大打折扣。
最后呢,由于实现的功能过于单调,又新增了一个 Markdown
的编辑器,插件启动后可以编辑,但是这个内容是不同步的。
总结一下我个人在比赛中学习和使用到的一些技术,由于我本人是 C++客户端 开发,之前虽然也有学习过VUE和前端知识,但是 VUE3
的改动还是挺大,使用起来颇有些不太习惯的地方。主要的前端框架以及代码功能都是由我比赛的队友去完成的。我负责后台数据相关的一些工作。主要面向于音视频录制、存储、发送等,以及调用语音识别接口。
实现部分主要讲关于音频传输、录音、实时语音转写这三点:
音频传输方面。声网有现成的demo提供学习,使用起来相对比较简单。
API-Examples-Web/Demo/selfRendering at main · AgoraIO/API-Examples-Web
[toc]
#pragma once
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <Windows.h>
#include <string>
#include <thread>
#include <memory>
#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& datas); //写入数据
void Release();
bool ReadData(__out std::string& 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
};
#include "PipeIPC.h"
#include <AccCtrl.h>
#include <AclAPI.h>
using namespace std;
#define PIPE_SERVER_NAME "\\\\.\\pipe\\TrustAgent\\pipe.ToFixService"
#define PIPE_CLIENT_NAME "\\\\.\\pipe\\TrustAgent\\pipe.ToTrustAgent"
PipeIPC::~PipeIPC()
{
if (m_hPipeHandle != INVALID_HANDLE_VALUE)
{
DisconnectNamedPipe(m_hPipeHandle);
CloseHandle(m_hPipeHandle);
}
}
bool PipeIPC::InitPipeIPC()
{
if (USER_SERVER == m_Role && nullptr != m_hPipeHandle)
{
InitSecurityAttributes();
// cout << "ser" << 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)&m_sec_attr);
//如果管道创建失败
if (m_hPipeHandle == INVALID_HANDLE_VALUE)
{
return false;
}
#if 0
if (!ConnectNamedPipe(m_hPipeHandle, nullptr)) {
cout << "ConnectNamedPipe failed" << 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("[PIPE] ------ V10 Init ------");
}
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(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID))
{
return FALSE;
}
ZeroMemory(&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 = &ea;
if (ERROR_SUCCESS != SetEntriesInAcl(1, &ea, NULL, &pACL))
{
goto cleanup;
}
acl_addr = &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 = &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& datas, __out bool bIsPipeEnd)
{
if (INVALID_HANDLE_VALUE == m_hPipeHandle || nullptr == m_hPipeHandle)
{
InitPipeIPC();
}
DWORD cbRead = 0;//定义数据长度
DWORD cbData = 0;
if (ReadFile(m_hPipeHandle, &cbData, sizeof(cbData), &cbRead, nullptr) && sizeof(cbData) == cbRead)
{
DWORD error = GetLastError();
bIsPipeEnd = (error == ERROR_BROKEN_PIPE ? true : false);
datas.resize(cbData);
if (ReadFile(m_hPipeHandle, (LPVOID)datas.data(), cbData, &cbRead, nullptr) && 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& 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 << "客户端还没连接" << endl;
//连接失败
return false;
}
}
}
}
if (!IsInit())
{
if (!InitPipeIPC())
{
return false;
}
}
//连接成功!
DWORD wLen;
const DWORD cbData = datas.size() * sizeof(datas[0]);
if (!WriteFile(m_hPipeHandle, &cbData, sizeof(cbData), &wLen, NULL))
{
return false;
}
if (!WriteFile(m_hPipeHandle, datas.c_str(), datas.size() * sizeof(datas[0]), &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, "[IPC][THREAD] ,Create PipeReadThread Success, pipe = %p", pRead );
EventLog(LOG_ALL, "pipe = %p, pipe->IsInit()=%d", pRead, pRead->IsInit());
bool isPipeEnd = true;
while (true)
{
if (isPipeEnd)
{
pRead->Connect();
}
std::string datas;
if (!pRead->ReadData(datas, isPipeEnd))
{
if (isPipeEnd)
{
EventLog(LOG_ALL, "-----------[PIPE END]----------");
pRead->DisConnect();
}
}
datas = "Add";
// 数据处理
if (datas.find("start") != std::string::npos) // 启动成功
{
EventLog(LOG_ALL, " [PIPE] [REC] TrustAgentStart");
// 启动 管道客户端
if (!StartPipeWrite())
{
EventLog(LOG_ALL, " [PIPE] Failed to Create Client Pipe, GetLastError()=", GetLastError());
}
}
else if (!datas.empty())
{
EventLog(LOG_ALL, "[PIPE] [RECV] datas: %s", datas.c_str());
// 调用导出的接口
{
std::thread th(HandleFix, datas);
th.detach();
}
// NSPTRUST::SendRpcMsgToPlugin(POLICY_SENDTQA_USER, datas.c_str());
}
}
}
启动时机,同名管道的监听管道启动后再启动
BOOL StartPipeWrite()
{
if (pWrite->IsInit())
return true;
else
return pWrite->InitPipeIPC();
}
写数据
std::string datas = "Send data to PIPE Read";
pWrite->WriteData(datas);
[toc]
>暂时我不想知道你在想什么!
#include<iostream>
using namespace std;
int main(int argc,const char *argv[]){
cout << "Hello World";
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" />
<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
常用模板(复杂度)
?style=plastic&logo=appveyor |
|
---|---|
?style=flat&logo=appveyor |
|
?style=flat-square&logo=appveyor |
|
?style=for-the-badge&logo=appveyor |
|
?style=social&logo=appveyor |
^_^
/* 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>
> 需要注意的是在使用时需要添加fas
的属性,如<span class="fas faa-wrench animated"></span>
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 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, 蓝色 %}
😄 :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: |
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文件链接](https://pan.baidu.com/s/1omzU65YMpJr0jPPFItZ7SA )</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;">
&nbsp;数组长度为:3<br>
&nbsp;请按任意键继续. . .
</div>
10
<mark style="color:white;background:red;font-weight:600;border_radius:100px">但效率更高</mark>
<div style="background:black;font:conloas;color:white;">
数组长度为:3
<br>
请按任意键继续. . .
</div>
<mark style="color:white;background:red;font-weight:600;border_radius:100px">但效率更高</mark>
> 摘自《深入理解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 | 零页面线程 |
[toc]
> using的用法参考 使用using起别名
#include <iostream>
#include <windows.h>
#include "PipeIPC/PipeIPC.h"
int main()
{
std::cout << "--- DLL Test ---\n";
HINSTANCE hDLL; // Handle to DLL
using Face = int * (*)(int,int);
hDLL = LoadLibrary(L"mydll.dll");
if (hDLL != NULL)
{
Face faceSum = (Face)GetProcAddress(hDLL,
"mySum");
if (!faceSum)
{
// handle the error
FreeLibrary(hDLL);
return 0;
}
else
{
// call the function
faceSum(1,1);
}
}
return 0;
}
#ifdef __cplusplus
extern "C"
{
#endif
#define MYIMAPI extern "C" __declspec(dllimport)
#define MYEXAPI extern "C" __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);
}
[toc]
生成多个密钥,生成时修改密钥文件的文件名
ssh-keygen -t rsa -C "邮箱"
注意上述命令执行完之后第一个输入要求的是输入的保存的文件名
示例:
ssh-keygen -t rsa -C "[email protected]"
# 保存的时候可以选择保存文件的名称设置为 id_rsa_qq
# 接着执行另外一个账号
ssh-keygen -t rsa -C "[email protected]"
# 保存的时候可以选择保存文件的名称设置为 id_rsa_163
添加密钥
# 切换
ssh-agent bash
# 添加
ssh-add ~/.ssh/id_rsa_qq
ssh-add ~/.ssh/id_rsa_163
将密钥添加到账户中
使用 cat
查看对应账户的 pub
文件。将其内容添加到账户中。
简单点就是ssh:
ssh -T "[email protected]"
返回 Hi (用户名)! You've successfully authenticated, but GitHub does not provide shell access.
开头样式的表示添加密钥成功了。
[toc]
jpg
和 png
图片格式在写这篇文章之前,笔者在编写一个简单的 Qt 程序时遇到了这样一个问题:
> 问题:一个png
格式的图片改成后缀为jpg
格式的图片时,QLabel无法读取的问题。笔者是通过setStyleSheet()
、QImage
、QPixmap
的接口均尝试过将改后缀后图片设置到QLabel
中,均以<mark style="background-color:red">失败</mark>告终。
特此研究了一下这jpg
和png
两者之间的区别,后续再研究一下Qt关于相关格式图片读取的问题。
图片会有jpg
和png
两种格式,那么这俩种格式的图片又有着什么样的区别呢?下面就给大家分享一下。 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多万色。
png
和 jpg
> 转自百度百科:
>
> 1、JPEG可以对照片(或类似)图像生成更小的文件,这是由于JPEG采用了一种针对照片图像的特定有损编码方法,这种编码适用于低对比,图像颜色过渡平滑,噪声多,且结构不规则的情况下。如果在这种情况下用PNG代替JPEG,文件尺寸增大很多,而图像质量的提高有限。相应的,如果保存文本,线条或类似的边缘清晰,有大块相同颜色区域的图像,PNG格式的压缩效果就要比JPEG好很多,并且不会出现JPEG那样的高对比度区域的图像有损。如果图像既有清晰边缘,又有照片图像的特点,就在在这两种格式之间权衡一下了。JPEG不支持透明度。
>
> 2、由于JPEG是有损压缩,会产生迭代有损,在重复压缩和解码的过程中会不断丢失信息使图像质量下降。由于PNG是无损的,保存将要被编辑的图像来说更加合适。虽然PNG压缩照片图像也有效,但有专门针对照片图像设计的无损压缩格式,比如无损JPEG2000,Adobe DNG等。总的来说这些格式都不能做到适用所有图像。对于将要发布的图像可以保存成JPEG,用JPEG编码一次不会造成明显的图像有损。
总结就是:
jpg
格式的图片能在高度压缩率的同时,展现十分丰富生动的图像,但是随着压缩比的增大,图片的品质会逐渐降低的。而png
图片的特性就是体积小,节约空间,与jpg
图片相比,png
图片时无损压缩,在不损失图片数据的情况下,可以快速的获取自己想要的图片,而且图片的质量并不会下降。png
格式的图片可以编辑,比如图片中的字体、线条等,可以通过ps等软件更改。但是jpg
格式的图片则不可以更改,png
与jpg
图片相比png
格式的图片更大。OSI 参考模型是一个理想化的方案。这么说是因为很少有系统是完全按照它来实现(关于这一点可以后续再讨论),但是它通常被用来作为网络原理讨论的框架。
> 一台机器上的每一层都假设它在跟另一台机器上的同一层“通话”。在同一层次上,两台机器“说”的是同一种语言或协议。
每一次网络传输必须都要向下传输,通过客户机器的每一层,再传输到网络上,然后再目标机器上向上传递,直至到达某一可以理解和执行该请求的层。
在 OSI 模型中,每一层的目的是:向更高的层提供服务,并且对如何在低层上实现这些服务进行抽象。
以下内容为 OSI 七层中每一层的介绍:
Curl 请求 Https
使用 curl 发送 https 请求时,如下命令就会报错:
curl "https://www.baidu.com"
错误代码:
<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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.