使用Python调用动态库

我个人在日常使用电脑时,经常需要使用Google,于是就要切换代理,基本上是一会儿切换为代理,一会儿切换成直连,老是打开internet 选项去设置,很不方便,于是我萌生了一个想法:

做一个开关,我想用代理的时候,就点一下打开。不想用时,就再点一下关闭。

简单的说,就是自动更改IE的代理设置。

实际上这个功能可以使用纯python实现,其核心的原理就是使用 Windows API InternetSetOption。但是python去调用这个api相当复杂,不过人家已经实现过了,参见stackoverflow的问题
继续阅读使用Python调用动态库

远程连接到Heroku的Postgres数据库

我在我自己的电脑上弄死都连接不上heroku的数据库,然后发现原来远程连接是需要SSL的,通过进一步的搜索,最后得出了结论:需要使用ssl和设置sslfactory。
我个人一直在使用Jetbrains DataGrip,要连接到heroku postgres,打开DataGrip,输入用户名、密码、主机地址和数据库名。
然后切换到advance的tab去,将ssl设置为true,讲sslfactory设置为org.postgresql.ssl.NonValidatingFactory
继续阅读远程连接到Heroku的Postgres数据库

使用 SignalR与SSE(Sever sent event)向客户端推送提示信息

最近有个项目想把c/s的代码转成mvc的,这听起来并不困难。
如果UI和业务逻辑良好分离了的话,不会花太多的功夫,应该多数的内容都能重复利用。

但在实际的操作过程中,发现业务逻辑代码和UI提示全是混在一起的,尤其里面有这样的代码很多:

public class MyLogic
{
    public int DoPress(string bin)
    {
        if (string.IsNullOrEmpty(bin))
        {
            System.Windows.Forms.MessageBox.Show("数据为空,请登录后使用");
            return -1;
        }

        return 0;
    }
}

继续阅读使用 SignalR与SSE(Sever sent event)向客户端推送提示信息

在IDEA下使用Spring Boot的热加载(Hotswap)

你是否遇到过这样的困扰:

当你写完一段代码后,要看到效果,必须点击IDEA的停止按钮,然后再次重启启动项目,你是否觉得这样很烦呢?

如果你觉得很烦,本文就是用来解决你的问题的。

所谓热加载,就是让我们在写完一段代码后,不必重启容器,刷新浏览器就能快速看到结果。

在IDEA中需要三个步骤来达到效果:
继续阅读在IDEA下使用Spring Boot的热加载(Hotswap)

使用Spring boot + jQuery上传文件(kotlin)

文件上传也是常见的功能,趁着周末,用Spring boot来实现一遍。

前端部分

前端使用jQuery,这部分并不复杂,jQuery可以读取表单内的文件,这里可以通过formdata对象来组装键值对,formdata这种方式发送表单数据更为灵活。你可以使用它来组织任意的内容,比如使用

formData.append("test1","hello world");

继续阅读使用Spring boot + jQuery上传文件(kotlin)

使用intelliJ创建 spring boot + gradle + mybatis站点

Spring boot作为快速入门是不错的选择,现在似乎没有看到大家写过spring boot + gradle + mybatis在intellij下的入门文章,碰巧被做.Net的同学问到,我想我也可以写这样一篇。
入门Java的人最大的问题是步骤繁琐,不知道如何开始,之前我也建议过我的一个小弟用BlueJ去学Java,可是这个东西学得他很迷茫,根本无法获得成就感,不知道能搞出什么有意思的东西,那我们就来点正式的吧,看看怎么从零开始建一个你自己的Java网站。

软件安装

作为入门版,当然我们要从软件安装开始咯。
要安装的软件有
– JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html
– IntelliJ IDEA:https://www.jetbrains.com/idea/
– Gradle:https://gradle.org/install/
– Tomcat: 可选,这部分网上到处都是文章,就不重复。
继续阅读使用intelliJ创建 spring boot + gradle + mybatis站点

架构漫谈系列(3)其他原则

在最开始,先重复一下第一篇的内容,这个系列是写我们如何来组织代码,如何提高可扩展性和维护性的,并不涉及到网络拓补结构或各类中间件的使用。

首先,提一提面向对象设计的五大原则:SOLID。

SOLID原则

SOLID都是些什么呢?
– SRP, Single responsibility principle,单一职责。一个类只能有一个职责,如果这个类需要被修改,那只能是某一个需求更改导致的(仅此一个,没有更多的)。例如,book类里面有一个print的函数,当我们修改book类的书名时,我们需要改book类,当我们把book的打印从打印到A4改成打印成6寸时,也需要修改此类,这就违背了SRP原则。
– OCP, Open/closed principle,开闭原则,Open for extension, but closed for modification
– LSP, Liskov substitution principle,父类能够被子类无忧的替代,不必担心产生副作用。
– ISP, Interface segregation principle,如果一个接口能够被拆分成多个接口,那就不该用这个通用的接口来呈现。
– DIP, Dependency Inversion principle,依赖于抽象,而不依赖与具体的实现。
继续阅读架构漫谈系列(3)其他原则

