Author: snoopy

莫莫两岁半

两岁半了,国庆后去社区医院体检,身高还是在 30 分位的样子,体重转好到 30 分位,头围基本没变,这个倒有 70 分位。没有贫血缺钙,骨密度都偏高,暂时看不用太过担心补钙什么的问题

到医院还是各种不乐意,量身高体重都是爸爸伯伯加医生一起三个人按住才搞定,抽血也是三个人一人抱住,一人按手腕,医生捏手指。扎了点指尖血,后面一直要包着搞得跟受了多大伤一样,回来一上午都不高兴,中午破例睡了一觉才好

现在习惯了坐餐椅,到吃饭的点会自己踩着茶几爬上去,夏天结束爸爸把客厅的落地扇拿走后茶几靠边了点,现在不好自己爬了也是个问题

还是喜欢看电视,要一边看一边吃,更狠的时候要一边看电视一边给他读书一边吃饭,娃都这么惯的么

晚上睡前不让隔拉拉裤或尿不湿,会说穿起来「痛痛的」,都是等睡着了再隔上,毕竟现在晚上睡着了不会主动说要尿尿。有时候等睡着打算给他换的时候可能已经尿床了,洗床单和垫子的频率有点高,现在天气凉快后睡着后很快能睡比较沉,还是麻溜的换上好

看爸爸用电脑会跑去要看各种动物的图片,看了猎豹抓羚羊的图,在小区玩时会说「我是猎豹,爸爸你是羚羊,我来抓你」,终于可以不那么懒,需要路上一直要抱着

不过路上还是偏懒,各种赖着要抱,自己带滑板车出去都是要大人拖着走,而不是踩着走,到玩的地方了倒是下来折腾的各种起劲

打算白天给溜溜好睡午觉,都还是失败,现在彻底放弃中午弄睡他的念头,还是保持一个他舒服的稳定作息的好,晚上八点半左右进房间喂奶洗漱,平静下来,九点半到十点自己睡着,早上八点半左右叫醒来

晚上睡觉有时候会说「我还睡不着」,明明都困的不行都在各种打哈欠揉眼睛了,就是贪玩,早上被弄醒时会撒娇「我还想睡」,其实也睡差不多了,如果没睡够是不会一戳就醒,而且还会有很大起床气

国庆前带去动物园玩,想带去自己想玩的地方自己多走走,结果一路各种要爸爸和伯伯抱着,这么爱出汗的娃当天衣服一点潮湿的感觉都没有,到底是溜娃还是溜的大人(手动捂脸)

对自己的凉鞋情有独钟,出去总要穿凉鞋,天气刚转凉那会都劝不住,只能藏起来。对自己习惯的东西还是各种舍不得

会各种安排别人来照顾他,尤其睡前安排特别好,洗过澡后在床上让爸爸喂奶,然后「伯伯你去洗澡,妈妈你去洗奶瓶,爸爸陪我睡觉」

能很快从一数到十,不过真的让他数东西了又各种乱搞,也还不太会一个一个点着数

开始在小马桶上拉臭臭,在外面撒尿可以直接裤子往下扒了站着尿草丛去,在家还是大人抱着撒大马桶里,或者拉个小板凳来自己站在马桶旁边撒

各种热烈的表达爱意,每天想起来就会来一句「我爱你」,或者是面对多人时的「我爱你们」,但是如果要自己玩懒得陪你时就会来一句「我不爱你了」(手动笑哭)

还是喜欢折腾人,特别是伯伯和妈妈的长发,会抓的乱七八糟的,伯伯说多了「都被你抓成颠婆」后,还会主动说「我要把你抓成一个颠婆」

对自己的东西还是看的很牢,出去玩不太跟人交换玩具,会强调「这是我的」,真遇上别人有自己特别想玩的才会在劝说下试图跟人换换。平时还是都注意跟他讲要分享,再就是等这个物权欲时期自然过去吧

在家吃到好吃的,不想被爸妈分享或打算独吞时各种理由:「你不可以吃的」「这个有口水」「它脏了」「吃了会肚肚痛」,如果被当面强行吃掉,会发飙「吐出来!」

