跨浏览器调用总结
在行业软件的环境中,客户方通常拥有很多套B/S软件系统,可能各自对浏览器有着特殊的要求,比如必须用chrome访问,必须用IE访问等。当去做一个集成类的B/S系统时,就出现了需要唤起特定的浏览器去打开特定的url的场景,笔者根据自己的经验对可以采取的方案进行了总结。
方案一、使用插件及引擎
IE->Chrome
通过安装google-chrome-frame框架,然后使用gcf://协议去指定IE调用google-chrome-frame去渲染。但需要注意的是,谷歌浏览器内嵌框架从2014年2月25日起已经停止维护更新。
Chrome->IE
通过安装Chrome扩展组件,如IETab,Open IE等,然后在js中调用。由于行软环境通常无法访问外网,而且谷歌应用商店在墙外,所以开发者需要直接提供.extension文件供客户安装。有一定的实施难度。
方案二、通过ActiveX控件
IE->Chrome
通过js的ActiveXObject对象来调用Chrome。需要注意的是这种方法需要修改浏览器的安全级别允 ...
设计模式演绎-单例模式
定义
Ensure a class has only one instance, and provide a global point of access to it.
确保某一个类只有一个实例,而且自行实例化并向整个系统提供整个实例。
通用类图
单例模式类的构造方法是一个私有构造方法
单例模式类的属性包含自身,并限制为private static final类型,默认调用自身的构造函数
单例模式类提供static的getSingleton()方法供外部引用
通用代码public class Singleton(){ private static final Singleton singleton = new Singleton(); //私有静态属性 private Singleton(){} //私有构造方法 public static Singleton getSingleton(){} //引用者必须通过该方法获得实例对象 public static void doSomething(){} ...
读《简约之美 软件设计之道》
书籍信息
中文书名: 简约之美:软件设计之道英文书名: Code Simplicity: The Science of Software Design作者: [美]Max Kanat-Alexander译者: 余晟
阅读感悟
软件是必然要变化的,变化是常态;有变化就需要维护,随着时间的推移,维护成本会远远超过初期开发的成本,占据成本的大头;因此,在软件开发中,最重要的是要降低维护成本;维护成本正比于系统的复杂程度,所以要降低维护成本,系统的设计就应当追求简单清晰。维护成本应包含实施成本
好程序员与差程序员的区别在于理解能力,差程序员不理解自己做的事情,优秀的程序员则相反。信不信由你,道理就是这么简单。
在设计决策中,实现成本通常并不是重要的因素,所以基本可以忽略。相比降低实现成本,降低维护成本更重要。
软件设计的三大误区
编写不必要的代码。总以为将来会用到,实际上只会带来困惑与BUG。
代码难以修改。首要追求简洁,不能简洁则保证一致。
过分追求通用。通用则带来复杂。
避免重复。理想情况下,任何系统里的任何信息,应当只存在一次。
需要避免的八件事
扩展软件的用途。软件应明确 ...
开启GZIP为网站加速
首先推荐百度统计-优化分析-网站速度诊断,这个用来分析站点的速度问题还蛮好的。chrome浏览器的插件yslow也是一个很好的诊断工具。启用新站点后,始终感觉速度不如意,于是在百度上一诊断,得分86分,建议我启用gzip。于是开始折腾,配置gzip,我使用的http服务器是nginx。具体步骤如下。
开启Gzip开启全局如果想开启全局可以在nginx.conf上配置。配置方式与在二级站点上的配置是一样的。我本人此次只想在二级站点上开启。所以这里就不操作了。
/etc/nginx/nginx.conf
开启二级站点cd /etc/nginx/conf.d # 转到站点的配置文件目录vim blog.conf # 修改对应的站点配置文件
在server{}里配置以下项目
gzip on; // 开启 gzipgzip_disable "msie6"; //禁用 ie6 的 gzip 选项,由于 ie6 的性能差,启用 gzip 容易导致页面假死gzip_vary on; //http 头部,意在对于不支持 gzip 压缩的浏览器不进行压缩.gzip_co ...
Spring Boot RESTful 在线API文档
使用Spring Boot 去开发一个RESTful API是一件简单的事情,而且Spring Boot结合Swagger后,使用注解就能简单的实现在线API文档,这样能实现修改代码和修改文档二合一,降低开发人员造成文档和接口的不一致的几率。以下为具体实现。
引入swagger的相关依赖<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> ...
网站迁移结束
花了2天事件,搭建了hexo静态网站,然后把原本在wordpress里写的文章有选择的迁移到了hexo,po完这一篇就正式关闭我的wordpress服务,将www入口指向hexo。
原本使用wordpress的框架去写博客,需要打开网站后台去编辑文章,是一件很刻意的事。而我其实平时喜欢在个人电脑上用typora记录一些事情。为了将一些内容post到网上,还需要刻意去粘一遍到wordpress里去,这很不酷。wordpress也提供了桌面程序,但写完的东西直接就post上去了,我本地又没有留存。而且在服务端存在mysql里,我如果想查看,必须打开网站,如果哪一天我的服务器被黑了,是一件很麻烦的事。所以一直希望有一个解决的办法,直接写完就能提交到网站里,而且是文本样式保存的,而且是Markdown的。刚好就是hexo。
这次翻翻拣拣,不知不觉自己也写了这么多东西,虽然大部分都是学习笔记。但也成就满满。
继续加油吧!
CentOS下用pyenv 和 virtualenv 搭建单机多版本python 虚拟开发环境
安装系统环境:CentOS 6.5
安装依赖yum -y install gcc gcc-c++ make git patch openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel bzip2-libs
安装pyenvcurl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
配置环境变量官方提供方法:
echo -e '\n#pyenv' >>~/.bashrcecho 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrcecho 'eval "$(pyenv init -)"' >> ~/.bashrcecho 'eval "$(pyenv virtualenv-init -)" ...
CentOS 升级 Git 最新版
由于CentOS用yum安装的版本只有1.x,故需要手动编译安装。
首先,下载git安装包。
从github上下载一个最新版(撰写文章时的最新版为:2.5.0)。
cd /usr/local/srcwget https://github.com/git/git/archive/master.zipunzip master.zip
由于系统中已存在git,所以先备份现有git。
mv /usr/bin/git{,.bak}
编译安装
cd /usr/local/src/git-master make configure ./configure --prefix=/usr/local/ --with-curl --with-expat make make install
拷贝到原有Git所在位置
cp /usr/local/src/git-master/git /usr/bin
在编译过程中可能会遇到错误,主要原因是minimal版的centos没有相应的工具,可以手动安装一下。
yum -y install gcc automake aut ...
Mysql Access denied for user
# /etc/init.d/mysql stop# mysqld_safe –user=mysql –skip-grant-tables –skip-networking &# mysql -u root mysqlmysql> UPDATE user SET Password=PASSWORD(‘newpassword’) where USER=’root’;mysql> FLUSH PRIVILEGES;mysql> quit
# /etc/init.d/mysql restart# mysql -uroot -pEnter password: <输入新设的密码newpassword>
Python特殊语法:filter、map、reduce、lambda
Python内置了一些非常有趣但非常有用的函数,充分体现了Python的语言魅力!
filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回:
map(function, sequence) :对sequence中的item依次执行function(item),见执行结果组成一个List返回:
reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和:
>> def add(x,y): return x + y>> reduce(add, range(1, 11))55 (注:1+2+3+4+5+6+7+8+9+10)>> reduce(add, range(1, 11), 20)7 ...