庇护祝福的分享

Be worthy

免费的Bootstrap DashBoard主题

DashBoard的形式是一个不错的选择,不过构建DashBoard是一个相当复杂的工程,需要合理的响应式设计和美观的图表样式,因此我找了几款不错的DashBoard主题以供参考:

AlmsaeedStudio

预览 & 源代码

Devoops

预览 & 源代码

Bootply

预览 & 源代码

prepbootstrap

预览 & 源代码

SB Admin

预览 & 源代码

Bootstrap-Admin-Theme

预览 & 源代码

相关博客

free-bootstrap-admin-themes
Top-30-Best-Quality-Bootstrap-Admin-Dashboard-Themes
some-bootstrap-admin-themes

付费主题

DashBoard & admin

懒人菜谱

一个人漂泊在外,在买菜、做饭、刷碗方面总是很懒的,对成本也比较敏感,总结一下个人的常用食谱。

炸酱面

配料:

  • 大酱和甜面酱2:1加水混合。
  • 鸡蛋或肉末。
  • 花椒、葱、食用油。

做法:

  • 热油下锅,小火放花椒、葱末熬出香味。
  • 下打好的鸡蛋/肉末。
  • 下混合好的酱,熬至冒泡起锅。

成本:

鸡蛋*4 = 2.5元,
3包酱 = 4.5元,
调料、油等 = 1元
合计:8元
制作一次可以吃7、8碗,一顿饭面+酱的成本约2元

优劣:
制作简单、成本低廉、味道可以自由调控,但是营养不足,蔬菜和肉类的摄入都很少。

意大利面

全部外购,自己的工序就是把面煮熟,然后拌上酱。
配料:

  • 9元/斤的意面
  • 19元的Huns意面酱

成本:

一斤面吃2.5顿
一罐酱8顿的样子
平均一顿饭约6元

优劣:
非常省事,不需要任何处理工作,意面不会粘锅,好洗;而且据说意面减肥。但是营养不足,蔬菜和肉类的摄入都很少。

米酒年糕

主要偶尔甜食换换口味,做起来也简单。
配料:

  • 年糕
  • 鸡蛋
  • 糖、米酒

成本:

年糕5元
鸡蛋1元
米酒2元
总计约8元

火锅

一般我购买的原料有豆腐、青菜、粉条、平菇、肉片等
成本:

最高:
  肉类7元
  豆腐1元
  青菜2元
  底料+蘸料3元
  米饭1元
  合计约14元
最低:
  豆腐1元
  蘑菇2元
  底料1元
  米饭1元
  合计约5元

根据购买的菜品5~15元不等
优劣:
营养较为丰富、味道好、不过需要买菜、洗菜、吃完后的锅、碗比较油,不好洗。

蒸蛋

直接在煮米饭的时候放上蒸笼蒸即可。成本就是鸡蛋+米饭约3元,十分低廉。

2014年3月总结

JavaScript中的promise模式

Promise模式简单来说就是函数返回一个promise对象,这个promise对象可能有三种状态:未完成、 已完成、 已拒绝。 对于传统的回调函数写法来说:

funcion test(){
  do_something();
  do_something();
  getData(data, function(err, data){
    if (err){ 
      error_handle(); 
    }
    else{
      success_handle();
    }
  })
}

错误处理和成功处理都是在回调中进行,在逻辑复杂的情况下极易形成回调嵌套。而对于promise模式来说则是这样(这里以promise库Q为例):

var Q = require('q');
function test(){
  var deferred = Q.defer();
  do_something();
  getData(data, function(err, data){
    if(err){
      deferred.reject();
    }
    else{
      deferred.resolve()
    }
  })
  return deferred.promise
}
test.then(success_handle, error_handle)

CORS问题

CORS全称Cross-Origin resource sharing, 即:跨域资源共享 对于简单请求, 在服务端设置如下响应头:

Access-Control-Allow-Origin: *

