• 2017-02-16

    新浪微博劫持iTunes链接加入陌生推广码

    Views: 137 | 2 Comments

    有微博用户抱怨他在微博上面发布的带有自己推广码(可带来佣金收益), 都被微博替换成了某个陌生的推广码, 他自己的推广码被覆盖了!

    @im61: 马勒戈壁的微博,我每天用 @PriceTag应用限免 这个账号发限免应用,链接里带了我的 iTunes 联盟令牌: 1001lsTF 和活动代码 wb_alet,结果发现几乎没有流量过来,刚刚 @图拉鼎 让我分析一下分享链接,大吃一惊啊,微博自动转换短链接,里面悄悄带上了自己的广告代码,我每天分享的收入都跑他口袋去了,无耻

    我验证了下, 确实如此. 验证过程:

    1. 使用新浪微博的官方网页发布一条带 itunes 链接的微博, 该链接并没有at(推广码)参数.
    2. 微博发出后, 新浪微博使用其控制的短链接服务t.cn(whois注册人是 domainname@staff.sina.com.cn )为用户的原始链接生成了短链接.
    3. 该短链接经过展开, 发现原始链接被非法加入了at参数. 该参数是iTunes推广码at=1001lbb6, 可为码的拥有者带来佣金收益.

    这种行为的危害: 新浪微博的行为, 与运营商劫持一样恶劣, 在普通用户不知情的情况下, 带上自己的推广码, 非法获取佣金收益!

    微博(新浪)私自在用户的链接里, 擅自带推广码(iTunes Affiliate Token), 该推广码可能带来佣金收益. 这种方法是被苹果禁止的, 相当于作弊. 大家应该向苹果官方举报, 对该at码进行封禁!

    a0

    a

    b

    Posted by ideawu at 2017-02-16 16:23:17
  • 2016-12-08

    正确的将浮点数转成整数的方法 – 避免强制类型转换

    Views: 943 | 3 Comments

    基于思维惯性, 一般我们会直接利用语言的强制类型转换, 将浮点数转成整数. 事实上, 强制转换在计算机内部的实现相当于直接抹零, 而浮点数经过运算后, 往往不能准确地表示整数, 这会导致严重的问题, 特别是涉及到钱的时候.

    例如,

    double f = 9.99999;
    int a = (int)f;
    printf("%f, %d\n", f, a);
    

    输出:

    9.999990, 9
    

    不要纠结 f=9.99999 是怎么得来的, 你只要记住, 浮点数经过计算后, 很可能就会出现非常小的误差, 这些误差打印出来就能看出区别.

    但是, 在这种情况下, 如果没有误差的情况下, f 应该等于 10. 所以, 一旦你想要将浮点数转成整数时, 绝对不能直接强制类型转换, 而是要先定一个最大误差值 df, 将浮点数加上这个最大误差 df 之后, 再强制转换类型.

    这个最大误差值怎么来? 就是你对计算过程精度丢失的分析. 在某些正常情况, 你可以设 df=0.001. 但具体需要你分析.

    所以, 正确的代码是:

    double df = 0.001;
    double f = 9.99999;
    int a = (int)(f + df);
    printf("%f, %d\n", f, a);
    

    最经典的就是元转成分, 一般人是这样的:

    // 假设元的数值是通过网络传输的, 以字符串文本的形式
    double yuan = atof("1.13");
    int fen = (int)(yuan * 100);
    printf("%d\n", fen);
    

    结果输出是

    112
    

    原因是 1.13 无法精确表示, 在计算机内部只能表示到大约 112.9999999999999858. 强制类型转换, 就是直接抹零, 所以结果就错了.

    正确的做法是:

    // 假设元的数值是通过网络传输的, 以字符串文本的形式
    double yuan = atoi("1.13");
    double df = 0.001;
    int fen = (int)(yuan * 100 + df);
    printf("%d\n", fen);
    
    Posted by ideawu at 2016-12-08 21:15:32
  • 2016-07-06

    代码 Review 要点

    Views: 2717 | 1 Comment

    1. 做代码 Review 的人的责任

    给别人的代码做 Review 的人(Reviewer), 他的责任不仅在于保证代码质量, 更重要地是承担拼盘者角色. 当编写代码的人未来因忙于别的项目, 休假或者别的原因无法在岗时, Reviewer 将负责接手项目, 修复 bug, 增加新功能等. 所以, Reviewer 必须为自己着想, 认真负责地进行代码 Review, 以免日后自己接手一个逻辑不通, 代码混乱的项目(程序员俗话说的"一坨屎").

    2. 做代码 Review 的原则性要求

    首先, 做代码 Review 前, 要了解产品需求, 并从产品需求出发, 整理自己的技术思路, 然后讨论被 Review 者的逻辑, 看看是否有逻辑漏洞. 如果有逻辑漏洞, 那么必须全部打回, 因为逻辑一旦不准确不严谨, 后面的代码就是在建造 bug 而不是开发功能.

    Continue reading »

    Posted by ideawu at 2016-07-06 12:42:51
  • 2016-07-01

    程序员, 不要过度封装!

    Views: 5183 | 4 Comments

    c

    过度封装是程序员最容易犯的错, 因为是否过度并没有固定的数值标准, 只能是有经验的程序员基于科学的判断. 过度封装的危害十分严重, 所以必须重视, 并且极力避免.

    首先, 什么是"过度封装"? 我们知道, 计算机科学领域最称为经典也是最强大的思想便是递归, 分而治之. 但是, 递归本身最重要的因素是: 结束条件. 一生二, 二生三, 三生万物, 总要有终止的条件吧? 不然一辆车不停地急驰, 你怎样上车?

    新手程序员, 特别是非科班出身的文科程序员, 最容易犯了过度封装的错误的原因就是不知道何时适可而止, 脑筋往往不断地分解分解再分解问题, 最后, 你看到的就是这个调用那个, 那个引用这个, 乱七八糟毫无头绪, 三两行代码的函数比比皆是, 自以为封装抽象, 其实是拿捏不好这个度.

    Continue reading »

    Posted by ideawu at 2016-07-01 17:10:26
  • 2016-06-18

    程序员眼中的无所不能与一无是处

    Views: 2793 | 3 Comments

    程序员常见的思维是提供"可扩展性", 这个可扩展性是程序员根据其职业生涯遇到的泪与汗得出的原则, 是一种保护罩. 可是, 这种思维导致其在做产品时, 会有一些不好的经典效果.

    例如, 程序员做的系统, 一般出发点就是做关系数据库表的增删改查. 不管做什么产品, 就是那几样 - 显示列表, 条件查询, 新增, 删除, 更改. 就这几招, 无所不能, 简直没有程序员做不了的系统. 如果你是程序员, 相信你有体会, 这种"无所不能"不会给你带来任何好处.

    我经常见到一些婴儿型程序员, 婴儿型程序员是我发明的一种人类标签, 主要是指那些像婴儿喜欢糖果一样喜欢某项技术的低级程序员, 这种喜爱完全是基于生物本能, 是生物的应激反应, 所以是低级的. 例如, 某些婴儿型程序员因为某语言用缩进方式来表示代码块, 突然就要认干爹了, 这种喜好让人反感.

    Continue reading »

    Posted by ideawu at 2016-06-18 13:47:44
  • 2016-05-11

    有追求优秀之心的程序员

    Views: 3828 | 6 Comments

    前几天我发了条微博, 说目前程序员群体出现太多质量差的个体的情况:

    最近面了多个软件工程师,别看工作经验好几年,看起来好像能“干活”,但是竟然冒泡排序都不会写!这样的行业状况,一旦经济危机爆发,程序员群体估计要仆街。技术当然是成功的关键,但是经济状况出问题的话,行业的价值重估肯定让很多人痛苦不堪。

    这条微博发出来, 很多人表示认同我的观点, 也有不少人表示反对. 反对者的理由无非是"工作几年了, 不必考虑算法和数据结构了吧? 谁还记得这些基础的死记硬背的东西?..."等等.

    我之所以要在让面试者写冒泡排序, 是因为我有追求优秀之心, 同时, 我也根据实际, 不刻意难为面试者. 随着技术的发展, 程序员的门槛不断降低, 这是事物发展的正常规律, 我们也要与时俱进, 不能要求每一个程序员都要像早期程序员那样通过搭导线和打孔来编程. 但我们要随时保持优秀之心, 不能因为技术的发展导致许多连编程逻辑都不具备的人也进来做程序员就自惭形秽.

    在强大的互联网需求面前, 程序员群体供给相对紧缺, 必然导致大量分不清程序变量名和字符串中的单词这种级别的人也能进入行业供职, 而且不要感到惊讶, 这样不具备基础素质的人也能完成某些安排的工作, 也就是"能干活", 不要不解, 不要悲哀, 这就是技术发展的魔力.

    一个普通的程序员能按部就班地编程, 一步一步地完成业务逻辑. 一个优秀的程序员也能完成开发工作. 难道, 优秀和普通之间就没有区别了吗? 不是的!

    普通程序员开发了软件, 业务一跑起来, 怎么商品库存超卖了? 库存也做了判断, 应该不会超卖, 怎么会超卖? 优秀的程序员做出了系统, 无论怎么苛刻的运行条件, 系统都按照设想的那样运行, 数据准确, 业务正确. 为什么? 可能只是因为优秀的程序员做业务抽象, 应用了一项非常普通的技术来保证核心业务模型的准确.

    我的合伙人小张多次跟我说:"我们出来做懒投资, 还没做出产品来的时候就得到投资人的信任拿到千万投资, 没有几个人能做到, 我们认真做事, 出身高贵, 没有理由不感到优越!"

    如果你是一个优秀的程序员, 你理解程序内在逻辑, 你能对业务进行逻辑抽象, 你了解多项技术并合理应用, 你不把自己当做一个仅"能干活"的码农, 你就已经超越了百万甚至千万的同类, 你还有什么理由不认为自己出身高贵, 必将得到更好的回报呢?

    Posted by ideawu at 2016-05-11 12:05:36
|<<<123456789>>>| 1/12 Pages, 69 Results.