你要如何衡量你的人生

坚持,努力,让好事发生

neo4j误删数据恢复

今天有一个朋友告诉我他误操作,删了几十G的数据,问我有没有什么办法可以恢复数据。
说来也巧了,今天我在测试大数据量下load csv的性能,导入三次删除三次,理论上数据库为空,data目录下的文件应该<1MB,但是我一看,800M,肯定有日志呀。
正好碰到他问我这个问题,首先告诉他不要慌,有办法,然后google了一下,是neo4j的其中一个作者(Stefan Armbruster,带飞机帽的那个)在stackoverflow回答的,还好,谢天谢地。

用这个恢复数据
https://github.com/neo4j/neo4j/blob/3.0/tools/src/main/java/org/neo4j/tools/applytx/DatabaseRebuildTool.java

阅读全文 »

Java面试题 前200页 转自Java 面试题:百度前200页都在这里了

基本概念

  • 操作系统中 heap 和 stack 的区别
  • 什么是基于注解的切面实现
  • 什么是 对象/关系 映射集成模块
  • 什么是 Java 的反射机制
  • 什么是 ACID
  • BS与CS的联系与区别
  • Cookie 和 Session的区别
  • fail-fast 与 fail-safe 机制有什么区别
  • get 和 post请求的区别
  • Interface 与 abstract 类的区别
  • IOC的优点是什么
  • IO 和 NIO的区别,NIO优点
  • Java 8 / Java 7 为我们提供了什么新功能
  • 什么是竞态条件? 举个例子说明。
  • JRE、JDK、JVM 及 JIT 之间有什么不同
  • MVC的各个部分都有那些技术来实现?如何实现?
  • RPC 通信和 RMI 区别
  • 什么是 Web Service(Web服务)
  • JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
  • WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。
  • 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制
  • 简单说说你了解的类加载器。是否实现过类加载器
  • 解释一下什么叫AOP(面向切面编程)
  • 请简述 Servlet 的生命周期及其相关的方法
  • 请简述一下 Ajax 的原理及实现步骤
  • 简单描述Struts的主要功能
  • 什么是 N 层架构
  • 什么是CORBA?用途是什么
  • 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”
  • 什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配
  • 什么是懒加载(Lazy Loading)
  • 什么是尾递归,为什么需要尾递归
  • 什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)
阅读全文 »

领导交给我一个任务,有一些英文的文章,翻译成中文,用谷歌翻译试试。那就试试呗。

F12 经过多次测试,发现请求 https://translate.google.cn/translate_a/single 带一些参数就可以爬取谷歌翻译
第一步 访问 https://translate.google.cn/ 获取TKK
第二步 根据TKK和文本算出tk值,然后访问 https://translate.google.cn/translate_a/single 时加上参数,就可以爬取到翻译后的内容了。

步骤如下:

Get方式
https://translate.google.cn/translate_a/single?client=t&sl=en&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=btn&ssel=3&tsel=0&kc=2&tk=750300.857549&q=test

Post方式
https://translate.google.cn/translate_a/single?client=t&sl=en&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&pc=1&otf=1&ssel=3&tsel=0&kc=1&tk=280278.139719

阅读全文 »

看了很多资料后,谈谈自己对知识图谱的理解。

比较好的一篇知识图谱的文章 领域应用 | 知识图谱的技术与应用

概论

随着移动互联网的发展,万物互联成为了可能,这种互联所产生的数据也在爆发式地增长,而且这些数据恰好可以作为分析关系的有效原料。如果说以往的智能分析专注在每一个个体上,在移动互联网时代则除了个体,这种个体之间的关系也必然成为我们需要深入分析的很重要一部分。 在一项任务中,只要有关系分析的需求,知识图谱就“有可能”派的上用场。

什么是知识图谱

