Monday, September 5, 2011

how to disable "dim" or "opacity" when searching in opera

type opera:config in address bar, and search for "opacity" in the search field.
change the value from default 52 to 0, and apply. The window will no longer dim .

how to control "double click" popup menu of opera

open file ui\standard_menu.ini, and search for  "copy to note". Modify following section, and "copy" will be moved to No. 1 position.

[Hotclick Popup Menu]
Item, MI_IDM_DOCCOPY = Copy
Item, MI_IDM_SELSEARCH = Hotclick search, 200,,, "Search Web"
Item, MI_IDM_SELSEARCH = Hotclick search, 200,,, "Search Web"
Submenu, MI_IDM_SEARCH_DUMMY_PARENT, Internal Search With
--------------------1
Item, M_COPY_TO_NOTE = Copy to note
Platform Win2000-Unix-Mac, Feature Voice, Item, M_HOTCLICK_MENU_ITEM_SPEAK = Speak selection

mips instruction encoding

Instructions are divided into three types: R, I and J. Every instruction starts with a 6-bit opcode. In addition to the opcode,
R-type instructions specify three registers, a shift amount field, and a function field;
I-type instructions specify two registers and a 16-bit immediate value;
J-type instructions follow the opcode with a 26-bit jump target.

The following are the three formats used for the core instruction set:
Type format (bits)

      31-26 | 25-21 |20-16 |15-11 | 10-6 | 5-0 |
R: opcode (6) | rs (5) |rt (5) |rd (5) | shamt (5) | funct (6) |
I: opcode (6) | rs (5) |rt (5) |immediate (16) |
J: opcode (6) | address (26)                         |


UDI instructions are added to MIPS24Kc core.

Thursday, June 30, 2011

python example (jpeg timestamp)

This is a combination usage of:
iterator
callback
yield
image processing

Created/updated by BA43B09F0725,qunshan@newsmth

import os, sys, time
import Image, ImageDraw, ImageFont

def findfiles(path, *callbacks):
for root, dirs, names in os.walk(path):
for name in names:
filename = os.path.join(root, name)
info = tuple(x(filename) for x in callbacks)
yield (filename,)+info

def addString(filename, timestr):
font = ImageFont.truetype(os.path.join(os.environ['windir'], 'Fonts', 'AGENCYB.TTF'), 108)
im = Image.open(filename)
x, y = im.size
draw=ImageDraw.Draw(img)
#draw.ink = 0 + 255*256 + 0*256*256
draw.text((x-640,y-128), timestr, font=font)
img.save(filename)

def addTimeString(filename, mtime):
timestr = time.strftime("%Y-%m-%d %H:%M", time.localtime(mtime))
addString(filename, timestr)
os.utime(filename, (time.time(), mtime))

if __name__ == '__main__':
for filename, mtime in findfiles(sys.argv[1], os.path.getmtime):
if filename.lower().endswith(('.jpg', '.jpeg')):
addTimeString(filename, mtime)

Thursday, June 23, 2011

停车技巧

停车技巧:

非字形停车位:右侧车身 距离车位线1.5m,向后倒车; 在驾驶位位于隔一个停车位正中央时,向内侧打满轮,至车正,回正。

一字形停车: 右侧车身 距离车位线0.5m,向后倒车;在后视镜和前车B柱平行时,向内侧打满轮,继续倒车,至车呈45度角,反向打满轮,至车正,回正。

斜线停车位:后视镜对停车位近端边线时,向外侧打满轮,至车身和车位平行,回正,入车位。

自动档驾驶学习

N档的作用:
转自http://club.autohome.com.cn/bbs/thread-c-413-824998-1.html

1、被拖车时用: (拖行距离不超过50公里)。

2、长时间(超过1分钟至数分钟内)等红灯时用: (在我们这里,红绿灯都有数字递减显示。就可以根据上述原则,采取“①挂N,拉手闸。②保持D档,拉手闸。”)

3、汽车启动、熄火时: (所有汽车说明书都是讲点火要挂在P档,但问题在于: 当在P档点火后,要挂入D档前,是一定要经过R(倒车档)档,当经过R档时,车辆会自然震动一下,这是挂R档的缘故,从P档到D档过程中,等于先入了R档再入D档,无形中多了一次入R档的组合和磨擦,

我的做法是:踩着刹车打开钥匙第一级--挂N档--打火--挂D档--松手刹、放脚刹起步。
自动档熄车也有讲究,我是这样操作的: 熄火前踩着刹车挂N档--拉手刹--放开脚刹--关钥匙第一级--入P档--关钥匙第二级并取出钥匙。 其道理是:停车时,当踩着刹车入P档,拉手刹放开脚刹时,车辆会惯性地向前或向后移动一点位置,这是因为停车场不平整或有少许斜坡而造成的,不要小看这一点点移动,它会对自动变速箱中的锁止栓有一定的冲击,日积月累会对锁止栓有损害,就会出现过锁止栓断开的故障)。

Sunday, June 12, 2011

cache - set associative

Cache Associative:

Full-Associative
If the replacement policy is free to choose any entry in the cache to hold the copy, the cache is called fully associative.
Direct-Mapped
At the other extreme, if each entry in main memory can go in just one place in the cache, the cache is direct mapped.
N-Way-Associative
Many caches implement a compromise in which each entry in main memory can go to any one of N places in the cache, and are described as N-way set associative.

If there are N places to which the replacement policy could have mapped a memory location, then to check if that location is in the cache, N cache entries must be searched. Checking more places takes
*PROs: caches with more associativity suffer fewer misses
*CONs: more power, chip area, and potentially time.


From direct mapped to 2-way, or from 2-way to 4-way, has about the same effect on hit rate as doubling the cache size.
Associativity increases beyond 4-way have much less effect on the hit rate


Example:
An 4K cache is often organized as a set of 256 lines(slots) of 16 bytes each.
Accordingly, a 4-way associative 4K cache has 64 sets, each set having 4 lines mapped.

A 32b address is divided into
[31:10] [9:4] [3:0]
tag set offset

