这两天开始学MySQL数据库了。按照以前的计划,我打算在大学里面学两个数据库:MySQL和MongodDB。大概前几天我开始学MySQL,由于昨天考试的原因,我把学MySQL的计划搁置了几天,今天学了一点MySQL的SQL语法,学会了一些简单的操作,比如SELECT、DELETE、CREATE等。MySQL的语法比我想象中要复杂吧,因为我觉得数据库无非就是添加、修改、删除和备份之类的。也不至于有那么多项,后来才发现,MySQL的内容还是有那么多的。

废话我就不多说了,COPY了一段Python访问MySQL的代码,用这一段代码之前记得安装MySQLdb

(Debian系列:sudo apt-get install python-mysqldb)
#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb as mysql
import sys

con = mdb.connect('localhost', 'user_name', 'password', 'db_name');
cur = con.cursor()
cur.execute("SELECT VERSION()")
data = cur.fetchone()
con.close()

我在编写简单的Web服务器,其中一个模块是识别文件的MIME。我上网查了好多资料都也没有发现合适的C语言函数库。再加上本人想用自己的纯C编写,只想用Linux的API函数而不想调用第三方函数库。所以我决定自己写一个。

这个模块总的来说可以用“Too young!too simple!”来形容,因为我是根据文件的扩展名来确定文件的MIME的。而不像Linux系统下的 file 命令那样。根据文件本身确定文件的MIME。

原理很简单:就是先确定 file_name 的扩展名,然后再在 MIME.MIME 这个文件里面找。

废话我就不多说了,一下是源代码:

#include <stdio.h>
#include <string.h>
#include <assert.h>

#define MEM_LINE_SIZE   64

char *checkMIME(char *file_name, char *mem);
char *read_str(FILE **stream, char *str);

int main()
{
    char name[MEM_LINE_SIZE];
    char MIME_BUF[MEM_LINE_SIZE];
    while (scanf("%s", name) && strcmp(name, "end"))
    {
        if (checkMIME(name, MIME_BUF))
            printf("%s", MIME_BUF);
    }
    return 0;
}

char *read_str(FILE **stream, char *str)
{
    char *str_head = str;
    if (str == NULL)
    {
        return NULL;
    }
    while(  (*str = fgetc(*stream)) &&
        (*str != ' ' ) &&
        (*str != '\n') &&
        (*str != '\r') &&
        (*str != '\t') &&
        (*str != '\b') &&
        (*str != '\0') &&
        (*str >= 0   )        ) str++;
   
    *str = '\0';
    return str_head;
}


char *checkMIME(char *file_name, char *mem)
{
    //find Extension
    strcpy(mem, "Content-Type: ");
   
    char *point_pos = file_name;
    char *file_name_tail = &file_name[strlen(file_name) - 1];
   
    while (*point_pos != '.' && point_pos != file_name_tail)
        point_pos++;
   
    if ((*point_pos == '.') && (point_pos != file_name) && (point_pos != file_name_tail))
    {
        char ext_name[10];
        char file_buf[20];
       
        strcpy(ext_name, (point_pos + 1));
       
       
        FILE *fp;
        fp = fopen("MIME.MIME", "r");
        while (read_str(&fp, file_buf) != NULL)
        {
            if (strcmp(file_buf, ext_name))
                continue;
            else
            {
                if (read_str(&fp, file_buf) != NULL)
                {
                    strcat(mem, file_buf);
                    strcat(mem, "\r\n");
                    fclose(fp);
                    return mem;
                }
            }
        }
        fclose(fp);
    }
    strcat(mem, "application/octet-stream\r\n");
    return mem;
}

文件“MIME.MIME”的格式是:

html        text/html
htm         text/html

其中是用 Tab 键隔开的,而不是用多个空格隔开的。

输出效果如下:

Content-Type: text/html
Content-Type: application/octet-stream
Content-Type: application/octet-stream
Content-Type: text/plain
Content-Type: image/jpeg

注意一:行尾是 “\r\n” 而不是只有一个换行符。因为 HTTP 协议是这样规定的。
注意二:该程序没在Windows下测试过。
注意三:遇到没有扩展名或者扩展名没有被加入到 MIME.MINE 中的文件时,返回的 MIME 是 Content-Type: application/octet-stream

我知道,这是我的问题……

ld 时把所有的目标文件的代码段组合成一个代码段,把所有的数据段组合成一个数据段.

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。代码段是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

原文转载自这里:百度空间

最近和建院的同学开始搞GIS,由于他们学的只要C、和C#。我是“微软黑”,不爱微软的产品,不爱微软的技术。但是为了能够配合他们开发,我只好学学C#。
这是我用今天学的东西写了一段C#代码。
我毕竟是学过C++、C的人,学这个速度还是蛮快的。

