图像与展示

最近学习移动网站建设,遇到了很多关于图片设计与跨设备展示方面的问题。首先第一个问题,就是分辨率(resolution)这个概念,让人很头疼,有时候,它用来形容显示器,有时候又用来描述图片,有时候用来描述像素多少,有时候又用来描述清晰度。查了一下相关资料,进行如下总结:

分辨率用来形容屏幕的时候,指的一块显示屏的横向和纵向的像素数量。如一块1440×900的显示器,它横向有1440个像素点,纵向有900个像素点,整个显示器可以表示1,296,000个像素。不同的显示器分辨率尺寸各不一样,我们可以用每英寸上含有的像素点数(DPI)来表示一块显示器的清晰度,通常情况下,普通PC的DPI为96,随着科技的发展,越来越多的高清屏幕出现在我们的生活中,例如MacBook可达227DPI,常见设备的DPI如下1: …阅读更多>>

坚持是什么

多年以前,也许是在小时候,我对需要很长时间才能完成的东西充满了恐惧,这种恐惧不同于一般的害怕,就是感觉这是不可能完成的,我根本花不了那么长的时间去坚持做完它。稍微大一点之后,才明白有些事情必须得坚持做,有人做,但是仍然对那些一直能坚持做一件事情的人感到不可思议。

上了大学,我坚持得最久的一件事是晚上和同学一起去操场跑步, 那是在大四的上学期,刚开始跑很累,但是跑了一段之后,发现又没有开始那么累了,于是我们不断挑战自己,最多的时候,跑了20多圈。那个时候,我知道,坚持就是离开舒适的环境,不断挑战自己。我们大概跑了2个多月,后来同学有事情离开,我一个人跑了没几天,就停下来了,那几天里,我认识到了孤独的可怕,它战胜了我坚持跑下去的决心。

说起孤独,我认为我是一个特别害怕孤独的人,这种感觉在我上大学离开故乡,来到一个陌生的地方之后尤其浓厚。那时的我特别害怕一个人,害怕一个人去食堂吃饭,害怕一个人拿着课本去教室上课,甚至害怕一个人去图书馆看书,那时的我,特别羡慕那些一走则成群结队的人,也特别希望自己有哪怕是一个形影不离的好朋友。从大一开始时,我就做了很多尝试,试图和某个同学建立良好的关系,我们可以一起吃饭,上课,看书,打游戏……后来虽然和这些同学关系都不错,但是一直都不是我理想的状态。 …阅读更多>>

协程与yield

协程,又称微线程或纤程,是一个比进程和线程更加轻量级的解决方案,现代编程语言基本上都支持。那么协程究竟有什么特点,它是如何运作的呢?
协程与yield
进程和线程之间的关系我在这篇文章中做了一下比较分析。线程是程序的运行流,所有指令从头到尾按顺序一一执行,进程则是包含线程的容器。在单核CPU中,永远只有一条线程在运行,当然也只可能有一个进程运行,由操作系统内核负责进程和线程的切换。而协程是属于用户空间的,操作系统对其一无所知,由用户自己去做调度。显然用户自己调度比通过使用一个中断让操作系统调度会快很多,这就是协程快的秘诀了。 …阅读更多>>

HTTP协议,浏览器缓存和网站速度优化

在计算机和网络的世界里,小到CPU,大到Internet,缓存无处不在。个人认为,缓存策略主要解决两个问题,第一个是解决不同设备IO速度不同的资源等待问题,第二个是解决相同资源重复传送的资源浪费问题。例如最常提到的CPU的三级缓存,就是为了解决CPU计算速度快,而读取内存速度慢导致CPU等待的问题。而我们上网的过程过,浏览器对已经请求的资源进程缓存,则属于缓存策略解决的第二个问题。本文主要分析一下HTTP协议,浏览器缓存和网站速度优化。

HTTP缓存 …阅读更多>>

C语言编译和执行分析

学过编程都知道,在所有高级编程语言中,C是运行最高效的语言, 一个重要原因是C语言是静态型语言,会直接被编译成机器码,然后被计算机直接运行。和大部分人一样,做对C语言编译之后的运行方式的充满了好奇,主要包括一下几个方面:

可执行程序是什么,里面只是包括一大堆机器码吗?
C语言中定义变量, 常量, 函数等等,在内存中是如何分布的,它们之间是靠什么相互访问的?
计算机当中,同时运行的进程非常多,每个进程都占用内存空间,程序编译的时候,如何知道自己运行时将要被加载到哪里,又如何被CPU执行? …阅读更多>>

迭代器漫谈

问题是在Python中进行循环的时候产生的,熟悉Python的都知道,它没有类似其它语言中的for循环, 只能通过for in的方式进行循环遍历。最典型的应用就是通过range函数产生一个列表,然后用for in进行操作,如下:

#!/usr/bin/env python
for i in range(10):
    print i

代码的意义很好理解,range会产生一个列表,用for in最这个列表进行遍历,就有和类似for(i = 0;i<n;i++)同样的效果,range函数的详解可以看这里。问题又来了,range这个对象会产生一个列表,那么这个列表的内容铁定是存放在内存当中的,当需要的循环数量太大时,是相当占用内存的, 为了统计使用range占用内存的情况,我做了6次使用,分别用range产生100,10000,100000,1000000,10000000,100000000长度的列表,然后统计内存的占用:

测试代码 占用内存
range(100) 2.0MB
range(10000) 2.2MB
range(100000) 3.8MB
range(1000000) 19.5MB
range(10000000) 168.5MB
range(100000000) 1465.8MB

可以看到,随着基数的加大,占用内存呈几何倍数增加,显然在进行大循环操作的时候,要避免使用range。 …阅读更多>>