思源宋体 css

思源黑体
font-family: 'Noto Sans CJK SC', 'Noto Sans CJK', 'Source Han Sans', source-han-sans-simplified-c, sans-serif;

思源黑体 + Google Noto Sans
font-family: 'Noto', 'Noto Sans CJK SC', 'Noto Sans CJK', 'Source Han Sans', source-han-sans-simplified-c, sans-serif;

思源宋体
font-family: 'Noto Serif CJK SC', 'Noto Serif CJK', 'Source Han Serif SC', ‘Source Han Serif’, source-han-serif-sc, serif;

思源宋体 + Google Noto Serif
font-family: 'Noto Serif', 'Noto Serif CJK SC', 'Noto Serif CJK', 'Source Han Serif SC', ‘Source Han Serif’, source-han-serif-sc, serif;

一次远程外包的烂尾记事 — 北京『齿轮易创』合作

这是我第一次与公司平台合作外包,原本我是期望尝试能和国内成熟稳定的团队或平台达成长期合作,然而……

2016-12-02

从“一早一晚”社区某工作贴 http://yizaoyiwan.com/discussions/1085 联系对方。对方发我一个项目文档和当前项目代码库(仅完成用户注册——包括前后台——功能)。

chilunyc-20161202

随后有一次简单电话联系,我要求提供了项目的粗略原型和java代码基本项目配置以了解基本技术方案。

2016-12-05

提供的原型和文档都太粗略,我根据文档整理了一个开发功能的脑图,并评估了工作量(23工作日),得到需求方的认同,但要求25K只能支付22K,我接受了。同时以客户为理由,要求分3期付款,我同意了。

工作量确认邮件

我询问要求齿轮提供项目进度安排和部分业务逻辑说明。

2016-12-07

有两天没消息,我再次询问,齿轮提供了第一期的工作内容安排,沟通一致。

2016-12-13

和齿轮易创通过法大大平台签订合同,上面明确了合同金额和三期付款事宜。

2016-12-21

款项拖了几天,齿轮一下打了总款的50%(1W1),项目经理希望我退款,这当然没什么问题,我直接退了多的(6.5K)。

2017-01-12

一期的内容已经完成很久,一期尾款到账(4.5K),但我要求的二期的开发内容和部分业务功能问题一直没提供,中间甚至停工了2天。我按最初的原型继续开发了后续相关功能,后来经理说他生病了住院,另外说项目内容已经发我了,然而我并没有收到。到这时候项目功能已经差不多了,但是按前面说的还有第三期,我提出这个疑问,经理说用户还要增加其他功能,我就没提其他意见。

2017-01-19

经理突然说3期不做了,并承诺除了2期尾款项目尾款也会给,这当然没问题。整个项目除了订单打印和订单数据导出功能(评估1工作日),其他都已完成。

2017-01-24

临近春节,余款一直未到账,虽然经理一再保证,但余款还是等到春节后再到账,且只有2期款(7K)。经理又说再争取,然而并没有下文,就此烂尾。

看法:

  • 双方完全是基于工作量评估报酬,对此应无疑义。
  • 干多少活拿多少钱,给客户白干活的情况都不少见,但并不能因此不给干活的人发工资。
  • 甲方在2期未明确工作量安排,以3期开发来模糊工作量安排评估,有蓄意误导欺诈之嫌。

结论:

  • 与人可以为善,对事必须严格。个人经验不足,中国人人情面子观念作怪,因为1期账款到位顺畅,后期未严格按工作量评估进度要求账款到位,做事没到位。
  • 工作的开展和账款到位应严格和协定一致,如不一致应及时止损。
  • 考虑到中国法律对惩罚性赔偿严重不到位,我也不准备为了这6K去花时间,总结经验,吸取教训,保护好自己就好。

接这个单子之前查了下,齿轮易创 http://chilunyc.com/,拉勾招聘 https://www.lagou.com/gongsi/138641.html,还有真格投资,百度谷歌上都有不少采访软文,在北京这么一个中国核心资源所在地,为什么也做的这么low呢?

是不是代表中国的开发外包市场环境依然严酷,还是处于蛮荒生长的阶段?

后续 >
2017-03-20 和项目前端兄弟聊了下,这位在北京的兄弟准备去齿轮公司找人理论。
2017-03-24 这位兄弟和我微信聊,拿到了一半款。
2017-03-25 齿轮的工作人员联系我,最后支付了我一半尾款。支付一半当然比完全不支付要好,但我的看法仍如前。

java web develop tips

最近赶鸭子上架做一个java web项目,基于spring/spring mvc/velocity/mybatis/mysql,突然想起多年前曾为一个做项目经理的童鞋拟了一个java web开发技术点的脑图,再翻出来看看。

为MAC打造舒适的Python开发环境

最近准备着手新的Django项目,想着建立新的virtualenv开发环境,再又考虑到尝试使用Python3+的可能,google了一些MAC上建立多版本Python开发环境的文章,尝试了一些新东东,和大家分享。

不要覆盖系统自带的Python版本!

MAC系统本身自带有Python库,且和系统集成度较高,为系统稳定考虑,无特殊需求不要覆盖系统自带的Python库。

若有疑问可google各种覆盖系统带来的奇葩问题。

