javascript 面向对象 和 javascript 类

2010年9月16日 没有评论

先来看个例子:

var user = {'username':'gosoa','userage':20};
alert(user.username);

上面的js代码会alert出来 gosoa 。其中 user 就是一个javascript对象。username和userage可以看成是 user的两个属性。

再看一段代码:

var user = {
	username:'fei',
	userage:20,
	usersex:function(_username){
			if(_username=='pan'){
				return '男';
			}
			if(_username=='fei'){
				return '女';
			}
		}
};
alert(user.usersex('fei'));

在这段代码中,会alert出来 “女” 。
这里面,user是一个javascript对象,其有usersex 这样一个属性,其可以根据传递的参数,返回不同的结果。
这是 javascript对象的属性的另一种写法。

上面的两个例子是 javascript对象的创建方法。

我们再来看下 javascript类的实现。
其实 javascript类并不像java或者C#或者PHP等类一样,有 class xxx{} 这样的定义。
javascript的类 其实也是方法。看下面的例子:

function USER(uname,age){
	this.username = uname;
	this.age = age;
}

var pan = new USER('panpan',26);
alert(pan.username);

这段代码会alert出来 panpan ,function USER(uname,age)我们可以看做是定义了类,var pan = new USER(‘panpan’,26); 可以看做是实例化了一个类。this.age = age; 是类的属性。
上面的代码中,我们还可以通过 prototype 来定义类的属性。
看下面的代码示例:


function USER(){}
USER.prototype.username = 'pan';
USER.prototype.userage = 29;
USER.prototype.sex = function (_username){
    if(_username=='pan'){
        return '男';
    }else if(_username=='fei'){
        return '女';
    }
}
var pan = new USER();
alert(pan.sex('pan'));

在上面这段代码中,我们通过prototype 来给USER()类添加了一些属性和方法。
当我们 new一个 USER() 实例pan的时候,pan便拥有了 USER()的所有属性和方法。
在js中,所谓的类的继承便是通过 prototype 来实现的。

mysql-锁表机制分析

2010年8月30日 2 条评论

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。
一、概述
MySQL有三种锁的级别:页级、表级、行级。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level
locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL这3种锁的特性可大致归纳如下:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
二、MyISAM表锁
MyISAM存储引擎只支持表锁,是现在用得最多的存储引擎。
1、查询表级锁争用情况
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
mysql> show status like ‘table%’;
+———————–+———-+
| Variable_name | Value |
+———————–+———-+
| Table_locks_immediate | 76939364 |
| Table_locks_waited | 305089 |
+———————–+———-+
2 rows in set (0.00 sec)Table_locks_waited的值比较高,说明存在着较严重的表级锁争用情况。

