Posted by Spoony - 2010.6.16 at 4:38 PM
了解Qt是比较早的,可是一直没有耐心去做一个练习。近期花了差不多两周时间做了次Qt开发练习,基本完成了Qt的入门,逃脱微软平台又迈出了几小步。Qt虽然是C++的,但开发应用是比较方便的,我觉得它在界面设计、消息传递方面超过了Delphi,甚至在一些方面更优于.net WinForm。给入门造成门槛的是关于Qt的中文资料相对较少,遇到问题寻找解决方法的成本较高,需要极大的耐心。
在学习Qt的时候在考虑一个问题——数据如何做到一定程度的保密而且能对数据进行方便的查询?首先想到是用数据库,而数据库需要有专门的数据库服务器支持,比如Oracle、MySQL、SQLServer,有没有一种不需要数据库服务器支持的数据库呢?自然又会想到Access、SQLite等。Access 的加密形同虚设,SQLite要支持加密需要修改并重新编译其源码或者购买高级的SQLite版本。
当我打开Qt自带的关于数据库操作的Demo时,无意看到两行代码:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
用的是上面提到的SQLite数据库,而这个数据库的路径并不像是在本地文件的路径。经查,这么设定可以直接在内存中创建一个SQLite数据库。这样,数据是可以实现不落地的。那么一个具有一定保密功能,同时又拥有数据库查询性能,而且无需数据库服务器支持的数据存储方案有了。大概思路是这样的:
1.在资源文件中附加文本格式的数据文件,如果对安全性还有担心,可以加密这个数据文件。
2.在程序第一次启动时在内存中创建SQLite数据库,将这些数据插入到库中。
这样之后,当需要对数据进行查询、排序操作时就可以方便地通过数据库功能来实现了,同时保证数据库不落地,数据是比较安全的。唯一要付出的成本是每次程序启动时都要去将数据插入到即时创建的数据库中,适用于数据条数和单笔数据都不大,而查询性能要求较高的情况。
Posted by Spoony - 2010.3.31 at 7:20 PM
给大家推荐一个免费的线上IDE——Coderun Studio。这款IDE支持在线创建项目、在线调试、在线运行,咋一看有点云计算的味道。目前支持C#和PHP,可以在线创建ASP.NET、WPF、Silverlight等项目,对于简单的Web开发这一块,还算够用。
Coderun Studio的界面十分简单,和在本地做开发的时候感觉基本上一致。就是加载的时候,速度有些慢。不过能够随时随地地免费使用这么一款在线IDE,速度慢一点也还可以接受。用它开发的项目文件可以下载保存到本地,当然也可以从本地上传已有的项目文件。
在线地址:http://www.coderun.com/ide/
Posted by Spoony - 2010.3.16 at 4:3 PM
两个同龄的年轻人同时受雇于一家店铺,并且拿同样的薪水。可是叫阿诺德的小伙子青云直上,而那个叫布鲁诺的小伙子却仍在原地踏步。
布鲁诺很不满意老板的不公正待遇。终于有一天他到老板那儿发牢骚了。老板一边耐心地听着他的抱怨,一边在心里盘算着怎样向他解释清楚他和阿诺德之间的差别。
“布鲁诺先生,”老板开口说话了,“您今早到集市上去一下,看看今天早上有什么卖的。
布鲁诺从集市上回来向老板汇报说,今早集市上只有一个农民拉了一车土豆在卖。
“有多少?”老板问。
布鲁诺赶快戴上帽子又跑到集上,然后回来告诉老板一共40口袋土豆。
“价格是多少?”布鲁诺又第三次跑到集上问来了价钱。
“好吧,”老板对他说,“现在请您坐到这把椅子上一句话也不要说,看看别人怎么说。”
阿诺德很快就从集市上回来了,并汇报说到现在为止只有一个农民在卖土豆,一共40口袋,价格是多少多少;土豆质量很不错,他带回来一个让老板看看。这个农民一个钟头以后还弄来几箱西红柿,据他看价格非常公道。昨天他们铺子的西红柿卖得很快,库存已经不多了。他想这么便宜的西红柿老板肯定会要进一些的,所以他不仅带回了一个西红柿做样品,而且把那个农民也带来了,他现在正在外面等回话呢。
此时老板转向了布鲁诺,说:“现在您肯定知道为什么阿诺德的薪水比您高了吧?”
这不是一则新故事,从大众角度来看,这则故事告诉我们工作需要用心细致;从交互设计的专业角度来看,这则故事又告诉我们一个道理——优秀的信息架构如同优质的服务,它应该是超出期望的。我想这故事应该还能从更多的角度去理解其中的寓意,然而不管从哪个角度去理解,这里面的寓意都让我颇受启发。
作为界面,提供的信息欠缺或者并没有把用户最关注的信息直接提供出来显然就如同故事中的布鲁诺。但是不是一定要像阿诺德那样做呢?我看也未必,但我绝对认为他比布鲁诺在工作上出色不少,或者是故事本身急切地表达某种意思而夸大了阿诺德的行为。我要说的是原本我以为尽量多地将信息提供在博客上是非常恰如其份的,然而事实并非如此,也许这样会让一些耐心的人更加容易地接受到更多的信息,而对于潜在的受众来讲这可能是一扇阻挡他们好奇心入侵的铁栅门。
用户界面的信息架构,这是我希望想去关注的。恰当地把握用户界面所呈现的信息量和呈现方式,需要多些研究。
Posted by Spoony - 2010.2.23 at 8:17 PM
某处看到的一篇文章,{禽兽}效应的汇总。也许也不全是“禽兽”,其中一些不好独居一类,于是便给也略归了“禽兽”一类。没看之前也许只知道其中的一些,此文起到了总结归纳的作用,遂转于此。
1、蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶翅膀偶尔振动,也许两周后就会引起美国得克萨斯州的一场龙卷风。
蝴蝶效应是说,初始条件十分微小的变化经过不断放大,对其未来状态会造成极其巨大的差别。有些小事可以糊涂,有些小事如经系统放大,则对一个组织、一个国家来说是很重要的,就不能糊涂。
2、青蛙现象:把一只青蛙直接放进热水锅里,由于它对不良环境的反应十分敏感,就会迅速跳出锅外。如果把一个青蛙放进冷水锅里,慢慢地加温,青蛙并不会立即跳出锅外,水温逐渐提高的最终结局是青蛙被煮死了,因为等水温高到青蛙无法忍受时,它已经来不及、或者说是没有能力跳出锅外了。
青蛙现象告诉我们,一些突变事件,往往容易引起人们的警觉,而易致人于死地的却是在自我感觉良好的情况下,对实际情况的逐渐恶化,没有清醒的察觉。
3、鳄鱼法则:其原意是假定一只鳄鱼咬住你的脚,如果你用手去试图挣脱你的脚,鳄鱼便会同时咬住你的脚与手。你愈挣扎,就被咬住得越多。所以,万一鳄鱼咬住你的脚,你唯一的办法就是牺牲一只脚。More...
Posted by Spoony - 2010.2.11 at 9:58 PM
自打twitter被GFW墙掉后,方便的twhirl也连不上,更新不了。这两天又心血来潮还想写写微博,新浪微博不管是受众还是平台都不错的说,但因早先一段宝贵的校园时光都无私地奉献给了墙外的twitter,又不忍割舍,遂找了个简单的方法来解决这一矛盾。这方法说来复杂,其实简单。基于Google AppEngine,以GoogleApp做代理,用twhirl更新墙外的twitter;再还是以GoogleApp做定时同步器,几乎实时地将墙外的twitter数据同步到墙内的新浪微博。
这样一来twitter更新上了,新浪微博也“实时”同步给墙内的用户去看,一劳永逸。以后您又可以 Follow my twitter,墙内的朋友可跟随我的新浪微博了。
上述解决方案可以参考月光的两则博文:Google App Engine搭建Twitter API Proxy教程和以Twitter为中心的微博同步工具。
Posted by Spoony - 2010.1.7 at 10:13 PM
前阵子找行业新闻调用的时候无意中找到了Google 新闻栏,感觉这东西不仅有意思还很有用,介绍给大家。
选择样式,设定搜索关键词和栏目标题即可看到预览。其优点如下:
1.AJAX调用,不影响页面加载
2.支持关键词新闻搜索,而且可以自定义多个关键词的组合
3.可DIY显示样式
地址:http://www.google.com/uds/solutions/wizards/newsbar.html
Posted by Spoony - 2009.10.17 at 7:16 PM
总是有需要在个人PC和公司电脑上保存一些凌乱但有用的笔记、备忘。而之前用一个文件保存,换个地方不能及时共享。本来打算自己写一个这样的应用,经过调查身边的朋友们,大都有同样的需求。当我准备开始设计这项服务的时候,在Google Lab 里面找了找,不料还真找到了一个东西——Google Notebook。

