Leo Wang's Notepad

知识

有了uwsgi为什么还需要nginx

在python的web开发中,我用flask框架写了一个小程序,部署的时候,我用到了uwsgi来做容器。

在学习uwsgi部署的过程中,另一个关键词nginx频繁的跳出来。这两者通常是成对出现的。

你有没有和我一样的困惑,为什么有了uwsgi我们还需要nginx?

我是说,既然uwsgi能够展现你想要的内容,那nginx存在的意义在哪里?

首先,nginx是一个HTTP 服务器。如果你是学Java出身的,说到HTTP服务器你应该会想到Apache。

类似的uwsgi可以比喻为tomcat。

nginx官方网站上给出的一张图片很好的揭示了nginx的角色。

architecture-nginx

我所理解的nginx的主要功能,有以下几个部分:

  • nginx处理静态内容请求更专业、快速
  • nginx可以缓存请求。如果让uwsgi来直接接受请求的话,uwsgi需要花费大量的时间来等待request,这本身对web应用所在的主机是很大的资源浪费。
  • 分发请求。假如你有好几个web应用,分布在不同的主机上,nginx可以把请求分发到各自的web应用来进行处理。这一特点是nginx可以用来做负载均衡器。
  • 相比web容器,nginx的漏洞更少更安全
  • nginx可以更好的处理HTTPS
  • nginx有网关(gateway)的作用,可以过滤访问IP。

 …

在Python中将datetime字符串转换为utc timestamp

在python中有很多方法将datetime的字符串转换为 utc timestamp

网上找了好多,看起来都纷繁复杂。本文就想简单的做好一件事,就是将datetime的字符串转换为utc timestamp。

理解这个转换的关键,在于理解python中所有的日期字符串都被python解读为local time。

也就是说,同样是’2015/10/27 00:00:00’这个字符串,虽然身处东京的我和身在伦敦的你看到的是同一个字符串,但他们本身被python解读为两个不同地方的日期和时间。

如果想让python不去理会时差,而只想要utc格式的时间戳的话,用calendar.timegm()函数即可实现。

现举例如下:

3招做好SSRS的分页

在使用SSRS,也就是SQL Server Report Service(SQL Server 报表)的过程中,如果你在寻找下面3个问题的答案,本文可能会帮到你。

  • 针对每个数据分组重新设定页码
  • 让表头在每个页面都能显示
  • 让数据在合理的位置分页

针对每个数据分组重新设定页码

在Details上设置属性,Group里面的ResetPageNumber设置为True,即可让每一个新的分组数据重新设定页码。

group

 

让表头在每个页面都能显示

在详细模式里面找到表头的Static,然后设置KeepWithGroup属性为After,RepeatOnNewPage为True。 如果表头之前还有上一层分组的Static,上一层分组的上述两个属性要分别设为Before和True。 在同一个分组的Static的RepeatOnNewPage不能设置为不同的值,所以同样设定为了True, 但是不希望在后续页面继续显示的部分,其KeepWithGroup只要设定为Before,就不会随后续数据分页而再次出现了。repeatonnewpage

让数据在合理的位置分页

在希望保持为一个整体的Group上设置KeepTogether为True,就会尽量让同一组的数据在同一页面显示。

keeptogether

关于Java Thread的一些认识

最近为了考取Java 7的Gold资格而补课,多线程这一块看了好长一段时间才算有点头绪。

下面几点算是心得吧。明白这些东西之后,join()也差不多可以理解了。

  • 主线程和主线程生成的子线程是两个独立的东西。start()之后都是各自奔向终点。
  • 如果子线程跑得快,主线程无法对它进行interrupt()操作。
    因为人家已经结束了,你再发号施令已经晚了。
  • 被interrupt()的子线程不会就此终止,而是会恢复原来的执行。

Spring+Struts2+Hibernate 整合Extjs时无法读取json数据的问题之解决办法

在SSH和Extjs的整合过程中,需要Grid从服务器端读取json格式的数据显示在前端,在action的class中配置了service属性,并通过spring对该service进行注入。

 

Apache + Tomcat Error 10054/10060/10061/10062的解决办法之一

公司的Dev-Server用来部署测试版应用程序,需要访问DB-Server来进行数据库操作。

之前一直没有问题,自从公司搬家之后Dev-Server便开始出现问题。

Dev-Server上本来部署着4个网站,其中的两个是访问安装在Dev-Server本机上的数据库,这两个没有什么问题。

但是剩下的两个需要访问DB-Server,于是便出现了下面的问题。

凡是涉及到数据库的操作均无法进行。查看tomcat的log文件没有发现任何错误。查看apache的log文件则提示如下错误:

[Tue Nov 22 20:14:10 2011] [error] ajp_read_header: ajp_ilink_receive failed [Tue Nov 22 20:14:10 2011] [error] (120006)APR does not understand this error code:  proxy: read response failed from 127.0.0.1:8009 (localhost)

紧接着这两行错误之前的还有诸如(OS 10060)(OS 10054) (OS 10062)之类的错误。

这些错误的定义可以在MSDN的文档中查到。具体的原因有连接超时,连接被中断等等。。。…

使用Hibernate调用存储过程,及简单的实体映射

在使用Hibernate+Struts2进行项目开发的时候,有时需要对数据库中的多个表进行连接操作。

为了减少访问数据库的次数,可以将连接表的操作写入到procedure即存储过程当中。

通过procedure进行多个表的连接,然后返回查询结果。

查询结果中包含原本属于多个实体的多个属性。

于是可以构建一个实体类 MyEntity,在hibernate的MyEntity.hbm.xml中可以这样写:

在R语言中连接MySQL数据库

在R语言中,CRAN有几个包可以让R和DBMSs进行通信。

CRAN上的RMySQL包提供了和MySQL数据库系统的接口。RMySQL依赖于DBI包。

MySQL是一个轻量级的数据库系统,而RMySQL包在Linux和Windows下均可以使用。

在Windows环境下,通过菜单栏中的“程序包”-》“安装程序包”来找到DBI和RMySQL包,下载安装。

代码如下:

训练数据集与测试数据集(Training Data Set & Test Data Set)

训练集(Training Set) 和 测试集(Test Set) 被广泛应用在人工智能、机器学习、遗传编程、智能系统、统计学等领域中。

训练集用来构建或者发现潜在的预测关系。

通过训练集来构建的数据关系,都存在某种程度的过适(过拟合,over-fit)问题。也就是说,训练集训练出来的模型只能体现训练集中数据之间显然的关系,却未必能代表所有的数据。

测试集则是独立于训练集的一组数据,但它服从和训练集同样的概率分布。

如果一个模型既能能很好的拟合训练集也能很好的拟合测试集,则过拟合现象就不明显。

如果模型只能拟合训练集而不能很好的拟合测试集,则过拟合现象就发生了。

简言之,训练集用来训练一个模型,测试集用来测试该模型是否恰当。

如图所示,左图的蓝点表示训练集中的数据,而绿色和橘色的曲线则是对测试集的拟合。

Trainig set and test set

Trainig set and test set

右图的蓝点表示测试集中的数据。训练集中橘色曲线拟合的MSE为4,绿色曲线为9。

同样的曲线,在测试集当中,橘色曲线的MSE为15,绿色曲线为13。…