<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[_]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[]]></description>
<link>http://hi.baidu.com/abcngn</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[django + MySQL + flup + Nginx 的一些相关配置文件的备份]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/a269e24ed7e95dc3d0c86a00.html]]></link>
        <description><![CDATA[
		
		备份是一种安全策略<br>
<br>
很大的一个问题是编码问题,全部utf-8<br>
1.首先是/etc/mysql/my.cnf:&#160; <br>
#<br>
# The MySQL database server configuration file.<br>
#<br>
# You can copy this to one of:<br>
# - &quot;/etc/mysql/my.cnf&quot; to set global options,<br>
# - &quot;~/.my.cnf&quot; to set user-specific options.<br>
# <br>
# One can use all long options that the program supports.<br>
# Run program with --help to get a list of available options and with<br>
# --print-defaults to see which it would actually understand and use.<br>
#<br>
# For explanations see<br>
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html<br>
<br>
# This will be passed to all mysql clients<br>
# It has been reported that passwords should be enclosed with ticks/quotes<br>
# escpecially if they contain &quot;#&quot; chars...<br>
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.<br>
[client]<br>
#<br>
#add by ngn<br>
#<br>
default-character-set=utf8 <br>
port&#160;&#160;&#160; &#160;&#160;&#160; = 3306<br>
socket&#160;&#160;&#160; &#160;&#160;&#160; = /var/run/mysqld/mysqld.sock<br>
<br>
# Here is entries for some specific programs<br>
# The following values assume you have at least 32M ram<br>
<br>
# This was formally known as [safe_mysqld]. Both versions are currently parsed.<br>
[mysqld_safe]<br>
socket&#160;&#160;&#160; &#160;&#160;&#160; = /var/run/mysqld/mysqld.sock<br>
nice&#160;&#160;&#160; &#160;&#160;&#160; = 0<br>
<br>
[mysqld]<br>
#<br>
#ngn add this<br>
#<br>
character-set-server=utf8<br>
collation-server=utf8_unicode_ci<br>
default-character-set=utf8 <br>
init_connect='SET NAMES utf8'<br>
<br>
#<br>
# * Basic Settings<br>
#<br>
user&#160;&#160;&#160; &#160;&#160;&#160; = mysql<br>
pid-file&#160;&#160;&#160; = /var/run/mysqld/mysqld.pid<br>
socket&#160;&#160;&#160; &#160;&#160;&#160; = /var/run/mysqld/mysqld.sock<br>
port&#160;&#160;&#160; &#160;&#160;&#160; = 3306<br>
basedir&#160;&#160;&#160; &#160;&#160;&#160; = /usr<br>
datadir&#160;&#160;&#160; &#160;&#160;&#160; = /var/lib/mysql<br>
tmpdir&#160;&#160;&#160; &#160;&#160;&#160; = /tmp<br>
language&#160;&#160;&#160; = /usr/share/mysql/english<br>
skip-external-locking<br>
#<br>
# Instead of skip-networking the default is now to listen only on<br>
# localhost which is more compatible and is not less secure.<br>
bind-address&#160;&#160;&#160; &#160;&#160;&#160; = 127.0.0.1<br>
#<br>
# * Fine Tuning<br>
#<br>
key_buffer&#160;&#160;&#160; &#160;&#160;&#160; = 16M<br>
max_allowed_packet&#160;&#160;&#160; = 16M<br>
thread_stack&#160;&#160;&#160; &#160;&#160;&#160; = 128K<br>
thread_cache_size&#160;&#160;&#160; = 8<br>
# This replaces the startup script and checks MyISAM tables if needed<br>
# the first time they are touched<br>
myisam-recover&#160;&#160;&#160; &#160;&#160;&#160; = BACKUP<br>
#max_connections&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 100<br>
#table_cache&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 64<br>
#thread_concurrency&#160;&#160;&#160;&#160; = 10<br>
#<br>
# * Query Cache Configuration<br>
#<br>
query_cache_limit&#160;&#160;&#160;&#160;&#160;&#160; = 1M<br>
query_cache_size&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 16M<br>
#<br>
# * Logging and Replication<br>
#<br>
# Both location gets rotated by the cronjob.<br>
# Be aware that this log type is a performance killer.<br>
#log&#160;&#160;&#160; &#160;&#160;&#160; = /var/log/mysql/mysql.log<br>
#<br>
# Error logging goes to syslog. This is a Debian improvement :)<br>
#<br>
# Here you can see queries with especially long duration<br>
#log_slow_queries&#160;&#160;&#160; = /var/log/mysql/mysql-slow.log<br>
#long_query_time = 2<br>
#log-queries-not-using-indexes<br>
#<br>
# The following can be used as easy to replay backup logs or for replication.<br>
# note: if you are setting up a replication slave, see README.Debian about<br>
#&#160;&#160;&#160;&#160;&#160;&#160; other settings you may need to change.<br>
#server-id&#160;&#160;&#160; &#160;&#160;&#160; = 1<br>
#log_bin&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; = /var/log/mysql/mysql-bin.log<br>
expire_logs_days&#160;&#160;&#160; = 10<br>
max_binlog_size&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 100M<br>
#binlog_do_db&#160;&#160;&#160; &#160;&#160;&#160; = include_database_name<br>
#binlog_ignore_db&#160;&#160;&#160; = include_database_name<br>
#<br>
# * BerkeleyDB<br>
#<br>
# Using BerkeleyDB is now discouraged as its support will cease in 5.1.12.<br>
skip-bdb<br>
#<br>
# * InnoDB<br>
#<br>
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.<br>
# Read the manual for more InnoDB related options. There are many!<br>
# You might want to disable InnoDB to shrink the mysqld process by circa 100MB.<br>
#skip-innodb<br>
#<br>
# * Security Features<br>
#<br>
# Read the manual, too, if you want chroot!<br>
# chroot = /var/lib/mysql/<br>
#<br>
# For generating SSL certificates I recommend the OpenSSL GUI &quot;tinyca&quot;.<br>
#<br>
# ssl-ca=/etc/mysql/cacert.pem<br>
# ssl-cert=/etc/mysql/server-cert.pem<br>
# ssl-key=/etc/mysql/server-key.pem<br>
<br>
<br>
<br>
[mysqldump]<br>
quick<br>
quote-names<br>
max_allowed_packet&#160;&#160;&#160; = 16M<br>
<br>
[mysql]<br>
#no-auto-rehash&#160;&#160;&#160; # faster start of mysql but no tab completition<br>
<br>
[isamchk]<br>
key_buffer&#160;&#160;&#160; &#160;&#160;&#160; = 16M<br>
<br>
#<br>
# * NDB Cluster<br>
#<br>
# See /usr/share/doc/mysql-server-*/README.Debian for more information.<br>
#<br>
# The following configuration is read by the NDB Data Nodes (ndbd processes)<br>
# not from the NDB Management Nodes (ndb_mgmd processes).<br>
#<br>
# [MYSQL_CLUSTER]<br>
# ndb-connectstring=127.0.0.1<br>
<br>
<br>
#<br>
# * IMPORTANT: Additional settings that can override those from this file!<br>
#&#160;&#160; The files must end with '.cnf', otherwise they'll be ignored.<br>
#<br>
!includedir /etc/mysql/conf.d/<br>
<br>
<br>
<br>
2.django 的 settings.py<br>
<br>
#coding = utf-8<br>
from os import path<br>
DEBUG = True<br>
TEMPLATE_DEBUG = DEBUG<br>
<br>
DATABASE_ENGINE = 'mysql'<br>
DATABASE_NAME = 'pylogs'<br>
DATABASE_USER = 'root'<br>
DATABASE_PASSWORD = 'ngn999'<br>
DATABASE_HOST = ''<br>
DATABASE_PORT = ''<br>
DATABASE_OPTIONS = dict(charset=&quot;utf8&quot;, use_unicode=True)<br>
<br>
TIME_ZONE = 'Asia/Chongqing'<br>
LANGUAGE_CODE = 'zh-cn'&#160;&#160; #the admin views laguage<br>
DEFAULT_CHARSET = 'utf-8'<br>
SITE_ID = 1<br>
<br>
USE_I18N = True<br>
<br>
# Absolute path to the directory that holds media.<br>
# Example: &quot;/home/media/media.lawrence.com/&quot;<br>
MEDIA_ROOT = path.join(path.dirname(__file__),'media')<br>
ALLOW_FILE_TYPES = ('.jpg','.gif','.png')<br>
# URL that handles the media served from MEDIA_URL.<br>
MEDIA_URL = '/media'<br>
# the theme name 'default, techicon, beijing2008'<br>
THEME_NAME = 'techicon'<br>
<br>
STATIC_PATH = './media'<br>
<br>
ADMIN_MEDIA_PREFIX = '/admin_media/'<br>
<br>
#Send Email settings<br>
EMAIL_HOST = 'smtp.sohu.com'<br>
EMAIL_HOST_PASSWORD = ''<br>
EMAIL_HOST_USER = ''<br>
<br>
SECRET_KEY = 'zb2&amp;a4g41snkt&amp;*c92s=djl+*fcp((i85w(k&amp;&amp;)#$5j!+zz!!*'<br>
#setting session expire after half a hour.<br>
#SESSION_COOKIE_AGE =&#160; 60 * 30<br>
<br>
TEMPLATE_LOADERS = (<br>
'django.template.loaders.filesystem.load_template_source',<br>
'django.template.loaders.app_directories.load_template_source',<br>
)<br>
<br>
MIDDLEWARE_CLASSES = (<br>
'django.contrib.sessions.middleware.SessionMiddleware',<br>
'django.middleware.locale.LocaleMiddleware',<br>
'django.middleware.common.CommonMiddleware',<br>
'django.contrib.auth.middleware.AuthenticationMiddleware',<br>
'django.middleware.doc.XViewMiddleware',<br>
)<br>
<br>
ROOT_URLCONF = 'urls'<br>
TEMPLATE_DIRS = (<br>
path.join(path.dirname(__file__),'templates'),<br>
)<br>
<br>
INSTALLED_APPS = (<br>
'django.contrib.auth',<br>
'django.contrib.contenttypes',<br>
'django.contrib.sessions',<br>
'django.contrib.sites',<br>
'django.contrib.admin',<br>
'blog',<br>
'todo',<br>
'filemanager',<br>
'wap',<br>
#'tests',<br>
)<br>
VERSION = (1, 15, 'beta')&#160;&#160;&#160; <br>
<br>
<br>
3. nginx 的配置文件 /etc/nginx/site-available/example<br>
<br>
<br>
error_log /var/log/nginx/error.log info;<br>
<br>
server {<br>
listen&#160;&#160;&#160;&#160;&#160;&#160; 80;<br>
server_name&#160; localhost;<br>
<br>
#charset koi8-r;<br>
<br>
<br>
# Get people onto the non-www site<br>
if ($host = 'www.example.com' ) {<br>
rewrite&#160; ^/(.*)$&#160; http://example.com/$1&#160; permanent;<br>
}<br>
<br>
# project media assuming it's called at media/<br>
*********************************************************************<br>
# keep in mind that media/ will be maintained as a directory by the root command<br>
location ^~ /media/ {<br>
#root&#160;&#160; /home/ngn/program/python/django/iFriends/;<br>
root /home/ngn/program/python/django/pylogs/;<br>
}<br>
***********************************************************************<br>
# admin uses admin-media/<br>
# alias works different than root above by dropping admin-media<br>
****************************************************************************************************************************<br>
location ^~ /admin_media/ {<br>
#alias /usr/lib/pymodules/python2.5/django/contrib/admin/media/;<br>
alias /usr/share/pyshared/django/contrib/admin/media/;<br>
}<br>
*******************************************************************************************************************************<br>
location / {<br>
# host and port to fastcgi server<br>
fastcgi_pass 127.0.0.1:8080;<br>
fastcgi_param SERVER_NAME $server_name;<br>
fastcgi_param SERVER_PORT $server_port;<br>
fastcgi_param SERVER_PROTOCOL $server_protocol;<br>
fastcgi_param PATH_INFO $fastcgi_script_name;<br>
fastcgi_param REQUEST_METHOD $request_method;<br>
fastcgi_param QUERY_STRING $query_string;<br>
fastcgi_param CONTENT_TYPE $content_type;<br>
fastcgi_param CONTENT_LENGTH $content_length;<br>
fastcgi_pass_header Authorization;<br>
fastcgi_intercept_errors off;<br>
}<br>
<br>
# todo: setup 404 for the /media directory.<br>
# / directory will be handled by django url dispatcher<br>
#error_page&#160; 404&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /404.html;<br>
#location = /404.html {<br>
#&#160;&#160;&#160; root&#160;&#160; /var/www/nginx-default;<br>
#}<br>
<br>
# redirect server error pages to the static page /50x.html<br>
#<br>
error_page&#160;&#160; 500 502 503 504&#160; /50x.html;<br>
location = /50x.html {<br>
root&#160;&#160; /var/www/nginx-default;<br>
}<br>
<br>
}<br>
<br>
<br> <a href="http://hi.baidu.com/abcngn/blog/item/a269e24ed7e95dc3d0c86a00.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/a269e24ed7e95dc3d0c86a00.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-21  18:20</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/a269e24ed7e95dc3d0c86a00.html</guid>
</item>

<item>
        <title><![CDATA[查看poj上做题数量的脚本]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/1d57e69ba629e8bdc9eaf41b.html]]></link>
        <description><![CDATA[
		
		<p>#!/usr/bin/python<br>
import urllib<br>
import re</p>
<p>def getss(id):<br>
&nbsp;&nbsp;&nbsp;  urlbase = 'http://acm.pku.edu.cn/JudgeOnline/userstatus?user_id='<br>
&nbsp;&nbsp;&nbsp;  url = urlbase + id<br>
&nbsp;&nbsp;&nbsp;  html = urllib.urlopen(url)<br>
&nbsp;&nbsp;&nbsp;  rs = re.search(r'&lt;td align=center width=25%&gt;&lt;a href=status\?result=0&amp;user_id=.*&gt;(\d+)&lt;/a&gt;&lt;/td&gt;', html.read())<br>
&nbsp;&nbsp;&nbsp;  if rs:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print id + &quot; : &quot; +  rs.group(1)<br>
&nbsp;&nbsp;&nbsp;  else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print &quot;查无此人!&quot;<br>
&nbsp;&nbsp;&nbsp;  html.close()</p>
<p>if __name__ == '__main__':<br>
&nbsp;&nbsp;&nbsp;  ids = ['test', 'linux', 'abc']<br>
&nbsp;&nbsp;&nbsp;  for id in ids:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  getss(id)</p>
<p>一开始的想法是去解析html文件,看来简单的用RegExp就能解决了,但是若是服务器有一点的改变(比喻在&lt;td align=center width=25%&gt;&lt;a href=status\?result=0&amp;user_id=.*&gt;(\d+)&lt;/a&gt;&lt;/td&gt;中加入一个空格)就会匹配失败.<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;</p> <a href="http://hi.baidu.com/abcngn/blog/item/1d57e69ba629e8bdc9eaf41b.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/Python">Python</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/1d57e69ba629e8bdc9eaf41b.html#comment">查看评论</a>]]></description>
        <pubDate>2009-05-14  01:48</pubDate>
        <category><![CDATA[Python]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/1d57e69ba629e8bdc9eaf41b.html</guid>
</item>

<item>
        <title><![CDATA[smth上破解dr.com的相关的文章]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/6bbc5fb1ebaccb5c0823024f.html]]></link>
        <description><![CDATA[
		
		  到处找这方面的东西,今天无意间在Linuxapp版看到了这个[合集],原来还有drcom-client的作者也参与了讨论,也不知道这是那一年的帖子了!<br>
<br>
<br>
发信人: JulyClyde (这个月该过生日啦), 信区: LinuxApp<br>
标&nbsp;&nbsp; 题: [合集] 重写了一个drcom<br>
发信站: 水木社区 (Fri Jul&nbsp;&nbsp; 7 19:23:36 2006), 站内<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wheelz (心魔) 于&nbsp;&nbsp; (Thu Jun 29 18:25:00 2006)&nbsp;&nbsp; 提到:<br>
<br>
简短描述:<br>
drcomsuite和libdrcom在新内核中不能编译成功，并有一些bug。<br>
此为修改后的版本，但只能用于2.6.11或以后的内核版本。<br>
<br>
增加一个超时功能，超过2分钟不访问网络，就自动登出。<br>
<br>
请看README。<br>
有问题请找 kernel.zeng@gmail.com<br>
<br>
<br>
安装步骤:<br>
(请先备份/etc/drcom.conf)<br>
＃ make<br>
# make install<br>
然后编辑/etc/drcom.conf<br>
<br>
<br>
使用：<br>
＃ drcomd<br>
# drcomc login<br>
# drcomc logout<br>
<br>
如果想log在屏幕上，用如下方式启动drcomd：<br>
＃ drcomd -n<br>
<br>
<br>
测试环境:<br>
FC4和海淀在线测试。<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; swodniw (Mk ez ths ez, hd ths poss) 于&nbsp;&nbsp; (Thu Jun 29 18:27:53 2006)&nbsp;&nbsp; 提到:<br>
<br>
支持一下<br>
【 在 wheelz (心魔) 的大作中提到: 】<br>
<font class="f006">: 简短描述:</font><br>
<font class="f006">: drcomsuite和libdrcom在新内核中不能编译成功，并有一些bug。</font><br>
<font class="f006">: 此为修改后的版本，但只能用于2.6.11或以后的内核版本。</font><br>
<font class="f006">: ...................</font><br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wpyh (青蛙) 于&nbsp;&nbsp; (Thu Jun 29 19:08:52 2006)&nbsp;&nbsp; 提到:<br>
<br>
sorry，那些是我写的，我不住那边了，所以没继续开发。<br>
我在sf上的project还在，你要继续做吗？<br>
<br>
【 在 wheelz (心魔) 的大作中提到: 】<br>
<font class="f006">: 简短描述:</font><br>
<font class="f006">: drcomsuite和libdrcom在新内核中不能编译成功，并有一些bug。</font><br>
<font class="f006">: 此为修改后的版本，但只能用于2.6.11或以后的内核版本。</font><br>
<font class="f006">: ...................</font><br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wpyh (青蛙) 于&nbsp;&nbsp; (Thu Jun 29 19:09:22 2006)&nbsp;&nbsp; 提到:<br>
<br>
另外，建议加ifdef，支持旧版本的内核<br>
<br>
【 在 wpyh (青蛙) 的大作中提到: 】<br>
<font class="f006">: sorry，那些是我写的，我不住那边了，所以没继续开发。</font><br>
<font class="f006">: 我在sf上的project还在，你要继续做吗？</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wheelz (心魔) 于&nbsp;&nbsp; (Thu Jun 29 19:47:01 2006)&nbsp;&nbsp; 提到:<br>
<br>
<br>
内核版本变化太大，过多的#ifdef会使得代码太ugly。<br>
另，已经给你发站内邮件。<br>
<br>
【 在 wpyh (青蛙) 的大作中提到: 】<br>
<font class="f006">: 另外，建议加ifdef，支持旧版本的内核</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; JulyClyde (七月) 于&nbsp;&nbsp; (Fri Jun 30 09:56:35 2006)&nbsp;&nbsp; 提到:<br>
<br>
这个项目应该由高手接手<br>
让我们把反dr.com事业进行到底吧<br>
【 在 wpyh (青蛙) 的大作中提到: 】<br>
<font class="f006">: sorry，那些是我写的，我不住那边了，所以没继续开发。</font><br>
<font class="f006">: 我在sf上的project还在，你要继续做吗？</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wpyh (青蛙) 于&nbsp;&nbsp; (Fri Jun 30 12:17:57 2006)&nbsp;&nbsp; 提到:<br>
<br>
你要参加也可以，呵呵<br>
^_^<br>
<br>
【 在 JulyClyde (七月) 的大作中提到: 】<br>
<font class="f006">: 这个项目应该由高手接手</font><br>
<font class="f006">: 让我们把反dr.com事业进行到底吧</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; doser (十三天恋情◎Feel your Heart) 于&nbsp;&nbsp; (Fri Jun 30 12:19:46 2006)&nbsp;&nbsp; 提到:<br>
<br>
你是怎么分析它的协议的？<br>
<br>
【 在 wpyh (青蛙) 的大作中提到: 】<br>
sorry，那些是我写的，我不住那边了，所以没继续开发。<br>
我在sf上的project还在，你要继续做吗？<br>
<br>
【 在 wheelz (心魔) 的大作中提到: 】<br>
<font class="f006">: 简短描述:</font><br>
<font class="f006">: drcomsuite和libdrcom在新内核中不能编译成功，并有一些bug。</font><br>
<font class="f006">: 此为修改后的版本，但只能用于2.6.11或以后的内核版本。</font><br>
<font class="f006">: ...................</font><br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wpyh (青蛙) 于&nbsp;&nbsp; (Fri Jun 30 12:22:39 2006)&nbsp;&nbsp; 提到:<br>
<br>
我是在网上有个网友叫作1e0n和另一个人分析的，他们分析得不是很全，然后我当时<br>
也是在分析。合并起来，继续分析，呵呵。<br>
<br>
方法是用ethereal抓包，查看包的内容。然后用ollydbg调试那个客户端程序，看那些<br>
数据是怎么流的。还有一个很重要的是：做一个模拟服务器，让官方客户端程序跟它<br>
交谈。如果你在这方面感兴趣，建议看andrew tridgell写的关于他怎么分析windows<br>
的smb协议（文档名字忘了，你搜搜吧）。<br>
<br>
其实你看里面的文档就知道了，呵呵<br>
<br>
【 在 doser (十三天恋情◎Feel your Heart) 的大作中提到: 】<br>
<font class="f006">: 你是怎么分析它的协议的？</font><br>
<font class="f006">: sorry，那些是我写的，我不住那边了，所以没继续开发。</font><br>
<font class="f006">: 我在sf上的project还在，你要继续做吗？</font><br>
<font class="f006">: ...................</font><br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; JulyClyde (七月) 于&nbsp;&nbsp; (Fri Jun 30 18:41:08 2006)&nbsp;&nbsp; 提到:<br>
<br>
我现在连网线都没有了<br>
【 在 wpyh (青蛙) 的大作中提到: 】<br>
<font class="f006">: 你要参加也可以，呵呵</font><br>
<font class="f006">: ^_^</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; JulyClyde (七月) 于&nbsp;&nbsp; (Fri Jun 30 18:41:29 2006)&nbsp;&nbsp; 提到:<br>
<br>
你怎么坑那个官方客户端让它以为你的服务器是真的服务器的？<br>
【 在 wpyh (青蛙) 的大作中提到: 】<br>
<font class="f006">: 我是在网上有个网友叫作1e0n和另一个人分析的，他们分析得不是很全，然后我当时</font><br>
<font class="f006">: 也是在分析。合并起来，继续分析，呵呵。</font><br>
<font class="f006">: 方法是用ethereal抓包，查看包的内容。然后用ollydbg调试那个客户端程序，看那些</font><br>
<font class="f006">: ...................</font><br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wpyh (青蛙) 于&nbsp;&nbsp; (Fri Jun 30 22:02:01 2006)&nbsp;&nbsp; 提到:<br>
<br>
无线网？<br>
<br>
【 在 JulyClyde (七月) 的大作中提到: 】<br>
<font class="f006">: 我现在连网线都没有了</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wpyh (青蛙) 于&nbsp;&nbsp; (Fri Jun 30 22:02:47 2006)&nbsp;&nbsp; 提到:<br>
<br>
这个是因为我想知道，服务器返回某个值的时候，官方客户端应该怎么回复。<br>
这样就可以更好地分析这个协议：）<br>
<br>
【 在 JulyClyde (七月) 的大作中提到: 】<br>
<font class="f006">: 你怎么坑那个官方客户端让它以为你的服务器是真的服务器的？</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; JulyClyde (七月) 于&nbsp;&nbsp; (Sat Jul&nbsp;&nbsp; 1 16:20:36 2006)&nbsp;&nbsp; 提到:<br>
<br>
无网<br>
【 在 wpyh (青蛙) 的大作中提到: 】<br>
<font class="f006">: 无线网？</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; JulyClyde (七月) 于&nbsp;&nbsp; (Sat Jul&nbsp;&nbsp; 1 16:20:53 2006)&nbsp;&nbsp; 提到:<br>
<br>
你怎么让官方客户端以为你的服务器是真的？<br>
【 在 wpyh (青蛙) 的大作中提到: 】<br>
<font class="f006">: 这个是因为我想知道，服务器返回某个值的时候，官方客户端应该怎么回复。</font><br>
<font class="f006">: 这样就可以更好地分析这个协议：）</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; roy (大饼：老婆去上学，要做周末夫妻了) 于&nbsp;&nbsp; (Sat Jul&nbsp;&nbsp; 1 17:32:19 2006)&nbsp;&nbsp; 提到:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果客户端没有使用什么加密校验手段的话，这个应该不难<br>
<br>
【 在 JulyClyde (七月) 的大作中提到: 】<br>
<font class="f006">: 你怎么让官方客户端以为你的服务器是真的？</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; JulyClyde (七月) 于&nbsp;&nbsp; (Sat Jul&nbsp;&nbsp; 1 21:35:58 2006)&nbsp;&nbsp; 提到:<br>
<br>
它那个客户端是自动发现服务器的，而不是在客户端里面设置服务器地址<br>
【 在 roy (大饼：老婆去上学，要做周末夫妻了) 的大作中提到: 】<br>
<font class="f006">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果客户端没有使用什么加密校验手段的话，这个应该不难</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; roy (大饼：老婆去上学，要做周末夫妻了) 于&nbsp;&nbsp; (Sat Jul&nbsp;&nbsp; 1 22:12:38 2006)&nbsp;&nbsp; 提到:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总是基于某种二层或者三层广播机制的<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 监听包分析一下就是了<br>
<br>
【 在 JulyClyde (七月) 的大作中提到: 】<br>
<font class="f006">: 它那个客户端是自动发现服务器的，而不是在客户端里面设置服务器地址</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; swodniw (Mk ez ths ez, hd ths poss) 于&nbsp;&nbsp; (Sat Jul&nbsp;&nbsp; 1 22:59:51 2006)&nbsp;&nbsp; 提到:<br>
<br>
服务器地址就存在那个dat文件里，连上了会自动记录<br>
【 在 JulyClyde (七月) 的大作中提到: 】<br>
<font class="f006">: 它那个客户端是自动发现服务器的，而不是在客户端里面设置服务器地址</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; JulyClyde (七月) 于&nbsp;&nbsp; (Sun Jul&nbsp;&nbsp; 2 14:33:29 2006)&nbsp;&nbsp; 提到:<br>
<br>
刚装的时候还没有那个dat<br>
【 在 swodniw (Mk ez ths ez, hd ths poss) 的大作中提到: 】<br>
<font class="f006">: 服务器地址就存在那个dat文件里，连上了会自动记录</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wpyh (青蛙) 于&nbsp;&nbsp; (Tue Jul&nbsp;&nbsp; 4 09:01:27 2006)&nbsp;&nbsp; 提到:<br>
<br>
嗯，我当时用的是比较老的一个版本，不时自动找服务器的^_^<br>
<br>
【 在 swodniw (Mk ez ths ez, hd ths poss) 的大作中提到: 】<br>
<font class="f006">: 服务器地址就存在那个dat文件里，连上了会自动记录</font><br>
<br>
<br>
<br>
<br>
☆─────────────────────────────────────☆<br>
&nbsp;&nbsp;&nbsp; wpyh (青蛙) 于&nbsp;&nbsp; (Tue Jul&nbsp;&nbsp; 4 09:02:13 2006)&nbsp;&nbsp; 提到:<br>
<br>
这个也应该可以用一个路由器，设置static route来实现吧？<br>
<br>
【 在 JulyClyde (七月) 的大作中提到: 】<br>
<font class="f006">: 刚装的时候还没有那个dat</font> <a href="http://hi.baidu.com/abcngn/blog/item/6bbc5fb1ebaccb5c0823024f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/6bbc5fb1ebaccb5c0823024f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-23  21:49</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/6bbc5fb1ebaccb5c0823024f.html</guid>
</item>

<item>
        <title><![CDATA[the python challenge 前4关]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/b2f776c2b607d8130ef477e1.html]]></link>
        <description><![CDATA[
		
		url : <a href="http://www.pythonchallenge.com" target="_blank">http://www.pythonchallenge.com<br>
</a><br>
第0关:<br>
print 2 ** 35<br>
<br>
第1关:<br>
string.translate()<br>
string.maketrans()<br>
<br>
第2关:<br>
正规表达式:<br>
reobj = re.compile('[a-zA-Z]+')<br>
reobj.findall(string)<br>
<br>
第3关:<br>
reobj  = re.compile('[a-z]+[A-z]{3,3}[a-z][A-Z]{3,3}[a-z]+')<br>
reobj.findall(string)<br>
<br>
第4关:<br>
import re<br>
import urllib2<br>
<br>
urlbase = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='<br>
value = '46059'<br>
<br>
abc = urllib2.urlopen(urlbase + value).read()<br>
<br>
reobj = re.compile('^and the next nothing is [0-9]+$')<br>
while reobj.match(abc):<br>
&nbsp;&nbsp;&nbsp;  value = abc[24:]<br>
&nbsp;&nbsp;&nbsp;  abc = urllib2.urlopen(urlbase + value).read()<br>
print abc<br>
print value<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ------to be continue...<br>
<br> <a href="http://hi.baidu.com/abcngn/blog/item/b2f776c2b607d8130ef477e1.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/Python">Python</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/b2f776c2b607d8130ef477e1.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-03  23:55</pubDate>
        <category><![CDATA[Python]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/b2f776c2b607d8130ef477e1.html</guid>
</item>

<item>
        <title><![CDATA[vim的饭否插件!]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/646c0bf9827a9d5e252df2d8.html]]></link>
        <description><![CDATA[
		
		其实我早就看到了这个插件了,装上后发现作者是用的python2.4,在python2.5下只有一个功能能用(总共也只有三个功能^-^)<br>
看到有人在fanfou上找vim的fanfou插件, 我又把这个插件找了出来,花时间改了一下,基本能用了!<br>
主要是两处编码问题!<br>
还剩下的问题是解析消息时间的问题了!<br>
<br>
python需要simplejson模块,经过试用只在linux下有用!<br>
下载地址:<br>
<a href="http://www.drivehq.com/file/df.aspx/shareID5437304/fileID292366438/fanfou.zip" target="_blank">http://www.drivehq.com/file/df.aspx/shareID5437304/fileID292366438/fanfou.zip<br>
</a><br>
<br>
<br>
原脚本地址:<br>
http://www.phpvim.net/vim/vim-script-fanfou.html<br>
<br> <a href="http://hi.baidu.com/abcngn/blog/item/646c0bf9827a9d5e252df2d8.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/Python">Python</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/646c0bf9827a9d5e252df2d8.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-26  15:32</pubDate>
        <category><![CDATA[Python]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/646c0bf9827a9d5e252df2d8.html</guid>
</item>

<item>
        <title><![CDATA[gdb调试需要使用到的一些知识 [[转]]]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/98578b823a123aa50df4d275.html]]></link>
        <description><![CDATA[
		
		<p>为了更好的使用gdb来调试程序，需要具备一下技能：</p>
<p>gdb的基本调试手段，比如b **.c:fun linenum 设置断点 , next：单步执行, step 单步调试，可以跟踪进函数。注意编译的时候要加上－g选项。</p>
<p>info reg：查看寄存器状态。info locals：查看局部变量 p：打印变量的值 l：显示代码。x：以16进制的方式打印地址中的值。</p>
<p>linux 内存分配原理：局部变量放在栈中，栈外向低地址增长，栈内向高地址端增长；malloc的空间在堆上，堆外向高地址端增长，堆内向低地址端增长；代码放在 代码段；全局变量和静态放在数据段；未初始化的数据放在bss数据段。linux的32为位线性地址空间4G，从0xbfffffff开始往下是栈，从 0x08000000开始往上依次是代码段，已初始化的全局变量和静态变量的数据段，未初始化的全局变量和静态变量的数据段，malloc动态分配的空 间。在中间0x40000000往上是linux给共享内存分配的线性地址空间。</p>
<p>程序运行基本入栈原理：首先介绍3个重要的寄存 器：%ebp，%esp，%eip。%ebp：存放栈底地址，%esp：存放栈顶地址，%eip：存放下一条要运行的汇编代码的地址。例如：一个 func1函数调用一个func2函数，那么call func2之前一般会将func2函数需要使用的参数从右到左依次入栈，然后call func2这条语句会引发以下动作，将call func2的下一条要执行的汇编代码的地址入栈，将%ebp入栈（即func1函数的栈底地址入栈），之后便进入func2函数了，会将他要用到的局部变 量和他需要保存的一些寄存器入栈，如果你用gdb跟踪到此处，运行info reg你便可以清楚的看到%eip中存放了一个地址，你如何确认他就是call func2之后要执行的那条语句的地址呢？你运行disassemble func1便可以看到call func2之后运行的汇编代码的地址了，好奇的你如果还想进一步看看栈中是否有之前说的将call func2的下一条要执行的汇编代码的地址入栈，你可以运行x/n %ebp（**表示你希望打印地址之后4n个字节地址中的值。）。一般每个函数推出的时候都会执行ret，目的是为了将此函数的数据退栈，他会做一些准 备，首先mov %ebp %esp之后将%ebp中的值（即上一层函数func1的栈底地址）出栈，此时%esp便指向了call func2之后要执行的汇编代码的地址了。</p> <a href="http://hi.baidu.com/abcngn/blog/item/98578b823a123aa50df4d275.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/gnu%26%2347%3Blinux">gnu&#47;linux</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/98578b823a123aa50df4d275.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-18  11:55</pubDate>
        <category><![CDATA[gnu&#47;linux]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/98578b823a123aa50df4d275.html</guid>
</item>

<item>
        <title><![CDATA[我安装的firefox插件!]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/851d18807f395dd09123d908.html]]></link>
        <description><![CDATA[
		
		<span class="GeneratedHeader">生成：</span> Sat Dec 06 2008 11:24:24 GMT+0800 (CST)<br>
<span class="UserAgentHeader">User Agent:</span> Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008111318 Ubuntu/8.10 (intrepid) Firefox/3.0.4<br>
<span class="BuildIDHeader">Build ID:</span> 2008101315<br>
<br>
<span class="ExtensionHeader">启用扩展：</span> [17]
<ul>
    <li><a target="_blank" href="http://adblockplus.org/">Adblock Plus</a> 1.0</li>
    <li><a target="_blank" href="http://adblockplus.org/">Adblock Plus: Element Hiding Helper</a> 1.0.5</li>
    <li><a target="_blank" href="http://erichamiter.com/">BugMeNot</a> 2.0</li>
    <li><a target="_blank" href="https://addons.mozilla.org/firefox/user/108029">Compact Menu 2</a> 2.2.0</li>
    <li><a target="_blank" href="http://downthemall.net/">DownThemAll!</a> 1.0.3</li>
    <li><a target="_blank" href="http://addons.sociz.com/firefox/700/">Easy DragToGo</a> 1.1.2.2</li>
    <li><a target="_blank" href="http://www.xuldev.org/firegestures/">FireGestures</a> 1.1.6</li>
    <li><a target="_blank" href="http://www.mew.org/%7Ekazu/proj/firemacs/">Firemacs</a> 3.4</li>
    <li><a target="_blank" href="http://www.foxmarks.com/">Foxmarks Bookmark Synchronizer</a> 2.6.0</li>
    <li><a target="_blank" href="http://foxyproxy.mozdev.org/">FoxyProxy</a> 2.8.9</li>
    <li><a target="_blank" href="http://www.greasespot.net/">Greasemonkey</a> 0.8.20080609.0</li>
    <li><a target="_blank" href="http://interclue.com/">Interclue</a> 1.5.7</li>
    <li><a target="_blank" href="http://www.mrtech.com/extensions/">MR Tech Toolkit</a> 6.0.3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    用于生成本篇这个所安装的插件列表</li>
    <li><a target="_blank" href="http://www.stardrifter.org/refcontrol/">RefControl</a> 0.8.11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这是一个了不起的插件!</li>
    <li><a target="_blank" href="http://amb.vis.ne.jp/mozilla/scrapbook/">ScrapBook</a> 1.3.3.9</li>
    <li><a target="_blank" href="http://v2studio.com/k/moz/">Stop-or-Reload Button</a> 0.2.2</li>
    <li><a target="_blank" href="http://addons.sociz.com/firefox/54/">Tab Mix Lite CE</a> 3.0.1</li>
</ul>
<br>
<span class="ExtensionDisabledHeader">禁用扩展：</span> [8]
<ul>
    <li><a target="_blank" href="http://maltekraus.de/Firefox/search-tools">Add to Search Bar</a> 1.7</li>
    <li><a target="_blank" href="http://www.foxytunes.com/">FoxyTunes</a> 3.0.4</li>
    <li><a target="_blank" href="http://www.google.com/notebook">Google 笔记本</a> 1.0.0.22</li>
    <li><a target="_blank" href="http://www.outwit.com/">Outwit Images</a> 0.1.0.47</li>
    <li><a target="_blank" href="http://www.outwit.com/">OutWit Kernel</a> 0.8.1.172</li>
    <li><a target="_blank" href="http://www.peersbros.com/">Peers</a> 0.7.8</li>
    <li><a target="_blank" href="http://www.google.com/search?q=Firefox%20Ubuntu%20Firefox%20Modifications">Ubuntu Firefox Modifications</a> 0.6</li>
    <li><a target="_blank" href="http://vimperator.mozdev.org/">Vimperator</a> 1.2</li>
</ul>
<br>
<span class="ExtensionHeader">全部扩展： 25</span><br>
<br>
<span class="ThemeHeader">已安装主题：</span> [7]
<ul>
    <li><strong><a target="_blank" href="http://www.booksfree.com/themes/">Basic Brushed</a> 1.5</strong></li>
    <li><a target="_blank" href="http://www.mozilla.org/">Default</a></li>
    <li><a target="_blank" href="http://www.radar.250x.com/">iFox Metal</a> 3.0.3</li>
    <li><a target="_blank" href="http://www.radar.250x.com/">iFox Smooth</a> 3.0.3</li>
    <li><a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/7172">MacOSX Theme</a> 0.6.5</li>
    <li><a target="_blank" href="http://www.auburn.edu/%7Enzk0001/sci/moztheme.htm">Orthodox</a> 0.2.3</li>
    <li><a target="_blank" href="http://code.google.com/p/prototheme/">Proto</a> 1.1.1pre2</li>
</ul>
<br>
<span class="PluginHeader">已安装插件：</span> (8)
<ul>
    <li>Default Plugin</li>
    <li>Demo Print Plugin for unix/linux</li>
    <li>DivX&#174; Web Player</li>
    <li>Java(TM) Plug-in 1.6.0_10-b33</li>
    <li>QuickTime Plug-in 7.2.0</li>
    <li>Shockwave Flash</li>
    <li>Totem Web Browser Plugin 2.24.3</li>
    <li>Windows Media Player Plug-in 10 (compatible; Totem)</li>
</ul> <a href="http://hi.baidu.com/abcngn/blog/item/851d18807f395dd09123d908.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/Firefox">Firefox</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/851d18807f395dd09123d908.html#comment">查看评论</a>]]></description>
        <pubDate>2008-12-06  11:27</pubDate>
        <category><![CDATA[Firefox]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/851d18807f395dd09123d908.html</guid>
</item>

<item>
        <title><![CDATA[webalizer中文乱码问题]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/39505544fddd224b510ffef4.html]]></link>
        <description><![CDATA[
		
		webalizer是一个web server日志文件分析工具.<br>
我现在是用不上的,只是想看看它的源,学习学习.我下的是旧的2.01-10<br>
用中文的时候发现图片中有乱码!(中文编译方法将webalizer_lang.h 指向./lang/webalizer.simple_chinese)<br>
<br>
google发现都有这个现象.也有人给出了解决方法,试验了几个,找到了正确的适合我的方法,记录如此.<br>
<br>
主要原因在于ld库不支持gbk2312编码.这里我把文件换成utf8的.并重载db库中在图片上画字符串的函数!<br>
这里说重载不太准确.应该是Interpositioning!(c专家编程中这么说的!)<br>
<br>
编辑grophs.c文件,在最后加上两个函数:<br>
<br>
void gdImageString(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color)<br>
{<br>
&nbsp;&nbsp;&nbsp;    gdImageStringFT(im, 0 , color, &quot;/usr/share/fonts/truetype/wqy/wqy-zenhei.ttf&quot;, 9 , 0.0, x, y+9, s); //9 is the size<br>
}<br>
<br>
void gdImageStringUp(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color)<br>
{<br>
&nbsp;&nbsp;&nbsp;    gdImageStringFT(im, 0 , color, &quot;/usr/share/fonts/truetype/wqy/wqy-zenhei.ttf&quot;, 9 , -PI/2, x, y-9 , s);<br>
}<br>
<br>
再将lang/webalizer.simple-chinses转为utf8的,<br>
这有好多办法,有一个工具加iconv可以做到,专门做这事的!<br>
另一个就是用gedit打开,再别存为,为utf8的就行!<br>
<br>
重新编译试试看!<br>
<br>
要是你的firefox没有设置的话,你可能看到很好笑的一幕,图片中的字符到是没有乱码,可是,图片以外的都成了乱码了!<br>
这时设置一下firefox的编码就可以了!设置成自动检测吧!<br>
<br>
顺便帖一个别人总结的看源代码的经验:<br>
<p>最后，对于在这篇文章中提到的分析源代码程序的一些方法做一下<strong>小结</strong>，以作为本文的结束。<br>
分析一个源代码，一个有效的方法是：<br>
1、阅读源代码的说明文档，比如本例中的README, 作者写的非常的详细，仔细读过之后，在阅读程序的时候往往能够从README文件中找到相应的说明，从而简化了源程序的阅读工作。<br>
2、如果源代码有文档目录，一般为doc或者docs， 最好也在阅读源程序之前仔细阅读，因为这些文档同样起了很好的说明注释作用。<br>
3、从makefile文件入手，分析源代码的层次结构，找出哪个是主程序，哪些是函数包。这对于快速把握程序结构有很大帮助。<br>
4、从main函数入手，一步一步往下阅读，遇到可以猜测出意思来的简单的函数，可以跳过。但是一定要注意程序中使用的全局变量（如果是C程序），可以把关键的数据结构说明拷贝到一个文本编辑器中以便随时查找。<br>
5、分析函数包（针对C程序），要注意哪些是全局函数，哪些是内部使用的函数，注意extern关键字。对于变量，也需要同样注意。先分析清楚内部函数，再来分析外部函数，因为内部函数肯定是在外部函数中被调用的。<br>
6、需要说明的是数据结构的重要性：对于一个C程序来说，所有的函数都是在操作同一些数据，而由于没有较好的封装性，这些数据可能出现在程序的任何地方，被任何函数修改，所以一定要注意这些数据的定义和意义，也要注意是哪些函数在对它们进行操作，做了哪些改变。<br>
7、 在阅读程序的同时，最好能够把程序存入到cvs之类的版本控制器中去，在需要的时候可以对源代码做一些修改试验，因为动手修改是比仅仅是阅读要好得多的读 程序的方法。在你修改运行程序的时候，可以从cvs中把原来的代码调出来与你改动的部分进行比较(diff命令), 可以看出一些源代码的优缺点并且能够实际的练习自己的编程技术。<br>
8、阅读程序的同时，要注意一些小工具的使用，能够提高速度，比如vi中的查找功能，模式匹配查找，做标记，还有grep，find这两个最强大最常用的文本搜索工具的使用。</p>
<p><br>
对于一个Unix/Linux下面以命令行方式运行的程序，有这么一些套路，大家可以在阅读程序的时候作为参考。<br>
1、在程序开头，往往都是分析命令行，根据命令行参数对一些变量或者数组，或者结构赋值，后面的程序就是根据这些变量来进行不同的操作。<br>
2、分析命令行之后，进行数据准备，往往是计数器清空，结构清零等等。<br>
3、在程序中间有一些预编译选项，可以在makefile中找到相应部分。<br>
4、注意程序中对于日志的处理，和调试选项打开的时候做的动作，这些对于调试程序有很大的帮助。<br>
5、注意多线程对数据的操作。（这在本例中没有涉及）</p> <a href="http://hi.baidu.com/abcngn/blog/item/39505544fddd224b510ffef4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/gnu%26%2347%3Blinux">gnu&#47;linux</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/39505544fddd224b510ffef4.html#comment">查看评论</a>]]></description>
        <pubDate>2008-11-24  14:50</pubDate>
        <category><![CDATA[gnu&#47;linux]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/39505544fddd224b510ffef4.html</guid>
</item>

<item>
        <title><![CDATA[getopt函数的例子]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/796bbc06f1c13d7c020881a4.html]]></link>
        <description><![CDATA[
		
		打算重新拿起webalizer的源代码来看看,以前看明白的东西忘得差不多了!现在记下来!<br>
<br>
getopt是用来解析命令行参数的一个函数!<br>
<br>
#include &lt;unistd.h&gt; /*for getopt*/<br>
#include &lt;stdlib.h&gt; /*for exit()*/<br>
#include &lt;stdio.h&gt; /*for printf*/<br>
<br>
int<br>
main(int argc, char *argv[])<br>
{<br>
&nbsp;&nbsp;&nbsp;   int  opt;<br>
&nbsp;&nbsp;&nbsp;   opterr = 0;<br>
&nbsp;&nbsp;&nbsp;   <br>
<br>
&nbsp;&nbsp;&nbsp;   while ((opt = getopt(argc, argv, &quot;nt:&quot;)) != -1) {<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   switch (opt) {<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   case 'n':<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   printf(&quot;there is a option 'n',and it's args is %s\n&quot;, optarg);<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   printf(&quot;optind = %d\n&quot;, optind);<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   break;<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   case 't':<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   printf (&quot;t and t's args is %s\n&quot;, optarg);<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   printf(&quot;optind = %d\n&quot;, optind);<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   break;<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   //default: /* '?' */<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   case '?':<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   fprintf(stderr, &quot;Usage: %s [-t nsecs] [-n]\n&quot;,argv[0]);<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   fprintf(stderr,&quot;invalid option %c\n&quot;, optopt);<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   exit(1);<br>
&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;&nbsp;   }<br>
&nbsp;&nbsp;&nbsp;   }<br>
&nbsp;&nbsp;&nbsp;   printf(&quot;%d\n&quot;,optind);<br>
<br>
&nbsp;&nbsp;&nbsp;   return 0;<br>
}<br>
<br>
仔细的文档看man 3 getopt<br>
有几个extern 变量看看是什么意思:<br>
optind 下一个选项的索引,这个值是不会是某个选项的参数在argv[]中的索引!getopt就是用他来遍历argv的!<br>
<br>
optarg,如果当前选项有参数的话optarg指向些string,没有的话,optart=NULL;<br>
<br>
opterr,如果argv中有一个getopt不认识的选项,不在那个 optstring(即getopt的第三个参数)中getopt会出错,这时候getopt返回'?',并把这个选项赋给了optopt,并在stderr有输出.<br>
如果你把opterr赋成0,则不会有输出!还是会返回'?',还是会optopt=那个不认识的选项字符!<br>
<br>
<br>
<font size="3">需要补充说明一点的是Linux下一个命令通常带选项和参数支持短格式和长格式两种。<br>
短格式比如：<br>
command -h #这就是这个命令只有一个选项h，并且h不带任何参数<br>
对应的长格式比如：<br>
command --help #这就是这个命令只有一个选项help，并且help不带任何参数<br>
如果一个选项带有参数，那称之为选项参数，比如：<br>
command -f filename #这就是这个命令只有一个选项f，并且f需要带参数表明文件名<br>
对应的长格式可能是：<br>
command --filename yourfilename #这就是这个命令只有一个选项filename，并且f需要带参数表明文件名</font><br>
<br>
还有两个相似的函数getopt_long,getopt_long_long!<br>
接着man 去! <a href="http://hi.baidu.com/abcngn/blog/item/796bbc06f1c13d7c020881a4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/gnu%26%2347%3Blinux">gnu&#47;linux</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/796bbc06f1c13d7c020881a4.html#comment">查看评论</a>]]></description>
        <pubDate>2008-11-24  00:10</pubDate>
        <category><![CDATA[gnu&#47;linux]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/796bbc06f1c13d7c020881a4.html</guid>
</item>

<item>
        <title><![CDATA[ubuntu安装fvwm和fvwm-themes]]></title>
        <link><![CDATA[http://hi.baidu.com/abcngn/blog/item/d59d4b25d65b6f6734a80fb1.html]]></link>
        <description><![CDATA[
		
		我用的源里有fvwm,但是没有fvwm-themes这个包!<br>
<br>
安装fvwm:<br>
sudo apt-get install fvwm wm-icons<br>
wm-icons对后面的fvwm-themes有用!<br>
<br>
安装完后,重启在gdm登陆界面 : 选项-&gt;会话-&gt;选择fvwm就能进入fvwm了!<br>
可以明显的感觉到这个启动速度要比gnome快多了!<br>
<br>
但是,如果你没有做好配置的话,fvwm是很难看的!可以先到网上下载一个别人的配置文件到~/.fvwm/.fvwm2rc<br>
一个很好的开始的例子是:<br>
Fvwm beginners guide中的那个例子,还带有图片资源!图片和icon在<a target="_blank" href="http://www.zensites.net/fvwm/guide/fvwm-guide-icons.tar.bz2">这里</a>,它的.fvwm2rc在<a target="_blank" href="http://www.zensites.net/fvwm/guide/fvwm2rc-guide.html">这里</a><br>
注意要改一些开始定义的路径以与自己的系统一致!<br>
<br>
<br>
要是你想一开始就有很好看的效果,又不想去细细看fvwm的文档,可以装上fvwm-themes试试,这个是为了更好的配置fvwm而建立的一个工程.它包含一,二十个已经做好了的主题!<br>
<br>
<br>
安装fvwm-themes<br>
<br>
可能源里没有这个东西,好在它的官网有deb包!<br>
去<a href="http://fvwm-themes.sourceforge.net/deb/" target="_blank">这里</a>下载,要下载两个deb包,一个base,一个extra.<br>
用dpkg -i xxxxx.deb装上!<br>
<br>
再重启的话,进fvwm不会有什么改变因为还有事没做!<br>
sudo vim /usr/share/xsessions/Fvwm.desktop<br>
改成下面这样,(就改了两行)<br>
## /etc/dm/Sessions/Fvwm.desktop ##<br>
<br>
[Desktop Entry]<br>
Encoding=UTF-8<br>
Name=Fvwm<br>
Comment=Fvwm<br>
Exec=fvwm-themes-start<br>
Terminal=False<br>
TryExec=fvwm-themes-start<br>
Type=Application<br>
<br>
[Window Manager]<br>
SessionManaged=true<br>
<br>
##<br>
<br>
再启动的时候就能进入fvwm并能启动fvwm-themes了!<br>
<br>
什么,有乱码?去/usr/share/fvwm/themes/xxx/modules/fonts改成你想要的吧!<br>
ubuntu下用文泉驿正黑就不错!<br>
可以改成这样的:<br>
&quot;xft:WenQuanYi Zen Hei:Bold:pixelsize=8:minspace=True:antialias=True&quot;<br>
<br>
下面是张截图:<br>
<div align="left" forimg="1">
<div align="center" forimg="1"><a target="_blank" href="http://hiphotos.baidu.com/abcngn/pic/item/7c37db23d6b4cc5293580704.jpg"><img width="200" height="150" border="0" class="blogimg" small="1" src="http://hiphotos.baidu.com/abcngn/pic/item/7c37db23d6b4cc5293580704.jpg"></a></div>
</div> <a href="http://hi.baidu.com/abcngn/blog/item/d59d4b25d65b6f6734a80fb1.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/abcngn/blog/category/Fvwm">Fvwm</a>&nbsp;<a href="http://hi.baidu.com/abcngn/blog/item/d59d4b25d65b6f6734a80fb1.html#comment">查看评论</a>]]></description>
        <pubDate>2008-11-22  13:01</pubDate>
        <category><![CDATA[Fvwm]]></category>
        <author><![CDATA[很是烦]]></author>
		<guid>http://hi.baidu.com/abcngn/blog/item/d59d4b25d65b6f6734a80fb1.html</guid>
</item>


</channel>
</rss>