Google知识图谱(英语:Google Knowledge Graph,也称Google知识图)是Google的一个知识库,其使用语义检索从多种来源收集信息,以提高Google搜索的质量。
其目标是,用户将能够使用此功能提供的信息来解决他们查询的问题,而不必导航到其他网站并自己汇总信息。
据Google称,知识图谱的信息来自许多来源,包括CIA的世界概况,Freebase和维基百科[1]。其功能与Ask.com和Wolfram Alpha等问题问答系统相似。
截至2012年,其语义网络包含超过570亿个对象,超过18亿个介绍,这些不同的对象之间有链接关系,用来理解搜索关键词的含义。

知识图谱最早被应用于搜索引擎领域,旨在通过语义把碎片化的数据关联起来,让用户能直接搜索到事务(Things),而不是文本字符串(Strings)。在搜索引擎中引入知识图谱大幅的提升和优化了搜索体验。
近年来,随着人工智能的再次兴起,知识图谱又被广泛的应用于聊天机器人和问答系统中,用于辅助深度理解人类的语言和支持推理,并提升人机问答的用户体验等。典型的如IBM的Watson,苹果的Siri,Google Allo,Amazon Echo,百度度秘,公子小白等。
此外,知识图谱还被用来提升数据分析的能力和效果。例如著名的大数据公司Palantir利用知识图谱建立数据的关联以提升上游数据分析的效果。与知识图谱有关的语义技术也被用来提升机器与机器之间的语义互操作能力,解决机器之间的语义理解问题。例如,全球最大物联网标准化组织OneM2M就把语义和知识技术作为物联设备抽象和语义封装的技术基础。
在金融、农业、电商、医疗健康、环境保护等大量的垂直领域,知识图谱都得到广泛的应用。例如,很多金融领域公司也构建了金融知识库以进行碎片化金融数据的集成与管理,并辅助金融专家进行风控控制、欺诈识别等;生物医疗专家通过集成和分析大规模的生物医学知识图谱,辅助其进行药物发现、潜在靶点识别等多方面任务。

从学术的角度,我们可以对知识图谱给一个这样的定义:“知识图谱本质上是语义网络(Semantic Network)的知识库”。但这有点抽象,所以换个角度,从实际应用的角度出发其实可以简单地把知识图谱理解成多关系图(Multi-relational Graph)。
那什么叫多关系图呢? 学过数据结构的都应该知道什么是图(Graph)。图是由节点(Vertex)和边(Edge)来构成,但这些图通常只包含一种类型的节点和边。但相反,多关系图一般包含多种类型的节点和多种类型的边。比如左下图表示一个经典的图结构,右边的图则表示多关系图,因为图里包含了多种类型的节点和边。这些类型由不同的颜色来标记。
图片

在知识图谱里,我们通常用“实体(Entity)”来表达图里的节点、用“关系(Relation)”来表达图里的“边”。实体指的是现实世界中的事物比如人、地名、概念、药物、公司等,关系则用来表达不同实体之间的某种联系,比如人-“居住在”-北京、张三和李四是“朋友”、逻辑回归是深度学习的“先导知识”等等。

现实世界中的很多场景非常适合用知识图谱来表达。 比如一个社交网络图谱里,我们既可以有“人”的实体,也可以包含“公司”实体。人和人之间的关系可以是“朋友”,也可以是“同事”关系。人和公司之间的关系可以是“现任职”或者“曾任职”的关系。 类似的,一个风控知识图谱可以包含“电话”、“公司”的实体,电话和电话之间的关系可以是“通话”关系,而且每个公司它也会有固定的电话。

