近期文章

猿来如此 2018-04-14

申请Let's Encrypt通配符证书

Let's Encrypt终于支持通配符证书了,也就是说你只需要为你的网站申请*.example.com这样一个证书,所有的子域名都可以支持,下面介绍下申请方法:

首先需要获取acme.sh

curl https://get.acme.sh | sh

acme.sh支持自动配置DNS,这样需要在域名控制后台获取AppKey和AppSecret.常见的阿里,Dnspod等都支持,这里有更详细的介绍:传送门 下面以Dnspod为例,首先获取AppKey和AppSecret 传送门.然后执行如下命令:

# 替换成从Dnspod后台获取的密钥
export DP_Id="DP_Id"
export DP_Key="DP_Key"
# 换成自己的域名
acme.sh --issue --dns dns_dp -d lylinux.net -d *.lylinux.net

这里是通过休眠120秒等待DNS生效的方式,所以至少需要等待两分钟,如果看到了验证成功的输出,则说明已经申请成功了。这种方式成功之后,会记录下App_Key跟App_Secret,并且生成一个定时任务,每天凌晨0:00自动检测过期域名并且自动续期。 下面再介绍下使用Docker来申请的方式:

docker run --rm  -it  -v "$(pwd)/ssl/":/acme.sh  -e DP_Id...
随笔杂谈 2018-04-14

网站搬家小记

前段时间阿里云做活动,300多就可以买到3年的服务器,果断注册一个新用户入坑,选的地区是在上海,平均延迟就几十毫秒的样子,比以前在linode的服务器爽的多了。远程登录也没有很强的延迟感

最近开始研究了下Docker,可以很方便的集成各种开发环境,于是用Docker重新部署了下服务器,现在运行所依赖的Mysql,Memcache,Python环境等等都使用Docker跑了起来,而且可以本地写好配置文件,服务器重新build,本地和服务器可以无缝切换,这种感觉真的太爽了。 Docker的主要配置在: https://github.com/liangliangyy/docker_config
大家如果用到的话可以参考下。 嗯,就酱。

6290 5
CSharp 2018-02-03

Asp.Net 中的异步死锁

首先大概介绍下asyncawait这两个关键字。
在.Net 4.5中,微软为了方便异步编程提供了asyncawait这两个关键字,使用他们,可以使我们很方便的实现自己的异步代码,而不用太去关心其内部原理。那么他们的主要作用使什么呢? async关键字加在方法的声明上,他的主要目的使为了使方法内部的await关键字生效。而方法的返回值也一般是Task或者Task<T>类型。这些Task类型一般相当于是future,用来在异步方法结束时通知主程序。如下面示例代码:

public async Task DoSomethingAsync()
{
    int val = 1;
    await Task.Delay(TimeSpan.FromSeconds(1));
    val *= 3;
    await Task.Delay(TimeSpan.FromSeconds(2));
    Console.WriteLine(val);
}

和同步方法一样,async方法在开始时候以同步方式执行。在async方法内部,await关键字对他对参数执行了一个异步等待,他首先检查操作是否已经完成,如果完成了,则继续执行。否则,他会暂停async方法,并返回,留下一个未完成的task。一段时间操作完成后,async方法恢复执行。
当异步方法在await处暂停时,就可以捕捉上...

Python 2018-01-24

使用树莓派和OpenCV 实现家庭监控和移动目标探测

本篇文章主要是分享使用opencv和树莓派实现的移动目标探测,所以需要有opencv环境,另外你的电脑必须有摄像头支持。 具体参考自伯乐在线的 这篇文章 具体内容大家可以参考下原文,我在其基础上大概修改了下,下面是代码:

import datetime
import time
import cv2
import logging
import imutils
import os

lastSaveTime = datetime.datetime.now()
motionCounter = 0
path = os.path.split(os.path.realpath(__file__))[0]
avg = None
cap = None
i = 0
logfilename = path + '/logger.log'
logging.basicConfig(filename=logfilename, level=logging.INFO)
while (1):

    timestamp = datetime.datetime.now()
    if timestamp.hour >= 18 or timestamp.hour <= 9:
        logging.info('time:' + str(timestamp.hour))
        time.sle...
Linux 2018-01-22

mysql修改root密码或者host后无法登陆解决办法

今天在树莓派上安装了mysql之后,发现无论输入密码是否正确,都会报错误:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

在网上找了好久的解决办法,终于成功了,过程如下:

首先将my.ini中在[mysqld]节点上加

skip-grant-tables //主要作用是:跳过表中的验证,可以无密码登陆。

保存并重启mysql 然后直接终端使用mysql命令登录之后查询plugin字段值:

mysql> use mysql;
mysql> select plugin from user where user = 'root';

执行结果plugin字段为空。

更新plugin字段为mysql默认值:

mysql> update user set plugin='mysql_native_password';

更新成功,继续执行更新密码操作:

mysql> update user set authentication_string=password('123456') where user='root' and host='localhost';

刷新权限:

mysql> flush privileges;

将my.ini中的

sk...
Python 2018-01-06

Django 2.0升级小记

备受期待的django 2.0已经发布了,最大的一个变化就是不再支持python2.x版本了,另外还有在使用方面有了一些变化,下面就介绍下我在升级的时候遇到的错误。

from django.core.urlresolvers import reverse

变成了

from django.urls import reverse
  • settings.py文件,MIDDLEWARE_CLASSES更改成了MIDDLEWARE

  • django.shortcuts.render_to_response()方法已经被弃用了,现在使用django.shortcuts.render()方法。

  • User.is_authenticated()User.is_anonymous()方法更改成了属性:User.is_authenticatedUser.is_anonymous
  • 删除了SessionAuthenticationMiddleware类,不再需要该中间件,在Django 1.10+中已经默认开启了。
  • @register.assignment_tag改成了@register.simple_tag
  • 为model的ForeignKeyOneToOne的属性增加on_delete=models.CASCADE
  • url更简单了,如下:
path(r...
6220 9
发现更多