与互联网产品设计有关的讨论 (一)

Tagged Under : ,

以前只是搞程序开发,不太关注产品设计,现在要开发一个产品,就要转换一下自身的角色,从用户的角度考虑问题。

随着讨论时间的增加,我对一个产品的理解,对用户定位的理解,都有了很大变化。

今天是这么看待问题,十天后,观点可能完全相反了。

所以有必要把每天对某个问题的看法、思路落实到字面上,保存下来,以备日后的反思、参考。

先说说一个月以前,我觉得,一个SNS网站,就应该像开心、海内和校内一样,只做18-30岁这个年龄段的网民需要的产品,因为这部分用户是中国互联网的中坚力量,占了绝大部分比例。

作为一个刚起步的网站,用户从零开始积累的时候,应该放下自己的特色,放下自己的品味,把热门网站的热门功能,抄袭过来,说句俗话,先“圈人”,等有了一定数量的用户后,再推出自己有特色的产品。

看似挺有道理的一个观点,当时我还挺坚持的,认为这个就是真理。

一个月后的今天,我觉得这种做法是错误的。

随波逐流,是不会被用户认可的。先不谈那些热门网站已经先入为主,就说当SNS这股风潮一下子涌现到人们面前的时候,大家会产生一种SNS疲劳,这么多网站,都是一样的模式,一样的界面,一样的游戏,唯独不一样的是在每个网站都有各自的朋友圈,经常性的是一个朋友,要在三个网站都加一次好友,而另一些朋友,都在不同的网站注册,我想跟某个人联系之前,先要努力回忆一下这个朋友是在哪个网站加为好友的。甚至是当我收到过某个朋友的消息,过了几天再想看看时,实在是想不起来在哪个网站看过的。

渐渐地,我怕了,看到一个网站注册时填那么多信息我就烦,总是重复地做着相同的事,也没有从中得到什么有用的帮助。

现在的情况是,中文名叫开心的网站有4、5个,中国人就擅长搞“山寨版”,这东西搭起来也容易,UCenterHome就可以直接用,换个图片和皮肤,一个SNS就搭出来了。

就好像06年大家都玩儿视频一样,看看现在这些网站都什么状况?几家加一起估计有几个亿的资金,都投入到服务器和带宽上面了,是他们扶持了中国IDC的发展!

据说六间房要换办公地点了,优酷的情况也不是很乐观。记得北京台有个CEO访谈的节目,邀请李善友,我印象最深的一句话:在中国做视频,没有一个亿就别玩儿了。

相比,SNS的成本应该还低廉的多,所以跟风的就数不过来了。一个行业里,赚钱的就是带头的那几家,优胜劣汰的自然定律是地球上永恒的真理,没有创新的跟风者,遭到淘汰是必然的,剩下的就是根据你忽悠VC的能力决定着你烧完资金的时间问题了。

我也是受到Jeff的启发,他提到了宝宝树,这个专注于母婴的网站,让我认识到跟风是个错误的方式。

举个例子,西单的客流量很大,按理说在那里开个火锅店肯定赚钱。这句话是没错,可是现在西单已经有20家火锅店了,你再进去已经晚了,而且你的火锅店又毫无特色,甚至于还比不上现存的那20家,那你这家店必然会被淘汰掉。

如果你选择在东单开一家烤鱼店,尽管客流量远远比不上西单,但烤鱼是你的特色,而且这一带鲜有烤鱼店,那你的赚钱的机会就大得多。

这就意味着,不是非得满足大比例用户群的大比例需求,才能做得好,才能得到认可。只要你有特色,能切实满足一小部分用户的迫切需求,一样可以得到认可,得到用户的依赖。注意词组:切实满足迫切需求

按说,初为父母的人,大部分在26到30岁之间,这部分人比18到25岁之间的学生和公司职员的数量少得多,而且前提是刚有了孩子,数量就更少了。

但这部分人都有一些很明确的需求,就是:

  1. 记录与分享孩子的成长历程
  2. 与其他年轻的父母们交流育儿经验

需求也不多,就简单的几项,但这些需求我认为都是刚当上爸爸妈妈的人们非常盼望得到满足的。

因此只要你把这2项功能做深入,做精彩,让这一小部分用户满意,那你这第一步就算成功地走了出去。

宝宝树算这第一步走得好的,用户数和VC的支持就充分说明了这一点。

