Categories
未分类

PostgreSQL 数据库从9.1版本升级到11.5

## 起因 === # 如果你不想听我自言自语,请跳到以下“升级”部分。 随着年龄越来越大,我在技术上的“最求”也变得更保守了,慢慢的,我开始信奉这样一句名言 Don't fix what's not broken — 不知道是谁说的不过不是我 这次选择这么大跨度的一个升级(很大吗?是的,9.1版本是2011年发布的,那一年,我还没毕业)自然是有原因的。 之前说过,打卡团服务器是用Elixir(一门语言)/Phoenix(一个Web框架)写的,这是个错误。至于为什么说这是个错误,以后有时间写写(这句话好像之前说过?)。 于是,最近一直想把它迁移到我信仰的Ruby on Rails(RoR)。当然,“迁移”是没时间迁移的,永远都没时间迁移。准确的说,是新功能用RoR开发,原来的功能就留着(“Don't fix what's not broken”,remember?)。 但是搭建好Rails scaffold之后,发现数据库连接不上。老是提示这样一个错误: Traceback (most recent call last): 2: from (irb):4 1: from (irb):4:in `rescue in irb_binding’ ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation "pg_range" does not exist) LINE 3: LEFT JOIN pg_range as r ON oid […]

Categories
ml 未分类

我对Embedding的理解

Embedding是NLP中,用来表示一个词的常见的方式。不过,他的用途其实不仅仅可以用在NLP中,在简单的线性回归或逻辑回归中 ———— 进而在神经网络中,也可以使用到这个东西。 我当初在学习Embeding这个概念的时候,花了比较长一段时间才算真正理解。我不知道到底是这个概念本身理解起来就比较难,还是容易遗忘的原因。Anyway,因为这一点,我决定写一篇文章,说说我对Embedding的理解。 在回答什么叫Embedding之前,我们先提出一个问题:给定任意的两个东西,怎么样来衡量他们之间的相似性呢? 举个例子,比如说,牛奶、咖啡和苹果。通常意义下,可能大部分人都会认为“牛奶”和“咖啡”更相似,其他两对组合“牛奶”和“苹果”以及“咖啡”和“苹果”没那么相似。 如果要进一步问为什么,大家可能会说,“牛奶”和“咖啡”都是液体,都是可以喝的,都是常见饮料,都是装在杯子或瓶子里面的等等等等。也就是说,我们会想出某一些角度,或者说一些特征,来衡量他们的相似性。这些“角度”或者说“特征”,我们用稍微显得专业一点的词来说,叫做维度。 如果我们把主要考虑的几个维度简单的列一下,可能会得出以下的一些: 是否食物、是否液体、是否需要人为加工、颜色、味道等等。列出这些维度以后,我们可以给这三个考察对象的每一个维度都分别“打个分”,分配一个数值。如下: 是否食物 是否液体 人为加工 颜色 味道 牛奶 1 1 0.8 -1 1 咖啡 1 1 0.9 -16777216 2 苹果 1 0.2 0.1 -16711936 3 你可能会有疑问,是否食物、是否液体、是否人为加工的数值都是小数,可以理解为“在多大程度上是食物/液体/人为加工”,但是颜色和味道的值怎么理解呢? 在上面的表格中,颜色的值我取得是Java中Color类的WHITE、BLACK、GREEN三个常量的数值。味道的三个值是我随便取得,你可以理解为,我们可以把每一种味道都用一个数字来表示,然后1、2、3分别是代表牛奶、咖啡、苹果的味道的数字。不用过分纠结这里的数字具体是什么值,这里只是举例说明一下原理。 好了,现在我们确定好了这些“维度”,并且给我们的考察对象在每一个维度上面都打了分,那么我们就可以用一个向量来代表我们的一个考察对象了。比如: 牛奶:[1, 1, 0.8, -1, 1] 咖啡:[1, 1, 0.9, -16777216 , 2] 苹果:[1, 0.2, 0.1, -16711936, 3] 每个对象对应的向量,就是表格中对应的那一行。这里的向量,其实就叫一个Embedding。如果要用稍微正式的语言来陈述一下,那就是:一个Embedding,就是用于描述某个实体的一个向量,这个向量里面的每一个值代表这个实体在某个维度上面的“打分”。 在实际使用的过程中,Embedding的生成过程可能跟我们上面讲述的过程不大一样。我们先来看一下PyTorch里面,Embedding的使用是怎么样的。 >>> import […]

