骑行记(四)

4.12
  这周本想不远骑,去修理保养下单车逛个来回就算了,临要出发前给兰花兄打了个电话,看要不要一起去,谁知他已在林百欣图书馆集中准备去莲下,心痒痒,最终和他们一起去了,一行十五人。这是我第四次骑行,也是第一次和组织一起骑行,挂电话后只有10分钟的时间就要出发,不言而喻,害大家在那干等20分钟!!真是抱歉!听说今天组织还有其它几条线路,有隆都、饶平、福建、豪江,真是丰富多彩。

  同行中也有和我一样的,也是头次跟组织一起骑。自行车爱好者联盟是加入自愿,退出自由,没有谁是领导,所以刚加入的,如果没有认识的朋友,往往会找不到北,很难和其他人一样,其乐融融。如果你是外向活泼的,应该很快会融入到大家庭来,找到组织的感觉;如果是内向不太爱说话的,来不了几次就会感觉没劲,还好我还是处在中间的,自我感觉良好。不过还是有个想法,要是在网上能有个通信录,最好带相片,每次骑行前集中的时候,头次见面的,大家互相认识下,这样骑行旅程应该会更加愉快!

  这次的线路是:图书馆集中=>天山路=>花园宾馆=>澄城=>莲下(午餐)=>隆都镇=>淡浮院,回程原路。来回差不多八十公里,不过回来下半程感觉体力跟不上。回来得有点晚,中间出现两段小插曲,骑到隆都时,我的后轮胎爆了,越骑越重,还以为是逆风,仔细一下才知道,当时我在最后面,还好兰花兄离我不远,喊一下就听到了,要不然当时手机刚好没电,开机都开不了,那就真的求救无门了。原以为爆胎应该是比较少见的,现在才知其实什么情况都有可能发生。另一个插曲跟车无关,准备补胎时,阿猫过来关心,刚下车摸了下口袋,发现手机不见了!后来和老柯俩人座摩的一起回淡浮院找,幸好找到了!

 

骑行记(三)

4.5
  昨天是清明,走了一天山路,人晒黑了,但不是很累,还想着去骑车,一周骑一次感觉还不是很累,体力和时间有限,还有刚入行不久,一周一次够了。

  至今还没跟组织一起骑行过,主要原因是一般周日下午有事,组织出行一般都是一天的行程,虽说中途可以自由安排,先行离队,但出行的时间好像都是九点或十点,晚了点。没办法,还是一个人活动活动好了,如果有一两个同骑那再好不过了,一个人骑不用赶得太急,轻松自由。

  这周还是一个人骑,在网上查了些线路,打算一个上午去潮州然后回澄海,最后还是没如愿,计划跟不上变化,中途拐弯了,线路是:梅溪桥->龙湖镇->江东大桥->江东镇->上华镇->澄城,也不知多少公里,四十应该有吧(没码表),由于出发得早(7.15),到终点才11点。

二次骑行

计划好周日上午骑行,如约而至,不过招不到人,只好一个人走,也好,自已先练习练习,老线路:电大 => 东厦路 => 海滨路 => 梦之谷 => 海滨路 => 中山路 => 泰山路 => 澄海(吃) => 回汕头,梦之谷,上次去过的,8点出发,先吃东西,8点30出启程,花了一小时才到,在过渡船估计都花了半小时了,可能是周末的原因,来运动的人还挺多,慢骑环游之前骑过路,空气清新,却没停下来欣赏风景,直奔杨桃园,买了点杨桃和两个扒拉,重且不怎么好拿,不敢买多。

由于还要骑去澄海吃饭,路还有长,回得比较早,10半就做渡船了,天气有点热,到澄海时全身是汗。

感受:感觉挺好,肺活量和心脏得到锻炼,还有对颈椎应该也有好处,因为骑车头得稍向上,对久座办公室的人来说应该也是放松、调节颈椎的好机会。

ubuntu 中启用 root 账号

Ubuntu 中的 root 帐号默认是被禁用了的。在这种情况 之下,如果你想要使用 root 的权限来干些事情,就需要 sudo 指令。