发一段代码,没什么功能也没什么纪念意义。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace first_csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            string name = "YUCOAT";
            Console.WriteLine(name);
            Console.ReadLine();
        }
    }
    class stu
    {
        private string name = null;
        private UInt64 num = 0;
        public stu(string _name, UInt64 _num)
        {
            this.name = _name;
            this.num = _num;
        }
        public stu(){}
        public void setname(string _name){ this.name = _name; }
        public string getname(){ return this.name; }
        public void setnum(UInt64 _num) { this.num = _num; }
        public UInt64 getnum() { return this.num; }
    }
    class score
    {
        public UInt64 count( params UInt64[] score )
        {
            UInt64 sum = 0;
            foreach(UInt64 x in score)
                sum += x;
            return sum;
        }
    }

    class Swap_me
    {
        public void Swap_me(ref UInt64 x, ref UInt64 y)
        {
            x += y;
            y = x - y;
            x = x - y;
        }
    }
}

我的电脑内安装了OpenSSH-server,但是我是通过编译安装的,编译安装其实有点不方便,因为默认的配置导致你不能用sshd start或者sshd stop这样简单的命令来控制OpenSSH-server的守护进程的启动和退出。

无奈之下我只好写一个脚本:
我是这样编译的:

./configure --prefix=/opt/OpenSSH

编译安装之后sshd的可执行程序的路径是/opt/OpenSSH/sbin/sshd

另外还有一个文件记录每次sshd启动时的pid,它的默认路径是/var/run/sshd.pid
这个文件应当在sshd每次运行的时候被创建,每次退出的时候被删除。这样一来我就可以跟据这pid文件是否存在来判断sshd是否已经启动。

这是我的源代码:

#!/bin/bash

PID_LOG="/var/run/sshd.pid"
SSHD="/opt/OpenSSH/sbin/sshd"

#检查用户是不是root
if [ $(whoami) != 'root' ];then
    echo "You MUST switch to root to run this!"
    exit 0
fi