Categories
未分类

PyTorch自动求导(Autograd)原理解析

我们知道,深度学习最核心的其中一个步骤,就是求导:根据函数(linear + activation function)求weights相对于loss的导数(还是loss相对于weights的导数?)。然后根据得出的导数,相应的修改weights,让loss最小化。 各大深度学习框架Tensorflow,Keras,PyTorch都自带有自动求导功能,不需要我们手动算。 在初步学习PyTorch的时候,看到PyTorch的自动求导过程时,感觉非常的别扭和不直观。我下面举个例子,大家自己感受一下。 >>> import torch >>> >>> a = torch.tensor(2.0, requires_grad=True) >>> b = torch.tensor(3.0, requires_grad=True) >>> c = a + b >>> d = torch.tensor(4.0, requires_grad=True) >>> e = c * d >>> >>> e.backward() # 执行求导 >>> a.grad # a.grad 即导数 d(e)/d(a) 的值 tensor(4.) 这里让人感觉别扭的是,调用 e.backward()执行求导,为什么会更新 a 对象的状态grad?对于习惯了OOP的人来说,这是非常不直观的。因为,在OOP里面,你要改变一个对象的状态,一般的做法是,引用这个对象本身,给它的property显示的赋值(比如 user.age […]

Categories
未分类

把 Postgresql 数据库内容从 10.xxx 升级到 11.2

我 Mac 本地的 psql version 不知道何时何因被升级到了 11.1_1。今天尝试使用的时候,提示: FATAL: database files are incompatible with server DETAIL: The data directory was initialized by PostgreSQL version 10.xxx, which is not compatible with this version 11.1_1 Google 了一下,找到这个命令可以用: brew postgresql-upgrade-database 运行过程中,会先下载老版的 10.xx 版本,然后再执行数据库的升级。到后面出现这个错误: ==> Moving postgresql data from /usr/local/var/postgres to /usr/local/var/postgres.old… … Error:…. Permission denied 看错误的提示,应该是/usr/local/var/目录的权限问题。执行 sudo chmod a+w […]

Categories
未分类

记打卡团服务器的一(三)次升级:从 Ubuntu 12.04 到 18.04

正月初六,乘着春节假期的最后一天,我窝在家里,一鼓作气,把我的一个业余项目(见证打卡团)的服务器,从古老的 Ubuntu 12.04 连续升级了三次,到了最新的 LTS 版本,18.04。 Ubuntu 12.04 -> Ubuntu 14.04 Ubuntu 14.04 -> Ubuntu 16.04 Ubuntu 16.04 -> Ubuntu 18.04 你可能会问,为什么不直接从 12.04 升级到 18.04 呢?这是因为系统不支持这样升级,只能两个大版本一步一步升级。 ## 升级方法 其实三次升级的方法(或者说过程)都是一样的。网上文章也有很多,我主要参考的是这篇文章,一方面是因为这篇文章的作者的服务器也是在阿里云上,跟我的一样,二是因为这篇文章写得比较清楚,一步一步截图都有。 在开始之前,可以考虑把 apt 的 sources list 换成国内的镜像。如果是阿里云服务器,建议换成阿里云的镜像,腾讯云的服务器,换成腾讯云的镜像,其他云的服务器也类似。如果不是哪个云的服务器,可以考虑换成中科大或清华等国内镜像。这样,在升级过程中,下载很多 package 的速度会快很多很多。我的服务器是阿里云的,因此换成了阿里云的镜像。 换好之后,执行: $sudo apt-get update $sudo apt-get upgrade $sudo apt-get dist-upgrade $sudo apt-get install update-manager-core $sudo do-release-upgrade 执行 do-release-upgrade […]

