2010年12月31日星期五
2010年12月22日星期三
用IOCTL_BEEP_SET控制System Buzzer
此外,Vista 64bits, Windows 7上要么不发声音,要么是声卡发出声音。
// 以下宏定义摘自DDK中的头文件
#define FILE_DEVICE_BEEP 0x00000001
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe
#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
#define IOCTL_BEEP_SET \
CTL_CODE(FILE_DEVICE_BEEP,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
typedef struct _BEEP_SET_PARAMETERS {
ULONG Frequency;
ULONG Duration;
} BEEP_SET_PARAMETERS, *PBEEP_SET_PARAMETERS;
BOOL BeepSet (DWORD dwFreq, DWORD dwDuration)
{
HANDLE hBeep;
UNICODE_STRING BeepDevice;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
BEEP_SET_PARAMETERS BeepSetParameters;
NTSTATUS Status;
/* check the parameters */
if ((dwFreq >= 0x25 && dwFreq <= 0x7FFF) ||
(dwFreq == 0x0 && dwDuration == 0x0))
{
// print(L"Beep Params OK\n");
/* open the device */
RtlInitUnicodeString(&BeepDevice,
L"\\Device\\Beep");
InitializeObjectAttributes(&ObjectAttributes,
&BeepDevice,
0,
NULL,
NULL);
Status = NtCreateFile(&hBeep,
FILE_READ_DATA | FILE_WRITE_DATA,
&ObjectAttributes,
&IoStatusBlock,
NULL,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN_IF,
0,
NULL,
0);
if (NT_SUCCESS(Status))
{
// print(L"Createfile worked\n");
/* Set beep data */
BeepSetParameters.Frequency = dwFreq;
BeepSetParameters.Duration = dwDuration;
Status = NtDeviceIoControlFile(hBeep,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_BEEP_SET,
&BeepSetParameters,
sizeof(BEEP_SET_PARAMETERS),
NULL,
0);
/* do an alertable wait if necessary */
if (NT_SUCCESS(Status) &&
(dwFreq != 0x0 || dwDuration != 0x0) && dwDuration != (DWORD)-1)
{
// print(L"Beep Sleeping\n");
SleepEx(dwDuration,
TRUE);
}
NtClose(hBeep);
}
}
else
Status = STATUS_INVALID_PARAMETER;
if (!NT_SUCCESS(Status))
{
// SetLastErrorByStatus (Status);
return FALSE;
}
return TRUE;
}
2010年11月26日星期五
outlook自动密送设置方法(2003~2010全适用)
在outlook里面设置里面降低宏安全性;
重启outlook;
Alt+F11后,选择左侧的thisoutlooksession,在弹出的窗口中加入以下内容:
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim objRecip As Recipient
Dim strMsg As String
Dim res As Integer
Dim strBcc As String
On Error Resume Next
strBcc = "***@gmail.com" '请改成你要密送的邮件地址
Set objRecip = Item.Recipients.Add(strBcc)
objRecip.Type = olBCC
If Not objRecip.Resolve Then
strMsg = "不能解析密件抄送人邮件地址, " & _
"请确认是否仍然发送邮件?"
res = MsgBox(strMsg, vbYesNo + vbDefaultButton1, _
"不能解析密件抄送人邮件地址")
If res = vbNo Then
Cancel = True
End If
End If
Set objRecip = Nothing
End Sub
保存即可。重启outlook即可。测试outlook2003~2010都没问题。
重点是要降低宏安全性,并适当重启。代码部分只需要修改红字部分即可。本文主要代码引自这里。
2010年11月17日星期三
How to create a GIT web server on Linux
Orignal URL: http://www.kernel.org/pub/software/scm/git/docs/howto/setup-git-server-over-http.txt
Tags: GIT, Linux, Apache, WebDAV
===========================================
From: Rutger Nijlunsing <rutger@nospam.com>
Subject: Setting up a git repository which can be pushed into and pulled from over HTTP(S).
Date: Thu, 10 Aug 2006 22:00:26 +0200
Since Apache is one of those packages people like to compile
themselves while others prefer the bureaucrat's dream Debian, it is
impossible to give guidelines which will work for everyone. Just send
some feedback to the mailing list at git@vger.kernel.org to get this
document tailored to your favorite distro.
What's needed:
- Have an Apache web-server
On Debian:
$ apt-get install apache2
To get apache2 by default started,
edit /etc/default/apache2 and set NO_START=0
- can edit the configuration of it.
This could be found under /etc/httpd, or refer to your Apache documentation.
On Debian: this means being able to edit files under /etc/apache2
- can restart it.
'apachectl --graceful' might do. If it doesn't, just stop and
restart apache. Be warning that active connections to your server
might be aborted by this.
On Debian:
$ /etc/init.d/apache2 restart
or
$ /etc/init.d/apache2 force-reload
(which seems to do the same)
This adds symlinks from the /etc/apache2/mods-enabled to
/etc/apache2/mods-available.
- have permissions to chown a directory
- have git installed on the client, and
- either have git installed on the server or have a webdav client on
the client.
In effect, this means you're going to be root, or that you're using a
preconfigured WebDAV server.
Step 1: setup a bare GIT repository
-----------------------------------
At the time of writing, git-http-push cannot remotely create a GIT
repository. So we have to do that at the server side with git. Another
option is to generate an empty bare repository at the client and copy
it to the server with a WebDAV client (which is the only option if Git
is not installed on the server).
Create the directory under the DocumentRoot of the directories served
by Apache. As an example we take /usr/local/apache2, but try "grep
DocumentRoot /where/ever/httpd.conf" to find your root:
$ cd /usr/local/apache/htdocs
$ mkdir my-new-repo.git
On Debian:
$ cd /var/www
$ mkdir my-new-repo.git
Initialize a bare repository
$ cd my-new-repo.git
$ git --bare init
Change the ownership to your web-server's credentials. Use "grep ^User
httpd.conf" and "grep ^Group httpd.conf" to find out:
$ chown -R www.www .
On Debian:
$ chown -R www-data.www-data .
If you do not know which user Apache runs as, you can alternatively do
a "chmod -R a+w .", inspect the files which are created later on, and
set the permissions appropriately.
Restart apache2, and check whether http://server/my-new-repo.git gives
a directory listing. If not, check whether apache started up
successfully.
Step 2: enable DAV on this repository
-------------------------------------
First make sure the dav_module is loaded. For this, insert in httpd.conf:
LoadModule dav_module libexec/httpd/libdav.so
AddModule mod_dav.c
Also make sure that this line exists which is the file used for
locking DAV operations:
DAVLockDB "/usr/local/apache2/temp/DAV.lock"
On Debian these steps can be performed with:
Enable the dav and dav_fs modules of apache:
$ a2enmod dav_fs
(just to be sure. dav_fs might be unneeded, I don't know)
$ a2enmod dav
The DAV lock is located in /etc/apache2/mods-available/dav_fs.conf:
DAVLockDB /var/lock/apache2/DAVLock
Of course, it can point somewhere else, but the string is actually just a
prefix in some Apache configurations, and therefore the _directory_ has to
be writable by the user Apache runs as.
Then, add something like this to your httpd.conf
<Location /my-new-repo.git>
DAV on
AuthType Basic
AuthName "Git"
AuthUserFile /usr/local/apache2/conf/passwd.git
Require valid-user
</Location>
On Debian:
Create (or add to) /etc/apache2/conf.d/git.conf :
<Location /my-new-repo.git>
DAV on
AuthType Basic
AuthName "Git"
AuthUserFile /etc/apache2/passwd.git
Require valid-user
</Location>
Debian automatically reads all files under /etc/apache2/conf.d.
The password file can be somewhere else, but it has to be readable by
Apache and preferably not readable by the world.
Create this file by
$ htpasswd -c /usr/local/apache2/conf/passwd.git <user>
On Debian:
$ htpasswd -c /etc/apache2/passwd.git <user>
You will be asked a password, and the file is created. Subsequent calls
to htpasswd should omit the '-c' option, since you want to append to the
existing file.
You need to restart Apache.
Now go to http://<username>@<servername>/my-new-repo.git in your
browser to check whether it asks for a password and accepts the right
password.
On Debian:
To test the WebDAV part, do:
$ apt-get install litmus
$ litmus http://<servername>/my-new-repo.git <username> <password>
Most tests should pass.
A command line tool to test WebDAV is cadaver. If you prefer GUIs, for
example, konqueror can open WebDAV URLs as "webdav://..." or
"webdavs://...".
If you're into Windows, from XP onwards Internet Explorer supports
WebDAV. For this, do Internet Explorer -> Open Location ->
http://<servername>/my-new-repo.git [x] Open as webfolder -> login .
Step 3: setup the client
------------------------
Make sure that you have HTTP support, i.e. your git was built with
libcurl (version more recent than 7.10). The command 'git http-push' with
no argument should display a usage message.
Then, add the following to your $HOME/.netrc (you can do without, but will be
asked to input your password a _lot_ of times):
machine <servername>
login <username>
password <password>
...and set permissions:
chmod 600 ~/.netrc
If you want to access the web-server by its IP, you have to type that in,
instead of the server name.
To check whether all is OK, do:
curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/HEAD
...this should give something like 'ref: refs/heads/master', which is
the content of the file HEAD on the server.
Now, add the remote in your existing repository which contains the project
you want to export:
$ git-config remote.upload.url \
http://<username>@<servername>/my-new-repo.git/
It is important to put the last '/'; Without it, the server will send
a redirect which git-http-push does not (yet) understand, and git-http-push
will repeat the request infinitely.
Step 4: make the initial push
-----------------------------
From your client repository, do
$ git push upload master
This pushes branch 'master' (which is assumed to be the branch you
want to export) to repository called 'upload', which we previously
defined with git-config.
Using a proxy:
--------------
If you have to access the WebDAV server from behind an HTTP(S) proxy,
set the variable 'all_proxy' to 'http://proxy-host.com:port', or
'http://login-on-proxy:passwd-on-proxy@proxy-host.com:port'. See 'man
curl' for details.
Troubleshooting:
----------------
If git-http-push says
Error: no DAV locking support on remote repo http://...
then it means the web-server did not accept your authentication. Make sure
that the user name and password matches in httpd.conf, .netrc and the URL
you are uploading to.
If git-http-push shows you an error (22/502) when trying to MOVE a blob,
it means that your web-server somehow does not recognize its name in the
request; This can happen when you start Apache, but then disable the
network interface. A simple restart of Apache helps.
Errors like (22/502) are of format (curl error code/http error
code). So (22/404) means something like 'not found' at the server.
Reading /usr/local/apache2/logs/error_log is often helpful.
On Debian: Read /var/log/apache2/error.log instead.
If you access HTTPS locations, git may fail verifying the SSL
certificate (this is return code 60). Setting http.sslVerify=false can
help diagnosing the problem, but removes security checks.
Debian References: http://www.debian-administration.org/articles/285
Authors
Johannes Schindelin <Johannes.Schindelin@gmx.de>
Rutger Nijlunsing <git@wingding.demon.nl>
Matthieu Moy <Matthieu.Moy@imag.fr>
2010年11月16日星期二
this指针为NULL的故障排除
首先想到的是函数声明杂乱导致的堆栈错误,由于代码量大,一连查了好多天都没结果。
在Google上偶然发现了一个线索,可能是对象没有创建。
虽然看起来不像是这个原因,因为本来在类成员函数中运行的好好的,是执行到某处突然出现的问题。但在简单排查后确实发现这个类对象创建失败了,而且程序没有检查这个失败直接把对象指针当作有效值传进了函数。
总结一下,要是发现this指针为NULL,一定要检查一下这个对象是否已经创建。
2010年11月5日星期五
强制在当前窗口打开所有链接[FF]
让所有网页链接都在当前也打开,避免出现新的TAB或WINDOW,如果需要在新TAB中打开的话,可以用右键菜单打开。
具体的配置方法,在地址栏敲入 about:config,(如果出现警告窗口的话请确认)。再在Filter中敲入newwindow,就可以看到下面两个配置项
browser.link.open_newwindow和browser.link.open_newwindow.restriction,双击修改值。
1. current, 2. tab, 3. window
把两个值都修改成 1 即可。
ref:http://www.ghacks.net/2009/07/03/force-firefox-to-open-links-in-same-tab/
2010年10月19日星期二
广域网的远程唤醒
1、在路由器中设置允许“Subnet Directed Broadcasts(子网定向广播)”,并且设置端口映射,将路由器的某一端口映射到被控计算机的任意端口 。
2、只要路由器通电,主控计算机就能通过互联网向路由器发送Magic Packet,而路由器与被控计算机之间是通过网线连通的,所以可以很顺利地将Magic Packet发送到被控计算机的网卡。路由器实际上起到中间桥梁的作用。
附上能发送Magic Packet的网页Wake On Lan over the Internet
http://www.depicus.com/wake-on-lan/woli.aspx
Netmask是一个比较值得注意的地方,填错了的话,目标IP地址就会出错。
下面通过一个例子简单讲述一下广域网远程唤醒的过程
假设主控计算机为A机,被控计算机为B机
B机的所在局域网环境如下:一条ADSL接在4口路由器R1上,R1的4 个口分别连接着S1,S2,S3,S4四台交换机。B机接在S3交换机的其中一个口。
R1拨号后自动获取到的IP为12.34.56.78,B机在局域网中的IP为192.168.1.167,MAC地址为BB:BB:BB:BB:BB:BB。
在R1设置端口映射条目如下:12.34.56.78:9——>192.168.1.255:168
这里192.168.1.255为192.168.1.167所在网络的定向广播地址。
为什么不直接映射到192.168.1.167呢?因为当B机关机后,192.168.1.167这个IP不再与R1通信,R1中关于192.168.1.167的ARP条目也会很快就消失,所有与192.168.1.167这个IP通信的数据包都会被丢弃。
1.A机向12.34.56.78(255.255.255.251)这个目标IP的9号端口发送一个包含FFFFFFFFFFFF和连续重复16次BBBBBBBBBBBB(为B的MAC地址)的Magic Packet的单播包,中间经过了N个路由,该单播包顺利进入R1;
2.当R1检测到该数据包端口号为9,根据端口映射条目将该数据包的目标IP及端口号修改为192.168.1.255:168,此时该包被R1识别成定向广播包,因为R1已设置成允许Subnet Directed Broadcasts,所以该包并没有被丢弃;
3.R1将这个广播包向4个口广播,S1,S2,S3,S4所连的所有端口都收到这个广播包,即便B机处于关机状态也会收到该广播包;
B机的网卡检测到广播包中含自己MAC地址信息的Magic Packet,就会被唤醒,而其它机收到之后只会将该数据包丢弃。
4.实际应用中不建议主控计算机通过IP地址去跟路由器通讯,因为一旦路由器重新获取IP地址,远程唤醒就会失效。只要路由器支持动态域名解析(DDNS)功能,可将路由设置成IP地址变更时自动向DDNS提供商重新注册IP地址,DDNS提供商将根据你的帐号对你申请的域名进行域名解析。设置成功后就可以通过固定的域名去与路由器通讯,唤醒与该路由器直连的计算机。
2010年10月7日星期四
Quake-III代码里神奇的浮点开方函数
Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。该系列的游戏不但画面和内容不错,而且即使计算机配置低,也能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。事实上早在90年代初DOS时代,只要能在PC上搞个小动画都能让人惊叹一番的时候,John Carmack就推出了石破天惊的Castle Wolfstein, 然后再接再励,doom, doomII, Quake...每次都把3-D技术推到极致。他的3D引擎代码资极度高效,几乎是在压榨PC机的每条运算指令。当初MS的Direct3D也得听取他的意见,修改了不少API。
最近,QUAKE的开发商ID SOFTWARE 遵守GPL协议,公开了QUAKE-III的原代码,让世人有幸目睹Carmack传奇的3D引擎的原码。
这是QUAKE-III原代码的下载地址:
http://www.fileshack.com/file.x?fid=7547
(下面是官方的下载网址,搜索 “quake3-1.32b-source.zip” 可以找到一大堆中文网页的
ftp://ftp.idsoftware.com/idstuff/source/quake3-1.32b-source.zip)
我们知道,越底层的函数,调用越频繁。3D引擎归根到底还是数学运算。那么找到最底层的数学运算函数(在game/code/q_math.c), 必然是精心编写的。里面有很多有趣的函数,很多都令人惊奇,估计我们几年时间都学不完。
在game/code/q_math.c里发现了这样一段代码。它的作用是将一个数开平方并取倒,经测试这段代码比(float)(1.0/sqrt(x))快4倍:
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) ); // bk010122 - FPE?
#endif
#endif
return y;
}
函数返回1/sqrt(x),这个函数在图像处理中比sqrt(x)更有用。
注意到这个函数只用了一次叠代!(其实就是根本没用叠代,直接运算)。编译,实验,这个函数不仅工作的很好,而且比标准的sqrt()函数快4倍!要知道,编译器自带的函数,可是经过严格仔细的汇编优化的啊!
这个简洁的函数,最核心,也是最让人费解的,就是标注了“what the fuck?”的一句
i = 0x5f3759df - ( i >> 1 );
再加上y = y * ( threehalfs - ( x2 * y * y ) );
两句话就完成了开方运算!而且注意到,核心那句是定点移位运算,速度极快!特别在很多没有乘法指令的RISC结构CPU上,这样做是极其高效的。
算法的原理其实不复杂,就是牛顿迭代法,用x-f(x)/f'(x)来不断的逼近f(x)=a的根。
简单来说比如求平方根,f(x)=x^2=a ,f'(x)= 2*x,f(x)/f'(x)=x/2,把f(x)代入
x-f(x)/f'(x)后有(x+a/x)/2,现在我们选a=5,选一个猜测值比如2,
那么我们可以这么算
5/2 = 2.5; (2.5+2)/2 = 2.25; 5/2.25 = xxx; (2.25+xxx)/2 = xxxx ...
这样反复迭代下去,结果必定收敛于sqrt(5),没错,一般的求平方根都是这么算的
但是卡马克(quake3作者)真正牛B的地方是他选择了一个神秘的常数0x5f3759df 来计算那个猜测值
就是我们加注释的那一行,那一行算出的值非常接近1/sqrt(n),这样我们只需要2次牛 顿迭代就可以达到我们所需要的精度.
好吧 如果这个还不算NB,接着看:
普渡大学的数学家Chris Lomont看了以后觉得有趣,决定要研究一下卡马克弄出来的
这个猜测值有什么奥秘。Lomont也是个牛人,在精心研究之后从理论上也推导出一个
最佳猜测值,和卡马克的数字非常接近, 0x5f37642f。卡马克真牛,他是外星人吗?
传奇并没有在这里结束。Lomont计算出结果以后非常满意,于是拿自己计算出的起始
值和卡马克的神秘数字做比赛,看看谁的数字能够更快更精确的求得平方根。结果是
卡马克赢了... 谁也不知道卡马克是怎么找到这个数字的。
最后Lomont怒了,采用暴力方法一个数字一个数字试过来,终于找到一个比卡马克数
字要好上那么一丁点的数字,虽然实际上这两个数字所产生的结果非常近似,这个暴
力得出的数字是0x5f375a86。
Lomont为此写下一篇论文,"Fast Inverse Square Root"。
论文下载地址:
http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf
http://www.matrix67.com/data/InvSqrt.pdf
参考:<IEEE Standard 754 for Binary Floating-Point Arithmetic><FAST INVERSE SQUARE ROOT>
最后,给出最精简的1/sqrt()函数:
float InvSqrt(float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x; // get bits for floating VALUE
i = 0x5f375a86- (i>>1); // gives initial guess y0
x = *(float*)&i; // convert bits BACK to float
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
return x;
}
大家可以尝试在PC机、51、AVR、430、ARM、上面编译并实验,惊讶一下它的工作效率。
前兩天有一則新聞,大意是說 Ryszard Sommefeldt 很久以前看到這麼樣的一段 code (可能出自 Quake III 的 source code):
float InvSqrt (float x) {
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}
他一看之下驚為天人,想要拜見這位前輩高人,但是一路追尋下去卻一直找不到人;同時間也有其他人在找,雖然也沒找到出處,但是 Chris Lomont 寫了一篇論文 (in PDF) 解析這段 code 的演算法 (用的是 Newton’s Method,牛頓法;比較重要的是後半段講到怎麼找出神奇的 0x5f3759df 的)。
PS. 這個 function 之所以重要,是因為求 開根號倒數 這個動作在 3D 運算 (向量運算的部份) 裡面常常會用到,如果你用最原始的 sqrt() 然後再倒數的話,速度比上面的這個版本大概慢了四倍吧… XD
PS2. 在他們追尋的過程中,有人提到一份叫做 MIT HACKMEM 的文件,這是 1970 年代的 MIT 強者們做的一些筆記 (hack memo),大部份是 algorithm,有些 code 是 PDP-10 asm 寫的,另外有少數是 C code (有人整理了一份列表)。
附:牛顿迭代法快速寻找平方根
下面这种方法可以很有效地求出根号a的近似值:首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后x的值就已经相当精确了。
例如,我想求根号2等于多少。假如我猜测的结果为4,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号2了:
( 4 + 2/ 4 ) / 2 = 2.25
( 2.25 + 2/ 2.25 ) / 2 = 1.56944..
( 1.56944..+ 2/1.56944..) / 2 = 1.42189..
( 1.42189..+ 2/1.42189..) / 2 = 1.41423..
....
这种算法的原理很简单,我们仅仅是不断用(x,f(x))的切线来逼近方程x^2-a=0的根。根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入 f(x)=x^2-a得到x-(x^2-a)/(2x),也就是(x+a/x)/2。
2010年10月2日星期六
中秋節完整版
名词解释:
钟秋洁:中秋节
郭晴婕:国庆节
韩佳:寒假
方淑佳:放暑假
步尚雪:不上学
尚瓣:上班
步尚瓣:不上班
郑大钱:挣打钱
推秀:退休
钟大讲:中大奖
任敏碧:人民币
梅静:美金
尹邦:英镑
欧原:欧元
百日萌:白日梦
尚雪:上学
谢作叶:写作业
梅钱:没钱
方佳:放假
度贾、杜佳:度假
燕玉:艳遇
方韩佳:放寒假
隋澜姣:睡懒觉
车吉巴丹:扯鸡巴蛋
正文:
唉~我和钟秋洁分手了,
现在在等郭晴婕,
但实际上我特喜欢方韩佳,好想方韩佳。。。
不过她姐姐方淑佳更美,我更喜欢。。。
但我内心一直最爱步尚雪,
我多么想永远和她在一起~
方韩佳和方淑佳已经和我绝交了。。。。。步尚学确实和我在一起,但是丈母娘尚瓣也过来一起住了。。。。我很郁闷。。。。。
我最喜欢的就是步尚瓣和郑大钱这两个妹子,可惜,他们只能是我的女神啊
我爱游仁阳。希望早日遇到他,要不就早日遇到推秀或钟大讲。
任敏碧这个大众情人,我多想勾搭上啊,有机会如果还能勾搭上梅静,尹邦,欧原那就此生无憾了!可惜我现在身边只有一个百日萌,悲催!
最讨厌尚雪了,每天还有谢作叶同居,悲催生活啊!
我讨厌偶尔要碰见梅钱,每次都得请建行叔帮忙把他支走…情何以堪啊
我深爱的是方佳她哥,度贾。为了他我心都碎了…
郭晴婕后天来看望大家,我想跟她说,让郑大钱做我丈人,杜佳做我丈母娘,那样的我就可以日死步尚瓣这个小骚货了,然后找燕玉做小三,哥的一生也就完满了~
方韩佳和方淑佳已经在我尘封的记忆中了,虽然我跟尚瓣在一起,但心中深深地爱着隋澜姣,唉…….强烈的郁闷啊
你们说的那些我都没福气,每天赖在我身边的只有一位,貌似还是个少数民族女子,她的名字叫——
车吉巴丹
2010年9月25日星期六
UltraDefrag 4.4.0
Virtual Router – 用无线网卡虚拟出 WiFi 热点
Virtual Router 将一切都简化了,下载安装后,只需要 设置热点名称 > 设置热点密码 > 选择要共享的网络 > 启动虚拟路由器。
密码需要需8位以上,WPA2 加密,如果仅有一个无线网卡设备,是不需要选择共享网络的。很快,就可以在移动设备中找到热点了,当然不止支持移动设备,有无线网卡的设备都可以,比如笔记本电脑。
videocacheview
用法:用Firefox或IE打开你的视频网址→等它缓存完毕→关闭浏览器→打开VideoCacheView→右键你要的视频→另存到
2010年9月15日星期三
ATA security
The user Douggg suggested the use of a to mostly unknown security feature of modern ATA drives, which enables a user to password protect the drive it self.
So I decided to do some research into it.
The Security Mode feature set was initially created for 2½” disks (laptop disks) in about 1996.
——————————————————————————–
The optional Security Mode feature set is a password system that restricts access to user data stored on a
device. The system has two passwords, User and Master and two security levels, High and Maximum. The
security system is enabled by sending a user password to the device with the SECURITY SET PASSWORD
command. When the security system is enabled, access to user data on the device is denied after a power
cycle until the User password is sent to the device with the SECURITY UNLOCK command.
A Master password may be set in a addition to the User password. The purpose of the Master password is to
allow an administrator to establish a password that is kept secret from the user, and which may be used to
unlock the device if the User password is lost. Setting the Master password does not enable the password
system.
The security level is set to High or Maximum with the SECURITY SET PASSWORD command. The security
level determines device behavior when the Master password is used to unlock the device. When the security
level is set to High the device requires the SECURITY UNLOCK command and the Master password to
unlock. When the security level is set to Maximum the device requires a SECURITY ERASE PREPARE
command and a SECURITY ERASE UNIT command with the master password to unlock. Execution of the
SECURITY ERASE UNIT command erases all user data on the device.
The SECURITY FREEZE LOCK command prevents changes to passwords until a following power cycle. The
purpose of the SECURITY FREEZE LOCK command is to prevent password setting attacks on the security
system.
——————————————————————————–
What this seems mean is that you can set two security modes on the drives High & Maximum
In High security mode both the “user” and the “master” password is able to unlock the drive.
In Maximum only the “user” password will unlock the drive, the “master” password needs to be sent with a delete all command, that overwrites the entire disk with 0′s and then allows access to the disk.
IBM started making this widely available in their 3½” disks in 1998 as well, Microsoft later asked Seagate to build the security into their 3½ drives for the Xbox to protect them, later WD followed suit.
This means that practically all disks today have the “security features” available.
As a security precaution the devices have a function called “SECURITY FREEZE LOCK”, when this command is sent to the device it will not accept any changes to the password until next boot. The problem is that most PC manufacturers have not added this feature to the BIOS of PC’s meaning that it is theoretically possible to set the password when the PC is running, rendering the disk unreadable at next boot.
Luckily for us the windows API that sends “ATA” commands does not support the commands:
——————————————————————————–
SECURITY SET PASSWORD
-
SECURITY UNLOCK
-
SECURITY ERASE PREPARE
-
SECURITY ERASE UNIT
-
SECURITY FREEZE LOCK
-
SECURITY DISABLE PASSWORD
——————————————————————————–
So in order for someone to abuse it, that person would have to gain admin access to the PC, install a kernel mode driver that can communicate directly with the disk, and the BIOS should not have sent the “SECURITY FREEZE LOCK” command.
On the security topic Heise.de tested it, and found that it was not enough to remove the circuit board and replace it with a board from an unlocked drive. So password data is stored on the drive platters as well.
They sent the drive to IBAS (Norwegian data recovery company) who were able to recover the key.. (They call it a trade secret)
As with most closed systems it is not known is there is a master master password, though vendors claim there isn’t.
So if you want to add another security hurdle besides encryption, you find a PC with a BIOS that supports the security features, set security the maximum, encrypt the disk with your favorite encryption software. This should scare off most except the mosts adamant hackers or big brother.
There is a tool called WinAAM (German) which is used to manipulate drives acoustics, it will also tell you the current security setting of the drive (You can use it to see if your BIOS sets the SECURITY FREEZE LOCK on the drive) If it doesn’t you might consider to check for a BIOS update, and you might be lucky that the new BIOS sets it.
From what I have read I am convinced that the ATA security standard is not unbreakable, with the right experience/equipment it is still possible to bypass the ATA password, and it does not mitigate the initial problem of the possibility to extract encryption keys from RAM. But it is definitely an extra layer of security.
2010年9月9日星期四
Redhat多引导安装笔记
需要修改的文件:/root/grub/grub.conf
例:/dev/hda2 /dev/hda5分别是两个Linux的root。
合并两个root中的grub.conf文件到最新安装的系统中,删掉不需要的行。
用Windows引导程序加载Linux
以下以安装 Win2000+WindowsXP+Magic Linux+Redhat9.0 为例
(1)先将硬盘分区分好, 一般 Linux 用 EXT3 ,每个 Linux用一个Boot分区,一个Root 分区,两个Linux共享一个Swap分区,最好再留一个Fat32以便于 Windows于Linux交换数据。关于 Linux下硬盘的命名方法请参考其他文章
(2)假设分区情况如下:
Hda1:Windows2000,
Hda5:WindowsXP, Hda6:Fat32, Hda7:NTFS
Hda8:Redhat 的Boot分区(EXT3),Hda9 :Redhat的 Root(/)分区,
Hda10:Magic Linux 的Boot分区(EXT3),Hda11 :Magic Linux的 Root(/)分区,
Hda12: Swap分区(公用)
然后安装Windows 2000 ,windwosXP,Redhat,Magic ,顺序随意,但一定要将 Redhat 与 Magic Linux的引导程序(Lilo 或 Grub)安装在自己的引导分区的第一个扇区上(Hda8-Redhat,Hda10-Magic),不要安装再MBR上(理由稍后叙述) Svn中文网
安装完后会发觉Windows启动菜单里只有 Windows2000 与 WindowsXP 没有 Linux,无法进入 Linux!
接下来我们要做的是将 Linux 的启动选项加入到 启动菜单中
(3)将Linux安装光盘中的 dosutils 中的 loadlin.exe 与 vmlinuz 拷贝到一个FAT32 分区中(例如 Hda6),然后启动到DOS,转到该分区,执行 loadlin vmlinuz root=/dev/hda(x) (x) 指的是Linux安装的Root分区(本例中为 Hda9 或是Hda11,分别对应 Redhat 与 Magic),这样就能进入 Linux(magic 或 Redhat)了
(4)进入 Linux后,执行 dd if=/dev/hda(X) of=路径与文件名 bs=512 count=1
说明:a. 这条命令是将 Linux 的 启动扇区存为一个文件
b. (X) 指的是 Linux 安装的 Boot 分区(Hda8 与 Hda10 ,分别对应 Redhat 与 Magic)
c. 路径与文件名是存放文件的位置与文件名
对两个Linux的Boot分区执行命令得到两个文件
例如:dd if=/dev/hda8 of=/redhat.lnx bs=512 count=1
dd if=/dev/hda10 of=/magic.lnx bs=512 count=1
(5) 将刚刚做好的两个文件拷贝到Windows 的 C 盘(Hda1)
修改 C盘下的 boot.ini 文件添加最后两行例如: Www.Svn8.Com
[boot loader]
timeout=15
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows 2000 Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Windows XP Professional" /fastdetect
c:\magic.lnx="Magic Linux1.1 beta"
c:\Redhat.lnx="Redhat 9.0“
(6) 重启动,菜单就会出现了。
(7) 这样安装的好处在于 Linux与 Windows 互不干扰,即使要重装 Windows,也不会影响 Linux,只要备份那两个文件 (redhat.lnx 与 Magic.lnx), 重装完后放回 C盘,再按(5)中的方法修改 boot.ini 即可。
2010年8月2日星期一
2010年7月9日星期五
MSN通讯加密工具
SimpLite is free for any personal use at home or at work. If you use SimpLite for work, for instance to chat with colleagues, please purchase a SimpPro license. Also, if using Simp is part of corporate policies, the company must get enough SimpPro licenses.
2010年6月29日星期二
Control internal speaker via port 61h
10.4 Internal Speaker
10.4.1 The Speaker Interface
The PC has an internal speaker which is capable of generating beeps of different frequencies. You control the speaker by providing a frequency number which determines the pitch of the beep, then turning the speaker on for the duration of the beep.
The frequency number you provide is actually a counter value. The PC uses it to determine how long to wait between sending pulses to the speaker. A smaller frequency number will cause the pulses to be sent quicker, resulting in a higher pitch. The PC uses a base rate of 1,193,180 Hz (this frequency is generated by an oscillator chip). The frequency number tells the PC how many of these cycles to wait before sending another pulse. Thus, you can calculate the frequency number required to generate a specific frequency by the following formula:
The frequency number is a word value, so it can take values between 0 and 65,535 inclusive. This means you can generate any frequency between 18.21 Hz (frequency number = 65,535) and 1,193,180 Hz (frequency number = 1).
Figure 10-1 is a diagram of the hardware for driving the built-in speaker. OUT2 is the output of Channel 2 of the 8253-5 timer chip, GATE2 (= bit 1 of port 61h) is the enable/trigger control for the Channel 2 counter, and SPEAKER DATA (= bit 0 of port 61h) is a line that may be used independently to modulate the output waveform, e.g., to control the speaker volume.
The count and load modes selected for Channel 2 during BIOS initialization are probably the best to use for tone production. In Mode 3, the counter output is a continuous symmetrical square wave as long as the GATE line of the channel is enabled; the other modes either produce outputs that are too asymmetrical or require retriggering for each count cycle.
The frequency count is loaded into the Channel 2 COUNT register at I/O port 42h. GATE2 (bit 1 of I/O port 61h) must be set to 1 to get an output on OUT2; the SPEAKER DATA line (bit 0 of I/O port 61h) must also be set to 1 to produce a tone. Note that the remaining bits of port 61h must not be changed since they control RAM enable, keyboard clock, etc. To silence the speaker, bits 1 or 0 of port 61h are set to 0 (without disturbing the remaining bits of port 61h).
10.4.2 Generating Sounds
You can communicate with the speaker controller using IN and OUT instructions. The following lists the steps in generating a beep:
-
Send the value 182 to port 43h. This sets up the speaker.
-
Send the frequency number to port 42h. Since this is an 8-bit port, you must use two OUT instructions to do this. Send the least significant byte first, then the most significant byte.
-
To start the beep, bits 1 and 0 of port 61h must be set to 1. Since the other bits of port 61h have other uses, they must not be modified. Therefore, you must use an IN instruction first to get the value from the port, then do an OR to set the two bits, then use an OUT instruction to send the new value to the port.
-
Pause for the duration of the beep.
-
Turn off the beep by resetting bits 1 and 0 of port 61h to 0. Remember that since the other bits of this port must not be modified, you must read the value, set just bits 1 and 0 to 0, then output the new value.
The following code fragment generates a beep with a frequency of 261.63 Hz (middle C on a piano keyboard) and a duration of approximately one second:
mov al, 182 ; Prepare the speaker for the
out 43h, al ; note.
mov ax, 4560 ; Frequency number (in decimal)
; for middle C.
out 42h, al ; Output low byte.
mov al, ah ; Output high byte.
out 42h, al
in al, 61h ; Turn on note (get value from
; port 61h).
or al, 00000011b ; Set bits 1 and 0.
out 61h, al ; Send new value.
mov bx, 25 ; Pause for duration of note.
.pause1:
mov cx, 65535
.pause2:
dec cx
jne .pause2
dec bx
jne .pause1
in al, 61h ; Turn off note (get value from
; port 61h).
and al, 11111100b ; Reset bits 1 and 0.
out 61h, al ; Send new value.
Another way to control the length of beeps is to use the timer interrupt. This gives you better control over the duration of the note and it also allows your program to perform other tasks while the note is playing.
10.4.3 Frequency Table
The following table lists frequencies and frequency numbers for the three octaves around middle C on a piano keyboard.
Note | Frequency | Frequency # |
---|---|---|
C | 130.81 | 9121 |
C# | 138.59 | 8609 |
D | 146.83 | 8126 |
D# | 155.56 | 7670 |
E | 164.81 | 7239 |
F | 174.61 | 6833 |
F# | 185.00 | 6449 |
G | 196.00 | 6087 |
G# | 207.65 | 5746 |
A | 220.00 | 5423 |
A# | 233.08 | 5119 |
B | 246.94 | 4831 |
Middle C | 261.63 | 4560 |
C# | 277.18 | 4304 |
D | 293.66 | 4063 |
D# | 311.13 | 3834 |
E | 329.63 | 3619 |
F | 349.23 | 3416 |
F# | 369.99 | 3224 |
G | 391.00 | 3043 |
G# | 415.30 | 2873 |
A | 440.00 | 2711 |
A# | 466.16 | 2559 |
B | 493.88 | 2415 |
C | 523.25 | 2280 |
C# | 554.37 | 2152 |
D | 587.33 | 2031 |
D# | 622.25 | 1917 |
E | 659.26 | 1809 |
F | 698.46 | 1715 |
F# | 739.99 | 1612 |
G | 783.99 | 1521 |
G# | 830.61 | 1436 |
A | 880.00 | 1355 |
A# | 923.33 | 1292 |
B | 987.77 | 1207 |
C | 1046.50 | 1140 |
在命令行中安装Windows服务
2 On VS 2005 Express :- C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe C:\MyService.exe
2010年6月27日星期日
跨越“功夫网”工具整理
最著名的Tor,安装包的名字是vidalia,优点是稳定,通用性强,可以同时提供了socket和http代理,开源软件,出口由匿名人士提供(这不知道算是优点还是缺点)。缺点是速度比较慢。近况不太好,因为太过出名,所以一有重大事件首先被封锁的就是Tor,所以最近很不稳定,我已经有好几个月没用它了。
西厢记划。今年被炒得比较热门的工具,是利用了墙上几乎不可能被修补的漏洞从而达到穿透的效果,是穿墙工具,不是翻墙。缺点是在局域网里不好使,据官方的说法是大部分路由不完全支持某协议。因此我没穿成功过。可能优点是速度快吧,毕竟不是翻过去的,不需要通过额外的服务器中转。
I2P,貌似是利用了P2P网络,和BT软件一样,启动后会搜索节点,找得越多速度越快。优点:应该是比较稳定的,还没有被功夫网屏蔽过。在成功进入I2P的网络后,可以找到一些I2p匿名的站点(如:eepsites.i2p,I2P网络里的Google),而且你也可以假设自己的服务器发布到I2P网络。缺点:最大的缺点是只支持http网站,也就是说不能访问SSL加密的网站,原因是没有人提供https的出口,难道提供出口的人都在窥探我们的数据吗?因此安全性很令人担忧。其次是每次启动都要花几分钟时间来寻找节点,只有找到一定数量的节点后才能使用,一般是几分钟。
自由门, freegate 。和xx功有关的,不到万不得已尽量不用吧,免得被请去喝咖啡。第一次使用这个软件必然会开启IE,打开某个xx功网站,此时IE已经被设置为通过代理访问,所以对电脑菜鸟来说很方便。强烈建议设置一下,比如连接后不要打开自动打开IE之类的,完全可以做到“安静”启动。优点:启动速度,浏览下载速度都很快,一般在30KB左右,ping值也不高,500ms。缺点:和非法组织有关,小心喝咖啡;没有socket代理,只有http。
alkasir,最近才发现的,比freegate好,完全包括freegate所有优点,除了启动速度稍微有点慢,大约半分钟;而且没有freegate的缺点,出身很干净,支持socket5代理。但近况堪忧,经常长时间连不上,但依旧强烈推荐(官网暂时还能直接访问 http://alkasir.com)。
2010年6月21日星期一
Google离开中国大陆后需要知道的东西
测试环境:上海电信,上海科技网
1. http://www.google.com以及http://www.google.com.cn 都会被重定向到 http://www.google.hk。不喜欢被重定向的话,可以敲入 http://www.google.com/ncr,就可以使页面停留在 http://www.google.com 英文首页上
2. Google搜索支持加密了,访问 https://www.google.com。但在中国大陆的话敲入这个网址依旧会被重定向到香港的非加密首页,解决方法是先访问一下第一条中提到的网址 http://www.google.com/ncr,然后再去https://www.google.com。
3. Firefox内置的搜索栏中只有普通的Google搜索,添加搜索插件 https://addons.mozilla.org/en-US/firefox/addon/161901/ 就可以在搜索栏中使用Google的加密搜索功能了。
2010年6月20日星期日
[转载]twitter上的一段爱情故事
Twitter上follow了zkaip,经常听到TA说起丫头,这篇文章就是他们之间的故事。
——————————-介绍丫头———————————
嗯。介 绍一下丫头吧。丫头属龙。89年生。家在郑州。性格相当开朗,是个开心果,身高165-167,超瘦。A杯。眼睛很大。脸部表情丰富。 #marslove
丫头很灵很灵的,家里开诊所。所以,她能分辨很多各式各样的植物,而且知道很多治病偏方。看着植物的 叶子能给你讲好多关于这个植物怎样入药的方式。丫头特别招人喜欢,几乎在一个地方工作,就会有追求者,好囧。 #marslove
丫头很聪明,还体现在,曾经,她和我吹牛,看看次日股票谁猜的涨幅大。结果,连续半个月,她看的股票 次日都涨停╮( ̄▽ ̄“)╭#marslove
和丫头认 识超级偶然。那时候,丫头和我弟在同一家私募公司做股票,结果丫头在那里 很牛,很多客户喜欢她,正巧,我那时候也接触股票。然后,我们互加了QQ号。偶然间,聊上了。。 #marslove
——————————-回到三年前———————————
月光宝盒。回到三年前~~~~~~~~~~~ #marslove
那时候,俺还在灵宝黄金工作。每天上班下班,枯燥无味。还要天天吸着大量的有毒粉尘~而丫头那时候在郑州,一家证券公司工作。 我们不期而遇。加了QQ互相聊了起来。 #marslove
很有意思。我们在一起吹牛,吹水。无话不谈。话题从股票上拓展到各个方面。接着,郑州那家私募倒闭, 丫头也就没有了工作赋闲在家。我呢,下班后,陪她聊天,聊到很晚很晚,无话不谈。顺便有时候,远程修修电脑什么的。 #marslove
第一次看见丫头的真相是在QQ视频里,那时候,丫头身上有只小黄喵。丫头趴在床上和我视频。嗯!o( ̄︶ ̄)n超可爱滴。 #marslove
我们聊天打屁,丫头有天买来了米黄色的裙子,让我用QQ视频的截图给她各种照相。丫头还在我面前 给我吹气球。给我看她做好的香喷喷的饭菜(馋我),拿着呼啦圈做运动。各种鬼脸。 #marslove
和丫头在那时候,关系更进一步的时间是那天吧,那天丫头屋子停电,我电话过去,丫头讲着讲着就哭了, 那时候,她超级委屈,没有人帮助她,超多误会在那里。我默默的听她诉说, 安慰鼓励。给她讲笑话,逗她开心。夜里近1点,来电了,我迫不及待的和她一起打开了电脑 #marslove
看见丫头眼睛流下来的泪痕。我尽自己一切的可能逗她开心。那时候,我们才是真正融入了吧。丫头最后对 我说,就知道【可可最好了】,一起陪她到这么晚。 #marslove
过了几天,我们一起纠结这份情感,觉得它太像爱情,似乎又有些不对劲。那时候, 我们一起讨论来讨论去,嗯嗯,不管那么多,只要一起开心就好。还是做永远的好朋友吧 #marslove
好玩的是,不知道为什么,丫头说我的嘴唇特别好看,总是油嫩嫩的,特别吸引人,然后,透过摄像头,偷亲我嘴巴www 很有意思。 #marslove
——————————-第一次见面———————————
2008年8月15日8:00-2008年8月17日22:16 我和丫头第一次见面的时间 #marslove
第一次见面,很仓促的约定要去见她,当时丫头就震精了,因为,完全没有料到,当时一口一个拒绝,超级不情愿。我说,当时电脑坏了的时候,你不是说如果我去多好么?她说,可是现在电脑好了,也就不需要我再上门了。我说害怕我吃了你?嗯嗯。 她说害怕。结果,最后还是同意我去了 #marslove
那次去郑州之前,我仅仅只有丫头的电话,连具体位置都不知道,就这样,我们一直短信聊天到郑州。最终 我摸到了丫头的家门口。 #marslove
现实当中,那是第一次见到丫头,很高很瘦,风吹就倒的感觉。见面之 后,我们之间的感觉那是相当熟悉,没有一丝间隔,和网络上一样,在一起无所不谈。我拿出了一书包棒棒糖和游戏机。还有水果若干。我们一起分享。丫头递给我 牛奶,拿出来她的气球在我耳边突然拍破(吓唬我= =) #marslove
丫头还和我打闹,最后,在我的左右两只胳膊上各咬了一口,留下了深深的牙印。当时,屋子里还有一个第三人,就是丫头的管家婆,她在玩游戏,我和丫头观战。 #marslove
那天晚上,我们十点多出门吃饭,吃的很不舒服,最后12点钟回 到丫头家里,然后,丫头去做饭,我玩平衡球,管家婆打小游戏机。最后,近1点钟, 丫头做好饭,可是管家婆已经睡去鸟。我和丫头把两盘菜(番茄 炒鸡蛋和土豆丝)都全部吃完了。那时候,已经夜里1点半了。 #marslove
这时候再去找丫头的男同事不方便,于是我打地铺睡到了丫头的床底下。丫头和我 耳语着。我们有时候还手牵手。 #marslove
次日,我们买买菜做做饭,有爱的在火车站附近的步行街转转,被误认为情侣,丫头还被卖烤鱿鱼串的小贩的热油溅到了,去火 车站买车票(丫头去北京,我回灵宝)之后就是回窝。我去丫头同事家,丫头 和管家婆在家里睡觉 #marslove
第三天,我从丫头同事家回来,买了食物。吃了早餐,在丫头家犯了低级错误,不过,弄巧成拙,让丫头就 着牛奶洗了牛奶浴。而,管家婆今天要出门办事,正好,屋子里就剩我和丫头两个人=。= #marslove
我在丫头小床上休息,丫头也在她的小床上休息,= =,麻烦来了,休息无能,俺们总是打闹,我抢她的小熊猫,她抢我的游戏机,我挠她的胳肢窝,她挠我的脚丫子 #marslove
这时候,最戏剧的事情发生了,我抱着丫头的头,第一次偷偷的亲了她的头顶一口(隔着头发),然后,丫 头突然转过身,凑着我的脸也亲了一下,然后羞羞的转了过去,捂着脸。我心情忐忑不定,好意外! #marslove
我们继续睡觉,玩闹。突然,丫头偷袭我,看了我的嘴好一会儿,然后迅速捂着我的双眼,亲了我的嘴唇一 口。呵呵,然后害羞的捂住脸,偷偷看着我。 #marslove 这就是所谓的【偷亲门】
时间过的好快好快。不知不觉,下午5点了。我们出门买菜,买水果,准备出门的东西。顺便,还去了内衣店,帮丫头挑小内内。我和她真的无 所顾忌的╮(╯_╰)╭ #marslove
无话,回家做饭吃饭。准备去火车站。那时候,又一件让我难忘的事情出现了 #marslove
走出了屋子,到达楼梯口,丫头问我,就这样走了。真的就这样走了。我有点疑惑 。不明白什么意思。。。突然,丫头,跳到我的后背上,嗯,背我下楼。就这样,我两手提着包,背后背着大活人,走下了楼。 #marslove
就这样,丫头和我来到了火车站。我们合力把超级马里奥的一个小游戏打到251的高分。 然后,一人咬着一只大苹果,她去北京。我回灵宝。第一次见面 结束 #marslove
——————————-三年的相处———————————
就这样,三年内,我和丫头身边的事情一茬一茬,我默默的看着她和前男友分手,默默的看着她被追求,然 后,她拒绝。但是,丝毫没有想到,我可以和她在一起,我想, 北京上海十万八千里,还是做好朋友吧。这样其实挺好。 #marslove
这几年,丫 头也经常给身边的朋友提起我,很自豪的说可可怎么样怎么样,可可可好了。而我,也经常给身边的朋友说,俺家丫头怎么怎么样,俺家丫头最聪明了。我们在双方心目中的位置都很重要,嗯,好朋友。 #marslove
就在不久之前,丫头和前男友分手后,觉得现在一个人也挺好,挺开心的。反正难过的时候还有可可呢。丫头听说我有女朋友后还很开心,如果没有找到女朋友,她还叫我快点去相 亲。我们丝毫没有想到,我们俩可能在一起,我们觉得我们会一 直是好朋友 #marslove
前一段,由 于现实原因,和小多分手后,我思考了很多很多,但是,依然没有想到,会把丫头娶进门。我依然把她当作最好的好朋友。直到那天,我突然有了表白的冲动。 #marslove
——————————-表白的冲动———————————
我当时觉得有点难受,很心痛,生怕丫头会出什么事。当时就想,找机会去看看她。表白什么的也没太想过。 #marslove
2010年6月9日,丫头发短信说她家大坏蛋要回来了。郁闷。趁此机会,我发短信告诉丫头,想端午节三天去郑州看看她。结果,当时 丫头就给她父母说了,她的父母也同意了。我连问了三遍真的后,确定无误,买火车票。准备去郑州。 #marslove
这次我很激动,因为我打算过去表白,一切未来状态未知,最坏的结果,就是连朋友也做不成。那两天电话中,我旁敲侧击,说丫头可能真的做我的人。但是,没有说透。都是开玩 笑的语气。我内心忐忑。惴惴不安。 #marslove
丫头也很激动,她给她的父母说了好几遍,但是生怕误会,还专门嘱咐我不要做的太好,万一被她的父母喜 欢上就不好了。给她的父母一直强调,嗯,来的只是朋友。只是找她玩的。 #marslove
我去礼品店买了一个小礼物,然后去食品店买了点食物,去银行取了一些钱后,和丫头商量后带了一些洗漱 用品和换洗衣服。准备出发。 #marslove
——————————-第二次见面———————————
在列车上,我们都很激动。我上车后呼叫丫头发现丫头爪机欠费停机= =||大概5点半,丫头打来电话,原来之前的电话停机是 因为充话费的时候,没有冲上话费(囧),夜晚,由于要省电,我的爪机关机。没想到,次日早上6点开机的时候,就有丫头的电话急匆匆打了过来。 #marslove
丫头说,她都没有睡好觉,早上4点 半就醒了,记着要去火车站接我呢。打电话一直打到6点才打通,生怕我出什么事。怎么都睡不着。最后,在火车晚点40分钟,8点到达郑州火车站时,丫头已经在火车站外等 了近40分钟。都 困了。期间,我们打了有七八个电话 #marslove
出了车站,看见头发都没有来得及梳,匆匆赶来的丫头。我们没有一点疏离感。我们手牵手,开着玩笑,走到了公交车站。坐车,准备去丫头的家里,再那里,我和丫头再吃早饭。 #marslove
在公交车上,我们手挽手,讲着各自的故事,我还插话不经意的说出,其实上我来这里要找的是丫头你。丫头吃了一惊的说,呵呵,你肯定是逗我玩的吧。随后,我们又岔开话题,转向其他方面了。但是,丫头 很细心的,应该能够从这里听出什么来。我的想法就达到了。 #marslove
到站,下车。丫头害羞的缩回手掌。说,这里好多熟人的,被看见误会了多不好。我 哈哈一笑。跟着丫头来到了丫头的小家。 #marslove
先在丫头家吃了早饭。不知道为什么,丫头的母亲对我特别友善,笑呵呵的给我和丫 头拿出了早餐 #marslove
吃完早饭,我跟丫头进了她的小窝。蛮好的。我拿出了小礼物和书包里的食品,丫头很喜欢那个卡哇伊的礼 物。然后,丫头把桌子上的饰品拿起来,一个个给我讲来历。然后,催促我赶快躺倒床上休息,说我一定很累了。她拿起她的百福图,绣了起来。 #marslove
我做了一夜火车,很累。丫头怕干扰我。让我转过身背对着她。她在那里默默的绣东西。我闭上了双眼。Zzzz~大概一个小时之后。11点多, 我睡醒起床。丫头拉着我,给我一一的向她的家人介绍我,给她 家人一一告诉了我的名字。 #marslove
十点刚吃完饭的我们,又要吃午饭了。。。= =。。。嗯嗯,废话不多,开吃。丫头的爷爷超级好玩。我们开着各色玩笑。丫 头指了指我说,咱俩吃饭都是吧 唧吧唧的,一口一口往嘴里扒= =|| #marslove
吃完饭,丫头拉着我跑到她的小屋。告诉我,嗯嗯。你还要好好睡觉。然后,我们四点多出门玩。去植物园 玩。现在天太热了。我和丫头打了会儿小游戏,丫头种了会儿菜,偷了一下菜,合成魔法卡片,整理花园。随意聊了聊。大概2点半, 我躺倒丫头的小床上睡觉鸟。丫头去她老妈屋里睡觉 #marslove
貌似我又睡着了= =睡的很快= =。。。大概3点半,睡醒。听到丫头母亲的房间里有 笑呵呵的声音。我推开屋门走了进去,嗯哪~ o(* ̄▽ ̄*)o,原来丫头和她娘在包粽子,(丫头还是第一次包呢),丫头拉我坐下,往我的嘴里 塞了几颗花生。在我耳边说。想不想一起下来包 #marslove
我,洗了洗我的爪子。嗯哪~ o(* ̄▽ ̄*)o。坐下来包粽子。丫头包的粽子是超级迷你型,我和丫头包的粽子是直角粽子。丫头母亲包的是正三角形粽子。o(╯□╰)o~超级好玩,个性鲜明~ #marslove
——————————-植物园转圈———————————
出门在外,我载着丫头一路狂奔,在一所寺庙门口停下了车,进门去转了转转经轮。转了一圈。然后,用山泉水洗了洗双手。就步行到植物园转圈。我们边走边谈,丫头给我讲各种关于植物园有爱的小故事。我们在植物园转圈、划船,喂鱼 #marslove
从植物园出来的时候,大概已经快7点了。路边一路小吃摊,丫头对我说, 她再也不吃烤鱿鱼了,因为,上次那次见面的时候,烤鱿鱼的热油都溅到了我的身上了。我们手牵手,走进了植物园对面的体育公园。在这里,看到了孩纸们在跑道上用沙子画出的大大 的笑脸。很有爱。 #marslove
随后,丫头拉扯着我,从小道绕进了象棋公园,丫头说嗯嗯。去摸摸帅的马尾巴就好。( ̄▽ ̄“)~我们摸了摸马尾巴后。又跑进了刘禹锡 公园。 #marslove
我们看到有人在刘禹锡公园照婚纱照。 我和丫头在这里面用方便面喂小金鱼,丫头还费了老大劲儿抓了据说晒干可以迅速止血的苗圃杆子。 为此,丫头还差点掉到水里。幸亏,我拉着她,把它拉回了岸上=。=~ #marslove
看了看表。(“▔□▔)。已经八 点了。丫头的老妈竟然还没有给她电话。不过,我们也该回家了。我答应丫 头,回家给她好好讲故事。我们站在据说是龙尾巴上,看了看那条飞舞的石龙,就赶忙向家里跑。丫头拿着在水塘揪来的苗圃杆子敲我后背。还挠我痒痒肉~ #marslove
我载着丫头回窝。丫头贴着我的脸庞对我说,估计咱俩今天在一起被邻居们都看见了。她都不好意思了。╮( ̄▽ ̄“)╭大概9点到 家。我们洗了洗爪子,丫头还专门端了一碗净水让我漱漱口(说因为骑车说话嘴里要进灰的),然后开始吃饭,貌似吃了好多。丫头和我把菜都吃完了Orz #marslove
嗯嗯,然后,丫头让我去洗热水澡。坚决不同意她先洗。我就去洗澡了。洗白白归来后。丫头也去洗白白。 让我感动的是,丫头洗白白后,专门给我端了热水泡脚。她把婴 儿面霜涂到我的脸上,让我给她讲故事。我闭上眼,躺在她的小床上开始了慢 慢讲述,嗯,准备讲我的感情史 #marslove
————————————表白————————————–
不过,貌似丫头听到了我的动静,过了一会儿,丫头跑进了她的房间,看了看我。我又跟着她去了,她老妈 的房间。丫头躺在床上,继续眯眼睡觉。我捏了捏她的鼻纸和脸蛋。又回丫头小窝了。准备继续回笼觉 #marslove
过了大概五分钟,丫头,揉着眼睛来到 了她的小窝,躺到了她自己的床上。嗯嗯。还是自己的床舒服。我当时就在丫头身旁,丫头,拉住我的胳膊让我继续给她讲故事。 嗯哪~ o(* ̄▽ ̄*)o~这就是我的表白机会。 #marslove
我给丫头按照时间线,讲了发生在我身上的种种感情,自然而然,就说到,这次来郑州是要找她表白的。 #marslove
丫头,刚开始有些不相信,说我是不是逗她玩呢,开玩笑的吧。我抱住丫头,说,这都是真的,没有半点虚假。丫头问,为什 么要找她,她的缺点太多,优点米有。我说,咱们在一起很开心,这不就足够了么?我不想以后,你成别人的老婆后,咱们就不能在一起牵手了。这样多么让人难过 啊! #marslove
——————————–姥姥家玩闹———————————-
伴着电动车的嗡嗡声,丫头坐在我的身后,我开向丫头的姥姥家。杯具的事情就在我们都非常兴奋的时候发 生了。电动车开到一半,没电了(丫头乌鸦嘴好灵~)~我们像洗了热水澡一样,推着电动车推了有近一个小时,终于把电动车推到目的地╮( ̄▽ ̄“)╭ #marslove
丫头在半路陪我聊天,给我擦汗,给我搭帮手。一起和我艰难的推车(有两个大上坡)。半路上,还看到了丫头的姥爷。打招呼(* ̄- ̄)y好多人都在看着我俩笑╮(╯▽╰)╭ #marslove
到了丫头的姥姥家,我们擦擦汗,休息了好大一会儿,然后,丫头的二姨、五姨都来了,丫头老爷也回来 了,屋子里好热闹。丫头,对着我的耳边说,看二姨和五姨都在看着咱们乐呢。家里把油条(现炸)和小面包拿出来,让我们大快朵颐。 丫头的姥姥家太省了,最少一个月就2毛钱的电费。 #marslove
大概中 午11点, 丫头拉着我,跑出门到山边的沟边,和我转转圈。有的地方好危险的,只有窄窄的一条土路,还有滑坡的危险。丫头,给我讲了好多她在这里发生的趣 事,还给我介绍了各种各样不同的植物和植物的一些治病小偏方。好神奇的说。12点回家。我们开吃捞面条 #marslove
我负责消灭了包括丫头碗里部分面条,共两大碗捞面,我们俩一共消灭了,三大碗配菜。=。=。好夸张!下午,不表,在屋子里休息,丫头和我一起眯眼睡觉, 尽管还有些打闹。不过天太热了╮(╯▽╰)╭ #marslove
大概5点。我和丫头在家里吃完饭。向姥姥家旁边的小山进发。一步两步三步四步牵着手向前走,我们一直牵着手,走在马路上,走在山间小道,从极其危险的山路中开辟小路,我们下山途中还看到了两只大野兔。难走的路,我们也不放手,一个人拉着一个人走了过去。 #marslove
我们在 山顶上啊啊啊叫了几声,看了看山顶小庙后,我们归宅。丫头和我商量次日就在屋子里呆着吧,因为天实在是太热了(37°)就在准备回家的时候,电动车无法发动!叫来了丫头的父亲,用摩托车牵着电动车,把我和丫头接回了家。我这时候脑子有点晕,直接就大声叫丫头父亲爸了 #marslove
那时候,丫头前男友给她电话,想见丫头。丫头很善良,不想伤害他,很委婉的去拿父母挡驾。而前男友 对丫头确实蛮好的,丫头有些无奈。我把丫头抱住,坐在我的腿上,默默的听电话。╮(╯_╰)╭ #marslove
就这样,回到丫头家里。丫头给她的亲人们说了我和她之间的事情。他的男友似乎也有所感觉,也是为丫头 好,说只要丫头幸福就好,祝她幸福。丫 头当时就飙泪了。我抱住了丫头,此时无言。丫头说,为什么大家都对她那么好呢。 #marslove
我也把我和丫头的事情告诉了我的父母和好朋友们。很开心,得到的都是满满的祝福。丫头说,目前家里人对我还比较满意,次日,她的父亲要找我谈话呢。让我准备准备 #marslove
——————————-在家宅的第三天———————————
上午,丫头剪头发。我在丫头家里逗小孩儿玩。顺便洗洗衣服。还主动和丫头的父亲搭话,简单的介绍了一 下自己。中午包饺子的时候到了,丫头在擀皮,我凑上前和丫头父母一起包饺子。嗯嗯。感觉自己已经可以融入这个家庭。真好。 #marslove
吃完午饭。下午又和丫头滚船,一直滚到大概5点钟。我对丫头耳边说,我给你留点钱吧,这样在家里方便些,而且,我带 来了又带回去可能会丢的。丫头,当时就拒绝了。说,一个人在家不用钱的,还是我拿着比较好。我们都不是那么拿钱的人。谁拿着不一样!=。= #marslove
————————————离别————————————–
丫头整整齐齐帮我叠好衣服,让我换下她给我穿的大T恤,往我书包里塞了4个鸡蛋,最后,仔仔细细检查了一遍, 才和我一起出门去做当天仅有的最后一趟公交车。不愿让我早走 一步。 #marslove
坐上了公交车,丫头在车窗外,我拉开窗户,让丫头走到车子旁边,亲吻丫头面颊。我们挥手,嗯,我要离 开了,我们都很不舍。时间 2010年6月15日19点 #marslove
到了火车站,买到了车票,丫头迫不及待的给我电话,说,开车前这么长时间怕我无聊。电话挂掉之后,我为了省电手机关机了。2010年6月16日早上八点才开机,就听到丫头的电话。丫头,急匆匆的说,为了不影响我上火车,特地挑我发车时间十分 钟后给我电话,而且,打了近一个小时,打到12点半才握着电话不知不觉睡觉了。还没睡好 觉,早上5点半就 醒了,还是一直打电话,一直打到6点半,才又迷迷糊糊睡着。担心死了。我很感动。 #marslove
做着郑州-上海 K736次列车,于2010年6月16日15点40分到达上海。我归公司工作。 #marslove
——————————-故事还在继续———————————
原创文章,转载请注明: 转载自来自火星的一枚话痨