For a given physical addr, first find the set with A[9:4] in cache.
Then search in all 4 slots to see if the tag A[31-10] matches the tag in the slot.

Wednesday, May 25, 2011

cshell redirection

Character Action

>
Redirect standard output

>&
Redirect standard output and standard error

<
Redirect standard input

>!
Redirect standard output; overwrite file if it exists

>&!
Redirect standard output and standard error; overwrite file if it exists

|
Redirect standard output to another command (pipe)

>>
Append standard output

>>&
Append standard output and standard error

Tuesday, May 10, 2011

[python] Parameters: pass by value or ref?

C is pass-by-value.
Java is pass-by-value.
Python passes references-to-objects by value (like Java), and everything in Python is an object.

Some objects, like strings, tuples, and numbers, are immutable. Altering them inside a function/method will create a new instance and the original instance outside the function/method is not changed.

Other objects, like lists and dictionaries are mutable, which means you can change the object in-place. Therefore, altering an object inside a function/method will also change the original object outside. Assigning a separate object (e.g. creating a new instance) to the input parameter will also not change the original instance.


   def  no_change0(val)
          val *= 2   #original val is not changed.
         
    def  no_change1(inst)
          inst = {}
          inst['anything'] = 'something'  #original inst is not changed!!!


   def  change1(inst)
          inst['anything'] = 'something'  #original inst is changed this time.

[python] How to iterate through a list

  • basic iteration 
Iterating through a list in Python is simple using a for in loop.
colours = ["red","green","blue"]

for colour in colours:
    print colour
  • enumerate 
To iterate through the same list using an index we can apply the enumerate() function.
colours = ["red","green","blue"]

for i, colour in enumerate(colours):
    print i, colour

  • Remove elements as you traverse a list
iterate over a copy of the list:
for c in colors[:]:
    if c == 'green':
        colors.remove(c)
Hereby colors[:] is a copy (a weird but, sigh, idiomatic way to spell list(colors)) so it doesn't get affected by the .remove calls

Saturday, April 30, 2011

制作面包

溶解酵母

正确地溶解酵母是成功制作发酵面包最重要的步骤。

  1. 将酵母和少量糖溶解在40到46摄氏度左右的温水。这个温度和糖能使酵母迅速膨胀。可以使用温度计来检查液体的温度。
  2. 大约5分钟后,酵母将开始起泡。如果不起泡,请倒掉酵母混合物,然后重新操作。
     

切勿使用过期的酵母。酵母的效用会随时间降低。

和面
和面的时候将酵母水分次倒入面粉中,不要一次倒入,最好分次按量调节加入水分。
和面的目标是一定要把面团揉出筋。面筋是小麦粉中的蛋白质,它决定了面包的结构。面筋在面团中形成柔韧的长丝,这些长丝会拦住酵母产生的二氧化碳气体。拦住的气体会让面包发面。
用面包机揉面可以选发面团模式揉20分钟停下后再打开发面团模式再揉20分钟基本就可以出筋。
  1. 在面板上撒一层薄面,然后揉面。
  2. 揉面时,一定要使用手腕的力量,而不是手指的力量。
  3. 手腕用力将面团向外侧推开,然后将外侧的面放在下面,反复重复以上操作。
  4. 揉按面团,直到用手指按压时感觉到光滑、柔软、富有弹性(需8到10分钟)。气泡或水泡就会出现在面团表层下。
  5. 揉好面团后要对面团进行进一步的揉和摔打,直到揉出面筋,拉开面团有撑不破的膜为止,大概需要一小时左右的时间。
     
发面
  1. 用湿纱布将盆盖上,并将其放在温暖(21到24摄氏度)无风的地方。
  2. 让面团发面,直到体积增大一倍,这大概需要1小时。
发好的面团用手按下,按下的洞不回缩,为发酵完成。


塑形和二次发面

  1. 面团体积增大一倍后,用拳头进行挤压。这样可以去除大气泡,让面包的质地更细腻均匀。
  2. 将面团的各边向中间折,形成球形。
  3. 根据食谱说明对面团进行塑形,并将其放在涂好油的烤箱油纸或抹好油的面包盘中。
  4. 将塑形的面包盖上,然后将它们放在一个暖和的地方再次发面,直到体积增大一倍,这大概需要40分钟。
烘焙
  1. 将面包放在已经预热的烤箱中间的架子上。
  2. 如果面包变成金褐色,形状是圆圆的,轻拍时听起来是中空的,那么说明面包已经做好了。
  3. 若要使面包皮松脆,请在烘焙的过程中,在烤箱的底部放盘水,或者在面包表面刷层水。
    若要使面包皮松软,烘焙完后,立即在面包表面刷层软化黄油。

冷却和储藏
  1. 立即将面包从面包盘或烤箱油纸中取出,然后将面包放在铁架上冷却。
  2. 面包完全冷却后,用塑料包装袋将其包起来,或者将其放入密封的塑料袋或容器中。
  3. 在室温下储藏面包;将面包放在冰箱中会让面包更快变味。
  4. 将未包装的发酵面包放在室温下2到3小时进行解冻;您也可以将它们部分包起来放在温度190摄氏度左右的烤箱中加热20分钟。
  5. 在冷冻之前,需要将新出炉的面包放在铁架上至少冷却3小时。将面包在冰箱中的平面上放2小时,或者直到它已经冻硬。用塑料包装袋包好冷冻的面包,然后将面包放在铝箔中。标上面包的制作日期及面包的种类,然后将其放回冰箱。
  6. 面包最多可以冷冻6个月。将冷冻的面包连同包装放在室温下解冻2到3小时。将面包放在温度为150摄氏度左右的烤箱上加热20分钟,使其恢复新鲜。

Sunday, March 20, 2011

蛙泳

1.身体配合口诀:
蛙泳配合需注意,腿臂呼吸要适宜;
两臂划水腿放松,收手同时要收腿
两臂前伸腿蹬水,臂腿伸直划一会;
划水头部慢抬起,伸手滑行慢呼气。
2.蛙泳手臂动作口诀:
蛙泳手臂对称划,桃型划水向侧下;
两手屈腕来抓水,屈臂高肘向后划;
划到肩下快收手,两肘用力向里夹;
双手平行向前伸,伸直放松往前进。
3.蛙泳腿部动作口诀:
蛙泳蹬腿像青蛙,向后蹬夹向前滑;
收腿脚跟臀边靠,两膝相距似肩宽;
边收边分慢收腿,翻脚脚尖向两边;
用力向后蹬夹水,两脚并拢漂一会。

