网络寻租

Programmer, Gamer, Hacker

神秘学

| Comments

玄学和风水人人都在谈,人人都不了解,但是人人都信,这是顶级的神秘学。

比如说易经。易经历史上发挥了很多作用。 易经的特点在于不完整,在于不清晰。普通人弄不懂易经在讲什么。 这样易经的解读者可以以自己想要的方式去解读。 解读本身不是难的地方,难的地方在于让人相信自己的解读。

方法可以是树立权威。 给自己加上各种名头,可以是弄个教授身份,可以建立门派,通过大量的弟子来撑场面,也可以和名人官员来往。 传播信息的时候混杂一些专业知识,通识,心灵鸡汤,有用的东西要有很多。这样培养忠诚度。 到一定程度就可以收割了,让信徒来给自己买单。

还有一种效果是自我催眠。很多人去看书,都说从书中学到了很多。 其实不是这些书教会了你,而是你假借这些书教会了自己。

自动更新程序功能思考

| Comments

对于有经验的程序员来说, 很多看起来比较简单的功能,实际做起来会非常复杂。 而对于有经验的工作者而言,任何事情都是这样的。 把事情做好需要的精力,是把事情做完需要精力的无数倍。 同时带来的好处也很明显:卓越成果相比普通成果来说,有很高的溢价。

回到正题。这里整理一下windows下面写一个可以自己自动更新的程序需要的考虑。

首先,windows下面程序不能自动更新自己,程序开启的时候会锁住程序的可执行文件。 因此,需要先做一个启动器,通过启动器来负责调用程序和更新程序的事情。 同时这个启动器必须足够快足够小。我选择的是autoit, 如果有更多开发资源,最好还是用C++写一个windows原生程序。

启动器的逻辑是这样,分成检查更新和更新部分。 用户开启程序,实际是调用启动器的更新部分后再启动程序。 程序本身运行的时候,再定时监控是否有更新,实际调用启动器的检查更新部分, 这样关于更新的逻辑都丢给启动器,模块化好一些。

检查更新的逻辑比较简单,会去访问更新服务器上面一个版本文件, 和本地程序的版本做比较,如果本地更旧,就下载程序到一个new_program目录下面。 定时检查更新的时候需要随机化检查时间,防止无数客户端同时更新拖垮更新服务器。

更新部分会在本地判断是否存在new_program目录,有的话就替换掉旧的程序, 执行安装脚本做一些系统相关的配置,再启动。

其中为了防止旧程序开启把旧程序目录锁住,需要关闭旧程序,或者跳过这块的更新。 启动器本身也要能够被自动更新掉,逻辑上面需要照顾到这个问题。 启动器对应的一些参数,比如更新服务器地址,更新目录,最好做成配置文件,方便修改。

关于相亲活动

| Comments

这些年参加过不少的相亲活动,这里整理一下我对这些活动的认识。

需求

相亲,目的就是在一定的时间范围内搞定终身大事。 虽然说不同人有不同的标准,一般还是会列一些项目,用来做快速选人。 包括以下方面:

  • 人:年龄,第一感觉,性格,风格
  • 背景:地域,什么工作,收入,父母状况,家境

依据各人的状况,加上一些偏好,比如身高,地域,职业,特性等等。

这个时候,最好能够有大量的满足要求的人选,可以尽快选择出合适的对象。

相亲形式

首先列一些我觉得不是很好的形式:

人民广场相亲角。形式是绝对的硬件条件匹配,年龄籍贯工作收入有房无房学历等等。 父母上场。比起相亲来说,更像是父母消减焦虑的工具。靠谱程度?大海捞针吧。

8分钟。形式就是一堆男男女女,在咖啡厅里面,女生3-5人坐在一桌,男生每8分钟轮换。 在这8分钟里面,互相介绍。好处是可以看相当多的人,坏处是8分钟根本来不及了解对方。人也很杂。 一个晚上人看得挺多,但是一个都不了解。

小规模相亲活动。参与人员男女比例1:1,人数几十人。各种小游戏。 参与后我觉得就是来玩玩的,游戏中怎么可能了解人,并且人数也不是很多, 主题太功利了,比较容易惹来反感。

然后是一些我觉得好的形式:

暴走团。周末出来在城市里面到处走走聊聊。 大量的单身适龄男女(有对象的要么不来要么一起来),大量的自由聊天和组合机会。 一次活动4个小时,近百号人你可以从头聊到尾,每次活动人都不一样。 问题是参与没门槛,人比较杂,如果你要有一些条件限制的话就比较难筛。

