技术选型最怕的是什么?

大多数技术都存在选型问题,因为技术的发展已经让一件事情可以有多种解决方案,选型问题就自然出现。前段时间也有人说过语言选型,这里举的例子是在组件、框架、服务的范畴。其中有相通之处,各位可以自行领会。

选型最怕什么

怕失败么?那肯定的。你的服务崩溃,用户愤而投诉,客户电话打到老板那里,明天你要洗干净到办公室去一趟(笑…)。而所有对失败的无法容忍,最终都会变成一句话,为什么你要选这个型?

你总要回答这个问题,所以选型一怕随意,公鸡头母鸡头,选上哪头是哪头;二怕凭感觉,某某已经在用听起来还不错。你需要真正的思考,而且尽可能的全面。我下文会详细讲解,但这还不是最怕的。

最怕的是什么?看看本文开头引用的那句话,你体会一下。

嗯,最怕的是喷子。怕任意总结,如果再加上一些诋毁,一次选型失败足以让人心碎一万次。

失败不可怕,可怕的是没有总结,因为没有总结就没有提高。而比没有总结更可怕的是乱总结。
继续阅读“技术选型最怕的是什么?”

[转]关于MVC和MVVM的重新思考

被误解的 MVC

MVC 的历史

MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写。它表示的是一种常见的客户端软件开发框架。
MVC 的概念最早出现在二十世纪八十年代的 施乐帕克 实验室中(对,就是那个发明图形用户界面和鼠标的实验室),当时施乐帕克为 Smalltalk 发明了这种软件设计模式。

现在,MVC 已经成为主流的客户端编程框架,在 iOS 开发中,系统为我们实现好了公共的视图类:UIView,和控制器类:UIViewController。大多数时候,我们都需要继承这些类来实现我们的程序逻辑,因此,我们几乎逃避不开 MVC 这种设计模式。

但是,几十年过去了,我们对于 MVC 这种设计模式真的用得好吗?其实不是的,MVC 这种分层方式虽然清楚,但是如果使用不当,很可能让大量代码都集中在 Controller 之中,让 MVC 模式变成了 Massive View Controller 模式。
继续阅读“[转]关于MVC和MVVM的重新思考”

[转]Bootstrap自适应导航栏

导航栏在移动设备的视图中是折叠的,随着可用视口宽度的增加,导航栏也会水平展开。在 Bootstrap 导航栏的核心中,导航栏包括了站点名称和基本的导航定义样式。

默认的导航栏

  1. 向 <nav> 标签添加 class .navbar、.navbar-default。
  2. 向上面的元素添加 role=”navigation”,有助于增加可访问性。
  3. 向 <div> 元素添加一个标题 class .navbar-header,内部包含了带有 class navbar-brand 的 <a> 元素。这会让文本看起来更大一号。
  4. 为了向导航栏添加链接,只需要简单地添加带有 class .nav、.navbar-nav 的无序列表即可。 

继续阅读“[转]Bootstrap自适应导航栏”

python装饰器

python装饰器学习笔记

有一个函数say

def say():
   return "Hello"

现在需要得到下面的结果

'<b>Hello</b>'

一般可能会这样做

def makebold(string):
   return "<b>"+string+"</b>"
print makebold(say())

这样的嵌套用多了会让代码看起来很杂乱,并且在某些特别的情况下,如django的view中,我不能把view放到一个函数里来执行,这样的就可以使用装饰器来实现这个结果。
继续阅读“python装饰器”

Django操作model更新时DateTimeField naive datetime错误问题

用Django做东西的时候,更新时间数据时报了错误,错误如下

RuntimeWarning: DateTimeField Customer.updated received a naive datetime (2016-06-19 07:18:21.118000) while time zone support is active

这是一个跟时区有关的问题,错误里说到datetime字段得到一个naive datetime,而不是支持time zone的active datetime
由于USE_TZ设置为True,Django会自动根据所设的时区对时间进行转换
继续阅读“Django操作model更新时DateTimeField naive datetime错误问题”

用PDFBox从PDF中提取图片

从PDF文件中提取图片,这个也用到了PDFBox。
将图片提取出来,PDF每一页中有多个图片时也可以提取出每个图片。

提取后发现有部分有带透明的图片提取后会有两个图片,一个有透明,一个背景为黑色,这个黑色背景的图片并不需要,要把它删掉。

于是将提取的图片分为两组,一组有透明的,一组没透明的。
再将透明的图片加上黑色背景,后与没透明的那组图片进行比较,相同的即是多余出来带黑色背景的图片,把它删掉,剩下的就是提取所要的图片了。
继续阅读“用PDFBox从PDF中提取图片”

PHP在FastCGI模式下htaccess文件设置php_value等配置无效

最近在部署一个网站时出了一个问题。
在本地运行没有问题的代码,上传到服务器后,打开直接就500了。

经过查找了解到服务器环境配置与本地的不同,本地php采用handle模式,而服务器采用fastcgi模式。
一般情况下应该是没有问题的,但这个网站用了htaccess文件进行php参数设置
继续阅读“PHP在FastCGI模式下htaccess文件设置php_value等配置无效”

iText生成PDF在PdfTemplate中设置文字加粗,斜体

iText 生成PDF在PdfTemplate中设置文字加粗,斜体

由于PdfTemplate继承于PdfContentByte类,可以使用PdfContentByte方法来进行操作

Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(filepath));
doc.open();
PdfContentByte cb = writer.getDirectContent();

创建template并加到PdfContentByte里,template的状态位置是采用matrix方式来设置

PdfTemplate template = cb.createTemplate(width, height);
cb.addTemplate(template, 1f, 0f, 0f, 1f, 0f, 0f);

继续阅读“iText生成PDF在PdfTemplate中设置文字加粗,斜体”

Git推送文件自动部署到服务器上

git使用的用户和用户组是:git:git
需要给git增加使用root权限且不用密码

编辑 /etc/sudoers
注释掉

#Defaults requiretty

在最后增加

git ALL=(ALL) NOPASSWD: ALL

因为网站是在www用户组下运行,需要git能操作www的文件
把git加入了www用户组中

usermod -a -G www git

继续阅读“Git推送文件自动部署到服务器上”