Categories
未分类

什么叫代码的可读性?为什么说Kotlin的可读性比Java高?

不久之前,我看了一篇文章,大意是Kotlin与Java之间的对比,像这种文章,我一般是直接忽略的,但是那天我还是打开了,然后就看到一个非常吃惊的结果。 里面有一段是关于Kotlin与Java之间可读性的对比的文章,作者的结论是:Kotlin并不比Java更具有可读性,所有认为Kotlin 比Java更具有可读性的结论都是“主观性”的。 并且作者举了一个在我看来,不知道该怎么来描述的例子: 这个作者的大意是,上面这段文章,你多读个两三遍,你也会很快的理解它的意思,所以“对于熟练的读者而言,外观很少会成为可读性的障碍。” 我不知道,如果某一天,这个作者突发奇想,决定全部使用大写字母来写代码——所有的类名、方法名、局部变量成员变量名等等全部使用大写,我不知道跟作者合作的同事是不是会欣然的耐心的把作者所有的代码先读它个两三遍,然后再来慢慢的理解它的意思。如果是我,我不会。如果在小红书有个同事非要执意这样写代码,理由是“你多读个两三遍不就好了嘛?”我想我只能把他开除了。 其实,如果一段代码需要你多读个两三遍才能很好的理解,这本身不就说明,这段代码的可读性不高吗?这里的重点是,这里的这一段大写的文字你看个三遍,再看的话,是熟悉了,但是再看别的用大写写的文字片段,你依然要很费劲。所以,这个例子是不能代表大写这种风格的可读性的。在比较两种不同的风格的可读性的时候,你不能用具体的某一个一次性的片段来说明。 另外,这篇文章还暗含了这样一个观点,那就是,代码的可读性,仅仅是指,看到一段代码,能不能理解这段代码的含义。这是一个很多人都会错误的观点。 但是,在真正工作中,代码的可读性,恐怕不至这一个方面。为了考察所谓代码的可读性涉及到哪些方面,我们来假设两个case:1. 你去到一家新公司,接手一个新项目。这个时候,你的需求是,快速了解某个类、某个模块、某个方法做的是什么事情。在这个基础上,整个app、模块的结构是怎么样的。2. 你老板叫你fix一个bug,这个bug是另外一个同事写的,今天这个同事请假了不在。在这个case里面,你需要的是,快速的定位到出问题的代码在什么地方,然后再尽快的了解这个地方的代码做了什么事情,并且保证你的理解是对的。 所以,总结一下,代码的可读性,可以归纳成三点: 1. 理解一段代码的速度 2. 找到你关心的代码的速度 3. 确保正确理解一段代码的难易程序。这跟第一点看似一样,其实还真不一样,下面你会看到。 下面,依次解释一下这三点,以及为什么说,Kotlin的可读性会对Java高。 ### 1. 理解一段代码的速度 如果大家仔细的思考下,你会发现,我们在理解一段代码的时候,大多数情况下,我们是想要了解这段代码做了什么事情,是这段代码的意图(Intention),而不是具体这个事情是怎么做的。比如一个Button被点击了,我们的App做了什么,是做了什么运算,发了网络请求,还是保证了一些数据到数据库。也就是说,大多数情况下,我们关心的是What,而不是How。只有少数情况下,我们会关心“How”,一是出于学习的目的,我们想要了解一个算法是怎么实现的,一个效果是怎么实现的,这个时候,我们会关心“How”。二是当这个“How”出了问题的时候,就是有了Bug,我们要去了解这个 “How”,然后再fix过来。而且,即使是在这些少数情况下,了解“How”的过程,也只不过是了解一个个子“What”的过程。 敏捷开发和TDD先驱、JUnit开发作者和一系列经典编程书籍作者Kent Beck提出了一个著名的“four rules of simple design”,是以下4条: Passes the tests Reveals intention No duplication Fewest elements 第一条Passes the test说的是程序的正确性。第二条Reveals Intention,说的就是我们这里讨论的“What”。 那么,Kotlin相对于Java,在帮助我们了解“What”,在帮助Reveals Intention这方面,有什么样的优势呢? 我们看一个简单的例子: 在这段Java代码例子中,这7行代码做的事情很简单,就是从personList中找出id值等于somePersonId这个变量的值的那个Person,然后赋值给person这个变量。要理解这段代码并不难(其实后面你会看到,要确保正确理解这么代码也没那么简单),但是速度并不快,你必须从头到尾看完这8行代码,就算你说最后两行可以一扫而过,那也必须看完前面6行,你才能知道“哦,原来这段代码做的事情是,从personList中找出id值等于。。。” 下面,我们来看对应的Kotlin代码是怎么样的: val person = personList.find { it.id == […]