貌似这个东西不久前才正式从 Google Lab “毕业”,完全能满足我准备设计的需求。支持笔记分类、标签、备注等功能。最方便的当然要属强大的编辑功能了,随记随保存,完全是自动的。
Google 真是一点也不给其他人机会为互联网应用做点事情啊,有想法的人要想发挥自己的创意,实现自己的想法,最好的途径大概也就是加入这家公司了。
经过一段时间的使用发现还不错,推荐给大家,不知道有多少人已经在用了。
Posted by Spoony - 2009.8.13 at 11:35 PM
Open Web Application Security Project (开放式Web应用程序安全项目,缩写为OWASP)总结出了现有Web应用程序在安全方面常见的十大漏洞,以提醒企业及其程序开发人员尽量避免它们给企业IT系统带来的安全风险:
非法输入 Unvalidated Input
在数据被输入程序前忽略对数据合法性的检验是一个常见的编程漏洞。随着OWASP对Web应用程序脆弱性的调查,非法输入的问题已成为大多数Web应用程序安全漏洞方面的一个普遍现象。
失效的访问控制 Broken Access Control
大部分企业都非常关注对已经建立的连接进行控制,但是,允许一个特定的字符串输入可以让攻击行为绕过企业的控制。
失效的账户和线程管理 Broken Authentication and Session Management
有良好的访问控制并不意味着万事大吉,企业还应该保护用户的密码、会话令牌、账户列表及其它任何可为攻击者提供有利信息、能帮助他们攻击企业网络的内容。
跨站点脚本攻击 Cross Site Scripting Flaws
这是一种常见的攻击,当攻击脚本被嵌入企业的Web页面或其它可以访问的Web资源中,没有保护能力的台式机访问这个页面或资源时,脚本就会被启动,这种攻击可以影响企业内成百上千员工的终端电脑。
缓存溢出问题 Buffer Overflows
这个问题一般出现在用较早的编程语言、如C语言编写的程序中,这种编程错误其实也是由于没有很好地确定输入内容在内存中的位置所致。
注入式攻击 Injection Flaws
如果没有成功地阻止带有语法含义的输入内容,有可能导致对数据库信息的非法访问,在Web表单中输入的内容应该保持简单,并且不应包含可被执行的代码。
异常错误处理 Improper Error Handling
当错误发生时,向用户提交错误提示是很正常的事情,但是如果提交的错误提示中包含了太多的内容,就有可能会被攻击者分析出网络环境的结构或配置。
不安全的存储 Insecure Storage
对于Web应用程序来说,妥善保存密码、用户名及其他与身份验证有关的信息是非常重要的工作,对这些信息进行加密则是非常有效的方式,但是一些企业会采用那些未经实践验证的加密解决方案,其中就可能存在安全漏洞。
程序拒绝服务攻击 Application Denial of Service
与拒绝服务攻击 (DoS)类似,应用程序的DoS攻击会利用大量非法用户抢占应用程序资源,导致合法用户无法使用该Web应用程序。
不安全的配置管理 Insecure Configuration Management
有效的配置管理过程可以为Web应用程序和企业的网络架构提供良好的保护。
这篇文章是转载的,有空把自己总结的一些安全编码规范发上来。
Posted by Spoony - 2009.7.30 at 11:7 PM
耍宝的文章丰富了,为了平均新旧文章的阅读次数,发挥沉淀的经典旧文的价值,在朋友的启发下,准备开发一个随机文章推介的小部件。这个部件的功能是在所有文章中随机选取一定数量的文章显示在部件区域(WidgetZone),显示文章的数量可以自行设定。演示效果见 www.shuabao.net。
在 widgets 目录建立 RandomPosts 目录,并创建 widget.ascx 和 edit.ascx 用户控件,其中 edit.ascx 用于设定显示文章的数量。下面给出 widget.ascx.cs 里面的关键程序段以实现随机选取一定数量的文章并显示。
public override void LoadWidget()
{
StringDictionary settings = GetSettings();
int numberOfPosts = DEFAULT_NUMBER_OF_POSTS;
if (settings.ContainsKey("numberofposts"))
numberOfPosts = int.Parse(settings["numberofposts"]);
if (HttpRuntime.Cache["widget_randomposts"] == null)
{
List visiblePosts = Post.Posts.FindAll(delegate(Post p)
{
return p.IsVisibleToPublic;//仅显示对游客可见文章
});
int max = Math.Min(visiblePosts.Count, numberOfPosts);
List list = new List();
for (int i = max; i > 0; i--)
{
Random random = new Random();
int r = random.Next(0, visiblePosts.Count);//生成随机数
list.Add(visiblePosts[r]);
visiblePosts.RemoveAt(r);
}
HttpRuntime.Cache.Insert("widget_randomposts", list, null,
DateTime.Now.AddMinutes(15), TimeSpan.Zero);//缓存文章列表,每15分钟更新
}
string content = RenderPosts((List)HttpRuntime.Cache["widget_randomposts"], settings);
LiteralControl html = new LiteralControl(content);
phPosts.Controls.Add(html);
}
private string RenderPosts(List posts, StringDictionary settings)
{
if (posts.Count == 0)
{
return "" + Resources.labels.none + "";
}
StringBuilder sb = new StringBuilder();
sb.Append("");
foreach (Post post in posts)
{
if (!post.IsVisible)
continue;
sb.AppendFormat(link, post.RelativeLink, HttpUtility.HtmlEncode(post.Title));
}
sb.Append("");
return sb.ToString();
}
试用源码:RandomPosts.rar (2.97 kb) 如有问题请联系我。