架构漫谈系列(2) 封装(Encapsulation)

这是这个系列的第二篇。在第二篇里,我决定讲一讲封装。
程序的不同部分应该用封装去互相隔离,模块之间应该不应该产生很随意的关联。

可能有的人觉得不解,又或觉得是有道理的废话,不急,先一步一步来。

我们先来看看面向对象的三个基本特征是什么?
– 继承
– 多态
– 封装

如果你是科班毕业,这6个字应该是你第一次学到类(class)的时候就听老师说了。 继续阅读架构漫谈系列(2) 封装(Encapsulation)

架构漫谈系列(1) 关注点分离

很想写相关的内容,一直以来这方面的东西很杂,自己各方面都多多少少有些总结,但是没有系统的成文,始终觉得是个遗憾。
这是这个系列的第一篇。
本文说的架构,还并不是说的Tier层的架构,这里面不会涉及到分布式、缓存、网络结构等等的布局,而是集中在软件的内部,是代码层级的,考虑这点架构的点,目的是在于帮助我们写出清晰、易维护的软件。

关注点分离(Separation of concerns, SoC)

这个准则应该作为我们开发和架构的指导性的原则。在该原则下,软件应该按照其业务来将软件本身划分成不同的部分,从而进一步降低耦合性,不过,这感觉是句废话,大家好像都懂。
继续阅读架构漫谈系列(1) 关注点分离

Caching漫谈–关于Cache的几个理论

如今缓存是随处可见了,如果你的程序还没有使用到缓存,那可能是你的程序并发量很低,或对实时性要求很低。我们公司的ERP在显示某些报表时,每次打开都需要花上几分钟的时间,假如搜索引擎也是这么慢,我想这家搜索引擎早就被淘汰了。
这些ERP报表是否该引入缓存加速一下呢……
使用缓存,就是在取出数据结果后,暂时将数据存储在某些可以快速存取的位置(例如各种NoSQL如Redis,HBase,又或MemoryCache等等),于是就可以让这些耗时的数据结果多次重复的利用,不必每次重复请求相同的数据,节省CPU和I/O,加速程序的响应。
使用缓存能让加载数据的延迟降低,I/O操作减少,从而性能得到提高。
缓存使用起来很容易,但是保持缓存的一致性却困难得多。有一些前人总结的经验和方法,我们可以借鉴一下。
缓存重点在于写入的时候,相关数据的更新问题,如果数据一直没有更新或删除操作,那缓存就不会存在脏数据一说了。
关于缓存写入,至少有4种写入的策略。

write-through

这个动作发生在Cache层。是指在写数据时,同时写入到缓存和DB中,这个写入操作认为是一个单一的事务,也就是说,在更新Cache时,我们先更新了Cache中的数据,然后接着更新Db中的数据。在DB的数据完成更新前,程序还不会返回,一直等到数据库存储的结果。可想而知,这种做法不会给写入数据带来更高的性能。
继续阅读Caching漫谈–关于Cache的几个理论

PyQt5环境搭建及cx_freeze打包exe

Python的图形库也有好几个,Qt文档和使用面还是要广一些。
打包成可执行文件的也有好几个,PyInstaller用的比较多,但是PyInstaller目前还不支持Python3.6(开发版支持3.6,但是我测试我的项目,打包出来的exe执行结果有问题)。
于是就选择了PyQt+cx_freeze。
安装PyQt5和cx_freeze用pip命令即可安装,非常方便。

pip install PyQt5
pip install cx_freeze

安装完毕后,测试一下:
继续阅读PyQt5环境搭建及cx_freeze打包exe

Python爬虫-爬小说

用途

用来爬小说网站的小说默认是这本御天邪神,虽然我并没有看小说,但是丝毫不妨碍我用爬虫来爬小说啊。
如果下载不到txt,那不如自己把txt爬下来好了。

功能

  • 将小说取回,去除HTML标签
  • 记录已爬过/未爬过的章节
  • 从最后爬过那一页开始继续爬,不会重复爬取爬过的目录
    因为爬过的章节是要有顺序的,目前版本还没有支持多线程。(线程混乱分不清章节先后)
    继续阅读Python爬虫-爬小说

nginx+tomcat 502 bad gateway

nginx能收到80请求,但是无法转到tomcat:8080.
直接访问http://x.x.x.x:8080/project 可以访问
查看/var/log/nginx/error.log发现:

2017/05/25 15:29:03 [crit] 5543#5543: *1 connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream, client: 192.168.61.16, server: , request: “GET /java/ HTTP/1.1”, upstream: “http://127.0.0.1:8080/java/”, host: “192.168.61.134”

原来一条命令可以解决:

/usr/sbin/setsebool -P httpd_can_network_connect true