爸爸把半年多前买的宜家小火车再拿出来玩,现在能玩了就疯狂的痴迷小火车,等爸爸再去淘宝额外补了一些轨道和车后,更是痴迷的不行,早上醒来都会说「给我换衣服,我要玩小火车」

在电视柜前弄了各种假的吃的摆了一排,还会各种热情的拉家长说「你假装吃吧」

更坦然的面对离别,伯伯回家去了几天,提前跟他说好,然后他也能平静的说「伯伯回老家去了,过几天再回来」,不会像以前那样要闹一两天才能缓过来。不过每天早上爸爸去上班想主动告别,多半还是会被留下来「爸爸不要去上班」「爸爸陪我玩」

问想不想要妹妹,现在会说「妈妈你现在就给我生个妹妹吧」,再问你的玩具给妹妹一起玩好不好,立马紧张「这些都是给男孩子玩的,女孩子不可以玩的」,再问那我们把书给妹妹看好不好,还是紧张找借口「这个太复杂了,看不懂的」,笑翻旁人

还是不愿意好好区分兄弟姐妹之间的称呼,会管自己的毛绒兔兔叫姐姐,然后又说自己是她哥哥。先随他吧,现在嘴上逆反特别厉害,跟他说什么都会跟你唱反调

出去菜店买菜,已经会各种自己挑,「我要吃这个」「我们买这个吧」,这样也好,在没有特别挑食的情况下,也懒得大人费劲去安排伙食

刷牙现在大部分时间能自己好好刷,大人再帮忙把各种角落补刷一下,之前都不让数牙齿,体检时跟医生说半年前一样还是 16 颗,后面爸爸仔细看了下应该是有 19 颗,离 20 颗乳牙长齐也快了,并没有特别慢

会很享受蚂蚁爬树的背部按摩,有时候想给他哄睡,说给他捏一捏,小家伙还会要求把手伸衣服里去给他捏,才不要隔着衣服做隔靴搔痒的敷衍

补遗: 机器学习手记系列 3 线性回归样例程序

距离 2012 的两三年后(这篇的草稿时间)又过了两三年,这个补遗看起来也烂尾了 -.-

之前在机器学习手记系列 3: 线性回归和最小二乘法后面留了个问题, 也给了结果, 但是当时说好的程序代码并没给出来, 那个手记系列的坑感觉填不上了, 但是已经刨好的小坑还是填上吧

现在已经有很多深度学习框架和教程来教这个,自己也忘得差不多了,就不班门弄斧裸写。推荐看一下 动手学深度学习 http://zh.gluon.ai/index.html,Deep Learning 领域大神 李沐 等人在维护(我能凑不要脸的蹭热度说下这是前百度同事我们还一起吃饭打牌来着么)。刨的小坑就按 线性回归的从零开始实现 http://zh.gluon.ai/chapter_deep-learning-basics/linear-regression-scratch.html 里的做法来实现

先重复下问题

如下式子里不同的阿拉伯数字只是一个符号, 实际表示的可能是其他数字
967621 = 3
797321 = 1
378581 = 4
422151 = 0
535951 = 1
335771 = 0

根据上述式子, 判断下式等于?
565441 = ?

这题的脑筋急转弯版本答案是看每个数字有几个圈,就代表几,这样 1/2/3/4/5/7 都是 0 个圈,6/9 是 1 个圈,8 是 2 个圈,所以最后 565441 里面只有 6 有 1 个圈,答案为 1

按 gluon 上的教程我们也来走一遍,装环境什么的就看 gluon 了,先引入要用的包

from mxnet import autograd, nd

真正做线性回归是没法只用这么一点数据来模拟的,所以我们要先根据真实值来构造一些数据(这里跟 gluon 不一样的是我没有 bias 因子 b,后面也请一并注意)

num_inputs = 9          # 特征数,当前问题里的变量数 1-9
num_examples = 1000     # 样例数,我们会随机生成多少份样例来学习
true_w = nd.array([0, 0, 0, 0, 0, 1, 0, 2, 1])  # 真实值
features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))  # 随机生成数据集
labels = nd.dot(features, true_w)                                   # 数据集对应的结果

初始化模型参数并创建梯度

w = nd.random.normal(scale=0.01, shape=(9, 1))
w.attach_grad()

定义模型,我们就是做的矩阵乘法

def linreg(X, w):
    return nd.dot(X, w)