Categories
未分类

函数式编程的那些特性(一): Immutability

FBI warning: 这又是一个系列的文章(Hopefully),介绍Functional Programming的一些特性,以及Why there are so awesome! 目测将cover以下的一些话题: Immutability Pure function No side-effect High order function Curried Function Pattern matching Effect managements.(Monads, STM,…) Rethink OOP …… 目前没有办法确定更新频率,甚至没有办法保证一定会更新下去,只能说我尽量努力一个星期更新一遍,but I can’t give you my word. 另外,我相应你已经发现了,这些文章(Like every other posts)将会充斥着各种英文单词或句子。部分是为了装逼,部分是因为当我写到那里的时候,就想这么表达而已,感觉很带劲。所以,慎重关注,不喜还请轻喷! 这几天一直在折腾Elm,这门函数式编程语言,应该说,感觉真是酸爽。使用一门新的语言,在一个小的Community里面,还真的会有不少的问题,不少的坑。这些坑被你踩到的时候,可能还不能很快的得到解决,你要费一番功夫,你要Google得时间长一点,你要耐心的去看每一个相关的github issue、pull request,甚至相关的源码。此外,IDE的支持也是个大问题,可能每一个编辑器/IDE,都有不足的地方.比如说对于Elm开发,我现在的解决方案是,同时使用WebStorm(for editing files)和Atom(for linting),利用Mac的分屏功能,一边一个,这想想都觉得搞笑啊!但是,问到问题,解决问题,我想这也是程序员的一大乐趣吧! Anyway,这个系列的文章将介绍一下函数式编程(Functional Programming,以下简称FP)的一些特性。当然首先要解释的问题是,什么是函数式编程?这个概念我相信大家已经听烂了,但是究竟什么叫函数式编程呢?我们知道这个概念是跟面向对象编程一样,是一种编程模式,但是它跟OO有什么不同呢?有些人可能知道这是比OO更早出现的一种编程模式,但是为什么它没有像OO一想,如今得到如此广泛的应用?又是什么原因,最近这几年的编程界,大家又都在讨论这个东西? 我们一个一个问题来看,首先看看FP在Wikipedia的定义: In computer science, functional programming is a programming […]

Categories
未分类

人类简史

