字体

概念介绍

  1. SFNT: 文件字体格式(可缩放字体和样条字体),最初是Macintosh TrueType字体开发的。 现有字体 TrueTypeOpenTypeWeb Open Font Format

  2. 字体专利之争 Adobe 霸主, Apple 和 MS 合作,Type 1 被迫开放所有人使用.

  3. 微软创建字体 Times New Roman(与Times Roman兼容), Arial(与Helvetica兼容)和Courier New(与Courier兼容)

  4. 微软推出clearType(亚像素渲染技术)

  5. OpenType 微软TrueType Open(和Adobe 合作) 印刷行为 10000 多种字体,Adobe占了三分之一 除Cambria Math外,还提供了三种免费字体:Asana-Math,Neo Euler和XITS 支持数学

  6. WOFF 压缩网络字体Google主导 W3C标准

文件格式

  1. TrueType Collection .ttcf格式

  2. 字体裁剪工具

时间函数性能

时间函数

  1. GetTickCount() 精度1毫秒

  2. QueryPerformanceCounter()

  3. time()

  4. GetSystemTimeAsFileTime()

  5. ftime()

  6. GetLocalTime() = GetSystemTimeAsFileTime() + FileTimeToSystemTime()
    精度 0.1 us

Release Win32 Intel Core i7-8700 CPU @3.20GHz

函数名称 1000000次执行时间(us)
GetSystemTimeAsFileTime() + FileTimeToSystemTime() 723,836
time() 559,098
GetLocalTime() 783,646
ftime() 788,472
GetTickCount() 31,506
QueryPerformanceCounter() 243,223

C++ const mutable volatile

修饰关键词

const

4种修饰

mutable

适用场景: 当一个成员函数被从const 修饰后,需要修改某个成员属性 mutable 修饰属性

volatile

三大特性:

  • 易变性
  • 不可优化性
  • 顺序性 (volatile修饰的变量不会被编译器优化乱序,但是非volatile修饰的变量可能会跟volatile变量乱序,依赖于cpu指令,不可以作为线程顺序控制)

Java的关键词增强较多不一样
http://hedengcheng.com/?p=725

static

  • C语言
  1. 静态局部变量(全局数据区) 用于函数体内部修饰变量,这种变量的生存期长于该函数

  2. 静态全局变量和静态全局函数 定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见

  • C++
  1. 静态数据成员 类成员 每个class有一份

  2. 静态成员函数 (不可访问普通成员)

final

sealed

/clr

windows下httpGet请求

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#pragma once
#include <windows.h>
#include <string>
#include <vector>
#include <list>
#include <WinInet.h>
#pragma comment(lib, "wininet.lib")

