顺序容器
list是一个双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,因此list没有提供[]操作符的重载。但list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可。

  1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
  2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
  3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

forward_list

相对于 list 来说, 因为是单向链表,所以节省空间,增加效率.

#include <forward_list>

sort


random access

use iterator

std::next
std::advance

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
std::vector<int> v{ 3, 1, 4 };
auto it = v.begin();
auto nx = std::next(it, 2);
std::cout << *it << ' ' << *nx << '\n';
}

终于有了个好用的图片插件,完全符合我的需求。终于可以把 atom 扔掉了。

安装 node.js
安装 hexo
安装插件

图片插件

Paste Image

Paste Image: Base Path
${currentFileDir}/${currentFileNameWithoutExt}

Paste Image: Default Name
YYYYMMDD_HHmmss

Paste Image: Insert Pattern
${imageFileName}

Paste Image: Path
${currentFileDir}/${currentFileNameWithoutExt}

markdown 插件

markdown all in one
markdown preview github styling

Gitea 快捷方便

gogs vs gitea

Gogs and Gitea are Open Source, single-binary Go implementations of a Github-like git repository hosting system
Gitea is a fork of Gogs

https://docs.gitea.io/en-us/comparison/

Gitea 评价略微好于 gogs
Easy to install and setup. Can run on a VPS with 1 core CPU and 256MB RAM.

Gitblit
Pure Java Git solution for managing, viewing, and serving Git repositories.
Current Release 1.8.0 (2016-06-22)

综上所述,选择gitea

注册为Windows服务

以Administrator身份运行 cmd,然后执行以下命令:

sc create gitea start= auto binPath= "\"d:\gitea\gitea.exe\" web --config \"d:\gitea\custom\conf\app.ini\""

之后在控制面板打开 “Windows Services”,搜索 “gitea”,右键选择 “Run”。在浏览器打开 http://localhost:3000 就可以访问了。(如果你修改了端口,请访问对应的端口,3000是默认端口)。

从Windows服务中删除

以Administrator身份运行 cmd,然后执行以下命令:

sc delete gitea

还真简单,就是个 exe 直接运行就可以了, localhost:3000 默认端口

第一次运行,点击 sing in 会出现配置界面

安装 postgreSQL 或者 sqlite

// 查看 postgreSQL 端口
netstat -ano|findstr "5432"

配置

修改配置文件
D:\gitea\custom\conf\app.ini

把 server 下面的 localhost 替换成服务的ip。

20200214_154000.png

增加启用内部SSH服务器
START_SSH_SERVER = true

查询

SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。

SELECT 字段 FROM 表 WHERE 某字段 Like 条件

使用 OR 和 AND 来增加条件
SELECT * FROM `t_company` where f_name like 't%' OR f_company_id like '6%'

正则模式

用到的时候再添加,目前模糊匹配够用了

存在更新,不存在插入

如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则执行UPDATE语句

sql = str::cstr::format("insert into %s (f_no,f_name,f_addr,f_update_datetime) values ('%s','%s','%s','%s') ON DUPLICATE KEY UPDATE \
f_name='%s',f_addr='%s',f_update_datetime='%s'",
it.tableName.c_str(), itJson["villageCode"].asString().c_str(),
f_name.c_str(),f_addr.c_str(),f_update_datetime.c_str(),
f_name.c_str(),f_addr.c_str(),f_update_datetime.c_str());

存在替换,不存在插入

如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则先删除旧数据再插入最新的数据,

// mysql 已验证
sql = str::cstr::format("replace into %s (f_no,f_name) values (%I64d,'%s')",
it.tableName.c_str(), itJson[paramKey.c_str()].asInt64(),
itJson["name"].asString().c_str());

避免重复插入

关键字/句:insert ignore into,如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据

INSERT IGNORE INTO `student`(`name`, `age`) VALUES('Jack', 18);

更新语句

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

手动安装

下载压缩包之后解压到合适的目录下面

export PATH=$PATH:/Users/zhengjun/project/Library/gradle-5.4/bin

关键字 compile implementation api

compile 关键字已经过期了

Using api is the equivalent of using the deprecated compile, so if you replace all compile with api everything will works as always.

use ODBC access database

dsn 设置