定义损失函数,用平方损失

def squared_loss(y_hat, y):
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

定义优化算法,用小批量随机梯度下降(因为我们只用了一个大参数 w,所以还是比 gluon 的样例简单)

def sgd(param, lr, batch_size):
    param[:] = param - lr * param.grad / batch_size

训练,取步长 lr 为 0.01,轮次为 1000 轮

def train():
    lr = 0.01
    num_epochs = 1000
    net = linreg
    loss = squared_loss

    for epoch in range(num_epochs):
        with autograd.record():
            l = loss(net(features, w), labels)
        l.backward()
        sgd(w, lr, labels.size)
        train_l = loss(net(features, w), labels)
        if epoch % 100 == 99:
            print("epoch {}, loss {}, w {}".format(epoch + 1, train_l.mean().asnumpy(), w))

验证下结果看看

if __name__ == "__main__":
    train()
    test = nd.array([1, 0, 0, 2, 2, 1, 0, 0, 0])    # 测试集,565441
    print(nd.dot(test, w))

随便跑了一次输出如下,注意模型里每个值的科学计数法的指数

epoch 1000, loss [  5.72006487e-09], w
[[ -6.20802666e-06]
 [  1.62000088e-05]
 [ -1.03610901e-05]
 [  7.82768348e-06]
 [  2.59973749e-05]
 [  9.99964714e-01]
 [  1.86312645e-05]
 [  1.99990368e+00]
 [  1.00001490e+00]]
<NDArray 9x1 @cpu(0)>

[ 1.00002611]
<NDArray 1 @cpu(0)>

忽略精度问题,可以认为符合真实结果

全部代码详见 https://gist.github.com/whusnoopy/af0aa6fd276ace8a7c4d483e586e936d

关于一些音乐的记录

又是好久以前的草稿,那时候小苹果都刚出来,给的链接也都是 douban,现在看好多版权都只在 QQ 音乐了

关于恶趣味

  • 菊子桑 的金坷垃系列在 bilibili 上各种洗脑屠版,详见 https://space.bilibili.com/156160/
  • 筷子兄弟 的小苹果已经被各种神曲和鬼畜,目测未来会是广场舞的标志,凤凰传奇可以休矣(之前草稿写的,现在果然,而且之前只是觉得会是未来一年广场舞的标志,没想到到现在还是,娃的各种玩具也都有小苹果的音乐)
  • 在 大闹西游 这个 Flash 动画系列里,有一首「有只猴子掉下海」,其原始出处应该是 London Bridge is Falling Down

关于在电台和公共场合听到的

  • 忙碌超人,来自魔幻力量, 歌词里的核心是 BusyMan 不是 Superman, 难怪搜 superman 只能搜到曹格的格, 开车听 91.8 听到的。QQ 音乐链接 https://i.y.qq.com/v8/playsong.html?songid=651445
  • 之前公司还在紫荆城时经常去的餐厅 童年小筑,里面经常放的某首外文歌,用各种奇怪的搜索技巧后在百度知道里查到是 Schnuffel – Ich Hab’ Dich Lieb,豆瓣专辑 http://music.douban.com/subject/3161868/ 这整个专辑都是萌向。QQ 音乐专辑链接 https://y.qq.com/w/album.html?albumId=136895
  • 火柴天堂,原唱应该是熊天平,齐秦也唱过,动力火车也翻唱过,是一首传唱很多但是又在流行领域很少听到的歌(估计只是我个人比较恋旧且都在听挖坟级别的歌)。刚 QQ 音乐搜了下,翻唱远比我记得的更多,原版 https://i.y.qq.com/v8/playsong.html?songid=11528
  • 天下足球标配音乐 attraction アトラクション – 小澤正澄 Guitar Monster Vol.1,http://music.douban.com/subject/3137694/,很动感,节奏感超强,还是只有 QQ 音乐有版权 https://i.y.qq.com/v8/playsong.html?songid=105030246

那些让生活更美好的小玩意儿