2、MySQL表级锁的锁模式
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write
Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
下面通过例子来进行验证以上观点。数据表gz_phone里有二百多万数据,字段id,phone,ua,day。现在同时用多个客户端同时对该表进行操作分析。
a、当我用客户端1进行一个比较长时间的读操作时,分别用客户端2进行读和写操作:
client1:
mysql>select count(*) from gz_phone group by ua;
75508 rows in set (3 min 15.87 sec) client2:
select id,phone from gz_phone limit 1000,10;
+——+——-+
| id | phone |
+——+——-+
| 1001 | 2222 |
| 1002 | 2222 |
| 1003 | 2222 |
| 1004 | 2222 |
| 1005 | 2222 |
| 1006 | 2222 |
| 1007 | 2222 |
| 1008 | 2222 |
| 1009 | 2222 |
| 1010 | 2222 |
+——+——-+
10 rows in set (0.01 sec)
mysql> update gz_phone set phone=’11111111111′ where id=1001;
Query OK, 0 rows affected (2 min 57.88 sec)
Rows matched: 1 Changed: 0 Warnings: 0
说明当数据表有一个读锁时,其它进程的查询操作可以马上执行,但更新操作需等待读锁释放后才会执行。
b、当用客户端1进行一个较长时间的更新操作时,用客户端2,3分别进行读写操作:
client1:
mysql> update gz_phone set phone=’11111111111′;
Query OK, 1671823 rows affected (3 min 4.03 sec)
Rows matched: 2212070 Changed: 1671823 Warnings: 0 client2:
mysql> select id,phone,ua,day from gz_phone limit 10;
+—-+——-+——————-+————+
| id | phone | ua | day |
+—-+——-+——————-+————+
| 1 | 2222 | SonyEricssonK310c | 2007-12-19 |
| 2 | 2222 | SonyEricssonK750c | 2007-12-19 |
| 3 | 2222 | MAUI WAP Browser | 2007-12-19 |
| 4 | 2222 | Nokia3108 | 2007-12-19 |
| 5 | 2222 | LENOVO-I750 | 2007-12-19 |
| 6 | 2222 | BIRD_D636 | 2007-12-19 |
| 7 | 2222 | SonyEricssonS500c | 2007-12-19 |
| 8 | 2222 | SAMSUNG-SGH-E258 | 2007-12-19 |
| 9 | 2222 | NokiaN73-1 | 2007-12-19 |
| 10 | 2222 | Nokia2610 | 2007-12-19 |
+—-+——-+——————-+————+
10 rows in set (2 min 58.56 sec) client3:
mysql> update gz_phone set phone=’55555′ where id=1;
Query OK, 1 row affected (3 min 50.16 sec)
Rows matched: 1 Changed: 1 Warnings: 0
说明当数据表有一个写锁时,其它进程的读写操作都需等待读锁释放后才会执行。
3、并发插入
原则上数据表有一个读锁时,其它进程无法对此表进行更新操作,但在一定条件下,MyISAM表也支持查询和插入操作的并发进行。
MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
a、当concurrent_insert设置为0时,不允许并发插入。
b、当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
c、当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。
4、MyISAM的锁调度
由于MySQL认为写请求一般比读请求要重要,所以如果有读写请求同时进行的话,MYSQL将会优先执行写操作。这样MyISAM表在进行大量的更新操作时(特别是更新的字段中存在索引的情况下),会造成查询操作很难获得读锁,从而导致查询阻塞。
我们可以通过一些设置来调节MyISAM的调度行为:
a、通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。
b、通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。
c、通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。
上面3种方法都是要么更新优先,要么查询优先的方法。这里要说明的就是,不要盲目的给mysql设置为读优先,因为一些需要长时间运行的查询操作,也会使写进程“饿死”。只有根据你的实际情况,来决定设置哪种操作优先。这些方法还是没有从根本上同时解决查询和更新的问题。
在一个有大数据量高并发表的mysql里,我们还可采用另一种策略来进行优化,那就是通过mysql主从(读写)分离来实现负载均衡,这样可避免优先哪一种操作从而可能导致另一种操作的堵塞。下面将用一个篇幅来说明mysql的读写分离技术。

分类: MySQL 标签: , ,

php mysql事务详解

2010年8月28日 没有评论

在说php mysql事务之前,可以先了解下 php mysql与mysqli 区别

在PHP中,mysqli 已经很好的封装了mysql事务的相关操作。如下示例:

$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";
$sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
  $mysqli->commit();
  echo 'ok';
}else{
 echo 'err';
  $mysqli->rollback();
}

在这里,我们再使用 php mysql 系列函数执行事务。

$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";
$sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";
$sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";

$conn = mysql_connect('localhost','root','');
mysql_select_db('DB_Lib2Test');
mysql_query('start transaction');
//mysql_query('SET autocommit=0');

mysql_query($sql1);
mysql_query($sql2);
if(mysql_errno ()){
    mysql_query('rollback');
    echo 'err';
}else{
    mysql_query('commit');
    echo 'ok';
}

// mysql_query('SET autocommit=1');
//  mysql_query($sql3);

在这里要注意,

  1. MyISAM:不支持事务,用于只读程序提高性能
  2. InnoDB:支持ACID事务、行级锁、并发
  3. Berkeley DB:支持事务

还有一点要注意:MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务。
但往往,我们需要在使用事务的时候,是需要执行多条sql语句的。这就需要我们手动设置MySQL的autocommit属性为0,默认为1。
同时,使用START TRANSACTION语句显式的打开一个事务 。如上面的示例。
如果不这样做,会有什么结果呢?

我们将上面第二段代码中 //mysql_query(‘SET autocommit=0′); 和 // mysql_query($sql3); 注释去掉,然后执行。
此时,mysql_query($sql3) 执行就不会insert到数据库中。
如果我们将 // mysql_query(‘SET autocommit=1′); 本句注释去掉,那么mysql_query($sql3); 就会执行成功。