Monday, March 14, 2011

text formatter

#!/usr/bin/env python
# -*- coding: utf8 -*-
#-------------------------------------------------------------------------
#File name : strip.py
#Author : lfchen (Full Name please)
#Created : Mon 14 Mar 2011 02:04:35 PM CST
#Description :
# :
#Notes :
#-------------------------------------------------------------------------
#Copyright 2011 (c)
#-------------------------------------------------------------------------
import sys
import re

coding = 'utf-8'
def strip(infile, outfile):
try:
INFILE = open(infile,"r")
except:
print "\tERROR: fail to open file %s for processing" % infile
return
OUTFILE = open(outfile,"w")
prev_line=""
for line in INFILE:
line=line.decode(coding).rstrip("\n")
if line.endswith(" "): #keep ending space to avoid unintended contatenation of strings
line=line.rstrip() + " "
else:
line=line.rstrip()
if re.match(r'^\s*$', line) \
or line.endswith(".") or line.endswith("!") or line.endswith("?") or line.endswith(":") or line.endswith(";") \
or line.endswith("。".decode(coding)) or line.endswith("!".decode(coding)) or line.endswith("?".decode(coding)) \
or line.endswith(":".decode(coding)) or line.endswith(";".decode(coding)):
line += "\n"
if ('A'<=line[0]<='Z' or u'A'<=line[0]<=u'Z') and not prev_line.endswith("\n"):
line = "\n" + line
OUTFILE.write(line.encode(coding))
prev_line=line
INFILE.close()
OUTFILE.close()

if __name__ == "__main__":
if ("-h" in sys.argv[:]):
print "Usage: %s <filename(s)>" % sys.argv[0]
sys.exit(0)
else:
for filename in sys.argv[1:]:
print "dealing with file %s" % filename
strip(filename, "formatted_"+filename)

Wednesday, March 9, 2011

steps to setup web server (wsgi based)

========== installing apache ==========
1. download httpd-x.x.xx.tar.gz, and extract to specified folder; rename if necessary
2. chdir to exacted folder
3. ./configure --prefix=$PREFIX ($PWD is supported)
4. make (compile)
5. make install (install)
6. ./httpd -k start|stop|restart
========== installing python ==========
1. basically the same as apache installation
 2. additional package (try easy_install ) including genshi, repoze.tm, zif.sedna, xlwt, verilib, mx, RuleDispatch)0.
http://peak.telecommunity.com/snapshots/PyProtocols-1.0a0dev-r2302.tar.gz
http://peak.telecommunity.com/snapshots/RuleDispatch-0.5a1.dev-r2618.tar.gz

========== TurboGears ========
0. what's TurboGears
connect python to web (web io, db)
1. to install
download: wget http://www.turbogears.org/download/tgsetup.py
install: python tgsetup.py

========== paste ========
0. what's paste
1. to install (requires setuptools)
download: wget http://pypi.python.org/packages/source/P/Paste/Paste-1.7.5.1.tar.gz
wget http://pypi.python.org/packages/source/P/PasteScript/PasteScript-1.7.3.tar.gz#md5=9101a3a23809d3413b39ba8b75dd0bce
  install: python setup.py install
========== pylons ========
0. what's pylons
Pylons combines the very best ideas from the worlds of Ruby, Python and Perl, providing a structured but extremely flexible Python web framework. It's also one of the first projects to leverage the emerging WSGI standard, which allows extensive re-use and flexibility — but only if you need it. Out of the box, Pylons aims to make web development fast, flexible and easy.
1. to install
easy_install -f http://pylonshq.com/download/ Pylons==0.9.6.2
========== wsgi ========
0. what's wsgi
WSGI is the Web Server Gateway Interface. It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that). It is a Python standard, described in detail in PEP 333.
1. to install
download: wget http://...
install: configure/make/make install
2. to use it, need python:paste & paste script