派趣网:一个相亲网站,用户审核过,必须是985学校,要放本人照片,介绍等等。 大量高质量的人可供你接触。可惜现在不做了。

我觉得好的方式

首先要聚集靠谱的人。相亲难,首先难在找人。然后难在筛人。 首先,相亲市场需要搜集满足互相匹配人群,比如男的要身高,稳定工作,有房之类, 女的要长相过得去,教育水平。还有就是人要清楚根底,让参与者能够放心加入。

之后是出来见面。一次一个人效率太低,还是要集体活动。

  • 活动本身不能直接以相亲形式,太露骨了,并且功利远离浪漫,不容易产生爱情火花。 可以读书,旅游,徒步等形式。
  • 活动要有破冰环节,防止人聚集在小团体里面,要打散开,让人之间产生互动。
  • 活动还要有大量自由聊天,自由组合时间,方便大家互相接触,互相了解。
  • 还要有互动机会,比如一起做一些事情,这样能够从行为方式上面达到互相了解的目的,只是聊聊,是不能看清楚一个人的。

可能还需要一些辅助。

  • 常识普及:相亲时限,如何交流,女性心理男性心理。可能90后这方面的问题不大,80后还是需要一些学习。
  • 中间人:沟通有障碍的时候,需要中间人作为意愿传达。这个中间人最好是两个人的朋友。

现在没有看到满足这方面需求的专门性质的组织,但是一些非专门的组织在满足上面需求做得比较好, 比如各种学生社团,公益组织,兴趣方向的俱乐部等等。有相亲需要的人可以好好利用这些机会。

关于服贸协定

| Comments

最近台湾因为服贸的事情闹得比较大,一直都没有跟进这件事情。周末花时间看了一下资料。

这里整理一些资料:

看了半天还是没有头绪。这是我的理解:

  • 什么是服贸?大陆和台湾签订的贸易互相开放协议
  • 源头:台湾政府希望借由这个协定,让台湾经济有起色;大陆希望通过这个协定,满足大国策略的需要
  • 民众反对原因:
  • 不满足过程正义:全程黑盒,民众不知道状况,也没有监管。
  • 服贸协议本身会带来严重的后果:台湾本地会收到很大冲击,甚至可能让台湾香港化。

我的看法:首先我还是不了解服贸协议本身,也不了解可能带来的后果。 网上没有搜索到相关的资料(欢迎大家给出),所以我的看法就是:不置可否。 请问大家是否有收集到比较好的解释性质的资料?非常感谢。

这个过程还是知道了一些东西,比如台湾这些年发展得不好,年轻人基本台湾认同了。香港不行了。

求视线范围的算法

| Comments

前段时间看到有一个游戏,玩家必须保持自己在监控设备的视线范围内。 画面上面展示的效果是高亮出监视器的视线范围。如图:

我思考了一下如何做到这点。首先定义问题: 给出墙壁的边,以及若干监控点,需要实时渲染出监控点的可视范围 (可以用一系列的三角形表示)。

求视线范围的三角形列表,可以从房间所有墙壁的顶点往监控点做视线线段, 找视线线段和墙壁边的连接中距离监控点最近的点, 然后可视范围就是这些点和监控点组成的三角形了。

填充三角形,可以用扫描线算法。把三角形根据水平线拆分成2个, 然后从顶点往下做扫描线,求扫描线和两条边的交点,然后填充里面的区域。 如下图所示:

求线段相交点的算法网上搜索一下就可以得到。

估计一下算法复杂度,墙壁边是m(4<m<240),求交点是m*m,应该是上界。 常数应该比较大,包括求交点,找出距离监控点最近的点。 可以优化一下参数,比如变形求交点算法(做垂线),快速找到距离监控点最近的点。

大家想想看有什么更好的解法?

Pitfalls of Programming

| Comments

There are some dangerous zones there, waiting for a careless programmer to fall, I list some of them, see what you get.

First one: spend too much time on the detail. We all say the Devil is in the detail, and it is so as we write program. Some tiny little misunderstood of concept, or miss taking care of one small condition will lead to a fatal error. And it makes programmer addictive to the detail: each fraction of detail brings some joy. Lots of programmers spend enormous hours on seek more details, in the language, in the library, in the code, so forget to do the most important job: getting things done.

Second one: Chase new things. Yes, nodejs is cool, angularjs is cool, mongodb is cool, html5 is cool too. But is it stable? Is it fits your needs? Can it survive long or just a flash in the sky? Think twice before you use it (or even start to learn it).

