一个基于QT的多媒体播放器


这个播放器是大学时候做的毕业设计,使用qt+phonon实现,支持音视频播放,支持同步显示歌词。是无意中在电脑里翻出了这个项目的源码,然后在ubuntu机器中安装了下环境编译之后竟然能够成功运行,看着这个界面和源码真是感慨良多,转眼已经毕业好几年了,真的是物是人非。。。
为了不让它在电脑继续里吃灰,还是分享出来,希望可以帮到可以用到的人吧,下面大体介绍下编译方式。

安装方式:

以ubuntu为例:

安装依赖

sudo apt update
#安装qt环境:
sudo apt install qt4* -y
sudo apt install qtcreator -y
#安装phonon
s...

Read more

使用Django模版生成树状结构


我们经常会有这样的需求,比如评论功能,每个评论都有可能会有自己的子评论,如果在界面只展示成一列的话非常不美观,也不能体现出他们的层级关系。那么我们今天就来看看如何使用Django的模版来生成树状结构,以本站为例,效果如下图所示:

那么我们要怎么实现呢?首先先看看评论实体的定义,如下所示:

class Comment(models.Model):
    body = models.TextField('正文', max_length=300)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose...

Read more

python中的协程


先介绍下什么是协程:

协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。

是不是有点没看懂,没事,我们下面会解释。要理解协程是什么,首先需要理解yield,这里简单介绍下,yield可以理解为生成器,yield item这行代码会产出一个值,提供给next(...)的调用方; 此外,还会作出让步,暂停执行生成器,让调用方继续工作,直到需要使用另一个值时再调用next()。调用方会从生成器中拉...

Read more

函数装饰器和闭包


装饰器基础知识

装饰器是可调用对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。 假如有一个名为decorate的装饰器:

@decorate
def target():
    print('running target()')

上述代码的效果与下述写法一样:

def target():
    print('running target()')
target = decorate(target)

两种写法的最终结果一样:上述两个代码片段执行完毕后得到的target不一定是...

Read more

为你的Django项目保驾护航


保证你的站点安全至关重要,如果你的站点被入侵,后果可能不仅仅是你的服务器被黑,更严重的可能是你的用户隐私数据被盗,造成严重的后果。 Django框架现在已经非常成熟,大多数常见的安全问题框架本身都有提供解决方案,下面大致介绍下一些常见的防御措施。

Https

现在的网站https基本都是标配了吧,如果你的网站还没有支持https,那么就要考虑是不是需要尽快为你的网站加上https,这里推荐使用免费的Let's Encrypt。本站使用的就是他们颁发的证书。可以参考该文章:
申请Let's Encrypt通配符证书 有大致的介绍。 如果你的站点已经支持了https访问的话,建议在se...

Read more

使用Docker部署Ngrok实现内网穿透


以前写过一篇文章, ubuntu安装ngrok并使用nginx代理,介绍了在ubuntu上安装ngrok,但是是需要在系统中安装gvm等依赖,而且过程还是挺麻烦的,正好今天有时间,于是试着使用Docker来部署下,下面介绍下如何部署。

准备工作

域名解析

首先,需要在你的域名提供商处增加两条A记录解析到你的服务器,比如我的是 ngrok.lylinux.net*.ngrok.lylinux.net。这样你可以使用subdomain的方式,来实现穿透。

配置

目录结构如下图所示, 目录结构

可以看到,有必须的Dockerfile文件,build.sh是编译ngrok的脚本,config....

Read more