CIA Error: 以下内容有剧透,请结合自身情况,自觉选择离开 或者 继续浏览 — 剧透开始 — 花了。。。好长好长一段的时间才看完这本“看过都说好”的书,但个人看下来感觉还是过誉了,精彩的部分确实不少,比如: 认知革命:单个人能维系的关系是很有限的,大概是150人左右,超出这个范围,就要靠虚构的故事来作为规范群体行为的标准 农业革命:自从人类学会了种粮食,就告别了游牧生活,形成了固定居所的部落 科学革命:否定宗教认为”上帝/主/佛主无所不知,无所不能“的观点,承认自己的无知;利益决定资源(钱,人)的分配,进而决定科技的发展方向。 最后关于智人灭亡的几种可能性讨论也很开脑洞。 生物工程:主要是通过基因实验创造出超级人类,变种人,新品种人等。代表人物有美队、快银姐弟两等。(Sorry, but X教授,万磁王他们是天生的,并不是人为实验的结果)。 仿生工程:结合人体和电子机械,如机械手臂(比如冬兵巴基、金钢狼这种),通过脑电波控制机械,甚至读取人类的大脑信息,转移到电脑上等等,他们当中目前创造出来的最厉害的是幻视。 无机生命:说白了就是奥创(话说奥创明明就是钢铁侠的锅,到最后却要队长来背,看来是背上了钢铁侠老爸的锅就放不下了啊,连儿子也要负责)。 (所以Marvel早就安排好了人类的灭亡的是吗?还设计了各种可能性!简直就是心机婊,比程心还心机婊!) 当然说它过誉,是因为个人感觉无聊的部分也不少,这从我花了这么长时间才看完就知道了。这些无聊的部分主要集中在书的第三部分,这跟你自己的兴趣可能也有关系吧。 有人说书的后半部分很主观,然而我并不这么认为,看来这所谓的主观不主观也是主观的,如果作者的观点你认同,你就会觉得”这本来就是客观实事啊,一点都不主观“;如果作者的观点你不认同,你就会觉得”这作者也太主观了,简直胡扯“。 总体来说,8.4分推荐,不能再高了,很值得看一看,但也不用给自己压力,遇到觉得无聊的部分就果断快速翻过或跳过吧。

Categories
未分类

Elm语言初体验

这个周末两天一直在看Elm,这是一门函数式编程语言。所谓函数式编程(Functional Programming,FP),跟面向对象编程(Object Oriented,OO)是同一种类型的概念,是一种编程模式。具体什么叫函数式编程,它有什么特征,有什么优势,这里不作具体解释。只放出一个大胆的预言,就是在未来,尤其是在Server端,将会是函数式编程的天下。 Anyway,Elm是一门函数式编程语言,它是一门静态的,强类型的语言,目前主要targeting在Web端,因此它有一个compiler可以编译成JS。 目前,编译成JS的语言已经有非常多了,如CoffeeScript,TypeScript,PureScript等等,甚至很多现有的general purpose语言现在也有了一些工具,用来把它们编译成JS,如Clojure 有ClojureScript,Scala有Scalajs,Ruby有Opal等等等等。 为什么有这么多的新语言编译成JS,又有这么多工具把其它语言编译成JS呢?这些说白了其实都是想取代JS,这说明一个问题,那就是JS不够好,这个跟JVM上面有这么多语言原因是类似的。 Elm也是出于同样的原因,它想要发明一种全新的Web语言,用于取代JS。那在这么多语言中,Elm的优势是什么? 经过这两天的接触,我了解到它的优势有以下几个: No Runtime Error。”Undefined is not a function” 有没有遇到过?如果你做过一段时间前端开发,你不可能没有遇到过这个问题。类似的Runtime Error还有非常多。然而,Elm声称可以完成避免Runtime Error!这绝对是无可比拟的一个优势。美国的一家公司NoRedLink声称,他们的产品上线一年多,目前遇到的Runtime Error是0个!这个还是非常有诱惑力的。 纯粹的函数式编程,Immutable data和pure function,让你的代码变得干净,0耦合,不易出错,容易重构,易读,易测。这些都是JS界目前大力推进的方向啊,不然要immutable.js干吗?要Ramda干吗?要RxJs干吗? 有一个“官方”的App architecture,这是一个非常优秀的architecture,有多优秀?Redux大家都知道,现在其实已经是Web app实际上的标准architecture,然而Redux的思想其实是从Elm的architecture学来的! 总之,我觉得这个视频里面有一句话总结得非常好,那就是Elm是现在整个JS界的发展趋势,然而JS还有很长一段路要走。 那Elm完美的吗?当然不是,我这两天接触下来,发现它仍然处于比较年轻的状态,虽然官方声称它已经production ready,也确实有好一些公司已经用于正式的产品中。然而我相信都不是很容易的事情。目前来说,我觉得有以下几个问题需要极需改善: 社区太小,这可能是目前最大的问题,在国内更是如此。如果你在百度上面搜”Elm“,出来的结果基本都不是Elm语言相关的。当然这也不赖Elm,因为你在百度上搜其它东西,基本出来的结果也不是你想要的。 函数式编程与OO或过程式编程差别太大,上手真不是很容易,这会在很大的程度上影响到它的采用率。 Elm语言和编译器本身也有一些东西有等完善,如目前还不支持String interpolation,elm reactor(类似于webpack-dev-server)不支持hot reload,其实之前是支持的,后来发现了bug,就去掉了。Time travel debugger也是,本来是有的,后来发现有bug又去掉了。当前这些都不是很严重的问题,比如hot reload只是节省了你手动刷新页面的功力而已。然而从这些”原来有,后来发现有bug又去掉“这些事情中就能说明这个东西还不是很稳定的问题。 接下来打算在公司的内部小工具上面试用一下,因为Elm文件是可以跟JS交互的,所以应该不是太大的问题,大不了再用回JS嘛。但是函数式编程作为未来的发展趋势,还是要了解一下的。所以,总体来说,我觉得这是一门非常值得学习的语言。 如果你对Elm感兴趣,欢迎加我微信(875156226),共同交流。

