C++下实现机制的反射「2」——升级自省功能

上一篇「part1」中,实现了一个能够存储类的成员变量的结构,使用父类Base中的set_field方法,将派生类的成员变量映射进map中,所以我们只需要在Base类中编写一堆方法就能直接调用派生类的成员变量。

例如:

  • 导出成JSON格式数据
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
string to_json()
{
string json = "{";
for(auto i = m_table.begin(); i != m_table.end();)
{
json.append("\"");
json.append(i->first);
json.append("\":");
switch(i->second.first)
{
case INT_TYPE:
json.append(to_string(*static_cast<int*>(i->second.second)));
break;
case DOUBLE_TYPE:
json.append(to_string(*static_cast<double*>(i->second.second)));
break;
case STRING_TYPE:
json.append("\"");
json.append(*static_cast<string*>(i->second.second));
json.append("\"");
break;
}
if(++i != m_table.end())
{
json.append(",");
}
}
json.append("}");
return json;
}

由于保存指针的类型是void *,所以在使用的时候都需要对其使用static_cast转化一下,使用强制转换也是可以的,然而因为指针所以是比较危险的操作,推荐还是用cast转化指针类型,才能正确的获取值。就这样不需要每个类都要重写一个方法,就能很愉快的节省时间,如果是QT框架的话还可以直接转化成QJsonObject更方便。

阅读更多
C++下实现机制的反射「1」——自省

反射(Reflection)机制

是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。wiki)

在其他语言中都有大量的应用,尤其是Java中反射与注解配合使用可以大大的减少工作量,降低重复代码,也能使程序更容易维护。现代Java框架中已经离不开反射与注解了。

目标

最近在公司的QT项目中需要大量的使用数据库,虽然QT提供了非常方便的数据库连接驱动与API,但是并没有更方便的ORM功能,只能拼写Sql语句之后运行,再从结果中手动处理得到对象。

虽然这么做并没有什么问题,但是问题是当一个软件设计到一定程度,例如出现了N个需要存储的对象,如果按照Model,DAO,Service,Controller的MVC设计思路,每一个Model都需要手动为其写insert,update,delete的函数。到最后,同样功能的sql语句可能会写十几遍,所以需要设计一套能应对此类情况的框架。

所以,我们就要在C++环境下设计与实现反射机制以及ORM系统。

阅读更多
生产者消费者模型下的爬虫|Web Crawler with Producer-consumer Pattern

提升爬虫效率

提升爬虫的抓取效率无非优化爬虫与服务器的链接速度和效率。最为简单的方式就是“加钱”,使用更大带宽的网络,和更高的并发。

所以很多情况下就可以使用多线程或者分布式的爬虫方案。然而在使用这些模式的爬虫情况下可能会出现另一些影响爬虫效率的因素:入库。

爬虫数据入库

单机情况下爬到的东西一般直接存到本地就行了,直接扔到一个文件内或者数据库内就行。

然而分布式情况下如果爬虫生产的数据存入统一的数据库,每次的存取就会进行一次事务,如果出现失败等情况还需要在爬虫中对这些错误进行处理,不然爬虫就会直接死掉。

爬虫与数据库之间的链接状况也会影响当前的爬虫进程,爬虫无法在数据库入库之前进行下一次抓取。

肯定有人会说:“先全部存到本地就好了啊,爬完再统一存进去。”确实这是一个减轻代码量的“好”方法。但是如果是一个长期项目,整理数据就不是那么的轻松了。

因此选择一个更生产者消费者模式能够更好的提高爬虫的效率。

阅读更多
Java中使用Selenium (1)

Selenium本作为测试Web使用的框架,如今用在爬虫的项目上简直无人能敌。它可以使用浏览器像一个真人一样的进行浏览网页。

由于在爬虫和测试领域用的十分多,所以在Python上用Selenium也是十分方便的。

配置环境

首先需要下载浏览器的驱动,各种语言通过Selenium框架直接调用驱动对浏览器进行操作。

https://www.seleniumhq.org/download/ 市面上的所有浏览器官方都为其浏览器编写了WebDriver选择自己需要的版本,WebDriver的版本是否与已安装的浏览器版本对应。

(Python中有一个PhantomJS无界面的Webkit浏览器,虽然不需要驱动用起来很方便,但是自从chrome的headless模式之后它就停止更新了。并且在我使用的情况下出现了页面解析出错的情况,所以为了减少麻烦还是用WebDriver比较好)

阅读更多
在Maven和Travis中使用Jacoco进行代码覆盖测试

测试是代码生命周期的一个很重要的部分,对于开源软件一份测试报告可以提高使用者对此代码的信任度。