通常COMMIT或ROLLBACK语句执行时才完成一个事务,但是有些DDL语句等会隐式触发COMMIT。
比如下列语句

ALTER FUNCTION
ALTER PROCEDURE
ALTER TABLE
BEGIN
CREATE DATABASE
CREATE FUNCTION
CREATE INDEX
CREATE PROCEDURE
CREATE TABLE
DROP DATABASE
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP TABLE
UNLOCK TABLES
LOAD MASTER DATA
LOCK TABLES
RENAME TABLE
TRUNCATE TABLE
SET AUTOCOMMIT=1
START TRANSACTION

我们再来举个例子看下。

$sql1 = 'create table ScoreDetail_new(id int)';
$sql2 = 'rename table ScoreDetail to ScoreDetail_bak';
$sql3  = 'rename table ScoreDetail_new to ScoreDetail';

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
$mysqli->query($sql3);
if(!$mysqli->errno){
  $mysqli->commit();
  echo 'ok';
}else{
 echo 'err';
  $mysqli->rollback();
}

在上面的示例中,假如$sql2执行出错了,$sql1照样会执行的。为什么呢?
因为rename在执行的时候,mysql默认会先执行commit,再执行rename。

php mysql与mysqli 区别

2010年8月28日 1 条评论

首先两个函数都是用来处理DB 的。

首先, mysqli 连接是永久连接,而mysql是非永久连接。什么意思呢? mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力。

其次,mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。具体查看  http://cn.php.net/mysqli

应用比较多的地方是 mysqli的事务。

比如下面的示例:


$mysqli = new mysqli('localhost','root','','DB_Lib2Test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
  $mysqli->commit();
  echo 'ok';
}else{
 echo 'err';
  $mysqli->rollback();
}
分类: MySQL, PHP开发 标签: ,

LAMP人主题分享 – 知识系统聚会

2010年8月18日 2 条评论

本次分享聚会邀请到了

雅虎知识堂、百度知道和新浪爱问的资深工程师,将会带来精彩的分享。

同时有QA环节可以提问嘉宾。

期待ing

活动时间:2010年09月05日(周日),下午1:30~5:00
活动地点:北京海淀区上地三街9号嘉华大厦B座1106室
所需费用:免费
活动日程:
13:30-14:00:签到、入场、自由讨论
14:00-14:30:雅虎知识堂嘉宾发言
14:30-15:00:百度知道嘉宾发言
15:30-16:00:新浪爱问嘉宾发言
16:00-16:10:休息
16:10-17:00:讨论 QA
17:00-20:00:AA聚餐
联系人:张丽-15810370732

mysql查询今天、昨天、7天、近30天、本月、上一月 数据

2010年8月6日 1 条评论

查询

今天

select * from 表名 where to_days(时间字段名) = to_days(now());

昨天

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) – TO_DAYS( 时间字段名) <= 1

7天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)

近30天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)

本月

SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, ‘%Y%m’ ) = DATE_FORMAT( CURDATE( ) , ‘%Y%m’ )

上一月

SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , ‘%Y%m’ ) , date_format( 时间字段名, ‘%Y%m’ ) ) =1

同时,再附上 一个 mysql官方的相关document

http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html

分类: MySQL 标签: ,

Web缓存加速-web缓存方案

2010年7月30日 没有评论

第二期 lamper人主题交流会即将开始
本期主题是:Web缓存加速
本期活动将采用引导讨论形式分两个部分:

第一、主要从以下几方面进行WEB缓存方案讨论分享:
1. 客户端缓存
2. 内存缓存
3. 文件缓存
4. 数据库缓存
5. 分布式缓存
6. 缓存策略制定规则

第二、对第一期的延续,知识分享系统的开发讨论:
1. 开发流程确定
2. 开发人员分工
3. 知识分享系统架构确定

活动时间:2010年08月07日(周六),下午1:30~5:00
活动地点:西直门奇遇花园咖啡馆(查看位置)

热诚欢迎大家参加、分享

详情:http://www.lamper.cn/

腾讯最新招聘信息

2010年7月13日 没有评论