我只是简单用了用,体验了一下。他不是靠玲琅满目的小功能堆积出来的,而是把社区网站都有的几个基本功能根据宝宝这个主题关联到了一起,说的通俗点就是宝宝树教你一套新玩法,功能还是那些,但玩法变了,变得能让你接受,让你记住,让你知道这是他们的特色。

我自己也在设想做一个网站,列了不少功能点,我认为比较好的一个特点是这些功能都是围绕着一个核心功能展开的。这些小功能,哪个单独拿出去都毫无意义,但都跟一个核心绑定起来后,却能发挥很大作用。

Jeff问我,你的这个单一的功能点,有多少人愿意用呢?

我的回答是,当我自己是一个用户的时候,是我提出了这个需求,所以我相信也有很多用户跟我有同样的需求。尽管有这样需求的用户并不多,但我的第一步是把这有限的小部分用户“伺候”好了,其他的都是水到渠成的事儿了。

相反,那些是个人就有的需求,大部分人也知道怎么去满足,做这件事的网站也已经不在少数,如果我没有特色,没有创新,肯定搞不过已经存在的领头羊们了。

总结一下现在的观点:一开始,心不要太大,把目标定位在一小部分人,明确1、2个这部分人最迫切的需求,把它做深,做精,同时还需要创新的内容,把这第一步走好,才是现在应该做的唯一的事。

Godaddy 被封 今天解封 GFW

Tagged Under : ,

好消息!!

Godaddy 貌似解封了!!

这几天发现Godaddy.com打不开,Ping域名可以得到IP,但icmp包收不到,明显是IP被封了,可恶的GFW,你知道全世界有多少域名托管在Godaddy麽!

现在可以Ping通,打开网站时很慢,浏览器只能得到网页的Title,页面一直下载不完,估计是部分路由通了,还有一些由于各个级别的TTL导致暂时仍然无法访问吧。

不管怎么说,有希望就好!

听说mya.godaddy.com这个域名管理平台是一直可以访问的,不过速度也很慢。

如果今天暂时Ping通是“回光返照”的话,以后只能依赖于mya.godaddy.com了。

我很担忧,刚刚起步的中国互联网,会被一些封建守旧的、反人类的、无知无能的、昏庸官僚的ZF败家子儿们一步一步地毁灭掉!

PDO Quick Guide

Tagged Under : ,

Book: PHP Data Objects Layer (PDO)

Author: Ilia Alshanetsky

Download: http://down.leakon.com/software/2008/11/quebec_PDO.pdf

其实这不能算是一本书,只是一个用于演示的文档,算是一个大纲。

这个简明扼要的大纲告诉你什么是PDO,为什么推荐你在PHP5中使用PDO作为数据库操作层的封装接口。

不仅更安全,而且有更好的性能,用起来更简单。

我在做一个数据库ORM接口,参考了Propel和Doctrine的设计思想,并只针对MySQL5,不做任何框架性或通用数据库的考虑,完全是为了简单、易用和高性能。底层数据库操作依靠PDO完成。

敬请关注~~

Linux 修改 IP DNS 参数 配置

Tagged Under : ,

一、修改 IP 地址

[leakon@linux]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=219.236.108.199

NETMASK=255.255.255.192

GATEWAY=219.236.108.254

二、修改 GATEWAY

vim /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=leakon.com

GATEWAY=192.168.10.128

三、修改 DNS

[leakon@linux]$ vim /etc/resolv.conf

nameserver 202.99.160.68

nameserver 202.99.168.8

四、重新加载网络配置

/etc/init.d/network restart

修改 IP 地址

  • 即时生效
    # ifconfig eth0 192.168.10.108 netmask 255.255.255.0
  • 启动生效
    vim /etc/sysconfig/network-scripts/ifcfg-eth0

修改 Default Gateway

  • 即时生效
    # route add default gw 192.168.10.192
  • 启动生效
    vim /etc/sysconfig/network-scripts/ifcfg-eth0

修改 DNS

  • vim /etc/resolv.conf
  • 修改后立即生效,启动亦有效

修改 Host Name

  • 即时生效:
    # hostname leakon.com
  • 启动生效:
    vim /etc/sysconfig/network

MySQLi vs MySQL

Tagged Under :

Background
Between participating in a MySQLi group and telling others about PHP5’s new MySQLi (MySQL improved) extension, there always seems to be a redundant (though valid) question, “Why?” Simple enough right? Maybe not, so I attempted to come up with some good benchmarks. Now note, just because of the pure nature of PHP extensions, this is easier and harder in some ways than doing let’s say, “ATI X800 vs Nvidia 6800″ type benchmarks. 

