第七星尘的技术博客

    利用docker在服务器运行多个版本php


    php7已经出来好一段时间了,众所周知它对性能的提升很大。现在假设我们有台比较老的服务器,系统是centos6,上面运行着一些老旧项目,其默认自带的php版本是5.3...

    php7已经出来好一段时间了,众所周知它对性能的提升很大。现在假设我们有台比较老的服务器,系统是centos6,上面运行着一些老旧项目,其默认自带的php版本是5.3 。虽然说,我们可以升级到php7版本,但是,老旧不兼容php7,我们不能一刀切。最好的方式是php5.3和php7共存。所以,我们可以考虑利用docker来安装其他版本的php,既能保证环境独立,又极少造成性能损耗。下面以安装php7版本为例,介绍下具体做法。

    centos6安装docker :

    yum install -y https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm service docker start chkconfig docker on

    拉取php7.2镜像

    docker pull php:7.2-fpm

    新建目录以及文件/usr/local/docker-php7/zz-docker.conf ,保存以下内容:

    [global] daemonize = no [www] listen = 9001 ;修改php.ini里面的变量就修改php_value数组相应的属性就好 php_value[session.save_handler] = redis php_value[session.save_path] = tcp://127.0.0.1:6379 php_value[post_max_size] = 20M php_value[upload_max_filesize] = 20M php_value[date.timezone] = Asia/Shanghai php_value[opcache.enable] = 1 php_value[opcache.enable_cli] = 1

    运行容器,使用host模式跟宿主机通讯


    docker run -d -v /var/www/html:/var/www/html -v /usr/local/docker-php7/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf --net=host --name php7.2 php:7.2-fpm

    安装各种常用php扩展

    docker exec php7.2 apt-get update -y docker exec php7.2 apt-get install -y libfreetype6-dev docker exec php7.2 apt-get install -y libjpeg62-turbo-dev docker exec php7.2 apt-get install -y libpng-dev docker exec php7.2 docker-php-ext-install pdo_mysql docker exec php7.2 docker-php-ext-install mysqli docker exec php7.2 docker-php-ext-install iconv docker exec php7.2 docker-php-ext-install gd docker exec php7.2 docker-php-ext-install mbstring docker exec php7.2 docker-php-ext-install opcache #顺便改下配置 docker exec php7.2 mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini

    由于无法通过 docker-php-ext-install 安装redis扩展,所以需要手动安装下

    #进入容器里的命令行 docker exec -it php7.2 sh docker-php-source extract curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/4.2.0.tar.gz tar -zxvf /tmp/redis.tar.gz -C /usr/src/php/ext mv /usr/src/php/ext/phpredis-* /usr/src/php/ext/phpredis docker-php-ext-install phpredis #到这里按ctr+p 和 ctrl+q 以退出容器 docker restart php7.2

    以上命令已经成功在9001端口运行了php7.2。接下来只要在nginx的配置里php脚本指向到9001端口即可(原来是指向9000端口)

    Vue + Webpack项目利用CDN加载静态文件,减少打包后的代码体积

    Vue + Webpack项目利用CDN加载静态文件,减少打包后的代码体积


    ...

    前言

    在使用Vue前端项目,比如说配合Element-ui框架使用时,由于加载比较多的静态资源文件,打包出来的js往往比较大,超过1M也不奇怪。
    在传统的前端项目里,对于一些公用的js问题,比如说vue.min.js等,我们可以通过cdn加载,而不需要在我们业务层去引用,从而减少要加载的业务代码体积,有利于减轻我们服务器的压力。那么问题来了,Vue项目使用webpack打包时候,我们如何像传统方式那样加载公共CDN的静态资源文件呢?

    步骤

    首先在开发目录的index.html里的head标签里增加(这里只是例子,不同项目不同版本的链接可能不一样):

    在build/webpack.base.conf.js的module.exports里增加属性:

    externals: { 'vue': 'Vue', 'element-ui': 'ELEMENT' }

    然后在开发目录的main.js文件里这样引用:

    import Vue from 'vue' import ELEMENT from 'element-ui' Vue.use(ELEMENT)

    然后再重新回到命令行,执行npm run build ,是不是发现打包出来的js文件小很多了。

    在自己的服务器上一键搭建私人网盘,可离线下载BT等资源


    ...

    最近开始有了搭建私有网盘的想法,主要是考虑到数据安全和私密。同时,会偶尔遇到资源难以下载的情形,于是便想着利用服务器来离线下载。虽然我现在使用命令行无障碍,但是如果是抱着长期管理文件/笔记的想法,那还是用一个可视化界面更方便。调研了一番,决定采用nextcloud作为文件管理主平台。同时安装周边软件实现离线下载。我现在已经将这个过程整理成了一个自动脚本。如果你是用linux服务器,执行下面两行命令即可自动安装:

    wget https://www.showdoc.cc/script/nextcloud.sh;chmod +x nextcloud.sh; ./nextcloud.sh

    安装完成后,访问http://127.0.0.1:3001 便可访问服务(可地址为你的服务器ip)。如果要使用域名,则可另行用nginx转发数据到此端口,此处不展开。
    访问首页时候,会提示你初始化安装。你指定一个管理员账户即可。初始化完成后,进入主界面,点击右上角的设置-应用,找到ocDowload,启用之。启用后,在顶部导航栏的偏左的地方能看到新添加的按钮。点击进去,它可以支持HTTP/BT等方式的离线下载,功能强大。
    如果你不想使用上面的自动脚本安装,也可以一步步手动地来。首先自己上网搜索教程,看一下怎么在服务器上安装docker。安装好docker后,再根据下面命令一步步执行即可。


    mkdir /data/ mkdir /data/nextcloud/ chmod 777 /data/nextcloud/ #拉取镜像 docker pull nextcloud:13.0.7-apache docker run -d -p 3001:80 --name nextcloud -v /data/nextcloud:/var/www/html nextcloud:13.0.7-apache docker exec nextcloud apt-get update docker exec nextcloud apt-get install wget #安装aria2 docker exec nextcloud apt-get install aria2 curl docker exec nextcloud apt-get install sudo docker exec nextcloud sudo -u www-data aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all -c --dir /root/downloads -D #下载ocdownloader插件 docker exec nextcloud wget https://github.com/e-alfred/ocdownloader/archive/master.tar.gz docker exec nextcloud tar xzvf master.tar.gz docker exec nextcloud mv ocdownloader-master ocdownloader docker exec nextcloud mv ocdownloader /var/www/html/apps/ docker exec nextcloud rm -rf master.tar.gz

    如何利用showdoc自动生成API文档


    介绍 showdoc是一个适合IT团队的文档工具,阅读本文前需要对showdoc有基本了解...

    介绍

    showdoc是一个适合IT团队的文档工具,阅读本文前需要对showdoc有基本了解 。基本介绍可看:https://www.showdoc.cc/help

    对于写API文档这件事,虽然说文本编辑软件或者接口管理软件能在某种程度上提高我们的效率,但我们依然可以试图借助技术的力量,更自动化地生成API文档,释放自己的生产力。
    为此,showdoc官方提供了一种自动化解决方案。在代码里编写特定格式的程序注释,然后showdoc通过读取这些注释来自动生成文档。由于这种方式不跟特定的语言耦合,因此它的使用范围相当广泛,可用支持c++、java、php、node、python等等常见的主流语言。
    采用这种方式,尽管我们在第一次填写注释的时候可能会有些繁琐,但是它后期带来的可维护性是非常高的。代码变动后,不需要再额外登录showdoc,直接在代码里修改注释即可。同时自动化的脚本也可以加入持续集成或者某些自动化工程里,让“写API文档”这件事如”单元测试”般纳入工程工作流里面。

    windows下使用指引

    windows无法直接运行sh脚本,需要额外下载软件。
    推荐下载git for windows:https://git-scm.com/download/win 下载后直接双击安装即可。
    如果从官网下载比较慢,可用考虑下载由第三方开发者维护的国内版(showdoc官方不保证其长期稳定):
    https://npm.taobao.org/mirrors/git-for-windows/v2.17.0.windows.1/Git-2.17.0-64-bit.exe

    以上软件是基础环境。安装好了后,还需要下载showdoc官方脚本:https://www.showdoc.cc/script/showdoc_api.sh
    下载后,将showdoc_api.sh放在你的项目目录下。右击,选择编辑。
    脚本内容的前面有两个变量,api_key 和 api_token ,这个需要用户自行填写。关于这两个变量的取值,请登录showdoc,进入某个项目的设置,点击开放API,便可以看到说明。showdoc_api.sh生成的文档会放进你填写的这个项目里。除了api_key 和 api_token ,还有一个url变量。如果是使用www.showdoc.cc ,则不需要修改。如果是使用开源版showdoc,则需要将地址改为http://xx.com/server/?s=/api/open/fromComments 其中,别忘记了url里含server目录。
    填写完毕,保存。然后直接双击运行,脚本会自动递归扫描本目录和子目录的所有文本代码文件,并生成API文档。
    为了方便测试,官方还提供了一个例子。请下载:
    https://www.showdoc.cc/script/api_demo.test
    下载后,把api_demo.test文件放在showdoc_api.sh所在的目录或者子目录下。运行的时候它便会生成文档到你指定的项目地址中。
    如果你想参考官方demo是怎么写的,可用鼠标右击api_demo.test,选择编辑。仿照此种写法,在你的项目中插入类似的注释,也能达到自动生成文档的效果。详细语法会在文章后面部分说明。

    如果你想应用到其他项目,可以把showdoc_api.sh复制一份到其他项目中。使用方法和前面一样。

    Linux/Mac下使用指引

    先cd进入你的项目目录,命令行模式下输入:

    wget https://www.showdoc.cc/script/showdoc_api.sh

    下载完毕,编辑

    vi showdoc_api.sh

    脚本内容的前面有两个变量,api_key 和 api_token ,这个需要用户自行填写。关于这两个变量的取值,请登录showdoc,进入某个项目的设置,点击开放API,便可以看到说明。showdoc_api.sh生成的文档会放进你填写的这个项目里。除了api_key 和 api_token ,还有一个url变量。如果是使用 www.showdoc.cc ,则不需要修改。如果是使用开源版showdoc,则需要将地址改为http://xx.com/server/?s=/api/open/fromComments ,其中,别忘记了url里含server目录。

    保存文件后。执行以下命令,脚本会自动递归扫描本目录和子目录的所有文本代码文件,并生成API文档。

    chmod +x showdoc_api.sh ./showdoc_api.sh

    为了方便测试,官方还提供了一个例子。请下载:
    wget https://www.showdoc.cc/script/api_demo.test

    下载后,把api_demo.test文件放在showdoc_api.sh所在的目录或者子目录下。运行的时候它便会生成文档到你指定的项目地址中。
    如果你想参考官方demo是怎么写的,可用vi命令打开api_demo.test。仿照此种写法,在你的项目中插入类似的注释,也能达到自动生成文档的效果。详细语法会在文章后面部分说明。

    如果你还想应用到其他项目,可以把showdoc_api.sh复制一份到其他项目中。使用方法和前面一样。
    或者不转移位置,直接通过参数指定扫描目录。如

    ./showdoc_api.sh /myapp/demo/

    语法说明

    一个标准语法例子:

    /** * showdoc * @catalog 测试文档/用户相关 * @title 用户登录 * @description 用户登录的接口 * @method get * @url https://www.showdoc.cc/home/user/login * @param username 必选 string 用户名 * @param password 必选 string 密码 * @param name 可选 string 用户昵称 * @return {"error_code":0,"data":{"uid":"1","username":"12154545","name":"吴系挂","groupid":2,"reg_time":"1436864169","last_login_time":"0"}} * @return_param groupid int 用户组id * @return_param name string 用户昵称 * @remark 这里是备注信息 * @number 99 */

    语法说明


    @catalog // 生成文档要放到哪个目录。如果只是二级目录,则直接写目录名字。如果是三级目录,而需要写二级目录/三级目录,即用 / 隔开。 @title //表示生成的文档标题 @description // 是文档内容中对接口的描述信息 @method //接口请求方式。一般是get或者post @url //接口URL @param //参数表格说明。一行注释对应着表格的一行。用空格或者tab符号来隔开每一列信息。 @return //返回内容。请把返回内容压缩在同一行内。如果是json,程序会自动进行格式化展示。 如果是非json内容,则原样展示。 @return_param //返回参数的表格说明。一行注释对应着表格的一行。用空格或者tab符号来隔开每一列信息。 @remark //备注信息 @number //可选。文档的序号。 其他信息

    请严格按照我们的语法来填写程序注释。如果格式不对,则可能引发未知的解析错误。

    出于数据安全考虑,showdoc不允许直接通过代码删除文档。只能新增或者修改。所以,如果你要删除文档,请登录showdoc网页端完成。

    本脚本只能通过特定的程序注释来生成文档,使用范围有限。如果你是想通过其他方式自由地生成文档,如通过word、通过博客软件等,请参考我们更自由的开放API:https://www.showdoc.cc/page/102098

    如果你的项目下太多文件,则可能导致脚本扫描很慢。推荐把脚本放到需要生成注释的那个目录里。一般来讲,一个项目不会所有目录都需要生成文档的

    如何利用showdoc自动生成数据字典


    ...

    介绍

    showdoc是一个非常适合IT团队的在线API文档、技术文档工具。你可以使用Showdoc来编写在线API文档、技术文档、数据字典、在线手册。关于showdoc的详细介绍,可看:https://www.showdoc.cc/help

    好的数据字典文档能够清晰地反映出数据库的结构以及相关释义,方便技术人员查阅。我们很容易使用showdoc来生成展示数据库结构的字典文档,并且能根据数据库结构的变动来自动修改文档,省去人工编辑的麻烦。

    这一切的自动化依赖于我们的上报脚本。你需要下载我们的脚本到你的服务器上执行,上传数据库结构信息到showdoc。上报脚本的源码完全公开,你可以阅读之以确认安全。我们确保它只会上传基本数据库结构信息,不会上传数据库密码配置、业务数据等敏感信息。

    目前只支持linux下的mysql数据库,更多类型未来再考虑。

    操作步骤 执行下载脚本的命令 wget https://www.showdoc.cc/script/showdoc_db.sh 打开此文件 vi showdoc_db.sh 修改配置信息
    打开文件后,在文件的前面能看到几项配置。其中,像数据库配置、api_key等信息是需要你填写的,填写完毕后保存即可。下面列举出各个配置项代表的意思。
    host : 数据库所在地址。默认是localhost port : 数据库访问端口,默认是3306 user : 数据库用户名 password : 密码 db : 要同步的数据库名。要同步多个db可以将本脚本复制多份 | api_key : 认证凭证。登录showdoc,创建一个项目后,点击右上角的”项目设置”-“开放API”便可看到 api_token : 同上 cat_name: 可选。如果想把生成的文档都放在项目的子目录下,则这里填写子目录名。 url : 可选。同步到的url。如果是使用www.showdoc.cc ,则不需要再改此项。如果是部署开源版showdoc,请改此项为http://xx.com/server/index.php?s=/api/open/updateDbItem 。其中xx.com为你的部署域名| 执行 sh showdoc_db.sh

    看到成功字样便ok。你可以打开showdoc项目看看是否真的生成了。

    如果想定时自动更新,则需要为系统增加一个定时任务。下面给一个例子,表示每10分钟同步一次

    /10 * * * * /bin/sh /root/showdoc_db.sh

    其中,showdoc_db.sh脚本在定时任务里需要写绝对路径。

    注意事项

    如果你设置了脚本的自动执行,那么请不要再手动登录showdoc修改文档。因为你的修改都会被自动脚本重新覆盖。
    因为会覆盖你的修改。所以如果你想为某个字段设置中文注释,请修改mysql字段注释,而不是在showdoc上手动编辑文档。
    自动执行的情况下,只会自动新增和修改文档,不会自动删除文档(主要出于数据安全考虑)。所以,如果你删除了一张表,文档里是不会删除那个页面的。需要手动登录showdoc来删除。一般来讲,这种情况不会很多。

    浏览器加载、解析、渲染过程是怎样的


    ...

    浏览器加载 加载过程
    当浏览器获得一个html文件时,会”自上而下“加载,并在加载过程中进行解析渲染。
    加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。
    遇到图片资源,浏览器也会另外发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载。
    但是当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。 加载外联js和css的阻塞情况
    一个不太严谨但方便记忆的口诀:JS 全阻塞,CSS 半阻塞 JS 会阻塞后续 DOM 解析以及其它资源(如 CSS,JS 或图片资源)的加载。 CSS不阻塞DOM的加载和解析(它只阻塞DOM的渲染呈现。这里谈加载),不会阻塞其它资源(如图片)的加载,但是会阻塞 后续JS 文件的执行(原因之一是,js执行代码可能会依赖到css样式。css只阻塞执行而不阻塞js的加载)。 鉴于上面的特性,当css后面存在js的时候,css会间接地阻塞js后面资源的加载(css阻塞js,js阻塞其他资源 )。 现代浏览器会进行 prefetch 优化,浏览器在获得 html 文档之后会对页面上引用的资源进行提前下载
    外联js文件使用defer属性和asyn可以达到异步非阻塞加载的效果,由于现代浏览器都存在 prefetch,所以 defer, async 可能并没有太多的用途,可以作为了解扩展知识,仅仅将脚本文件放到 body 底部(但还是在< /body >之前)就可以起到很不错的优化效果(遵循先解析再渲染再执行script这个顺序)。当把js放在最后的时候,其实浏览器将自动忽略< /body >标签,从而自动在最后的最后补上< /body >。 浏览器解析 1、浏览器通过请求的 URL 进行域名解析,向服务器发起请求,接收文件(HTML、CSS、JS、Images等等)。 2、HTML 文件加载后,开始构建 DOM Tree(DOM树) 3、CSS 样式文件加载后,开始解析和构建 CSS Rule Tree 4、Javascript 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree 浏览器渲染 1、浏览器引擎通过 DOM Tree 和 CSS Rule Tree 构建 Rendering Tree(渲染树) 2、布局阶段——在屏幕上绘制渲染树中的所有节点的几何属性,比如: 位置,宽高,大小等等,这个过程称为 Flow 或 Layout 。 3、绘制元素——绘制所有节点的可视属性。 4、合并渲染层——把以上绘制的所有图层(类似于PhotoShop中的“图层”)合并,最终输出一张图片

    其中的阶段3、4可称之为Paint

    Repaint和Reflow

    当用户在浏览网页时进行交互或通过 js 脚本改变页面结构时,以上的部分操作有可能重复运行,此过程称为 Repaint 或 Reflow。

    Repaint
    当元素改变的时候,将不会影响元素在页面当中的位置(比如 background-color, border-color, visibility),浏览器仅仅会应用新的样式重绘此元素,此过程称为 Repaint。

    Reflow
    当元素改变的时候,将会影响文档内容或结构,或元素位置,此过程称为 Reflow。( HTML 使用的是 flow based layout ,也就是流式布局,所以,如果某元件的几何尺寸发生了变化,需要重新布局,也就叫 Reflow。)
    Reflow 的成本比 Repaint 的成本高得多的多。我们应当尽量避免Reflow。

    如何优化浏览器渲染过程 1、创建有效的 HTML 和 CSS ,不要忘记指定文档编码,比如 2、CSS 样式应该包含在 < head >中, Javascript 脚本出现在`< body > 末尾。 3、减少 CSS 嵌套层级和选择适当的选择器,可参考 如何提升 CSS 选择器性能。 4、不要通过 JS 逐条修改 DOM 的样式,提前定义好 CSS 的 Class 进行操作。 5、尽量减少将 DOM 节点属性值放在循环当中,会导致大量读写此属性值。 6、尽可能的为产生动画的 HTML 元素使用 fixed 或 absolute 的 position ,那么修改他们的 CSS 是不会 Reflow 的。

    Linux自动监控文件目录变化并同步


    介绍 有时候我们常需要当文件变化的时候便触发某些脚本操作,比如说有文件更新了就同步文件到远程机器。在实现这个操作上,主要用到两个工具,一个是rsync,一个是inotifywait...

    介绍

    有时候我们常需要当文件变化的时候便触发某些脚本操作,比如说有文件更新了就同步文件到远程机器。在实现这个操作上,主要用到两个工具,一个是rsync,一个是inotifywait 。inotifywait的作用是监控文件夹变化,rsync是用来同步,可同步到本机的其他目录或者远程服务器上。

    安装rsync wget http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz tar zxvf rsync-3.1.1.tar.gz ./configure –prefix=/usr/local/rsync-3.1.1 make make install 安装inotifywait wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz tar zxvf inotify-tools-3.14.tar.gz cd inotify-tools-3.14 ./configure make make install 创建并运行脚本

    新建脚本inotifywait.sh 并输入以下内容

    #!/bin/bash export CNROMS_SRC=/home/ftpuser/gri/ # 同步的路径,请根据实际情况修改 inotifywait --exclude '\.(part|swp)' -r -mq -e modify,move_self,create,delete,move,close_write $CNROMS_SRC | while read event; do rsync -vazu --progress --password-file=/etc/rsyncd_rsync.secret /home/ftpuser/gri/sla rsync@10.208.1.1::gri ##这里执行同步的命令,可以改为其他的命令 done

    然后执行下面命令,会在后台执行监控

    nohup sh inotifywait.sh > /dev/null 2>&1

    然后就可以关闭命令行窗口了

    在腾讯待的这一年


    ...

    来腾讯刚好一年了,总觉得应该写点什么来总结下这一年来的经历。所以决定写下此文。

    腾讯生活

    初到腾讯时,对其内部的流程等很陌生。所幸的是公司有着一套不错的IT工具来帮助新人解决问题。整个入职阶段应该先做什么后做什么,都会有微信或者邮件提醒你。公司也有自身的内网,上面有着像论坛、乐问等交流社区(而且还挺活跃),相当多的资料都可以在上面找到。除了资料外,还可以在上面就公司的产品提出任何问题,并且多数都会得到答案——这点印证了我以前听说来的看法,腾讯确实是一间很注重产品体验的公司。

    公司内还有一个称之为腾讯学院的东西,会定期组织公司内各个领域的牛人来分享、演讲。每个人都可以选择自己感兴趣的课程——哪怕跟你现在的岗位工作不一样,只要你感兴趣,你就可以申请去听课。私以为,若想通过一两节公开课就能提高自身的专业水平,是不太现实的。太专业的东西还是得靠平时自己学习练手。但公开课的存在可以让你扩展你的眼界,看看别人是怎么做的,碰到过哪些经验与教训,以及了解其他领域的知识可能会给你带来一些不一样的启发。

    入职培训的时候,我们的培训师在提到公司对员工福利的政策的时候,她说:“对于很多企业而言,成本是一个很重要的因素。他们节省一些员工福利来降低企业成本,这也无可厚非。但对于腾讯而言,腾讯并没有那么缺钱。腾讯缺人才。福利好能提高员工满意度,更容易留住人才。”对于,公司的福利制度真的相当不错。像中秋节、感恩节、圣诞节这些节日,每个人总收到礼品。

    公司也定期会有些集体活动,比如出外爬山、旅游、晚会、聚餐的。有些年度活动可能由公司包下整个体育场来举办,有些小活动可能是部门自己举办。还有些更小的活动可能只是小组内了。由于文章篇幅限制,这里就不展开了。

    工作之内

    谈一下工作之内。我所在的岗位,主要是做运营工具的开发。由于大多数运营工具是面向腾讯内部使用的,所以我觉得没必要在这里介绍那些运营工具了。在开发技术方面,我主要做前端和php开发。我想分享些我关于提升IT工作效率的一些小心得。

    任务管理。

    我没有使用TODO LIST之类的应用,是因为我觉得它们只适合解决比较少量任务的场景。所以我一直用笔记软件将众多任务写在一个页面里,分组列号。当完成了,便划掉。用这种任务管理方式持续了三年多。但在腾讯工作的时候,我发现了原有任务管理方式的短板——对于多需求情况下,多任务状态的管理不方便。我摸索了一阵子后,发现一种比较适合解决这种多任务状态的管理工具,那就是团队看板。本来团队看板是给一个团队用的。但其实也可以把自己看作一支团队来管理。这样的话,你在不同需求之间切换,不同任务的中断和拾起都会方便很多。关于具体使用细节,我想如果有时间我再另起一篇详细的文章。对于感兴趣的朋友,我建议你先去摸索下团队看板的使用。

    画原型工具

    讨论一个项目的需求时,有时候我们需要把想法画出来,这样才方便跟大伙沟通自己的想法。像Axure老牌软件就不说了,我想推荐使用的是“墨刀”。用墨刀画原型非常简单,大量的模板和示例,比较适合我这种不是专业产品经理但又需要画产品原型的新手。

    自动化脚本

    因为自己更多是做web开发的工作,所以其实对linux的脚本不熟。正因为这样,在腾讯里面的网络做开发时常遇到部署代码的麻烦。因为公司网络限制,很多部署步骤都是重复而繁琐的。后来在同事的帮助下,用脚本实现了半自动部署。当然了,这个例子并没有普适性,但是思路是可以借鉴的。仔细想一下,自己平时开发中有什么工作步骤是不断重复的?能否用程序来实现?有时候,重复一些很简单的操作可能你觉得无所谓,但我觉得,哪怕脚本能帮你节省一个步骤,那么你写程序的时候就不用总是被琐碎的步骤打断,更多将精力花在重点上。

    工作之外

    谈一下工作之外的学习探索。
    在过去的一年,我用node开发了一个开源的任务队列服务HTQ(https://github.com/star7th/htq)。node.js的异步机制还是比较适合用来处理异步场景的。此外,我的另一个开源项目showdoc虽然说不是在过去一年里开发(它在我进腾讯之前开发),但是它确实是在这一年热门起来,在github上超过了1300+的star。本来showdoc只是个方便写文档的小工具,但开源后热门程度超过我预期。还有,因为使用者中有不少人不懂PHP,所以我搭建了一个长期维护的在线showdoc(https://www.showdoc.cc/)供人使用,目前使用在线showdoc来存放文档的人和团队还挺多。

    当初我还在学校的时候运营了一个微博号,到现在微博号已经持续几年了。这一年我决定为它开发一套筛选热门微博的工具。使用这个工具能快速筛选出过去一周的热门微博,然后人工加工下,推送到微信公众号。此举的灵感是来自腾讯乐问。因为我看到乐问的运营团队也是周期性推送热门讨论,并且使用的是程序推荐+半人工筛选的机制。

    人生思考

    可能你看到我工作之外还有那么多时间来捣鼓开源项目,便觉得过去一年我在腾讯的工作可能很轻松。
    其实不是这样的。首先,做那些开源项目真的不需要花太多时间。比如上面开源的HTQ,我当初花了两个周末的时间来写。而维护开源项目也不难,有时候花半个小时修复个bug就好。至于那个热门讨论的推送,基本上是每周一次,而且我还有程序自动辅助筛选来减轻工作量。一年那么长,总能抽出几个空闲的周末。尤其是一个人,很多时候也不用出去约会,也不需要像我的一些已婚同事那样陪孩子。所以时间还是有的。
    平时的腾讯工作,很多时候并不轻松。我,以及我周围很多同事,我接触到的腾讯工程师,相当多都有加班的习惯。不同人岗位不一样,负责的工作也不一样。像我,做运营支撑开发的,很多时间花在修复前人留下的bug、完善工具流程、沟通流程需求上了。而一些做运维做监控的其他同事,则经常需要“救火”。比如说《王者荣耀》搞活动,大多人参与导致服务器撑不住了,就需要有人马上去限流、扩容或者转移压力到其他服务器上。

    说到“救火”,我倒有些感悟。在外人的角度来看,可能腾讯对外提供的各种服务都是高可用的。但其实背后是很多人在做技术支撑。软件也好、服务器也好,都是死的。总在各种情况下出各种乱七八糟的bug。倒不是说一定是代码太烂。有时候纯属因为业务复杂、服务器压力大而引发的各种意外问题。只有人才是活的。有人,这些bug能得到快速修复,出问题了能快速得到响应。这让我想起了一部纪录片《人类消失后的世界》。在科学家的预测里,如果没有人类,几乎所有高楼大厦、公路大桥、汽车飞机在100年内基本完全被大自然消解。也就是说,今天能看到的很多东西,都是因为背后有人一直在维护,在更新、维护和延长这些物体的使用寿命。没有东西能永远可靠和稳定。有人维护才是关键。

    以上。

    开源的任务队列服务HTQ


    一、什么是...

    一、什么是 HTQ

    先介绍下基本概念。

    我们在编写程序时,偶尔会遇到需要用到异步队列的情况。比如说,我发送一万封邮件,如果单纯使用一个for循环来发送,则执行时间要很长,要等很久才能发完,同时很容易导致阻塞、超时等问题。当邮件更多,比如一百万封的时候,问题会更加明显。这时最好的解决方案就是把这十万封邮件排队,一一发出去。这就是任务队列的概念。

    并且,我们并不需要等到十万封邮件都发送完毕后才在网站前台通知用户。我们可以把邮件一入队列,就通知用户。这样,用户等待的时间就不是漫长的“发十万封邮件”的时间,而是“把十万封邮件排队”的时间。因此能明显地缩短了用户等待时间。这就是异步的概念。

    HTQ ,全称 Http Task Queue ,是一个以Http方式执行异步任务的队列服务。你可以推送若干url进HTQ队列,HTQ会以Http GET 的方式访问这些url。如果url所在的脚本写上各种具体的任务操作,如发送邮件等,便可以实现异步操作了。HTQ使用node.js编写,可跟各种后台语言如PHP、java配合使用以增强异步处理能力。目前支持的队列类型有实时异步队列、定时异步队列、可变异步队列。

    如果你依然对HTQ陌生,则可往下看详细的应用场景以加深了解。

    二、应用场景

    1、实时异步队列

    所谓实时,指的是把任务一推进队列就马上执行。一个典型的应用场景就是我们上面所说的发送邮件。邮件推送进任务队列,队列马上把它发出去。如果它推进队列后有其他邮件正在发送中,它则等待当前邮件发送完毕后才发送。

    除了发邮件,我们在发文章、发微博、发评论的时候都可以用得上HTQ的实时任务队列,尤其是数量非常大的时候。比如评论用户太多,如果一瞬间让服务器处理,服务器可能因为支撑不了太高的并发从而造成阻塞。这个时候就可以让评论们进入队列再一一处理。

    2、定时异步队列

    定时,顾名思义,就是在特定的时间执行任务队列。这种队列服务可用于定时邮件、定时短信。需要说明的是,这里的定时,不一定是精准的定时。假如你设置了明天12点执行某个任务,那么,它在明天12点的时候将进入队列。假如队列中已经有任务在执行,那么它会等待到前面的任务完毕才执行。此时可能是12点01分钟才执行。

    3、可变队列

    我们推送10个任务进队列,这10个队列会反复循环地执行,并且它们的执行快慢能够根据返回情况进行调整,这就是可变队列。比如,我们做扫描监控,会反复地执行“扫描”这个任务。我们希望,在有异常情况的时候,能加快扫描的速度以便更快速地发现问题;而在没有长期异常的情况能减慢一下扫描速度以节省机器资源。

    再举一个场景例子,通过API拉取微博新动态。我们网站上有10万绑定了新浪微博的用户,我们需要时常获取他们的最新动态以展示在我们的网站的用户主页上。 如果是采用定时获取动态的方式,那么,假设1分钟能获取1千个用户的动态(因为受API使用频率和网络等原因限制,我们获取不了太快。这里先假设一个数字),那么,获取完所有用户状态需要100分钟。对用户来说,他在微博更新动态后,100分钟后才显示到我们网站。这明显滞后太多。有没有办法加快点呢?此时可以使用HTQ的可变队列。可变队列会对长期没有更新动态的那部分不活跃用户进行减缓速度,减缓对他们微博的获取频率,同时加大对活跃用户的获取频率。这样,一个活跃用户更新微博后,可能10分钟就能同步到我们网站了。对于不活跃用户,可能获取时间会变长了些,但不要紧,我们愿意分配更多的资源去满足活跃用户的需求。

    使用可变队列,能让我们有所侧重地使用我们的资源,以减少浪费、增加利用率。

    三、安装和使用

    1、安装

    首先安装好node环境和redis服务,请参考:http://nodejs.cn/download/http://redis.io/download

    clone或下载代码:https://github.com/star7th/htq

    下载到你想要放置的目录,命令行进入该目录,执行命令:

    npm install

    安装完毕后,执行以下命令启动:

    node htq.js

    上面这种启动方式是临时运行的,关闭命令行窗口就会停止了。如果想一直在后台运行,则可:

    nohup node htq.js > ~/htq.log 2>&1 &

    如果想关闭退出,可运行:

    killall -9 node

    2、如何使用

    启动后,HTQ默认监听本机的5999端口。你可以通过此端口访问HTQ的APi,以添加队列和任务。详细的API文档可看:http://www.showdoc.cc/htq?page_id=37198

    你可以根据API文档来在你的项目中调用API以新建任务。官方提供了一个PHP调用的SDK(在/PHPSDK目录)。欢迎其他语言的开发者也将HTQ的API封装成其他语言的SDK

    如果要修改默认端口以及默认的redis地址,可修改配置文件config.json。修改完毕需重启HTQ才能生效

    四、安全与容错

    1、程序安全

    访问HTQ 的API时需要填写简单的token认证,认证信息在配置文件config.json里定义。为了安全起见,你可以在下载代码将token设置为其他随机数。如果你已经启动了HTQ,则需要关闭后再重启才能让新配置生效。

    如果你担心直接执行url会带来安全隐患,怕自己暴露的url被外部访问,那你可以在推送进HTQ的url上带参数签名校验。然后在url触发的任务脚本里检验签名即可。

    2、数据安全

    HTQ使用redis来储存队列。Redis自身带有持久化功能。如另外需要对数据进行备份,则备份redis即可,不用在业务中实现数据备份。

    3、正确性

    HTQ能执行url,但不能保证业务上的正确。比如说HTQ确实是触发了发文章的脚本,然而这个脚步可能自身因为网络原因发布文章失败。此时应该在业务层做好相应的容错处理,比如让该url重新入队列。

    ShowDoc部署手册


    ShowDoc介绍 关于ShowDoc的介绍,请访问:http://blog.star7th.com/2015/11/1816.html Docker环境 或...

    ShowDoc介绍

    关于ShowDoc的介绍,请访问:http://blog.star7th.com/2015/11/1816.html

    Docker环境 或 PHP环境

    如果你使用Docker安装ShowDoc,则无须再手动安装PHP环境。请忽略本文后续教程,跳转至:http://www.showdoc.cc/help?page_id=65610

    如果你手动安装PHP环境,可参考:http://www.showdoc.cc/php 。ShowDoc需要PHP5.3及以上版本、php-gd库、php-pdo模块。

    安装ShowDoc 1、全新安装

    ①、如果你熟悉命令行,则可通过Composer安装 。如果采用手动方式安装,则请下载代码:
    https://github.com/star7th/showdoc

    ②、文件夹权限

    请确保/Application/Runtime 、 /Public/Uploads 、 /Sqlite 、 /Sqlite/showdoc.db.php 有可写权限

    ③、Windows服务器

    在php.ini里面把”extension=php_sqlite.dll”和”extension=php_pdo_sqlite.dll”启用以便开启对SQlite的支持;也启用php_mbstring.dll;Linux服务器则不需要此操作。

    ④、运行安装

    在浏览器访问http://xxxx.com/install/ (请将网址更改为你服务器域名或ip)。安装完毕后可使用默认账号showdoc(密码:123456)登录,也可以自行注册账户

    2、升级安装

    ①、如果你是ShowDoc早期使用mysql数据库的那部分用户,请参考这里转移数据 http://www.showdoc.cc/help?page_id=31990 其他用户请忽略本段话,往下看。

    ②、如果你熟悉命令行,则可通过Composer升级 。如果采用手动方式安装,则请下载代码:
    https://github.com/star7th/showdoc

    ③、备份旧代码目录

    ④、全新安装(具体操作参考上面”全新安装”部分的文字)并初始化ShowDoc完毕后,进入之前备份的目录。将Sqlite/sqlite.db.php(这是原来的数据库文件),以及Public/Uploads/下的所有文件(这些是上传的图片。如没有图片则可忽略之),全部复制并覆盖到新showdoc目录的相应文件。覆盖后重新给这些文件可写权限。

    ⑤、 覆盖文件后,用浏览器访问http://xxxx.com/index.php?s=/home/update/db (请将网址更改为你服务器域名或ip)。看到OK字样便证明成功升级.

    错误排查

    常见问题:http://www.showdoc.cc/3&page_id=16118

    使用在线的ShowDoc

    如果你没有自己的服务器,但又想使用ShowDoc作为分档分享工具,你可以使用在线的ShowDoc http://www.showdoc.cc
    http://www.showdoc.cc 作为在线服务会长期维护,请放心托管你的文档数据。使用在线服务时请记住showdoc唯一官方网址https://www.showdoc.cc

    ShowDoc交流群 ShowDoc使用交流qq群
    交流群①:564671853(已满)
    交流群②:174709989(已满)
    交流群③:667194478