知识图谱来源于三个方面的技术进步。一是符号人工智能、二是万维网、三是自然语言处理。
在经典人工智能领域,以知识表示为中心的符号人工智能和以神经网络为中心的连接人工智能一直是两个主流方向。神经网络借助深度学习解决了大量感知层面的问题,如视觉、听觉等。知识图谱一定程度上代表符号人工智能的发展方向,被认为是进一步解决认知层面的问题,如语言理解、常识推理等,所不可或缺的技术手段。
在万维网领域,Web之父Tim Berners-Lee于1998年提出了语义网(Semantic Web)的概念。传统Web是通过建立网页之间的链接发展起来的。语义网的初衷也是希望能像传统Web一样,建立数据或对象的直接链接,形成一个庞大的链接数据库或知识库。这种结构化的链接数据将使得Web上的信息更加易于被机器所理解和处理,而不仅仅像网页那样只是供人浏览。谷歌知识图谱的主要数据来源Freebase就是早期的语义网项目。
在自然语言处理领域,从文本中自动或半自动抽取实体及实体之间关系的技术飞速发展,在一定程度上解决了传统知识库获取面临的可扩展性差的问题,从而提升了各种知识图谱构建的效率。
当前,知识图谱技术和方法正在进一步与深度学习等进一步融合。目前人工智能领域的一个重要研究方向就是怎样基于神经网络来处理符号和实习知识图谱的处理和常识推理。可以预见,知识图谱将在人工智能相关的各个领域得到更加广泛的应用。

知识图谱的表示

知识图谱应用的前提是已经构建好了知识图谱,也可以把它认为是一个知识库。这也是为什么它可以用来回答一些搜索相关问题的原因,比如在Google搜索引擎里输入“Who is the wife of Bill Gates?”,我们直接可以得到答案-“Melinda Gates”。这是因为我们在系统层面上已经创建好了一个包含“Bill Gates”和“Melinda Gates”的实体以及他俩之间关系的知识库。所以,当我们执行搜索的时候,就可以通过关键词提取(”Bill Gates”, “Melinda Gates”, “wife”)以及知识库上的匹配可以直接获得最终的答案。这种搜索方式跟传统的搜索引擎是不一样的,一个传统的搜索引擎它返回的是网页、而不是最终的答案,所以就多了一层用户自己筛选并过滤信息的过程。
图片

在现实世界中,实体和关系也会拥有各自的属性,比如人可以有“姓名”和“年龄”。当一个知识图谱拥有属性时,我们可以用属性图(Property Graph)来表示。下面的图表示一个简单的属性图。李明和李飞是父子关系,并且李明拥有一个138开头的电话号,这个电话号开通时间是2018年,其中2018年就可以作为关系的属性。类似的,李明本人也带有一些属性值比如年龄为25岁、职位是总经理等。
图片

这种属性图的表达很贴近现实生活中的场景,也可以很好地描述业务中所包含的逻辑。除了属性图,知识图谱也可以用RDF来表示,它是由很多的三元组(Triples)来组成。RDF在设计上的主要特点是易于发布和分享数据,但不支持实体或关系拥有属性,如果非要加上属性,则在设计上需要做一些修改。目前来看,RDF主要还是用于学术的场景,在工业界我们更多的还是采用图数据库(比如用来存储属性图)的方式。感兴趣的读者可以参考RDF的相关文献,在文本里不多做解释。

知识抽取

知识图谱的构建是后续应用的基础,而且构建的前提是需要把数据从不同的数据源中抽取出来。对于垂直领域的知识图谱来说,它们的数据源主要来自两种渠道:一种是业务本身的数据,这部分数据通常包含在公司内的数据库表并以结构化的方式存储;另一种是网络上公开、抓取的数据,这些数据通常是以网页的形式存在所以是非结构化的数据。

前者一般只需要简单预处理即可以作为后续AI系统的输入,但后者一般需要借助于自然语言处理等技术来提取出结构化信息。比如在上面的搜索例子里,Bill Gates和Malinda Gate的关系就可以从非结构化数据中提炼出来,比如维基百科等数据源。

举个比较实际的例子,比如想获取电影(电影名 上映时间 导演 角色) 演员(姓名 出生年月 性别 等) 等的数据,可以从从比较专业的电影网站爬取,比如豆瓣

知识图谱的应用案例

当下知识图谱已在工业领域得到了广泛应用,如搜索领域的Google搜索、百度搜索,社交领域的领英经济图谱,企业信息领域的天眼查企业图谱
著名的通用知识图谱中有,谷歌 Knowledge Graph 、百度知识图谱、搜狗 知立方 、YAGO、DBpedia等,它们具有规模大、领域宽,包含大量常识等特点。

