あまみや ゆうこ » PAGE6

谁束缚了你的数据库?

过程不重要,重要的是结果!

在程序开发中,难免遇到复杂的逻辑,那么如何持久化存储这些数据?

我相信任何一个从事关系型数据库开发的人员,都了解1NF~6NF,那么为什么要按照范式进行数据库结构设计呢,其目的是减少冗余字段。

第一范式(1NF): 无重复的列,不存在某列包含其他列的内容。
第二范式(2NF): 数据库表中的每一行必须可以被唯一地区分。
第三范式(3NF): 数据库表中不包含已在其它表中已包含的非主关键字信息。

现在试想一个案例,客户提供了城市与城市边界的GPS坐标点数个,现在要求输入一个坐标点,输出这个坐标属于哪个城市,那么这个数据库要如何存储呢?注意,这里说的是如何存储,而不是如何计算这个点在不在边界范围内。

如果按照常规的关系型数据库要求的1NF~3NF设计,那么结果应该是这样的:

更多内容 »

Published on 4/26/2016 9:28:25 AM

微软MVP大礼包拆解教程

1、取出MVP大礼包

file

2、打开包装,证书位于盖子上,内附奖杯盒、胸针、祝贺信、胸卡。

file

3、胸卡背面

file

4、胸卡正面

file

更多内容 »

Published on 4/8/2016 10:38:24 PM

Google Pipe

其实,写这个项目之前,我的本意是在于研究CDN动态云加速技术,但是却写了一个Google镜像的Demo。

Google pipe 是基于ASP.Net Core 1.0开发的谷歌反向代理网站。

演示网址:http://www.gglink.pw

您可以在Linux、Windows、Mac上部署这个网站系统,但前提是能够访问到www.google.com,这样就可以让其他用户通过您的网站访问Google了。

部署时,需要修改Startup.cs中app.UseReverseProxy中第二个参数,即域名部分。请在解析列表中使用泛解析,即*.yourdomain.postfix

这个GitHub仓库中存储的是源代码,不是发布版本,因此如果您欲直接使用源代码部署,可能需要安装相应的环境,如dnvm、dnx、dnu等必要软件,您可以参阅微软官方网站获得更多信息:http://docs.asp.net

这份代码只有短短37行,即Startup.cs,只需要引用NuGet包:CodeComb.AspNet.ReverseProxy即可实现反向代理,支持泛域名。

using System.Net;

更多内容 »

Published on 3/20/2016 5:35:56 PM

Razor引擎解析

Razor作为ASP.Net MVC的模板引擎被人熟知,其语法简练,易于上手的优秀特点被人赞叹。

因此我开发的jFlick也希望支持这种模板引擎,首先就需要我们解析这种语法规则,将Razor与HTML分离,分离后动态执行Razor的语句即可。

Razor语法规则

规定HTML代码以<someTag>开始,以</someTag>结束,有个别标签是自闭合标签,比如<br />

规定Razor代码以@开始,带有括号(无论圆括号还是花括号)遇到匹配的结束括号为止,在花括号中可以嵌套HTML代码,嵌套的HTML代码将在相应逻辑下被输出。在特殊情况下,Razor代码可以简化成不带有括号的形式,具体表现为第1条与第3条。

1、@+单句表达式形式:

例:

@someArray.length
@someArray[0]

更多内容 »

Published on 3/13/2016 9:55:17 PM

jFlick - 移动端前端Mvc框架设计

最近在研究Cordova,使用HTML5与Javascript来写App固然是一个不错的选择,但是同时也存在着诸多的问题,比如使用HTML编写的app很难与原生系统体验一致,比如页面跳转时没有动画等。因此激起了我开发这样一套前端Mvc框架的兴趣。

我给它取名为jFlick(效仿jQuery),理论上讲,这套框架不仅仅局限于与Cordova配合,还可以用于制作手机网站。

也许ionic与cordova的配合被人们广泛认知,但是我简单了解ionic时,觉得它真的不是很方便,首先编写页面使用的标签都不是HTML规范中的标签,都是诸如<ionic-xxx></ionic-xxx>之类的标签,这样一来,开发者需要先了解ionic中都有什么标签,都能做什么,才能进行开发。而我的框架定位是轻量级、易上手。

我的框架中,设计了路由机制,可以根据路由规则来与前台绑定事件,比如我们建立一个homeController.js,那么可以按照下面的代码来编写程序逻辑:

router.get('/home/index', function (req, res, next) {
    alert('Hello world!');
});

router.get('/home/page', function (req, res, next) {
    alert('name=' + req.query.name);
    res.find('#btnCalc').click(function () {

更多内容 »

Published on 3/9/2016 8:03:59 PM