好几年前的草稿,本想仔细介绍下,发现还是直接简单发吧

  • 电动牙刷
    • 美白功能没发现,刷牙刷够两分钟倒是真的
    • 之前用飞利浦大几百的,刷头也贵,现在用小米的,刷头也便宜点。个人建议选超声波,Oral-B 的都是机械刷
  • 狮王极细刷毛牙刷
    • 用完再对比普通牙刷,真的感觉是洗衣服的刷子
    • 据说狮王对这个极细刷毛技术有专利,所以别家没做,但也据说这个专利要到期了
  • 电动冲牙器(水牙线)
    • 比牙签好用,不会戳大牙缝,就是大的不方便带
    • 用了个把月,也没有每天两次,感觉牙结石什么的情况都好很多
  • 各种带口夹
    • 宜家有一包 20 个还是 30 个的,现在各家卖坚果的也送这货了
    • 对于一些开封没吃完的袋装食品很有用
  • 各种密封袋
    • 大号出门装东西, 旅行时分隔衣物
    • 小号的骑车或出去玩装证件和零钱啥的, 防水
  • 插头转换器
    • 对于功率不大的电器做分割
    • 现在房子墙壁上装那么多插座不现实, 直接托个插线板也不方便
    • 常见场景: 电视机/机顶盒公用两孔, 猫/路由公用两孔
  • 小米插线板
    • 省掉若干 USB 充电器,不过现在都是 QC 快充,又有点过时了
  • 大号长尾票夹
    • 除了本来的用途,还可以夹书架上拿来挂耳机或充电线接口
  • 浴帘杆
    • 租房时拿这货撑在浴室挂毛巾,或撑窗户上挂衣服,比他原本设计的功能靠谱多了
    • 现在住自己房子了发现有些毛巾还是不够挂,还是用的浴帘杆

莫莫 29 个月

暑假结束了,爸爸回去接回杭州,回来后开始接受坐餐椅了,应该是回杭州后第一顿在外面吃,坐的餐椅,果然一个好的开头很重要

还是要看电视,不过相对之前看的少一些,动不动就会来一句「我有一个假设」,学自「恐龙列车」里的巴迪

各种死缠爸爸,要爸爸喂奶(还会特意说「妈妈喂不好」),要爸爸给讲故事,睡觉要爸爸陪睡。不过喂饭的时候就不要爸爸喂,知道爸爸做这些事不靠谱么?

进入强烈的物权欲时期,不让别人动他的东西,出去玩带的玩具被别的小朋友动了会立马跑过去阻止别人

开始愈发执着,比如执念某个玩具,在家里到处找不到后,对着贴墙上的某照片背景里露出的一角,特意指出来说我要这个

学爸爸管妈妈叫「叶大喵」

这是我爸爸妈妈买给我的

在老家时发烧了,非得玩耳温枪,外婆不给,就这么跟外公外婆争辩

我有一个妮妮就行了,太多了我抱不过来的

还是经常抱着毛绒小兔兔,问他要不要换一个,想想后这么回答

习惯性的说「不知道」,一是懒二估计是烦我们经常对他问来问去,而且小朋友跳着发音,经常说的是「不道」

会数数,但是又懒得数,问他什么有几个,数一数好不好,就会抛回来说「你数」

终于可以自己滚睡了,晚上躺他旁边不说话,想睡了自己滚滚还是能睡着。白天睡着了后,如果还要睡的话,摇不醒了

出去玩各种要抱不想走,各种理由:「我累了」,「我还小」,「要抱的」

现在不要尿不湿或拉拉裤了,会说「勒着痛」,晚上睡觉怕尿床,都只能在他睡着后再给他穿上,早上起床就要去掉

回杭州前几天在老家跟人跑着玩,摔了一跤两个膝盖擦伤了,自己说腿上「有一个疤疤」,掉了后要「丢到垃圾桶去」,问他还痛不痛会很委屈的说「还痛」

Python decorator 库

上个月关于 Python 的 Decorator 写过一篇 Python 多层 decorator 内获取原始函数参数字典,后来熊提醒这种比较通用的东西应该都会有现成的库,搜了下果然有 个库就叫 Decorator

相关的项目地址在

看了下源码,他比之前我的做法更进一步,直接把要修饰的原方法的名字和参数,都扫代码解析出来,再到一个解析器的临时文件里原样写一个新的方法,并把相关需要复制的参数属性等都直接复制给这个新方法,这个新方法再调修饰方法,就可以更完美的实现对外界透明

例如这样的代码