国内应用案例

在国内,落地的,而且做得比较好的行业知识图谱,我觉得应该是天眼查的工商行业知识图谱,主要是公司和人的数据。
举个例子,滴滴 官方叫法是 北京小桔科技有限公司企业关系历史沿革
点击上面的企业关系和历史沿革即可查看,可以看到 人和公司的关系,而且能够根据时间查看,点击人或者公司可以跳到对应的页面。我觉得天眼查这个企业和人的知识图谱做的确实挺好的。 如果不方便查看,下面有我的截图。
备注:不是打广告,我是在使用Neo4j的时候发现有一个朋友也在使用,最后发现他们可能用Neo4j做离线存储,后来才知道是天眼查。看了一下,感觉在我所知道的国内的知识库、知识图谱里,这个是想法很好,真正落地而且应用的非常好的一个。

企业关系

阅读全文 »

重要参数SUID、SNUID、SUV

SUID

SUID具体的含义可以自行百度,这里只讲述它生成的过程。当我们访问sogou搜索首页的时候,Set-Cookie中便会生成一个SUID参数的内容,除非重启浏览器,不然短时间内SUID并不会改变。SUID的值应该是sogou服务端随便分配的,只有当重新开启一个session时它的值才会更新。

SNUID

SNUID是sogou反爬虫的重点,sogou是对同一个SNUID访问次数做了限制,而超过限制后,会跳转到验证码页面,只有输入验证码重新验证以后,SNUID才会更新,访问才能继续进行。那么SNUID是如何生成的呢?经过测试,应该是由javascript生成的,当然前提是要有SUID,SUID是生成SNUID的基础。

阅读全文 »

看到一篇新闻,MariaDB 完成 C 轮 2700 万美金融资,阿里巴巴领投,看了以后觉得MariaDB挺眼熟的,就查了一下,然后感觉这个挺有意思,试了试。
而且对于像谷歌、亚马逊、FaceBook、微软、Twitter、阿里巴巴等这种公司,我觉得他们使用的产品很有可能在将来会比较流行。

11 月 2 日,MariaDB 宣布完成由阿里巴巴领投的 C 轮 2700 万美元的融资。融资完成后,MariaDB 社区将具备更强的实力参与数据库日益激烈的竞争。
MariaDB 是一家欧洲公司,其开发维护的 MariaDB 数据库是最受欢迎的开源数据库之一。总部位于芬兰赫尔辛基,在瑞典和美国设有办事处,拥有大约 1200 万名全球数据库用户。包括 booking.com、惠普、维珍移动、维基百科等。
MariaDB 是作为 MySQL 的一个分支。MySQL 被甲骨文收购后,MySQL 之父 Monty 为保证有一个始终开源的兼容 MySQL 的分支可用,创立了 MariaDB,名称来自其女儿 Maria 的名字。目前 MariaDB 在 Gartner 统计中是发展最快的开源数据库。

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria的名字。
MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体,分支的开发者希望提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX存储引擎。

安装 MariaDB

我的MariaDB解压在 C:\ProfessionalSoftware\MariaDB\mariadb-10.2.10-winx64 目录下,想把数据放到 D:/ProfessionalSoftWare/MariaDB/data 目录下,所以需要把解压完 C:\ProfessionalSoftware\MariaDB\mariadb-10.2.10-winx64\data 目录下的所有文件复制到 D:/ProfessionalSoftWare/MariaDB/data
如果不复制,会在启动的时候报 发生系统错误 1067 的错误,原因是 Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

安装服务

C:\ProfessionalSoftware\MariaDB\mariadb-10.2.10-winx64\bin
λ mysqld.exe --install MariaDB  --defaults-file="C:\ProfessionalSoftware\MariaDB\mariadb-10.2.10-winx64\my.ini"
Service successfully installed.

移除服务

C:\ProfessionalSoftware\MariaDB\mariadb-10.2.10-winx64\bin
λ mysqld.exe --remove MariaDB
Service successfully removed.

启动MariaDB服务

