• 量产型炮灰工程师 at 2017年5月29日

    一行 JavaScript

    Array.from(Array(100), (_val, index) => console.log((index + 1) % 15 == 0 ? 'FizzBuzz' : (index + 1) % 3 == 0 ? 'Fizz' : (index + 1) % 5 == 0 ? 'Buzz' : index + 1))
    

    一行 Ruby

    (1..100).each { |i| puts (i % 15 == 0) ? 'FizzBuzz' : (i % 3 == 0) ? 'Fizz' : (i % 5 == 0) ? 'Buzz' : i}
    

    其实连一行 Java 都可以

    IntStream.rangeClosed(1, 100).forEach(value -> System.out.println(value % 15 == 0 ? "FizzBuzz" : value % 3 == 0 ? "Fizz" : value % 5 == 0 ? "Buzz": "" + value));
    
  • 量产型炮灰工程师 at 2017年5月28日

    MIT 之前把经典的 6.001 课程给换了,那门课原先就是用的 SICP 作为教材的经典基础课程。然而换课后该上的内容并没有少,只是把语言从 Scheme 换成了 Python。

  • 所有涉及时间的库都要充满各种特殊情况不停的手动追加。比如 Stack Overflow 有个问题说遇到了一个诡异的 bug,两个只差 1 秒的时间 Java 返回了 343 秒:

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        String str3 = "1927-12-31 23:54:07";  
        String str4 = "1927-12-31 23:54:08";  
        Date sDt3 = sf.parse(str3);  
        Date sDt4 = sf.parse(str4);  
        long ld3 = sDt3.getTime() /1000;  
        long ld4 = sDt4.getTime() /1000;
        System.out.println(ld4-ld3);
    }
    

    出现这个问题是因为系统时区是 Asia/Shanghai。而民国17年(1928年),原中央观象台的业务由南京政府中央研究院的天文研究所和气象研究所分别接收。天文研究所编写的历书基本上沿袭中央观象台的做法,仍将全国划分为5个标准时区,只是在有关交气、合朔、太阳出没时刻等处,不再使用北平的地方平时,而改以南京所在的标准时区的区时即东经120°标准时替代。(来源)

    显然这种变化全部都是硬编码进库的,同理的还有 UTC 的各种闰秒。所以一个时间库要做好,维护的成本相当高。同理像 Rails 中提供的类似于 3.hours.ago 都是不考虑闰秒的,如果你的系统对时间要求很高的话,就容易爆炸。

  • 有个比较奇怪的地方是 Crystal 的类型推断,这几乎是这几年最奇怪的类型推断了。举个例子来说,如果这是一段 TypeScript 代码。

    function test(param: String | number) {
      if (param instanceof String) {
        return 'Oops'
      }
      return param * 2 // 此处 param 必是一个 number,所以不会有错误抛出
    }
    test(1) // => 2
    test('wat') // => 'Oops'
    

    而 Crystal 中

    def test(param : String | Int32)
      if typeof(param) == String
        return "Oops"
      end
      return param * 2.0 # no overload matches 'String#*' with type Float64
                         # Overloads are:
                         #  - String#*(times : Int)
    end
    
    puts test(2)
    puts test("wat")
    

    无论是把另一个类型放在 return 后还是 else 中都无非规避掉这个问题。也就是说一个方法内某个参数类型的推断并不是基于行的,而是基于方法定义时指定的。这对于一些复杂的情况来说就变得很麻烦,需要大量地依赖重载的方式才能定义完。

  • 5.5 倍速,Sidekiq 爆揍 Celery at 2017年5月27日

    Python 3 的性能在大多数情况下比 Python 2 更糟糕。。。但一旦用上 Pypy 就形式逆转了😣

  • 量产型炮灰工程师 at 2017年5月25日

    突然就风评被害。。。

  • 量产型炮灰工程师 at 2017年5月24日

    接受标注原作者、非演绎、可商用的转发。

  • 量产型炮灰工程师 at 2017年5月23日

    你这话放 PHP 社区和 Java 6 的社区里才没毛病,在 Ruby 社区办培训班,出来这样的人然后说「市场上需要」,市场上没人需要,这就是为什么要喷。

  • 量产型炮灰工程师 at 2017年5月23日

    这个没有考虑在不满足 fizz 和 buzz 的情况下是要输出数字本身。

  • 量产型炮灰工程师 at 2017年5月23日

    可 100.times 是从 0 开始的。并且原题有说要「输出数字 1-100」,在不满足 fizz 和 buzz 的情况下是要输出数字本身的。