========== sedna ==========
1. download binary from website
http://modis.ispras.ru/sedna/install.html#srcfull
2. sh ./sedna-xxx-bin-xxx.sh
set the target addr to: /opt/soft/sedna-3.1.17 (3.4.66 doesn't work yet :( )
and the installed path will be .../sedna/
3. configure the result data folder (if necessary)
SEDNA_PATH/etc/sednaconf.xml
/opt/soft/SEDNA_DB_DATA
need to crate the data folder manually
4. at engsrv35, use se_exp export $mydb to export existent db
at bjdb, use se_exp import $mydb to import db


Monday, March 7, 2011

decorator

Definition
A decorator is a function whose primary purpose is to wrap another function or class.
Purpose
The primary purpose of this wrapping is to transparently alter or enhance the behavior
of the object being wrapped.
Basic usage
Syntactically, decorators are denoted using the special @ symbol as follows.  More than one decorator can also be applied.
@trace1
@trace0
def square(x):
    return x*x
The preceding code is shorthand for the following:
def square(x):
    return x*x
square = trace1(trace0(square))

Using parameters
A decorator can also accept arguments. Here’s an example:
@eventhandler('BUTTON')
def handle_button(msg):
    ...
The semantics of the decorator are as follows:
def handle_button(msg):
    ...
temp = eventhandler('BUTTON') # Call decorator with supplied arguments
handle_button = temp(handle_button) # Call the function returned by the decorator

Class decorator
Decorators can also be applied to class definitions. For example:
@foo
class Bar(object):
    def __init__(self,x):
        self.x = x
    def spam(self):
        statements

For class decorators, you should always have the decorator function return a class object
as a result.

decorator

how to release python program/lib

To distribute Python programs to others, you should use the distutils module.
1. As preparation, you should first cleanly organize your work into a directory that has a
README file, supporting documentation, and your source code.
Typically, this directory will contain a mix of library modules, packages, and scripts. Modules and packages refer to source files that will be loaded with import statements. Scripts are programs that will run as the main program to the interpreter (e.g., running as python scriptname).
Here is an example of a directory containing Python code:
spam/
    README.txt
    Documentation.txt
    libspam.py # A single library module
    spampkg/ # A package of support modules
        __init__.py
        foo.py
        bar.py
    runspam.py # A script to run as: python runspam.py



2. After you have organized your code, create a file setup.py in the top most directo-
ry (spam in the previous examples). In this file, put the following code:
# setup.py
from distutils.core import setup
setup(name = "spam",
    version = "1.0",
    py_modules = ['libspam'],
    packages = ['spampkg'],
    scripts = ['runspam.py'],
)

3.Type the following shell command to make a source distribution:
% python setup.py sdist
...
This creates an archive file such as spam-1.0.tar.gz or spam-1.0.zip in the directo-
ry spam/dist.

If you type 'python setup.py bdist', a binary distribution is created in
which all of the .py files have already been precompiled into .pyc files and placed into
a directory structure that mimics that of the local platform.
  If you run 'python setup.py bdist_wininst' on a Windows machine, an .exe file will be created.
4. To install, a user simply unpacks the archive and performs these steps:
% unzip spam-1.0.zip
...
% cd spam-1.0
% python setup.py install

This installs the software into the local Python distribution and makes it available for
general use. Modules and packages are normally installed into a directory called
"site-packages" in the Python library.

5. alternative install option
 Python software is often distributed in the form of an .egg file.This format is created by the popular setuptools
extension (http://pypi.python.org/pypi/setuptools).To support setuptools, you can
simply change the first part of your setup.py file as follows:
# setup.py
try:
    from setuptools import setup
    except ImportError:
    from distutils.core import setup
    setup(name = "spam",
        ...
    )

6. Appendix:
list of setup arguments:
Parameters to setup()Parameter Description
name Name of the package (required)
version Version number (required)
author Author’s name
author_email Author’s email address

maintainer Maintainer’s name
maintainer_email Maintainer’s email
url Home page for the package
description Short description of the package
long_description Long description of the package
download_url Location where package can be downloaded
classifiers List of string classifiers

TurboGears

Sunday, March 6, 2011

游泳学习

踩水
保持双大腿在前,两脚呈摇橹状
1. 小臂平面向后划

2. 小腿收回状态时,脚往外侧翻,指向蹬出方向
3. 蹬出双腿
4. 收回。过程中双脚垂直于收回方向

蛙泳 - 简单分为5步:
划(臂)/收(臂)/伸(臂)、蹬(腿)/漂

1. 划臂至与肩同宽时,向下压水,使头部浮出水面。
2. 收臂至胸前
3. 先伸臂,然后向侧后方蹬腿。蹬腿前,把脚掌向外翻,以增加划水面积。
4. 直体漂滑

自由泳 -

Thursday, February 24, 2011

opera menu configuration

standard_menu.ini
1. reason to change
a) disable unwanted "translate" menu
b) disable unwanted Inspect Item
c) move "copy" to first for Selection mode
d) use uniform shortcut for image property access.

2. changes to make

[Hotclick Popup Menu]

Item, MI_IDM_DOCCOPY = Copy
Item, M_COPY_TO_NOTE = Copy to note
Platform Win2000-Unix-Mac, Feature Voice, Item, M_HOTCLICK_MENU_ITEM_SPEAK = Speak selection
--------------------1
Item, MI_IDM_SELSEARCH = Hotclick search, 200,,, "Search Web"
Submenu, MI_IDM_SEARCH_DUMMY_PARENT, Internal Search With
--------------------2
Item, MI_IDM_SELDICTIONARY = Hotclick search, 50
Item, MI_IDM_SELENCYCLOPED = Hotclick search, 51
--------------------3
Item, M_HOTCLICK_POPUP_MENU_GOTO_URL = Go to page, "%t"
Item, MI_IDM_SELMAIL = Send text in mail


[Image Popup Menu]
Item, M_OPEN_IMAGE = Open image
Item, M_MENU_RELOAD_IMAGE = Load image
Item, MI_IDM_COPY_FIG_ADDRESS = Copy image address
--------------------1
Item, MI_IDM_SAVE_FIGURE = Save image
Item, M_DOCUMENT_BACKGROUND_MENU_COPY_TO_CLIPBOARD = Copy image
--------------------2
Platform Windows-Mac, Item, M_DOCUMENT_BACKGROUND_MENU_USE_ON_DESKTOP = Use image as desktop background
Item, M_IMAGE_MENU_USE_ON_SPEEDDIAL = Use image as speed dial background
--------------------3
; GhostItem, M_INSPECT_ELEMENT = Inspect element
GhostItem, M_FOLLOW_LONGDESC = Follow Image Description URL
Item, MI_IDM_SHOW_FIGURE_PROPERTIES = Show image properties

Monday, February 14, 2011

Linux配置Apache服务器全攻略

全文摘自 "特务的专栏":http://blog.csdn.net/cookies_6362/archive/2008/09/04/2881206.aspx

一,使用源代码安装

(1) 获得源代码

# lynx http://www.apache.org/dist/httpd/httpd-2_0_NN.tar.gz

NN表示当前所用的版本号。

(2) 解压缩

# gzip -d httpd-2_0_NN.tar.gz

# tar xvf httpd-2_0_NN.tar 

(3) 配置.

# ./configure --prefix= /usr/local/apache --enable-so

表示Apache将安装在/usr/local/apache目录下

(4) 编译与安装

# make

# make install

(5) 测试

# /usr/local/apache/bin/apachectl start

二,使用RPM包安装

# rpm —ivh apache-*.rpm

完成安装后,配置文件在/etc/httpd/conf/目录下,文件根目录为/var/www/html,工具文件在/etc/rc.d/init.d/目录下,日志文件在/var/log/httpd/目录下。

第三站 Apache 2.0的配置

