2016 小回顾

时间很快, 已经走到了 2016 的末尾, 惯例的做个小回顾。(注:这篇起笔的时间是圣诞节TAT) 年初定的目标除了没有能合理安排追番时间, 其他的都基本完成了!(话说今年追番的时间简直少的可怜QAQ) 2016 年发生了太多的事情,要回顾的事情很多,索性就不写那么多了, 只按时间序稍微列几件有趣的事情。 单表亿级数据量的 MongoDB 做在线实时的数据拆分 在之前做的一些应用性能分析的方案上做了一些额外的设计和开发(明年修改下开源出来) PyCon China 2016 一些预期的计划顺利推进、落地,产出了一些系统 看了很多源码,折腾了很多东西,如果以后有空就写点东西出来(我又在给自己挖坑了) 认识了很多有趣的小伙伴~ 全年的状态基本和上面的截图是一致的, 全年都在 coding (截图仅限 GitHub上的记录)倒也比较开心, 另外就是现在看到自己项目的 star/fork 数,文章的阅读/收藏/转发数之类的,也已经不像以前看到 star 数刚上百时候会有那种喜悦了,大概这也是另一种成熟? 哈哈哈 另外写一下今年对我比较重要的几个数字: 1354 376 105 对这些数字的解释, 放在以后吧 :-) 2017 年,希望想做的事情都能基本完成,挖的坑慢慢填。 感谢一路上陪我走过的各位! 可以通过下面二维码订阅我的文章公众号【MoeLove】

关于 webpack 你可能忽略的细节(附源码分析)

注:本篇不是入门教程,入门请直接查看官方文档。本篇的主要目标是通过实际问题来介绍 webpack 中容易被人忽略的细节, 以及源码分析(以最新发布的 release 版本1.14.0的源码为例), 并且提供几种解决方案。 随着前端技术的火热发展,工程化,模块化和组件化的思想已逐步成为主流,与之相应的,就需要有一整套工具流可以支撑起它。 现在比较热门的前端资源模块化管理和打包工具应该非 Webpack 莫属了。 Webpack 是什么 它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。通过 loader 的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、 AMD 模块、 ES6 模块、CSS、图片、 JSON、Coffeescript、 LESS 等。 –引自 Webpack 中文指南 使用举例 我们来看一下官方文档中的最小用例,新建并写入以下内容到这两个文件: cats.js var cats = ['dave', 'henry', 'martha']; module.exports = cats; app.js (Entry Point) cats = require('./cats.js'); console.log(cats); 这个时候,就可以使用 webpack 进行打包了: webpack ./app.js app.bundle.js 我们来看一下发生了什么, 目录下生成了一个打包后的文件 app.bundle.js ,这就是最基础的打包过程。 提出问题 如何判断打包是否成功? 通用方案 下面是我们常用的两种判断任务是否执行成功的方案 通过 return code 通过命令执行后的 return code 来判断(在 shell 中使用 $?

Composer 使用技巧简述

最近使用了世界最好的语言 PHP 用来管理依赖关系的工具 Composer. 稍微做点记录, 以做备忘. 如有错误还望指出. 安装 php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('SHA384', 'composer-setup.php') === 'aa96f26c2b67226a324c27919f1eb05f21c248b987e6195cad9690d5c1ff713d53020a02ac8c217dbf90a7eacc9d141d') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');" 上述代码来自官网. 局部安装 上述代码执行完成后, 只是下载到了 composer.phar 文件, 可以通过 php composer.phar 在任意位置执行. 全局安装 全局安装只是把 composer.phar 安装到 PATH 下即可. 可以像下面这样: sudo mv composer.phar /usr/local/bin/composer 国内镜像加速 使用Composer中文网提供的中国全量镜像进行加速. 单项目加速 进入项目目录(即 composer.json 文件所在目录) 执行:

Git workflow 详谈