And the third: language or tech hater. Windows sucks, PHP is not cool, Java is ugly. Maybe that’s true, and take it with no deep thinking brings you a pair of coloured glasses. Rational people think at the margin, consider things in different angles, Maybe the thing you hates is the best solution, even compare with your favorites.

There are also other pitfalls, like: be a jack of all trades, code before think, etc. Senior programmer meets them all, and with experiences of the past, they learn not to listen to the siren’s songs.

关于Rails

| Comments

这几年世界上很多东西都被软件改变了(当然前几年也是), 软件开发成为了一个很酷的职业。对于一个程序员来说,就算改变世界的软件不是自己做的,一般来说也还是会有一定的自豪感。

我们Rails程序员也是,Rails基本上代表了网站开发领域的最先进技术吧。而网站开发又是软件领域潮流最前的方向之一。 Rails很酷,Ruby语言也很酷,开发效率非常高,工作得很开心。

但是这只是我们的想法。实际工作中,我们大部分的时间在做前端,写一些简单的CRUD, 然后做出来一个电商网站,丢给老板或者客户。做一次还好,但是学了Rails就要重复做这些, 不然怎么对得起学习Ruby,Rails,Javascript,hamlsasscoffeescriptjQuerybootstrapangularjs。。。这些鬼东西投入的学习成本?

作为一个Rails开发者,做了这么久,我不由反思自己在干什么。我在做网站。我在用Rails开发网站。 从本质上面来说,不管Rails多酷,做网站多酷,写Ruby多酷,都不能改变我在做一件低技术含量的活的事实。

对的,做网站是一个低技术含量的事情。

做网站不容易,需要学习类似于html,css,服务端开发,Ruby,mysql等等东西。 做网站很复杂,因为你需要把这些东西结合起来。

所以网站开发者的工资会很高。但是,这也改变不了做网站是一个低技术含量事情的事实。

上面列出来的技术,心智正常的人,拥有初等的英语读写能力,只要愿意投入时间,都能够掌握。 这也是为什么有那么多的人,不管他是医生,老师,卡车司机,都能够成功转职成网站开发者。

而其它行业?比如行医,需要进入医学院,经过长时间的学习,训练,阶段性地考核, 最后生存下来的才能成为医生,并且职业过程中每年都有各种审核和考试。 比如电气工程师。有多少网站程序员能够掌握微积分?没有需要对吧。网站程序员只要会加减乘除就好了。 就算是本行业,知识也分容易掌握的和不容易掌握的。 比如不是写脚本语言的那种真正的程序员,至少懂机器,至少知道程序是怎么编译的。 Rails程序员有多少知道微机体系架构,Ruby程序可执行文件里面到底有什么东西的?都被抽象掉了吧。

从掌握的知识深度而言,Rails程序员,其实和木工类似。

人人只要愿意学,就可以当木工。手艺好坏有区别,但是再怎么有差异,做的都是木工活。 你可以说自己的工具多么好用,自己掌握了很多技巧,做东西多么快多么好,最后带来的价值就还是一个木工的价值。

但是确确实实有很多网站改变了世界,它们的价值是从哪里出来的? 这是一个玄妙的问题。为什么都是木工活,有的木工活就是那么值钱?

有的是发现了巨大的需求,并且想办法满足了; 有的是对行业深刻的洞见,把行业颠覆了; 有的是做高技术含量的东西,碰巧用了网站这个形式; 但不管怎样,有玄机的地方都不在木工活上面。

最后,结论是什么?

  • 首先,看看自己掌握的技能,是不是和木工活一样,任何人花时间都能学会,如果是的话,就不要骄傲。
  • 然后,因为基于自己技能,创造出的东西是木盒子还是托卡马克引擎,靠的是非木工活其他的技能,因此要多看书,多向其他专家请教,多思考多实践。
  • 工作的时候要时刻警惕,自己是在做木工活的部分,还是有价值的部分?尽量不要浪费时间。

以上内容纯属本人每周写作练习,里面有很多逻辑谬误和语法错误,请勿动气请勿当真,谢谢。

Factorio介绍

| Comments

最近发现一个好游戏factorio,消耗了很多时间在它上面。这里整理一篇介绍。

factorio是一款集成了资源采集,流水线运输,自动化生产,基地防守的2D游戏。 玩家在一个自动生成的地图上面,采集资源,合成物品,搭建各种自动化采集,合成,运输的机械。

图示

玩家可以采集资源

可以制造自动采集资源的机器

资源可以通过各种机器,转变成其他产品

制造生产线

生产线需要电力

复杂的生产线,生产运输带

