A Coder

Coding My Dream!

0%

DNS的工作原理及过程分下面几个步骤:
  第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
  第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
  第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
  第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
  第五步:重复第四步,直到找到正确的纪录。
  第六步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。


阅读全文 »

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情况

> 我收集了很多编程语录,基本上都跟程序员的生活有关。这些语录涉及软件开发,代码维护,调试纠错,软件bug,系统设计、文档,代码质量,测试和软 件开发团队管理等方面。下面的这59条语录虽然很搞笑,但却真实无比。只有程序员才能理解这些编程语句里的真正内涵。闲言少叙,开始吧…
程序员编程语录

1.一个好的程序员是那种过单行线马路都要往两边看的人。(Doug Linder)

2.程序有问题时不要担心。如果所有东西都没问题,你就失业了。(软件工程的Mosher定律)

3.程序员的麻烦在于,你无法弄清他在捣腾什么,当你最终弄明白时,也许已经晚了。(超级计算机之父Seymour Cray)

4.我想大部分人都知道通常一个程序员会具有的美德。当然了,有三种:懒惰,暴躁,傲慢。(Perl语言发明者Larry Wall)

5.编程时要保持这种心态:就好象将来要维护你这些代码的人是一位残暴的精神病患者,而且他知道你住在哪。(Martin Golding)


阅读全文 »

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;
}


阅读全文 »

收集整理的文件基本操作

####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);
}


阅读全文 »

<stdio.h>头文件定义了用于输入和输出的函数、类型和宏。最重要的类型是用于声明文件指针的FILE。另外两个常用的类型是 size_t和fpos_t,size_t是由运算符sizeof产生的无符号整类型;fpos_t类型定义能够唯一说明文件中的每个位置的对象。由头部 定义的最有用的宏是EOF,其值代表文件的结尾。

###变量:
typedef size_t
typedef FILE
typedef fpos_t


阅读全文 »

###C++中的一些文件后缀##

.a 静态库 (archive)
.C
.c
.cc
.cp
.cpp
.cxx C++源代码(需要编译预处理)
.h C或者C++源代码头文件
.ii C++源代码(不需编译预处理)
.o 对象文件
.s 汇编语言代码
.so 动态库
标准C++系统头文件


阅读全文 »

转载自:c/s模式Linux下用c语言实现发送http请求

/*******   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日

在我的发起和各同事的积极响应下,组织了一次爬大罗山运动。
最近以来一直都没有出去运动,感觉体力都不再像以前那样充沛了。


阅读全文 »

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;
        }
    }
}