作为一名工程师, Git 在日常开发中是不可或缺的工具。 这里详细介绍几种比较常用的基于 Git 的工作流模型, 以便于团队协作的规范化和效率提升。 中心化工作流 使用过SVN的应该都知道, SVN使用的是集中式管理流程, 如果你刚从SVN 切换到 Git , 你可以尝试使用中心化工作流的方式。这样,你几乎不需要变更之前的工作方式, 就可以完成平滑的过渡了。 而且在使用过程中还可以看到 Git 优于 SVN 的地方: 第一,每个成员都可以在本地拥有一份完整的项目代码仓库,而不只是一个工作区的副本,任何人都可以在本地执行 add 和 commit ,而不需要考虑远端仓库是否有变更,直到需要的时候再去提交即可。 第二,Git 的工作区、暂存区、引用更新等设计,可以给开发者更多自由来切换当前工作,且不会造成代码丢失。 工作细节 中心化工作流的方式是:在远端(远端可以是服务器端,也可以是本地的任意目录)新建一个仓库,默认是 master 分支,作为唯一的中心仓库。 所有人都 clone 这个仓库作为本地仓库,并在本地仓库进行开发。本地的提交是和远端仓库无关的,等需要的时候再 push 进主仓库的 master 分支即可。 在这种方式下, 远端是唯一确定的中心仓库, 所有人都要以这个仓库为准。 所以,在提交之前要先 fetch 最新提交,在这些提交之上作出自己的更改(一般我们使用 rebase来完成)。 如果本地的修改和远端仓库中的变更发生了冲突,那么 Git 会暂停 rebase ,并让你来解决这些冲突。我们可以很简单的使用 git status 和 git add 等命令完成冲突的合并。 另外, 如果我们解决不了冲突, 我们也可以使用 git rebase --abort 很容易的退出 rebase 的过程。 这样每天的工作方式就变成了,从中心仓库拉取最新代码, 然后开始一天的工作, 开发完成后,拉取中心仓库的更新, 合并代码后, 再提交至中心仓库, 结束一天的工作。 这样的好处就是不需要变更原先(使用SVN)的工作方式。当然弊端也很明显,你并不知道中心仓库的代码是否是稳定的,或者说并不能确定当你的代码和中心仓库代码合并后,是否是稳定的,带来的问题就是开发进度和回滚不那么方便控制。

Git 本地仓库和裸仓库

通常我们会用 git init 命令来将我们所在的目录转换为一个 Git 本地仓库或者初始化一个新的空仓库。 用法 将当前目录转换为一个本地仓库 git init 这个命令执行后会在本地生成一个 .git 的文件夹,用来追踪仓库的所有变更。效果如下: 指定某个目录成为本地仓库 git init <repo> 这个命令执行后, 将创建一个名为repo且只包含 .git 子文件夹的空目录。效果如下: 指定某个目录成为中心仓库(裸仓库) git init --bare <repo> 这个命令执行后,将在本地创建一个名为 repo 的文件夹, 里面包含着 Git 的基本目录, 我们一般会将这个文件夹命名为后面加 .git 的形式,如 repo.git (这也是为什么我们从 GitHub clone 仓库的时候,地址都是 xxx.git 这样的形式的原因)。效果如下: 详细说一下使用 --bare 参数的含义,使用 --bare 参数初始化的仓库,我们一般称之为裸仓库, 因为这样创建的仓库并不包含 工作区 , 也就是说,我们并不能在这个目录下执行我们一般使用的 Git 命令。 对比 我们来对比一下直接使用 git init 创建的仓库和加了 --bare 参数的两个仓库。 我们直接看两个仓库的的 config 文件中的内容:

源码编译Vim 8

Vim 8.0 在2016.09.12发布了, 在各 Linux 发行版还没更新包的时候就源码编译来使用吧! 以 Debian 编译 Vim 为例. 下载Vim 源码 可以在Vim 官网下载打包好的源代码. 或者使用 Git: git clone https://github.com/vim/vim.git 编译 cd vim/src ./configure --with-compiledby="TaoBeier" --with-features=huge --enable-pythoninterp=yes --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu --enable-cscope --enable-perlinterp=yes --enable-rubyinterp=yes --with-luajit --enable-luainterp=yes --with-lua-prefix=/usr/include/lua5.1 --enable-multibyte --with-x --enable-fail-if-missing 上面的参数使用 ./configure --help 都可以看到对应用途. 上面使用的参数是增加了对 Python, Ruby, Perl, 以及X window的支持. 建议加上 --enable-fail-if-missing 参数, 以方便定位到哪里依赖缺失. 依赖 这里检查可能通不过, 首先是 lua 和 luajit. 需要执行 sudo apt-get install lua5.1 liblua5.1-0 luajit libluajit-5.1-dev

利器系列-更高效的Vim

这是利器系列第0篇, 当然要以每天我使用率最高的Vim来开始啦! 截图 安装 (你需要一个有Python支持的Vim版本. 请使用 vim --version | grep +python 来检查) 依赖(Debian/Ubuntu 平台) sudo apt-get install python vim exuberant-ctags git sudo pip install dbgp vim-debug pep8 flake8 pyflakes isort 依赖(RedHat/CentOS 平台) CentOS 6.7的yum源自带的Python版本较旧,推荐自行安装Python2.7. sudo yum install python vim ctags git sudo pip install dbgp vim-debug pep8 flake8 pyflakes isort 依赖(Mac OS 平台) brew install python vim git wget http://tenet.dl.sourceforge.net/project/ctags/ctags/5.8/ctags-5.8.tar.gz && tar -zxvf ctags-5.8.tar.gz && cd ctags-5.

