自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

FanMLei的博客

努力成为一名GEEK!

  • 博客(77)
  • 收藏
  • 关注

原创 Postgresql的全文检索功能

之前做过一个jieba+whoosh的商品搜索功能,后来发现Postgresql数据库自带有全文检索的功能,那么就尝试使用Postgresql的全文检索功能来实现一次postgresql配置环境:Ubuntu16.04版本:v9.5外部远程访问:数据库配置文件路径为 /etc/postgresql/9.5/main需要修改的配置文件为postgresql.conf和pg_hba....

2019-04-17 10:10:14 3240

原创 jieba+whoosh实现简单的商品搜索功能

功能描述实现一个类似淘宝的搜索功能,例如下面这个例子简单点来说我们需要先根据商品名称创建索引,然后再用索引文件匹配去查询字符串来实现商品的搜索,这种搜索是有别于正则匹配的,他会对字符串进行分词处理,准确度也会更高。准备工作这个项目种主要用到了jieba、whoosh两个库,其中jieba实现对中文的分词处理,whoosh则是创建索引文件。安装依赖:系统:Ubuntu 16.04...

2019-04-17 00:44:39 1733

原创 从零开始搭建物联网平台(10):微信登录和用户绑定

微信小程序不支持Cookie的,所以为了保存用户登录状态就必须换一个方式实现,这里采用jwt的方式,关于jwt简单来说就是第一次登录验证成功后对想要保存的信息进行加密,然后将加密过后的内容返回给前端,前端每次请求的时候都携带上这个token,后端拿到token后对其解密就能获取之前保存的信息了。整体流程:这里先看一下小程序官方给的登录流程,这只是最基础的流程,根据设计需要我们还需要添加自己...

2019-03-19 21:41:04 4797 8

原创 从零开始搭建物联网平台(9):快捷指令和指令发送

回来更新了,先说明一下,这个项目没有烂尾,没有烂尾,没有烂尾,第一版其实已经做完几个月了,后来想实现小程序端的部分功能,最后结果就是导致小程序和web两个的接口不兼容,而且第一次设计的时候有很多地方没有设计好,所以又推翻重做了,在这一版本中,会对接入设备的订阅和发布做出严格的限制(无法订阅除系统topic之外的消息,无法发布没有注册的消息),但是为了实现部分设备之间的通信会设置一个自组网络,可将自...

2019-03-11 15:10:14 5212 7

原创 对Python装饰器的理解

想要弄明白装饰器是什么东西,首先我们需要了解一下什么是闭包,因为装饰器是闭包的一种应用。闭包闭包的定义:​ 通俗的来说闭包就是在一个函数内部定义另外一个函数,这个函数又引用了外部函数的变量,并且外函数的返回值是内函数的引用,下面是一个最简单的闭包示例:def outer(): a = 10 def inner(): print(a) return i...

2019-03-07 02:21:08 819

原创 HTTP协议基础

HTTP协议基础总结于图解HTTP协议文章目录HTTP协议基础什么是URI和URL?URI格式HTTP协议用于客户端和服务器端之间的通信HTTP状态码WEB服务器HTTP首部什么是URI和URL?URI(统一资源标识符)表示的是某一个互联网资源, URL(统一资源定位符)相交于URI我们对于URL要更为熟悉一些,我们在浏览器上输入的网站地址其实就是一个URL 例如:http://www.g...

2019-03-05 02:13:30 671

原创 MySQL必知必会总结(二)

计算字段一般数据库中存储的数据可能不会是我们所需要的格式,例如存储一个地址,在数据库中可能会将城市、区和街道分别存入不同的列中,但是我们可能需要直接获取一个完整的地址,这时候就需要做一些转换操作了,可以直接取出每个字段的值,然后在我们自己的程序中组合,同样也可以使用SQL直接在数据库中完成,而且一般来说在数据库中完成这些操作要率相对于我们自己去实现要快,下面就是一些常用的计算方法。表:...