With that said, I tried my best to keep the test scripts used identical down to the variables. There will obviously be some differences as conceptually some things are different between the two extensions.

The Environment 
The benchmark hardware/software configuration is as follows:
     Processor - Intel Pentium 4 (HT) 2.6 gHz/800mHz FSB 
     Memory - 1236836K (~1.2GB) PC3200 DDR 
     Hard Drive - Seagate 250GB (7200 RPM) SATA150
     Operating System - FreeBSD
     PHP - mod_php5 with Apache2 and Zend Optimizer 
     MySQL - mysql-server4.1.11

Hardware wise, it’s not the fastest server on the face of the planet, nor is it the slowest. In fact, I think it’s a mid-level system which makes it perfect for benchmarking. I used Apache2, as I believe more people are starting to use it. I may do a future benchmark with Apache1.3.x as I do have the binaries in place. Apache will not be accepting external connections. The MySQL server has networking off. FreeBSD is running with soft updates on.

The tests 
I spent some time trying figuring out what would be a good suite of tests to run. Without saying, they’d all obviously have to be PHP scripts of some sort interacting with MySQL through the traditional MySQL extension and the new MySQLi extension. The real question was, how these scripts would be setup. I decided to take the procedural approach (though I recommend using MySQLi in the OO way), since the traditional MySQL has no OO support. Below is my attempt at it.

The MySQL table
Query caching is off.
The table structure is as follows:

DESCRIBE benchmark;
+------------+--------------+-----+----------------+
| Field      | Type         | Key | Extra          |
+------------+--------------+-----+----------------+
| PRIMARY_ID | int(11)      | PRI | auto_increment |
| FOO        | varchar(255) |     |                |
| DUMMY1     | text         |     |                |
| DUMMY2     | text         |     |                |
| DUMMY3     | char(1)      |     |                |
+------------+--------------+-----+----------------+

 

Note, the MySQL table structure should not matter for our benchmark, as we are simply executing SQL queries through different mediums.

The PHP scripts
The focus of the scripts will be around the INSERT clause. Why not SELECT you might say. Well it doesn’t matter quite frankly. We are here to benchmark the functions with identical SQL, the key phrase is “identical SQL”.

Insert SQL test - Executes an INSERT query 100,000 times on the `benchmark` table with a for loop. mysql_query and mysqli_query will be used.
Insert SQL test 2 - Builds 100,000 INSERT SQL queries into one string. mysqli_multi_query will be used.

`benchmark` is truncated after each test script runs.

How performance is guaged
Deciding how to guage performance was undoubtely the hardest part of this benchmark. I had really only 2 options. The first, to setup a simple timer in between the functions where the queries took place and calculate the difference. The other option, was to use a full out profiler. I decided to go with a profiler, as it would give me execution times for surrounding PHP code (for example, the for loop).

My two (considered) choices in the profiler category are xdebug and Zend Studio Debugger. Let me say right now, I use Zend Studio for all my PHP work and so I had a certain bias to use it’s debugger, but alas…this benchmark must do without bias! This is about performance! So I hit Google to try to make an unbias decision about this. I found that Zend Debugger had won the best debugger award from PHP Magazin and so I decided to use it for this benchmark. Now note, all profilers are pretty much the same, in that conceptually they do the same thing. So choosing one over the other for this benchmark would not have a made a difference.