很多物品需要研究之后使用,研究也需要生产线

9.0版本新增加的石油生产线

一个完整的生产线例子

上手

  • 官方网站有demo下载,如果觉得好玩可以去购买正式版。
  • 遇到问题可以去查wiki页面,也可以去官方论坛
  • 游戏提供mod支持,如果觉得原版不过瘾,这里有一些mod可以下载。个人推荐dytech。

攻略

  • 这里有优化的science-pack生产线设计方案。

作弊

``或者/`进入控制台模式,然后可以用这里的命令。

我主要用的是:

  • 改变游戏速度:game.speed=1

  • 获取物品:game.player.insert{name="iron-plates",count=100}

一些常用的物品列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
装备:
power-armor-mk2
basic-exoskeleton-equipment
fusion-reactor-equipment 
basic-laser-defense-equipment-3
energy-shield-mk2-equipment

电力:
substation
big-electric-pole
solar-panel

科研:
lab
science-pack-1
science-pack-2
speed-module-3

原料:
steel-plate

防御
laser-turret

robot
roboport
construction-robot

敌人
biter-spawner
creeper-spawner

解一道算法题

| Comments

最近在学算法,看一本算法竞赛书,看到一定阶段来做算法题,随机抽了一道简单的coj 1132来做。

题目是求解一个数的所有除数组合出来的数之和(不包括自己),比如:20 = 2 * 2 * 5,结果a(20) = 1 + 2 + 4 + 5 + 10 = 22。

首先我采用硬解的方法,求出所有的除数,然后排列组合一下。发现超时了。 回去看了一下题目,发现:测试用例数量equal to about 2*10^5,硬算的复杂度大概是n3*log(n),难怪算不出来,只能去优化算法了。

排列组合题目一般来说会有重合子问题,可以用动态规划来优化。先列出状态转移方程看看:

假设要求解a(n),n可以拆分成除数d1, d2, … dk (dk > dk-1),每个除数的数量是m1, m2, …, mk,那么a(n)结果和a(p)相关,其中p = d1^m1 * d2^m2 ... * dk-1^mk-1,拆分一下a(n):

a(n) = sum( d1^s1 * d2^s2 * ... * dk-1^sk-1 * dk^sk ) (所有可能的 sk <= mk)
     = d1^m1 * ... * dk-1^mk-1 + sum( d1^s1 * ... * dk-1^sk-1 ) * dk^sk
     = p + a(p) * (1 + dk + dk ^ 2 + ... + dk ^ mk)
     = p + a(p) * (1 - dk^(mk+1)) / (1 - dk)

题目中进行了大量运算(n < 5*105 ,其中2/5的值都需要求解),n利用到旧的p的概率很大, 又能够减少一个级别的复杂度,缓存a(p)的值到数组就可以了。

写程序的方法:每次计算a(n)都会先拆分除数列表,保存到一个vector数组里面。 然后调用a(p),算出来的结果缓存到一个结果数组中。

之后进行优化:

  • 发现其实不关心d1到dk-1的值,只需要dk就行了,mk可以循环除得到,那么只需要保存每个n最大的除数即可。

  • 为了增加运行速度,求除数先维护一个素数数组,这样不用从2开始一个个除了。但是修改之后发现,计算素数数组的复杂度超了,反而不如原先算法快。

代码在这里我的答案时间消耗比最快的算法多将近一倍,不知道大家有什么更好的算法没有?

结论:

  • 首先看清楚题目,包括:算法具体内容,示例是否符合自己猜想的算法,各个参数的范围。参数的范围算是一个坑,有一道算法题目是算a+b,然后没有给参数范围,无数人就栽在这上面,因为a和b是天文数字几百位。。

  • 然后列出具体问题,寻找规律,列状态转移方程。空想比较慢,在纸上面看着一个实际问题方便寻找规律,验证算法正确性,以及考虑各种边界条件。

  • 一定要计算复杂度。比如上面我打算先算素数优化执行效率,但是求素数的复杂度更高,优化后速度变慢了。

解算法题比CRUD有意思多了。

Programming Chaos

| Comments

Programming, as a career, faces more chaos compares to other professionals.

First, everyone can start programming after several months of study, it makes programmers are a group of people vary in coding abilities, basic understanding of computer science, and engineer training.

Programming as a professional, start only decades ago, principle for this domain, like technology, tools, best practice, is still under developing.

And IT industry always changes dramatically, that makes programming career path is not as clear as other professionals, many job positions, like big data analyst, not even existed several years ago.

The chaos brings both risk and opportunity, make programming career both interesting and challenging.