C:\ProfessionalSoftware\MariaDB\mariadb-10.2.10-winx64\bin
λ net start MariaDB
MariaDB 服务正在启动 .
MariaDB 服务已经启动成功。

添加用户

C:\ProfessionSofware\Mariadb\Mariadb-10.2\bin
λ mysqladmin -u root password "root"
C:\ProfessionSofware\Mariadb\Mariadb-10.2\bin
λ mysqld --console
2017-11-05 10:10:18 11052 [Note] mysqld (mysqld 10.2.10-MariaDB) starting as process 10168 ...
2017-11-05 10:10:18 11052 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2017-11-05 10:10:18 11052 [Note] InnoDB: Uses event mutexes
2017-11-05 10:10:18 11052 [Note] InnoDB: Compressed tables use zlib 1.2.3
2017-11-05 10:10:18 11052 [Note] InnoDB: Number of pools: 1
2017-11-05 10:10:18 11052 [Note] InnoDB: Using generic crc32 instructions
2017-11-05 10:10:18 11052 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2017-11-05 10:10:18 11052 [Note] InnoDB: Completed initialization of buffer pool
2017-11-05 10:10:18 11052 [Note] InnoDB: Highest supported file format is Barracuda.
2017-11-05 10:10:18 11052 [Note] InnoDB: 128 out of 128 rollback segments are active.
2017-11-05 10:10:18 11052 [Note] InnoDB: Creating shared tablespace for temporary tables
2017-11-05 10:10:18 11052 [Note] InnoDB: Setting file '.\ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2017-11-05 10:10:18 11052 [Note] InnoDB: File '.\ibtmp1' size is now 12 MB.
2017-11-05 10:10:18 11052 [Note] InnoDB: Waiting for purge to start
2017-11-05 10:10:18 11052 [Note] InnoDB: 5.7.20 started; log sequence number 1619987
2017-11-05 10:10:18 9084 [Note] InnoDB: Loading buffer pool(s) from C:\ProfessionSofware\Mariadb\Mariadb-10.2\data\ib_buffer_pool
2017-11-05 10:10:18 9084 [Note] InnoDB: Buffer pool(s) load completed at 171104 10:10:18
2017-11-05 10:10:18 11052 [Note] Plugin 'FEEDBACK' is disabled.
2017-11-05 10:10:18 11052 [Note] Server socket created on IP: '::'.
2017-11-05 10:10:18 11052 [Note] Reading of all Master_info entries succeded
2017-11-05 10:10:18 11052 [Note] Added new Master_info '' to hash table
2017-11-05 10:10:18 11052 [Note] mysqld: ready for connections.
Version: '10.2.10-MariaDB'  socket: ''  port: 3306  mariadb.org binary distribution




2017-11-05 11:00:24 10868 [Note] mysqld (unknown): Normal shutdown

2017-11-05 11:00:24 10868 [Note] Event Scheduler: Purging the queue. 0 events
2017-11-05 11:00:24 8456 [Note] InnoDB: FTS optimize thread exiting.
2017-11-05 11:00:24 10868 [Note] InnoDB: Starting shutdown...
2017-11-05 11:00:24 9084 [Note] InnoDB: Dumping buffer pool(s) to C:\ProfessionSofware\Mariadb\Mariadb-10.2\data\ib_buffer_pool
2017-11-05 11:00:24 9084 [Note] InnoDB: Buffer pool(s) dump completed at 171104 11:00:24
2017-11-05 11:00:25 10868 [Note] InnoDB: Shutdown completed; log sequence number 1620015
2017-11-05 11:00:25 10868 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1"
2017-11-05 11:00:25 10868 [Note] mysqld: Shutdown complete
C:\ProfessionSofware\Mariadb\Mariadb-10.2\bin
λ net start mariadb
MariaDB 服务正在启动 .
MariaDB 服务已经启动成功。


C:\ProfessionSofware\Mariadb\Mariadb-10.2\bin
λ net stop mariadb
MariaDB 服务正在停止.
MariaDB 服务已成功停止。

