协程与多任务调度

在计算机科学中,多任务(multitasking)是指在同一个时间段内运行多个任务,现代计算机作为一个复杂的系统,运行的任务往往不止一个,所以多任务调度对于计算机来说尤为重要。现阶段多任务调度主要分为抢占式多任务和协作式多任务,抢占式多任务由操作系统决定进程的调度方案,而协作式多任务是当前任务主动放弃执行后,下一个任务继续进行。由于协作式任务管理受恶意程序的威胁更大,现阶段几乎所有的计算机都采用抢占式多任务管理。
多任务处理
现阶段,主要靠多进程或多线程的方式来实现多任务:

#include <stdio.h>
#include <unistd.h>

int main()
{
	pid_t pid;
	pid = fork();

	if(pid < 0){
		printf("Fork Error!\n");
	}else if (pid > 0){
		printf("This is the parent Process! Process Id is %d, Child id is %d\n",getpid(),pid);
		int i = 0;
		while(i < 10){
			printf("This is parent Process output of i %d!\n",i);
			i++;
		}
	}else if (pid == 0){
		printf("This is the child Process! Process Id is %d, parent id is %d\n",getpid(),getppid());
		int j = 0;
		while(j < 10){
			printf("This is child Process output of j %d\n",j);
			j++;
		}
	}
	return 0;
}

...阅读更多>>

Web前端文件处理

在项目中,我们经常会有这样的需求,对上传的文件大小进行限制,传统的做法是在服务器端进行大小限制,例如nginx通过client_max_body_size,php.ini中可以通过upload_max_filesize和post_max_size来设置上传的文件大小。这种做法的缺陷很明显,数据上传到服务器之后,再对其进行监测,大大增加了宽带和服务器的压力。何不放在客户端进行检测?

在IE10及以下的版本,可以通过如下方式检测需要上传文件的大小:

<input type="file" onchange="checksize()"/>
<script>
function checksize(e){
	var ev = e || window.event;
	var uri =  ev.srcElement.value;
	var img = new Image();
	img.onload=function(){
		alert("文件大小为"+(img.fileSize)/1024+"KB");
	}
	img.src=uri;
}
</script>

上面的代码的运行原理是把上传的文件模拟成图片,通过其fileSize属性获取其大小,而由于浏览器的安全策略,其几乎只能运行在本地打开此网页的情况。加上微软在IE11上已经废除了fileSize的属性1,而现代浏览器厂商为了保护本地操作系统,在用户上传文件的时候,本地资源路径一律采用fakepath2,更加阻止了这种方法获取文件大小的可行性。 …阅读更多>>

给树莓派安装ArchLinux

ArchLinux是Linux的一个发行版,以简单,轻量为其设计理念。Archlinux是针对特定处理器而优化过的,能够更好地利用CPU周期以提高性能。相比Debian/Ubuntu、SUSE、RedHat/Fedora等其他发行版,Archlinux属于轻量级选手,其简单的设计让它容易被轻松扩展和配置成为任何想要的系统类型。

由于其小而美的特点,ArchLinux非常合适运行在树莓派等环境上,树莓派官方网站曾经提供了ArchLinux的镜像下载,不知道为何后来又取消其链接。如果你有一个树莓派ArchLinux的镜像,可以直接用dd命令(Linux下)或win32diskimager(windows下)把镜像拷贝到SD卡上。可能造成浪费磁盘空间的问题,要合理利用磁盘,则需要手动给树莓派安装ArchLinux系统。安装步骤如下:

下载最新版的ArchLinux for Arm的系统:
树莓派2: http://archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz
树莓派B,B+: http://archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz
…阅读更多>>

排序算法的思考和实践

排序是程序开发过程中非常常见的一种操作,是将一组无序的记录序列调整为有序记录。例如,30个学生的考试成绩需要进行从大到小的排列,很多高级语言为我们提供了内置的排序操作,下面是PHP,
JS, 和Python为我们提供的对学生成绩进行排序的方法:

<?php
$score = array(68,79,85,92,99,75,66,88,71,71,63,89,91,96,83,85,86,66,63,66,59,60,65,66,69,67,79,80,90,60);
echo sort($score);//升序排列
echo rsort($score);//降序排列
?>

score = new Array(68,79,85,92,99,75,66,88,71,71,63,89,91,96,83,85,86,66,63,66,59,60,65,66,69,67,79,80,90,60);
score.sort(); //升序排列(字符编码顺序)
score.sort(function(a,b){ return a-b}); //升序排列
score.sort(function(a,b){ return b-a}); //降序排列
score = [68,79,85,92,99,75,66,88,71,71,63,89,91,96,83,85,86,66,63,66,59,60,65,66,69,67,79,80,90,60]
print sorted(score)  //升序排列
print sorted(score,cmp=lambda x,y:cmp(y,x)) //降序排列

…阅读更多>>

Python UnicodeEncodeError问题的分析和思考

最近在利用Python获取网络数据的过程中出现一个问题,系统会时不时抛出UnicodeEncodeError的错误,并停止运行,严重影响了其它功能的运行。程序类似下面这样:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib2
print urllib2.urlopen("http://www.example.com/examplepath").read()

报错信息如下: UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u2022′ in position XXXX: illegal multibyte sequence

经过检查,发现是因为获取的远程文件中含有”·”这个字符,官方解释是“着重号(BULLET)”,其unicode编码是u+2022,其它关于这个符号的介绍,可以点击这里。也就是说,因为获取到的远程内容中含有着重号这个字符,所以导致程序出现UnicodeEncodeError。 …阅读更多>>

PHP内存耗尽错误分析

最近有人跟我反映主机上一个wordpress插件的使用过程中经常会出现错误,打开了php的dispaly_error功能之后,发现其报“Fatal error: Allowed memory size of 35389440 bytes exhausted(tried to allocate 1406507 bytes) in xxxxxx on line xxx”,意思是致命错误,内存被耗尽了。Google上搜索了一下,网上有很多这样的问题,答案也都一样,更改php的内存限制,把php.ini中的memory_limit改为更大的数值。

但是这里有一个很大的问题,php允许访问的内存大小是35389440字节,而实际要分配的只有1406507字节。为什么要分配的内存比实际允许访问的内存小还会引发致命错误呢?

PHP内存耗尽错误 …阅读更多>>