飞污熊博客

静下心来做一件事

到目前为止,你的网站只能在你自己的电脑上访问到。你需要将它发布到公网上去让地球上的人都能看到,那么要怎么做呢?

在互联网上你可以找到很多的服务器供应商。我们将使用一个相对简单的托管平台PythonAnywhere。 PythonAnywhere对于一些没有太多访问者的小应用是免费的,所以它对你来说绝对是足够使用的。

其它我们将使用到的外部服务是GitHub,它是一个代码托管服务。还有其它的一些服务,但当今几乎所有的程序员都有 GitHub 帐户,相信你肯定有一个!

阅读全文 »

django的模型就是用于在数据库中存储的某种类型的对象。在我们的博客系统中, 发表的文章就是一个模型,需要存储在数据库中。 这里我们使用django默认的sqlite3库,对于我们的这个小系统而言已经足够了。

阅读全文 »

笔者用过django一段时间了,是时候做点笔记了。不过官网文档稍微有点复杂,对新手而言很困难, 而网上的一些教程很多都过时了。最近看到一个外文的教程非常不错,网址是:http://tutorial.simpleblog.org/, 这个是基于django1.9和python3.4,通俗易懂,非常适合新手入门。 那么我自己参考这个整理了一下这个教程,同时还将源码上传到GitHub上去了。希望对于大家有帮助。教程中如果有不足之处希望大家不吝赐教 ^_^

参考教程:http://tutorial.simpleblog.org/

GitHub项目地址:https://github.com/yidao620c/simpleblog

演示地址:https://yidao620.pythonanywhere.com/

非常期待有人合作一起完成正式版1.0。目前有74个人fork,但暂时还木有收到任何的pull requests。→_→

阅读全文 »

redis中的事务transaction是一组命令集合,要么都执行,要么都不执行。

1
2
3
4
# MULTI
# SADD "user:1:following" 2
# SADD "user:2:followers" 1
# EXEC

redis将客户端发送的事务执行链放入一个队列queue中,然后接受到EXEC请求后才顺序执行这个命令串,同时保证执行这些的时候不被其他命令打扰。

错误处理:

  • 语法错误,redis直接返回错误,连语法正确的其他命令也不会执行
  • 运行错误,只有那条出错的语句不会执行成功,其他照样执行

redis木有rollback机制,这个要靠自己去处理出错情况。

阅读全文 »

strings类型及操作

string是最简单的类型,你可以理解成与Memcached是一模一样的类型,一个key对应一个value, 其上支持的操作与Memcached的操作类似。但它的功能更丰富。

string类型是二进制安全的。意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。 从内部实现来看其实string可以看作byte数组,最大上限是1G字节,下面是string类型的定义:

1
2
3
4
5
struct sdshdr {
  long len;
  long free;
  char buf[];
};

len是buf数组的长度。

阅读全文 »

更新于2017/08/02,使用最新版 redis 4.0.1 演示

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库, 并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。

和普通的Key-Value结构不同,Redis的Key支持灵活的数据结构,除了strings,还有hashes、lists、 sets 和sorted sets等结构。 正是这些灵活的数据结构,丰富了Redis的应用场景,能满足更多业务上的灵活存储需求。

Redis的数据都保存在内存中,读写效率很高。为了实现数据的持久化,Redis支持定期刷新(可通过配置实现)或写日志的方式来保存数据到磁盘。

阅读全文 »

Buffer由数据和可以高效访问以及操纵这些数据的四个索引组成,这四个索引是:mark、position、limit、capacity。 下表是用于设置和复位索引以及查询它们的方法:

方法 说明
capacity() 返回缓存区容量
clear() 清空缓存区,position=0,limit=capacity,此方法可覆写缓存区
flip() limit=position,position=0,用于准备从缓存区读取已经写入的数据
limit() 返回limit的值
limit(int lim) 设置limit的值
mark() 将mark设置为position
position() 返回position的值
position(int pos) 设置position的值
remaining() 返回(limit - position)
hasRemaining() 若有介于position和limit之间的元素,返回true
reset() 将position设置为mark
rewind() 将position设置为0,也就是缓存区的开始位置

在缓存区中插入和提取数据的方法会更新这些索引,用于反映所发生的变化。

阅读全文 »

最近学习内部类的时候,对Java实现回调函数机制有了进一步了解,自己整理点比较,希望大家可以相互讨论。 所谓回调,就是允许客户类通过内部类引用来调用其外部类的方法,这是一种非常灵活的功能。

由于java暂时还不能显示支持闭包(Closure),不过听说新版可以支持了,不过我还没用过。现在暂时用的是非静态内部类实现回调功能。

阅读全文 »

海盗,大家听说过吧。这是一帮亡命之徒,在海上抢人钱财,夺人性命,干的是刀头上舔血的营生。在我们的印象中,他们一般都瞎一只眼, 用条黑布或者讲究点的 用个黑皮眼罩把坏眼遮上。他们还有在地下埋宝的好习惯,而且总要画上一张藏宝图,以方便后人掘取。 不过大家是否知道,他们是世界上最民主的团体。参加海盗 的都是桀骜不驯的汉子,是不愿听人命令的,船上平时一切事都由投票解决。 船长的唯一特权,是有自己的一套餐具——可是在他不用时,其他海盗是可以借来用 的。船上的唯一惩罚,就是被丢到海里去喂鱼。

现在船上有若干个海盗,要分抢来的若干枚金币。自然,这样的问题他们是由投票来解决的。 投票的规则如下:先由最凶猛的海盗来提出分配方案,然后大家一 人一票表决,如果有50%或以上的海盗同意这个方案, 那么就以此方案分配,如果少于50%的海盗同意,那么这个提出方案的海盗就将被丢到海里去喂鱼, 然后由剩下的海盗中最凶猛的那个海盗提出方案,依此类推。

阅读全文 »