// access database use
string getDsnDbPath(const string& dsnName)
{
string strRet = "";
HKEY hKey;
string subKey = "Software\\ODBC\\ODBC.INI\\" + dsnName;
LONG lResult = RegOpenKeyExA(HKEY_CURRENT_USER, (subKey).c_str(), 0, KEY_WOW64_64KEY | KEY_READ, &hKey);
if (ERROR_SUCCESS == lResult)
{
DWORD dwType = REG_SZ;
CHAR szLocation[MAX_PATH] = { '\0' };
DWORD dwSize = MAX_PATH;
// 获取缓存的长度dwSize及类型dwDataType
lResult = ::RegQueryValueEx(hKey, "DBQ", 0, &dwType, (LPBYTE)&szLocation, &dwSize);
if (ERROR_SUCCESS == lResult)
{
strRet = &szLocation[0];
}
RegCloseKey(hKey);
}
else {
// 不存在,或打开失败
}
return strRet;
}

BOOL isDsnPresent(const string& dsnName)
{
BOOL bRet = TRUE;
HKEY hKey;
string subKey = "Software\\ODBC\\ODBC.INI\\" + dsnName;
LONG lResult = RegOpenKeyExA(HKEY_CURRENT_USER, (subKey).c_str(), 0, KEY_WOW64_64KEY |KEY_READ, &hKey);
if (ERROR_SUCCESS == lResult)
{
bRet = TRUE;
}
else
{
if (lResult == ERROR_FILE_NOT_FOUND)
{
bRet = FALSE;
}
else
{
subKey = str::cstr::format("open registry failed. %d",lResult);
OutputDebugString(subKey.c_str());
}
bRet = FALSE;
}
RegCloseKey(hKey);
return bRet;
}

BOOL configAddDSN(const string& driver, const vector<string>& attr)
{
char buf[512] = {'\0'};
char* p = buf;
for (auto&it:attr)
{
strcpy(p, it.c_str()); p += strlen(p) + 1;
}
return SQLConfigDataSource(NULL, ODBC_ADD_DSN, driver.c_str(), buf);
}

连接字符串

注意 Exclusive=0 避免独占打开

strDbPath = getDsnDbPath("dsnReal16Access");
g_strDsn = "ODBC;DSN=dsnReal16Access;DBQ=" + strDbPath + ";DriverId=25;FIL={MS Access};Exclusive=0;MaxBufferSize=2048;PageTimeout=5;UID=admin;";

查询

dbString = "SELECT f_no, f_name FROM t_people_purpose_type;";
CRecordset rs(&db);
if (FALSE == rs.Open(CRecordset::forwardOnly, dbString.c_str(), CRecordset::readOnly))
{
if (g_bWriteLog)
{
string strLog = "1biao6shi: get t_people_purpose_type error: ";
OutputDebugString(strLog.c_str());
if (g_logger)
{
g_logger->error(strLog);
}
}
}else
{
CDBVariant varValue;
int iNo = 0;
string strName;
while (!rs.IsEOF())
{
rs.GetFieldValue(short(0), varValue);
iNo = atoi(*varValue.m_pstring);
rs.GetFieldValue(short(1), varValue);
if (string::npos != pwnd->m_strDsn.find("Access"))
{
strName = ((*varValue.m_pstring).GetBuffer());
}
else
{
strName = str::cstr::utf8ToAscii((*varValue.m_pstring).GetBuffer()).c_str();
}

if (strName.empty())
{
ASSERT(FALSE);
}
pwnd->m_mapPersonPurposeType.insert(pair<int, string>(iNo, strName));
rs.MoveNext();
}
rs.Close();
}

非查询语句

db->executeNonQuery("set names utf8");

insert

db.BeginTrans();
db.ExecuteSQL(sql.c_str());
db.CommitTrans();

insert by CRecordset

插入图片
https://blog.csdn.net/weixin_40026797/article/details/83719070

使用class wizard 添加 CRecordset 的继承类,使用 mfc odbc consumer 选择要处理的表.

db.BeginTrans();
Ct_personRecordset rs(&db); //绑定数据库

1. Call AddNew.
2. Set field appropriately.
3. Call Update

db.CommitTrans();

下面代码一直报错,未成功. Conversion is not supported

// has picture need to store
rs.m_f_pic.m_dwDataLength = vOut.size();
HGLOBAL hGlobal = GlobalAlloc(GPTR, rs.m_f_pic.m_dwDataLength);
rs.m_f_pic.m_hData = GlobalLock(hGlobal);
memcpy_s(rs.m_f_pic.m_hData, rs.m_f_pic.m_dwDataLength, &vOut[0], vOut.size());