配置栈

1. Xcode Command Line Tools

这是MAC开发上必备的工具库,提供gcc/llvm编译库及工具,没有这个是无法在MAC上编译相关程序的。如果MAC没做过开发机或新升级,请安装更新该工具库。

可在developer.apple.com登录后下载安装包安装,或在app store下载xcode安装,或运行下面命令行尝试安装

$ xcode-select --install

检查安装是否成功

$ xcode-select -p
/Applications/Xcode.app/Contents/Developer #显示此结果则说明已安装成功

或运行gcc查看工具版本

$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix

特别声明,若你有靠谱VPN,下面请全程开启……

2. MAC下软件包安装管理工具brew(ruby)

MAC下软件包安装管理工具常用 MACports / brew,两者优劣如何选择请自行google判断,这里用的是brew。

由于brew是基于ruby开发,因此需要基本的ruby环境。如果你对ruby开发相关毫无兴趣,可通过Ruby官网下载包直接安装。若有可能使用ruby开发或尝试ruby环境下的各种程序请使用更规范的ruby环境配置程序——rvm

$ curl -sSL https://get.rvm.io | bash
$ source ~/.rvm/scripts/rvm

检查是否安装正确

$ rvm -v
rvm 1.26.11 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

安装最新的ruby版本

$ rvm install 2.2.1

设置默认版本

$ rvm 2.2.1 --default

检查下

$ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]

安装brew

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

3. 安装 pyenv

pyenv是管理Python版本安装管理工具

$ brew install pyenv

将下面代码加入shell启动脚本 .bash_profile / .zshrc

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

重启shell

$ exec $SHELL

安装管理多版本Python常用操作

$ pyenv install --list  # 查看可安装版本
$ pyenv install 2.6.9
$ pyenv install 2.7.9
$ pyenv install 3.4.3
$ pyenv versions 
* system (set by /Volumes/Home/linnchord/.pyenv/version)
  2.6.9
  2.7.9
  3.4.3
$ pyenv uninstall 2.6.9 # 移除
$ pyenv global 3.4.3    # 设置为全局,覆盖系统,慎用!
$ pyenv global system   # 恢复系统版本
$ pyenv local 3.4.3     # 设置当前目录生效Python版本
$ pyenv local --unset   # 取消
$ pyenv rehash          # 安装新版本或其他软件包后需运行
$ pyenv shell 3.4.3     # 设置当前脚本生效版本

4. 安装 pyenv-virtualenv

pyenv-virtualenv 是作为 pyenv 一个插件存在的虚拟环境管理工具,它统一将虚拟环境配置到 ~/.pyenv/versions。

$ brew install pyenv-virtualenv

将下面代码加入shell启动脚本 .bash_profile / .zshrc

eval "$(pyenv virtualenv-init -)"

重启shell

$ exec $SHELL

常用管理操作

$ pyenv virtualenv 3.4.3 env343
$ pyenv virtualenv 2.7.9 venv279
$ pyenv virtualenvs                 # 显示当前虚拟环境列表
env279 (created from $HOME/.pyenv/versions/2.7.9)
env343 (created from $HOME/.pyenv/versions/3.4.3)

$ ls ~/.pyenv/versions
2.7.9  3.4.3  env343 venv279

$ pyenv activate env343             # 激活指定虚拟环境
$ pyenv deactivate                  # 关闭当前虚拟环境
$ pyenv uninstall env343            # 删除

5. 开发流程

$ pyenv virtualenv 3.4.3 newproject
$ pyenv activate newproject
$ pip install -r reuirements.txt
$ mkdir newproject
$ cd newproject

Code lucky!

uwsgi 1.9+ mountpoint error

最近团队开发新产品,顺带折腾更新了服务器和整个开发环境版本。

运行python的服务uwsgi从0.9+升级到了最新的1.9+,发现一个bug,折腾了我一个通宵……

uwsgi原有的版本,vhost模式下,可以在nginx中配置SERVER_NAME来指定服务名。


location / {
    include uwsgi_params;
    uwsgi_pass unix:/var/run/uwsgi-python/sock;
    uwsgi_param UWSGI_PYHOME /usr/local/pyenv/app;
    uwsgi_param UWSGI_CHDIR  $document_root;
    uwsgi_param UWSGI_SCRIPT app_name:app;
    uwsgi_param SERVER_NAME app_name;
}

该配置会指定服务名并在uwsgi启动日志中显示

WSGI app 0 (mountpoint='app_name')

但是在最新的uwsgi v1.9.12中,该配置失效,无法正确的配置mountpoint,日志会显示

WSGI app 0 (mountpoint='')

这会导致访问指定地址时在不同的app之间跳来跳去,无法正常使用。经测试1.9.12~1.9.7均存在同样问题,1.9.5版本以下会指定server+port替代

WSGI app 2 (mountpoint='domain_name:8080|')

我在github上提交了该bug,https://github.com/unbit/uwsgi/issues/321,作者修复之前建议大家先使用1.9.5版本。

NOTE:
作者已经修复了该bug,不过仍使用了server+port的模式,不知道是出于什么理由。目前版本已更新到1.9.13,通过pip install -U uwsgi可更新安装。