DNS的工作原理及过程分下面几个步骤:
第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
第五步:重复第四步,直到找到正确的纪录。
第六步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
使用varnish对typecho博客加速的 vcl 配置
发表于
分类于
编程
backend default {
.host = “127.0.0.1”;
.port = “88”;
}
sub vcl_recv {
#匹配get方式且cookies中不存在uid,即非管理员登陆(管理登陆后看到的不是缓存后的)
if((req.request == "GET"||req.request == "HEAD")&&!(req.http.Cookie && req.http.Cookie ~ "uid")){
#匹配相应的文件后缀,排除 admin 后台管理目录
if (req.url ~ "\.(js|css|html|jpg|png|gif|swf|jpeg|ico|mp3)$" && !req.url ~ "/admin/") {
#去除 cookies
unset req.http.cookie;
}
#去除首页的 Cookies
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
}
sub vcl_fetch {
#如果是POST方式请求 则清空所有缓存,POST请求一般会对网站内容进行修改
#这个不是很准确 可以匹配 评论地址 和 发布文章地址
if(req.request == "POST"){
//清空指定网址下面的所有缓存
ban("req.http.host == " + req.http.host);
}
#设置根目录和html 结尾的文件 缓存时间
if(req.request == "GET"||req.request == "HEAD"){
if (req.url ~ "^/$"||req.url ~ "html$") {
set beresp.ttl = 1d;
}
}
}
缓存结果可以查看header部分的age情况
程序员的 59 条搞笑但却真实无比的编程语录
> 我收集了很多编程语录,基本上都跟程序员的生活有关。这些语录涉及软件开发,代码维护,调试纠错,软件bug,系统设计、文档,代码质量,测试和软 件开发团队管理等方面。下面的这59条语录虽然很搞笑,但却真实无比。只有程序员才能理解这些编程语句里的真正内涵。闲言少叙,开始吧…
程序员编程语录
1.一个好的程序员是那种过单行线马路都要往两边看的人。(Doug Linder)
2.程序有问题时不要担心。如果所有东西都没问题,你就失业了。(软件工程的Mosher定律)
3.程序员的麻烦在于,你无法弄清他在捣腾什么,当你最终弄明白时,也许已经晚了。(超级计算机之父Seymour Cray)
4.我想大部分人都知道通常一个程序员会具有的美德。当然了,有三种:懒惰,暴躁,傲慢。(Perl语言发明者Larry Wall)
5.编程时要保持这种心态:就好象将来要维护你这些代码的人是一位残暴的精神病患者,而且他知道你住在哪。(Martin Golding)
程序员编程语录
1.一个好的程序员是那种过单行线马路都要往两边看的人。(Doug Linder)
2.程序有问题时不要担心。如果所有东西都没问题,你就失业了。(软件工程的Mosher定律)
3.程序员的麻烦在于,你无法弄清他在捣腾什么,当你最终弄明白时,也许已经晚了。(超级计算机之父Seymour Cray)
4.我想大部分人都知道通常一个程序员会具有的美德。当然了,有三种:懒惰,暴躁,傲慢。(Perl语言发明者Larry Wall)
5.编程时要保持这种心态:就好象将来要维护你这些代码的人是一位残暴的精神病患者,而且他知道你住在哪。(Martin Golding)
linux 下 automake 使用教程
发表于
分类于
编程
autoconf/automake主要用于创建Makefile,本文主要介绍一下automake的简单用法。
Ubuntu下安装automake:
sudo apt-get install automake
即可安装automake的相关工具。
使用automake主要会用到aclocal、autoscan、autoconf、autoheader和automake这几个命令。
autoheader主要用来生成 config.h.in 宏定义
首先简略的说一下用automake生成Makefile的步骤:
(1)创建源代码文件,使用”autoscan”生成configure.scan文件,将其重命名为configure.ac,并做适当修改,
然后使用”aclocal”命令生成aclocal.m4文件,使用”autoconf”命令由configure.ac和aclocal.m4文件生成configure文件。
(2)手工编辑Makefile.am文件,使用”automake”命令生成configure.in文件。
(3)手工编辑或由系统给定acconfig.h文件,使用”autoheader”命令生成config.h.in文件。
(4)使用”configure”命令由configure、configure.in和config.h.in文件生成Makefile文件。从而完成Makefile文件的创建过程。
下面用一个经典的hello world的例子说明automake的用法
1.编辑源文件
#include <stdio.h>
int main()
{
printf(“hello world\n”);
return 0;
}
Ubuntu下安装automake:
sudo apt-get install automake
即可安装automake的相关工具。
使用automake主要会用到aclocal、autoscan、autoconf、autoheader和automake这几个命令。
autoheader主要用来生成 config.h.in 宏定义
首先简略的说一下用automake生成Makefile的步骤:
(1)创建源代码文件,使用”autoscan”生成configure.scan文件,将其重命名为configure.ac,并做适当修改,
然后使用”aclocal”命令生成aclocal.m4文件,使用”autoconf”命令由configure.ac和aclocal.m4文件生成configure文件。
(2)手工编辑Makefile.am文件,使用”automake”命令生成configure.in文件。
(3)手工编辑或由系统给定acconfig.h文件,使用”autoheader”命令生成config.h.in文件。
(4)使用”configure”命令由configure、configure.in和config.h.in文件生成Makefile文件。从而完成Makefile文件的创建过程。
下面用一个经典的hello world的例子说明automake的用法
1.编辑源文件
#include <stdio.h>
int main()
{
printf(“hello world\n”);
return 0;
}
C 文件基本操作
发表于
分类于
编程
收集整理的文件基本操作
####fopen 文件的打开####
FILE fopen(const char path,const char mode);
函数说明
参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。
返回值
文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
附加说明
一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。
示例
#include <stdio.h>
main()
{
FILE fp;
fp=fopen(“file.txt”,”a+”);
if(fp= =NULL) return;
fclose(fp);
}
####fopen 文件的打开####
FILE fopen(const char path,const char mode);
函数说明
参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。
返回值
文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
附加说明
一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。
示例
#include <stdio.h>
main()
{
FILE fp;
fp=fopen(“file.txt”,”a+”);
if(fp= =NULL) return;
fclose(fp);
}
C stdio.h 头文件
发表于
分类于
编程
<stdio.h>头文件定义了用于输入和输出的函数、类型和宏。最重要的类型是用于声明文件指针的FILE。另外两个常用的类型是 size_t和fpos_t,size_t是由运算符sizeof产生的无符号整类型;fpos_t类型定义能够唯一说明文件中的每个位置的对象。由头部 定义的最有用的宏是EOF,其值代表文件的结尾。
###变量:
typedef size_t
typedef FILE
typedef fpos_t
###变量:
typedef size_t
typedef FILE
typedef fpos_t
g++的使用
发表于
分类于
编程
###C++中的一些文件后缀##
.a 静态库 (archive)
.C
.c
.cc
.cp
.cpp
.cxx C++源代码(需要编译预处理)
.h C或者C++源代码头文件
.ii C++源代码(不需编译预处理)
.o 对象文件
.s 汇编语言代码
.so 动态库
标准C++系统头文件
.a 静态库 (archive)
.C
.c
.cc
.cp
.cpp
.cxx C++源代码(需要编译预处理)
.h C或者C++源代码头文件
.ii C++源代码(不需编译预处理)
.o 对象文件
.s 汇编语言代码
.so 动态库
C 语言 Httpclient 示例
发表于
分类于
编程
/******* http客户端程序 httpclient.c ************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <limits.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ctype.h>
//////////////////////////////httpclient.c 开始///////////////////////////////////////////
/********************************************
功能:搜索字符串右边起的第一个匹配字符
********************************************/
char* Rstrchr(char* s, char x)
{
int i = strlen(s);
if(!(*s))
{
return 0;
}
while(s[i-1])
{
if(strchr(s+(i-1), x))
{
return (s+(i-1));
}
else
{
i--;
}
}
return 0;
}
/********************************************
功能:把字符串转换为全小写
********************************************/
void ToLowerCase(char* s)
{
while(*s && *s!='\0' )
{
*s=tolower(*s++);
}
*s = '\0';
}
/**************************************************************
功能:从字符串src中分析出网站地址和端口,并得到用户要下载的文件
***************************************************************/
void GetHost(char* src, char* web, char* file, int* port)
{
char* pA;
char* pB;
memset(web, 0, sizeof(web));
memset(file, 0, sizeof(file));
*port = 0;
if(!(*src))
{
return;
}
pA = src;
if(!strncmp(pA, "http://", strlen("http://")))
{
pA = src+strlen("http://");
}
else if(!strncmp(pA, "https://", strlen( "https://")))
{
pA = src+strlen( "https://");
}
pB = strchr(pA, '/');
if(pB)
{
memcpy(web, pA, strlen(pA)-strlen(pB));
if(pB+1)
{
memcpy(file, pB+1, strlen(pB)-1);
file[strlen(pB)-1] = 0;
}
}
else
{
memcpy(web, pA, strlen(pA));
}
if(pB)
{
web[strlen(pA) - strlen(pB)] = 0;
}
else
{
web[strlen(pA)] = 0;
}
pA = strchr(web, ':');
if(pA)
{
*port = atoi(pA + 1);
}
else
{
*port = 80;
}
}
/*********************************************************************
*filename: httpclient.c
*purpose: HTTP协议客户端程序,可以用来下载网页
*********************************************************************/
int main(int argc, char *argv[])
{
int sockfd = 0;
char buffer[1024] = "";
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber = 0;
int nbytes = 0;
char host_addr[256] = "";
char host_file[1024] = "";
FILE *fp;
char request[1024] = "";
int send = 0;
int totalsend = 0;
int i = 0;
char *pt;
if(argc!=2)
{
fprintf(stderr, "Usage:%s web-address\a\n ",argv[0]);
exit(1);
}
printf( "parameter.1 is: %s\n ", argv[1]);
//ToLowerCase(argv[1]);/*将参数转换为全小写*/
//printf( "lowercase parameter.1 is: %s\n ", argv[1]);
GetHost(argv[1], host_addr, host_file, &portnumber);/*分析网址、端口、文件名等*/
printf( "webhost:%s\n ", host_addr);
printf( "hostfile:%s\n ", host_file);
printf( "portnumber:%d\n\n ", portnumber);
if((host=gethostbyname(host_addr)) == NULL)/*取得主机IP地址*/
{
fprintf(stderr, "Gethostname error, %s\n ", strerror(errno));
exit(1);
}
/* 客户程序开始建立 sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1)/*建立SOCKET连接*/
{
fprintf(stderr, "Socket Error:%s\a\n ",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr*)host->h_addr);
/* 客户程序发起连接请求 */
if(connect(sockfd, (struct sockaddr*)(&server_addr), sizeof(struct sockaddr)) == -1)/*连接网站*/
{
fprintf(stderr, "Connect Error:%s\a\n ",strerror(errno));
exit(1);
}
sprintf(request, "GET /%s HTTP/1.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\n\
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\
Host: %s:%d\r\nConnection: Close\r\n\r\n ", host_file, host_addr, portnumber);
printf( "%s\n", request);/*准备request,将要发送给主机*/
/*取得真实的文件名*/
if(host_file && *host_file)
{
pt = Rstrchr(host_file, '/');
}
else
{
pt = 0;
}
/*发送http请求request*/
send = 0;
totalsend = 0;
nbytes=strlen(request);
while(totalsend < nbytes)
{
send = write(sockfd, request+totalsend, nbytes-totalsend);
if(send == -1)
{
printf( "send error!%s\n ", strerror(errno));
exit(0);
}
totalsend += send;
printf("%d bytes send OK!\n ", totalsend);
}
printf( "\nThe following is the response header:\n ");
i=0;
/* 连接成功了,接收http响应,response */
while((nbytes=read(sockfd,buffer,1))==1)
{
if(i < 4)
{
if(buffer[0] == '\r' || buffer[0] == '\n')
{
i++;
}
else
{
i = 0;
}
printf( "%c ", buffer[0]);/*把http头信息打印在屏幕上*/
}
}
// printf("\n\nresponse = %s\n", buffer);
/* 结束通讯 */
close(sockfd);
exit(0);
}
//////////////////////////////httpclient.c 结束///////////////////////////////////////////
大罗山之行
> 大罗山位于现温州市区的东南部,由四景一水网构成,它们分别是:仙岩景区、瑶溪景区、天柱寺景区、茶山景区和三垟水网。根据温州市总体规划,大罗山将是温州市未来的“绿心”和“绿楔”,温州市区将环大罗山发展。大罗山将主要起生态保护功能,即对市区的大气污染、水污染、噪声污染及小气候环境将起到良好的调节和改善作用。
11月16日
在我的发起和各同事的积极响应下,组织了一次爬大罗山运动。
最近以来一直都没有出去运动,感觉体力都不再像以前那样充沛了。
11月16日
在我的发起和各同事的积极响应下,组织了一次爬大罗山运动。
最近以来一直都没有出去运动,感觉体力都不再像以前那样充沛了。
计算工作日
using System;
using System.Collections.Generic;
namespace WorkDay
{
class Program
{
static readonly List<string> Holidays=new List<string>()
{
"2013-01-01","2013-01-02","2013-01-03",
"2013-02-09","2013-02-10","2013-02-11", "2013-02-12","2013-02-13","2013-02-14","2013-02-15",
"2013-04-04","2013-04-05","2013-04-06",
"2013-04-29","2013-04-30","2013-05-01",
"2013-06-10","2013-06-11","2013-06-12",
"2013-09-19","2013-09-20","2013-09-21",
"2013-10-01","2013-10-02","2013-10-03","2013-10-04","2013-10-05","2013-10-06","2013-10-07"
};
static readonly List<string> UnHolidays = new List<string>()
{
"2013-01-05","2013-01-06",
"2013-02-16","2013-02-17",
"2013-04-07",
"2013-04-27","2013-04-28",
"2013-06-08","2013-06-09",
"2013-09-22",
"2013-09-29","2013-10-12"
};
static void Main(string[] args)
{
DateTime startDate=new DateTime(2013,1,1);
DateTime endDate =new DateTime(2013,1,31);
int day = CalcWorkDay(startDate, endDate);
Console.WriteLine(day);
Console.ReadKey();
}
static int CalcWorkDay(DateTime startDate, DateTime endDate)
{
DateTime dateTime = startDate;
int day = 0;
while (dateTime.Date<=endDate.Date)
{
if (JudgeWorkDay(dateTime))
{
day++;
Console.WriteLine(dateTime.ToString("yyyy-MM-dd"));
}
dateTime = dateTime.AddDays(1);
}
return day;
}
static bool JudgeWorkDay(DateTime dateTime)
{
string dateStr = dateTime.ToString("yyyy-MM-dd");
//判断 周六周日
if ((dateTime.DayOfWeek == DayOfWeek.Saturday || dateTime.DayOfWeek == DayOfWeek.Sunday))
{
//调休日
if (UnHolidays.Contains(dateStr))
{
return true;
}
return false;
}
if (Holidays.Contains(dateStr))
{
return false;
}
return true;
}
}
}