def foo(x, y=2, *args, **kw):
  print(x)

def dec(func):
  def wrapper(*args, **kw):
    print("called %s with %s, %s" % (func.__name__, args, kw))
    return func(*args, **kw)
  return wrapper

foo = dec(foo)

在经过了 @decorator 后会变成

_func = foo
_caller = wrapper

foo = def foo(x, y=2, *args, **kw):
  return _caller(_func)(x, y, *args, **kw)

只有一些涉及到 func_code 内存地址的地方才可以发现不一样

果然还是有库用库,绝大部分情况人家还是实现得更好,就是原理能不能看懂了。自己折腾的好处是正向推过去,坑和原理都比较了解,而反向看别人的代码,有很多奇妙的地方先想明白为什么要考虑这个情况,以及这个情况为什么要这样处理,都需要花很久

最后小吐槽一下,在 decorator 库里,如果是 py3,replace('return', 'return await') 真的没问题?如果有人逗比写了个 returnVal = xxx 不就崩了

莫言莫语 3

爸爸打算回老家接莫莫回杭州了,继续记录这个每天被乐的不行的阶段

不好

问莫莫要不要回杭州,已经从暑假开始送回去,爸爸回来上班时,各种哭闹不要爸爸走,说「我要回杭州」变成了不要回去了(手动笑哭)

我在外婆家算了吧

问他为什么不好,小朋友用这样装作轻松又装作无奈的口气回答,最后那个「算了吧」真的是神作

我要睡觉了

在老家有弄细菌感染而发烧,喂他吃药了就开始各种逃避,要么就是眼睛一闭说要睡觉了,看你怎么办

我要尿尿

外婆陪着哄睡午觉,外婆都累得睡着了,莫莫还不睡,看没人陪他玩就开始喊,其实并没有尿,就是要把陪的人搞起来

外婆,请你抱抱我

小朋友真的很会看人下菜,外婆本来是严厉向的,在家也被小朋友嗲的开始娇惯他,然后小家伙就各种犯懒,可怜巴巴的说「抱抱我」

因为我喝了很多水呀

外公带去游乐场玩,没一会功夫带着去撒了两泡尿,外公问你今天怎么这么多尿,莫莫就逻辑清楚理所当然的这么回答

医生说了,不能吹电扇

在家不想吹电扇,也不让大人吹,就把去医院时听到的话来当挡箭牌,自己跑过去吧唧关掉

我热了,我出汗了

等自己想吹电扇了又开始找理由,反正自己想干的事情总有理由。不过似乎没有无理取闹都算好的?还有个说法

自己的事情自己做

外婆拖地板,非得把拖把抢过去,在自己房间使劲倒腾。弄累了自己爬床上睡着了,还记得用毯子裹了一下,平时可是哄都哄不着午睡的啊

9 个

平时都不数数或乱数的,某天视频说杭州家里有猕猴桃,爸爸回去时带给你吃,你数下看多少个,听他那边数了「一个、两个」后就没吭声,以为又懒的数,然后差不多速度数完时准确报总数,也不知道是真数对了还是瞎蒙的,反正让再数就不理了,真不知道是不是自己会了觉得你们太弱智(娃爸娃妈的美好期望。。。)

奇怪的电脑配置

前几天看到公司有一个主板盒,上面贴了一个看起来像淘宝店的发货单,看了配置真是哑然失笑

i7-9500x

在这个时间节点 Intel 应该还没发售 9 系的 CPU。如果第二位是 5,这个应该是 i5 序列,算不到 i7 序列。Intel 只有在至尊系列才有 x 后缀,x5xx 这个级别怎样也混不到 x 后缀

Z970 主板

确定 970 是主板而不是显卡?按这个搭配思路应该是 Z270 吧

GTX 1030 8GB 显卡

首先 GTX 这个前缀不可能给到 1030 这么低的定位,nVidia 有的型号是 GT1030,另外这个级别的卡也不可能有这么大显存,正常应该是 1G 或者 2G,而且大显存都是忽悠小白说你看这个卡是 4G 的比那个 2G 的牛多了用

其他的没这么夸张,有些还行,但整体看都像是被 xx 了。本来说是不是某人被装机商当小白狠狠宰了一顿,后面问了下说是只买了个鼠标垫,刷单的,这样估计就是卖家故意写的漏洞百出,自己好记得是刷单?