2019-03-01 02:36:03 583 2

原创 MySQL必知必会总结(一)

去重MySQL中不能部分使用DISTINCT,DISTINCT关键字会应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT score,age,除非指定的两个列都不同,否则所有行都将被检索出来。例如如下的表namescoreagetest11111test21111test3123123test412311SEL...

2019-02-28 19:05:56 722

原创 微信小程序开发总结

微信小程序开发1.数据绑定 {{ name}} ,和vue不同的是如果直接更改data并不会重新渲染,而是要使用setData({name:data})的方法2.调用组件的方法:获取元素: const ele = this.selectComponent(id)调用组建的method中的方法: ele.functionName()3.组件中的properties和da...

2019-02-27 13:08:57 815

原创 从零开始搭建物联网平台(8):邮箱通知服务

关于触发器的通知,最开始有三种打算 微信公众号、 邮箱、 HTTP,最后发现微信公众号平台无法主动向用户推送消息,所以微信公众号暂时不做了,看看有没有其他的解决方案搭建SMTP服务发送邮件可以借助第三方平台如163、QQ等等,但是使用个人账户去做都是有最大发送数量限制的,为了稳妥起见还是决定搭建自己的STMP服务来发送邮件。以ubuntu 14.04为例:借助于postfix搭建SMT...

2018-12-27 16:19:30 3621 3

原创 使用CDN优化首页加载速度

之前使用vue构建的前端页面每次加载都需要十几秒的时间,最初的时候因为浏览器有缓存一直没有发现这个问题,后来换用设备访问的时候才发现。不想花费太多的时间去优化vue的代码,感觉作用不大,毕竟服务器带宽只有1M,再怎么压缩文件大小都需要很长时间传输,所以使用CDN去加速静态资源先看一下之前的加载速度,简直惨不忍睹首先需要在云服务商那购买CDN服务,我的服务器是腾讯云的正好腾讯云也有免费的CD...

2018-12-17 20:27:44 3955

原创 Django+Vue前后端分离项目的部署

前后端分离项目的部署主要使用Nginx和uwsgi来实现,把Nginx换成Apache也是可以的,看个人喜好。Nginx主要处理静态文件,uwsgi用来部署Django项目,处理其他请求安装uwsgi:pip3 install uwsgi测试uwsgi:首先创建一个test.py文件def application(env, start_response): star...

2018-12-17 15:59:42 5568 2

原创 Docker命令

安装 apt-get install docker.io获取镜像:docker pull <name>运行一个容器: docker run <参数> <image name> 参数-d, --detach=false, 指定容器运行于前台还是后台,默认为false -i, --interactive=false, 打开STDIN,用于控制台交互...

2018-11-28 11:33:44 568

原创 Django中间件执行流程和CSRF验证

中间件执行流程django的中间件是一个轻量级的插件,可以改变django的输入和输出,中间件共有5种方法,分别为:process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) process_template_response(self,reque...

2018-11-28 01:19:59 2838

原创 Django rest framework 认证组件源码分析

基础知识想要弄清楚rest framework的执行过程首先需要明白Django中CBV和FBV执行流程,http请求最最本质的就是一个socket,一个请求过来第一步就是做路由匹配,在FBV中因为视图本身就是一个函数,所以直接调用函数就可以了,但是CBV中视图是一个类而在这个类里面是我们编写的视图函数,所以比FBV多了一步如何找到那个函数并且执行它。CBV中是基于反射实现请求方式不同执行...

2018-11-27 16:49:19 4432

原创 对于Python闭包的理解

首先看一个面试中非常常见的题目def num(): return [lambda x: x * i for i in range(4)]print([ n(2) for n in num()])先看一下num函数的作用,定义了一个匿名函数,返回传入参数乘以列表生成式的每一个元素,所以乍一看结果应该为[0,2,4,6],如果这样想的话就落入陷阱了。这个题目考察的就是在pyt...

2018-11-23 11:23:33 1933

原创 Leet Code OJ 简单(四)

88.合并两个有序数组     56ms  提交中击败了47.05% 的用户class Solution: def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] ...