Running of the tests 
So with all the formalities out of the way, it’s finally time run the test scripts. Getting anxious are you? Don’t worry, so am I :-)

  • Insert SQL test (insertsql_mysqli.php)
    Here is the run of the first profile

    A list of 9 subsequent runs and the DoInsert() function’s “own time” results (in microseconds) 

     
    DoInsert() own time
    Total execution time
      24,670.14 26,075.74
      25,132.45 26,569.09
      25,232.18 26,547.64
      25,006.92 26,289.18
      25,401.54 26,710.59
      27,792.51 29,136.76
      25,386.73 26,814.82
      25,279.91 26,575.78
    Average 25,504.32 26,859.87
    Standard Deviation 849.09 846.19


    The standard deviation is an acceptable figure, on average give or take 1 second between those runs. Then on average, DoInsert() takes about 25 seconds to run with mysqli_query. Now let’s try mysql_query.

     

  • Insert SQL test (insertsql_mysql.php)
    Here is the run of the first profile

    A list of 9 subsequent runs and the DoInsert() function’s “own time” results (in microseconds) 

     
    DoInsert() own time
    Total execution time
      24,799.11 26,134.51
      25,075.20 26,426.23
      24,685.38 26,048.15
      24,891.70 26,245.90
      25,091.64 26,299.66
      24,713.04 26,138.62
      24,741.54 26,125.89
      24,596.36 25,970.21
    Average 24,885.75 26,007.04
    Standard Deviation 229.16 489.50

    The standard deviation with mysql_query is much less. In fact, mysql_query is able to do our task about 1 second faster than with mysqli_query. Let’s try to do the same task withmysqli_multi_query.

     

  • Insert SQL test (insertsql_mysqli_multi_query.php)
    Here is the run of the profile

    53 seconds, mysqli_multi_query definately is not the best choice here. 

     

  • Insert SQL test with MySQLi statements (insertsql_mysqli_stmt.php)
    In this test, there is a source code change conceptually, so make sure you take a look.
    Here is run of the first profile

    A list of 9 subsequent runs and the DoInsert() function’s “own time” results (in microseconds)
     

     
    DoInsert() own time
    Total execution time
      24,077.77 25,179.06
      24,535.49 25,687.64
      25,232.18 26,547.64
      24,476.72 25,552.14
      24,445.86 25,551.81
      24,586.98 25,703.18
      24,582.58 25,675.57
      24,783.44 25,931.73
    Average 24,589.72 25,760.13
    Standard Deviation 318.49 376.39


    The standard deviation is an acceptable figure, on average give or take half a second between those runs. Then on average, DoInsert() takes about 24 seconds to run withmysqli_stmt. I think we have enough for now that we can come to a conclusion.

 

Conclusions
The data showed that mysql_query outperforms mysqli_query head to head. For the specific task of inserting 100,000 rows into a table, using mysqli_multi_query more than doubled our script execution time. At this point, you may start wondering what the point of using MySQLi is if the traditional MySQL extension is getting the upper hand on MySQLi.

However, using MySQLi statements we got better results, in fact it outperformed mysql_query by as much as mysql_query outperformed mysqli_query. Though this might not be enough reason for you to change existing code, remember that MySQLi statements are “pre-escaped”, meaning that there is no need for you to do mysql_real_escape_string on any of the variables. It’s apparent that given this fact about MySQLi statements, if we had made the extra function call of mysql_real_escape_string to the four inserted values, we would have greatly increased our execution time (good for character escaping user input and stopping SQL injection).

While the above may not be enough reason to change existing code to use MySQLi statements, they might be good reasons to use them in the future, for both security and performance. 

[11/16/2005] Also just to mention, mysqli also implements ssh like security measures to make logins between the client and server much more secure.

In summary,

mysqli_stmt > mysql_query > mysqli_query > mysqli_multi_query

DIV POSITION LEFT TOP

Tagged Under : ,

网页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth   (包括边线的宽);
网页可见区域高: document.body.offsetHeight  (包括边线的宽);
网页正文全文宽: document.body.scrollWidth;
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop;
网页被卷去的左: document.body.scrollLeft;
网页正文部分上: window.screenTop;
网页正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;
屏幕可用工作区宽度:window.screen.availWidth;

这么多属性,不如一张图看得直观,很老的图了,不过很实用。

Javascript 字符串 数字 浏览器 性能差别

Tagged Under : ,

我在做一个 Javascript 版的公历农历转换程序,功能完成后,需要对性能做优化。计算算法是在网上找的,原作者对历法的转换很精通,但对程序性能没有仔细考虑,当计算量大的时候,会给用户的浏览器造成很大压力,给用户的感觉就好像浏览器假死一样。

我花了2天时间在性能优化上,并在不同的浏览器下做对比测试,发现一个比较重要的差别,IE、Firefox 和 Chrome 之间的区别很大。

通常,生成一个月的日历,最多需要计算42天(可参考Google Calendar,每行代表一周7天,最多可能有6行)。

性能测试的时候,我让程序连续计算3年,共36个月,1000多天。

总的运行时间是:

IE7: 2.828 s
Safari3: 1.016 s
Firefox3: 0.885 s 
Opera9: 0.765 s
Chrome: 0.281 s

这下终于见识了 Chrome 采用的 Javascript V8 引擎的强大实力! 

以上统计结果都是测试3次取结果平均值。