这样就可以完成简单的跨域请求
如果浏览器请求不被认为是一个simple header,比如你要自定义一个头信息, 这个请求会被认为是一个preflight request. 这时发送请求时header中会带有如下的信息:

Request Method:OPTIONS
Access-Control-Request-Headers:accept, params-token, content-type
Access-Control-Request-Method:POST

服务器需要设置返回头:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header

服务器会根据request提交的header进行检查,如果检查没通过,就抛出错误,检查通过,则会将结果进行缓存,并会在responds的header中附带上这些信息,告诉浏览器可以进行通信。然后浏览器再发送真正的http请求。
也就是说,服务器和浏览器的第一次通信会出现两次http请求。第一次用于双方的确认,确认通过后,结果会被缓存,在缓存过期前就无需重复确认了。

参考文章:
Preflighted Requests
用Go实现CORS跨域资源共享的服务器支持

nginx代理的问题

在部署时发现的问题:req.headers.host得到的并不是域名,而是127.0.0.1:3000, 经过查阅发现是Nginx配置的问题,需要配置如下两行:

proxy_set_header Host $http_host;
proxy_set_header X-Forward-For $remote_addr;

proxy_set_header 用于覆盖或新增request的header,如果不配置上面两行,那么后台程序会认为通信来自:

nginx <=> server

那么得到的客户端ip就是nginx的ip,得到的host是后台服务的host。如果后台服务配置了访问限制,那么显然会把nginx给限制掉,配置了这两行后,后台才能得到正确的信息:

client <=> nginx

这里的$http_host$remote_addr都是nginx的导出变量,可以在配置文件中直接使用。如果Host请求头部没有出现在请求头中,则$http_host值为空,但是$host值为主域名。因此,一般而言,会用$host代替$http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。

工具总结

"restify": "~2.6.1",
"request": ">=2.0.0",
"mongoose": "~3.8.7",
"redis": "x",
"async": "~0.2.10",
"q": "~1.0.0",
"log4js": "~0.6.10",
"moment": "x",
"connect": "x",
"lodash": "~2.4.1",
"winston": "~0.7.2",
"winston-mongodb": "~0.4.3",
"sanitize-html": "x"

Node学习笔记二

npm包简介

Node可以以包的形式封装插件,不同于Ruby的gem包,Node的包默认并不是全局安装的,而是安装在项目目录中的node_modules目录下。只作用于项目目录。
如果需要全局安装,比如一些带有命令行工具的npm包,在安装时需要加上-g命令,例如:

$ npm install -g supervisor

使用全局模式安装时,npm 会将包安装到系统目录,譬如 /usr/local/lib/node_modules/,同时 package.json 文件中 bin 字段包含的文件会被链接到 /usr/local/bin/

需要注意的是使用全局模式安装的包并不能直接在 JavaScript 文件中用 require 获得,因为 require 不会搜索 /usr/local/lib/node_modules/。如果想要require全局包,可以使用

$ npm link package

这个命令会在项目内的node_modules创建一个指向全局包的符号链接。通过这种方法,我们就可以把全局包当本地包来使用了。

制作npm包

一个基本的npm包需要包含一个package.json文件,一个lib文件夹,在lib文件夹内编写主要的逻辑,package.json文件则包含了该npm包的一些信息。 package.json需要包含一个名为main的key,

 {
  "main": "./lib/test.js",
 }  

完整的npm包往往还需要一些其他的功能,例如测试,文档等

  • package.json 必须在包的顶层目录下;
  • 二进制文件应该在 bin 目录下; * JavaScript代码应该在 lib 目录下; * 文档应该在 doc 目录下; * 单元测试应该在 test 目录下。 包的功能完成后,使用 $ npm init 这时会让你填写package的value,依次填写即可,完成后就可以发布了。

发布npm包

如果要发布npm包,需要注册一个账号,首先需要执行

$ npm config set email

然后执行