2018-11-22 17:46:58 263

原创 从零开始搭建物联网平台(7):使用Vue编写前端页面

摘要:Vue我也是刚开始学的,看了两天的文档就开始着手做这件事了,所以对vue了解不太深入,没有能力说的的太详细万一是错误的不就误导别人了,所以只对几个相对来说比较主要的点说明一下。搭建开发环境:老生常谈的话题!首先自然是要安装nodejs,这个直接去官网下载安装即可,再使用命令npm install vue、npm install -g vue-cli去安装vue和脚手架工具,完成之...

2018-11-22 17:33:43 7289 6

原创 从零开始搭建物联网平台(6):消息的持久化

遇到的问题:查看了EMQ文档发现并不提供消息的持久化功能,MQTT协议是按照设备一直在线设计的,数据都是保存在内存里的,但是考虑到用户上传传感器数据不可能接收了就扔掉,那样就没法查看历史数据了,所以用户上传的消息必须要能够保存下来,以便查看历史数据,这样一来持久化功能就需要我们自己来实现。另外还会出现一个问题,当两个设备注册的主题名一样的时候,不能分出是哪一个设备发出的消息,在接收订阅消息...

2018-11-07 11:43:57 5106 8

原创 从零开始搭建物联网平台(5):搭建后台服务(一)

数据库的设计:后台使用Django web框架实现,Django和python怎么用就不介绍了,东西太多了,看完下面的这些博客就可以了,差不多就够了https://www.cnblogs.com/wupeiqi/articles/4938499.html数据库设计:         我是这样想的,首先会有一个主账户,也是登陆网站的账户,其下可创建设备,每个设备又都可以创建不同的数据流,数...

2018-11-05 16:39:01 9271 7

原创 从零开始搭建物联网平台(4):订阅系统主题获取设备上下线消息

$SYS-系统主题先来看一段EMQ对于系统主题的介绍:EMQ消息服务器周期性发布自身运行状态、MQTT 协议统计、客户端上下线状态到$SYS/开头系统主题。$SYS 主题路径以 “$SYS/brokers/{node}/” 开头,’${node}’ 是 Erlang 节点名称系统主题主要包括一下几大部分: 1 :服务器版本、启动时间与描述消息 ...

2018-11-04 17:55:29 5477

原创 从零开始搭建物联网平台(3):硬件部分的连接测试

搭建开发环境:在开篇的时候就说过硬件部分会使用Arduino平台和NodeMCU,只是Arduino平台不能直接对NodeMCU进开发,正好换电脑了也需要重新安装一遍,就顺便说一下。首先下载ArduinoIDE安装包官网太慢可以用这个链接:Arduino 1.8.7我使用的版本是1.8.7,安装完成之后进入到首选项在附加开发板管理器网址处填写:http://arduino.esp8266....

2018-11-04 03:42:50 8078

原创 从零开始搭建物联网平台(2):MQTT服务的搭建

EMQ:现有的MQTT服务器有很多,例如Mosquitto、Apache-Apollo、EMQ等等,最后呢选择了EMQ毕,国内公司的开源产品,中文资料相对要多一些。EMQ的官网宣称是百万级分布式开源物联网MQTT消息服务器,百不百万倒无所谓,反正是给自用的没有那么多的数据产生。安装:服务器系统版本为Ubuntu14.04,首先在EMQ官网下载对应的安装包http://emqtt.com...

2018-11-04 02:58:40 13207 8

原创 从零开始搭建物联网平台(1):开篇