using namespace std;
namespace WinInet
{
#pragma region HttpGet
static __inline
bool ParserUrl(string Url, string& Host, string& Filename, WORD& Port)
{
Port = INTERNET_DEFAULT_HTTP_PORT;
if (Url.substr(0U, 7) != "http://")
{
return false;
}
Url = Url.substr(7);
int HostLen = 0;
for (int i = 0; i < (int)Url.size(); i++)
{
if (Url[i] == (':') || Url[i] == ('/'))
{
break;
}
HostLen++;
}
Host = Url.substr(0, HostLen);
Url = Url.substr(HostLen);
if (Url[0] == ':') {
for (int i = 1; i < (int)Url.size(); i++)
{
if (Url[i] == ('/'))
{
string strPort = Url.substr(0, i);
Port = atoi(strPort.c_str());
Url = Url.substr(i);
break;
}
}
}
Filename = Url;
return true;
}
static _inline
string HttpGet(string Url, DWORD& httpStatus)
{

string ret;
DWORD byteread = 0;
HINTERNET m_hInternetSession = NULL;
HINTERNET m_hHttpConnection = NULL;
HINTERNET m_hHttpFile = NULL;

char buffer[1024] = { 0 };
//
LPCSTR ppszAcceptTypes[2];

DWORD dwContentLength = 0, dwIndex = 0, filesize = 0xffffffff, totalSize = 0;
DWORD dwBuffLen = sizeof(dwContentLength);

DWORD dwFlags = INTERNET_FLAG_RELOAD;
DWORD TimeOut = 15000;

string m_sServer, m_sObject;
WORD m_nPort = INTERNET_DEFAULT_HTTP_PORT;
httpStatus = DWORD(-1);
if (!ParserUrl(Url, m_sServer, m_sObject, m_nPort))
return "";
LPCSTR headers = ("\r\n\r\n");



m_hInternetSession = ::InternetOpenA(("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);


InternetSetOption(m_hInternetSession, INTERNET_OPTION_CONNECT_TIMEOUT, &TimeOut, sizeof(DWORD));
InternetSetOption(m_hInternetSession, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &TimeOut, sizeof(DWORD));
InternetSetOption(m_hInternetSession, INTERNET_OPTION_DATA_SEND_TIMEOUT, &TimeOut, sizeof(DWORD));

if (m_hInternetSession == NULL)
goto EXIT;



m_hHttpConnection = ::InternetConnectA(m_hInternetSession, m_sServer.c_str(), m_nPort, NULL,
NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (m_hHttpConnection == NULL)
goto EXIT;
//Issue the request to read the file

ppszAcceptTypes[0] = ("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); //We support accepting any mime file type since this is a simple download of a file
ppszAcceptTypes[1] = NULL;


m_hHttpFile = HttpOpenRequestA(m_hHttpConnection, "GET", m_sObject.c_str(), "HTTP/1.0", NULL, ppszAcceptTypes, dwFlags, 0);
if (m_hHttpFile == NULL)
goto EXIT;


if (!::HttpSendRequestA(m_hHttpFile, headers, strlen(headers), NULL, 0))
goto EXIT;



dwBuffLen = sizeof(httpStatus);
if ((!HttpQueryInfoA(m_hHttpFile, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &httpStatus, &dwBuffLen,
&dwIndex)) || (httpStatus != HTTP_STATUS_OK))
goto EXIT;
dwBuffLen = sizeof(dwContentLength);
if ((HttpQueryInfoA(m_hHttpFile, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwContentLength, &dwBuffLen,
&dwIndex)))
{
filesize = dwContentLength;
ret.reserve(dwContentLength);
}
while (true)
{
DWORD byteread = 0;
if (!InternetReadFile(m_hHttpFile, buffer, sizeof(buffer), &byteread) || (byteread == 0))
break;
totalSize += byteread;
ULONG written = 0;
ret += string(buffer, byteread);
//ret->Write(buffer, byteread, &written);
if (totalSize >= filesize)
break;

}

EXIT:
if (m_hInternetSession)
InternetCloseHandle(m_hInternetSession);
if (m_hHttpConnection)
InternetCloseHandle(m_hHttpConnection);
if (m_hHttpFile)
InternetCloseHandle(m_hHttpFile);
return ret;
}

#pragma endregion HttpGet
}

使用方法

1
2
3
4
5
DWORD httpStatus;
std::string buff = WinInet::HttpGet(w2a(url.c_str()), httpStatus);
if (httpStatus != 200) {
return false;
}

知名博客集锦

🐂🍺

性能分析

C++程序员博客列表

数据库

JAVA程序员博客列表

算法博客

知识图谱

安全博客

有趣的二进制

其他行业教学视频合集

程序员修炼之道-读书笔记

  1. 关心你的技艺
  2. 思考你的工作
  3. 提供选择不找蹩脚的借口
  4. 不要容忍破窗户
  5. 要做变化的催化剂(石头汤)
  6. 注意大图景
    欲求更好,常把好事变糟 -李尔王
  7. 使质量成为需求问题
    知识上的投资,总能得到最好的回报 -富兰克林
    如何投资自己的知识?
    定期投资
    多元化
    管理风险
    低买高卖
    重新评估和平衡
  8. 投资你的知识资产
    每年学习一门新语言
    每个月阅读一本技术书籍
    上课
    参与本地用户组织
    实验不同环境
    跟上潮流
  9. 批判的思考你读到的和听到的
  10. 你说什么和你怎么说一样重要
  11. 不要重复你自己
    为什么需要注释?都说需要注释,是因为糟糕的代码才需要注释,优秀的编码根本不需要!
  12. 让复用变得容易
  13. 消除无关事物的影响
    让你的代码保持解耦
    避免使用全局数据
    避免写相似函数
  14. 不存在最终决策
  15. 用曳光弹找到目标
  16. 为了学习制作原型
  17. 靠近问题领域编程
  18. 估算,以避免意外
  19. 通过代码对进度表进行迭代
  20. 用纯文本保存知识
  21. 熟练使用命令行shell
  22. 用好编辑器
  23. 总是使用源码控制
  24. 修正问题bug,而不是指责
  25. “Selection”is broken
  26. 不要恐慌
  27. 不要假定要证明
  28. 学习一种文本操纵语言
    脚本语言的作用:
    数据库的维护
    java属性的访问
    测试数据生成
    写书
    C与Object Pascal的接口
    生成web文档
  29. 编写能编写代码的代码
  30. 你不可能写出完美的软件
    没有什么东西比常识和坦率更让人感到惊讶了。

-爱默生
31. 通过合约进行设计
32. 早点崩溃
33. 如果不可能发生,请用断言确定它不会发生
34. 将异常用于异常的问题
35. 要有始有终
36. 使模块之间中耦合性降到最低
37. 要配置不要集成(多使用元数据metadata)
38. 将抽象放入代码,将细节放入元数据
39. 分析工作流,改善并发性
40. 用服务进行设计
41. 总是为并发性进行设计
42. 视图与模型分离
43. 使用黑板工作流方式
44. 不要靠巧合编程(先思考再编码)
45. 估算你算法的阶
46. 测试你的估算
47. 何时需要重构
重复
非正交性的设计
过时的知识
性能
48. 早重构,常重构(类似肿瘤)
重构的注意事项:
不要在重构中添加新功能
重构之前先确定有良好的测试
采用短小,深思熟虑的方式
49. 为测试而设计
50. 测试你的软件,否则你的用户就得测试
51. 不要使用你不了解的向导代码(自己应该有自己代码生成器)
52. 不要收集需求而是挖掘他们!
53. 抽象比细节活得更长久
54. 使用项目词汇表
55. 不要再盒子外面思考—找到盒子
56. 倾听反复出现的疑虑,请准备好
57. 对于有些事情,做甚于描述
58. 不要做形式方法的奴隶
59. 昂贵的工具不一定能做出合适的设计
60. 围绕功能而不是每个人职务分组
61. 不要使用手工流程
62. 早测试、常测试、自动测试
63. 要通过所有的测试,代码才算完成
64. 要通过蓄意破坏测试你的测试
65. 测试代码覆盖,而不是覆盖代码
66. 一个bug只抓一次
67. 把英语当成一种编程语言
68. 把文档建在里面,而不是拴在外面
69. 温和地超过用户期望
70. 在你的作品上签名

C++链接问题总结

列表

  1. QT5: LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    解答: vs的某个exe和系统的exe不匹配
    cvtres.exe
    http://www.cnblogs.com/newpanderking/articles/3372969.html
    实在不行就安装vs的sp1补丁包

  2. fatal error LNK1318: 非意外的 PDB 错误
    清理重新编译、 去除链接器生成调试信息

  3. fatal error LNK2019: 无法解析的外部符号 _sprintf
    当二进制文件lib为旧版本编译器生成,使用高版本vs重新编译可能会出现该错误,需要在lib输入添加

C++编译问题总结

列表

  1. C4819 解决方案
    使用正则表达式搜索 [^\x00-\x7F]替换为空

    或者保存为正确的编码方式

    主要原因: 源码中含有非当前编码集识别的字符

  2. midl 编译不过去

    在c盘根目录创建名字叫program的空文件就可以无法找到exe编译IDL

C++ tuple输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// c++11
template<typename Tuple, size_t N>
struct tuple_print {
static void print(const Tuple& t, std::ostream& os) {
tuple_print<Tuple, N - 1>::print(t, os);
os << ", " << std::get<N - 1>(t);
}
};
// 类模板的特化版本
template<typename Tuple>
struct tuple_print<Tuple, 1> {
static void print(const Tuple& t, std::ostream& os) {
os << "(" << std::get<0>(t);
}
};

// operator<<
template<typename... Args>
std::ostream& operator <<(std::ostream& os, const std::tuple<Args...>& t) {
tuple_print<decltype(t), sizeof...(Args)>::print(t, os);
return os << ")";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//C++14
// 数组转换为 tuple
template<typename Array, std::size_t... I>
auto a2t_impl(const Array& a, std::index_sequence<I...>) {
return std::make_tuple(a[I]...);
}

template<typename T, std::size_t N, typename Indices = std::make_index_sequence<N>>
auto a2t(const std::array<T, N>& a) {
return a2t_impl(a, Indices{});
}

// 漂亮地打印 tuple

template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple_impl(std::basic_ostream<Ch, Tr>& os,
const Tuple& t,
std::index_sequence<Is...>) {
((os << (Is == 0 ? "" : ", ") << std::get<Is>(t)), ...);
}

template<class Ch, class Tr, class... Args>
auto& operator<<(std::basic_ostream<Ch, Tr>& os, const std::tuple<Args...>& t) {
os << "(";
print_tuple_impl(os, t, std::index_sequence_for<Args...>{});
return os << ")";
}
  • © 2020-2021 一潭清泓
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信