本人美化的一款网页游戏,开源、免费、多人在线,也许相同题材的游戏很多,但是这里会有另一种特色。
不断改进,不断完善……
以下是游戏网址:
htttp://netleaf.izfree.com (现用)
原始官方网站:http://www.devana.eu/
本人美化的一款网页游戏,开源、免费、多人在线,也许相同题材的游戏很多,但是这里会有另一种特色。
不断改进,不断完善……
以下是游戏网址:
htttp://netleaf.izfree.com (现用)
原始官方网站:http://www.devana.eu/
在网上看到这样的组图,真的让人感动,选摘了其中部分……
出处: 环球网
========================================================
最感慨的瞬间
伊拉克奥运代表团在奥运会开幕不到十天才得到参赛资格,他们的队员甚至连队服都没有。皮划艇上,其他国家的选手都穿着合适的队服,而伊拉克的选手则穿着已经起球的旧T恤,但他们仍然在顽强的比赛。 而由于资金匮乏,参加短跑比赛的伊拉克女选手达娜·侯赛因也只能穿着一双有些破损的“二手”跑鞋参加比赛。她的一句话曾让世界潸然泪下,她躲过了两次枪击后依然坚持训练,但是此前得知无法参加北京奥运会时,她一度崩溃了。教练安慰她,4年后可以参加伦敦奥运会,21岁的达娜脱口而出:“照伊拉克这个样子,我不知道自己能不能活到2012年……”中国网友得知这一消息无不为之动容,在开幕式伊拉克代表团入场时,全场中国观众给予了不亚于东道主代表团的礼遇,报以热烈的掌声。当他们离开时,中国网友特意将自己准备的球鞋、衣服、福娃以及各种具有中国特色的礼物送给伊拉克代表团,伊拉克队员收礼物收到手软。伊拉克队的教练非常感动地说:“虽然我们远离家乡,但我们在中国感受到了温暖。希望大家有机会能到巴格达,让我们来回报你们。”
PS:我们渴望和平,痛恨战争!让我们对那些发动战争嗜杀成性的刽子手们说:有种的我们下场来赛一场!……
最感人的瞬间
北京奥运会女子花剑个人1/32决赛在击剑馆进行,加拿大选手栾菊杰13比9战胜突尼斯选手伊娜·布贝克里,取得她在北京奥运会上的首场胜利。赛后,栾菊杰在场上高举起“祖国好”的布幅,向现场观众表达心迹。50岁的栾菊杰是北京奥运会参加击剑比赛的所有运动员中年龄最大的。更为特殊的是,栾菊杰是中国首枚奥运会击剑金牌获得者,1984年获得了洛杉矶奥运会女子花剑个人冠军。在她之后,中国击剑24年再没有人登上最高领奖台。退役20年后,已到半百之龄的栾菊杰复出了,虽然没能像24年前的洛杉矶一样所向披靡,半百老将复出挥剑征战奥运精神足以让世人敬佩,虽然24年后的体力已不足以支撑她在奥运赛场上披荆斩棘,然而,就像她说的,“能在北京参加奥运会是我的梦想,现在终于实现了,我今后不会再有什么遗憾”。
PS:虽然代表加拿大参赛,但仍心系祖国,能站在祖国的土地上参加奥运那就是无比的自豪……
最心酸的瞬间
19日北京奥运会男子举重105公斤以上级的颁奖仪式上演了感人的一幕:该项目冠军、德国选手马·施泰纳把亡妻苏珊的照片和奥运金牌高高举起,让人们不仅看到一个强壮的大力士,还深深感受到他对妻子深深的爱。这位德国大力士在比赛最后阶段上演大逆转,用一枚沉甸甸的奥运金牌来祭奠亡故的妻子,此情此景令人不禁潸然泪下,成为北京奥运会上感人至深的一幕。去年7月的一起车祸夺去了施泰纳妻子苏珊的生命,从此施泰纳就一直随身带着苏珊的照片,高强度的艰苦训练就成为施泰纳摆脱痛苦思念折磨的唯一途径。26岁的施泰纳在夺金后激动地表示,他的亡妻苏珊在比赛中一直陪伴着他,给予他夺金的勇气。他说:“我所有的期盼就是苏珊在今天可以看到我的成功。我不是一个迷信的人,但我可以肯定的是,苏珊在注视着我,她在我的心里,给予我勇气和力量。这是一场献给苏珊的胜利。”马·施泰纳夺得的这枚奥运金牌不仅是德国16年来获得的第一枚奥运举重金牌,更证明了爱能创造奇迹。
PS: 爱——总会令人感动……
……
最近因为编程对二进制文件的读写,需要遍历所有字节,有把文件字节码转为文本进行操作的想法(即对16进制代码的可视化编辑,如UltraEdit等)。一直都担心速度问题而没有去尝试。在网上搜索了一下相关的内容,据说以下是把文件字节的16进制代码转换成字符串的比较快速的方法。
大概步骤是:
将整个文件读成字节数组(对数组操作速度肯定比文件操作要快);
然后逐字节(数组每一元素)转换成表示16进制的字符串(这里用位运算,如果用系统函数那简直就是恶梦);
最后以返回合并后的字符串(不知文件太大了转换的字符串会不会影响操作?)。
static char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
public static string ToHexString(byte[] bytes)
{
char[] chars = new char[bytes.Length * 2];
for (int i = 0; i < bytes.Length; i++)
{
int b = bytes[i];
chars[i * 2] = hexDigits[b >> 4];
chars[i * 2 + 1] = hexDigits[b & 0xF];
}
return new string(chars);
}
目的是研究飞信聊天记录文件(SQLite数据库)的操作,顺便学习一下SQLite知识.
以下是摘自某网站文章的部分代码,可以看出SQLite数据库的一般操作和该数据库的大致结构关系:
string connString = "Data Source={0};Version=3;Password={1};";
SQLiteConnection conn = null;
SQLiteConnection connHis = null;
string USERPROFILE = "";
string folderURL=string.Empty;
private void btImport_Click(object sender, EventArgs e)
{
folderURL = USERPROFILE + @"\Application Data\Fetion\" + txtFetionId.Text; try
{
conn = new SQLiteConnection(string.Format(connString, folderURL + "\\history.dat", txtFetionId.Text));
connHis = new SQLiteConnection(string.Format(connString,txtImpPath.Text, txtFetionId.Text)); SQLiteDataAdapter sda = new SQLiteDataAdapter();
DataSet ds = new DataSet();
connHis.Open();
sda.SelectCommand = new SQLiteCommand("select * from Player", connHis);
sda.Fill(ds, "Player");
sda.SelectCommand = new SQLiteCommand("select * from Message", connHis);
sda.Fill(ds, "Message");
sda.SelectCommand = new SQLiteCommand("select * from MessageBody", connHis);
sda.Fill(ds, "MessageBody");
sda.Dispose();
connHis.Close();
conn.Open();
SQLiteCommand cmd = new SQLiteCommand();
cmd.Connection = conn;
DbTransaction dt = conn.BeginTransaction();
//向表内插入数据
for (int n = 0; n < ds.Tables["
MessageBody"].Rows.Count; n++)
{
DataRow dr = ds.Tables["MessageBody"].Rows[n];
cmd.CommandText = "INSERT OR IGNORE INTO [MessageBody] ([ID], [SenderUri], [SenderName], [Body], [Extend], [MessageType], [Time]) VALUES ($ID, $SenderUri, $SenderName, $Body, $Extend, $MessageType, $Time)";
cmd.Parameters.Add("$ID", DbType.String).Value = dr[0].ToString();
cmd.Parameters.Add("$SenderUri", DbType.String).Value = dr[1].ToString();
cmd.Parameters.Add("$SenderName", DbType.String).Value = dr[2].ToString();
cmd.Parameters.Add("$Body", DbType.String).Value = dr[3].ToString();
cmd.Parameters.Add("$Extend", DbType.String).Value = dr[4].ToString();
cmd.Parameters.Add("$MessageType", DbType.Int32).Value = int.Parse(dr[5].ToString());
cmd.Parameters.Add("$Time", DbType.Time).Value = DateTime.Parse( dr[6].ToString());
cmd.ExecuteNonQuery();
} for (int n = 0; n < ds.Tables["Message"].Rows.Count; n++)
{
DataRow dr = ds.Tables["Message"].Rows[n];
cmd.CommandText = "INSERT OR IGNORE INTO [Message] ([MessageID], [ReceiverUri], [ReceiverName], [Status]) VALUES ($MessageID, $ReceiverUri, $ReceiverName, $Status)";
cmd.Parameters.Add("$MessageID", DbType.String).Value = dr[0].ToString();
cmd.Parameters.Add("$ReceiverUri", DbType.String).Value = dr[1].ToString();
cmd.Parameters.Add("$ReceiverName", DbType.String).Value = dr[2].ToString();
cmd.Parameters.Add("$Status", DbType.Int32).Value = int.Parse(dr[3].ToString());
// Console.WriteLine(cmd.CommandText);
cmd.ExecuteNonQuery();
} for (int n = 0; n < ds.Tables["
Player"].Rows.Count; n++)
{
DataRow dr = ds.Tables["Player"].Rows[n];
cmd.CommandText = "INSERT OR IGNORE INTO [Player] ([Uri], [Name], [Type]) VALUES ($Uri, $Name, $Type)";
cmd.Parameters.Add("$Uri", DbType.String).Value = dr[0].ToString();
cmd.Parameters.Add("$Name", DbType.String).Value = dr[1].ToString();
cmd.Parameters.Add("$Type", DbType.Int32).Value = int.Parse(dr[2].ToString());
// Console.WriteLine(cmd.CommandText);
cmd.ExecuteNonQuery();
} dt.Commit();
conn.Close();
rtbLog.Text += "记录导入成功!\n"; }
catch (Exception ex)
{
rtbLog.Text += ex.Message + ‘\n‘;
//throw;
}
}
(本文代码来源:http://www.dotnetthink.com)
飞信聊天记录存储路径:
C:\Documents and Settings\%user%\Application Data\Fetion 下对应飞信号为文件夹的history.dat
该文件是SQLite数据库,密码为对应的飞信号。下面是存储数据库文件的表及视图的基本结构。
===========================================================
table:Player
CREATE TABLE Player(
Uri VARCHAR(256) PRIMARY KEY,
Name VARCHAR(256),
Type INTEGER)
===========================================================
table:MessageBody
CREATE TABLE MessageBody(
ID VARCHAR(64) PRIMARY KEY,
SenderUri VARCHAR(256),
SenderName VARCHAR(256),
Body VARCHAR(1000),
Extend VARCHAR(1000),
MessageType INTEGER,
Time DATETIME)
============================================================
table:Message
CREATE TABLE Message(
MessageID VARCHAR(64),
ReceiverUri VARCHAR(256),
ReceiverName VARCHAR(256),
STATUS INTEGER,
PRIMARY KEY (MessageID, ReceiverUri))
============================================================
view:vMessage
CREATE VIEW vMessage AS
SELECT MessageBody.ID AS ID, MessageBody.SenderUri AS SenderUri , MessageBody.SenderName AS SenderName , Message.ReceiverUri AS ReceiverUri , Message.ReceiverName AS ReceiverName , MessageBody.Body AS Body , MessageBody.Extend AS Extend,
MessageBody.MessageType AS MessageType , Message.STATUS AS STATUS , MessageBody.[Time] AS [Time] , P2.[Type] AS SenderType , P1.[Type] AS ReceiverType
FROM Message INNER JOIN
MessageBody ON Message.MessageID = MessageBody.ID
INNER JOIN Player P1 ON Message.ReceiverUri = P1.Uri
INNER JOIN Player P2 ON MessageBody.SenderUri = P2.Uri
============================================================
view:vPlayerRef
CREATE VIEW vPlayerRef AS
SELECT COUNT(MessageBody.SenderUri) + COUNT(Message.ReceiverUri) AS RefCount, Player.Uri AS Uri
FROM Player LEFT OUTER JOIN MessageBody ON Player.Uri = MessageBody.SenderUri LEFT OUTER JOIN Message ON Player.Uri = Message.ReceiverUri
GROUP BY Player.Uri
============================================================
这样就可以对该数据库进行读写操作,实现对聊天记录的查看、导出、导入等功能了!
(本文资料来源:http://www.dotnetthink.com)