前言:读大学的时候学的是物联网工程,大概是在大二的时候开始接触单片机,那时候特喜欢捣鼓那些东西,就觉得特别酷有极客范。还记得第一次做物联网相关的是一个远程控制的开关,第一次调通的时候真的很兴奋,啥也没干就挂在那用手机控制继电器听咔嗒咔哒的声音,现在想想真的好小儿科,明明只是按照人家的教程改改代码却也能兴奋那么就。但是有一句话不是说所有的编程语言第一个代码都是Hello World,一切都要从最...

2018-11-04 02:58:07 13735 4

原创 常用排序算法:基数排序

算法思路:步骤:1. 创建10个队列(0-9)                      2. 遍历每个数位,按照位数存入不同的桶中                      3. 然后再将桶中的元素依次取出,放回到原有列表中                      4. 继续执行上两步操作,直到列表中每个数的每一位都做完成排序                      5. 最后取...

2018-10-25 14:52:09 247

原创 常用排序算法:桶排序

算法思路:我们之前提到过计数排序,计数排序在某些情况下并不太适合,例如元素范围太大的情况,桶排序算是对于计数排序的一种改进,桶排序首先根据元素大小放置到不同的桶中,然后在对每一个桶内元素进行排序。例如数组[29,25,3,49,9,37,21,43],可以以10为区间来存放元素,具体操作如下图:关于“桶”这个结构怎么实现,在python里面可以用二位数组来表示[ [  ], [  ...

2018-10-24 23:58:39 352

原创 常用排序算法:计数排序

算法思路:顾名思义计数排序就是统计每个数出现的次数,例如给0-20范围内的数排序,首先建立一个长度为21的空数组,然后统计每个数出现的次数,再按照下标存入空数组中,例如1出现10次那么数组中的第二个元素为10 ,统计完所有的数之后呢在新建一个数组,在遍历之前存放次数的数组,按照个数往新数组中添加对应的数。以一个例子来说明[1,2,3,1,0,4,1,3,4,2,0,1,2,3,4]排序过程...

2018-10-24 17:39:25 355 1

原创 常用排序算法:希尔排序

算法思路:希尔排序算是插入排序的一种,是改进版的直接插入排序,和直接插入排序不同的是它是按组进行插入排序的。步骤如下:取一个整数d1 = n / 2,将元素分成d1个组,每组相邻元素之间距离d1,然后在每组内部进行直接插入排序。 取第二个整数d2 = d1 / 2再将元素分成d2个组,然后再在每组内部进行插入排序。 重复上面的步骤直到d = 1 的时候即所有元素在同一组进行插入排序...

2018-10-24 16:53:06 270

原创 常用排序算法:归并排序

算法思路:简单来说归并排序就是将两个有序的序列合并成一个完整的有序序列。具体步骤如下:           1. 选取序列1的第一个元素和序列2的第一个元素,较小的存放到新序列的第一位           2. 选序列1的第二个元素再和序列2的第一个元素比较,选较小的存放到新序列的低二位           3. 重复上述步骤直到序列1序列2没有下一个元素为止那么问题来了,一个无...

2018-10-24 03:08:27 234

原创 常用排序算法:堆排序

算法思路:堆:分为大根堆和小根堆       大根堆:一棵完全二叉树,满足任意一节点都比其孩子节点大。       小根堆:一棵完全二叉树,满足任意一节点都比其孩子节点小。堆排序流程: 构造堆 得到堆顶元素,为最大元素 去掉堆顶,将堆的最后一个元素放到堆顶,然后调整重新使堆有序 堆顶元素为第二大的元素 重复第三步直到堆变空例如以[4, 5, 3, 6, 1, 2 ]为...

2018-10-23 18:20:14 203

原创 常用排序算法:快速排序

算法思路快速排序差不多是面试中问的最多的一种排序算法了,快排是比较容易理解的,核心思路就是,选取一个数作为基准,将原来的列表分为两个部分,一部分全部小于这个基准数,另外一部分全部大于这个基准数,然后呢再按照这个方法对划分出来的两部分继续做同样的操作,直到无法划分的时候排序也就完成了。以数组[3,2,1,5,4,6]为例,其排序过程如下图所示。关于时间复杂度问题, 平均复杂度n log(...

2018-10-23 15:00:21 259

原创 常用排序算法:直接插入排序

算法思路插入排序就跟我们打扑克抽牌是一样的形式,每次新抽的牌插入到已有的有序牌中,是牌始终保持有序状态,例如[1,3, 2,4,0] 数组,先将1作为起始牌,下一张牌为3,第一趟完成后变成[1, 3]有序数组和[2,4,0]无序数组,接下来插入2,有序数组变成[1,2,3],无序数组变成[4,0],以此类推知道将所有的无序数组都插入完毕就能完成排序操作。插入排序算法适用于少量数据的排序,时...

2018-10-22 16:54:19 138

原创 常用排序算法:直接选择排序

直接选择排序算法思路:第 1 趟,在待排序记录 r1 ~ r[n]中选出最小的记录,将它与 r1 交换;第 2 趟, 在待排序记录 r2 ~ r[n]中选出最小的记录,将它与 r2 交换;以此类推,第 i 趟在待排序 记录 r[i] ~ r[n]中选出最小的记录,将它与 r[i]交换,使有序序列不断增长直到全部排序 完毕。例如[2, 4, 3, 1, 0],第一趟找到最小值为0,将0和第一...

2018-10-22 13:40:59 222

原创 常用排序算法:冒泡排序

冒泡排序思路:列表中的每两个相邻的数,如果前面比后面的大,则交换这两个数。直到列表变为有序的时候为止,例如下面这个列表           [ 2,  1,  3,  0,  7,  6,  5,  4]第一趟:                  第一步:列表的第一位和第二位比较:如果第一位大于第二位,则交换两者位置。由于2大于1,所以此时列表 为:[1,  2,  3,  0,  7...

2018-10-18 21:39:08 199

原创 Leet Code OJ 简单(三)

58.最后一个单词的长度  52msclass Solution: def lengthOfLastWord(self, s): """ :type s: str :rtype: int """ s = s.split(' ') while "" in s: s.r...

2018-10-18 20:44:57 207

原创 Leet Code OJ 简单(二)

20. 有效括号  48msclass Solution: def isValid(self, s): """ :type s: str :rtype: bool """ if len(s) % 2 : return False brackets = {'(': '...

2018-10-18 00:42:07 197

原创 Leet Code OJ 简单(一)

1.两数之和  3780msclass Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ for i in ...

2018-10-16 20:09:29 278

原创 Python字典的实现原理

以下是自己的学习记录,算是一个总结。接下来会依次对下面问题做一个解答:    1. Python的dict和set为什么是无序的?    2. 为什么不是所有的python对象都可以用作dict的键和set中的元素要弄懂上面的问题,我们首先要了解Python内部是如何实现dict和set类型的。我们先来看看dict的内部结构,dict其实本质上是一个散列表(散列表即总有空白元素的数组,...

2018-10-12 10:49:37 3147

原创 list.sort方法和内置函数sorted

list.sort方法和内置函数sorted的异同list.sort方法和sorted函数都是对列表进行排序的,但是这两种方法也是有少许不同的,list.sort排序是在原有基础上进行的,不会生成返回一个新的list, 但是sorted函数则不同,他会产生一个新对象并返回。如下t = [1, 3, 4, 2, 5, 0]t1 = [1, 3, 4, 2, 5, 0]print(t.s...

2018-10-11 12:12:40 5762

原创 Git命令

1. git init初始化版本库2. git config --global user.name (your name) 配置 git config --global user.email (your email)3. git add (file name) 将文件放置到缓存区4. git commit -m (describe)将缓存区的文件提交到分支...

2018-10-09 10:55:27 149

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除