Apache 2.0的主配置文件为httpd.conf。如果以上述源代码安装则配置文件保存在/usr/local/apache/conf/目录下,若以RPM包方式安装则配置文件保存在/etc/httpd/conf/目录下。我们可以直接修改httpd.conf文件也可以用redhat linux 9自带的图形化工具来配置。打开启动程序->系统设置->服务器设置->HTTP服务器,可以进行相关。主界面如图:

下面我们来看一下httpd.conf中的几条指令,“#”后加入了注释说明。

Port 80 #定义了web服务器的侦听端口,默认值为80,它是TCP网络端口之一。若写入多个端口,以最后一个为准。

User apache #一般情况下,以nobody用户和nobody组来运行web服务器,因为web

Group apache # 服务器发出的所有的进程都是以root用户身份运行的,存在安全风险。 

ServerAdmin root@localhost #指定服务器管理员的E-mail地址。服务器自动将错误报告到该地址。 

ServerRoot /etc/httpd #服务器的根目录,一般情况下,所有的配置文件在该目录下

ServerName new.host.name:80 #web客户搜索的主机名称

KeepAliveTimeout 15 #规定了连续请求之间等待15秒,若超过,则重新建立一条新的TCP连接 

MaxKeepAliveRequests 100 #永久连接的HTTP请求数

MaxClients 150 #同一时间连接到服务器上的客户机总数

ErrorLog logs/error_log #用来指定错误日志文件的名称和路径

PidFile run/httpd.pid #用来存放httpd进程号,以方便停止服务器。

Timeout 300 #设置请求超时时间,若网速较慢则应把值设大。

DocumentRoot /var/www/html #用来存放网页文件

第四站 Apache的管理


(1) 启动和停止Apache

/etc/rc.d/init.d/httpd start

/etc/rc.d/init.d/httpd stop

(2) Apache的日志文件

有人说判定一个管理员是否优秀之一就是看他是否是一个分析日志的能手,因为从日志文件中获取的反馈信息对管理员来说是相当重要的。Apache的日至文件主要包括访问日志和错误日志。访问日志记录了该服务器所有的请求的过程,主要记录的是客户的信息,通过它我们可以知道什么人访问了该网站,什么时候访问的,访问的内容是什么等等。错误日志则是记录了服务器出错的细节和如何处理等。日志文件的位置是由上述主配置文件httpd.conf来规定的。Redhat中有一个查看日志的工具——系统日志。其主界面如下

下面各举一个例子来说明他的格式:

错误日志的写法:

[Mon sep 22 14:32:52 2003] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test

[Mon sep 22 14:32:52 2003] 错误发生的时间。

[error] 表示错误的级别。有debug,info,notice,warn,error,crit,alert,emerg,这些级别由低到高表示了错误的严重性。

[client 127.0.0.1] 表示客户端IP地址。

client denied by server configuration: /export/home/live/ap/htdocs/test 标是错误的具体信息。

访问日志的写法:

127.0.0.1 - wangdong [22/sep/2003:13:55:36 -0800] "GET /apache_pb.gif HTTP/1.0" 200 2326

127.0.0.1 表示访问这台服务器的客户端IP地址。

Wangdong 表示用户的登录名。

[22/sep/2003:13:55:36 -0800] 服务器完成客户端请求的时间,格式为[日/月/年:小时:分钟:秒 时区]

"GET /apache_pb.gif HTTP/1.0" 表示客户端访问该资源所使用的方法。

200 记录的是服务器返回给客户的状态码。200表示成功,以4打头的表示访问出错。

2326 表示发给客户端的总字节数。若是“—”表示没有找到访问资源。

但在实际应用中,对于大型网站,日志文件往往增长的很快,不利于我们查询,降低服务器的效率,而且占用大量的磁盘空间,所以我们必须对日志进行定期的维护。

既然日志文件很大,那么我们如何把一大堆枯燥的数据整理成容易让我们看懂的形式呢?有没有这样的工具呢?非常幸运,在redhat linux 9中自带了一个分析日志的工具——webalizer,如图:

我们也可以在网上找到大量这样优秀的免费的工具,例如:WebTrends Analysis Series。

第五站 配置虚拟主机

虚拟主机是在一台www服务器上为多个单独的域名提供www服务,每个域名具有自己的目录和配置,相当于将一台主机分为多台主机,虚拟主机技术对于主机数量不足,但又想为不同的用户提供独立的Web服务的需求非常有效。而对于一个公司,利用价格昂贵的服务器只提供一种域名服务,似乎是不明智的,而现在越来越多的公司喜欢在一台服务器上使用多个域名服务,架设不同的网站,这样做的好处是显而易见。

Apache有两种方式支持虚拟主机,一种是基于IP的虚拟主机,另一种是基于名字的虚拟主机。基于名字的虚拟主机使用相同的IP地址来配置不同的虚拟主机,这就弥补了因IP地址不足而带来的问题。基于名字的虚拟主机的配置相当简单,你只需配置你得DNS服务器使每个主机名对应正确的IP地址,然后再配置Apache HTTP Server使它能认识不同的主机名就可以了。

假设我们组建了一家多媒体制作公司,有一台Apache服务器和一个IP地址:192.168.0.1 要运行两种业务,一种为电子商务网站,域名为www.business.media.com ,另一种为教学网站,域名为www.teaching.media.com 。先在DNS服务器中把域名www.business.media.com和www.teachin....conf就可以了。

NameVirtualHost 192.168.0.1  


ServerName www.business.media.com

DocumentRoot /var/www/html/business


ServerName www.teaching.media.com

DocumentRoot /var/www/html/teaching


而基于IP的虚拟主机则要求使用不同的IP地址来区别不同的虚拟主机,这就要求使用多块网卡,把不同的IP地址捆绑到不同的网卡上,或者在一块网卡上捆绑多个IP地址。假设我们主机的IP地址为192.168.0.1(www.media.com),另外有两个IP地址别?..nf/httpd.conf。[/url]

ServerAdmin webmaster@ business.media.com

DocumentRoot /var/www/html/business

ServerName www.business.media.com

ErrorLog /var/www/html/business/logs/error_log

TransferLog /var/www/html/business/logs/access_log


ServerAdmin webmaster@teaching.media.com