my.ini 配置

[mysqld]
#datadir=C:/ProfessionalSoftware/MariaDB/MariaDB-10.3/data
datadir=D:/ProfessionalSoftWare/MariaDB/MariaDB-10.3/data
port=3306
#character-set-server=utf8
# utf8mb4 is a superset of utf8
character-set-server=utf8mb4

# mkdir for every database
innodb_file_per_table=1

# ignore lowercase
lower_case_table_names=1

# all import biggest 1024M file to mysql
max_allowed_packet=1024M

innodb_buffer_pool_size=1017M

#log
# Binary Log
log-bin=mysql-bin
# if query_time > 1s sql will log
long_query_time=1
# if query is slow, query will log   version 5.6
slow-query-log=1
slow-query-log-file=D:/ProfessionalSoftWare/MariaDB/MariaDB-10.3/log/slow_query.log
general_log=ON
general_log_file=D:/ProfessionalSoftWare/MariaDB/MariaDB-10.3/log/all_query.log

[client]
port=3306
plugin-dir=C:/ProfessionalSoftware/MariaDB/MariaDB-10.3/lib/plugin
#default-character-set = utf8
# utf8mb4 is a superset of utf8
default-character-set = utf8mb4

程序中使用

<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.1.2</version>
</dependency>


driverClassName = org.mariadb.jdbc.Driver
url = jdbc:mariadb://localhost:3306/DB&useSSL=true&trustServerCertificate=true
user = admin
password = admin


Connection connection = DriverManager.getConnection("jdbc:mariadb://localhost:3306/DB?user=root&password=myPassword");


final HikariDataSource ds = new HikariDataSource();
ds.setMaximumPoolSize(20);
ds.setDriverClassName("org.mariadb.jdbc.Driver");
ds.setJdbcUrl("jdbc:mariadb://localhost:3306/db");
ds.addDataSourceProperty("user", "root");
ds.addDataSourceProperty("password", "myPassword");
ds.setAutoCommit(false);


jdbc:(mysql|mariadb):[replication:|failover:|sequential:|aurora:]//<hostDescription>[,<hostDescription>...]/[database][?<key1>=<value1>[&<key2>=<value2>]] 
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.25</version>
</dependency>
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.2.3</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.mariadb.jdbc" level="trace" additivity="false">
        <appender-ref ref="STDOUT"/>
    </logger>

    <root level="error">
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>

References

[1] mariadb官网
[2] mariadb中文资料
[3] mariadb zip包安装
[4] mysql_install_dbexe
[5] mysql windows intall archive
[6] 在Windows下用 MSI 包安装 MariaDB
[7] 安装 MariaDB 并同时运行 MySQL
[8] 怎样从MySQL升级到 MariaDB?
[9] 升级mariadb
[10] java-connector-using-maven
[11] failover-and-high-availability-with-mariadb-connector-j
[12] option-batchmultisend-description
[13] 设置字符集和排序规则
[14] 一般查询日志
[15] 索引-缓存
[16] 在Windows安裝Zip (noinstall)版本的MariaDB
[17] Windows下如何安装MariaDB
[18] Windows 下 MariaDB (zip 免安装) 的手动安装与使用

hexo next 主题的配置及个性化

(1) next主题的配置

next主题目录结构