岗位名称:Flash游戏开发工程师
工作地点:深圳
人数:2人
岗位职责:
负责和产品人员确认需求;
Flash游戏开发;
Flash动画制作。
岗位要求:
从事ActionScript3相关开发工作两年以上经验;
熟悉flash游戏的开发流程,有较为复杂的flash游戏开发经验,能够独立完成flash游戏的分析和开发;
熟悉ActionScript3和后台sever之间的通讯与交互;
拥有良好的编码风格和面向对象的编程思想。
热爱游戏行业,愿意在此行业中做出优异成绩;
真诚、善良、积极乐观、良好的学习能力和沟通能力。

岗位名称:游戏策划
工作地点:深圳
人数:2人
岗位职责:
负责网络游戏的策划与设计;
根据策划主管和规则设定师制定的各种规则,进行公式设计,建立数学模型;
负责网络游戏的人物、场景、道具、属性、任务、系统、界面、功能设计,场景、脚本、任务、数据编辑;
负责相关宣传、策划实施,音乐、音效、动画规划设计,平衡性调整,资料搜集整理等工作;
制定产品运营计划,与运维、客服部门协调进行日常运营,推动持续运营及客服质量持续改进;
收集整理客服汇报用户建议及产品缺陷,推动产品质量持续改善;
负责业务运营数据分析及市场状况分析。
岗位要求:
具有网络游戏行业二年以上相关工作经验;
具有成功运营MMOG或休闲网络游戏产品1年以上企划经验;
熟悉游戏制作的流程及各个环节,熟悉网络游戏市场,对行业发展有清晰认识;
具有优秀的创造力和想像力;有很强的文字组织能力;
有良好的逻辑思维能力,熟悉单机及网络游戏的系统设计,有数值调整及游戏系统设计工作的经验和心得;
具有一定程序设计概念者,具有可量化、体系化游戏配平数据调谐能力者;
有一定市场研究基础,具有很好的数据分析习惯及能力。

岗位名称:产品经理
工作地点:深圳
人数:4人
岗位职责:
负责网络休闲游戏的策划与设计;
负责网络游戏的系统、道具、属性、任务、界面、功能设计,和场景、脚本、任务、数据编辑;
负责音乐、音效、动画规划设计;
制定产品运营计划,与运维、客服部门协调进行日常运营,推动持续运营及客服质量持续改进;
收集整理客服汇报用户建议及产品缺陷,推动产品质量持续改善;
负责业务运营数据分析及市场状况分析,根据分析结果制定产品和运营规划。
岗位要求:
具有网络游戏行业二年以上相关工作经验;
具有成功运营MMOG或休闲网络游戏产品1年以上企划经验;
熟悉游戏制作的流程及各个环节,熟悉网络游戏市场,对行业发展有清晰认识;
具有优秀的创造力和想像力;有很强的文字组织能力;
有良好的逻辑思维能力,熟悉单机及网络游戏的系统设计,有数值调整及游戏系统设计工作的经验和心得;
具有一定程序设计概念者,具有可量化、体系化游戏配平数据调谐能力者;
有一定市场研究基础,具有很好的数据分析习惯及能力。

岗位名称:运营策划
工作地点:成都
人数:1人
岗位职责:
负责地方棋牌类游戏产品线规划和游戏策划工作。
负责产品各阶段运营规划的制定,对产品研发和运营做日常的监控和跟进,保证版本发布的时间和品质。
负责竞品监测,和产品运营数据的深度分析,并构建数据挖掘的机制。
和运维,测试,市场部门的接口工作。
岗位要求:
大学本科及以上学历,一年以上相关岗位网络游戏运营工作经验。
了解游戏开发、运营的完整过程;熟悉网络游戏的版本管理各环节的业务;
对网络游戏及市场有深刻的认识,了解用户需求和网络游戏行业发展趋势,具有数据分析能力和游戏系统策划经验者优先。
具有较强的协调能力,积极主动,团队合作意识强,善于沟通及表达,能承担较强工作压力。

岗位名称:后台开发工程师
工作地点:深圳
人数:5人
岗位职责:
负责QQGame相关产品需求分析、后台服务器的设计、开发。
岗位要求:
计算机相关专业本科及以上学历,3年以上互联网/IT行业大型系统开发工作;
熟悉Unix/Linux操作系统下的C/C++开发,熟悉C++和面向对象技术,熟悉数据库开发;
熟悉Unix操作系统原理和TCP/IP协议相关知识;
全面的软件知识结构(操作系统、软件工程、设计模式、数据结构、数据库系统);
具备良好的分析解决问题能力,能独立承担任务和有系统进度把控能力;
有良好的团队合作能力,善于沟通,热爱开发事业。