DocumentRoot /var/www/html/teaching

ServerName www.teaching.media.com

ErrorLog /var/www/html/teaching/logs/error_log

TransferLog /var/www/html/teaching/logs/access_log

第六站配置Apache代理

代理服务器是网络信息服务的中转站。如果我们把Apache代理服务器形象地比喻成代理商的话,消费者向代理商购买东西时,如果代理商有的话,可直接卖给消费者,若没有,则代理商向厂家进货,再卖给消费者。这样做有以下几点好处:(1)提高了访问速度。(2)充当防火墙,增加了安全性。(3)可以过滤一些不良网站。(4)具有缓存功能。(5)节省IP开销。代理服务器可分为两种类型:客户端代理和服务器端代理。下面我们在讲解几个指令后举例说明各自的配置方法。

ProxyRequest On/Off #启用或者禁用Apache代理服务。

CacheRoot "/etc/httpd/proxy" #代理缓存的根目录。

CacheSize 5 #代理缓存的大小。

CacheGcInterval 4 #设定运行管理缓存的无用数据搜集程序的时间间隔

CacheMaxExpire 24 #文件过期时间。

CacheDefaultExpire 1 #指定未包含过期信息文件的有效期。

NoCache a-domain.com another-domain.edu #该网站的文件将不被缓存。
客户端代理的配置

(1) 修改/etc/httpd/conf/httpd.conf中的相关指令

(2) 修改/etc/httpd/conf/httpd.conf,添加对代理目录的访问控制。


Order deny,allow

Deny from all

Allow from .your-domain.com


(3) 重启httpd。
服务器端代理的配置

服务器端代理与客户端代理不同,它是在防火墙上安装Apache服务器,使用它提供对WWW服务器的代理访问。这种方法把WWW服务器与外部隔开,提高了安全性,而对用户来说,好像没有变化一样。假设在内部局域网中WWW服务器的IP地址为192.168.0.2,防火墙主机内部IP地址为192.168.0.5,外部IP地址为192.9.202.1。

(一) 配置防火墙上的Apache

(1) 在/etc/httpd/conf/httpd.conf中添加虚拟主机。


ServerAdmin webmaster@business.media.com

DocumentRoot /www/docs/business.media.com

ServerName www.business.media.com

ErrorLog logs/business.media.com-error_log

CustomLog logs/business.media.com-log_common


(2) 配置局域网中的DNS服务器,把www.business.media.com指向192.9.201.1。

xml数据库

xml via RDB
XML 数据以层次结构组织,元素可嵌套、可递归、可有序访问。
使用xml标准的查询语言(如xpath)
RDB
数据存储在多个表中,行和列都是无序的,不支持递归元素。对XML的访问需要大量的表操作
使用SQL语言查询。

XMLDB 使用XML document 作为 (logical) storage 的基本单元 (就像RDB使用row作为基本单元); 不要求特定的物理存储模型 (可以用关系型/层次性/OO/任何其他私有存储模型)
Native XMLDB 存储 XML文档的策略有4种:
1. 用文本形式存储整个文档
2. 在文件系统中以"修改过的形式"存储整个文档
3. 把文档结构映射到数据库中
4. 把数据结构映射到数据库中
通常Native XMLDB 使用方法2/3, 而XML-enabled DB 一般用方法4

XMLDB 查询方法包括: Xpath; Xquery; 私有语言
XMLDB 修改方法: DOM/SAX 或 XML:db Xupdate
API: JAVA or C++

XMLDB2种用途:
1. 文档为中心: 用以描述书本、电子邮件等;面向人工处理;具有不规则结构,数据颗粒比较大。
2. 数据为中心,用作结构化数据的存储和交换,如时刻表,订货单;面向机器操作
XMLDB存储策略也分为:
1. 文档为中心: Native XML; 内容管理系统
2. 数据为中心, 如面向对象数据库的半结构化数据;

javascript

JavaScript 被设计用来向 HTML 页面添加交互行为。
通常被直接嵌入 HTML 页面, 是一种解释性语言.

HTML 的 <script> 标签用于把 JavaScript 插入 HTML 页面当中。
document.write 字段是标准的 JavaScript 命令,用来向页面写入输出。

<html>
<body>
<script type="text/javascript">
document.write("Hello World!");
</script>
</body>
</html>

可以通过src属性进行外部js文件调用
<script src="xxx.js">....</script>

当页面载入时,会自动执行位于 body 部分的 JavaScript。
当被显式调用时,位于 head 部分的 JavaScript 才会被执行。
将脚本编写为函数,在<head>中定义。

创建函数的语法:
function 函数名(var1,var2,...,varX)
{
代码...
}

Try...Catch 语句

try...catch 可以测试代码中的错误。try 部分包含需要运行的代码,而 catch 部分包含错误发生时运行的代码。
语法:
try
{
//在此运行代码
}
catch(err)
{
//在此处理错误
}
throw 声明的作用是创建 exception(异常)。你可以把这个声明与 try...catch 声明配合使用,以达到控制程序流并产生精确错误消息的目的

只要页面中出现脚本错误,就会产生 onerror 事件。

如果需要利用 onerror 事件,就必须创建一个处理错误的函数。你可以把这个函数叫作 onerror 事件处理器 (onerror event handler)。这个事件处理器使用三个参数来调用:msg(错误消息)、url(发生错误的页面的 url)、line(发生错误的代码行)。
语法:
onerror=handleErrfunction handleErr(msg,url,l)
{
//Handle the error here
return true or false
}

RegExp 对象用于规定在文本中检索的内容。
RegExp 对象有 3 个方法:test()、exec() 以及 compile()。
test() 方法检索字符串中的指定值。返回值是 true 或 false。
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
compile() 既可以改变检索模式,也可以添加或删除第二个参数。

浏览器检测
javaScript 包含一个名为 Navigator 的对象,能够对访问者的浏览器类型及版本进行检测
var browser=navigator.appName
var b_version=navigator.appVersion