Python性能优化之工具篇

之前对公司的一个后端项目做了些性能优化, 学到一些值得记录的东西, 这篇主要是介绍在做性能分析时所用到的工具, 至于如何优化基本就是智者见智吧, 如果有时间可能会写的. Python web应用程序的常见性能指标 此处忽略外部DNS解析等方面的性能 响应时间 错误率 吞吐率 执行时间 内存占用 Python 性能分析工具 ##TODO

想从二次元群体手里赚钱?你真的懂二次元吗!

“节操”,“鬼畜”,“萌”, “二次元”这些词是不是逐渐的融入了你的日常? 这些词其实都是二次元产物。越来越多的人将关注点放到了“二次元群体”上,但是这里的价值和它真正的含义你懂了吗? 什么是原本的二次元 很多人认为二次元就是指“二维平面”,“平面世界”,也有人认为是ACGN,但这个观点其实是带有误区的。 为什么这样说呢?我们一起来追溯一下“二次元”这个词是什么时候出现的,有部和我年龄相仿的动画片《机动战舰》(暴露年龄系列,我下一篇就写这个),其中的反派们超级崇拜一部叫《激钢人3》的动画片,甚至这部动画片已经成为反派军中的圣典(除了很热血很好看外,其实是因为他们逃亡的时候就只带了这一部动画片吧,充分说明做资源党是有好处的!),当然剧中的主角也是很喜欢这部动画片的。动画(机动战舰)中的反派非常喜欢激钢人3中的女主菜菜子,但是毕竟现实和动画是不可逾越的(明明都是在动画里面!),处于伤感中的反派们相互安慰:“菜菜子再好,但她毕竟只是二次元的女子啊!”,这句话引起了很多ACG爱好者的共鸣,所以逐步的借用了其中的“二次元”来描述自己所喜爱的由ACG创造出来的世界了。 什么是现在的二次元 很多人说现在的二次元是“泛二次元”,可这个”泛“到底是泛到了什么程度呢?这就好像从15年开始,”IP“在圈子里吵得火热,但到底什么是IP?很多人只是知道一个名词或者一个模糊的概念罢了。 有多少真正爆款的IP产生呢? 现在一般指的二次元确实是”泛二次元“,不仅包含着ACGN,还包含着其相关的衍生产物(这不是废话吗?)。也就是这种模棱两可的概念让绝大多数人身处次元壁外,不得其门而入。 为了避免概念混淆,本篇不具体解释“核心二次元文化”和“泛二次元文化”(放到下篇来写),谈谈现在的二次元群体即“泛二次元”群体。 “宅” 大多数情况下,ACG爱好者被冠上了“宅”的标签,外界一般这样看我们“不爱出门”,“就知道看动漫”,“沉迷于虚拟世界”等等。实际上“宅”也分了很多种,“御宅族”应该是相对较早的称呼了,现在大多使用“宅男/宅女”来形容这部分人和长期待在家里不出去的人。并且基于当前环境和舆论等,“宅”一度被加上了变异的色彩。 但是当二次元群体以“宅”自称或称呼别人的时候,一般是指对于某种兴趣爱好的痴迷,有时候也指大触(某方面很厉害的人)。这种倾注了情感的痴迷,不仅支撑着我们可以长时间宅在家,还可以不断的利用现有资源,发展自己的圈子和技能,结识同好,分享兴趣,一起做很多好玩的事情。一般会被称为“动漫宅”,“偶像宅”,“技术宅”等,也会称为“游戏狗”,“单身汪”之类的。(但是我们都有着做现充的觉悟的!) “腐” 这个群体中女性相比男性更多一些(目前表现出来的是这样),这个群体多表现为对“BL”(boy’s love),“GL”(girl’s love)等的喜爱。“腐”和“宅”并不能完全隔离开,会有重合,不过“宅”群体一般更多的关注点在于虚拟世界中,而很可能一个并不宅的妹子有天你突然发现她其实是腐的,并且长期YY你和其他男同事(orz)。 “Coser”,“lo娘”,“舞见” 作为一枚野生后期,对这部分群体和我接下来要谈的“唱见”等了解也相对多了一些。Coser(玩Cosplay 的人),lo娘(喜欢Lolita穿衣风格的人),舞见(一般指宅舞的舞者)都逐渐变多,这也和大众对这个群体的接受度逐渐变高了有关。这个群体相对的要辛苦一些,喜欢某些东西,喜欢到了不满足于看,而想自己亲自去尝试。 Coser需要经过服装,道具,化妆等工序打磨,而一般在网上直接买的衣服可能不合适还需要自行修改。这三类人都很容易被外界的人投以另类的目光,但是也比较容易通过活动或者交流找到同好。毕竟这些都是既看脸又走心的形式,既传达自己对原作的感情又能将自己美好的一面示人。 “唱见” “唱见”(投稿翻唱歌曲的业余歌手)也越来越多,而且很多也唱的非常棒!以动漫的OP,ED投稿较多,目前有很多的应用或网站都提供了方便的音频发布,电台之类的功能,比较容易获得粉丝。 “网配” “网配”(网络配音)大多是基于网配文或某些小说进行PIA戏,也有一部分人会选择制作广播剧之类的。 其他 其他就是一部分我不常接触或者人数相对较少的群体了。 为什么是二次元群体 在大致了解了当前二次元群体之后,我们来谈谈为什么从二次元群体入手 群体基数大,覆盖面广。在上面我已经大致说过了,看看自己的周围,随便上微博、贴吧之类的看看,大抵就知道了; 增长迅速。看看当前A、B站,腾讯动漫等的用户增长量也可窥一斑; 付费能力强。只要戳中了二次元群体的G点,付费能力非常强,以Coser和lo娘为例,一般都会花上万块在服装上; 自我传播能力较强。二次元群体大多活跃在手Q,微博,贴吧等平台上,且有自己的圈子,自我传播能力相对更强; 用户相对忠实。由于二次元文化作为一个独特的亚文化发展起来,当前占据主体的还是90后,00后,碎片化时间相对较多,且更容易在应用/网站中形成关系链; 二次元作品相对可扩展的面更广,更容易找到增长点。 可能发展的方向 资源平台 二次元群体本就对资源有非常高的渴望和期待,当然也很挑剔,有着很完整的选择要求,用资源吸引到用户,才是解决了用户的需求。 周边产业 二次元群体对于正版周边产物是有着强烈需求的,但是目前无论是市场还是价格上都不是很好。 同人 同人资源对二次元文化的发展是有着相当大影响的,若能吸引到用户,将可能迎来爆发式的增长。 以上都是我一本正经的胡说八道,小心误入歧途 2333