rs.SetFieldDirty(&rs.m_f_pic, true);
rs.SetFieldNull(&rs.m_f_pic, false);

while (!rs.CanUpdate())
Sleep(200);
GlobalUnlock(rs.m_f_pic.m_hData);

modify by CRecordset

rs.Edit();
rs.m_field1 = ...;//字段1
rs.m_field2 = ...;//字段2
.....
rs.Update();

CRecordset 相关说明

Snapshots and Dynasets

Snapshots 是静态数据,反应获取时的那一点的数据
Dynasets 是动态数据,如果有其他人修改了,会动态反应出来,需要调用 requery

class view 窗口右键项目-菜单选择 add class- mfc - mfc odbc consumer 然后选择数据源,生成类

问题

CRecordset 的坑

手动修改了生成类的字段似乎不生效,需要重新生成.

RFX_TEXT nMaxLength 默认 255 不够用,需要手动修改

RFX_Text(pFX, _T("[f_gis]"), m_f_gis, 1024);
RFX_Text(pFX, _T("[f_gisArea]"), m_f_gisArea, 1024);

blob error: Conversion is not supported

insert image to blob field error.

Lock wait timeout exceeded; try restarting transaction

Enter MySQL

mysql -u your_user -p

  1. Let’s see the list of locked tables

mysql> show open tables where in_use>0;

  1. Let’s see the list of the current processes, one of them is locking your table(s)

mysql> show processlist;

  1. Kill one of these processes

mysql> kill <put_process_id_here>;

Conversion is not supported

State:07006,Native:0,Origin:[MySQL][ODBC 8.0(a) Driver][mysqld-5.5.62-log]

#include <functional>
using namespace std::placeholders;

vector<function<const tuple<string, string>()>> vFunc;
vFunc.emplace_back(bind(&CProtocol::getGisType, &g_protocol));

成员变量使用

//头文件声明
std::function<int(MQTTClient*, const char*, const char*, int, void*)> m_pMQTTClient_create;

// 源文件赋值
m_pMQTTClient_create = g_dllMqtt.getDllFunc<int(MQTTClient*, const char*, const char*, int, void*)>("MQTTClient_create");

类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。

通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。

阅读全文 »

选择

select t.column_name from user_col_comments t where t.table_name = 'LATELYGPSINFO';

存在更新,不存在插入

// mysql 已验证
sql = str::cstr::format("replace into %s (f_no,f_name) values (%I64d,'%s')",
it.tableName.c_str(), itJson[paramKey.c_str()].asInt64(),
itJson["name"].asString().c_str());

插入

string sql = "insert into t_province (f_no,f_name) values (?,?)";

更新

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

删除

DELETE FROM 表名称 WHERE 列名称 =

创建表


康波周期大约50-60年分为:
回升(20年):孕育着新技术的创新,经济回暖
繁荣(20年):新技术不断被开发利用,经济快速发展
衰退(10年):经历牛市末期,经济的回落
萧条(10年):经济发展进入严重低迷期

2019年处于萧条末期

1975-1982年是上一次康波的萧条阶段
1991-1994美国信息技术泡沫是康波繁荣的标志,2008年之前是世界经济的本次康波繁荣阶段
2004-2015康波衰退期

40岁以上的人,有三次发财机会,分别是2008年,2019年,2030年,85后一定要把握2019年的机会。

人的一生理论上有三次机会

康波由前苏联经济学家康德拉季耶夫于1926年正式提出,他在研究英、法、美、德以及世界经济发展史后认为,发达商品经济处于50年到60年为一个周期的循环波段之中。

同时,一个康波周期嵌套着多个库兹涅茨周期和朱格拉周期:

127ad14d.png

另外,康波还可以分为四个小波:

1) 繁荣期(10年):新技术不断采用,经济快速发展;
2) 衰退期(10年):经历商品的牛市以及对经济的救赎;
3) 萧条期(10年):经济发展进入严重低迷期;
4) 回升期(20年):孕育着新技术的创新。

1、大宗商品

2017年后将再次下探。
大宗商品最暴利,牛市几十年出现一次。
从2011年至少到2030年,商品的走势都是熊市,所以不可能依靠商品取得暴利。
2017年至2019年商品将二次探底,二次探底的价格会在2015年的低点附近。

2、房地产

到2019年再买房。
房地产周期20年轮回一次。
中国本轮房地产周期1999年开启,2014年是中国房地产周期的高点。
2016年一线城市房价暴涨只是房地产周期的B浪反弹,2017年上半年这次反弹就会结束。
2017、2018年房价会回落,2019年会迎来一个低点。