分类: 杂七杂八 标签:

知识分享平台的设计与实现

2010年6月28日 没有评论

你用过知识分享系统(问答系统)吗?你了解百度知道,新浪爱问,雅虎知识堂,SOSO问问……吗?你想知道如何在LAMP架构下设计这样的系统吗?那就赶紧报名参加“LAMP人第一期主题聚会——知识分享平台的设计与实现”。

本次讲座分三个主题:
一、 知识分享系统的应用层设计与实现
二、 知识分享系统的架构设计与性能优化
三、 知识分享系统文档自动分类功能的实现

主讲嘉宾:
杜 江:精通PHP语言,MySQL、Oracle数据库,Linux/FreeBSD等系统;
领导创建多个大型网站,如赶集网、新网、爱康网、A8音乐网;
编写发行有两本PHP书籍;
2008年创立思技创想(北京)科技有限公司,目前专注于大型网站架构设计以及电子商务、Web2.0产品研发。
王天勇:熟悉语言包括:C++,Java,PHP;
熟悉的数据存储平台:MySQL,Hadoop(HBase);
目前就职于淘宝(北京);
参与开发了多个大型网站:雅虎知识堂,雅虎新闻搜索,淘宝购物搜索等。现在专注于垂直搜索领域的产品开发及其云计算。
李俊峰:从2000年开始从事lamp方面的开发和设计;
有10多年的lamp系统的架构开发经验;
于2003年加入雅虎,负责创建了雅虎知识堂产品;
2007年加入创立了时代图片,负责网站的整体架构和产品设计;
目前专注于lamp系统的研究和推广,希望和国内从事lamp系统开发的人做广泛的交流与学习。

活动时间:2010年07月04日(周日),下午1:30~5:00
活动地点:北京交通大学图书馆多功能厅(查看地图)
所需费用:免费
活动日程:13:30-14:00:签到、入场
14:30-15:00:杜江:知识分享系统的应用层设计与实现
15:00-15:10:Q & A
15:10-15:40:王天勇:知识分享系统的架构设计与性能优化
15:50-16:00:Q & A
16:00-16:30:李俊峰:知识分享系统文档自动分类功能的实现
16:30-17:00:Q & A,结束
联系人:张丽-15810370732
具体详情请浏览:http://www.lamper.cn

特大惊喜:
我们将打造一个线下真实的开发团队,完成一套完整的知识分享系统的开发,如果你想在实战中成为高手,如果你想在实战中结交天下LAMP好友,请会后联系工作人员留下您的联系方式,我们欢迎你的加入!

分类: 杂七杂八 标签:

2010高考志愿填报–我的经验分享

2010年6月4日 4 条评论

2003年6月,历经了黑暗的高三生活,终于迎来了高考的日子。心里那个爽快啊,终于可以步入期望的大学校园了,终于可以体验只能在电视上看到的大学生活了。。。

时如箭矢,现在已经毕业3年了。感慨万千啊。记得当时走出大学校园,步入社会第一个月,我就已经深刻的感觉到“还是大学生活好啊”,可以睡到自然醒;可以和舍友通宵一起CS,一起红警;可以拉着女朋友一起压马路;可以和同学们唱歌,跳舞,欢呼。。。
好怀念。。。

2010年高考即将到来,祝愿所有的考生都取得好的成绩。

随即而来的,还有2010年高考志愿填报的事情。
在这里,我想说:
第一、一定要选择自己喜欢的专业。爱好是最好的老师嘛。
第二、一定不要听别人说某个专业人才饱和这样的谬论。告诉你,每个行业人才都是那么的缺乏。及其缺乏。你知道有多少公司苦于招不到人嘛?你知道腾讯,百度,新浪,华为等等公司都有在长期招聘嘛?人才是如此之缺乏啊。
第三、如果你不知道自己喜欢哪个专业怎么办?建议选择大家嘴里常说的比较“热门”的专业。比如计算机,英语等。不用担心竞争激烈,之所以热门,就是因为市场需求量大。不用担心将来没有好的工作。

就说这些吧。
后续将大学生活的点滴再写出来。。。
最后再唠叨一句,好怀念大学生活~~~

分类: 我的日记 标签: ,