├── .github            #git信息
├── languages          #多语言
|   ├── default.yml    #默认语言
|   └── zh-Hans.yml      #简体中文
|   └── zh-tw.yml      #繁体中文
├── layout             #布局,根目录下的*.ejs文件是对主页,分页,存档等的控制
|   ├── _custom        #可以自己修改的模板,覆盖原有模板
|   |   ├── _header.swig    #头部样式
|   |   ├── _sidebar.swig   #侧边栏样式
|   ├── _macro        #可以自己修改的模板,覆盖原有模板
|   |   ├── post.swig    #文章模板
|   |   ├── reward.swig    #打赏模板
|   |   ├── sidebar.swig   #侧边栏模板
|   ├── _partial       #局部的布局
|   |   ├── head       #头部模板
|   |   ├── search     #搜索模板
|   |   ├── share      #分享模板
|   ├── _script        #局部的布局
|   ├── _third-party   #第三方模板
|   ├── _layout.swig   #主页面模板
|   ├── index.swig     #主页面模板
|   ├── page           #页面模板
|   └── tag.swig       #tag模板
├── scripts            #script源码
|   ├── tags           #tags的script源码
|   ├── marge.js       #页面模板
├── source             #源码
|   ├── css            #css源码
|   |   ├── _common    #*.styl基础css
|   |   ├── _custom    #*.styl局部css
|   |   └── _mixins    #mixins的css
|   ├── fonts          #字体
|   ├── images         #图片
|   ├── uploads        #添加的文件
|   └── js             #javascript源代码
├── _config.yml        #主题配置文件
└── README.md          #用GitHub的都知道

阅读全文 »

在软件开发中,池一直都是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能。Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生成线程池,通过 Executors 可以方便的生成不同类型的线程池。但是要更好的理解使用线程池,就需要了解线程池的配置参数意义以及线程池的具体工作机制

(1) 为什么要使用线程池

(1.1) 使用线程池的好处

引用自http://ifeve.com/java-threadpool/

  1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  3. 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
  4. 提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。

(1.2) 线程池解决了什么问题

多线程流行的原因是因为他能够处理与多进程一样的功能,并且创建线程耗费的时间、资源少,共享进程的资源。多线程有各自的线程ID,栈,PC,寄存器集合组成。共享代码段,文件,数据。
在实际使用中,每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在处理实际的用户请求的时间和资源要多得多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个JVM里创建太多的线程,可能会导致系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是“池化资源”技术产生的原因。
进程是资源管理的最小单元;而线程是程序执行的最小单元。

阅读全文 »

为什么必须使用数据库连接池:

1.普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接时都要将Connection加载到内存中,再验证用户名和密码。需要数据库连接的时候,就向数据库要求一个,执行完后就断开连接,这样的方式会消耗大量的资源和时间,数据库的连接资源并没有得到很好的重复利用。若是同时有几百人甚至几千人在线,频繁地进行数据库连接操作,这将会占用很多的系统资源,严重的甚至会造成服务器的奔溃。

2.使用DriverManager方式获取JDBC数据库连接,每一次数据库连接,操作完会后都要断开,否则,如果程序出现异常而未能关闭,将会导致数据库系统内存泄漏,最终将导致重启数据库。

3.同时,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾忌地分配出去,若果连接过多,也可能导致内存泄漏,服务器奔溃。

使用数据库连接池,可以避免以上几种问题。数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接漏洞;连接池的数据库连接数受最大连接数和最小连接数控制,因此不会出现连接过多内存泄漏的情况。

阅读全文 »

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔…

Day 1 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库。这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(1.1.1.1)这个用户,并且 useragent 还是 JavaClient1.6 ,基于这两点判断非人类后直接在Nginx 服务器上封杀。

Day 2 小莫电影只爬了一半,于是也针对性的变换了下策略:1. useragent 模仿百度(“Baiduspider…”),2. IP每爬半个小时就换一个IP代理。小黎也发现了对应的变化,于是在 Nginx 上设置了一个频率限制,每分钟超过120次请求的再屏蔽IP。 同时考虑到百度家的爬虫有可能会被误伤,想想市场部门每月几十万的投放,于是写了个脚本,通过 hostname 检查下这个 ip 是不是真的百度家的,对这些 ip 设置一个白名单。

Day 3 小莫发现了新的限制后,想着我也不急着要这些数据,留给服务器慢慢爬吧,于是修改了代码,随机1-3秒爬一次,爬10次休息10秒,每天只在8-12,18-20点爬,隔几天还休息一下。小黎看着新的日志头都大了,再设定规则不小心会误伤真实用户,于是准备换了一个思路,当3个小时的总请求超过50次的时候弹出一个验证码弹框,没有准确正确输入的话就把 IP 记录进黑名单。

阅读全文 »
0%