3、股票
2017年依然没有机会。
2017年很难做出绝对收益,A股依然没有机会,主要还是等风险释放后的超跌反弹。
但股票不是长周期问题,随时波动,所以康波周期没法明确定义。

4、艺术品市场
不要持有。
艺术品投资是房地产周期的附属物,这类资产过去涨很快,后来由于反腐跌了。
未来五年是资产的下降期,这个时候大家尽量持有流动性好的资产,不要持有流动性不好的资产。

5、人生规划建议
2019年再回来。
对于个人来讲,2016至2017年卖掉投资性房地产,买进黄金,锻炼身体,2019年回来。

他留下的20个预言:

1、每个人的财富积累一定不要以为是你多有本事,财富积累完全来源于经济周期运动的时间给你的机会。

2、人生的财富轨迹就是康德拉季耶夫周期。康德拉季耶夫周期一个循环是60年,一个人的自然寿命是60年。

3、人的一生中所能获得的机会,理论来讲只有三次,如果每一个机会都没抓到,一生的财富就没有了。如果抓住其中一个机会,至少是个中产阶级。

4、一个康德拉季耶夫周期分为回升、繁荣、衰退、箫条。现在这次经历的康德拉季耶夫周期,是从衰退向箫条的转换点,未来十年注定在箫条中度过。

5、2015年是全球经济及资产价格的重要拐点,意味着未来四到五年的总体的资产收益率不仅不赚钱,甚至可能要亏损。2016年到2017年是一次滞胀,流动性差的资产可能就没人要了。未来在2017年到2019年可能发生流动性危机。

6、2017年中期、三季度之后,将看到中国和美国的资产价格全线回落,2019年出现最终低点,那个低点可能远比大家想像的低。

7、我奉劝大家,如果想发债最好发五年的,2018年之后就能够感到我说的话的意义。

8、一直到2025年,都是第五次康波箫条阶段。

9、40岁以上的人,人生第一次机会在2008年,如果那时候买股票、房子,你的人生是很成功的。2008年之前的,上一次人生机会1999年,40岁的人抓住那次机会的人不多,所以2008年是第一次机会。

10、第二次机会在2019年,最后一次在2030年附近,能够抓住一次,你就能够成为中产阶级。

11、1985年之后出生、现在30岁以下的人,第一次人生机会只能在2019年出现。所以现在25岁到30岁的人,未来的5年,只能好好工作。因为买房什么都不行,这个就是由人生的财富命运所决定的。

12、大宗商品牛市是几十年出现一次, 2011年至少到2030年,商品的走势都是熊市,不可能在商品方面取得大的收益的。

13、房地产周期20年轮回一次,中国本轮房地产周期1999年开启, 2017年上半年附近,中国的这次反弹会结束。2019年房价会是一个低点。

14、2010年之后美国出现房子的牛市,2017年是第一波的高点,如果到美国买房,也可以再等等。

15、未来五年是资产的下降期,大家尽量持有流动性好的资产,而不要持有流动性不好的资产。高位的房子就是流动性不好的资产,一级市场的股权也是流动性不好的资产。

16、四季度到2017年上半年,有可能是中国资产最差的时间。2016年四季度,中国的第三库存周期可能渐渐接近周期高点,从2017年初开始,中国的库存周

期开始回落。而此时,美国的库存周期仍处于上升阶段,这样的组合对中国的资产是不利的。由于一线城市房地产库存下降,而开工跟不上,不能排除房价再次拉升

的可能性。如果汇率先跌,房价可能就会受到抑制。如果房价先涨,房价和汇率的关系就有点复杂,应该是房价先涨后跌,随后触发一定的系统风险。

17、对2017年全年而言,目前我仍然没有找到类似于2016年商品这样的机会。全球2009以来的中周期,2017年结束是大概率事件。

18、2017年到2019年是中美房地产周期共振下行期。这个问题当然不一定在2017年表现得非常严重,但有可能能够出现趋势性特征。

19、2017年至2019年商品将二次探底。2017年之后,商品将再次下探,其二次探底的价格当在2015年的低点附近。

20、2017年很难做出绝对收益,A股依然没有机会,主要还是等待风险释放后的超跌反弹。而相对收益方面,黄金一定是首要选择,黄金的配置时点大致判断在2017年二季度。