<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CQ-CSER</title>
	<atom:link href="http://cq-cser.cn/feed/" rel="self" type="application/rss+xml" />
	<link>http://cq-cser.cn</link>
	<description>web设计开发爱好者</description>
	<lastBuildDate>Wed, 01 Sep 2010 08:56:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>TDS协议</title>
		<link>http://cq-cser.cn/2010/09/tds%e5%8d%8f%e8%ae%ae/</link>
		<comments>http://cq-cser.cn/2010/09/tds%e5%8d%8f%e8%ae%ae/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 08:56:54 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[sec]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1338</guid>
		<description><![CDATA[很强大，今天偶尔看到个TDS7.0，不解，记录先 文章来自：http://freetds.cvs.sourceforge.net/*checkout*/freetds/freetds/doc/tds.html 该网站是免费的专门介绍TDS协议的，网址是：http://www.freetds.org/ This document attempts to cover the TDS protocol for: TDS Version Supported Products 4.2 Sybase SQL Server &#60; 10 and Microsoft SQL Server 6.5 5.0 Sybase SQL Server &#62;= 10 7.0 Microsoft SQL Server 7.0 7.1 Microsoft SQL Server 2000 7.2 Microsoft SQL Server 2005 Contents Common Terms Typical Usage Sequences The [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/04/%e9%9a%8f%e7%ac%94-md5%e6%82%b2%e5%89%a7/' rel='bookmark' title='Permanent Link: 随笔-MD5悲剧-c#'>随笔-MD5悲剧-c#</a></li>
<li><a href='http://cq-cser.cn/2010/04/string%e5%92%8cbyte%e7%9a%84%e7%9b%b8%e4%ba%92c/' rel='bookmark' title='Permanent Link: string和byte[]的相互(C#)'>string和byte[]的相互(C#)</a></li>
<li><a href='http://cq-cser.cn/2010/04/app-config-c%e8%af%bb%e5%86%99%e7%b1%bb/' rel='bookmark' title='Permanent Link: app.config-c#读写类'>app.config-c#读写类</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>很强大，今天偶尔看到个TDS7.0，不解，记录先</p>
<p>文章来自：http://freetds.cvs.sourceforge.net/*checkout*/freetds/freetds/doc/tds.html</p>
<p>该网站是免费的专门介绍TDS协议的，网址是：<a href="http://www.freetds.org/">http://www.freetds.org/</a><span id="more-1338"></span></p>
<p>This document attempts to cover the TDS protocol for:</p>
<table border="1" summary="protocol.versions">
<tbody>
<tr>
<td align="center"><strong>TDS Version</strong></td>
<td><strong>Supported Products</strong></td>
</tr>
<tr>
<td align="center">4.2</td>
<td>Sybase SQL Server &lt; 10 and Microsoft SQL Server 6.5</td>
</tr>
<tr>
<td align="center">5.0</td>
<td>Sybase SQL Server &gt;= 10</td>
</tr>
<tr>
<td align="center">7.0</td>
<td>Microsoft SQL Server 7.0</td>
</tr>
<tr>
<td align="center">7.1</td>
<td>Microsoft SQL Server 2000</td>
</tr>
<tr>
<td align="center">7.2</td>
<td>Microsoft SQL Server 2005</td>
</tr>
</tbody>
</table>
<h2>Contents</h2>
<ul>
<li><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#terms">Common Terms</a></li>
<li><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#examples">Typical Usage Sequences</a></li>
<li><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#packet">The Packet Format</a></li>
<li><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#login">Login Packet</a></li>
<li><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#login7">TDS 7.0 Login Packet</a></li>
<li><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#collate">Collation structure</a></li>
<li><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#requests">Client requests</a></li>
<li><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#responses">Server Responses</a></li>
<li><a href="http://jtds.sourceforge.net/apiCursors.html">OCBC stored procedures (by jtds)</a></li>
</ul>
<h2>Common Terms</h2>
<p> </p>
<pre>TDS protocol versions
  TDS 5.0    tds version 5.0
  TDS 7.0    tds version 7.0
  TDS 7.0+   tds version 7.0, 7.1 and 7.2
  TDS 5.0-   tds version 5.0 and previous

Variable types used in this document:
  CHAR      8-bit char
    CHAR[6]	string of 6 chars
    CHAR[n]     variable length string
  XCHAR    single byte (TDS 5.0-) or ucs2le (TDS 7.0+) characters
  INT8      8-bit int
  INT16    16-bit int
  INT32    32-bit int
  UCS2LE   Unicode in UCS2LE format</pre>
<p>Note: FreeTDS uses TDS_TINYINT for INT8 and TDS_SMALLINT for INT16.</p>
<h2>Typical Usage sequences</h2>
<p>These are TDS 4.2 and not meant to be 100% correct, but I thought they might be helpful to get an overall view of what goes on.</p>
<pre>--&gt; Login
&lt;-- Login acknowledgement

--&gt; INSERT SQL statement
&lt;-- Result Set Done

--&gt; SELECT SQL statement
&lt;-- Column Names
&lt;-- Column Info
&lt;-- Row Result
&lt;-- Row Result
&lt;-- Result Set Done

--&gt; call stored procedure
&lt;-- Column Names
&lt;-- Column Info
&lt;-- Row Result
&lt;-- Row Result
&lt;-- Done Inside Process
&lt;-- Column Names
&lt;-- Column Info
&lt;-- Row Result
&lt;-- Row Result
&lt;-- Done Inside Process
&lt;-- Return Status
&lt;-- Process Done</pre>
<h2>The packet format</h2>
<p>Every informations in TDS protocol (query, RPCs, responses and so on) is splitted in packets.</p>
<p>All packets start with the following 8 byte header.</p>
<pre> INT8       INT8          INT16      4 bytes
+----------+-------------+----------+--------------------+
|  packet  | last packet |  packet  |    unknown         |
|   type   |  indicator  |   size   |                    |
+----------+-------------+----------+--------------------+

Fields:
packet type
     0x01 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#p1">TDS 4.2 or 7.0 query</a>
     0x02 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#login">TDS 4.2 or 5.0 login packet</a>
     0x03 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#p3">RPC</a>
     0x04 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#responses">responses from server</a>
     0x06 cancels
     0x07 Used in <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#p7">Bulk Copy</a>
     0x0F TDS 5.0 query
     0x10 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#login7">TDS 7.0 login packet</a>
     0x11 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#auth7">TDS 7.0 authentication packet</a>
     0x12 TDS 8 prelogin packet
last packet indicator
     0x00 if more packets
     0x01 if last packet
packet size
     (in network byte order)
unknown?
     always 0x00
     this has something to do with server to server communication/rpc stuff</pre>
<p>The remainder of the packet depends on the type of information it is providing. As noted above, packets break down into the types query, login, response, and cancels. Response packets are further split into multiple sub-types denoted by the first byte (a.k.a. the token) following the above header.</p>
<p><em>Note:</em> A TDS packet that is longer than 512 bytes is split on the 512 byte boundary and the &#8220;more packets&#8221; bit is set. The full TDS packet is reassembled from its component 512 byte packets with the 8-byte headers stripped out. 512 is the block_size in the login packet, so it could be set to a different values. In Sybase you can configure a range of valid block sizes. TDS 7.0+ use a default of 4096 as block size.</p>
<hr /> </p>
<h2>TDS 4.2 &amp; 5.0 Login Packet</h2>
<p>Packet type (first byte) is 2. The numbers on the left are decimal offsets <em>including</em> the 8 byte packet header.</p>
<pre>byte   var type    description
------------------------------
   8   CHAR[30]    host_name
  38   INT8        host_name_length
  39   CHAR[30]    user_name
  69   INT8        user_name_length
  70   CHAR[30]    password
 100   INT8        password_length
 101   CHAR[30]    host_process
 131   INT8        host_process_length
 132   ?           magic1[6]          /* mystery stuff */
 138   INT8        bulk_copy
 139   ?           magic2[9]          /* mystery stuff */
 148   CHAR[30]    app_name
 178   INT8        app_name_length
 179   CHAR[30]    server_name
 209   INT8        server_name_length
 210   ?           magic3[1]          /* 0, don't know this one either */
 211   INT8        password2_length
 212   CHAR[30]    password2
 242   CHAR[223]   magic4
 465   INT8        password2_length_plus2
 466   INT16       major_version      /* TDS version */
 468   INT16       minor_version      /* TDS version */
 470   CHAR        library_name[10]   /* "Ct-Library" or "DB-Library" */
 480   INT8        library_length
 481   INT16       major_version2     /* program version */
 483   INT16       minor_version2     /* program version */
 485   ?           magic6[3]          /* ? last two octets are 13 and 17 */
                                      /* bdw reports last two as 12 and 16 here  */
                                      /* possibly a bitset flag  */
 488   CHAR[30]    language           /* e.g. "us-english" */
 518   INT8        language_length
 519   ?           magic7[1]          /*  mystery stuff */
 520   INT16       old_secure         /* explanation? */
 522   INT8        encrypted          /*  1 means encrypted all password fields blank */
 523   ?           magic8[1]          /*  no clue... zeros */
 524   CHAR        sec_spare[9]       /* explanation? */
 533   CHAR[30]    char_set           /* e.g. "iso_1" */
 563   INT8        char_set_length
 564   INT8        magic9[1]          /* 1 */
 565   CHAR[6]     block_size         /*  in text */
 571   INT8        block_size_length
 572   ?           magic10[25]        /* lots of stuff here...no clue */</pre>
<p>Any help with the magic numbers would be most appreciated.</p>
<hr /> </p>
<h2>TDS 7.0+ Login Packet</h2>
<pre>byte  var type  description
---------------------------
  0   INT32	total packet size
  4   INT8[4]	TDS Version
                	0x00000070 7.0
			0x01000071 7.1
                	0x02000972 7.2 (7.2.9?)
  8   INT32	packet size (default 4096)
 12   INT8[4]	client program version
 16   INT32	PID of client
 20   INT32	connection id (usually 0)
 24   INT8	option flags 1
                0x80 enable warning messages if SET LANGUAGE issued
                0x40 change to initial database must succeed
                0x20 enable warning messages if USE &lt;database&gt; issued
                0x10 enable BCP
		0x08 use ND5000 floating point format (untested)
		0x04 use VAX floating point format (untested)
		0x02 use EBCDIC encoding (untested)
		0x01 use big-endian byte order (untested)
 25   INT8	option flags 2
                0x80 enable domain login security
		0x40 "USER_SERVER - reserved"
		0x20 user type is "DQ login"
		0x10 user type is "replication login"
		0x08 "fCacheConnect"
		0x04 "fTranBoundary"
                0x02 client is an ODBC driver
                0x01 change to initial language must succeed
 26   INT8	0x04 spawn user instance (TDS 7.2)
                0x02 XML data type instances are returned as binary XML (TDS 7.2)
                0x01 password change requested (TDS 7.2)
 27   INT8	0x01 SQL Type: 0 = use default, 1 = use T-SQL (TDS 7.2)
 28   INT8[4]	time zone (0x88ffffff ???)
 32   INT8[4]	collation information
 36   INT16	position of client hostname (86)
 38   INT16	hostname length
 40   INT16	position of username
 42   INT16	username length
 44   INT16	position of password
 46   INT16	password length
 48   INT16	position of app name
 50   INT16	app name length
 52   INT16	position of server name
 54   INT16	server name length
 56   INT16	position of remote server/password pairs
 58   INT16	remote server/password pairs length
 60   INT16	position of library name
 62   INT16	library name length
 64   INT16	position of language
 66   INT16	language name (for italian "Italiano", coded UCS2)
 68   INT16	position of database name
 70   INT16	database name length
 72   INT8[6]	MAC address of client
 78   INT16	position of auth portion
 80   INT16	NT authentication length
 82   INT16	next position (same as total packet size)
 84   INT16	0
 86   UCS2LE[n] hostname
      UCS2LE[n]	username
      UCS2LE[n]	encrypted password
      UCS2LE[n]	app name
      UCS2LE[n]	server name
      UCS2LE[n]	library name
      UCS2LE[n]	language name
      UCS2LE[n]	database name
      NT Authentication packet

NT Authentication packet
  0   CHAR[8]	authentication id "NTLMSSP\0"
  8   INT32     1  message type
 12   INT32	0xb201 flags
 16   INT16	domain length
 18   INT16     domain length
 20   INT32     domain offset
 24   INT16     hostname length
 26   INT16     hostname length
 28   INT32     hostname offset
 32   CHAR[n]   hostname
      CHAR[n]   domain
See documentation on Samba for detail (or search ntlm authentication for IIS)

For mssql 2005 before hostname (byte 86) you have
 86   INT16     next position,  or
                position of file name for a database to be
                attached during the connection process
 88   INT16     database filename length
 90   INT16     new password position
 92   INT16     new password length
 94   UCS2LE[n] hostname
      ... (as above)</pre>
<p>&#8220;current pos&#8221; is the starting byte address for a Unicode string within the packet. The length of that Unicode string immediately follows. That implies there are at least 2 more strings that could be defined. (character set??)</p>
<p>Username and password are empty if domain authentication is used.</p>
<p>If the client uses an authentication packet, the server replies with an <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t237">Authentication</a> token followed by an <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#auth7">Authentication packet</a>.</p>
<hr />
<h2>TDS 7.0 Authentication Packet</h2>
<p> </p>
<pre> varies
+------+
| auth |
+------+

auth   authentication data
       for NTLM this message 3</pre>
<p>This packet usually follows <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t237">Authentication</a> token.</p>
<hr />
<h2>Types</h2>
<p> </p>
<table border="0" summary="packets">
<tbody>
<tr>
<th>HEX</th>
<th>DEC</th>
<th>type</th>
<th>protocol</th>
<th>nullable</th>
<th>size</th>
<th>collate</th>
</tr>
<tr>
<td>0x1F</td>
<td>31</td>
<td>SYBVOID</td>
<td>7+</td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;22</td>
<td>34</td>
<td>SYBIMAGE</td>
<td> </td>
<td>yes</td>
<td>4</td>
<td> </td>
</tr>
<tr>
<td>0&#215;23</td>
<td>35</td>
<td>SYBTEXT</td>
<td> </td>
<td>yes</td>
<td>4</td>
<td>yes</td>
</tr>
<tr>
<td>0&#215;24</td>
<td>36</td>
<td>SYBUNIQUE</td>
<td>7+</td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0&#215;25</td>
<td>37</td>
<td>SYBVARBINARY</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0&#215;26</td>
<td>38</td>
<td>SYBINTN</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0&#215;27</td>
<td>39</td>
<td>SYBVARCHAR</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0x2D</td>
<td>45</td>
<td>SYBBINARY</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0x2F</td>
<td>47</td>
<td>SYBCHAR</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0&#215;30</td>
<td>48</td>
<td>SYBINT1</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;32</td>
<td>50</td>
<td>SYBBIT</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;34</td>
<td>52</td>
<td>SYBINT2</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;38</td>
<td>56</td>
<td>SYBINT4</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0x3A</td>
<td>58</td>
<td>SYBDATETIME4</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0x3B</td>
<td>59</td>
<td>SYBREAL</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0x3C</td>
<td>60</td>
<td>SYBMONEY</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0x3D</td>
<td>61</td>
<td>SYBDATETIME</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0x3E</td>
<td>62</td>
<td>SYBFLT8</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;40</td>
<td>64</td>
<td>SYBSINT1</td>
<td>5</td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;41</td>
<td>65</td>
<td>SYBUINT2</td>
<td>5</td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;42</td>
<td>66</td>
<td>SYBUINT4</td>
<td>5</td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;43</td>
<td>67</td>
<td>SYBUINT8</td>
<td>5</td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0&#215;62</td>
<td>98</td>
<td>SYBVARIANT</td>
<td>7+</td>
<td>yes</td>
<td>4</td>
<td> </td>
</tr>
<tr>
<td>0&#215;63</td>
<td>99</td>
<td>SYBNTEXT</td>
<td>7+</td>
<td>yes</td>
<td>4</td>
<td>yes</td>
</tr>
<tr>
<td>0&#215;67</td>
<td>103</td>
<td>SYBNVARCHAR</td>
<td>7+</td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0&#215;68</td>
<td>104</td>
<td>SYBBITN</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0x6A</td>
<td>106</td>
<td>SYBDECIMAL</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0x6C</td>
<td>108</td>
<td>SYBNUMERIC</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0x6D</td>
<td>109</td>
<td>SYBFLTN</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0x6E</td>
<td>110</td>
<td>SYBMONEYN</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0x6F</td>
<td>111</td>
<td>SYBDATETIMN</td>
<td> </td>
<td>yes</td>
<td>1</td>
<td> </td>
</tr>
<tr>
<td>0x7A</td>
<td>122</td>
<td>SYBMONEY4</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0x7F</td>
<td>127</td>
<td>SYBINT8</td>
<td> </td>
<td>no</td>
<td>0</td>
<td> </td>
</tr>
<tr>
<td>0xA5</td>
<td>165</td>
<td>XSYBVARBINARY</td>
<td>7+</td>
<td>yes</td>
<td>2 *</td>
<td> </td>
</tr>
<tr>
<td>0xA7</td>
<td>167</td>
<td>XSYBVARCHAR</td>
<td>7+</td>
<td>yes</td>
<td>2 *</td>
<td>yes</td>
</tr>
<tr>
<td>0xAD</td>
<td>173</td>
<td>XSYBBINARY</td>
<td>7+</td>
<td>yes</td>
<td>2</td>
<td> </td>
</tr>
<tr>
<td>0xAF</td>
<td>175</td>
<td>XSYBCHAR</td>
<td>7+</td>
<td>yes</td>
<td>2</td>
<td>yes</td>
</tr>
<tr>
<td>0xE1</td>
<td>225</td>
<td>SYBLONGBINARY</td>
<td>5</td>
<td>yes</td>
<td>4</td>
<td> </td>
</tr>
<tr>
<td>0xE7</td>
<td>231</td>
<td>XSYBNVARCHAR</td>
<td>7+</td>
<td>yes</td>
<td>2 *</td>
<td>yes</td>
</tr>
<tr>
<td>0xEF</td>
<td>239</td>
<td>XSYBNCHAR</td>
<td>7+</td>
<td>yes</td>
<td>2</td>
<td>yes</td>
</tr>
</tbody>
</table>
<hr />* Under TDS 7.2+ these types allow size to be -1, representing varchar(max), varbinary(max) and nvarchar(max). Data representation for them changes:</p>
<ul>
<li>size is 64 (not 16) bits</li>
<li>size of -1 means NULL</li>
<li>size of -2 means the size is unknown</li>
<li>the data are split in chunks, where each chunk starts with a 32-bit size</li>
<li>a chunk with size &lt;= 0 is the terminal chunk</li>
</ul>
<p> </p>
<h2>Collation type &#8211; TDS 7.1</h2>
<p>The collation structure contains information about the character set encoding and comparison method.</p>
<pre> INT16      INT16    INT8
+----------+--------+------------+
| codepage | flags  | charset_id |
+----------+--------+------------+

codepage    windows codepage (see <a href="http://www.microsoft.com/globaldev/nlsweb/">http://www.microsoft.com/globaldev/nlsweb/</a>)
            also specified in lcid column of master..syslanguages
flags       sort flags
            0x100 binary compare
            0x080 width insensitive
            0x040 Katatype insensitive
            0x020 accent insensitive
            0x010 case insensitive
            If binary flag is specified other flags are not present
            Low nibble of flags is a charset specifier (like chinese dialect)
charset_id  charset id in master..syscharsets table or zero for no SQL collations</pre>
<p>Collations names can be obtained from <code>select name from ::fn_helpcollations()</code> query</p>
<hr />
<h2 id="colInfo"><strong>Column Metadata</strong></h2>
<pre> INT8          XCHAR[n]       INT8    INT32   INT8
+-------------+--------------+-------+-------+---------+
| column name | column name  | flags |  user | column  |
|   length    |              |       |  type |  type   |
+-------------+--------------+-------+-------+---------+

 varies        INT8       INT8       INT16      XCHAR[n]     INT8     varies
+-------------+----------+----------+----------+------------+--------+--------+
| column size |precision |  scale   | t length | table name | locale | locale |
|             |          |          |          |            | length |  info  |
| (optional)  |(optional)|(optional)|(optional)| (optional) | (opt)  | (opt)  |
+-------------+----------+----------+----------+------------+--------+--------+

column name length
column name        column name in result set, not necessarily db column name
flags              bit flags
                   0x1  hidden (TDS 5.0)
                   0x2  key
                   0x10 writable
                   0x20 can be NULL
                   0x40 identity
user type          usertype column from syscolumns
<a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#types">column type</a>        column type
column size        not present for fixed size columns
precision          present only for SYBDECIMAL and SYBNUMERIC
scale              present only for SYBDECIMAL and SYBNUMERIC
t length           present only for SYBTEXT and SYBIMAGE, length of table name
table name         present only for SYBTEXT and SYBIMAGE
locale length      length of locale info (in bytes)
                   only for TDS 5.0 results (not for parameters)
locale info        unknown
                   only for TDS 5.0 results (not for parameters)</pre>
<hr />
<h2 id="requests">Client request</h2>
<p>Normal tokens (contained in packets 0xF)</p>
<pre>TODO</pre>
<p>Special packets</p>
<ul>
<li>0&#215;1 1 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#p1">Language</a></li>
<li>0&#215;3 3 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#p3">RPC</a> TDS 4.6+</li>
<li>0&#215;7 7 <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#p7">BCP</a> TDS 5.0+</li>
</ul>
<hr />
<h2><a name="p1"><strong>Language packet (0&#215;1 1)</strong></a></h2>
<p>This sample packet contain just SQL commands. It&#8217;s supported by all TDS version (although TDS 5.0 have others token with similar use)</p>
<pre>  XCHAR[n]
+---------+
| string  |
+---------+

string   SQL text</pre>
<hr />
<h2 id="p3"><strong>RPC packet (0&#215;3 3)</strong></h2>
<p>Do not confuse an RPC packet with an RPC token. The RPC packet is supported by all version of TDS; the RPC token is supported only by TDS 5.0 (and has different format). This is the oldest (and the only one in mssql) way to call directly an RPC. Sybase also documents it, but as 0xE.</p>
<pre>  INT16         XCHAR[n]   INT16
+-------------+----------+-------+----------+
| name length | rpc name | flags | params   |
+-------------+----------+-------+----------+

name length   length of RPC name in characters.
              mssql2k+ support some core RPC using numbers
              If a number is used instead of name name length is marked as -1
              (null) and a INT16 is used for the name.
                0x1  1  sp_cursor
                0x2  2  sp_cursoropen
                0x3  3  sp_cursorprepare
                0x4  4  sp_cursorexecute
                0x5  5  sp_cursorprepexec
                0x6  6  sp_cursorunprepare
                0x7  7  sp_cursorfetch
                0x8  8  sp_cursoroption
                0x9  9  sp_cursorclose
                0xA  10 sp_executesql
                0xB  11 sp_prepare
                0xC  12 sp_execute ???
                0xD  13 sp_prepexec
                0xE  14 sp_prepexecrpc
                0xF  15 sp_unprepare
              sp_execute seems to have some problems, even MS ODBC use name
              version instead of number.
rpc name      name of RPC.
flags         bit flags.
               0x1 1 recompile procedure (TDS 7.0+/TDS 5.0)
               0x2 2 no metadata (TDS 7.0+)
                     (I don't know meaning of "no metadata" -- freddy77)
params        parameters. See below</pre>
<p>Every parameter has the following structure</p>
<pre>+-----------+------+
| data info | data |
+-----------+------+
data info    data information. See below
data         data. See results for detail</pre>
<h4>Data info structure</h4>
<pre>  INT8          XCHAR[n]     INT8    INT32
+-------------+------------+-------+--------------------+
| name length | param name | flags | usertype (TDS 5.0) |
+-------------+------------+-------+--------------------+
  INT8   varies  varies     INT8[5]         INT8
+------+-------+----------+---------------+------------------+
| type | size  | optional | collate       | locale           |
|      | (opt) | (opt)    | info(TDS 7.1) | length (TDS 5.0) |
+------+-------+----------+---------------+------------------+

name length   parameter name length (0 if unused)
param name    parameter name
flags         bit Name           Meaning
              0x1 TDS_RPC_OUTPUT output parameter
              0x2 TDS_RPC_NODEF  output parameter has no default value.
                                 Valid only with TDS_RPC_OUTPUT.

usertype      usertype
type          param type
size          see <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t129">Results</a>
optional      see <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t129">Results</a>. Blobs DO NOT have
              optional on input parameters (output blob parameters
              are not supported by any version of TDS).
collate info  only for type that want collate info and using TDS 7.1
locale length locale information length. Usually 0 (if not locale
              information follow, the structure is unknown)</pre>
<h2>Chained RPCs</h2>
<p>Under TDS 7.0+ is possible to chain multiple RPCs together. This is useful to limit packets and round-trips with server. RPCs can be chained using byte 0&#215;80 (TDS 7.0/TDS 7.1) or 0xFF (TDS 7.2).</p>
<pre>       INT8                     INT8
+-----+------------------------+----------------+-----+
| RPC | 0x80 (TDS 7.0/TDS 7.1) | 0xFF (TDS 7.2) | RPC | ...
+-----+------------------------+----------------+-----+</pre>
<hr />
<h2 id="p7">Bulk Copy packet (0&#215;7 7)</h2>
<p>This documents a TDS 5.0 packet. It might be true for others&#8230;.</p>
<h3>BCP Packet Structure</h3>
<pre> INT8       INT16          INT32
+----------+-------------+--------------------+
|  packet  | last packet |  packet            |
| type = 7 |  indicator  |   size             |
+----------+-------------+--------------------+

		followed by N row buffers,
		where N is computed by exhausting the packet size</pre>
<h3>BCP Packet Row Buffer</h3>
<pre> INT16          INT8       INT8	      INT16
+--------------+----------+----------+--------------+
| size         |  ncols   |  zero    | size (again) |
+--------------+----------+----------+--------------+

	followed by column buffers (data), where 

		first, the fixed-size datatype columns

		 fixed size and count (determined by column definition)
		+--------------+
		|    data .... | [repeats once for each mandatory column]
		+--------------+

		then, the variable-size (including nullable) datatype columns

		 variable size and count
		+--------------+
		|    data .... | [repeats ncol times]
		+--------------+

		followed by two tables (!) to describe the column buffers

 <strong>Adjustment Table</strong> (optional)

 INT8       INT8
+----------+----------+
| 1 + ncols| offset   | [repeats ncol + 1 times]
+----------+----------+

 <strong>Offset Table</strong> (mandatory)

 INT8       INT8
+----------+----------+
| 1 + ncols| offset   | [repeats ncol + 1 times]
+----------+----------+</pre>
<p>The BCP packet has a slightly different Packet header!?</p>
<h3>Computation of Offset and Adjustment tables</h3>
<p>The offset and adjustment tables describe the postion of the first byte of each variable-size column. The first element holds the count of elements in the offset/adjustment table. Thereafer, the offsets are arranged in reverse order: the last element — which is also the last byte of the row buffer — holds the offset from the start of the row of the first variable-size column. The next-to-last offset table element holds the starting position of the second variable-size column, and so on.</p>
<h4>Offset Table Example</h4>
<ol>
<li>5</li>
<li>31</li>
<li>22</li>
<li>21</li>
<li>8</li>
<li>4</li>
</ol>
<p>The first element is 5 because there are five elements in the list. There are 4 column data buffers with 5 endpoints. The first column&#8217;s data begins at offset 4. Computations:</p>
<dl>
<dt>column 1 </dt>
<dd>offset 4 </dd>
<dd>length: 4 = 8 &#8211; 4 </dd>
<dt>column 2 </dt>
<dd>offset 8 </dd>
<dd>length: 13 = 21 &#8211; 8 </dd>
<dt>column 3 </dt>
<dd>offset 21 </dd>
<dd>length: 1 = 22 &#8211; 21 </dd>
<dt>column 4 </dt>
<dd>offset 22 </dd>
<dd>length: 9 = 31 &#8211; 22 </dd>
</dl>
<p>Any column not accounted for is implicitly NULL. To represent a NULL column between two dataful columns, the offset table will have adjacent entries of the same value.</p>
<h4>Adjustment table</h4>
<p>The so-called adjustment table provides for longer rows. The reader will note the Offset table has 8-bit elements, which would limit the width of the table: the last variable column would have to end less than 256 bytes from the start fo the row. Rather than changing the definition of the Offset table, a second table, the Adjustment table, was introduced. It holds high-order bytes for the column offsets.</p>
<p>In other words, to compute a variable column&#8217;s offset from the start of the row buffer, the server looks up its offset table value, then consults the same position in the adjustment table, and splices them together.</p>
<h3>Offset table commentary</h3>
<p>The BCP packet is very dense. The data formats are governed by the table definition. Non-NULL columns of course must be present; there is no need to count them or compute their size. The NULL columns are undelimited; their boundaries are defined by the minimalist offset table.</p>
<p>The Adjustment table seems silly at first glance. Why not just make the offset table&#8217;s elements 16 or or even 32 bits? The reason is overhead. Most rows will have less than 256 bytes of variable column data. By using the adjustment table, the BCP packet avoids adding one or even three empty bytes per column per row.</p>
<p>Why is the table in reverse order? Because that places the first offset at a known location: the end of each <em>row</em> gives the start of the first column. The server can work its way down the offset table and compute the column sizes. If they don&#8217;t add up — if there are data between the (presumed) end of the last column and the start of the offset table — the server knows it should look for an adjustment table. Because the scheme is infinitely repeatable, rows could one day grow to terabyte widths without redefining the packet structure.</p>
<hr />
<h2>Server Responses</h2>
<p>Responses from the server start with a single octet (token) identifying its type. If variable length, they generally have the length as the second and third bytes</p>
<p>Tokens encountered thus far:</p>
<table border="0" summary="tokens">
<tbody>
<tr>
<th>HEX</th>
<th>DEC</th>
<th>name</th>
<th>note</th>
</tr>
<tr>
<td>0&#215;20</td>
<td>32</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t32">Param Format 2</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0&#215;21</td>
<td>33</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t33">Language</a></td>
<td>5.0 only, client-side</td>
</tr>
<tr>
<td>0&#215;22</td>
<td>34</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t34">OrderBy 2</a></td>
<td>5.0 only??</td>
</tr>
<tr>
<td>0&#215;61</td>
<td>97</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t97">Row Format 2</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0&#215;71</td>
<td>113</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t113">&#8220;Logout&#8221;</a></td>
<td>5.0? ct_close(), client-side?</td>
</tr>
<tr>
<td>0&#215;79</td>
<td>121</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t121">Return Status</a></td>
<td> </td>
</tr>
<tr>
<td>0x7C</td>
<td>124</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t124">Process ID</a></td>
<td>4.2 only</td>
</tr>
<tr>
<td>0&#215;80</td>
<td>128</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t128">Cursor Close</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0&#215;81</td>
<td>129</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t129c">Cursor Delete</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0&#215;81</td>
<td>129</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t129">7.0 Result</a></td>
<td>7.0 only</td>
</tr>
<tr>
<td>0&#215;82</td>
<td>130</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t130">Cursor Fetch</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0&#215;83</td>
<td>131</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t131">Cursor Info</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0&#215;84</td>
<td>132</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t132">Cursor Open</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0&#215;86</td>
<td>134</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t134">Cursor Declare</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0&#215;88</td>
<td>136</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t136">7.0 Compute Result</a></td>
<td>7.0 only</td>
</tr>
<tr>
<td>0xA0</td>
<td>160</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t160">Column Name</a></td>
<td>4.2 only</td>
</tr>
<tr>
<td>0xA1</td>
<td>161</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t161">Column Format</a></td>
<td>4.2 only</td>
</tr>
<tr>
<td>0xA3</td>
<td>163</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t163">Dynamic 2</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0xA4</td>
<td>164</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t164">Table names</a></td>
<td>name of tables in a FOR BROWSE select</td>
</tr>
<tr>
<td>0xA5</td>
<td>165</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t165">Column Info</a></td>
<td>column information in a FOR BROWSE select</td>
</tr>
<tr>
<td>0xA6</td>
<td>166</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t166">Option Cmd</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0xA7</td>
<td>167</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t167">Compute Names</a></td>
<td> </td>
</tr>
<tr>
<td>0xA8</td>
<td>168</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t168">Compute Result</a></td>
<td> </td>
</tr>
<tr>
<td>0xA9</td>
<td>169</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t169">Order By</a></td>
<td> </td>
</tr>
<tr>
<td>0xAA</td>
<td>170</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t170">Error Message</a></td>
<td> </td>
</tr>
<tr>
<td>0xAB</td>
<td>171</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t171">Info Message</a></td>
<td> </td>
</tr>
<tr>
<td>0xAC</td>
<td>172</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t172">Output Parameters</a></td>
<td> </td>
</tr>
<tr>
<td>0xAD</td>
<td>173</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t173">Login Acknowledgement</a></td>
<td> </td>
</tr>
<tr>
<td>0xAE</td>
<td>174</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t174">Control</a></td>
<td> </td>
</tr>
<tr>
<td>0xD1</td>
<td>209</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t209">Data &#8212; Row Result</a></td>
<td> </td>
</tr>
<tr>
<td>0xD3</td>
<td>211</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t211">Data &#8212; Compute Result</a></td>
<td> </td>
</tr>
<tr>
<td>0xD7</td>
<td>215</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t215">Params</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0xE2</td>
<td>226</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t226">Capability</a></td>
<td>5.0 only. Information on server</td>
</tr>
<tr>
<td>0xE3</td>
<td>227</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t227">Environment Change</a></td>
<td>(database change, packet size, etc&#8230;)</td>
</tr>
<tr>
<td>0xE5</td>
<td>229</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t229">Extended Error Message</a></td>
<td> </td>
</tr>
<tr>
<td>0xE6</td>
<td>230</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t230">DBRPC</a></td>
<td>5.0 only RPC calls</td>
</tr>
<tr>
<td>0xE7</td>
<td>231</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t231">Dynamic</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0xEC</td>
<td>236</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t236">Param Format</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0xED</td>
<td>237</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t237">Authentication</a></td>
<td>7.0 only</td>
</tr>
<tr>
<td>0xEE</td>
<td>238</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t238">Result Set</a></td>
<td>5.0 only</td>
</tr>
<tr>
<td>0xFD</td>
<td>253</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t253">Result Set Done</a></td>
<td> </td>
</tr>
<tr>
<td>0xFE</td>
<td>254</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t254">Process Done</a></td>
<td> </td>
</tr>
<tr>
<td>0xFF</td>
<td>255</td>
<td><a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t255">Done inside Process</a></td>
<td> </td>
</tr>
</tbody>
</table>
<h2>Param Format 2 &#8211; TDS 5.0 (0&#215;20 32)</h2>
<p>TODO. <a name="t32"> </a></p>
<hr />
<h2 id="t33">Language &#8211; TDS 5.0 (0&#215;21 33)</h2>
<pre> INT32    INT8     CHAR[n]
+--------+--------+-------+
| length | status | query |
+--------+--------+-------+

length  total token length
status  0 no args
        1 has args (followed by PARAMFMT/PARAMS)
query   query (total length - 1)</pre>
<h2>Order By 2 (0&#215;22 34)</h2>
<p>TODO. <a name="t34"> </a></p>
<hr />
<h2 id="t97">Row Format 2 &#8211; TDS 5.0 (0&#215;61 97)</h2>
<p>TODO. <a name="t113"> </a></p>
<hr />
<h2>&#8220;Logout&#8221; (0&#215;71 113)</h2>
<p>No information. (1 byte, value=0 ?) <a name="t121"> </a></p>
<hr />
<h2>Return Status (0&#215;79 121)</h2>
<pre> INT32
+---------------+
| Return status |
+---------------+</pre>
<p>The return value of a stored procedure. <a name="t124"> </a></p>
<h2>Process ID (0x7C 124)</h2>
<hr />
<pre> 8 bytes
+----------------+
| process number |
+----------------+</pre>
<p>Presumably the process ID number for an executing stored procedure. (I&#8217;m not sure how this would ever be used by a client. *mjs*) <a name="t128"> </a></p>
<hr />
<h2>Cursor Close &#8211; TDS 5.0 (0&#215;80 128)</h2>
<p>TODO. <a name="t129c"> </a></p>
<hr />
<h2>Cursor Delete &#8211; TDS 5.0 (0&#215;81 129)</h2>
<p>TODO. <a name="t129"> </a></p>
<hr />
<h2>Result &#8211; TDS 7.0+ (0&#215;81 129)</h2>
<pre> INT16
+----------+-------------+
| #columns | column_info |
+----------+-------------+</pre>
<p>The TDS 7.0 column_info is formatted as follows for each column:</p>
<pre> INT16      INT16   INT8   varies  varies     INT8[5]         INT8          UCS2LE[n]
+----------+-------+------+-------+----------+---------------+-------------+---------+
| usertype | flags | type | size  | optional | collate       | name length | name    |
|          |       |      | (opt) | (opt)    | info(TDS 7.1) |             |         |
+----------+-------+------+-------+----------+---------------+-------------+---------+

usertype	type modifier
flags		bit flags
		0x1  can be NULL
		0x8  can be written (it's not an expression)
		0x10 identity
<a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#types">type</a>		data type, values &gt;128 indicate a large type
size		none for fixed size types
		4 bytes for blob and text
		2 bytes for large types
		1 byte for all others
optional
                               INT8        INT8
                              +-----------+-------+
  numeric/decimal types:      | precision | scale |
                              +-----------+-------+

                               INT16               UCS2LE[n]
                              +-------------------+------------+
  blob/text types:            | table name length | table name |
                              +-------------------+------------+

  collate info are available only using TDS 7.1 and for characters types (but not
  for old type like short VARCHAR, only 2byte length versions)</pre>
<h2 id="t130">Cursor Fetch &#8211; TDS 5.0 (0&#215;82 130)</h2>
<p>TODO.</p>
<h2 id="t131">Cursor Info &#8211; TDS 5.0 (0&#215;83 131)</h2>
<p>TODO.</p>
<h2 id="t132">Cursor Open &#8211; TDS 5.0 (0&#215;84 132)</h2>
<p>TODO.</p>
<h2 id="t134">Cursor Declare &#8211; TDS 5.0 (0&#215;86 134)</h2>
<p>TODO.</p>
<h2 id="t136">Compute Result &#8211; TDS 7.0+ (0&#215;88 136)</h2>
<p>TODO.</p>
<h2 id="t160">Column Name (0xA0 160)</h2>
<pre> INT16          INT8      CHAR[n]               INT8      CHAR[n]
+--------------+---------+--------------+------+---------+--------------+
| total length | length1 | column1 name | .... | lengthN | columnN name |
+--------------+---------+--------------+------+---------+--------------+</pre>
<p>This token is the first token that contain result informations. Is usually followed by <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t161">Column Format</a> token (0xA1 161)</p>
<hr />
<h2 id="t161">Column Format (0xA1 161)</h2>
<pre> INT16
+--------------+-------------+
| total length | column_info |
+--------------+-------------+</pre>
<p>The number of columns is the same of previous <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#t160">Column Name</a> token.</p>
<p>The TDS 4.2 column_info is formatted as follows for each column:</p>
<pre> INT8[4]     INT8   varies  varies
+-----------+------+-------+----------+
| usertype/ | type | size  | optional |
|   flags   |      | (opt) | (opt)    |
+-----------+------+-------+----------+

usertype/flags for Sybase

   INT32
  +----------+
  | usertype |
  +----------+

usertype/flags for MSSQL

   INT16
  +----------+-------+
  | usertype | flags |
  +----------+-------+

usertype	type modifier
flags		bit flags (only MSSQL)
		0x1  can be NULL
		0x8  can be written (it's not an expression)
		0x10 identity
<a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#types">type</a>		data type
size		none for fixed size types
		4 bytes for blob and text
		1 byte for all others
                (TDS 4.2 do not support large types)
optional
                               INT8        INT8
                              +-----------+-------+
  numeric/decimal types:      | precision | scale |
  (supported??)               +-----------+-------+

                               INT16               CHAR[n]
                              +-------------------+------------+
  blob/text types:            | table name length | table name |
                              +-------------------+------------+</pre>
<h2 id="t163">Dynamic 2 &#8211; TDS 5.0 (0xA3 163)</h2>
<p>TODO.</p>
<h2 id="t166">Option Cmd &#8211; TDS 5.0 (0xA6 166)</h2>
<p>TODO.</p>
<h2 id="t168">Compute Result (0xA8 168)</h2>
<pre> INT16          INT16        INT8       varies        INT8      INT8[n]
+--------------+------------+----------+-------------+---------+-------+
| total length | compute id | #columns | column info | #bycols | bycol |
+--------------+------------+----------+-------------+---------+-------+</pre>
<p>column info:</p>
<pre> INT8       INT8      INT32      INT8     varies  INT8               varies
+----------+---------+----------+--------+-------+------------------+----------------+
| operator | operand | usertype | column | size  | locale length    | locale info    |
|          |         |          |  type  | (opt) |  info (TDS 5.0)  | (TDS 5.0)      |
+----------+---------+----------+--------+-------+------------------+----------------+

operator      operator
              0x4b COUNT
              0x4c UNSIGNED? COUNT
              0x4d SUM
              0x4e UNSIGNED? SUM
              0x4f AVG
              0x50 UNSIGNED? AVG
              0x51 MIN
              0x52 MAX
              0x09 COUNT_BIG (mssql2k)
              0x30 STDEV (mssql2k)
              0x31 STDEVP (mssql2k)
              0x32 VAR (mssql2k)
              0x33 VARP (mssql2k)
              0x72 CHECKSUM_AGG (mssql2k)
operand       ???
usertype      usertype
<a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#types">column type</a>   data type
size          data size
locale length length of locale informations
locale info   locale informations (unknown)</pre>
<p>Each bycol information contains column info for a specific column.</p>
<p>TODO: optional possible?? collate infos ??</p>
<h2 id="t164">TabName (0xA4 164)</h2>
<p>TDS4/5/7:</p>
<pre> INT16          INT16         XCHAR[n]
+--------------+-------------+------------+
| total length | name length | table name | ...
+--------------+-------------+------------+

name length   table name length
table name    table name</pre>
<p>TDS 7.1:</p>
<pre> INT16          varies
+--------------+-------------+
| total length | table names |
+--------------+-------------+

table name:
 INT8              INT16              XCHAR[n]
+-----------------+------------------+----------------+
| # of components | component length | component name |
+-----------------+------------------+----------------+

ie:
  name        -&gt; 01  04 00  ucs2le "name"
  db..name    -&gt; 03  02 00  ucs2le "db"  00 00  04 00  ucs2le "name"
  db.dbo.name -&gt; 03  02 00  ucs2le "db"  03 00  ucs2le "dbo"  04 00  ucs2le "name"</pre>
<h2 id="t165">Column Info (0xA5 165)</h2>
<pre> INT16          varies
+--------------+--------------+
| total length | column infos |
+--------------+--------------+</pre>
<p>column info:</p>
<pre> INT8    INT8          INT8    INT8          XCHAR[n]
+-------+-------------+-------+-------------+-------------+
| index | table index | flags | name length | column name |
|       |             |       |  (opt)      |  (opt)      |
+-------+-------------+-------+-------------+-------------+

index        index in result format (1-based)
table index  index in previous TabName (1-based)
             0 means no table (ie computed)
flags        set of flags
             0x04 expression
             0x08 key
             0x10 hidden
             0x20 column name present
name length  length of following column
column name  real column name (result contain the label)</pre>
<p>This token follow TabName token <a name="t167"> </a> <a name="t174"> </a></p>
<hr />
<h2>compute &#8220;control&#8221; ? (0xA7 167)</h2>
<h2>&#8220;control&#8221; (0xAE 174)</h2>
<p>Miscellaneous note (from *bdw* ?) found with 0xAE:</p>
<pre>  has one byte for each column,
  comes between result(238) and first row(209),
  I believe computed column info is stored here, need to investigate</pre>
<h2 id="t169">Order By (0xA9 169)</h2>
<pre> INT16    variable (1 byte per col)
+--------+---------+
| length | orders  |
+--------+---------+

length		Length of packet(and number of cols)
orders          one byte per order by indicating the
                column # in the output matching the
                order from Column Info and Column Names
                and data in following Row Data items.
                A 0 indicates the column is not in the
                resulting rows.

an example:
select first_name, last_name, number from employee
order by salary, number
assuming the columns are returned in the order
queried:
first_name then last_name, then number. we would have:
----------------
|  2   | 0 | 3 |
----------------
where length = 2 then the orders evaluate:
0 for salary, meaning there is no salary data returned
3 for number, meaning the 3rd data item corresponding
to a column is the number</pre>
<p><a name="t170"> </a></p>
<hr />
<h2>Error Message (0xAA 170)</h2>
<h2>Non-error Message (0xAB 171)</h2>
<h2>Extended Error Message (0xE5 229)</h2>
<pre> INT16    INT32        INT8    INT8
+--------+------------+-------+-------+
| length | msg number | state | level |
+--------+------------+-------+-------+

 INT16      XCHAR[n]  INT8       XCHAR[n]  INT8       XCHAR[n]  INT16             INT32
+----------+---------+----------+---------+----------+---------+-----------------+-----------------+
| m length | message | s length | server  | p length | process | line#(TDS 7.1-) | line# (TDS 7.2) |
+----------+---------+----------+---------+----------+---------+-----------------+-----------------+

length		Length of packet
msg number	SQL message number
state		?
level		An error if level &gt; 10, a message if level &lt;= 10
m length	Length of message
message		Text of error/message
s length	Length of server name
server		Name of "server" ?
p length	Length of process name
process name	Stored procedure name, if any
line#		Line number of input which generated the message</pre>
<hr />
<h2>Output Parameters (0xAC 172)</h2>
<p><a name="t172"> </a> Output parameters of a stored procedure.</p>
<pre> INT16    INT8       XCHAR[n]  INT8    INT32      INT8
+--------+----------+---------+-------+----------+----------+------+
| length | c length | colname | flags | usertype | datatype | .... |
+--------+----------+---------+-------+----------+----------+------+

length		Length of packet
c length	Length of colname
colname		Name of column
flags		0x1 Nullable
usertype	cf. systypes table in database
<a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#types">datatype</a>	Type of data returned

The trailing information depends on whether the datatype is
a fixed size datatype.
				 N bytes
				+---------+
  Datatype of fixed size N	| data    |
				+---------+

				 INT8          INT8            N bytes
				+-------------+---------------+--------+
  Otherwise			| column size | actual size N | data   |
				+-------------+---------------+--------+</pre>
<h2 id="t173">Login Acknowledgement (0xAD 173)</h2>
<pre> INT16    INT8    4 bytes   INT8       XCHAR[n] 4 bytes
+--------+-------+---------+----------+--------+----------+
| length |  ack  | version | t length |  text  | ser_ver  |
+--------+-------+---------+----------+--------+----------+

length		length of packet
ack		0x01 success	4.2
		0x05 success	5.0
		0x06 failure	5.0
version		TDS version 4 bytes:  major.minor.?.?
t length	length of text
text		server name (ie 'Microsoft SQL Server')
ser_ver		Server version
		(with strange encoding, differring from TDS version)</pre>
<p><a name="t209"> </a> <a name="t211"> </a></p>
<hr />
<h2>Data &#8211; Row Result (0xD1 209)</h2>
<h2>Data &#8211; Compute Result (0xD3 211)</h2>
<pre> INT8       variable size
+----------+--------------------+
|  token   |   row data         |
+----------+--------------------+</pre>
<p>Row data starts with one byte (decimal 209), for variable length types, a one byte length field precedes the data, for fixed length records just the data appears.<br />
<em>Note:</em> nullable integers and floats are variable length.</p>
<p>For example: sp_who</p>
<p>The first field is spid, a smallint<br />
The second field is status a char(12), in our example &#8220;recv sleep &#8221;</p>
<p>The row would look like this:</p>
<pre>  byte  0 is the token
  bytes 1-2 are a smallint in low-endian
  byte  3 is the length of the char field
  bytes 4-15 is the char field

byte  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
hex  D1  01  00  0C  72  65  63  76  20  73  6C  65  65  70  20  20
    209   1   0  12   r   e   c   v ' '   s   l   e   e   p ' ' ' '</pre>
<h2 id="t215">Params &#8211; TDS 5.0 (0xD7 215)</h2>
<p>TODO.</p>
<h2 id="t226">Capability &#8211; TDS 5.0 (0xE2 226)</h2>
<pre> INT16    variable
+--------+--------------+
| length | capabilities |
+--------+--------------+

length		Length of capability string
capabilities	Server capabilities?  Related to login magic?</pre>
<h2 id="t227">Environment change (0xE3 227)</h2>
<pre> INT16    INT8       INT8        CHAR[n]   INT8        CHAR[n]
+--------+----------+-----------+---------+-----------+---------+
| length | env code | t1 length |  text1  | t2 length |  text2  |
+--------+----------+-----------+---------+-----------+---------+

env code	Code for what part of environment changed
	0x01  database context
	0x02  language
	0x03  character set
	0x04  packet size
	0x05  TDS 7.0+ LCID
	0x06  TDS 7.0+ ??? (sort method? sql server encoding?)
	0x07  Collation info
text1		Old value
text2		New value

text1 and text2 are text information (coded in ucs2 in TDS 7.0+) except
collation info that's a structure (see collation structure)</pre>
<h2 id="t230">DBRPC &#8211; TDS 5.0 (0xE6 230)</h2>
<p>TODO.</p>
<h2 id="t231">Dynamic &#8211; TDS 5.0 (0xE7 231)</h2>
<p>TODO.</p>
<h2 id="t236">Param Format &#8211; TDS 5.0 (0xEC 236)</h2>
<pre> INT16     INT16        variable size
+---------+------------+-------------------+
| length  | number of  | parameter info    |
|         | parameters |                   |
+---------+------------+-------------------+

length            	length of message following this field
number of parameters	number of parameter formats following
list of formats		I (*bdw*) imagine it uses the column format structure.</pre>
<h2 id="t237">Authentication &#8211; TDS 7.0 (0xED 237)</h2>
<pre> INT16     varies
+---------+------+
| length  | auth |
+---------+------+

length   length of authentication data following this field
auth     authentication data
         for NTLM this is message 2</pre>
<p>Client reply with <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#auth7">Authentication packet</a>.</p>
<h2 id="t238">Result Set &#8211; TDS 5.0 (0xEE 238)</h2>
<pre> INT16     INT16        variable size
+---------+------------+-----------------+
| length  | number of  | column info     |
|         | columns    |                 |
+---------+------------+-----------------+

Fields:
length             length of message following this field
number of columns  number of columns in the result set, this many column
                   information fields will follow.
column info        <a href="http://www.cnblogs.com/yylqinghao/archive/2010/03/16/1687551.html#colInfo">column info</a></pre>
<hr />
<h2>Done Packets</h2>
<p><strong>Result Set Done (0xFD 253)</strong><br />
<strong>Process Done (0xFE 254)</strong><br />
<strong>Done Inside Process (0xFF 255)</strong></p>
<pre> INT16       INT16     INT32                  INT64
+-----------+---------+----------------------+---------------------+
| bit flags | unknown | row count (TDS 7.1-) | row count (TDS 7.2) |
+-----------+---------+----------------------+---------------------+

Fields:
bit flags          0x01 more results
		   0x02 error (like invalid sql syntax)
		   0x10 row count is valid
		   0x20 cancelled
unknown            2,0  /* something to do with block size perhaps */
row count          number of rows affected / returned in the result set.
                   row count is 64-bit using TDS 7.2.
		(FIXME check if "affected / returned" is correct)</pre>
<p>&#8220;Result Set Complete&#8221; is the end of a query that doesn&#8217;t create a process on the server. I.e., it doesn&#8217;t call a stored procedure.<br />
&#8220;Process Done&#8221; is the end of a stored procedure<br />
&#8220;Done In Process&#8221; means that a query internal to a stored procedure has finished, but the stored procedure isn&#8217;t done overall.</p>
<hr />
<h2>Acknowledgements</h2>
<p>The following people have contributed to this document:</p>
<ul>
<li>Brian Bruns (first draft, protocol discovery)</li>
<li>Brian Wheeler (protocol discovery)</li>
<li>Mark Schaal (second draft)</li>
<li>Frediano Ziglio</li>
</ul>
<p>(short list)</p>
<h2>Document Status</h2>
<p>$Id: tds.html,v 1.41 2008/11/25 23:38:33 jklowden Exp $</p>
<p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Strict" width="88" height="31" /></a></p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/04/%e9%9a%8f%e7%ac%94-md5%e6%82%b2%e5%89%a7/' rel='bookmark' title='Permanent Link: 随笔-MD5悲剧-c#'>随笔-MD5悲剧-c#</a></li>
<li><a href='http://cq-cser.cn/2010/04/string%e5%92%8cbyte%e7%9a%84%e7%9b%b8%e4%ba%92c/' rel='bookmark' title='Permanent Link: string和byte[]的相互(C#)'>string和byte[]的相互(C#)</a></li>
<li><a href='http://cq-cser.cn/2010/04/app-config-c%e8%af%bb%e5%86%99%e7%b1%bb/' rel='bookmark' title='Permanent Link: app.config-c#读写类'>app.config-c#读写类</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/09/tds%e5%8d%8f%e8%ae%ae/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tcp_wrapper</title>
		<link>http://cq-cser.cn/2010/08/tcp_wrapper/</link>
		<comments>http://cq-cser.cn/2010/08/tcp_wrapper/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 17:35:54 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[sec]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1334</guid>
		<description><![CDATA[Tcp_wrapper的安装和使用 端口的限制可以通过限制服务来实现 请使用Tcp_wrapper，RedHat8.0默认是安装的了 －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ Tcp_wrapper的安装和使用 　Internet的开放互连性使得每一台连在网上的服务器都逃脱不了被攻击的可能性，事实上我国从接入互联网以来这类事从未中断过。对目前我国的绝大部分网络管理员而言，熟练的使用Unix操作系统尚是一个亟待解决的问题， 网络安全，很难顾及。然而 今天我们来介绍一个软件Tcp_wrapper，说起这个软件,可算得上是大名鼎鼎了,互联网上, 无论采用何种unix操作系统,安装了这个软件的主机恐怕都是不计其数的,事实上它已经成为一种安全的标准配置.本文就以solaris作为操作环境对这个软件做一说明，在其它的Unix操作系统平台上是相通的，读者根据自己的操作系统的种类稍加变化即可。 Tcp_wrapper是Wietse Venema开发的一个可用于各种Unix平台的免费软件，说起Tcp_wrapper的诞生，到有个小小的故事，大约在1990年，作者所在大学的服务器屡屡受到一个外来黑客侵入， 因为受害主机的硬盘数据屡次被rm –rf / 命令整个抹掉，所以找寻线索极为困难，直到有一天晚上Venema在工作的过程中无意中发现这个黑客在不断的finger 受害主机，偷窥受害者的工作，在那个时候一个想法诞生了：设计一个软件，使它可以截获发起finger请求的IP，用户名等资料，Venema 很快投入了工作,而Tcp_wrapper也由此出现!在这以后，Tcp_wrapper随着应用逐渐成为一种标准的Unix安全工具，成为unix守护程序inetd的一个插件.通过Tcp_wrapper,管理员可以设置对inetd提供的各种服务进行监控和过滤. 我们知道,unix中各种服务的实现是基于inetd这个守护进程的,每当有网络服务请求时,无论是ftp,telnet,rlogin等等,这种请求都被送到处于侦听状态的inetd守护进程,inetd再根据请求启动相应服务.inetd的设置是根据/etc目录下inetd.conf决定的.inetd.conf中标识了每种服务由什么进程来控制,我们抽取一行如下: telnet stream tcp nowait root /usr/sbin/in.telnted in.telned 从上面这一行我们可以看到,telnet这个服务,是由/usr/sbin目录下的in.telnetd来控制的,每当有telnet的连接请求时,inetd就指导in.telnetd来启动telnet服务.这是unix默认的连接方式,在这个过程中,没有管理员可以控制的部分,也没有连接纪录. 而在安装了Tcp_wrapper的主机上,管理员可以对上述服务加以控制,当Tcp_wrapper编译安装成功后,会生成一个tcpd程序,它可以在inetd.conf这个控制文件中取代in.telnetd的位置,这样,每当有telnet的连接请求时,tcpd即会截获,先读取管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的in.telnetd程序,由in.telnetd完成以后的工作.如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务.除in.telnetd以外,tcpd还可以替代其它各种tcp服务. Tcp_wrapper访问控制的实现是依靠两个文件:hosts.allow,hosts.deny来实现的.这两个文件的语法是比较简单的,基本语法就是:服务类型 :本服务有效ip范围 : 许可或拒绝.如hosts.allow中为: In.telnetd : secu.unix.org : allow In.ftpd : 10.68.32. : allow in.rshd : all　:　 /usr/local/sbin/safe_finger -l @%h &#124; usr/ucb/mail　yiming@371.net 而hosts.deny为:all : all.这两个文件的意思是对telnet来讲,只允许来自secu.unix.org的连接,对ftp而言,允许10.68.32这个c类地址的连接.in.rshd这一部分语法稍微复杂一些,它的意思是外界任何一个ip每次试图使用rsh连接本系统的时候系统会finger发起连接请求的远程用户，并立即将结果发mail到一个管理员的远程信箱yiming@371.net，我们知道,管理员之所以这么做,是因为一般试图进行rsh的连接, 都是有很大的潜在危险性的,这说明也许系统已经被人入侵,并安插了.rhosts文件了,这很危险! 所以对管理员来说,这种连接需要引起极大的注意. hosts.deny文件中的all [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2009/11/vps-%e5%bf%ab%e9%80%9f%e5%ae%89%e8%a3%85-linuxnginxmysqlphp-%e7%8e%af%e5%a2%83%e3%80%90%e8%bd%ac%e3%80%91/' rel='bookmark' title='Permanent Link: VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】'>VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h2>Tcp_wrapper的安装和使用</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_58449">端口的限制可以通过限制服务来实现<br />
请使用Tcp_wrapper，RedHat8.0默认是安装的了<span id="more-1334"></span></p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />
Tcp_wrapper的安装和使用<br />
　Internet的开放互连性使得每一台连在网上的服务器都逃脱不了被攻击的可能性，事实上我国从接入互联网以来这类事从未中断过。对目前我国的绝大部分网络管理员而言，熟练的使用Unix操作系统尚是一个亟待解决的问题， 网络安全，很难顾及。然而</p>
<p>今天我们来介绍一个软件Tcp_wrapper，说起这个软件,可算得上是大名鼎鼎了,互联网上, 无论采用何种unix操作系统,安装了这个软件的主机恐怕都是不计其数的,事实上它已经成为一种安全的标准配置.本文就以solaris作为操作环境对这个软件做一说明，在其它的Unix操作系统平台上是相通的，读者根据自己的操作系统的种类稍加变化即可。 Tcp_wrapper是Wietse Venema开发的一个可用于各种Unix平台的免费软件，说起Tcp_wrapper的诞生，到有个小小的故事，大约在1990年，作者所在大学的服务器屡屡受到一个外来黑客侵入， 因为受害主机的硬盘数据屡次被rm –rf / 命令整个抹掉，所以找寻线索极为困难，直到有一天晚上Venema在工作的过程中无意中发现这个黑客在不断的finger 受害主机，偷窥受害者的工作，在那个时候一个想法诞生了：设计一个软件，使它可以截获发起finger请求的IP，用户名等资料，Venema 很快投入了工作,而Tcp_wrapper也由此出现!在这以后，Tcp_wrapper随着应用逐渐成为一种标准的Unix安全工具，成为unix守护程序inetd的一个插件.通过Tcp_wrapper,管理员可以设置对inetd提供的各种服务进行监控和过滤.</p>
<p>我们知道,unix中各种服务的实现是基于inetd这个守护进程的,每当有网络服务请求时,无论是ftp,telnet,rlogin等等,这种请求都被送到处于侦听状态的inetd守护进程,inetd再根据请求启动相应服务.inetd的设置是根据/etc目录下inetd.conf决定的.inetd.conf中标识了每种服务由什么进程来控制,我们抽取一行如下:</p>
<p>telnet stream tcp nowait root /usr/sbin/in.telnted in.telned</p>
<p>从上面这一行我们可以看到,telnet这个服务,是由/usr/sbin目录下的in.telnetd来控制的,每当有telnet的连接请求时,inetd就指导in.telnetd来启动telnet服务.这是unix默认的连接方式,在这个过程中,没有管理员可以控制的部分,也没有连接纪录.</p>
<p>而在安装了Tcp_wrapper的主机上,管理员可以对上述服务加以控制,当Tcp_wrapper编译安装成功后,会生成一个tcpd程序,它可以在inetd.conf这个控制文件中取代in.telnetd的位置,这样,每当有telnet的连接请求时,tcpd即会截获,先读取管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的in.telnetd程序,由in.telnetd完成以后的工作.如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务.除in.telnetd以外,tcpd还可以替代其它各种tcp服务.</p>
<p>Tcp_wrapper访问控制的实现是依靠两个文件:hosts.allow,hosts.deny来实现的.这两个文件的语法是比较简单的,基本语法就是:服务类型 :本服务有效ip范围 : 许可或拒绝.如hosts.allow中为:</p>
<p>In.telnetd : secu.unix.org : allow</p>
<p>In.ftpd : 10.68.32. : allow</p>
<p>in.rshd : all　:　 /usr/local/sbin/safe_finger -l @%h | usr/ucb/mail　yiming@371.net</p>
<p>而hosts.deny为:all : all.这两个文件的意思是对telnet来讲,只允许来自secu.unix.org的连接,对ftp而言,允许10.68.32这个c类地址的连接.in.rshd这一部分语法稍微复杂一些,它的意思是外界任何一个ip每次试图使用rsh连接本系统的时候系统会finger发起连接请求的远程用户，并立即将结果发mail到一个管理员的远程信箱yiming@371.net，我们知道,管理员之所以这么做,是因为一般试图进行rsh的连接, 都是有很大的潜在危险性的,这说明也许系统已经被人入侵,并安插了.rhosts文件了,这很危险! 所以对管理员来说,这种连接需要引起极大的注意. hosts.deny文件中的all : all表示除了这些以外,拒绝来自任何地方的任何服务.以上只是对访问控制文件的一个简单说明,管理员可以参看Tcp_wrapper的相应说明定制更为复杂的控制策略.同时需要说明的是,如果需要象上例中设置对rsh的这种finger,mail功能,是需要在Makefile中打开language extension的.</p>
<p>下面来讲讲Tcp_wrapper的安装</p>
<p>首先，我们从可信站点下载tcp_wrappers，如ftp://ftp.porcupine。org/pub/security/tcp_wrappers_7.6.tar.gz（目前最新的版本是7.6）</p>
<p>我们假设你的主机已有了各种所需的编译工具，cc（或gcc），make（或gmake），gzip等，如果使用solaris的读者主机上没有这些工具，可到sunfreeware.com下载它们，使用其它Unix系统亦可到相关站点下载。我们在得到Tcp_wrapper包后，用gzip和tar将压缩包解开，会生成Tcp_wrapper目录，进入目录，我们需要编辑Makefile文件，使它合乎我们的工作要求。编辑的基本工作可以分为3步。</p>
<p>1：在Makefile的头一部分我们可以看到REAL_DAEMON_DIR的描述，它表明了Unix系统中真正的守护程序所在位置，即上面提到的第六个分隔段的守护进程所在目录，solaris中这些守护程序的目录是/usr/sbin，所以我们将SysV.4 Solaris 2.x OSF AIX前的#注释号去掉，即下面的形式:</p>
<p># Ultrix 4.x SunOS 4.x ConvexOS 10.x Dynix/ptx</p>
<p>#REAL_DAEMON_DIR=/usr/etc</p>
<p>#</p>
<p># SysV.4 Solaris 2.x OSF AIX</p>
<p>REAL_DAEMON_DIR=/usr/sbin</p>
<p>#</p>
<p># BSD 4.4</p>
<p>#REAL_DAEMON_DIR=/usr/libexec</p>
<p>#</p>
<p># HP-UX SCO Unicos</p>
<p>#REAL_DAEMON_DIR=/etc</p>
<p>2：在Makefile 中查找FACILITY= LOG_MAIL这几个关键字，Tcp_wrapper的纪录功能就是由这里实现的，系统默认是使用solaris的MAIL精灵来做连接纪录的，但这样会造成Tcp_wrapper的连接纪录和系统的mail日志混杂在一起,不利于管理员分辨.所以建议还是选用一个solaris中未使用的local精灵.我们在这里使用LOCAL3，即FACILITY= LOG_ LOCAL3 ，SEVERITY级别保持INFO级别不变。在读者的机器上可视情况而定用何种精灵。修改后即下面的形式:</p>
<p># The LOG_XXX names below are taken from the /usr/include/syslog.h file.</p>
<p>FACILITY= LOG_LOCAL3 #LOG_MAIL is what most sendmail daemons use</p>
<p># The syslog priority at which successful connections are logged。</p>
<p>SEVERITY= LOG_INFO # LOG_INFO is normally not logged to the console</p>
<p>3：接着查找/etc/hosts.allow，/etc/hosts.deny，也就是上文提到的访问控制文件，建议将默认的/etc替换为其它路径。 由此Makefile编辑完成，退出vi，执行make sunos5（sunos5这个参数是由Makefile开始描述部分得到，采用其它操作系统的将sunos5替换为为相应参数即可）。我们可以看到系统在编译，成功后，在当前目录下会生成tcpd，tcpdmatch，safe_finger等5个可执行文件。建议选一个目录如/usr/local/sbin，将上述5个文件拷贝到这个目录中，至此Tcp_wrapper本身的编译工作就此结束。</p>
<p>下一步，编辑/etc/inetd.conf，将原</p>
<p>telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd中的/usr/sbin/in.telnetd替换为tcpd及其所在路径，在此例中即</p>
<p>telnet stream tcp nowait root /usr/local/sbin/tcpd in.telnetd</p>
<p>其它ftp ， tftp ， rsh ， rlogin等同样操作即可，建议至少替换telnet，ftp，rsh，rlogin这几个守护程序。</p>
<p>编辑结束后，保存文件，ps –ef | grep inetd找出inetd的进程号，kill –HUP 重启inetd进程使改动生效。</p>
<p>接着我们编辑/etc/syslog.conf文件，加入日志纪录功能，在此例中即</p>
<p>#tcp wrapper log</p>
<p>local3.info /var/log/tcplog</p>
<p>编辑结束后，保存文件， 在/var/log下生成tcplog文件，注意这个文件的读写属性， 应该只对root有读写权限。然后ps –ef | grep syslogd，找出syslogd的进程号，kill –HUP 重启syslogd进程使改动生效。</p>
<p>最后一项工作是编辑hosts.deny和hosts.allow文件，按上面的语法编辑即可。至此所有工作完成，我们可以用上述两个文件的设置来试一试，假设主机refuse(IP 11.22.33.44)telnet本机，我们看一看，会有什么反应？</p>
<p>refuse#telnet www.yiming.com</p>
<p>Trying www.yiming.com &#8230;</p>
<p>Connected to www.yiming.com</p>
<p>Connection closed by foreign host.</p>
<p>我们再看看本机Tcp_wrapper的日志，多了一条：</p>
<p>Apr 2 13:56:20 yiming in.telnetd[1769]: refused connect from 11.22.33.44</p>
<p>实际上这种测试可用Tcp_wrapper自带的测试文件tcpdmatch，使用很简单，格式tcpdmatch 守护程序 假定IP 即可，这里也不介绍了。</td>
</tr>
</tbody>
</table>
</div>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2009/11/vps-%e5%bf%ab%e9%80%9f%e5%ae%89%e8%a3%85-linuxnginxmysqlphp-%e7%8e%af%e5%a2%83%e3%80%90%e8%bd%ac%e3%80%91/' rel='bookmark' title='Permanent Link: VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】'>VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/08/tcp_wrapper/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>发现老婆的作息时间表我惊呆了(转)</title>
		<link>http://cq-cser.cn/2010/08/%e5%8f%91%e7%8e%b0%e8%80%81%e5%a9%86%e7%9a%84%e4%bd%9c%e6%81%af%e6%97%b6%e9%97%b4%e8%a1%a8%e6%88%91%e6%83%8a%e5%91%86%e4%ba%86%e8%bd%ac/</link>
		<comments>http://cq-cser.cn/2010/08/%e5%8f%91%e7%8e%b0%e8%80%81%e5%a9%86%e7%9a%84%e4%bd%9c%e6%81%af%e6%97%b6%e9%97%b4%e8%a1%a8%e6%88%91%e6%83%8a%e5%91%86%e4%ba%86%e8%bd%ac/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 09:55:01 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1327</guid>
		<description><![CDATA[太能YY了。 今天突然发现了老婆的作息时间表，请看：         6：30　起床(睁开眼睛，首先要检查眼睛是不是保持干净，头发是不是柔顺，整理 过后轻轻地亲吻老公，动作虽轻，但目的是把他弄醒)        6：35──7：00　煅炼身体（如果老公有性致就再来一次，如果老公没性致，就告 诉他再睡一会就该起床了，问问他想吃点什么，今天穿哪套衣服？细致到衬衫的颜色， 领带的图案） 　　　　　　 　　        7：00──7：30　做早餐（按照老公的要求做早饭，但基本上老公不会有什么要求 ，虽然他说随便，早餐却随便不得，花样一定要多，面包、牛奶、鸡蛋，豆浆、油条、 米粉，包子、馒头、稀饭，不得有重复） 　　　　　　 　　　        7：30──7：35　打开音响，叫老公起床（一日之计在于晨，这时候的老公是最帅 的，可以过去一下子把被子掀开，趁机偷看老公健硕的身体） 　　　　　　 　　　        7：35──7：45　看老公穿衣服（千万要记住，不要象妈妈一样命令他穿什么，要 在一边轻轻的检讨，衬衫熨烫的还不够平整） 　　　　　　 　　　        7：45──7：55　和老公一起洗漱（有三要：要帮老公挤好牙膏，要帮老公弄好剃 须刀，要帮老公淋香水） 　　　        7：55──8：00　摆早餐上桌（如果老公的胡子还没有刮好，不得有催促之声，因 为那是属于他的乐趣） 　　　         8：00──8：30　吃早餐（要做淑女，老公要吃的你少吃，老公不吃的你也少吃， 宁愿浪费，不能狼吞虎咽） 　　　　　　        8：30──9：00　和老公上班（有汽车的，冬季要提前帮老公着车，开暖风。没汽 车的帮着拦计程车，绝不能让老公挤公车） 　        9：00──12：00　上班（努力工作，有事做要做，没事做找出事也要做） 　　　 　　　 　　　        12：00──12：10　打电话给老公（问老公上午过得怎么样，中午要吃什么东西… …这个不用教了？） 　　        12：10──12：40　吃营养餐（记住，一定要注意营养的搭配，为了姣好的面容和 魔鬼的身材，不得吃太多的的东东，就算吃了别的东东，仅限于水果） 　　　　　　  　　　        12：40──13：00　小栖片刻（为了能做个好老婆，一定要小栖，不得在公司四处 看帅哥，要和女同事探讨美容的经验，特色的饮食） 　　　　　　 　　         13：00──17：30　努力工作（不努力工作怎么赚钱，漂亮衣服，昂贵的化妆品不 一定要老公给买） 　　        17：30──18：00　下班（一定要电话老公，报告自己已经下班，问老公晚饭是否 在家吃，是否和你一起吃，去哪家餐厅吃，如老公有事，不得追问） 　　　　　　        18：00──19：00　逛街（逛街是女人的必修课，每天必修。其间，不仅要考虑自 己穿什么用什么才会讨老公开心，看见合适的东西也要记得帮老公买） 　　　　        19：00──20：00　吃饭（陪老公去他喜欢的餐厅，在他的同事面前，一定要显出 [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>太能YY了。</p>
<p>今天突然发现了老婆的作息时间表，请看： <span id="more-1327"></span></p>
<p>   <br />
    6：30　起床(睁开眼睛，首先要检查眼睛是不是保持干净，头发是不是柔顺，整理<br />
过后轻轻地亲吻老公，动作虽轻，但目的是把他弄醒)</p>
<p>  <br />
    6：35──7：00　煅炼身体（如果老公有性致就再来一次，如果老公没性致，就告<br />
诉他再睡一会就该起床了，问问他想吃点什么，今天穿哪套衣服？细致到衬衫的颜色，<br />
领带的图案） 　　　　　　 　　</p>
<p>  <br />
    7：00──7：30　做早餐（按照老公的要求做早饭，但基本上老公不会有什么要求<br />
，虽然他说随便，早餐却随便不得，花样一定要多，面包、牛奶、鸡蛋，豆浆、油条、<br />
米粉，包子、馒头、稀饭，不得有重复） 　　　　　　 　　　</p>
<p>  <br />
    7：30──7：35　打开音响，叫老公起床（一日之计在于晨，这时候的老公是最帅<br />
的，可以过去一下子把被子掀开，趁机偷看老公健硕的身体） 　　　　　　 　　　</p>
<p>  <br />
    7：35──7：45　看老公穿衣服（千万要记住，不要象妈妈一样命令他穿什么，要<br />
在一边轻轻的检讨，衬衫熨烫的还不够平整） 　　　　　　 　　　</p>
<p>  <br />
    7：45──7：55　和老公一起洗漱（有三要：要帮老公挤好牙膏，要帮老公弄好剃<br />
须刀，要帮老公淋香水） 　　　</p>
<p>  <br />
    7：55──8：00　摆早餐上桌（如果老公的胡子还没有刮好，不得有催促之声，因<br />
为那是属于他的乐趣） 　　　</p>
<p>   <br />
    8：00──8：30　吃早餐（要做淑女，老公要吃的你少吃，老公不吃的你也少吃，<br />
宁愿浪费，不能狼吞虎咽） 　　　　　　</p>
<p>  <br />
    8：30──9：00　和老公上班（有汽车的，冬季要提前帮老公着车，开暖风。没汽<br />
车的帮着拦计程车，绝不能让老公挤公车） 　</p>
<p>  <br />
    9：00──12：00　上班（努力工作，有事做要做，没事做找出事也要做） 　　　<br />
　　　 　　　</p>
<p>  <br />
    12：00──12：10　打电话给老公（问老公上午过得怎么样，中午要吃什么东西…<br />
…这个不用教了？） 　　</p>
<p>  <br />
    12：10──12：40　吃营养餐（记住，一定要注意营养的搭配，为了姣好的面容和<br />
魔鬼的身材，不得吃太多的的东东，就算吃了别的东东，仅限于水果） 　　　　　　 <br />
　　　</p>
<p>  <br />
    12：40──13：00　小栖片刻（为了能做个好老婆，一定要小栖，不得在公司四处<br />
看帅哥，要和女同事探讨美容的经验，特色的饮食） 　　　　　　 　　</p>
<p>   <br />
    13：00──17：30　努力工作（不努力工作怎么赚钱，漂亮衣服，昂贵的化妆品不<br />
一定要老公给买） 　　</p>
<p>  <br />
    17：30──18：00　下班（一定要电话老公，报告自己已经下班，问老公晚饭是否<br />
在家吃，是否和你一起吃，去哪家餐厅吃，如老公有事，不得追问） 　　　　　　</p>
<p>  <br />
    18：00──19：00　逛街（逛街是女人的必修课，每天必修。其间，不仅要考虑自<br />
己穿什么用什么才会讨老公开心，看见合适的东西也要记得帮老公买） 　　　　</p>
<p>  <br />
    19：00──20：00　吃饭（陪老公去他喜欢的餐厅，在他的同事面前，一定要显出<br />
对老公的关爱和顺从。并私下研究学习此餐厅的特色菜，保证自己的厨艺不断向四星级<br />
厨师的水平靠拢） 　　</p>
<p>  <br />
    20：00──20：30　散步回家（手不能停──一定挽住老公的胳膊；嘴不能停──<br />
跟老公发嗲泛酸；眼不能停──不管四周是打架还是撞车，都要爱慕地不断凝视老公英<br />
俊的面庞） 　　　　</p>
<p>  <br />
    20：30──22：00　陪老公（老公要看新闻，不得换自己喜欢的电视剧；老公要玩<br />
电脑，沏好茶水，帮忙倒烟灰缸；老公要看碟，陪着） 　　　　　　 　　　</p>
<p>   <br />
    22：00──22：20　洗澡（为了一身滑腻的肌肤，一定要认真地洗澡，并把洗澡作<br />
为每日的必修课，用各种浴液，浴盐，香精油把自己弄的香喷喷，好吃看的见） 　　</p>
<p>  <br />
    22：20　睡觉（被子要先铺好，今天抱小熊扮学生妹，明天穿真丝睡衣搞成熟**…<br />
…老公没上床前，一定要开着床头暧昧的台灯，钻研时尚杂志） 　　　　　　 　　</p>
<p>  <br />
    22:30──？用**满足老公的……</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/08/%e5%8f%91%e7%8e%b0%e8%80%81%e5%a9%86%e7%9a%84%e4%bd%9c%e6%81%af%e6%97%b6%e9%97%b4%e8%a1%a8%e6%88%91%e6%83%8a%e5%91%86%e4%ba%86%e8%bd%ac/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>FROM-cnblog-吉日嘎拉-10-8</title>
		<link>http://cq-cser.cn/2010/08/from-cnblog-%e5%90%89%e6%97%a5%e5%98%8e%e6%8b%89-10-8/</link>
		<comments>http://cq-cser.cn/2010/08/from-cnblog-%e5%90%89%e6%97%a5%e5%98%8e%e6%8b%89-10-8/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 08:00:42 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1323</guid>
		<description><![CDATA[原文：软件项目送上门来了，还要学会说&#8221;不&#8221;，接了项目拿了定金噩梦才刚刚开始 今年前前后后也遇到了不少软件项目，想来想去还是拒绝了其中的大部分项目，当然也有一部分是客户拒绝我的，把这些经验教训分享给大家，一起探讨探讨，接了项目很容易深陷泥潭，累得死去活来不值得。 拒绝软件项目的原因主要有几种： 1：跟主营业务发展方向是否一致？例如只做.NET C#的方向或者接近与这个的方向的统一权限管理系统等，什么方向的东西什么都做，最后什么也赚不来了，什么也做不好，只有做精做熟某一个方向的东西，不管大钱小钱，还是赚起来顺心一些。 2：有没有充分的精力去做这个软件项目？平时还要打工、年纪大了精力也没那么充沛了，人也容易疲劳，还要有适当的休息时间比较好，不像年轻时那么不知道疲倦了，而且客户的钱也不是那么好赚的，东西做不好，钱也不给的，项目做好了，还是要投入很多精力去做好才可以的，工作太累了身体的消耗大，等老了浑身是病，有需要用转来的钱去看病，何必呢，还不如劳役结合了。 3：接了这个项目后周期有多长？多长时间才能完成？若需要做好几个月完成，那报价应该是要多高？有没有重复销售的可能性？就是变成产品的可能性？若一个项目的周期很长，有1年，客户愿意出2万，那一个月平均收益只有2000元，那就要算算是否值得去折腾了。 4：若是找正规的公司做这个项目需要多少报价？我们的报价会是多少？若给公司做这个项目需要100万，找我来做才10万，那何必折腾这样的事情呢，损人损己，破坏扰乱市场，低价竞争，何必呢，除非是实在是太缺钱花了。 5：做了项目会不会影响家庭？天天忙个没完，没空陪老婆，那人家嫁给干啥？那还不如直接嫁个有钱的男人算了，至少人家还能有空陪伴她，这个是失去了前女友后总结出来的深刻教训，血的教训啊，宁可钱少点儿，好好陪陪家人，好好陪陪老婆孩子，比拼死做项目接项目好多了，项目接了，钱赚来了，老婆跟别人跑了，哪个损失大，哪个损失小。 6：会不会跟公司的产品，公司的知识产权发生冲突？若万一把公司的东西拿出去卖了，惹上官司，那就要坐牢了，甚至会倾家荡产了。 7：是否与未来的发展趋势一致，例如网上商城等项目一般是会做的，工作流方面的项目也是会做的，与一些硬件控制集成有关的项目也会做的。 8：若项目做不过来了，能否转包过去？转给谁做？能否控制成本？能否控制项目进度？能否控制项目质量？控制外包项目的质量、进度、成本，比控制自己的项目还需要更高的管理水平的。 9：软件项目不像其他项目，从别人那里卖过来，再转手卖给客户就可以了，因为软件行业没成熟到其他传统行业的产品那么成熟，软件项目有一定的复杂度。 学会计算成本： 例如这个项目，你自己是老板，自己开公司做这个项目，能否盈利？若你是开了一家小软件公司，那最基本的支出会是： 1：房租、水电、网络、 办公设备等的费用。 2：你雇佣几个人？这几个人工资成本、人员变动的风险成本。 3：你自己的工资收入？ 4：开发票都是要缴税的，接近10%左右。 5：其他的开支业务，相关的管理成本等。 接了一个小项目，几个人搞了3个月，那10万往往就烧进去了，稍微算过这些后，在杭州应该是没有10万起步的开发类的软件项目，基本上接了就是会亏的，就是成立最简单的软件公司做这些项目还是亏损的，何况自己一个人死去活来的干，那不是更弄不好？更是收支不能平衡？那何必惹这麻烦呢。 稍微理智了以后，10万8万的项目，一般也懒得接了，所以今年拒绝了一个 景区的售票综合管理系统，拒绝了一个网页网络游戏的项目，预算都是10万左右的，辛苦做做也没什么赚头，何必跟自己过不去呢，老老实实打工，按时上班按时下班，省心省事，最后的经济效益说不定还是打工的收益高了。 虽然2个项目算起来有20万，但是很有可能折腾了1年也搞不定，那辞职了专门干这个项目也未必有啥利润空间，今年这个2个项目做好，明年又做什么？难道又去打工？每年休息半年没项目又不是赔回去了，做项目总的来说，不是长远之际，而且竞争对手也很多很多，竞争对手多了，就很容易没利润空间这个事情了。 并不是会做软件的人更适合当老板，而是会谈生意的人，例如能把这个景区售票综合管理系统能谈到50万的合同，能把网页网络游戏也谈到100万左右，然后自己拿个50万，招聘像吉日这样的1-2个，再配备几个普通开发人员，开发一年，2个项目都搞定了，100万的成本预算足够了，这样的人才适合当老板，1年里到处寻觅项目，再找好明年的项目，当老板的1年里只办好1件事情就可以了，这才叫会当老板，会创业。 我从我们老板身上也学到了不少，接近半年时间了，我也亲自体会了一些，我们老板很会取舍，我们感觉很好的项目，他甚至也会舍弃到，现在回过头来想想，好在当初没接那个项目，现在人手这么紧张，项目都这么紧张，哪里有功夫做其他项目啊？好在没接，否则我们开发部的人不是天天加班，死去活来了？我们的老板真明智，当初没听我们的，没把报价压低。 想给开发软件的朋友给个忠告：不是会做软件了，工作努力了就适合创业开软件公司，还要看你能否把10万的项目，谈成100万项目的经商水平，而不是努力去把10万的项目按1万成本做出来，那是永远行不通的，因为给你打工的人赚不到钱了，都会辞职，跳槽的，所以还是要把重点能力放在如何把项目的商业价值发挥得最高上。 有时候做软件项目就像读书一样的。 例如你初中毕业了，就出去打工了，是先赚到钱了，但是赚的都是小钱，但是你若有毅力，一直读书到博士，然后再找工作，你很可能一年就赚了别人接近工作10年的收入，为什么这么说？初中打工的，一般是2000元左右的薪水，1年也就2万的收入左右，10年来算也是20万的收入吧，若你博士毕业后，找到个不错的工作，单位提供安家费什么的，一次性就补贴25万就有了，还不算年薪；做软件，你急着做那些不赚钱的项目，把自己的提高都耽误了，将来也赚不到什么大钱，就像初中毕业了就开始打工了，差不多的，当然你可能老早就当上老板了，那水平境界也不一样了，但是总是只有少数人能成功的，大多数人都是平庸的人而已。 将权限管理、工作流管理做到我能力的极致，一个人只能做好那么很少的几件事情。 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a id="ctl03_TitleUrl" href="http://www.cnblogs.com/jirigala/archive/2010/08/14/1799520.html">原文：软件项目送上门来了，还要学会说&#8221;不&#8221;，接了项目拿了定金噩梦才刚刚开始</a></p>
<div>
<p>今年前前后后也遇到了不少软件项目，想来想去还是拒绝了其中的大部分项目，当然也有一部分是客户拒绝我的，把这些经验教训分享给大家，一起探讨探讨，接了项目很容易深陷泥潭，累得死去活来不值得。<span id="more-1323"></span></p>
<p>拒绝软件项目的原因主要有几种：</p>
<p>1：跟<strong>主营业务发展方向是否一致</strong>？例如只做.NET C#的方向或者接近与这个的方向的统一权限管理系统等，什么方向的东西什么都做，最后什么也赚不来了，什么也做不好，只有做精做熟某一个方向的东西，不管大钱小钱，还是赚起来顺心一些。</p>
<p>2：<strong>有没有充分的精力去做</strong>这个软件项目？平时还要打工、年纪大了精力也没那么充沛了，人也容易疲劳，还要有适当的休息时间比较好，不像年轻时那么不知道疲倦了，而且客户的钱也不是那么好赚的，东西做不好，钱也不给的，项目做好了，还是要投入很多精力去做好才可以的，工作太累了身体的消耗大，等老了浑身是病，有需要用转来的钱去看病，何必呢，还不如劳役结合了。</p>
<p>3：接了这个项目后<strong>周期有多长</strong>？多长时间才能完成？若需要做好几个月完成，那报价应该是要多高？有没有重复销售的可能性？就是<strong>变成产品的可能性</strong>？若一个项目的周期很长，有1年，客户愿意出2万，那一个月平均收益只有2000元，那就要算算是否值得去折腾了。</p>
<p>4：若是找正规的公司做这个<strong>项目需要多少报价</strong>？我们的报价会是多少？若给公司做这个项目需要100万，找我来做才10万，那何必折腾这样的事情呢，损人损己，破坏扰乱市场，低价竞争，何必呢，除非是实在是太缺钱花了。</p>
<p>5：做了<strong>项目会不会影响家庭</strong>？天天忙个没完，没空陪老婆，那人家嫁给干啥？那还不如直接嫁个有钱的男人算了，至少人家还能有空陪伴她，这个是失去了前女友后总结出来的深刻教训，血的教训啊，宁可钱少点儿，好好陪陪家人，好好陪陪老婆孩子，比拼死做项目接项目好多了，项目接了，钱赚来了，老婆跟别人跑了，哪个损失大，哪个损失小。</p>
<p>6：会不会跟<strong>公司的产品，公司的知识产权发生冲突</strong>？若万一把公司的东西拿出去卖了，惹上官司，那就要坐牢了，甚至会倾家荡产了。</p>
<p>7：<strong>是否与未来的发展趋势一致</strong>，例如网上商城等项目一般是会做的，工作流方面的项目也是会做的，与一些硬件控制集成有关的项目也会做的。</p>
<p>8：若<strong>项目做不过来了，能否转包过去？转给谁做</strong>？能否控制成本？能否控制项目进度？能否控制项目质量？控制外包项目的质量、进度、成本，比控制自己的项目还需要更高的管理水平的。</p>
<p>9：<strong>软件项目不像其他项目，从别人那里卖过来，再转手卖给客户就可以了</strong>，因为软件行业没成熟到其他传统行业的产品那么成熟，软件项目有一定的复杂度。</p>
<p>学会计算成本：</p>
<p>例如这个项目，你自己是老板，自己开公司做这个项目，能否盈利？若你是开了一家小软件公司，那最基本的支出会是：</p>
<p>1：房租、水电、网络、 办公设备等的费用。</p>
<p>2：你雇佣几个人？这几个人工资成本、人员变动的风险成本。</p>
<p>3：你自己的工资收入？</p>
<p>4：开发票都是要缴税的，接近10%左右。</p>
<p>5：其他的开支业务，相关的管理成本等。</p>
<p>接了一个小项目，几个人搞了3个月，那10万往往就烧进去了，稍微算过这些后，在杭州应该是没有10万起步的开发类的软件项目，基本上接了就是会亏的，就是成立最简单的软件公司做这些项目还是亏损的，何况自己一个人死去活来的干，那不是更弄不好？更是收支不能平衡？那何必惹这麻烦呢。</p>
<p>稍微理智了以后，10万8万的项目，一般也懒得接了，所以今年拒绝了一个 景区的售票综合管理系统，拒绝了一个网页网络游戏的项目，预算都是10万左右的，辛苦做做也没什么赚头，何必跟自己过不去呢，老老实实打工，按时上班按时下班，省心省事，<strong>最后的经济效益说不定还是打工的收益高</strong>了。</p>
<p>虽然2个项目算起来有20万，但是很有可能折腾了1年也搞不定，那辞职了专门干这个项目也未必有啥利润空间，今年这个2个项目做好，明年又做什么？难道又去打工？每年休息半年没项目又不是赔回去了，做项目总的来说，不是长远之际，而且竞争对手也很多很多，竞争对手多了，就很容易没利润空间这个事情了。</p>
<p>并不是会做软件的人更适合当老板，而是会谈生意的人，例如能把这个景区售票综合管理系统能谈到50万的合同，能把网页网络游戏也谈到100万左右，然后自己拿个50万，招聘像吉日这样的1-2个，再配备几个普通开发人员，开发一年，2个项目都搞定了，100万的成本预算足够了，这样的人才适合当老板，1年里到处寻觅项目，再找好明年的项目，当老板的1年里只办好1件事情就可以了，这才叫会当老板，会创业。</p>
<p>我从我们老板身上也学到了不少，接近半年时间了，我也亲自体会了一些，我们老板很会取舍，我们感觉很好的项目，他甚至也会舍弃到，现在回过头来想想，好在当初没接那个项目，现在人手这么紧张，项目都这么紧张，哪里有功夫做其他项目啊？好在没接，否则我们开发部的人不是天天加班，死去活来了？我们的老板真明智，当初没听我们的，没把报价压低。</p>
<p>想给开发软件的朋友给个忠告：不是会做软件了，工作努力了就适合创业开软件公司，还要看你能否把10万的项目，谈成100万项目的经商水平，而不是努力去把10万的项目按1万成本做出来，那是永远行不通的，因为给你打工的人赚不到钱了，都会辞职，跳槽的，所以还是要把重点能力放在如何把项目的商业价值发挥得最高上。</p>
<p>有时候做软件项目就像读书一样的。</p>
<p>例如你初中毕业了，就出去打工了，是先赚到钱了，但是赚的都是小钱，但是你若有毅力，一直读书到博士，然后再找工作，你很可能一年就赚了别人接近工作10年的收入，为什么这么说？初中打工的，一般是2000元左右的薪水，1年也就2万的收入左右，10年来算也是20万的收入吧，若你博士毕业后，找到个不错的工作，单位提供安家费什么的，一次性就补贴25万就有了，还不算年薪；做软件，你急着做那些不赚钱的项目，把自己的提高都耽误了，将来也赚不到什么大钱，就像初中毕业了就开始打工了，差不多的，当然你可能老早就当上老板了，那水平境界也不一样了，但是总是只有少数人能成功的，大多数人都是平庸的人而已。</p>
<div id="MySignature">将权限管理、工作流管理做到我能力的极致，一个人只能做好那么很少的几件事情。</div>
<p><script type="text/javascript"></script></p>
</div>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/08/from-cnblog-%e5%90%89%e6%97%a5%e5%98%8e%e6%8b%89-10-8/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>安全基础信息安全不可低估的30个细节[ZZ]</title>
		<link>http://cq-cser.cn/2010/08/%e5%ae%89%e5%85%a8%e5%9f%ba%e7%a1%80%e4%bf%a1%e6%81%af%e5%ae%89%e5%85%a8%e4%b8%8d%e5%8f%af%e4%bd%8e%e4%bc%b0%e7%9a%8430%e4%b8%aa%e7%bb%86%e8%8a%82zz/</link>
		<comments>http://cq-cser.cn/2010/08/%e5%ae%89%e5%85%a8%e5%9f%ba%e7%a1%80%e4%bf%a1%e6%81%af%e5%ae%89%e5%85%a8%e4%b8%8d%e5%8f%af%e4%bd%8e%e4%bc%b0%e7%9a%8430%e4%b8%aa%e7%bb%86%e8%8a%82zz/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 11:13:47 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[sec]]></category>
		<category><![CDATA[安全]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1319</guid>
		<description><![CDATA[信息安全?“不就是安装杀毒软件，在电脑上设设密码吗”?当你这样想，你就和全世界95%的人一样，都错估、低估了信息对公司的致命影响;好在全世界就是有5%的人，和《中国财富》一样，恐惧、震慑、急着应变于信息对商业世界爆炸性的影响力。 　　小心30个细节，一分钟毁灭你的公司，这是一个以1%、2%决胜负的商业时代，一个信息就可以左右企业的成败。这个信息在自己手里是王牌，在对手手里是炸弹。 　　如此重要的信息，可能在老板的大脑里、公司电脑里、一个打印稿的背面，甚至在一个垃圾筐里。随时都有泄漏的可能，泄漏的结果轻则使公司蒙受损失，重则毁灭公司。 　　当你读这篇文章的时候，全世界又有2个企业因为信息安全问题倒闭，有11个企业因为信息安全问题造成大概800多万的直接经济损失。中国财富通过对100个经理人的调查总结30个致命细节，让您5分钟快速成为信息安全专家。 　　1、打印机——10秒延迟带来信息漏洞 即使是激光打印机，也有10秒以上的延迟，如果你不在第9秒守在打印机的旁边，第一个看到文件的人可能就不是你了。大部分的现代化公司都使用公用的打印机，并且将打印机、复印机等器材放在一个相对独立的空间里。于是，部门之间的机密文件就可以从设备室开始，在其它部门传播，当部门之间没有秘密，公司也就没有秘密了。 　　2、打印纸背面——好习惯换取的大损失 节约用纸是很多公司的好习惯，员工往往会以使用背面打印纸为荣。其实，将拥有这种习惯公司的“废纸”收集在一起，你会发现打印、复印造成的废纸所包含公司机密竟然如此全面，连执行副总都会觉得汗颜，因为废纸记载了公司里比他的工作日记都全面的内容。 　　3、电脑易手——新员工真正的入职导师 我们相信，所有的职业经理人都有过这样的经历:如果自己新到一家公司工作，在自己前任的电脑里漫游是了解新公司最好的渠道。在一种近似“窥探”的状态下，公司里曾经发生过的事情“尽收眼底”，从公司以往的客户记录、奖惩制度、甚至你还有幸阅读前任的辞呈。如果是其它部门的电脑，自然也是另有一番乐趣。 　　4、共享——做好文件 再通知窃取者 局域网中的共享是获得公司内部机密最后的通道。有的公司为了杜绝内部网络□□□□，规定所有人在共享以后一定要马上取消。实际上越是这样，企业通过共享泄露机密的风险越大。因为当人们这样做的时候，会无所顾及地利用共享方式传播信息，人们习惯的方式是在开放式办公间的这边对着另一边的同事喊:“我放在共享里了，你来拿吧——”，没错，会有人去拿的，却往往不只是你期望的人。 5、指数对比——聪明反被聪明误 在传统的生产型企业之间，经常要推测竞争对手的销售数量、生产数量。于是，人们为了隐藏自己的实际数量，而引入了统计学里的指数，通过对实际数量的加权，保护自己的机密信息。唯一让人遗憾的是，通常采取的简单基期加权，如果被对方了解到几年内任何一个月的真实数量，所有的真实数量就一览无余地出现在竞争对手的办公桌上了。 　　6、培训——信息保卫战从此被动 新员工进入公司，大部分的企业会对新员工坦诚相见。从培训的第一天开始，新员工以“更快融入团队”的名义，接触公司除财务以外所有的作业部门，从公司战略到正在采取的战术方法，从公司的核心客户到关键技术。但事实上，总有超过五分之一的员工会在入职三个月以后离开公司。同时，他们中的大部份没有离开现在从事的行业，或许正在向你的竞争对手眉飞色舞地描述你公司的一草一木。 　　7、传真机——你总是在半小时后才拿到发给你的传真 总有传真是“没有人领取”的，每周一定有人收不到重要的传真;人们总是“惊奇地”发现，自己传真纸的最后一页是别人的开头，而你的开头却怎么也找不到了。 　　8、公用设备——不等于公用信息 在小型公司或者一个独立的部门里，人们经常公用U盘、软盘或手提电脑。如果有机会把U盘借给公司的新会计用，也就有可能在对方归还的时候轻易获得本月的公司损益表。 　　9、摄像头——挥手之间断送的竞标机会 总部在上海的一家国内大型广告公司，在2004年3月出现的那一次信息泄露，导致竞标前一天，广告创意被竞争对手窃取，原因竟然是主创人员的OICQ上安装了视频，挥手之间，断送的或许并不仅仅是一次合作的机会。 　　10、产品痕迹——靠“痕迹”了解你的未来 在市场调查领域，分析产品痕迹来推断竞争对手行销效果和行销策略是通用的方法。产品的运输、仓储、废弃的包装，都可以在竞争对手购买的调研报告中出现，因为“痕迹分析”已经是商业情报收集的常规手段。 　　11、压缩软件——对信息安全威胁最大的软件 ZIP、RAR是威胁企业信息安全最大的软件。3寸软盘的存储空间是1.4M，压缩软件可以让大型的WORD文件轻松存入一张软盘，把各种资料轻松带出公司。 12、光盘刻录——资料在备份过程中流失 如果想要拿走公司的资料，最好的办法是申请光盘备份，把文件做成特定的格式，交给网络管理员备份，然后声称不能正常打开，要求重新备份，大多情况下，留在光驱里的“废盘”就可以在下班后大大方方带出公司。 　　13、邮箱——信息窃取的中转站 利用电子邮件转移窃取的公司资料占所有信息窃取的八成以上。很多企业不装软驱、光驱、USB接口，却没有办法避免员工通过电子邮件的窃取信息，相比之下，以上方法显得有些幼稚、可笑。 　　14、隐藏分区——长期窃取公司资料必备手法 长期在公司内搜集资料，用来出售或保留，总是件危险的事情。自己的电脑总是不免被别人使用，发现电脑里有不该有的东西怎么行。于是隐藏在硬盘分区就成了最佳选择，本来有C、D、E三个虚拟分区，可以把E隐藏起来，只有自己可以访问。当然，如果遇到行家，合计一下所有磁盘的总空间，可就一定露馅了。 　　15、私人电脑——大量窃取资料常用手段 压缩软件的作用毕竟是有限的，如果把自己的笔记本电脑拿到单位来，连上局域网，只要半小时，就是有1个G的文件也可以轻松带走。 　　16、会议记录——被忽视的公司机密 秘书往往把会议记录看得很平常，他们不知道一次高层的会议记录对于竞争对手意味着什么，公司里经常可以看见有人把会议记录当成废纸丢来丢去，任由公司最新的战略信息在企业的任何角落出现。 　　17、未被采纳的策划案——放弃也是一种选择 策划人员知道被采纳的策划是公司机密，去往往不知道被放弃的策划也是公司机密。有时还会对客户或媒体谈起，而竞争对手可以轻松判断:你没有做这些，就一定选择做了那些! 　　18、客户——你的机密只是盟友的谈资 经常可以在网络上看到著名咨询公司的客户提案，这些精心制作的PPT，凝聚了咨询公司团队的汗水和无数个不眠之夜，在一些信用较差的客户手里可能只是一些随意传播的谈资。 　　19、招聘活动——你的公司竟然在招聘总监? 在招聘过程中，成熟的企业不会把用人的单位登在一张广告里，因为那无异于告诉你的竞争对手:刚刚发生过人力震荡，人力匮乏。 　　20、招标前两分钟——最后的底价总是在最后“出炉” 如果投标的底价内部公开越早，出现泄露的风险越大，在招标开始前两分钟，面对关掉手机的参会者，可以公布底价了! 21、解聘后半小时——不要给他最后的机会 如果被解雇的员工是今天才得到这个消息，那么，不要让他再回到他的电脑旁。半个小时的时间，刚好可以让他收拾自己的用品，和老同事做简短的告别，天下没有不散的筵席，半小时足够了，为了离职员工的清白，更为了信息安全。 　　22、入职后一星期——新人在第一个星期里收集的资料是平时的5倍 只有在这一个星期里，他是随时准备离开的，他时刻处在疯狂的拷贝和传送状态，提防你的新员工，无论你多么欣赏他。 　　23、合作后半个月——竞争对手窃取情报的惯用手法是:假冒客户 在初次合作的半个月里，你对信息安全的谨慎只能表明企业做事的严谨，可以赢得大部分客户的谅解和尊敬。除非，他是你的竞争对手。 　　24、离职后30天——危险来自公司以外 一般情况下，一个为企业服务半年以上的员工，离职后30日之内会和公司现有员工保持频繁的联系，并且对公司的资料和状况表现出极度的热情。如果是被限时离开，那么，在离职30天内通过老同事窃取公司信息的可能性就更大。 　　25、明确对外提案原则——能不留东西的就不给打印稿，能不给电子档的就尽量给打印稿，能用电子书就不用通用格式。 　　26、保密协议——无论作用大小，和员工签定清晰的保密协议还是必要的 [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><span id="more-1319"></span>信息安全?“不就是安装杀毒软件，在电脑上设设密码吗”?当你这样想，你就和全世界95%的人一样，都错估、低估了信息对公司的致命影响;好在全世界就是有5%的人，和《中国财富》一样，恐惧、震慑、急着应变于信息对商业世界爆炸性的影响力。</p>
<p>　　小心30个细节，一分钟毁灭你的公司，这是一个以1%、2%决胜负的商业时代，一个信息就可以左右企业的成败。这个信息在自己手里是王牌，在对手手里是炸弹。</p>
<p>　　如此重要的信息，可能在老板的大脑里、公司电脑里、一个打印稿的背面，甚至在一个垃圾筐里。随时都有泄漏的可能，泄漏的结果轻则使公司蒙受损失，重则毁灭公司。</p>
<p>　　当你读这篇文章的时候，全世界又有2个企业因为信息安全问题倒闭，有11个企业因为信息安全问题造成大概800多万的直接经济损失。中国财富通过对100个经理人的调查总结30个致命细节，让您5分钟快速成为信息安全专家。</p>
<p>　　1、打印机——10秒延迟带来信息漏洞 即使是激光打印机，也有10秒以上的延迟，如果你不在第9秒守在打印机的旁边，第一个看到文件的人可能就不是你了。大部分的现代化公司都使用公用的打印机，并且将打印机、复印机等器材放在一个相对独立的空间里。于是，部门之间的机密文件就可以从设备室开始，在其它部门传播，当部门之间没有秘密，公司也就没有秘密了。</p>
<p>　　2、打印纸背面——好习惯换取的大损失 节约用纸是很多公司的好习惯，员工往往会以使用背面打印纸为荣。其实，将拥有这种习惯公司的“废纸”收集在一起，你会发现打印、复印造成的废纸所包含公司机密竟然如此全面，连执行副总都会觉得汗颜，因为废纸记载了公司里比他的工作日记都全面的内容。</p>
<p>　　3、电脑易手——新员工真正的入职导师 我们相信，所有的职业经理人都有过这样的经历:如果自己新到一家公司工作，在自己前任的电脑里漫游是了解新公司最好的渠道。在一种近似“窥探”的状态下，公司里曾经发生过的事情“尽收眼底”，从公司以往的客户记录、奖惩制度、甚至你还有幸阅读前任的辞呈。如果是其它部门的电脑，自然也是另有一番乐趣。</p>
<p>　　4、共享——做好文件 再通知窃取者 局域网中的共享是获得公司内部机密最后的通道。有的公司为了杜绝内部网络□□□□，规定所有人在共享以后一定要马上取消。实际上越是这样，企业通过共享泄露机密的风险越大。因为当人们这样做的时候，会无所顾及地利用共享方式传播信息，人们习惯的方式是在开放式办公间的这边对着另一边的同事喊:“我放在共享里了，你来拿吧——”，没错，会有人去拿的，却往往不只是你期望的人。<br />
5、指数对比——聪明反被聪明误 在传统的生产型企业之间，经常要推测竞争对手的销售数量、生产数量。于是，人们为了隐藏自己的实际数量，而引入了统计学里的指数，通过对实际数量的加权，保护自己的机密信息。唯一让人遗憾的是，通常采取的简单基期加权，如果被对方了解到几年内任何一个月的真实数量，所有的真实数量就一览无余地出现在竞争对手的办公桌上了。</p>
<p>　　6、培训——信息保卫战从此被动 新员工进入公司，大部分的企业会对新员工坦诚相见。从培训的第一天开始，新员工以“更快融入团队”的名义，接触公司除财务以外所有的作业部门，从公司战略到正在采取的战术方法，从公司的核心客户到关键技术。但事实上，总有超过五分之一的员工会在入职三个月以后离开公司。同时，他们中的大部份没有离开现在从事的行业，或许正在向你的竞争对手眉飞色舞地描述你公司的一草一木。</p>
<p>　　7、传真机——你总是在半小时后才拿到发给你的传真 总有传真是“没有人领取”的，每周一定有人收不到重要的传真;人们总是“惊奇地”发现，自己传真纸的最后一页是别人的开头，而你的开头却怎么也找不到了。</p>
<p>　　8、公用设备——不等于公用信息 在小型公司或者一个独立的部门里，人们经常公用U盘、软盘或手提电脑。如果有机会把U盘借给公司的新会计用，也就有可能在对方归还的时候轻易获得本月的公司损益表。</p>
<p>　　9、摄像头——挥手之间断送的竞标机会 总部在上海的一家国内大型广告公司，在2004年3月出现的那一次信息泄露，导致竞标前一天，广告创意被竞争对手窃取，原因竟然是主创人员的OICQ上安装了视频，挥手之间，断送的或许并不仅仅是一次合作的机会。</p>
<p>　　10、产品痕迹——靠“痕迹”了解你的未来 在市场调查领域，分析产品痕迹来推断竞争对手行销效果和行销策略是通用的方法。产品的运输、仓储、废弃的包装，都可以在竞争对手购买的调研报告中出现，因为“痕迹分析”已经是商业情报收集的常规手段。</p>
<p>　　11、压缩软件——对信息安全威胁最大的软件 ZIP、RAR是威胁企业信息安全最大的软件。3寸软盘的存储空间是1.4M，压缩软件可以让大型的WORD文件轻松存入一张软盘，把各种资料轻松带出公司。<br />
12、光盘刻录——资料在备份过程中流失 如果想要拿走公司的资料，最好的办法是申请光盘备份，把文件做成特定的格式，交给网络管理员备份，然后声称不能正常打开，要求重新备份，大多情况下，留在光驱里的“废盘”就可以在下班后大大方方带出公司。</p>
<p>　　13、邮箱——信息窃取的中转站 利用电子邮件转移窃取的公司资料占所有信息窃取的八成以上。很多企业不装软驱、光驱、USB接口，却没有办法避免员工通过电子邮件的窃取信息，相比之下，以上方法显得有些幼稚、可笑。</p>
<p>　　14、隐藏分区——长期窃取公司资料必备手法 长期在公司内搜集资料，用来出售或保留，总是件危险的事情。自己的电脑总是不免被别人使用，发现电脑里有不该有的东西怎么行。于是隐藏在硬盘分区就成了最佳选择，本来有C、D、E三个虚拟分区，可以把E隐藏起来，只有自己可以访问。当然，如果遇到行家，合计一下所有磁盘的总空间，可就一定露馅了。</p>
<p>　　15、私人电脑——大量窃取资料常用手段 压缩软件的作用毕竟是有限的，如果把自己的笔记本电脑拿到单位来，连上局域网，只要半小时，就是有1个G的文件也可以轻松带走。</p>
<p>　　16、会议记录——被忽视的公司机密 秘书往往把会议记录看得很平常，他们不知道一次高层的会议记录对于竞争对手意味着什么，公司里经常可以看见有人把会议记录当成废纸丢来丢去，任由公司最新的战略信息在企业的任何角落出现。</p>
<p>　　17、未被采纳的策划案——放弃也是一种选择 策划人员知道被采纳的策划是公司机密，去往往不知道被放弃的策划也是公司机密。有时还会对客户或媒体谈起，而竞争对手可以轻松判断:你没有做这些，就一定选择做了那些!</p>
<p>　　18、客户——你的机密只是盟友的谈资 经常可以在网络上看到著名咨询公司的客户提案，这些精心制作的PPT，凝聚了咨询公司团队的汗水和无数个不眠之夜，在一些信用较差的客户手里可能只是一些随意传播的谈资。</p>
<p>　　19、招聘活动——你的公司竟然在招聘总监? 在招聘过程中，成熟的企业不会把用人的单位登在一张广告里，因为那无异于告诉你的竞争对手:刚刚发生过人力震荡，人力匮乏。</p>
<p>　　20、招标前两分钟——最后的底价总是在最后“出炉” 如果投标的底价内部公开越早，出现泄露的风险越大，在招标开始前两分钟，面对关掉手机的参会者，可以公布底价了!<br />
21、解聘后半小时——不要给他最后的机会 如果被解雇的员工是今天才得到这个消息，那么，不要让他再回到他的电脑旁。半个小时的时间，刚好可以让他收拾自己的用品，和老同事做简短的告别，天下没有不散的筵席，半小时足够了，为了离职员工的清白，更为了信息安全。</p>
<p>　　22、入职后一星期——新人在第一个星期里收集的资料是平时的5倍 只有在这一个星期里，他是随时准备离开的，他时刻处在疯狂的拷贝和传送状态，提防你的新员工，无论你多么欣赏他。</p>
<p>　　23、合作后半个月——竞争对手窃取情报的惯用手法是:假冒客户 在初次合作的半个月里，你对信息安全的谨慎只能表明企业做事的严谨，可以赢得大部分客户的谅解和尊敬。除非，他是你的竞争对手。</p>
<p>　　24、离职后30天——危险来自公司以外 一般情况下，一个为企业服务半年以上的员工，离职后30日之内会和公司现有员工保持频繁的联系，并且对公司的资料和状况表现出极度的热情。如果是被限时离开，那么，在离职30天内通过老同事窃取公司信息的可能性就更大。</p>
<p>　　25、明确对外提案原则——能不留东西的就不给打印稿，能不给电子档的就尽量给打印稿，能用电子书就不用通用格式。</p>
<p>　　26、保密协议——无论作用大小，和员工签定清晰的保密协议还是必要的 无规矩不成方圆，明确什么是对的，人们才可以杜绝错的。保密协议的内容越详细越好，如果对方心胸坦白，自然会欣然同意。</p>
<p>　　27、责任分解——明确每个人对相关信息的安全责任 所有的机密文件如果出现泄露，可以根据规定找到责任人，追究是次要的，相互监督和防范才是责任分解的最终目的。</p>
<p>　　28、设立信息级别——对公司的机密文件进行级别划分 比如合同、客户交往、股东情况列为一级，确定机密传播的范围，让所有人了解信息的传播界限，避免因为对信息的不了解而导致的信息安全事故。</p>
<p>　　29、异地保存——别把鸡蛋放在同一个篮子里 所有备份资料尽量做到异地保存，避免因为重大事故(如：火灾、地震、战争等)对企业信息带来致命的打击。</p>
<p>　　30、认为自己的企业在信息安全上无懈可击。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/08/%e5%ae%89%e5%85%a8%e5%9f%ba%e7%a1%80%e4%bf%a1%e6%81%af%e5%ae%89%e5%85%a8%e4%b8%8d%e5%8f%af%e4%bd%8e%e4%bc%b0%e7%9a%8430%e4%b8%aa%e7%bb%86%e8%8a%82zz/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>1万小时定律</title>
		<link>http://cq-cser.cn/2010/07/1%e4%b8%87%e5%b0%8f%e6%97%b6%e5%ae%9a%e5%be%8b/</link>
		<comments>http://cq-cser.cn/2010/07/1%e4%b8%87%e5%b0%8f%e6%97%b6%e5%ae%9a%e5%be%8b/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 02:45:16 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1317</guid>
		<description><![CDATA[原文：http://advdbg.com/blogs/advdbg_system/articles/3204.aspx 先和大家分享一个所谓的“1万小时定律”吧，这个定律来自一本名为Outliers的书，作者叫Malcolm Gladwell。简单来说，定律的主要内容是： 如果想要练成一门功夫，那么就要肯花1万小时；如果肯花了1万小时，那么功夫也就炼成了。不论是什么功夫，从体育，到音乐，到各行各业&#8230;&#8230;普遍适用。 搜索了一下，发现一个名为旧雨楼的先生写的中文博客解释的也很好。 为什么要和大家分享这个定律呢。因为，老雷觉得很有道理。拿老雷本人来讲，天资很笨，唯一的长处就是有耐力，肯花功夫，顺着一条路跑到黑:-( 如果用老雷的情况来写这个定律，可能是十万小时，哈哈哈。 拿软件调试来说，看看老雷花了多少小时了？ 从老雷学习编程算起，快20年了，但是特别注意和花心思在调试技术上应该是从2003年开始的。2003年之前，写代码和调试是家常便饭，至少是积累了很多感性认识，就算做每天一小时吧，从正式工作（96年）到03年每天一小时，因为老雷一直有周末写代码的习惯，所以不用刨除周末，因此，那7年大约有365*7=2555小时。 然后算写《软件调试》那三年，周一到五，平均每晚不少于3小时（一般晚8点到晚11点），周末平均每天10小时（早8点到夜里11点）。粗略统计一下，写《软件调试》的三年少说花了3750小时在调试上，这段时间里，每天想的是调试，几乎没有哪一天不调试。 《软件调试》都是在业余时间写的，再说说2003年后的工作时间，这段时间里，面对的主要是系统软件，调试做的更多了，这正如Matt Pietrek写给《软件调试》的赠言说的： Indeed, a debugger is an essential tool to master if you’re going to do any sort of system programming. 平均来看，日常工作大约有四分之一时间是在调试，这样算来每年50周*每周5天*平均每天3小时*6= lkd&#62; n 10 base is 10 lkd&#62; ? 50*5*3*6 Evaluate expression: 4500 = 00001194 瞧，就连做这个简单计算，老雷想到的不是计算器，而是调试器:-) 三个数字加起来： lkd&#62; ? 2555+3750+4500 Evaluate expression: 10805 = [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>原文：<a href="http://advdbg.com/blogs/advdbg_system/articles/3204.aspx">http://advdbg.com/blogs/advdbg_system/articles/3204.aspx</a><br />
先和大家分享一个所谓的“1万小时定律”吧，这个定律来自一本名为Outliers的书，作者叫Malcolm Gladwell。简单来说，定律的主要内容是：</p>
<p>如果想要练成一门功夫，那么就要肯花1万小时；如果肯花了1万小时，那么功夫也就炼成了。不论是什么功夫，从体育，到音乐，到各行各业&#8230;&#8230;普遍适用。</p>
<p>搜索了一下，发现一个名为旧雨楼的先生写的中文博客解释的也很好。</p>
<p>为什么要和大家分享这个定律呢。因为，老雷觉得很有道理。拿老雷本人来讲，天资很笨，唯一的长处就是有耐力，肯花功夫，顺着一条路跑到黑:-( 如果用老雷的情况来写这个定律，可能是十万小时，哈哈哈。</p>
<p>拿软件调试来说，看看老雷花了多少小时了？</p>
<p>从老雷学习编程算起，快20年了，但是特别注意和花心思在调试技术上应该是从2003年开始的。2003年之前，写代码和调试是家常便饭，至少是积累了很多感性认识，就算做每天一小时吧，从正式工作（96年）到03年每天一小时，因为老雷一直有周末写代码的习惯，所以不用刨除周末，因此，那7年大约有365*7=2555小时。</p>
<p>然后算写《软件调试》那三年，周一到五，平均每晚不少于3小时（一般晚8点到晚11点），周末平均每天10小时（早8点到夜里11点）。粗略统计一下，写《软件调试》的三年少说花了3750小时在调试上，这段时间里，每天想的是调试，几乎没有哪一天不调试。</p>
<p>《软件调试》都是在业余时间写的，再说说2003年后的工作时间，这段时间里，面对的主要是系统软件，调试做的更多了，这正如Matt Pietrek写给《软件调试》的赠言说的：</p>
<p>Indeed, a debugger is an essential tool to master if you’re going to do any sort of system programming.</p>
<p>平均来看，日常工作大约有四分之一时间是在调试，这样算来每年50周*每周5天*平均每天3小时*6=</p>
<p>lkd&gt; n 10<br />
base is 10<br />
lkd&gt; ? 50*5*3*6<br />
Evaluate expression: 4500 = 00001194</p>
<p>瞧，就连做这个简单计算，老雷想到的不是计算器，而是调试器:-)</p>
<p>三个数字加起来：</p>
<p>lkd&gt; ? 2555+3750+4500<br />
Evaluate expression: 10805 = 00002a35</p>
<p>哦，刚刚过了1万小时！</p>
<p>老雷自以为在调试上下的功夫不少了，其实也只刚刚过了1万小时。如果按适用于老雷的十万小时定律，那么还要再努力十年，才把这个功夫炼成:-)</p>
<p>十年太久了，尤其是在今天的快餐化时代。这是可以理解的。但是有些人肯花的时间的确太少了，三分钟热血，遇到点困难就后退了，努力几天就坚持不下去&#8230;&#8230;</p>
<p>革命不是请客吃饭，老雷觉得学会调试功夫是可以改变命运的，所以它就不可能像请客吃饭那么容易。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/07/1%e4%b8%87%e5%b0%8f%e6%97%b6%e5%ae%9a%e5%be%8b/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>随笔</title>
		<link>http://cq-cser.cn/2010/07/%e9%9a%8f%e7%ac%94-5/</link>
		<comments>http://cq-cser.cn/2010/07/%e9%9a%8f%e7%ac%94-5/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 16:31:06 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1313</guid>
		<description><![CDATA[这一阶段到月底告一段落，新路线开始。话说大牛无数，或许学学文学也不错，又看了遍FAME，证明自我价值？潜心专研？CER和HER的故事似乎那么迷人，或许对着某某唱TRY，一起搞搞艺术，唱歌跳舞也不错。 另传说最近个人知识管理越来越热了，我也要没事要写写小结，果然成人世界有他自己的魅力，you want to play?join us. it&#8217;s time to be strong   另:http://cq-cser.cn/?preview=1&#38;template=yb-light&#38;stylesheet=yb-light 这个主题不错啊 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p><span id="more-1313"></span>这一阶段到月底告一段落，新路线开始。话说大牛无数，或许学学文学也不错，又看了遍FAME，证明自我价值？潜心专研？CER和HER的故事似乎那么迷人，或许对着某某唱TRY，一起搞搞艺术，唱歌跳舞也不错。</p>
<p>另传说最近个人知识管理越来越热了，我也要没事要写写小结，果然成人世界有他自己的魅力，you want to play?join us. it&#8217;s time to be strong  </p>
<p>另:<a href="http://cq-cser.cn/?preview=1&amp;template=yb-light&amp;stylesheet=yb-light">http://cq-cser.cn/?preview=1&amp;template=yb-light&amp;stylesheet=yb-light</a> 这个主题不错啊</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/07/%e9%9a%8f%e7%ac%94-5/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>桥牌规则</title>
		<link>http://cq-cser.cn/2010/07/%e6%a1%a5%e7%89%8c%e8%a7%84%e5%88%99/</link>
		<comments>http://cq-cser.cn/2010/07/%e6%a1%a5%e7%89%8c%e8%a7%84%e5%88%99/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 10:43:50 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1311</guid>
		<description><![CDATA[四个人玩,对面两人为一队.判定胜负比较麻烦,通常是有计分规则.按照你手中牌的点数,叫牌以及有无局并参照计分规则来判定.一般比赛分队式或复式两种. 想学的话,先买本书看看,了解叫牌规则,点数规则和花色大小.重要的是你必须得有一个好的搭档.共同进步. 规则 1、搭档和方位 四个人打桥牌，两人为一组对另一组，分别坐在东、南、西、北的位置上。坐南、北的两人为一方，称南北方；坐东、西的两人为一方，称东西方。 2、牌和发牌 就是普通的去掉大、小王的52张扑克牌。共分梅花、方块、红心、黑桃四个花色。四种花色有高低之分，按照英文开头字母的顺序排列而成，即梅花 (Club)为C，方块(Diamond)为D，红心(Hearts)为H，黑桃(Spade)为S。每一种花色有十三张牌，顺序如下：A（最大）、K、 Q、J、10、9、8、7、6、5、4、3、2（最小）。 还有一种“花色”叫无将（NT），就是没有将牌（主牌）的意思。 发牌、叫牌、打牌都是按照顺时针方向进行。52张牌平均分配，每人13张。 3、叫牌 发牌之后、出牌之前要进行叫牌。叫牌要用特定的符号和用语来进行。按规定由发牌者首先叫牌，根据牌点的高低，发牌者可叫也可不叫（Pass），此后，再由他的下家(左手方)叫牌，依次顺时针轮流进行。 如果四家全都不叫，这副牌就宣告作废，由下家重新发牌。 当一家开叫后，任何一家可以根据花色类别的次序在更高水平上争叫，只要在前一家同类墩数上叫更高一个数或在更高一类（花色或无将）上叫同一墩数均可。类别的排列如下，无将（最高）、黑桃、红心、方块、梅花（最低）所以叫一个黑桃比叫一个红心高，叫一个梅花比叫一个无将高。直到三家不叫表示承认为止。叫得最高的那个花色就是将牌花色(或无将)，而该级别的数字就是定约的水平，两者合称定约。 叫牌的目的是使同伴之间互通牌情，以便找到最佳定约，或者干扰对方选择出最有利的定约，以此达到战胜敌方的目的。 4、局况： 为了给游戏的双方创造较为复杂的形势，从而让牌手能够更好地发挥出自己的水平，桥牌活动特意设置了“局况”。 有局的一方胜则多得分，败则多输分，而无局的一方则又可以利用败了输分少这一条件与对方竞争。有局方和无局方的不同奖分和罚分（记分表）。 桥牌的有局和无局是人为规定的，不可变更。每副牌都有固定的牌号、发牌人、局况。 通常，人们用“—”代表双方无局，NS代表南北有局，EW代表东西有局，B代表双方有局。 5、定约 所谓定约，是指经过叫牌最后由一方确定经另一方同意的一个叫牌级数协定。确定定约的一方称定约方，其宗旨是要完成定约；同意的一方称防守方，其目标是击垮敌方的定约。 定约分有将定约和无将定约两种。有将定约是确定某一花色为将牌。将牌除可以在本花色中赢墩外，还可以将吃其他三门花色（假如没有这个花色的话）。 无将定约就是没有将牌的定约，其输赢只根据同一花色中的每一张牌的大小来比较。（假如你没有这个花色，只好出其他花色，这称为垫牌，不论大小，都不能赢墩）。 定约又分成局定约和不成局定约，定约分数满100分的，叫做成局定约，定约分数不足100分的，叫做不成局定约。两者的奖分和罚分都不一样（记分表）。 6、加倍和再加倍 加倍是叫牌过程中经常出现的一个名词，它的原意为防守方的一家认为定约方的定约肯定会被己方击败，他就叫“加倍”以示惩罚。现在在加倍的含义已经被引伸为各种意义，不再单独作为惩罚而用。 如定约方对防守方所叫的“加倍”不以为然，相信己方仍有把握完成定约时，可叫“再加倍”来惩罚加倍方。再加倍定约，定约方的得失分均按四倍（基本分乘以4）计算。加倍的符号用“X”表示，再加倍的符号用“XX”表示。 加倍只可以对敌方的叫品进行，而再加倍只可以对敌方的加倍进行。 加倍和再加倍与定约人的定约得失分密切相关，尤其是本来不够成局（基本分不足100分）的定约，加倍或再加倍后而达到成局时，得分相差会超过500分，失分相差一倍。因此使用加倍及再加倍都要特别慎重。 7、打牌 一个定约（无将或有将）在叫牌时被确定之后，防守方位于庄家左手的一家称为首攻人，也就是由他打出第一张牌。 首攻人的下家在首攻实现后将自己的牌全部摊开，按同花色摆成四列，此家称为明手。 明手的对家是庄家（又称定约人、暗手），他负责打明、暗两手的牌。明手出牌后，就轮到首攻人的同伴出牌，最后轮到定约人出牌。至此，桌上共有四张出过的牌，每家一张，称为一墩牌。 每家必须随出牌者出同花色的牌，如手中已无这用花色，则可用将牌（任何一张将牌都大于大于种花色的牌）将吃或垫掉一张闲牌。在一墩牌里，如果有将牌，则最大的将牌是赢牌。 第二轮的出牌由赢得第一墩的那家先出，其它仍依顺时钟方向出牌，直至十三张牌全部出完。 13墩牌打完后，定约人数清实际所得的墩数，看定约是正好完成，还是超墩或宕掉。然后计算这副牌的得分（初学者可以先不学算分，通过查表获得）。 回答者：421514625 &#8211; 高级经理 七级 10-20 23:18 1、搭档和方位 四个人打桥牌，两人为一组对另一组，分别坐在东、南、西、北的位置上。坐南、北的两人为一方，称南北方；坐东、西的两人为一方，称东西方。 2、牌和发牌 就是普通的去掉大、小王的52张扑克牌。共分梅花、方块、红心、黑桃四个花色。四种花色有高低之分，按照英文开头字母的顺序排列而成，即梅花 (Club)为C，方块(Diamond)为D，红心(Hearts)为H，黑桃(Spade)为S。每一种花色有十三张牌，顺序如下：A（最大）、K、 Q、J、10、9、8、7、6、5、4、3、2（最小）。 还有一种“花色”叫无将（NT），就是没有将牌（主牌）的意思。 发牌、叫牌、打牌都是按照顺时针方向进行。52张牌平均分配，每人13张。 3、叫牌 发牌之后、出牌之前要进行叫牌。叫牌要用特定的符号和用语来进行。按规定由发牌者首先叫牌，根据牌点的高低，发牌者可叫也可不叫（Pass），此后，再由他的下家(左手方)叫牌，依次顺时针轮流进行。 如果四家全都不叫，这副牌就宣告作废，由下家重新发牌。 [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>四个人玩,对面两人为一队.判定胜负比较麻烦,通常是有计分规则.按照你手中牌的点数,叫牌以及有无局并参照计分规则来判定.一般比赛分队式或复式两种.<br />
想学的话,先买本书看看,了解叫牌规则,点数规则和花色大小.重要的是你必须得有一个好的搭档.共同进步.<span id="more-1311"></span></p>
<p>规则<br />
1、搭档和方位</p>
<p>四个人打桥牌，两人为一组对另一组，分别坐在东、南、西、北的位置上。坐南、北的两人为一方，称南北方；坐东、西的两人为一方，称东西方。</p>
<p>2、牌和发牌</p>
<p>就是普通的去掉大、小王的52张扑克牌。共分梅花、方块、红心、黑桃四个花色。四种花色有高低之分，按照英文开头字母的顺序排列而成，即梅花 (Club)为C，方块(Diamond)为D，红心(Hearts)为H，黑桃(Spade)为S。每一种花色有十三张牌，顺序如下：A（最大）、K、 Q、J、10、9、8、7、6、5、4、3、2（最小）。</p>
<p>还有一种“花色”叫无将（NT），就是没有将牌（主牌）的意思。</p>
<p>发牌、叫牌、打牌都是按照顺时针方向进行。52张牌平均分配，每人13张。</p>
<p>3、叫牌</p>
<p>发牌之后、出牌之前要进行叫牌。叫牌要用特定的符号和用语来进行。按规定由发牌者首先叫牌，根据牌点的高低，发牌者可叫也可不叫（Pass），此后，再由他的下家(左手方)叫牌，依次顺时针轮流进行。</p>
<p>如果四家全都不叫，这副牌就宣告作废，由下家重新发牌。</p>
<p>当一家开叫后，任何一家可以根据花色类别的次序在更高水平上争叫，只要在前一家同类墩数上叫更高一个数或在更高一类（花色或无将）上叫同一墩数均可。类别的排列如下，无将（最高）、黑桃、红心、方块、梅花（最低）所以叫一个黑桃比叫一个红心高，叫一个梅花比叫一个无将高。直到三家不叫表示承认为止。叫得最高的那个花色就是将牌花色(或无将)，而该级别的数字就是定约的水平，两者合称定约。</p>
<p>叫牌的目的是使同伴之间互通牌情，以便找到最佳定约，或者干扰对方选择出最有利的定约，以此达到战胜敌方的目的。</p>
<p>4、局况：</p>
<p>为了给游戏的双方创造较为复杂的形势，从而让牌手能够更好地发挥出自己的水平，桥牌活动特意设置了“局况”。</p>
<p>有局的一方胜则多得分，败则多输分，而无局的一方则又可以利用败了输分少这一条件与对方竞争。有局方和无局方的不同奖分和罚分（记分表）。</p>
<p>桥牌的有局和无局是人为规定的，不可变更。每副牌都有固定的牌号、发牌人、局况。</p>
<p>通常，人们用“—”代表双方无局，NS代表南北有局，EW代表东西有局，B代表双方有局。</p>
<p>5、定约</p>
<p>所谓定约，是指经过叫牌最后由一方确定经另一方同意的一个叫牌级数协定。确定定约的一方称定约方，其宗旨是要完成定约；同意的一方称防守方，其目标是击垮敌方的定约。</p>
<p>定约分有将定约和无将定约两种。有将定约是确定某一花色为将牌。将牌除可以在本花色中赢墩外，还可以将吃其他三门花色（假如没有这个花色的话）。</p>
<p>无将定约就是没有将牌的定约，其输赢只根据同一花色中的每一张牌的大小来比较。（假如你没有这个花色，只好出其他花色，这称为垫牌，不论大小，都不能赢墩）。</p>
<p>定约又分成局定约和不成局定约，定约分数满100分的，叫做成局定约，定约分数不足100分的，叫做不成局定约。两者的奖分和罚分都不一样（记分表）。</p>
<p>6、加倍和再加倍</p>
<p>加倍是叫牌过程中经常出现的一个名词，它的原意为防守方的一家认为定约方的定约肯定会被己方击败，他就叫“加倍”以示惩罚。现在在加倍的含义已经被引伸为各种意义，不再单独作为惩罚而用。</p>
<p>如定约方对防守方所叫的“加倍”不以为然，相信己方仍有把握完成定约时，可叫“再加倍”来惩罚加倍方。再加倍定约，定约方的得失分均按四倍（基本分乘以4）计算。加倍的符号用“X”表示，再加倍的符号用“XX”表示。</p>
<p>加倍只可以对敌方的叫品进行，而再加倍只可以对敌方的加倍进行。</p>
<p>加倍和再加倍与定约人的定约得失分密切相关，尤其是本来不够成局（基本分不足100分）的定约，加倍或再加倍后而达到成局时，得分相差会超过500分，失分相差一倍。因此使用加倍及再加倍都要特别慎重。</p>
<p>7、打牌</p>
<p>一个定约（无将或有将）在叫牌时被确定之后，防守方位于庄家左手的一家称为首攻人，也就是由他打出第一张牌。</p>
<p>首攻人的下家在首攻实现后将自己的牌全部摊开，按同花色摆成四列，此家称为明手。</p>
<p>明手的对家是庄家（又称定约人、暗手），他负责打明、暗两手的牌。明手出牌后，就轮到首攻人的同伴出牌，最后轮到定约人出牌。至此，桌上共有四张出过的牌，每家一张，称为一墩牌。</p>
<p>每家必须随出牌者出同花色的牌，如手中已无这用花色，则可用将牌（任何一张将牌都大于大于种花色的牌）将吃或垫掉一张闲牌。在一墩牌里，如果有将牌，则最大的将牌是赢牌。</p>
<p>第二轮的出牌由赢得第一墩的那家先出，其它仍依顺时钟方向出牌，直至十三张牌全部出完。</p>
<p>13墩牌打完后，定约人数清实际所得的墩数，看定约是正好完成，还是超墩或宕掉。然后计算这副牌的得分（初学者可以先不学算分，通过查表获得）。<br />
回答者：421514625 &#8211; 高级经理 七级 10-20 23:18<br />
1、搭档和方位</p>
<p>四个人打桥牌，两人为一组对另一组，分别坐在东、南、西、北的位置上。坐南、北的两人为一方，称南北方；坐东、西的两人为一方，称东西方。</p>
<p>2、牌和发牌</p>
<p>就是普通的去掉大、小王的52张扑克牌。共分梅花、方块、红心、黑桃四个花色。四种花色有高低之分，按照英文开头字母的顺序排列而成，即梅花 (Club)为C，方块(Diamond)为D，红心(Hearts)为H，黑桃(Spade)为S。每一种花色有十三张牌，顺序如下：A（最大）、K、 Q、J、10、9、8、7、6、5、4、3、2（最小）。</p>
<p>还有一种“花色”叫无将（NT），就是没有将牌（主牌）的意思。</p>
<p>发牌、叫牌、打牌都是按照顺时针方向进行。52张牌平均分配，每人13张。</p>
<p>3、叫牌</p>
<p>发牌之后、出牌之前要进行叫牌。叫牌要用特定的符号和用语来进行。按规定由发牌者首先叫牌，根据牌点的高低，发牌者可叫也可不叫（Pass），此后，再由他的下家(左手方)叫牌，依次顺时针轮流进行。</p>
<p>如果四家全都不叫，这副牌就宣告作废，由下家重新发牌。</p>
<p>当一家开叫后，任何一家可以根据花色类别的次序在更高水平上争叫，只要在前一家同类墩数上叫更高一个数或在更高一类（花色或无将）上叫同一墩数均可。类别的排列如下，无将（最高）、黑桃、红心、方块、梅花（最低）所以叫一个黑桃比叫一个红心高，叫一个梅花比叫一个无将高。直到三家不叫表示承认为止。叫得最高的那个花色就是将牌花色(或无将)，而该级别的数字就是定约的水平，两者合称定约。</p>
<p>叫牌的目的是使同伴之间互通牌情，以便找到最佳定约，或者干扰对方选择出最有利的定约，以此达到战胜敌方的目的。</p>
<p>4、局况：</p>
<p>为了给游戏的双方创造较为复杂的形势，从而让牌手能够更好地发挥出自己的水平，桥牌活动特意设置了“局况”。</p>
<p>有局的一方胜则多得分，败则多输分，而无局的一方则又可以利用败了输分少这一条件与对方竞争。有局方和无局方的不同奖分和罚分（记分表）。</p>
<p>桥牌的有局和无局是人为规定的，不可变更。每副牌都有固定的牌号、发牌人、局况。</p>
<p>通常，人们用“—”代表双方无局，NS代表南北有局，EW代表东西有局，B代表双方有局。</p>
<p>5、定约</p>
<p>所谓定约，是指经过叫牌最后由一方确定经另一方同意的一个叫牌级数协定。确定定约的一方称定约方，其宗旨是要完成定约；同意的一方称防守方，其目标是击垮敌方的定约。</p>
<p>定约分有将定约和无将定约两种。有将定约是确定某一花色为将牌。将牌除可以在本花色中赢墩外，还可以将吃其他三门花色（假如没有这个花色的话）。</p>
<p>无将定约就是没有将牌的定约，其输赢只根据同一花色中的每一张牌的大小来比较。（假如你没有这个花色，只好出其他花色，这称为垫牌，不论大小，都不能赢墩）。</p>
<p>定约又分成局定约和不成局定约，定约分数满100分的，叫做成局定约，定约分数不足100分的，叫做不成局定约。两者的奖分和罚分都不一样（记分表）。</p>
<p>6、加倍和再加倍</p>
<p>加倍是叫牌过程中经常出现的一个名词，它的原意为防守方的一家认为定约方的定约肯定会被己方击败，他就叫“加倍”以示惩罚。现在在加倍的含义已经被引伸为各种意义，不再单独作为惩罚而用。</p>
<p>如定约方对防守方所叫的“加倍”不以为然，相信己方仍有把握完成定约时，可叫“再加倍”来惩罚加倍方。再加倍定约，定约方的得失分均按四倍（基本分乘以4）计算。加倍的符号用“X”表示，再加倍的符号用“XX”表示。</p>
<p>加倍只可以对敌方的叫品进行，而再加倍只可以对敌方的加倍进行。</p>
<p>加倍和再加倍与定约人的定约得失分密切相关，尤其是本来不够成局（基本分不足100分）的定约，加倍或再加倍后而达到成局时，得分相差会超过500分，失分相差一倍。因此使用加倍及再加倍都要特别慎重。</p>
<p>7、打牌</p>
<p>一个定约（无将或有将）在叫牌时被确定之后，防守方位于庄家左手的一家称为首攻人，也就是由他打出第一张牌。</p>
<p>首攻人的下家在首攻实现后将自己的牌全部摊开，按同花色摆成四列，此家称为明手。</p>
<p>明手的对家是庄家（又称定约人、暗手），他负责打明、暗两手的牌。明手出牌后，就轮到首攻人的同伴出牌，最后轮到定约人出牌。至此，桌上共有四张出过的牌，每家一张，称为一墩牌。</p>
<p>每家必须随出牌者出同花色的牌，如手中已无这用花色，则可用将牌（任何一张将牌都大于大于种花色的牌）将吃或垫掉一张闲牌。在一墩牌里，如果有将牌，则最大的将牌是赢牌。</p>
<p>第二轮的出牌由赢得第一墩的那家先出，其它仍依顺时钟方向出牌，直至十三张牌全部出完。</p>
<p>13墩牌打完后，定约人数清实际所得的墩数，看定约是正好完成，还是超墩或宕掉。然后计算这副牌的得分（初学者可以先不学算分，通过查表获得）。<br />
详细规则、胜负判定方法牌<br />
桥牌所使用的52张扑克牌，共分梅花、方块、红心、黑桃四个花色。四种花色有高低之分，按照英文各自开头一个字母的顺序排列而成，即梅花 (Club)为C，方块(Diamond)为D，红心(Hearts)为H，黑桃(Spade)为S。其中梅花和方块为低级花色，每墩20分；红心和黑桃为高级花色，每墩30分。每一种花色有十三张牌，顺序如下：A（最大）、K、Q、J、10、9、8、7、6、5、4、3、2（最小）。<br />
52张牌平均分配，每人13张；其中6墩为本底墩数，6张以上的牌方可算作赢墩。如果用户做4H定约，就是红心为将牌，取到10墩牌。桥牌规则规定，定约基本分达100分以上者方算成局，否则为未成局。成局分别奖300分和500分，未成局只奖50分。也就是说，要想成局，梅花和方块必须定约到5以上，即拿足11墩牌；红心和黑桃只需定约到4，即拿到10墩就行了。除了有将定约以外，桥牌中还有无将定约(No Trump)，即打无主牌，这种定约第一墩为40分，第二墩以后均为30分，也就是说，无将定约达3级时，即拿到9墩牌时便成局了。<br />
叫牌<br />
发牌之后出牌之前要进行叫牌。叫牌要用特定的符号和用语来进行。按规定由发牌者首先叫牌(通常是北，以后轮换)，根据牌点的高低，发牌者可叫也可不叫，此后，再由他的下家(左方)叫牌，依次顺时针轮流进行。如果四家全都不叫，这副牌就宣告作废，由下家重新发牌。<br />
当一家开叫后，任何一家可以根据花色类别的次序在更高水平上争叫，只要在前一家同类墩数上叫更高一个数或在更高一类（花色或无将）上叫同一墩数均可。类别的排列如下，无将（最高）、黑桃、红心、方块、梅花（最低）所以叫一个黑桃比叫一个红心高，叫一个梅花比叫一个无将高。直到三家不叫表示承认为止。叫得最高的那个花色就是将牌花色(或无将)，而该级别的数字就是定约的水平，两者合称定约。叫牌的目的是使同伴之间互通牌情，以便找到最佳定约，或者干扰对方选择出最有利的定约，以此达到战胜敌方的目的。<br />
在叫牌过程中，后一位叫牌者所叫的内容必须在花色或数量上超过前一位叫牌者所叫的内容。例如北开叫1NT，东争叫2H，南持梅花套，必须应 3C；西支持同伴，叫3H即可。 ? 局况：为了给游戏的双方创造较为复杂的形势，从而让牌手能够更好地发挥出自己的水平，桥牌活动特意设置了&#8221;局况&#8221;这一关目。有局的一方胜则多得分，败则多输分，而无局的一方则又可以利用败了输分少这一条件与对方竞争。有局方和无局方的不同奖分和罚分将在下面论述。桥牌的有局和无局是人为规定的，不可变更。通常，人们用EW代表东西有局， NS代表南北有局，B代表双方有局，&#8221;-&#8221;代表双方无局。定约所谓定约，是指经过叫牌最后由一方确定经另一方同意的一个叫牌级数协定。确定定约的一方称定约方，其宗旨是要完成定约；同意的一方称防守方，其目标是击垮敌方的定约。<br />
定约分有将定约和无将定约两种。有将定约是确定某一花色为将牌。将牌除可以在本花色中赢墩外，还可以将吃其他三门花色（假如没有这个花色的话）。<br />
无将定约就是没有将牌的定约，其输赢只根据同一花色中的每一张牌的大小来大家假如用户没有这个花色，只好出其他花色，这称为垫牌，不论大小，都不能赢墩）。<br />
定约又分成局定约和不成局定约，定约分数满100分的，叫做成局定约，定约分数不足100分的，叫做不成局定约。两者的奖分和罚分都不一样。<br />
加倍<br />
加倍是叫牌过程中经常出现的一个名词，它的原意为防守方的一家认为定约方的定约 肯定会被己方击败，他就叫&#8221;加倍&#8221;以示惩罚。<br />
现在在加倍的含义已经被引伸为各种意义，不再单独作为惩罚而用。如定约方对防守方所叫的&#8221;加倍&#8221;不以为然，相信己方仍有把握完成定约时，可叫&#8221;再加倍&#8221;来惩罚加倍方。再加倍定约，定约方的得失分均按四倍（基本分乘以4）计算。加倍的符号用&#8221;x&#8221;表示，再加倍的符号用&#8221;xx&#8221;表示。<br />
综上所述，加倍和再加倍与定约人的定约得失分密切相关，尤其是本来不够成局（基本分不足100分）的定约，加倍或再加倍后而达到成局时，得分相差会超过500分，失分相差一倍。因此使用加倍及再加倍都要特别慎重。<br />
打牌<br />
一个定约（无将或有将）在叫牌时被确定之后，防守方位于庄家左手的一家称为首攻人，也就是由他打出第一张牌。首攻人的下家在首攻实现后将自己的牌全部摊开，按同花色摆成四列，此家称为明手。明手的对家是庄家（又称定约人、暗手），他负责打明、暗两手的牌。明手出牌后，就轮到首攻人的同伴出牌，最后轮到定约人出牌。至此，桌上共有四张出过的牌，每家一张，称为一墩牌。每家必须随出牌者出同花色的牌，如手中已无这用花色，则可用将牌（任何一张将牌都大于大于种花色的牌）将吃或垫掉一张闲牌。在一墩牌里，如果有将牌，则最大的将牌是赢牌。第二轮的出牌由赢得第一墩的那家先出，其它仍依顺时钟方向出牌，直至十三张牌全部出完。<br />
上手基本简单玩法<br />
为了正确叫牌，必须知道用户手上牌的实力，说起来容易，但做起来就难了。用户手上牌的真正实力取决于以下条件：大牌、长短花色、与同伴的牌搭配得好不好、敌方持有大牌的位置、与同伴打牌水平的高低、敌方打牌水平的高低。这只是开始！还要留意哪些牌手情绪饱满，哪些牌手士气低落；哪一对相互配合默契；或是哪一位喝得太多了；哪一位找机会就揶揄别人等等。这些都可能是影响因素。这种不可知性正是桥牌的魅力之一。<br />
巅峰游戏评分、升级办法<br />
相关竞赛方式、记分方式简介<br />
1．复式记分系统<br />
· 一副牌如果被若干桌不同的选手打过以后，由服务器去掉若干个最高分和最低分后计算出平均值。每副牌的结果分别以队式赛方式与平均值进行比较，差值转换为IMP，既参赛选手在此副牌的得分。<br />
· 当一个结果产生时，若总结果数大于等于6个，则当时为4位牌手记分；小于6时，暂记0分，等结果数达到6个时一次为这24位牌手统一记分。一副牌的总结果数等于40时，这副牌不再使用。<br />
· 复式记分系统实际是一种复式双人赛，既比赛的组织形式是双人赛，但要求选手使用队式赛策略来处理打牌。也可以描述成一对选手参加的多桌队式赛。<br />
2．全场记分系统<br />
· 全场记分系统不再使用积分，输，赢，和，胜率这5个参数来为牌手记分，而代之以牌技指数，本周积分，本周副数，总副数和上周平均分5个参数。其中，牌技指数是这个系统的核心记分方式，它是对复式记分中的XIMP得分平衡了对手分，同伴分后得到的一个百分比分数，能够更科学得反映参赛牌手的水平。<br />
· 复式记分系统的积分不是动态变动的，实际上只是一个近似公平的分数。全场记分系统的每周积分是动态变动的。<br />
· 加入记分周期概念，牌库每周更新，Rate每周重新评定一次。这样可以更好地体现每位牌手的最近期的水平。<br />
· 全场记分系统对IMP和MP记分都支持。现在推出测试的是XIMP系统。<br />
· 牌技指数（以下简称Rate）的计算方法。以XIMP系统为例：首先，对每副牌计算所有结果应得的比较IMP分。方法如下：一个人在一副牌上的得分为：根据结果数的多少，去掉若干个最高分和最低分，将其他所有基本分求平均，得出平均得分；一个用户在这副牌上的得分是他得到的基本分与该平均得分的差折成 IMP; 然后，每周为每位用户计算一次牌技指数，方法如下：对任一位用户，他本周的Rate就是他本周打过的所有牌的Rate的平均值。一个用户在一副牌上的 Rate是他在这副牌的得分经过对本桌4个人的Rate加权计算得出。这里，将体现出对手水平和同伴水平的平衡作用。最后，再将这个用户的本周Rate与原Rate经过副数加权计算出这个人最后的Rate。玩家过去所取得的成绩在等级评定时，会随着时间的推移逐渐降低比重。<br />
3. VP队式赛<br />
· 参赛选手分成2队，每队4人与另一队进行比赛，比赛可以自定8副牌、12副牌或16副。比赛结束后对2队的得分进行比较，差值分别转换成IMP，各队所得累计IMP的差值最终折合成VP。<br />
· VP队式赛是最具对抗性的桥牌比赛，同时需要参赛选手有很强的合作精神和团队精神。队式赛打法特别强调安全，超墩对VP队式赛的结果影响非常小。<br />
· 比赛结束后，选手就可以从我们的主页上查到比赛的结果。4.梯级挑战赛每一个自由组合的队或帮派都可以在梯级允许范围内向任何人进行挑战，如果挑战成功就可以取代他的位置。哪个队才是巅峰的超级TEAM，哪个帮派才是巅峰桥牌的第一大帮呢？目前巅峰桥牌梯级挑战赛已经举办了将近一年，现在是第二期，共有160支桥牌队参赛，是全球最大的网上桥牌队式比赛系统。<br />
5．双人赛系统（支持单冠军和双冠军两种比赛模式）<br />
· 参赛选手以对为单位在巅峰桥牌比赛报名页面报名，比赛时到指定的双人赛服务器按照系统安排的座位就坐参赛。比赛分多轮，每轮是一个房间，选手要依次进入各个轮次的比赛房间参赛。<br />
· 比赛结束后，由系统管理员公布比赛成绩。一般会在桥牌主页或桥牌论坛中公布。<br />
6．瑞士移位自动双人赛系统<br />
· 巅峰桥牌瑞士移位自动双人赛系统是一个自动的网上双人赛系统。实现自动报名，自动记分，自动按瑞士移位方式排定座位，自动给出比赛名次，自动为优胜者设置大师分。这个系统的目的是实现桥牌网上双人赛的完全自动化，争取做到不需要管理员的参与。<br />
· 报名：系统服务器开启时，第一个房间是报名室。一对牌手只需在报名室南北座位上对坐并举手，停留几十秒钟，系统就会提示报名成功，报名过的对子不能重复报名。选手们在报名时注意，先坐下的一方如果发现对方不是用户希望的搭档，可以先不举手，并请他离开（赶走他也可以）。<br />
· 瑞士移位：是一种排定座次的方法，目的是使每轮比赛都是积分相近的相遇。第一轮的座次是按报名先后排定的，以后每轮按照各对选手当前的积分排定座次，积分高的在前。<br />
· 记分方法：系统支持XIMP，总IMP和MP三种记分方法。<br />
· 比赛安排和时间控制：系统在第一轮开始前一定时间启动，此时只有报名室。第一轮开始时间到，系统自动创建第一轮房间，且排好座次，选手们按系统指定的座位就坐开始比赛。第一轮结束时间到，系统自动切断未完成的牌副（以后也不能补打），计算本轮得分并累积到每对选手的总分上，同时按瑞士方案排定第二轮的座次，创建第二轮房间，以后每轮都是如此。系统保留所有已完成牌副的详细记录，比赛完成后可随时查看。<br />
· 比赛结果：完成比赛总牌数一定比例（一般为60%到80%）的对子算完成比赛。全部比赛结束后，系统计算所有参赛对子（包括在最后一轮前已经弃权的对子）的总积分，为所有完成比赛的对子排定名次。积分相同的，完成副数多的在前，完成副数也一样的，先报名的在前。<br />
· 巅峰大师分授予：每场比赛的第一名3个大师分。完成比赛的选手超过20对（含）时，2，3，4名2个大师分，5-10名1个大师分。完成比赛的对子不足20时，排名在半数之前的都授予大师分，第一名3个，其后1-3个2分，其余1分。<br />
· 结果查询：比赛最后一轮一结束，结果马上自动生成，用户当时就可以查询结果。结果查询的首页显示最近若干场比赛，选择用户要查询的一场比赛进入该场比赛的结果页面。该页显示所有参加了这场比赛（包括未完成比赛的）的对子的名次，总积分，每副牌的得分等信息，点击任何一副牌的得分，进入该副牌的比较结果页面。该页给出这副牌的若干个结果的详细信息。在桥牌结果查询页面选择&#8221;瑞士移位自动双人赛&#8221;即可查询比赛结果。<br />
7．桥牌比赛转播系统<br />
用类似Vugraph的方式追踪桥牌队式比赛的全过程，旁观者随时可以了解开闭两室的比赛进程和对比结果。<br />
8．贴点服务<br />
以上功能都只面向会员提供，而非会员可以参加贴点赛。即每副牌的得分转换为IMP，并与得分方联手点力之和进行比较，差值为本副牌的成绩。此种比赛鼓励低点进局进贯，但不鼓励牺牲叫和多点冒叫。<br />
桥牌游戏等级详述（等级称号、升级、降级标准）<br />
桥牌选手的等级不同于其他游戏，是根据巅峰大师分的多少确定的。而巅峰大师分只能在巅峰的各类比赛中获得。牌手共分12级，从低到高分别是：<br />
无等级，有级牌手，中级牌手，高级牌手，巅峰好手，巅峰高手，巅峰大师，巅峰明星，桥界嘉宾，桥协大师，荣誉大师，专业牌手。<br />
桥牌游戏积分说明（得分、加分、扣分、清零）<br />
桥牌比赛的计分方法分为定约方的得分和防守方的得分两种。定约方的得分=基本分+奖分。<br />
基本分便是某一定约的墩分与定约数字相乘的结果。各种定约的墩分如下：低级花色梅花或方块每墩20分，高级花色红心和黑桃每墩30分，无将定约第一墩40分，从第二墩起均为30分。定约方如果完成加倍定约，墩分要乘以2，如果完成再加倍定约，则乘以4。如：完成6S再加倍定约得分等于6 x 30 x 4 = 720。<br />
奖分分为完成定约和超额完成定约两大类：<br />
超额完成定约每一墩奖分<br />
局况 未加倍 加倍 再加倍<br />
无局 方块、梅花=20红心 、<br />
黑桃、无将=30 100 200<br />
有局 方块、梅花=20红心、 黑桃、无将=30 200 400<br />
完成定约奖分表<br />
局况 未成局定约 成局定约 小满贯 大满贯<br />
无局 50 300 500 1000<br />
有局 50 500 750 1500<br />
如果完成加倍定约，还要再加50分，完成再加倍定约再加100分。防守方的得分，实际上就是定约方的罚分。定约方完不成定约，要视局况和是否加倍给予不同程度的罚分。具体如下：如果无局每墩罚50分，有局时每墩罚100分，加倍定约还要乘2，再加倍定约还要乘4。<br />
断线扣分： 在贴点系统中，断线一次扣总积分20分。 在全场记分/复式记分系统中，断线一次扣本周分16分，断线者在这副牌上所得Rate为0。</p>
<p>又及:想会规则的话,找入门的书来看看就行了.<br />
推荐&lt;&lt;桥牌ABC&gt;&gt;,&lt;&lt;打牌原理&gt;&gt;.</p>
<p>要想打好的话,一要有个好搭档,二要多看书.<br />
另外,在网上有个老师专门教桥牌的,黄晓林老师</p>
<p>下面的网址是他在中国桥牌网上开的教学网页<br />
<a href="http://game.1001n.com.cn/bridge/other/shenger/index.htm" target="_blank">http://game.1001n.com.cn/bridge/other/shenger/index.htm</a></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/07/%e6%a1%a5%e7%89%8c%e8%a7%84%e5%88%99/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>micolog-免费GAE博客</title>
		<link>http://cq-cser.cn/2010/07/micolog-%e5%85%8d%e8%b4%b9gae%e5%8d%9a%e5%ae%a2/</link>
		<comments>http://cq-cser.cn/2010/07/micolog-%e5%85%8d%e8%b4%b9gae%e5%8d%9a%e5%ae%a2/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 06:51:29 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[WEB]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1309</guid>
		<description><![CDATA[官网http://micolog.xuming.net/zh-cn 代码：http://code.google.com/p/micolog/source/checkout 简单实用，其主页那篇高性能WEB文章也很强大 于是我也凑热闹搞了个，http://xiaofing.appspot.com/ 不过看很多XX站点也在使用MICOLOG，在GG的羽翼下，前景一般。猜测会有名单制度相对应 Related posts:CSS隐藏文字的方法 Google Wave从入门到进阶


Related posts:<ol><li><a href='http://cq-cser.cn/2009/11/css%e9%9a%90%e8%97%8f%e6%96%87%e5%ad%97%e7%9a%84%e6%96%b9%e6%b3%95/' rel='bookmark' title='Permanent Link: CSS隐藏文字的方法'>CSS隐藏文字的方法</a></li>
<li><a href='http://cq-cser.cn/2009/11/google-wave%e4%bb%8e%e5%85%a5%e9%97%a8%e5%88%b0%e8%bf%9b%e9%98%b6/' rel='bookmark' title='Permanent Link: Google Wave从入门到进阶'>Google Wave从入门到进阶</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>官网<a href="http://micolog.xuming.net/zh-cn">http://micolog.xuming.net/zh-cn</a></p>
<p>代码：<a href="http://code.google.com/p/micolog/source/checkout">http://code.google.com/p/micolog/source/checkout</a></p>
<p>简单实用，其主页那篇高性能WEB文章也很强大</p>
<p>于是我也凑热闹搞了个，<a href="http://xiaofing.appspot.com/">http://xiaofing.appspot.com/</a></p>
<p>不过看很多XX站点也在使用MICOLOG，在GG的羽翼下，前景一般。猜测会有名单制度相对应</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2009/11/css%e9%9a%90%e8%97%8f%e6%96%87%e5%ad%97%e7%9a%84%e6%96%b9%e6%b3%95/' rel='bookmark' title='Permanent Link: CSS隐藏文字的方法'>CSS隐藏文字的方法</a></li>
<li><a href='http://cq-cser.cn/2009/11/google-wave%e4%bb%8e%e5%85%a5%e9%97%a8%e5%88%b0%e8%bf%9b%e9%98%b6/' rel='bookmark' title='Permanent Link: Google Wave从入门到进阶'>Google Wave从入门到进阶</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/07/micolog-%e5%85%8d%e8%b4%b9gae%e5%8d%9a%e5%ae%a2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>随笔</title>
		<link>http://cq-cser.cn/2010/07/%e9%9a%8f%e7%ac%94-4/</link>
		<comments>http://cq-cser.cn/2010/07/%e9%9a%8f%e7%ac%94-4/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 06:53:45 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[OTHER]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1303</guid>
		<description><![CDATA[第一次调内核，纪念下哈。之前用WINXP+wrk，完全不行啊。 用的VIRTUAL 2007+WIN2003+WRK,断nt!PspCreateThread 提示：WARNING: Stack unwind information not available. Following frames may be wrong。不理解 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>第一次调内核，纪念下哈。之前用WINXP+wrk，完全不行啊。</p>
<p>用的VIRTUAL 2007+WIN2003+WRK,断nt!PspCreateThread</p>
<p>提示：WARNING: Stack unwind information not available. Following frames may be wrong。不理解</p>
<p><a href="http://cq-cser.cn/wp-content/uploads/2010/07/无标题.png"><img class="alignnone size-full wp-image-1305" title="无标题" src="http://cq-cser.cn/wp-content/uploads/2010/07/无标题.png" alt="" width="768" height="480" /></a><span id="more-1303"></span></p>
<p><a href="http://cq-cser.cn/wp-content/uploads/2010/07/1.png"><img class="alignnone size-large wp-image-1306" title="1" src="http://cq-cser.cn/wp-content/uploads/2010/07/1-1024x640.png" alt="" width="1024" height="640" /></a><a href="http://cq-cser.cn/wp-content/uploads/2010/07/1.png"></a></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/07/%e9%9a%8f%e7%ac%94-4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