$ npm adduser

之后就可以跟据提示输入用户名,密码,邮箱。完成后输入npm whoami可以查询是否注册成功。 注册完成后,在项目目录输入

$ npm publish

稍后片刻就完成项目的发布了。

阅读类应用服务端通信分析

公开阅读类

知乎日报

服务器:zhihu_nginx
传输协议:http
数据传输格式:Json
数据安全:无
登录方式:微博登录,oauth2

今日头条

服务器:nginx/1.2.1,Content-Encoding:gzip
传输协议:http
数据传输格式:Json
数据安全:无

网易新闻

服务器:nginx Content-Encoding:gzip
传输协议:http, 只在登录和分享时通过https
数据传输格式:Json
登录方式:网易自身的登录系统

社交阅读类

知乎

服务器:zhihu_nginx
传输协议:https&http,主要信息通过https,图片等静态内容通过http
数据传输格式:Json
数据安全:即使用户不登陆,也需要一个Authorization:oauth a09343e8e67e44b29e0d850c14c7bf进行验证才能访问接口,登陆后只是验证变成了Authorization: Bearer f15bd82a1fe845ce971ddc78e5090943。
登录方式:支持自身的登录系统和新浪微博登录

新浪微博

服务器:nginx/1.2.0,Content-Encoding:gzip
传输协议:https
数据传输格式:XML&Json,主要内容采用XML格式,部分采用Json格式
数据安全:主要内容公开api,个人好友列表、私信等个人内容通过将用户token加入参数中保证一定的安全性。
登录:oauth登录,原先采用的oauth1,目前从参数上看,oauth1和oauth2是同时存在的。

大众点评

服务器:nginx
传输协议:http, 只在登录和分享时通过https
数据传输格式:二进制
数据安全:多数api在权限上是公开的,但由于数据传输采用二进制,不知道其编码解码规则的话一般很难获取数据,点评数据等涉及用户的数据也通过header中的token进行验证。 登录方式:自身的登录系统,第三方登录包括:微博,微信,开心,人人,QQ

总结

服务器

从http请求返回头来看,直面客户的服务器都采用了nginx,至于是做web server还是反向代理就不知道了。新浪微博,网易新闻,今日头条都开启了Gzip压缩。

传输协议

公开阅读类应用由于其数据本无需保密,使用http协议就可以了。社交阅读类采用https进行传输加密。

数据安全

公开阅读类的数据接口没有什么安全措施,社交阅读类测试的几个都是通过Authorization token进行验证,其中知乎和点评是通过在header中加入token,而微博则是将token放在参数中。点评采用了二进制的传输格式增加了额外的安全性。

传输格式

数据传输格式方面,Json的使用最为广泛。
xml由于其传输体积大,解析慢,不适合作为C/S间的数据传输。
二进制传输体积最小,性能最佳,但是需要开发上做更多的工作,而且需要考虑开源的二进制传输协议的语言支持问题,比如api同时为手机客户端和网页提供api的时候,网页端是难以处理二进制数据的。
Json格式目前来看性能足够,开发效率和兼容性则更好,可以为所有平台提供api,综合来说是较为合适的选择。

Node学习笔记一

使用 supervisor

Node.js 只有在第一次引用到某部份时才会去解析脚 本文件,以后都会直接访问内存,避免重复载入,但是在开发调试时很不方便,可以使用小工具 supervisor 在文件发生变化时自动重新加载。

$ npm install -g supervisor

安装完成后使用命令

supervisor app.js

这样就可以了,由于该命令比较长,建议设置一个alias,例如我设置的是cnode,使用时直接使用cnode app.js就可以了

模块

模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块
应用模块使用两个关键字:requireexports。如下例:在app.js中引入并使用content.js。

app.js

content = require('./content')
console.log(content.text);
content.log();

content.js

exports.text = "Hello World!";
exports.log = function(){
  console.log("Success!");
} 

最后执行node app.js的结果是