莫言莫语 2

我生气了

小朋友有时候不高兴了会傲娇

我会打你的

续上,真的说生气了还会接着说会打人的

这样是不公平的

世界杯的时候爸爸妈妈在客厅用电视看球,估计是不满平时我们在他看动画片看久了后要他关电视,等我们看球时跑过去把电视关掉,然后愤愤不平这样嚷


夏天爷爷奶奶外公外婆都放暑假了,把莫莫送回老家,在外公外婆家呆着。外公外婆住市区,旁边有大超市,大超市一楼有给小朋友玩的游乐场,99 包月,价格划算,莫莫每天都会去

我要买棒棒糖

爷爷奶奶去外公外婆家看莫莫,带莫莫去游乐场,玩到一半莫莫如是说。爷爷表示我不知道这哪里有棒棒糖卖呢,莫莫立马麻溜的说「我知道,二楼有」然后就拽着爷爷买去了

外婆给你吃吧,巧克力味的,很好吃的

小馋猫经常要吃棒棒糖,但偶尔也吃不完或吃腻了,就想着塞给外婆

这个我吃过了,有口水,外婆你不要吃了

棒棒糖给了外婆,外婆不想吃放在一边,一会莫莫又想吃,回来问外婆要回来

你不可以抢我的,这个是外婆买的不是你买的

担心莫莫吃糖太多会蛀牙,所以一般还是控制莫莫吃糖的情况,吃棒棒糖的莫莫看到外公过来,以为是要抢走他的,立马辩驳道

爷爷辛苦了

爷爷自己种了很多瓜果蔬菜,带到外婆家给莫莫吃,莫莫超开心的谢谢爷爷,似乎并没人这么特意教过他,把爷爷被感动的不要不要的

给外公买酒

有时候莫莫会玩当超市老板的游戏,完了问他赚了钱要给大家买什么,每次都会特别记得说给外公买酒,其他人每次就可能不一样。外婆就开玩笑说看你就贪的那一口,小朋友都一直记住了

MongoDB 升级注意事项

最近在 WSL 和 macOS 下都遇到了 MongoDB 升级时报错的问题,记录一下踩的坑

1. 确认已经兼容新的版本

参考 https://docs.mongodb.com/manual/release-notes/4.0/#feature-compatibility 看一下当前设置的是多少

db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

如果还不够新版本的,参考 https://docs.mongodb.com/manual/reference/command/setFeatureCompatibilityVersion/ 设置一下

db.adminCommand( { setFeatureCompatibilityVersion: "version" } )

注意版本跳太多了可能会失败,则需要启一个老版本把版本一步一步设上去(我的 WSL 就是从 2.6 跳 3.6 直接失败了,想 apt 退回去都不行,只能人肉下了个单独运行的 3.2 还是 3.4 做跳板,设完了才放弃)

2. 确认已经使用新的 YAML 格式配置文件

参考 https://docs.mongodb.com/manual/reference/configuration-options/,配置文件 Linux 一般是在 /etc/mongod.conf,macOS 如果是 brew 装的,一般是在 /usr/local/etc/mongod.conf

如果不是 YAML 的可以参考 https://github.com/mongodb/mongo/blob/master/debian/mongod.conf 新写一个,对着原来的文件把相关参数改一下就好(主要是 dbPathsystemLog.path,还有就是 processManagement 下要不要加 fork: true

3. 改用 wiredTiger 引擎

从 4.x 开始 MongoDB 就要放弃 mmapv1 引擎,尽快改成 wiredTiger

参考 https://docs.mongodb.com/manual/tutorial/change-standalone-wiredtiger/ 来做改动,大致步骤是

  1. 先在当前启动的 mongo 下做 mongodump,备份已有数据
  2. 停掉当前 mongo(注意 macOS 下 brew services stop 可能没有真的停,再 ps -el | grep mongo 看看还有没有进程)
  3. 修改配置文件,把 storage.engine 的注释去掉并改为 engine: wiredTiger
  4. 移除以前的 dbPath 下的所有文件(安全起见可以 mv 走而不是 rm -rf
  5. 按新配置文件启动 mongo
  6. mongorestore 来恢复之前的备份