2015小回顾

时间过得很快2015年最后一天。 还是继续给自己做个总结吧。 去年也有做总结,不过没有发布到Blog罢了。 2015年初在公司定了两个主要目标: 对工具的打磨 计算机图形学 第一个目标算是基本完成,现在在用的工具都很顺手,效率能提升很多,而且用起来也很爽!现在也还会再尝试一些其他的工具,或者提升现在使用的工具的便利性。有时间的话可以写篇文章介绍一下。第二个目标目前没有什么进展,可以考虑是不是要留到今年了XD,当然还有一些其他自己定的目标基本完成,大致写写自己的收获好了。 收获 (大致按照时间来写吧) 读了一部分 Nginx 的源码,算是对Nginx有了比以前更深入的认识,但是现在回过头来再重新审视的话,发现对它的理解还远远不够,还需要继续深入。 学习了 Haskell, Haskell我觉得是一门非常棒的语言,非常值得学习,通过对这门语言的学习,改变了我的一些思维方式。除了用它写过一些小程序以外,还没能在工程中大量使用,今后继续加油,尽量引入到工程中~ 学习了 Node.js, 同样的还缺乏工程中的实践 学习了 Backbone.js,AngularJS 和 ReactJS. Backbone记忆中应该是5月份左右学习的,ReactJS要晚很多。写Backbone的时候想起来了之前用过的Riot, 轻量,随意,但是要写完整的应用相比AngularJS之类的要写很多代码。 开源了qyweixin和一个HTTPmultipart的库,下载量各自也都已经几千了,上次在评论中也看到确实有人在使用~ 还是蛮开心的啦! 学会了使用 Docker,也准备学习一些内部机制之类的东西。 还在翻译中的Tornado 4.3文档也会尽快抽时间翻译完成的. 此外还有学习了Lua和正在深入学习的Shell,还有一系列的框架和库, 正在用来写一些自己的小东西。 1383 Contributions. 运营了公众号 TheMoeLove 还有一些目前还无法放入*收获*这一项中的东西,在2016年尽量都再多积累一些。 另外,下面这部分也非常的重要! 认识了很多好玩的小伙伴,从他们那里也学到了很多东西 工作中同事们都很好,感谢给予的帮助~ 总结 学会拒绝。一些事情是可以容忍的,但是要遵守原则,也要考虑时间成本和效率问题。 学习和思考。这一年之间其实学到的东西也蛮多的,只不过有些东西没能在工程实践中应用,效果不是很明显。多思考,做个靠谱的人,尽量不在相同的地方摔倒两次。 多读书 尝试新东西 多深入一些。浅尝辄止不是应该有的状态。 合理安排追番时间 2333