测试覆盖率能体现出测试中所覆盖的代码范围,也能体现测试用例的设计是否合理。

话虽如此,但是自从懂事以来就没有给自己的代码写过测试类。JUnit也是拿来当Jshell用(这么方便的@Test哪里去找)

测试环境

这次配合自己写的一个开源库,所以配置了一套完整的测试步骤。

  • travis-ci(因为这个项目直接托管在github上所以用travis会比较方便)
  • maven(自动打包和测试)
  • jacoco(导出测试报告)
  • coveralls(第三方测试统计平台)

测试流程就是当代码Push到GitHub之后,travis创建VM开始执行maven对代码进行打包和测试,同时jacoco生成测试报告,完成之后将报告上传至coveralls。

阅读更多
使用Jenkins管理多个服务器

Jenkins作为一个CI工具在各种插件的加持下可以变成一个十分强大的工具,可以实现对各个平台代码的持续集成和部署。

甚至可以通过一些方法对多个节点进行同步更新代码等操作。

例如if.uy 多节点ping服务,目前ping节点服务器使用python3编写。虽然代码只有短短几百行但是如果每次更新都得手动上服务器对代码进行更新的话无疑是一件浪费时间精力的实情。所以为了防止因更新太频繁而放弃更新的情况出现,需要使用一种方法一次更新多节点自动同步的方案。

提出方案

所以根据需求可以设计出以下几种方案:

  • flask debug 模式热更新代码
  • Zookeeper 统一管理节点
  • jenkins Publish over SSH 插件管理节点
阅读更多
Nginx反向代理Harbor更优雅的使用私有仓库

大部分人拿来当作docker私有仓库的机器可能不止运行Harbor一个程序,因此很有可能80和443端口会被自己安装的Http程序所占用。而如果修改了Harbor的端口的话长长的镜像名字还得带上端口,看起来有点难受。

所以在此情况可以安装Nginx作为端口转发的工具,由他来控制80和443端口的访问。

设置Harbor

因为接下来设置nginx之后可以通过域名来区分入口,不需要依靠端口。就需要把Harbor的hostname修改。

修改harbor.cfg

1
2
# 不需要加入端口
hostname = docker.domain.com

修改docker-compose.yml

1
2
3
#修改proxy节点的port
- 8848:80
- 9443:443

接下来重新运行./install.shHarbor不会删除任何数据

完成之后访问docker.domain.com:9443测试能否打开,如果一切正常进行接下来的操作

阅读更多
使用Harbor建立私有docker仓库

介绍

Harbor

harbor是vmware提供的一个开源的企业级docker仓库方案,可以提供跨数据中心的景象同步备份

有很多地方提供免费的docker私有仓库,然而最合理的方式还是保存在自己私有仓库中。

Docker官方的hub也提供免费的私有仓库,但是只提供1个私有仓库。Gitlab也为没给项目提供免费的私有仓库,但是不清楚有什么限制。(Gitlab真有钱,无限免费仓库,2kMin的ci,还有这个貌似无限制的docker私有仓库)

安装registry

如果不需要网页管理什么的直接部署官方的registry容器就行了

阅读更多
为VPS添加ipv6

最近无意间发现浙江移动4G已经能分配到IPv6并且能够正常的使用了。今年又不想再办宽带,学生卡无限流量套餐+ipv6开热点简直爽到,而且能够直接给小鸡分配v6就够了,不需要再额外购买v4的ip,还能剩下不少钱。

而且全国很多的地区都已经分配了ipv6,为自己的小鸡弄一个v6也是十分必要的。然而大部分的vps主机商都只包含v4,阿里云竟然也不提供v6.像国外这种体量的云主机提供商都支持v6了。

所以我们只能使用HE.NET的v6隧道来使用。

接下来我们需要进行以下操作。

阅读更多
在Windows上向Linux服务器部署Hexo

Hexo官方在文档中提到的部署文件方法只有同步到Gitpage、Heroku、OpenShift或者通过rsync、ftp同步到自己的服务器。

然而Windows下并没有rsync,之前为了用rsync同步文件只好使用Bash on Windows来用rsync。

如果只是为了用rsync就装了BOW实在是太浪费了,所以需要另一种方式来同步Hexo。

Hexo提供Git提交方式的插件。原本这个插件是用来同步到Git page的,但是我们也可以用Git方式push public文件夹内容到git仓库然后设置webhook向自己的服务器发送事件,服务器再pull下来就行了(虽然跟那插件没啥关系)。

环境准备工作

所以我们先来做准备:

  • 创建私有仓库
  • 添加服务器的ssh pub key到github或者gitlab中就可以使用ssh方式pull文件而不需用输入用户密码
  • 准备python监听hook脚本
阅读更多