程序运行到这个时间量级,已经是我优化过了的,最开始的程序,完成2年的计算,也就是上述运算量的三分之二,Firefox3用了8秒左右,Chrome很棒,用了2秒,而IE,30秒过后,浏览器直接问我是否要强制停止脚本运行,实际上我还从来没有在IE上成功执行过!

关于浏览器性能的差别,你可以用IE和Chrome打开淘宝的同一个比较复杂的页面,感受一下拖拉机与飞机的区别。

上面是浏览器的差别,下面我再给一些 Javascript 程序上的差别。

我的农历转换算法,有一个关键函数,需要多次调用,这个正是性能的瓶颈所在。

观察了调用方式和次数,这个函数运行了33000多次,而总共参数的变化只有1000次左右,如果加入缓存,可以减少97%的运算量!!!

我采用hash表的方式对每个输入的key做缓存,由于函数的参数是年月日,共3个,所以需要把这3个参数拼接成一个key。

最开始,我用字符串拼接,y m d 之间用 “_” 下划线连接起来,但仅仅是一个这样的字符串操作,程序运行时间就从0.8秒增加到1.1秒,增加了将近40%的时间!!

这是不能接受的,这将使我的缓存优化方式变得毫无意义。

农历算法的大部分关键代码,都是数字上的计算,代码很多,但好像没有产生性能瓶颈,这给了我启发。

我改用数字索引,把 y m d 用加法和乘法算出类似于 20081026 这样的整数,这样运行时间从0.789 s增加到0.853 s,只有不到10%的增加。

我的缓存,只能把运行时间降低20%到30%,所以用整数索引,可以达到优化的目的。

http://leakon.googlecode.com/svn/trunk/leakon/javascript/wannianli/nice/

很愿意与大家一起分享,一起分析,一起应用~~

原创文章,请尊重我对互联网的贡献,谢谢!

position static 屏幕滚动

这个黄色背景的提示框,样式定义中 position 设置为 static,因此可以精确地定位到输入框的下方,并且覆盖住原有的内容。达到这样的效果,static 值是必须的,他使该元素脱离于原有的元素布局,可以浮动到父层容器内的任何位置。

请注意这个父层容器,通常 static 元素只能在父层元素的容器内显示,具体位置用 left 和 top 属性决定。

这本来没什么问题,不过,当浏览器的窗口不能完整容纳整个页面,而出现滚动条时,就会出现问题。

如果提示框定义在 body 元素内,那么当滚动页面时,提示框会保持与浏览器窗口的位置不变。但此时提示框与页面元素的相对位置会发生变化,也就是相对位置不同步了。

就拿图示的例子来说,向下拖拽滚动条,文字输入框会向屏幕上方移动,但黄色提示框则保持不动,因为他的 position 相对位置的参照物是浏览器,而不是页面顶部。

如果想让输入框和提示框保持同步,则需要把提示框定义在与输入框相同的父层容器内。

这时 position 的 left 和 top 的参照物就是父层容器了,拖拽滚动条,输入框和提示框的相对位置会保持不变。

从合理的角度来说,如果整个页面有多处需要提示框,则应该在 body 下面定义一个全局的 div,在需要显示的位置,通过绝对定位调整提示框的 left 和 top。

但这样没法保证页面滚动时提示框与预期位置同步。

在每个需要提示框的地方,都定义一个独立的输入框,则可以避免同步的问题,但页面会存在过多的 dom 节点,容易造成浏览器内存泄露,或者导致浏览器打开页面速度缓慢。

殊死抵抗 wga 解决微软盗版黑屏问题 Wgalogon 黑屏修复工具

Tagged Under : , , , ,

互联网的万恶之源微软,据说今天就要下黑手向广大的中国人民开战了!

作为长时间受美帝国资本主义疯狂欺压的勤劳善良的中国人民的一员,我有责任,有义务,有必要,有能力为大家收集一些用来反抗的武器!

按照微软的计划,从今天起,验证用户是否使用正版的两个程序就将发出,一旦用户升级,盗版者将接收到微软最直接明显的提醒:每小时黑屏一次。

这还只是庞大的“提醒”计划中的一部分,根据微软公布的消息,这些“提醒”措施针对WindowsXP专业版用户,以及办公软件OfficeXP、Office2003和Office2007的用户。

一旦被验证为“盗版”,用户的电脑桌面将变为黑色,并出现对话框,提示用户“是盗版软件的受害者”,与此同时,用户的办公软件界面上也将出现“盗版”相关标识。