如果需要激活 Ubuntu 中的 root 帐号, 在 Ubuntu 中激活 root 帐号的过程如下:

    1. 在终端执行 sudo passwd root 指令后,系统将会提示你设置一个新的 root 帐号密码。
    2. 点击 System (系统)-> Preferences(系统管理) -> Login Window(登录桌面)菜单,并切换到 Security (安全)选项页,然后选中其下的“Allow local system administrator login(允许本地系统管理员登录)”选项。

执行上述两步后,你便 可以使用 root 帐号登录 Ubuntu 系统了。如果要再次禁用 root 帐号,那么可以执行 sudo passwd -l root

骑自行车记

  很多事情往往在没预料的情况就发生了,像今天,骑自行车,还“赚”了一辆性价比很不错的单车,从此我也是自行车爱好者中的一员了(汕头自行车爱好者联盟编号184)。

  之前也没想过去骑自行车,不过很有兴趣,只是没机会而已,其实应该是说很多运动都很感兴趣,像篮球、乒乓球、羽毛球等等,只是平时找不到组织而已。

  今天的行程应该不会少于50公里,第一天骑就这么长的路,受苦的肯定是双腿和PP了,现在行走都痛得要命,明天恐怕走路都成问题了。

  想想本人的运动观念还算蛮高的。活动活动,人要活就得动。你有 100000000000,你就是前面的“1”,你没了,一切都为“0”,所以珍惜世界的美好就要从珍惜自己健康开始。

美利达08款公爵

颜色 蒙彩桔
速别 24
车架 铝合金
车架尺寸 18'
前叉 RST CAPA T8
链条 KMC HG40
齿盘曲柄 SR CW-XCT202 42-32-22
套装飞轮 SHIMANO HG30-8S 11-30
变速器(前/后) SHIMANO ACERA
变速控制杆 SHIMANO EF-50
手把 ALLOY
手把竖管 ALLOY
辅助手把 ALLOY
车圈 WEINMENN XP-26
车头碗 VP-A42E
前后夹器 ALLOY V-BRAKE
前后花鼓 ALLOY QR
外胎 CST 26*1.95
座管 ALLOY
脚踏 VP-988A

小草和太阳

摘要:太阳光是小草光合作用的重要组成部分,没有太阳小草就不能光合作用,就不能产生叶绿素,小草就会变黄,就会枯萎,然后枯死!  阅读全文

Request 获取 url 信息的各种方法比较

在ASP.NET编程中经常需要用Request获取url的有关信息,Request中有多种方法获取url信息,但我经常忘了各种方法的具体作用,今天我就写了个测试程序,将各种方法得到的结果列出来,以后用时直接参考一下就行了。
测试的url地址是http://www.test.com/testweb/default.aspx, 结果如下:

Request.ApplicationPath: /testweb
Request.CurrentExecutionFilePath: /testweb/default.aspx
Request.FilePath: /testweb/default.aspx
Request.Path: /testweb/default.aspx
Request.PathInfo:
Request.PhysicalApplicationPath: E:\WWW\testweb\
Request.PhysicalPath: E:\WWW\testweb\default.aspx
Request.RawUrl: /testweb/default.aspx
Request.Url.AbsolutePath: /testweb/default.aspx
Request.Url.AbsoluteUri: http://www.test.com/testweb/default.aspx
Request.Url.Host: www.test.com
Request.Url.LocalPath: /testweb/default.aspx

SQL Server 2005 创建自动备份的操作步骤

数据库自动备份,创建过程如下:

a. 打开 SQL Server Management Studio,连接到你的实例,打开“对象资源管理器”,没有看到的话,按 F8 展开实例--管理--维护计划--右键“维护计划”--新建维护计划--输入维护计划名称--这样会出现创建维护计划的窗口

b. 在左边的工具箱中(没有的话,按Ctrl+Alt+X),将“备份数据库任务”拖到中间的黄色区域
   
c. 双击拖出来的这个任务,会出现设计属性的窗口,在数据库中,选择你要备份的数据库,然后设置备份到那里,并且设置备份的文件名,设计好后,单击“确定”,你也可以单击“T-SQL”,看看 sql 大致会用什么样的语句来处理你的需求。

d. 单击“计划”后面的“...”按钮,设置执行的时间计划。

源代码部署Discuz!NT和同步注册登录过程详解