JavaScript 拥有若干内置的对象,比如 String、Date、Array 等等。除了这些对象,你还可以创建自己的对象Object()。
//创建一个对象的实例
personObj=new Object()
personObj.firstname="John"
//创建一个对象的模板& 使用模板创建对象实例: this 指向当前对象
function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname
this.lastname=lastname
this.age=age
this.eyecolor=eyecolor
this.newlastname=newlastname
}
需要对对象的函数进行实际编写,e.g.:
function newlastname(new_lastname)
{
this.lastname=new_lastname
}


myFather=new person("John","Doe",50,"blue")
myMother.newlastname("Doe")。

Sunday, February 13, 2011

ajax & json

AJAX技术是由Jesse James Garrett于2005年2月在一篇文章中提出来,是Asynchronous JavaScript XML(异步JavaScript 和XML)的简称,Ajax提供与服务器异步通信的能力,一个最简单的应用是无需刷新整个页面而在网页中更新一部分数据。

设计的初衷是用传统的Web技术也能达到FLASH的效果。后来我在实践中发现,可以把JavaScript 和 XML 这两种传统的Web技术让来实现。

Google应该是AJAX最主要推动者,Google Map、Gmail都在应用AJAX,但是对Google最主要业务搜索来说,AJAX的支持并不好,因为搜索引擎主要是抓取静态的网页,而无法抓取态的AJAX技术。


Ajax包括:
XHTML和CSS
使用DOM(DocumentObjectModel,i.e.文档对象模型)作动态显示和交互
使用XML和XSLT做数据交互和操作
使用XMLHttpRequest进行异步数据接收
使用JavaScript将它们绑定在一起

一个Ajax交互从一个称为XMLHttpRequest的JavaScript对象开始。如同名字所暗示的,它允许一个客户端脚本来执行HTTP请求,并且将会解析一个XML格式的服务器响应。Ajax处理过程中的第一步是创建一个XMLHttpRequest实例。使用HTTP方法(GET或POST)来处理请求,并将目标URL设置到XMLHttpRequest对象上
在JavaWeb服务器上,到达的请求与任何其它HttpServletRequest一样。在解析请求参数后,servlet执行必需的应用逻辑,将响应序列化到XML中,并将它写回HttpServletResponse

JavaScript 代码完成非常基本的任务:
## 从 Web 表单中获取需要的数据。JavaScript 代码很容易从 HTML 表单中抽取数据并发送到服务器。
## 修改表单上的数据:更新表单也很简单,从设置字段值到迅速替换图像。
## 建立要连接的 URL; 打开到服务器的连接。
## 设置服务器在完成后要运行的函数。
## 发送请求。

XMLHttpRequest 几个方法和属性。
open():建立到服务器的新请求。
该方法有五个参数:
request-type:发送请求的类型。典型的值是 GET 或 POST,但也可以发送 HEAD 请求。
url:要连接的 URL。
asynch:如果希望使用异步连接则为 true,否则为 false。该参数是可选的,默认为 true。
username:如果需要身份验证,则可以在此指定用户名。该可选参数没有默认值。
password:如果需要身份验证,则可以在此指定口令。该可选参数没有默认值。

通常使用其中的前三个参数

send():向服务器发送请求。
abort():退出当前请求。
readyState:提供当前 HTML 的就绪状态。 onreadystatechange 属性允许指定一个回调函数。回调允许服务器反向调用 Web 页面中的代码
responseText:服务器返回的请求响应文本。
E.g.:
// --- html code, which calls callServer whenever the input box is changed ---
<form>
<p>City: <input type="text" name="city" id="city" size="25"
onChange="callServer();" /></p>
<p>State: <input type="text" name="state" id="state" size="25"
onChange="callServer();" /></p>
<p>Zip Code: <input type="text" name="zipCode" id="city" size="5" /></p>
</form>

// --- javascript ---
// --- create XMLHttpRequest on a browser (MSIE/opera/etc) ---
/* Create a new XMLHttpRequest object to talk to the Web server */
var xmlHttp = false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
xmlHttp = false;
}
}
@end @*/
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}


function callServer() {
// Get the city and state from the web form
var city = document.getElementById("city").value;
var state = document.getElementById("state").value;
// Only go on if there are values for both fields
if ((city == null) || (city == "")) return;
if ((state == null) || (state == "")) return;
// Build the URL to connect to
var url = "/scripts/getZipCode.php?city=" + escape(city) + "&state=" + escape(state);
// Open a connection to the server
xmlHttp.open("GET", url, true);
// Setup a function for the server to run when it's done
xmlHttp.onreadystatechange = updatePage; //-> call updatePage when response is received (i.e. onreadystatechange)
// Send the request
xmlHttp.send(null);
}

// --- process server's response
function updatePage() {
if (xmlHttp.readyState == 4) {
var response = xmlHttp.responseText;
document.getElementById("zipCode").value = response;
}
}
// escape(): 它用于转义不能用明文正确发送的任何字符。比如,电话号码中的空格将被转换成字符 %20,从而能够在 URL 中传递这些字符

其中, 下面的"true" 表明这是一个异步连接, 这时表单将不等待服务器响应,用户可以继续访问表单.
>> xmlHttp.open("GET", url, true);



JSON:
JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。
JSON 用 hash结构 ({}包围的) 来定义一个数据, 用 [] 包围的多个数据来 定义一个数组.

用[index]来访问数组的某个元素,"."来访问数据的key, 如:
>> people.programmers[0].lastName
要把json数据转换为字符串
>> String newJSONtext = people.toJSONString();
利用 POST 请求发送 JSON 数据
>> var url = "organizePeople.php?timeStamp=" + new Date().getTime();
>> request.open("POST", url, true);
>> request.onreadystatechange = updatePage;
>> request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
>> request.send(people.toJSONString());
如果通过GET方法通过url直接发送JSON数据,需用escape(people.toJSONString()) 以避免url错误

在服务器上解释 JSON
在服务器端处理 JSON 基本上就需要两个步骤。
1. 针对编写服务器端程序所用的语言,找到相应的 JSON 解析器/工具箱/帮助器 API。
2. 使用 JSON 解析器/工具箱/帮助器 API 取得来自客户机的请求数据并将数据转变成脚本能理解的东西。

