25 Matching Annotations
  1. May 2020
    1. Taking this a step further, the perk of having a spike in new users is that their trial periods more-or-less overlap. Usually when a new user signs up, they will poke around the product and maybe send in a bug report, a feature request or another piece of feedback. If I reply and address their feedback by putting in a fix or shipping their requested feature within days, more often than not, they end up converting into a happy customer.

      市场与工程的结合。

      当 Jen 做一轮推广后,会有一波新用户集中注册和试用,他们会提出自己想要的特性或者反馈 bug。这时 Jen 会抓紧把这些建议收集起来,并且在几天内集中精力开发和修复,并在用户的 15 天试用期结束前将这些功能发布,再通知一波用户。此时用户的转化率比较高。

      这是个很聪明且实诚的方法。

    2. Something that I’m glad I didn’t spend the time to automate at all was the referral program. If an existing user refers a new user and the new user subscribes to a plan, then both users will receive credit for 1 month. In the end, the referral program only brought on 11 extra users. It was not a pain at all to manually process rewards for those who did. If I had spent time conjuring up all the edge cases and automating this process, it would not have been worth the time investment.

      可能延长时间不如降价来得有效果?

    1. But I’ve noticed that my working cadence is, I’ll be deep into a major feature or maybe a group of improvements that I’d like to make on a particular feature and I’ll work on it for three days. Once I deploy and I notify my users, it’s like this wave comes crashing down and I lose the motivation to work a little bit. I think that’s my body telling me, hey, I need a break. So my schedule is basically work really hard for three to four days and then take a day, day and a half off. I find that that works well for me.

      高强度工作 3-4 天,休息一天

    2. On the subject of talking to your friends and family and trying to get accurate feedback instead of having them telling you what you want to hear so you feel better, there’s a whole book called The Mom Test that I highly recommend.

      The Mom Test 一书教你如何从亲人或者朋友口中获得真实的反馈(而不是他们照顾你的情绪而给出虚假的好评价)。

    3. But I think you also bring up a good point that a lot of people feel that the personal finance and budgeting app space is oversaturated. I don’t think that at all, because I feel that personal finance is a very personal thing. Everyone has their own way that they like to do things. I don't think that this is something where you’re going to find over 50% of people share the same budgeting philosophy. So I feel that if you have a preferred way of doing something, you could probably find a cohort out there that feels the same way.

      转述 Jen 的说法:记账是件很 personal 的事情,不同人的做法可能差异很大。所以即使已经有流行的记账软件,你的记账方式可能还是有一批人会喜欢。

  2. Mar 2018
    1. The template author defines a template, which describes the data Mixer dispatches to adapters, and the interface that the adapter must implement to process that data.

      模板指定了:

      • 什么数据会通过 mixer 传给 adapter
      • adpater 需要实现什么接口来处理这些数据
    1. Also note that if a scalar message field is set to its default, the value will not be serialized on the wire.

      使用默认值的字段,不会被序列化。

    2. Note that for scalar message fields, once a message is parsed there's no way of telling whether a field was explicitly set to the default value (for example whether a boolean was set to false) or just not set at all

      解析一个包含数据的 message 时,对于一个值为默认值的字段,你无法判断对方是没有设置这个字段的值,还是他设置的就是默认值。

  3. Jun 2017
    1. When a new array is created by indexing with an array of integers, the new array has the same shape than the array of integers:

      这个例子不好,因为 a 中 index 跟其 value 一致(比如 a[2] == 2),这导致 a[idx] 查出来的数据,跟 idx 一样,容易误解。优化一下:

      >>> a = np.arange(10, 0, -1)
      >>> idx = np.array([[3, 4], [9, 7]])
      >>> a[idx]
      array([[7, 6],
             [1, 3]])
      
    2. A slicing operation creates a view on the original array, which is just a way of accessing array data.

      注意:这点跟普通 Python list 的 slicing 操作不一致。普通的 list slicing 会拷贝一份新的数据出来。

    3. NumPy arrays can be indexed with slices, but also with boolean or integer arrays (masks). This method is called fancy indexing. It creates copies not views.

      boolean or integer arrays,这个概念需要好好理解,比较罕见。比如文中的 (a %3 == 0)

      另外,注意这个创建的是 copies 不是 views,这意味着后续的修改不会影响原有的。

    4. Worked example: Prime number sieve
      is_prime = np.ones(101, dtype=bool)
      is_prime[:2] = False
      n_max = int(np.sqrt(len(is_prime) - 1))
      for j in range(2, n_max + 1):
          if is_prime[j]:
              is_prime[j*j::j] = False
      np.nonzero(is_prime)
      

      The first number to cross out is j^2 这个很聪明

    5. Try the different flavours of slicing, using start, end and step: starting from a linspace, try to obtain odd numbers counting backwards, and even numbers counting forwards.

      step 是负数时,start 的默认值是数组的长度减 1,stop 的默认值是 -1。比如:

      > a = np.arange(10)
      > a[::-1]
      array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
      > a[9:-1:-1]
      array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
      > a[8:0:-1]
      array([8, 7, 6, 5, 4, 3, 2, 1])
      
    6. Plot some simple arrays: a cosine as a function of time and a 2D matrix.

      Code copied from CS231n:

      import numpy as np
      import matplotlib.pyplot as plt
      
      # Compute the x and y coordinates for points on sine and cosine curves
      x = np.arange(0, 3 * np.pi, 0.1)
      y_sin = np.sin(x)
      y_cos = np.cos(x)
      
      # Plot the points using matplotlib
      plt.plot(x, y_sin)
      plt.plot(x, y_cos)
      plt.xlabel('x axis label')
      plt.ylabel('y axis label')
      plt.title('Sine and Cosine')
      plt.legend(['Sine', 'Cosine'])
      plt.show()
      
    7. Look at the function np.empty. What does it do? When might this be useful?

      From np.empty() doc strings:

      Return a new array of given shape and type, without initializing entries.

      empty, unlike zeros, does not set the array values to zero, and may therefore be marginally faster. On the other hand, it requires the user to manually set all the values in the array, and should be used with caution.