我收集到的几个个工具,可以帮助大家迅速破解这个”提醒“。

关闭自动更新

1、我的电脑-属性-自动更新-关闭自动更新 
2、开始-运行(输入services.msc)— 禁用Office Source Engine和Automatic Updates 

 

使用批处理文件

@echo off
sfc /purgecache
reg delete “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\Wgalogon” /f
taskkill /f /im WgaTray.exe /T
del c:\Windows\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\Windows\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\Windows\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\Windows\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\WINNT\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\WINNT\system32\WgaTray.exe /f /q
taskkill /f /im WgaTray.exe /T
del c:\WINNT\system32\WgaTray.exe /f /q
echo. & pause

把上面的复制到记事本里保存,把记事本的后缀 txt 改成 bat,然后运行。

我已经给大家做好了这个批处理文件,大家可以直接下载:

http://down.leakon.com/software/2008/10/RemoveWGA_20081020.bat

 

清理注册表

开始-运行-输入REGEDIT回车,在左边栏中找到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WgaLogon项

将整个WgaLogon项删除即可。

以上为经过测试的最简便方法。

同样,我也准备好了这个文件,供大家下载:

http://down.leakon.com/software/2008/10/RemoveWGA_20081020.reg

下载完成后,只写双击运行这个注册表文件即可。

 

修复小工具

XP反盗版黑屏修复工具 2.0

新增:新加入绿色免疫功能,适用于还未出现黑屏的用户(也就是还未安装WGA补丁的)。

进行免疫之后,即便开启自动更新或者直接安装反盗版补丁也不会出现异常。

给大家提供下载:

http://down.leakon.com/software/2008/10/RemoveWGA_20081020.exe

 

希望能给大家提供有用的帮助~~

 

十年

昨天参加初中同学聚会,看到了十年没有见到的老同学。大家还都是老样子,变化不大。有些已经结婚了,有的马上要结婚。算上这个,变化就太大了。

迎风中学,初四5班。

我们的学校已经没有了,我们的教室也变样了,不过我们43个同学团结在一起度过的四年初中生活,是我们此生永远不会忘记永远不会改变的回忆。

这四年中,我当了三年班长,可能这是我给大家留下的印象比较深刻的回忆了,虽然我这个班长没有以身作则,没有给大家往好路上带。

记得那会儿,罢课、逃课、打架……,干坏事儿的时候总有我,而且其中大部分都是我带头……

昨天的聚会,我迟到了。当我同时看见12位久未谋面的同学的时候,一种特别亲切的感觉一下子把我带回了十年前。聚会前因害怕好久不见会有些生疏而产生的担心,在那一刻瞬间消失。

是的,我们5班的同学,就算再久没有见面,聚在一起,也不会有生疏的感觉!

初中同学之间的关系,应该是最单纯最真切的,没有勾心斗角,只有嬉笑怒骂。

就像张晶说的那样,我们走进社会后,会接触不同的人,结交不同类型的朋友,但那份感觉,跟初中同学的感觉是完全不同的。初中关系最好的朋友们,在十年后的今天,仍然是关系最好的朋友。我跟几个发小之间的友谊就是在初中时代建立起来的。虽然我们也不是经常见面,但每隔几个月,大家都会找机会在一起聚聚,聊聊,不会让距离淡化感情!

聚会比较有意思的一个环节,是在KTV唱歌,大家玩了一会儿后,都停了下来,每人说说聚会的感言。说着说着,大家就开始复原在回忆中保存了十年的故事,你说一句,我补充一句,让我们有些模糊的记忆又回到了最新鲜的状态~~

想说的话太多太多,积累了十年的感情,无法在几个小时内全部释放。

我离开那间教室,已经十年。

但我每次在梦中延续校园生活时,地点总是定格在那件虽然破旧但干净整齐的教室。

本来这次聚会通知了20多个人(在此表扬一下亚旎和张晶为组织大家聚会付出的努力),但由于各种原因,有些同学没能参加,我们都很遗憾。不过我知道大家都很期盼着下次聚会能见到更多曾经最为熟悉的面孔。今天是征宇举办婚礼的日子,昨天我们聚会的时候,大家都为你举杯庆贺!我也再次祝你新婚快乐!

希望5班的同学们都能身体健康,工作顺利,家庭幸福,班长祝福你们!

Google

Google
LAMP-Linux-redhat LAMP-Apache LAMP-MySQL LAMP-Php Leakon-Wiki Leakon-BBS XueBaoBao Xyoyou