2008-11-15 日重新下载的,打开解决方案,生成,Discuz.Data.Access 项目的几个警告,由于目录也不需要用到 Access,把它从解决方案移除;然后重新生成解决方案:

========== 全部重新生成: 成功 24 个,失败 0 个,跳过 0 个 ==========


复制 Discuz.Web 目录,删除与部署到服务器无关的文件(upgrade 目录不要删除,如果不是升级的就建个空目录就好了,不用把目录里的文件都传上去,安装好就可以把目录删除,也不知道为何要检测这个目录!),设置好虚拟目录(默认的话要在虚拟目录的默认文档里加上 forumindex.aspx),然后运行 /bbs/install/index.aspx 进行安装(数据库连接我是用 sa,安装后记得改过来,也可能用普通用户安装),安装之前记得把目录的权限设置好(要方便就直接将论坛目录给 Users 组修改权限)。

在客户端安装时,到最后一步出现了个错误(错误源:未将对象引用设置到对象的实例),看了代码应该是在初始化数据库数据时出错,把 try 去掉(想看下是什么错误),编译下把 Discuz.Install.dll 重传下,干脆在服务器上重新安装一下,却没错误,真晕。


然后删除 install 后无用的文件,分别删除 install,upgrade 这两个目录,把 bin 目录下的以下文件也删除:

Discuz.Install.dll
Discuz.Data.Access.dll
Discuz.Data.MySql.dll
MySql.Data.dll

然后进行系统后台配置,除了一些常规设置,主要改一下积分策略和去掉友情连接,去掉扣分的;完了换论坛 Logo!

下面是修改代码部分,首先移除暂时没用到的项目:

Discuz.Album
Discuz.Space
Discuz.Space.Modules.Album
Discuz.Space.Modules
Discuz.Data.Access
Discuz.Data.MySQL
Discuz.Mall

删除 Web 目录下 bin 目录的所有文件(除 Newtonsoft.Json.dll 之外,Discuz.Data.SqlServer 引用到了 Interop.SQLDMO.dll,如果要使 Discuz.Data.SqlServer 能通过编译,Interop.SQLDMO.dll 文件也不能删除,还是留着吧),生成 Web 项目。
把 Discuz.Data.SqlServer.dll 和 Discuz.Web.Admin.dll Copy 到 Web 的 bin 目录下,不要将这两项目引用到 Web 项目里!


接下来就是将 zq_Users 的用户导入论坛,将两个表的用户同步;如果用户数不多的话,可以在两边人工注册。同步好用户表后将同步注册、登录、更新用户资料程序更新上去!

至于注册、登录、更新资料的同步,做法如下:

主站这边:

添加一个扩展类 Extensions,对 User 类添加一个扩展方法(CreateUpdateBBSUser),用于向论坛用户表添加、修改、删除用户信息;然后只要在相应页面添加调用代码即可,如在注册时:

// 注册到论坛
user.CreateUpdateBBSUser(ActionType.Add);

添加调用的页面有:

/register.aspx.cs
/login.aspx.cs
/logout.aspx
/controls/userinfo.ascx
/user/my_baseinfo.aspx.cs
/admin/useradmin.aspx.cs(删除,以大林苑为例)
/admin/useraction.aspx.cs(编辑)


同步登录方面,从主站登录的,用 ajax 异步调用新增加登录论坛的页面(/aspx/1/loginuser.aspx),登录亦然(/aspx/1/logoutuser.aspx),页面代码如下:

// 代码:/aspx/1/loginuser.aspx
<%@ Page language="c#" AutoEventWireup="false" EnableViewState="false" %>
<%@ Import Namespace="Discuz.Common" %>
<%@ Import Namespace="Discuz.Forum" %>
<%@ Import Namespace="Discuz.Config" %>

<%

// 验证用户
int uid = Users.CheckPassword(DNTRequest.GetString("u"), DNTRequest.GetString("p"), true);
if (uid != -1)
{
    //删除之前的错误登录信息
    LoginLogs.DeleteLoginLog(DNTRequest.GetIP());

    //根据积分公式刷新用户总积分
    UserCredits.UpdateUserCredits(uid);

    //写入用户登录后的cookie
    ForumUtils.WriteUserCookie(uid, -1, GeneralConfigs.GetConfig().Passwordkey);

    //更新该用户最后访问时间
    Users.UpdateUserLastvisit(uid, DNTRequest.GetIP());

    Statistics.ReSetStatisticsCache();

    Response.Redirect("/");
}