#检查参数的个数是不是1
if [ $# -ne 1 ];then
    echo "Too less argument"
    exit 0
fi

case $@ in

#如果是start
"start")
    #先检查这个文件是否存在,如果在表示已经运行了
    if [ -f $PID_LOG ];then
        echo  "sshd has run!";
        exit 1;
    fi
    #------------关键--------------
    #  $SSHD便是执行sshd,returnVal是执行的错误返回
    #------------关键--------------
    returnVal=$($SSHD)
    #获得PID:cat "/var/run/sshd.pid"
    pid=$(cat $PID_LOG)

    #如果returnVal的长度为0,则正常启动了sshd
    if [ 0 -eq  ${#returnVal} ];then
        echo "sshd run successed! pid=$pid"
    else
        echo "...sshd run failured!..."
    fi
    exit 0
    ;;

"stop")
    #检查sshd.pid文件是否存在
    if ! [ -f $PID_LOG ];then
        echo "sshd has NOT run!";
        exit 2
    fi
    #结束进程
    if ! kill -9 $(cat $PID_LOG) ;then
        echo "stop sshd failure!"
        exit 3
    else
        echo "stop sshd successed!"
        rm $PID_LOG
    fi
    exit 0
    ;;
esac

操作系统:Mint 12 64bit

下载下列软件的源代码:
Nginx
uwsgi
web.py

首先安装web.py

解压后直接执行:

sudo python setup.py install

编译安装Nginx

#简单点的:
./configure --prefix=/opt/Nginx

#如果中途提示没有PCRE的话,你可以先用sudo apt-get install libpcre3-dev
#再次执行./configure

编译uwsgi

make
#或者
python uwsgiconfig.py --build

这样当前目录就会生成一个名叫”uwsgi”的可执行文件,我们可以把它复制到一个地方,这个地方最好在环境变量PATH内

sudo cp ./uwsig /usr/local/bin/uwsgi

配置Nginx:

编辑nginx的配置文件:/opt/Nginx/config/nginx.conf

#把原来的:
location / {
           root   html
           index  index.php index.html index.htm;
}
#改为
location / {
        include uwsgi_params;
        uwsgi_pass  127.0.0.1:8080;
}

创建一个Hello,world程序

进入~/web/目录,创建一个myweb.py文件。写入以下代码:

#!/usr/bin/env python

import os, web, sys
sys.path.append(os.path.dirname(__file__))
urls=(
    r'/', 'Home'
     )
class Home(object):
    def GET(self):
        return "Hello, world!"

app = web.application(urls, globals())
application = app.wsgifunc()

然后执行:

uwsgi -s 127.0.0.1:8080 -w myweb

注意:
-s后面的端口号码一定要和nginx配置文件里面的那个 uwsgi_pass 127.0.0.1:8080 一致
-w后面是 myweb 不是myweb.py

今天写了一个多线程的二叉排序树。首先程序运行的时候等待用户输入一些列的数字,每个数组一行,每输一个数字,Insert()函数负责把这个数字插入到二叉排序树中。

输入完毕之后调用Traverse开始遍历这颗树。遍历时,先输入这棵树的根节点的值,然后创建两个线程,这两个线程分别调用read_tree函数遍历这颗树的左边和右边。

这是我的代码:

/*
作者:YUCOAT
日期:2012-4-16
*/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>    // for bool
#include <pthread.h>

struct BinTree
{
    int Data;
    struct BinTree *Left;
    struct BinTree *Right;
};
typedef struct BinTree BinTree;


//创建二叉排序树(非递归)
BinTree* Insert(BinTree *node, const int value)
{
    //Create a node
    BinTree *temp = (BinTree *)malloc(sizeof (BinTree));
    temp->Data = value;
    temp->Left = NULL;
    temp->Right = NULL;

    // node == NULL
    if (node == NULL)
        return temp;

    //Insert to Bin tree
    BinTree *flag = node;
    while (1)
    {
        if (flag->Data == value)
        {
            free(temp);
            return node;
        }
        else if (flag->Data < value && flag->Right == NULL)
        {
            flag->Right = temp;
            return node;
        }
        else if(flag->Data < value && flag->Right != NULL)
            flag = flag->Right;
        else if (flag->Data > value && flag->Left == NULL)
        {
            flag->Left = temp;
            return node;
        }
        else if( flag->Data > value && flag->Left != NULL)
            flag = flag->Left;
    }
}

void *read_tree(void *binTree)
{
    BinTree *temp = (BinTree *)binTree;

    if (temp == NULL)
        return NULL;
    else
        printf("%d\n", temp->Data);
    read_tree((void *)temp->Right);
    read_tree((void *)temp->Left);
    return NULL;
}

void Traverse(BinTree *head)
{
    pthread_t pth_one, pth_two;
    int p_one, p_two;
    if (head == NULL)
    {
        printf("Tree is empty!");
        return;
    }
    printf("%d\n", head->Data);
    p_one=pthread_create(&pth_one, NULL, read_tree, (void *)head->Right);
    p_two=pthread_create(&pth_two, NULL, read_tree, (void *)head->Left);
    if (p_one != 0 || p_two != 0)
    {
        perror("pthread_create");
        exit(1);
    }
    pthread_join(pth_one, NULL);
    pthread_join(pth_two, NULL);
}
int main()
{
    BinTree *head = NULL;
    int buf;

    while (scanf("%d", &buf) && buf != 0)
        head = Insert(head, buf);
    if(head == NULL)
        printf("xxxx");
    Traverse(head);
    return 0;
}

编译:

gcc bTree.c -o bTree -lpthread

输入数据:

1
2
3
4
5
6
7
14
4
14
8
97
25
0

程序输出:

1
2
3
4
5
6
7
14
97
25
8

唉~~期待着时间快点。。。期待着自己别犯贱

烦心事得从昨天晚上说起。
昨天晚上我和她吵了一架,现在谁都不理谁了。我觉得自己真的太没用了,说好放下的,居然还会死缠着放不下。她终于说出了那句很久一来她最想说的话。我很难受,就把她的QQ从好友列表删除了,把一切与她有直接关系读东西都删除了,照片、短信、手机号……

然后我开始尝试着压住自己内心的忧伤,毕竟她已经不是第一次伤害到我了。在一整晚的辗转之后我起床了,一切表现得都和以前一样。今天早上我莫名地不想去上课,逃了我这个学期以来的第一节课。我闲在寝室里上网,上网的时候我还是和往常一样,因为我知道,那些所谓的“疗伤”的文章只能让我更加伤心。能够让我平静下来的唯有像往常一样,当作什么都没有发生。

毕竟是被她伤害过一次的人,没想到上次安慰自己的话。到了现在还一样管用。当我打开互联网的时候我发现原来世界上居然有这么多文字可以安慰我。我消磨着时间,两节课很快就结束了。

吵完架以后我真的很难过,令我更加难过的是,吵完之后我依然想知道,在她的内心,是否会同样的有一丝难过?一丝,一丝难过我就足矣感到有几分安慰。

———————-不怎么华丽的分割线—————-

今天收到通知,我们这一栋要交电费了。我的室友给了我250块。他说让我先垫着,剩下的回头再给我。我身上没钱,便到银行去取钱,我心想,400应该够了吧,然后我就去取了400。取完钱之后我去那里交电费。我查了一下账单,顿时被那些数字给吓到了。居然是1470多。其中12月份多大600多

想想觉得自己真亏,我又没小太阳之类的电器,居然要我平摊~~

————————————-END——————————————
生活还在继续,不开心的事情就到此为止吧!收拾好心情,出发~~

第 1 页,共 18 页12345...10...最旧 »