Hello World!
Success!

为Homebrew安装的程序添加模块

在MAC OS平台上,我们常常使用Homebrew安装程序,但是如果安装成功后需要添加模块,很多同学就不知道怎么处理了。最后往往是采用源码包编译的方式绕过这个问题。

我在安装nginx的时候就遇到了这个问题,分享一下解决的方案: 首先使用brew uninstall nginx卸载原来的程序。

Homebrew安装程序是根据一个Ruby文件来定义软件包安装配置(英文叫做formula,处方,方案的意思)。 使用brew edit nginx 命令可以打开这个文件,里面有一个名为args的数组,只需要把"--with-your_module"添加到这个数组中就可以了。

最后重新用brew install nginx进行安装,安装后由于原先位于/usr/local/bin目录中的软链接没有删除,会报一个错误,使用rm /usr/local/bin/nginx删除原来的软链接,然后使用brew link nginx重新生成软链接即可。

个人简历

基本信息

姓 名: 谢 郁
性 别: 男
出生日期: 1989年5月20日
毕业院校: 电子科技大学成都学院微电子技术系
电子邮箱: xieyu33333@gmail.com

技术能力

  • 可以同时适应MAC, Linux, Windows环境的开发,熟悉命令行工具。
  • 工作以来一直使用git, 熟悉git工作流。
  • 熟练掌握 Ruby on Rails 框架,对sinatra、grape等轻量级框架也有一些了解。
  • 熟练掌握jQuery
  • 熟练掌握Bootstrap/foundation, 可以手写/使用框架构建响应式页面。
  • 熟悉LESS&SCSS等CSS预处理语言。
  • 熟悉常见的浏览器兼容性问题,有较丰富的兼容性问题处理经验。
  • 了解Node.js

工作履历

2012年1月-2012年10月:尝试互联网方向创业

工作内容:
当时准备做一个评测推荐类的网站,由于资源和技术能力不足,做了大半年后放弃。

2012年11月-2013年5月:卓衡创盟应用科技(北京)有限公司

工作内容:
主要负责前端页面开发,还同时做服务端的Ruby on Rails开发。

项目经验:
* moster产品展示网站:mostor.cc
* 联通云平台前端部分:内部系统,无公开网址
* 新闻出版总署网站前端部分:http://www.gapp.gov.cn/
* “沃缤纷”手机应用项目的后台管理部分:沃缤纷

2013年5月 - 至今:北京世纪乐知(CSDN)

2013年5月-2014年3月
以Ruby开发为主,主要负责CSDN论坛CSDN ShareIteyeCSDN Ask、四个产品的维护,升级。 期间主要负责了CSDN Share的重构。

2014年3月-至今
以Node.js为开发语言,负责CSDN手机APP产品线的后台服务, 同时应用Rails开发后台管理部分。

项目经验:
* CSDN Share的主要开发, share.csdn.net
* 内部的基于sinatra的异步队列服务。
* 社区产品线的维护升级工作

个人项目

  • Text-Learn,一个原创教程的尝试。
  • 接某图书工作室的一本CSS开发相关的书籍,尚未出版。

Doc转换为pdf的解决方案

单纯的将Doc转换为pdf很简单,使用office软件直接在图形界面下转换即可,但是如果涉及到批量转换,最好还是使用命令行工具。

一、unoconv

简介

unoconv 利用 LibreOffice/OpenOffice 的 UNO 接口实现了命令行文档格式转换功能,支持所有 LibreOffice/OpenOfficee 支持的文件格式。 因此不管机器上安装的是LibreOffice还是OpenOffice,都可以使用unoconv进行格式转换,不过需要注意的是一台机器不能同时安装LibreOffice和OpenOffice。

使用

基础转换命令:

$ unoconv -f pdf xxx.doc 

批量转换: 可以默认采用2002端口开启监听器(或者通过-p/–port参数指定端口),例如:

unoconv --listener &
sleep 20
unoconv -f pdf *.odt
unoconv -f doc *.odt
unoconv -f html *.odt
kill -15 %-

指定转换页数,文件名等:

-e, --export=name=value  set export filter options
 eg. -e PageRange=1-2

实例:

$ unoconv -f pdf -e PageRange=1-2 test.docx

这样就实现了只转换前两页。

转换效果

我的机器安装的是LibreOffice,效果还不错,和LibreOffic中的显示基本保持一致。不过少数doc文档在LibreOffice中显示有问题,因此转换后也是有问题的。

二、Abiword

简介:

AbiWord是一个以GNU通用公共许可证授权的免费文字处理软件,名称”AbiWord”是派生自意谓开放的西班牙语单词”Abierto”;支持Linux、Mac OS X(PowerPC)、Microsoft Windows、ReactOS、BeOS与其他操作系统,但对每个操作系统的支持程度都有所不同。 用它编辑文件后保存为.abw后缀,打开后为xml格式的文档。

使用

基础转换命令:

    $ abiword --to=pdf xxx.doc

实际转换效果

实际转换效果并不好,测试下格式解析不佳,和原文差距较大,局部出现布局错乱的现象。

三、cups-pdf

简介

cups-pdf是一个虚拟打印机,输出效果和打印预览一致。这种方案保真性应该是最高的,但是相对来说不是很灵活,只能转成pdf。

使用

安装:

$ sudo apt-get install cups-pdf

转换命令:

$ oowriter -pt pdf your_word_file.doc
$ libreoffice -pt pdf your_word_file.doc

转换后的文件默认会保存在~/PDF文件夹中,不过中文文件的命名会有问题,会被命名为三位数字。

$ libreoffice --headless --print-to-file --printer-name pdf --outdir /home/xieyu xxx.doc

使用--print-to-file选项可以指定打印输出目录和打印机,不过这里输出的是ps后缀的文件,可以重命名成pdf.
我这里(3.5版本)测试--print-to-file命令偶尔会出现文字解析不出来的情况,和使用Libreoffice的--convert-to选项结果一样。而4.1版本没有这个问题。
使用模拟打印的方式无法指定pdf文件的命名,灵活性不够好。

四 LibreOffice自带的转换命令

$ libreoffice --headless --convert-to pdf *.doc
$ soffice --headless --convert-to pdf *.doc

注意:在GUI下使用,如果已经开启了桌面环境的Libreoffice,命令行无法生效。 我这里(3.5版本)测试偶尔会出现文字解析不出来的情况,而4.1版本没有这个问题。

Markdown转换为pdf的解决方案

解决方案一:Kitabu

简介

Kitabu是使用ruby生成电子书的方案,它本身支持markdown转换为epub和html格式,不过通过调用其他指定的依赖 来转换为mobi、pdf、txt等其他格式。
依赖prince进行html向pdf的转换。
依赖html2text进行html向txt的转换。
依赖KindleGen进行epub向mobi的转换。
Kitabu支持代码高亮,默认使用codeRay,也可以安装 pygments.rb进行代替 。
Github地址:https://github.com/fnando/kitabu

安装方法

第一步 安装 Kitabu

$ gem install kitabu            

安装完毕后就可以使用kitabu系列命令了。

第二步 检查需要的依赖是否安装

$ kitabu check    

命令行中会给出哪些已经安装,哪些未安装。例如:

 Prince XML: Converts HTML files into PDF files.
 Installed.
 KindleGen: Converts ePub e-books into .mobi files.
 Installed.
 html2text: Converts HTML documents into plain text.
 Not installed.
 pygments.rb: A generic syntax highlight. If installed, replaces CodeRay.
 Not installed.

第三步 生成电子书制作目录

$ kitabu new mybook          

在当前文件夹下生成一个名为mybook的文件夹,进入文件夹后可以看到如下文件结构:

mybook
    ├── code
    ├── config
    │   ├── helper.rb
    │   └── kitabu.yml
    ├── images
    ├── output
    ├── templates
    │   ├── epub
    │   │   ├── cover.erb
    │   │   ├── cover.png
    │   │   ├── page.erb
    │   │   └── user.css
    │   └── html
    │       ├── layout.css
    │       ├── layout.erb
    │       ├── syntax.css
    │       └── user.css
    └── text
        └── 01_Welcome.md

第四步 生成各种格式的电子书

$ kitabu export

生成的文件会放在output文件夹中。

使用中遇到的问题

转换PDF时中文无法解析

解决方法:
1.需要在本地安装中文字体。
2.在模板中添加中文字体。

PDF中的代码出现没有对齐的情况。

Prince XML: Converts HTML files into PDF files.
Installed.
KindleGen: Converts ePub e-books into .mobi files.
Installed.
html2text: Converts HTML documents into plain text.
Not installed.
pygments.rb: A generic syntax highlight. If installed, replaces CodeRay.
Not installed.

目前最常用的解决方案:pandoc

pandoc简介

如果你需要文件格式的转换,pandoc 可以成为你的瑞士军刀,它可以将下列格式: markdown, reStructuredText, textile, HTML , DocBook, LaTeX, MediaWiki markup, OPML, Haddock 转换为:

     HTML formats: XHTML, HTML5, and HTML slide shows using Slidy, reveal.js, Slideous, S5, or DZSlides.         
     Word processor formats: Microsoft Word docx, OpenOffice/LibreOffice ODT, OpenDocument XML
     Ebooks: EPUB version 2 or 3, FictionBook2
     Documentation formats: DocBook, GNU TexInfo, Groff man pages, Haddock markup
     Outline formats: OPML
     TeX formats: LaTeX, ConTeXt, LaTeX Beamer slides
     PDF via LaTeX
     Lightweight markup formats: Markdown, reStructuredText, AsciiDoc, MediaWiki markup, Emacs Org-Mode, Textile
     Custom formats: custom writers can be written in lua.

pandoc支持多种格式的转换,可以直接用命令行由markdown转换为pdf。

    $ pandoc demo.md -o demo.pdf

虽然这个命令表面上是直接转换,但实际还是通过先转换为LaTeX格式,再转为pdf的。
这个命令对我们没有实际意义。因为无法加载样式,也无法解析中文。实用情况下还是 需要将文档转换为html或者LaTeX文件格式,通过html模板或者LaTeX的tex模板进行样式定制。

LaTeX(Donald E. Knuth(高德纳)发明的)是一个科技出版界常用的格式。

pandoc安装

第一步,安装pandoc

    $ sudo apt-get install pandoc        

第二步,安装texlive

    $ sudo apt-get install texlive-xetex texlive-latex-recommended texlive-latex-extra      

TexLive是LaTeX的工具集,由于转换pdf必须先转换成LaTeX。

第三步,安装中文字体

    $ sudo apt-get install ttf-arphic-gbsn00lp ttf-arphic-ukai ttf-wqy-microhei ttf-wqy-zenhei        

本机必须安装有中文字体,否则无法正确的转换中文。

第四步,安装multimarkdown

    git clone git://github.com/fletcher/peg-multimarkdown.git

下载后是一个文件夹,cd进去后执行make命令即可。
用于将多个md文件一起进行转化为一个pdf文件。

怎么使用?

示例

官方网站

    pandoc -N --template=mytemplate.tex --variable version=1.9 SLIDES.md --latex-engine=xelatex --toc -o example14.pdf

示例页里还有很多别的例子,其中将markdown文件转换成网页的sldes非常吸引人

    pandoc -s –mathml -i -t dzslides SLIDES -o example14a.html
    pandoc -s –webtex -i -t slidy SLIDES -o example14b.html
    pandoc -s –webtex -t -t s5 SLIDES -o example14c.html