%>

 

// 代码:/aspx/1/logoutuser.aspx
<%@ Page language="c#" AutoEventWireup="false" EnableViewState="false" %>
<%@ Import Namespace="Discuz.Common" %>
<%@ Import Namespace="Discuz.Forum" %>
<%@ Import Namespace="Discuz.Config" %>

<%
GeneralConfigInfo config = GeneralConfigs.GetConfig();
Discuz.Entity.OnlineUserInfo oluserinfo = OnlineUsers.UpdateInfo(config.Passwordkey, config.Onlinetimeout);

OnlineUsers.DeleteRows(oluserinfo.Olid);
ForumUtils.ClearUserCookie();

if (!DNTRequest.GetString("r").Equals(""))
    Response.Redirect(DNTRequest.GetString("r"));
else
    Response.Redirect("/");
%>

 

论坛这边:

首先将 Discuz.Web 项目的 .Net Framework 改为 3.5的,并添加 System.Xml.Linq 和 ZhengQuan.Framework 的引用。

论坛注册的,同样也是采用扩展类,添加一个扩展类(\UI\Extensions.cs),对 UserInfo 类添加一个扩展方法(CreateUpdateMainSiteUser),同样在注册修改等页面添加相应的调用代码即可。

论坛添加调用的文件有:

/aspx/1/register.aspx.cs 行279-280
/aspx/1/usercpprofile.aspx.cs 行185-188
/aspx/1/usercpnewpassword.aspx.cs 行74-76

论坛后台的暂时没考虑,因为考虑对用户操作一般在系统后台,有空再加上。


从论坛的登录和退出无和主站同步!


如果不用导入数据,至此,论坛的部署就到此结束。

接触触发器

触发器是数据库服务器中发生事件时自动执行的特种存储过程。如果用户要通过数据操作语言 (DML) 事件编辑数据,则执行 DML 触发器。DML 事件是针对表或视图的 INSERT、UPDATE 或 DELETE 语句。

现在有一个这样的需求,想在插入新数据到 news 表时,先对 title 字段进行检查,要是有相同数据的就停止插入。

先创建一个触发器:checknews

CREATE TRIGGER checknews -- checknews 为触发器名称
ON news -- ON 后面是触发器所属表
AFTER INSERT -- 触发器类型
AS
begin
if exists(select 1 from inserted join news on inserted.title=news.title)
  ROLLBACK TRANSACTION
end

咋一看,没什么问题,其实达不到我们想要的效果;指定触发器类型有三个关键词,分别是:FOR, AFTER, INSTEAD OF

AFTER:它是先执行操作,再运行触发器的,像上面的触发器,是永远都无法往表添加记录的。

FOR:如果仅指定 FOR 关键字,则 AFTER 为默认值,经测试我觉得 AFTER 和 FOR 为同样的效果。

INSTEAD OF:它不执行其所定义的操作(INSERT,UPDATE,DELETE),也就是用户操作,而执行触发器本身!也就是说,尽管触发器被触发,但相应的操作并不执行,而运行的仅是触发器 SQL 语句本身。对于统一操作只能定义一个 INSTEAD OF 触发器!

明白以上的,改一下触发器:

CREATE TRIGGER checknews
ON news
AFTER INSERT
AS
begin
declare @count int
select @count = count(*) from inserted join news on inserted.title=news.title
if @count > 1
  ROLLBACK TRANSACTION -- 回滚
end

至此,需求就实现了,如果说一定要用 exists,怎么实现呢?那就用 INSTEAD OF 了。


CREATE TRIGGER checknews
ON news
INSTEAD OF INSERT
AS
begin
if not exists(select 1 from inserted join news on inserted.title=news.title)
  INSERT INTO news SELECT [title], [image] FROM inserted
end


刚接触触发器(我就是)的朋友可能会问 inserted 是什么?它是一个临时表,还有 deleted,均是用在触发器的,详细介绍请看:

http://tech.ccidnet.com/art/1106/20080310/1384913_1.html