Categories
未分类

买颗星星送给你

如果在你临死前,突然给你三百万,你会做什么呢? 很久很久以后,有个人——我们叫他小明吧。用现代话(在他看来应该是文言文)来说,小明是个典型的”屌丝“。单身,工作不是非常顺利,也没什么朋友。这倒不是他性格有什么问题。。。哦,他性格确实比较孤僻敏感,但这倒不是因为他人品有什么问题,只是从小的经历让他有了现在的一些性格。 他出身于一个知识分子家庭,受的是贵族的教育,然而由于父母都没有什么社交能力,他们家庭的物质方面比较贫寒。因此一直生活在社会底层,自然接触的都是社会底层的人,然而因为他从小受的是贵族教育,他打心眼里对这些人有一些排斥心理,自然无法跟这些人建立起深厚的关系,因此从小到大都没什么亲密的朋友。感情方面则更加不用说,大学毕业之前,他都没跟女生说过几次话。这仅有的几次跟女生接触,是一个非常美丽善良、温柔漂亮、对任何人都很好的女生。自从第一次接触,那个女生就如阳光般温暖了他的整个心灵,女生也就这样在他心里永远的扎下了根,让他就这么一直暗恋着暗恋着暗恋着。。。 家庭方面呢,也不和睦,父母在他上初中的时候离异了,他和姐姐跟了父亲,现在父亲身体不好,一直是姐姐在照顾,自然姐姐会有怨言,因此姐弟关系也不算好。 但现在这些都不是事,如今有更加重要的问题摆在他面前,那就是,他得了绝症,肺癌,癌细胞已经扩散到全身了。也就是说,他现在是一个将死之人。 令人讽刺的是,在这个时刻,他突然得了一大笔钱,是怎么来的呢?原来很久之前,在跟仅有的几个谈得来的朋友谈话过程中,偶然间给了他朋友一个启发,他朋友根据他的这个idea,制造出了一种饮料,结果卖得非常好,发了大财。这位朋友也是个有良心的人,为了回报小明,给了他三百万。 现在停下来想想,如果你在他这种情况之下,你会拿这笔钱做什么呢? 好吧,我知道你肯定很想知道小明用这笔钱做了什么。小明做的事情是,他拿这笔钱给那个他一直暗恋的女生买了一颗星星。是的,在他这个年代, 这确实是个浪漫的故事,如果你觉得好像在哪看过这个故事的话,不用怀疑,这就是三体里面的故事,小明就是云天明,女生叫程心。我只不过一时兴起,想要复述一遍而已。 如果你不怕剧透的话——其实剧透了也没关系,这个故事只是三体故事中一个小小小小的插曲——我想说不幸的是,这个故事我们都只猜到了开头,没猜到结尾,在接下来的故事里面,事情并没有像我们想象的那样历经千辛万苦,最终浪漫的结束,小明和小程Live happily ever after,而是女生一个人多次毁灭世界于希望之中,最后只剩下她和另外一个高富帅逃离到星际之外去了。 —全剧终—