比如,假设为 PHP 使用的是 JSON-PHP 模板
require_once('JSON.php');
$json = new Services_JSON();
// accept POST data and decode it
$value = $json->decode($GLOBALS['HTTP_RAW_POST_DATA']);
// Now work with value as raw PHP

Saturday, January 15, 2011

植物种植

水培风信子
.概述
风信子是多年生球根类花卉,冬天及早春是它的生长期及花期,夏天则是它的休眠期,故一般将其作一年生花卉栽养.风信子喜温暖,湿润,空气流通,阳光充足的环境.是水培花卉中最易养的观花品种之一.风信子的花色多变,红的象火,紫的醉人,黄的耀眼,粉的妩媚,白的纯洁,兰的深邃,她们代表着积极向上,代表着热爱生活.开花的时候象征着春天的到来,催人振奋.从11月份开始水养,大约80-90天后开花,有香味.
水培风信子的几个基本注意事项:
1.水位离球茎的底盘要有1-2CM的空间,让根系可以透气呼吸.严禁将水加满没过球茎底部!
2.如果用清水养每7天换一次水,如果用水培营养液养则视浑浊程度每15-20天更换一次营养液.无论怎样要保持瓶内水质的清洁.
3.球茎发芽前不要放在直射阳光下照射.发芽后应置于光线明亮,空气流通,有阳光的位置上,以利于它的生长.

盆栽杜鹃
.概述
杜鹃花是著名的观赏花木,由于其花枝优美,花色艳丽,花期又长,在我国民间有“花中西施”的美誉。
.土质
配土对盆栽杜鹃的生长发育至关重要。必须具备以下几个条件:疏松、排水通畅、通气良好。杜鹃花喜酸性土,Ph值在4.5至6为宜,盆栽一般采用黑山泥或黄土加腐殖土,按1:1的比例混合成的营养土栽培。栽植时间春、秋季均可。但以3至4月份上盆或翻盆为最佳。用酸性的山泥,再选用排水良好的浅花盆,土应分层配制,下面土稍粗,上面细土,装好后将花根压紧,使根与土壤紧密接触。一年翻盆一次,翻盆时将老根剪除,栽后即浇水,置于阴凉处。
.浇水和湿度
杜鹃花浇水是一项很重要的工作。因为杜鹃花的根系比较细弱,既怕涝,又不耐旱,过干或过湿对植株生长都不利,因而要特别注意控制水量。如果在展叶期缺水,就会使杜鹃花的叶色变黄,叶卷曲,如干得厉害,还会枯死。要是开花时缺水,则会花瓣软瘪,花朵下垂,花色不鲜艳,甚至会花朵凋萎,死亡。所以必须根据天气晴雨、空气干湿、盆土含水量等情况酌情浇水。浇水的时间宜在早晚,特别是炎热的夏季更不宜在中午浇水。因为根部受冷水刺激后会使花卉受到伤害。浇水原则是不干不浇,浇必浇透。
.施肥
合理施肥是促使枝壮、叶绿、花鲜艳的重要措施。在开花与新梢生长期施以氮肥为主的肥料。春季生长时期为使老叶转绿,施肥2至3次,开花时,施肥1至2次,开花之后为促使枝叶生长,可施肥5至6次,秋季停止生长前再施1至2次。夏季天气炎热,温度高,应少施肥,即使施肥,浓度也要特别低,以免造成高温高湿肥害。总之,施肥应结合浇水,以薄肥多施为原则。
.光照
杜鹃花喜半阴,怕暴晒,在开花期和炎热的夏季,应放置于背阴场地,或搭凉棚。但也不可忽视光照,以防枝瘦、叶小、花少。

盆栽君子兰
.概述
君子兰为多年生常绿草本植物,喜温暖、湿润及半阴环境。土壤要求疏松,富含腐殖质,排水要好上盆种植最好选用高脚泥盆,盆底多垫碎盆片,使排水畅通。
.浇水和湿度
需水量依不同季节而不同,春夏每天浇1次水,秋季隔天浇1次水,冬季休眠期3-5天浇1次水,凡见土表发白时即浇,浇则浇透。切不可形成“截腰水”,形成土壤上湿下干
.施肥
肥水方面,春秋生长期,包括花期,盆土可略湿一些。给生长期的君子兰施入以氮为主的腐熟液肥,每15天一次,施2~3次。花期2~3月份,施入以磷为主的肥料,每10天一次,施1~2次。炎热夏季、寒冷冬季停肥。盆土也应偏干为宜。
.温度
君子兰耐半阴,生长期忌阳光直射,要放在有遮荫环境条件下,冬季开花期要给以充分光照条件。在室内有散射光条件下也能正常生长,但光照过弱,容易造成叶片变薄,叶色变淡,而失去光泽。
.光照
盆栽君子兰,日常养护除冬季需在室内保暖外,最好放置在室外半阴、避雨处。
.问题
如果君子兰的叶片边缘部分出现铁锈斑点,那是因为:1、施入肥料过浓或是生肥。2、盆土不透气,排水不良,或长时间过湿、过干。3、放置地空气不流通,病菌侵蚀。只要采取相应的措施,很快就会好转。

盆栽仙客来
.概述
仙客来的花葶增长主要靠减少光照强度、增加浇水量、勤施肥、昼夜温差小这些措施,反之则会生长较短。
.温度
夏季适宜生长温度15-25℃,冬季适宜生长温度为10-20℃,低于10℃,开花数减少。生长期要有10℃温差更好,可抑制仙客来徒长。
.浇水和湿度
浇水以见干见湿为原则,冬季水温保持在15℃以上,湿度保持在60%-80%之间,适宜的湿度对叶色有促进作用。
.施肥
仙客来属球根花卉,要求钾肥多,在仙客来生长过程中,适宜的肥料N、P、K分别为6.5%、6%、19%。在花芽分化期可半月追叶面肥磷酸二氢钾,浓度为3000倍,一至两次。
.光照
在能保证温度不高于25℃的情况下,仙客来可给予充足的光照,光线中的紫外线可以促进仙客来花色鲜艳度。