[转载]百度地图API详解之地图坐标系统

mikel阅读(1215)

[转载]百度地图API详解之地图坐标系统 – jz1108 – 博客园.

我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需要一个转换过程,这个过程就叫做投影(Projection)。在地球上我们通过经纬度来描述某个位置,而经过投影之后的地图也有自己的坐标系统,本篇文章就来详细介绍在百度地图API中涉及的各种坐标体系。

在百度地图API中,你需要了解如下坐标系:

  • 经纬度:通过经度(longitude)和纬度(latitude)描述的地球上的某个位置。
  • 平面坐标:投影之后的坐标(用x和y描述),用于在平面上标识某个位置。
  • 像素坐标:描述不同级别下地图上某点的位置。
  • 图块坐标:地图图块编号(用x和y描述)。
  • 可视区域坐标:地图可视区域的坐标系(用x和y描述)。
  • 覆盖物坐标:覆盖物相对于容器的坐标(用x和y描述)。

别被这么多的坐标系吓着,看完了后面的讲解相信你会逐渐理解它们。


经纬度

这个就不多说了,不熟悉的可以翻翻地理书。但需要注意的是即便同是经纬度坐标也可 能属于不同的坐标体系。一般GPS设备获取的经纬度属于WGS84坐标系,这是一个比较通用的坐标体系。由于某些原因国内不能直接使用WGS84坐标,因 此百度地图API的经纬度是经过加密偏移的。


平面坐标

前面说过,球面上的形状需要经过投影才能变换为平面上的形状,变换后就需要有一个平面坐标系统来描述地图上某个位置。百度地图API默认使用墨卡托投影(Mercator Projection),同样需要注意的是由于投影参数不同,同样是墨卡托投影也会有所差别。

平面坐标系的原点与经纬度的原点一致,即赤道与0度经线相交的位置:

在百度地图API中,平面坐标是以最大级别18级为基准的。就是说在18级下,平 面坐标的一个单位就代表了屏幕上的1个像素。平面坐标与地图所展示的级别没有关系,也就是说在1级和18级下,天安门位置的平面坐标都是一致的。那么如何 知道某个位置的平面坐标呢?可通过BMap.MercatorProjection类来完成,该类提供经纬度与平面坐标互相转换的方法。例如天安门的经纬 度大约为116.404, 39.915,经过转换即可得到平面坐标:

var projection = new BMap.MercatorProjection();
var point = projection.lngLatToPoint(new BMap.Point(116.404, 39.915));
alert(point.x + ", " + point.y);

var projection = new BMap.MercatorProjection();
var point = projection.lngLatToPoint(new BMap.Point(116.404, 39.915));
alert(point.x + “, ” + point.y);

结果如下:

这个就是平面坐标。你可以这样理解它的含义:第18级下,天安门距离坐标原点的位置差为:12958175, 4825923.77,单位为像素。

像素坐标

在第18级下,我们直接将平面坐标向下取整就得到了像素坐标,而在其他级别下可以通过如下公式进行换算(这里取整为向下取整):

像素坐标 = |平面坐标 × 2 zoom - 18|

比如经过计算,在第4级天安门位置的像素坐标是:790, 294


不同级别下,同一个地理位置的像素坐标是不一样的,它与当前地图的级别相关。


图块坐标

百度地图API在展示地图时是将整个地图图片切割成若干图块来显示的,当地图初始化或是地图级别、中心点位置发生变化时,地图API会根据当前像素坐标计算出视野内需要的图块坐标(也叫图块编号),从而加载对应的图块用以显示地图。

百度地图的图块坐标原点与平面坐标一致,从原点向右上方开始编号为0, 0:

如何知道某个位置的图块坐标呢?通过如下公式计算即可(这里为向下取整):

图块坐标 = |像素坐标 ÷ 256|

256实际上是每个图块的宽度和高度,我们用像素坐标除以这个数就知道图块坐标了。还以天安门为例,在第4级下天安门所在的图块编号为:3, 1,而在第18级下,图块编号为:50617, 18851


可视区域坐标

地图都是显示在确定大小的矩形框中的,这个矩形框通常是开发者在初始化地图传入的某个容器元素。这个矩形框也有自己的坐标系,在百度地图API中称之为可视区域坐标系,它的原点位于矩形的左上角。

通过Map类的pointToPixel和pixelToPoint方法可以相互转换经纬度坐标与可视区域坐标。


覆盖物坐标

覆盖物在实现上就是若干DOM元素,这些元素会被放在若干覆盖物容器内(具体请参 考地图API开发指南),那么覆盖物的坐标实际上就是相对于这些覆盖物容器的坐标。在地图初始化完成后,覆盖物容器的左上角与地图可视区域左上角位置相 同,一旦地图被移动、缩放,覆盖物容器位置就会发生变化。在自定义覆盖物的时候API提供经纬度信息,而开发者需要自行将经纬度转换为覆盖物的像素坐标, 从而覆盖物才能显示在正确的位置上。这个转换过程可以通过Map的pointToOverlayPixel和overlayPixelToPoint两个 方法来实现。

讲这么多都快晕了吧,我们最后通过一个完整的代码示例来回顾上面所提到的坐标系概念:





地图坐标概念
<script src="http://api.map.baidu.com/api?v=1.2"></script>
 <script type="text/javascript">// <!&#91;CDATA&#91;
var map = new BMap.Map('map_container', {defaultCursor: 'default'});
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);

var TILE_SIZE = 256;

map.addEventListener('click', function(e){
var info = new BMap.InfoWindow('', {width: 260});
var projection = this.getMapType().getProjection();

var lngLat = e.point;
var lngLatStr = "经纬度:" + lngLat.lng + ", " + lngLat.lat;

var worldCoordinate = projection.lngLatToPoint(lngLat);
var worldCoordStr = "
平面坐标:" + worldCoordinate.x + ", " + worldCoordinate.y;

var pixelCoordinate = new BMap.Pixel(Math.floor(worldCoordinate.x * Math.pow(2, this.getZoom() - 18)),
Math.floor(worldCoordinate.y * Math.pow(2, this.getZoom() - 18)));
var pixelCoordStr = "
像素坐标:" + pixelCoordinate.x + ", " + pixelCoordinate.y;

var tileCoordinate = new BMap.Pixel(Math.floor(pixelCoordinate.x / 256),
Math.floor(pixelCoordinate.y / 256));
var tileCoordStr = "
图块坐标:" + tileCoordinate.x + ", " + tileCoordinate.y;

var viewportCoordinate = map.pointToPixel(lngLat);
var viewportCoordStr = "
可视区域坐标:" + viewportCoordinate.x + ", " + viewportCoordinate.y;

var overlayCoordinate = map.pointToOverlayPixel(lngLat);
var overlayCoordStr = "
覆盖物坐标:" + overlayCoordinate.x + ", " + overlayCoordinate.y;

info.setContent(lngLatStr + worldCoordStr + pixelCoordStr + tileCoordStr +
viewportCoordStr + overlayCoordStr);
map.openInfoWindow(info, lngLat);
});
// &#93;&#93;></script>

效果如图:

[转载]40个高质量免费Flash网站模板下载

mikel阅读(1066)

[转载]40个高质量免费Flash网站模板下载 – 梦想天空(山边小溪) – 博客园.

Flash被大量应用于网页的矢量动画设计,是网页的重要组成部分,Flash让网站拥有更丰富的媒体内容,更流畅的用户交互。本文收集了40个高质量免费Flash网站模板,您可以免费下载使用,希望这些网站模板能帮助到您。

1. Business Corporate

flash web templates

2. Photographer’s Portfolio

flash web templates

3. The Gray Hotel Template

flash web templates

4. Smartco Business Company

flash web templates

5. The Ultimate Museum Site
flash web templates

6. The Yellow Business Site

flash web templates

7. European Restaurant

flash web templates

8. Auto Company

flash web templates

9. Your Own Band Template

flash web templates

10. Our Wedding Template

flash web templates

11. The Car Dealer Template

flash web templates

12. Business Constructions 2

flash web templates

13. Car Online

flash web templates

14. Books Company 2

flash web templates

15. The Blue Family Page

flash web templates

16. My Brown Personal Site

flash web templates

17. GlaModels

flash web templates

18. Animal Official Site

flash web templates

19. The Boy Scout Green Template

flash web templates

20. New Collection

flash web templates

21. Corporate Center

flash web templates

22. Global Digital Solutions Online

flash web templates

23. Communication Company

flash web templates

24. Global Business Ideas

flash web templates

25. Online Creative Solutions

flash web templates

26. Super Bike Club

flash web templates

27. Consulting Group

flash web templates

28. Create Your Style

flash web templates

29. Disco Club

flash web templates

30. Fashion Portfolio

flash web templates

31. S-Shape

flash web templates

32. Pure HD Touch

flash web templates

33. Chocolate Website

flash web templates

34. Design Studio

flash web templates

35. Microphone company

flash web templates

36. Movie

flash web templates

37. Elastic

flash web templates

38. Design

flash web templates

39. Studio Design

flash web templates

40. Film

flash web templates

[转载]Java:Dom4j下载及使用教程

mikel阅读(1329)

[转载]Java:Dom4j下载及使用教程.

要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/
目前最新dom4j包下载地址:http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip

解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar.

以下是相关操作:

一.Document对象相关

1.读取XML文件,获得document对象.
SAXReader reader = new SAXReader();
Document  document = reader.read(new File(“input.xml”));

2.解析XML形式的文本,得到document对象.
String text = “<members></members>”;
Document document = DocumentHelper.parseText(text);
3.主动创建document对象.
Document document = DocumentHelper.createDocument();
Element root = document.addElement(“members”);// 创建根节点
二.节点相关

1.获取文档的根节点.
Element rootElm = document.getRootElement();
2.取得某节点的单个子节点.
Element memberElm=root.element(“member”);// “member”是节点名
3.取得节点的文字
String text=memberElm.getText();
也可以用:
String text=root.elementText(“name”);这个是取得根节点下的name字节点的文字.

4.取得某节点下名为”member”的所有字节点并进行遍历.
List nodes = rootElm.elements(“member”);

for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
}
5.对某节点下的所有子节点进行遍历.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
}
6.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement(“age”);
7.设置节点文字.
ageElm.setText(“29”);
8.删除某节点.
parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点
三.属性相关.
1.取得某节点下的某属性
Element root=document.getRootElement();
Attribute attribute=root.attribute(“size”);// 属性名name
2.取得属性的文字
String text=attribute.getText();
也可以用:
String text2=root.element(“name”).attributeValue(“firstname”);这个是取得根节点下name字节点的属性firstname的值.

3.遍历某节点的所有属性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}
4.设置某节点的属性和文字.
newMemberElm.addAttribute(“name”, “sitinspring”);
5.设置属性的文字
Attribute attribute=root.attribute(“name”);
attribute.setText(“sitinspring”);
6.删除某属性
Attribute attribute=root.attribute(“size”);// 属性名name
root.remove(attribute);
四.将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”));
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式写入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(“GBK”);    // 指定XML编码
XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”),format);

writer.write(document);
writer.close();
五.字符串与XML的转换
1.将字符串转化为XML
String text = “<members> <member>sitinspring</member> </members>”;
Document document = DocumentHelper.parseText(text);
2.将文档或节点的XML转化为字符串.
SAXReader reader = new SAXReader();
Document  document = reader.read(new File(“input.xml”));
Element root=document.getRootElement();
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.element(“member”);
String memberXmlText=memberElm.asXML();
六.使用XPath快速找到节点.
读取的XML文档示例
<?xml version=”1.0″ encoding=”UTF-8″?>
<projectDescription>
<name>MemberManagement</name>
<comment></comment>
<projects>
<project>PRJ1</project>
<project>PRJ2</project>
<project>PRJ3</project>
<project>PRJ4</project>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

使用XPath快速找到节点project.
public static void main(String[] args){
SAXReader reader = new SAXReader();

try{
Document  doc = reader.read(new File(“sample.xml”));

List projects=doc.selectNodes(“/projectDescription/projects/project”);

Iterator it=projects.iterator();

while(it.hasNext()){
Element elm=(Element)it.next();
System.out.println(elm.getText());
}

}
catch(Exception ex){
ex.printStackTrace();
}
}

[转载]18款适用于开发人员的网页代码编辑器

mikel阅读(1158)

[转载]18款适用于开发人员的网页代码编辑器_IT新闻_博客园.

本文介绍18款极具价值的网页代码编辑器。
1.Codeanywhere

clip_image002

Codeanywhere 是运行在浏览器上的代码编辑器,内嵌一个强大的FTP客户端。目前支持多数流行的网页格式(HTML、PHP、JavaScript、CSS和XML)。 Codeanywhere支持编辑多种类型的文件,集成了桌面编辑器中所有好的特征:高亮显示语法、自动填充代码、智能缩进、支持无限次的撤销和重做、无 数个tabs。
2.CodeRun Studio

clip_image003

CodeRun Studio提供了一个跨平台的集成开发环境。它帮助你在浏览器上轻松开发,调试,以及部署Web应用程序。你可以通过上传已有代码给好友共享的方式来测试它的功能。
3.Cloud9ide

clip_image004

Cloud9利用了云技术,运行在浏览器中,允许你随时随地运行、调试和部署应用程序。一个完整的game-changer会永久性的改变应用程序的开发方式。Cloud 9可以让你集中精力编程,不用顾及到搭建环境等琐事中。
4.Kodingen

clip_image005

Kodingen 是一种在线开发环境,在线代码编辑器,基于网页的代码编辑器。
5.Ecoder

clip_image006

Ecoder是基于网页的代码编辑器,它包含了一个文件浏览器、文件上传器、tabbed系统,支持同时编辑多个文件。这个web应用程序方便开发人员直接在线编辑代码,支持实时的语法高亮。
6.ShifEdit

clip_image007

ShifEdit提供了在线的集成开发环境,方便开发人员通过FTP、SFTP以及Dropbox来开发PHP、Ruby、Python、Perl、Java、HTML、CSS 以及JavaScript
7.Workspace

clip_image008

clip_image009

Workspace提供了在线的开发环境,方便管理基于网页的项目。它内嵌语法高亮编辑器,提供强大的编辑功能,支持在远程服务器端编辑文本,PHP、JavaScript、HTML、Java、Perl、SQL 等其它类型的文件。
8.JSFIDDLE

clip_image010

JSFIDDLE方便我们从HTML、CSS和JavaScript中编辑代码片段。支持在博客等平台上同其他人一起共享.
9.Ideone

clip_image011

Ideone是一个在线编译器和调试工具,允许我们在线编译和运行40多种编程语言。选择一种编程语言,输入源代码,在文本框中输入数据,选择是否运行代码,点击提交按钮,你就可以目睹代码的执行片段。
10.CSSDesk

clip_image013

CSSDesk是一个在线的HTML/CSS sandbox。输入你的HTML代码,调成CSS样式。你可以使用浏览器支持的任何一种HTML5或者CSS3标签。
11.Rendera

clip_image014

键入HTML代码,保持CSS样式。你可以使用浏览器中支持的任何一种HTML 5和CSS 3标签。
12.Drawter

clip_image015

Drawter是用JavaScript编写的工具,基于JQuery库。它可以运行在每个网页浏览器上,每个标签可以是绘制的一个层。
13.jsdo.

clip_image017

jsdo.是一个网站,你可以在浏览器中编写JavaScript、HTML5、CSS,并且支持共享。
14.Squad

clip_image019

Squad是一个基于网页的代码编辑器,你可以在任何地方访问它。
15.Ace

clip_image020

Ace是用JavaScript编写的独立代码编辑器,它内嵌在任何网页和JavaScript程序中,Ace是Cloud9 IDE上最主流的编辑器。
16.Amy Editor

clip_image021

Amy Editor是一款在线的源代码和文本编辑器。
17.Practicode

clip_image023

Practicode是一款在线的代码编辑器,方便你练习编写HTML、CSS、Javascript语言等等。
18.JS Bin

clip_image024

JS Bin是一个专门为JavaScript和CSS编程人员来测试片段代码,调试代码的工具。它方便你编辑,和测试JavaScript和HTML。
英文来源:http://www.queness.com/community-news/8390/18-useful-web-based-code-editors-for-developers

[转载]16篇重要的CSS页面打印技巧

mikel阅读(972)

[转载]16篇重要的CSS页面打印技巧_IT新闻_博客园.

很多人喜欢将网页中的重要信息打印出来,但是常常遇到这种情况,网页在浏览器中非常漂亮,打印出来却非常混乱,一些看起来引人注目和五彩缤纷的页面内容,打印出来却差强人意。作为网站设计者,也需要考虑页面对于打印机是否也同样友好。
之前为Web页面创建一个打印机友好的版本意味着要设计一个布局和格式都经过修改的单独页面,这样才能够在打印的时候获得令人满意的效果,而现在不需要这样做。
本文搜集了一些重要的CSS页面打印技巧,可以将打印页面变为打印机友好的版本。这将不仅节省纸张,同时也考虑了打印输出。
1. 打印样式表 – 权威指南

clip_image001

2. 优化你的网站结构以便打印

clip_image002

3. 友好打印使用CSS的图像和Logo

clip_image003

4. CSS技巧:最终获取打印样式表

clip_image004

5. 制作“打印本页”按钮

clip_image005

6. 创建友好打印页面的简单技巧

clip_image006

7. 打印表格

clip_image007

8. 打印样式表:基础知识

clip_image008

9. 7大打印样式表技巧

clip_image009

10. 10个打印样式表技巧

clip_image010

11. 如何制作打印机友好的网页

clip_image011

12. 让您的网站对打印机友好

clip_image012

13. 创建打印CSS样式表需知

clip_image013

14. 改进打印时的链接显示

clip_image014

15. CSS设计:即将打印

clip_image015

16. 完整的CSS打印手册

clip_image016

via http://slodive.com/web-development/css-print-page-tricks/

[原创]Delphi报表开发ReportMachine的小计和总计的计算

mikel阅读(1517)

最近在做一个Delphi的发货清单的打印程序,其中涉及到需要计算清单的小计和总计的功能,文字难以表达清楚,上图吧:

报表第一页的小计计算当前页面的商品价格总和,总计目前和小计一样是计算截止到当前页面的所有商品的金额和,下图为最后一页:

这下大家明白了吧,就是要实现这样的报表。

废话不多说了,开始讲解我的思路:

1.既然要计算小计,就是每页的金额和了,加入ReportMachine的计算文本框(TRMCalcMemoView),然后设置要汇总的字段值为数据字段“factSum”,然后选择计算文本框的属性面板中的“CalcOptions”选中“统计Brand”为要汇总的主项数据,统计类型为“合计(Sum)”,如图所示:

2.最难的部分就是总计的计算,这不能简单的用计算文本框就能解决的,于是不得不用ReportMachine的代码来处理,也就是在总计的文本框的OnBeforePrint事件中计算之前的小计文本框的值的和,然后赋值给总计文本框显示,先看下设计的报表:

红色文字为两项总计的文本框的Name属性值。下面是ReportMachine中自定义的OnBeforePrint事件函数代码如下:

unit Report;
var
   lValue,tValue: Double;//lValue=金额总计 tValue=税额总计

procedure Memo1_OnBeforePrint(Sender: TObject);
begin
    lValue:=lValue+CalcMemo1.CalcValue; //CalcMemo1为金额小计的文本框
    TRMMemoView(Sender).Memo.Text := lValue;
end;
procedure Memo40_OnBeforePrint(Sender: TObject);
begin
    tValue:=tValue+CalcMemo2.CalcValue;//CalcMemo2为税额小计的文本框
    TRMMemoView(Sender).Memo.Text := tValue;
end;

procedure Main;
begin
   Memo1.OnBeforePrint:= Memo1_OnBeforePrint; //指定金额总计的文本框的OnBeforePrint事件的处理函数
   Memo40.OnBeforePrint:= Memo40_OnBeforePrint;//指定税额总计的文本框的OnBeforePrint事件的处理函数
end;

end.

上面的代码先声明了两个事件函数用于计算两个累加的总计的值,然后赋值给相应的总计文本框;然后再Main中指定给总计文本框的事件,这样当打印总计之前先汇总赋值并打印。

[转载]擦亮自己的眼睛去看SQLServer之简单Insert

mikel阅读(924)

[转载]擦亮自己的眼睛去看SQLServer之简单Insert – 小军人 – 博客园.

本来是打算先写SQLServer历史的,不过感觉写那部分内容比较难还需要多查些资料。于是调整了下顺序写下简单的Insert语句。数据库结构还是采用上一篇的结构。具体查看上一篇文章擦亮自己的眼睛去看SQLServer之简单Select今天讨论的语句也比较简单,Insert语句。

一、Insert脚本

insert into Test([Name]) values(‘xiaojun’)

没什么好说的,因为想写这样的语句太简单。

二、 语句分析

这条语句到底发生了什么呢?假设读者已经知道了SQLServer整体架构或者已经阅读过这个系列第一篇文章。当这条语句被可靠的传递到关系引擎中后已经生成执行计划,并且开始被调度执行。接下来就发生了:

写事务日志: 数据修改事务中唯一一个总是需要写入磁盘的操作。并不是修改查询语句的清单,而是修改操作发生之后数据页面的具体变化。是由日志管理器完成。看到写入磁 盘,我们应该立刻联想到性能问题,因为这个操作是总是写入磁盘。如果一条语句的操作的数据很大的话,这个耗时是十分可怕的。举个例子:如果想知道这个差 距,你可以在百万或者千万的表中执行以下两条语句体会以下:truncate table  Test以及delete from Test。当然严谨的同学会说truncate是针对区操作,delete是针对页操作,truncate的锁消耗也比delete的锁消耗少。这些是会 导致truncate比delete快的原因。但是这些原因不是主要原因,主要原因就是这里说的写事务日志,delete是每次删除一行,并在事务日志中 为所删除的每行记录一项,而truncate是通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。既然事务日志会影响性能,为 什么还记录呢?主要解决保护数据以及数据一致性的问题。

接收写请求: 一旦访问方法接收到写事务日志成功的确认信息,就会接收写请求,将写请求发送缓存区管理器。注意了,这里是把请求交给缓存区管理器,缓存区管理器只是操作 缓存跟物理文件没有任何关系。这里强调的目的是,如果没有理解这里说的原理的话。你可能会为自己做了大量的插入操作,而数据文件的大小没有任何变化而感到 匪夷所思。访问方法表面上起了请求传递的作用,其实它很智能有一些比较复杂的算法来预测执行情况。

插入缓冲池:缓冲区管理器在内存中插入数据,插入成功后将确认结果发送给访问方法,最终确认结果到达客户端。

写入数据文件: 这个步骤可以由两个组件任何一个完成。惰性写入器线程定期检查SQLServer空闲缓冲列表的大小,当这个值过低的时候,惰性写入器会扫描整个数据缓 存,将所有一段时间没被使用的页面老化。如果找到一段时间没有被使用的脏页,惰性写入器则将其写入磁盘并且删除,然后将这个页面的内存空间标记为空闲空 间。惰性写入器还会监测服务器上的空闲物理内存,如果内存很少它会将SQLServer的空闲缓冲列表释放给windows,在SQLServer负载很 重时,它还会在服务器有空闲物理内存且已给SQLServer分配的内存还没有达到我们配置的最大服务器内存(max server memory)时增加SQLServer的空闲缓冲列表以适应负载。检查点是检查点线程创建的一个时间点,将保证脏页都写入磁盘,并且在页面头将缓存中的 这个页面标记为干净的页面注意检查点是不删除脏页的。至于检查点的执行时间是要分几种情况的:如果你配置了recovery interval(min),就以这个为准。如果没有配置,并且这上一次检查点结束后写入的事务日志数据超过10MB,则大约每分钟启动一致。还比如,我 们人为执行checkpoint执行,或者执行备份重启命令都会触发检查点。抛开我们人为操作,这个具体时间确实无法确定,SQLServer有内部启发 算法控制这个值。不过我们可以开启一个跟踪标志3502能查看。这个跟踪标志在错误日志中记录了检查点的开始与结束为止。sql语句为:dbcc traceon(3502)

三、结尾

今天主 要就是介绍了插入语句的执行过程,内容不多。你从这个过程中你会发现SQLServer真的很智能。比如这里的预写日志来保护数据,延迟将数据写入磁盘、 预测SQL执行情况、监控负载调整内存等等。设计的都是那么巧妙,大家可以想想如果我们在设计自己的软件时是否可以参考和借鉴呢?

今天分析就到此结束,文中如有描述不当的地方,欢迎指出。共同进步才是硬道理。

[转载]SQL Server表分区(一):基础知识和实现方式

mikel阅读(919)

[转载]SQL Server表分区(一):基础知识和实现方式 – James.H.Fu – 博客园.

1、什么是表分区?
SQL Server使用三种不同类型的文件存储数据,它们分别是.mdf、.ndf和.ldf。主要数据存储在
.mdf文件中,比如表,索引,存储过程等。.ndf文件也用于储存这些数据。.ldf文件用于存储操作日志。
表默认存储在.mdf文件中。更新表时SQL Server会对表锁。那么其它的操作必须等待正在更新操作完成。
如果一个表很大,那么无论是查询操作还是更新操作,性能都会很差。如果将表分别存储在物理上独立但逻辑上连续的
分区中,那么SQL Server可以大幅优化查询操作和更新操作的性能。

2、如何实现表分区?
1)确定分区策略,即划分数据的逻辑规则。比如将整形值小于100的数据放在一个分区上,将大于等于100的数据放在第二个
分区上,等等。
SQL Server中的使用分区函数来实现分区策略:

CREATE PARTITION FUNCTION PF_Order(DATETIME)
AS RANGE RIGHT FOR VALUES
('20090101','20100101','20110101')

2)确定分区存储架构,即划分数据的物理存储规则。最终分区可以存储在主文件组,即.mdf文件中,也可以存储在非主文件组,
即.ndf文件中。
SQL Server中的使用分区架构来实现分区存储架构:

CREATE PARTITION SCHEME PS_Order
AS PARTITION PF_Order
TO ([FG1],[FG2],[FG3],[FG4])

3)将表创建在分区存储架构上,并指定使用哪一列做为划分数据的依据。注意做为划分数据依据的列必须在聚集索引中
在更新数据时,SQL Server首先使用列的数据做为参数调用分区函数确定应该将该数据存储在哪个文件组(逻辑分区),
然后将数据写入文件组对应的物理文件中。

SQL Server中创建分区表:

CREATE TABLE dbo.[Order]
(
OrderID BIGINT IDENTITY(1,1),
OrderDate DATETIME NOT NULL,
CONSTRAINT PK_Order_OrderID_OrderDate PRIMARY KEY CLUSTERED(OrderID,OrderDate)
)
ON PS_Order(OrderDate)

下面是详细的示例代码:

--表分区测试代码
USE [master]
GO

--创建具有多个文件组的测试数据库
IF EXISTS(SELECT 1 FROM sys.databases WHERE [name]=N'TestTablePartitionDB')
BEGIN
    DROP DATABASE [TestTablePartitionDB]
END

CREATE DATABASE [TestTablePartitionDB]
ON PRIMARY
(
Name='PrimaryFG',
FileName='D:\Test\TablePartition\TestTablePartitionDB.mdf',
Size=5,
FileGrowth=1
),
FILEGROUP [FG1]
(
Name='FG1',
FileName='D:\Test\TablePartition\FG1.ndf',
Size=5,
FileGrowth=1
),
FILEGROUP [FG2]
(
Name='FG2',
FileName='D:\Test\TablePartition\FG2.ndf',
Size=5,
FileGrowth=1
),
FILEGROUP [FG3]
(
Name='FG3',
FileName='D:\Test\TablePartition\FG3.ndf',
Size=5,
FileGrowth=1
),
FILEGROUP [FG4]
(
Name='FG4',
FileName='D:\Test\TablePartition\FG4.ndf',
Size=5,
FileGrowth=1
)

USE TestTablePartitionDB
GO

--创建分区函数
CREATE PARTITION FUNCTION PF_Order(DATETIME)
AS RANGE LEFT FOR VALUES
('20090101','20100101','20110101')

--创建分区架构
CREATE PARTITION SCHEME PS_Order
AS PARTITION PF_Order
TO([FG1],[FG2],[FG3],[FG4])

--创建分区表
CREATE TABLE dbo.[Order]
(
OrderID BIGINT IDENTITY(1,1),
OrderDate DATETIME NOT NULL,
CONSTRAINT PK_Order_OrderID_OrderDate PRIMARY KEY CLUSTERED(OrderID,OrderDate)
)
ON PS_Order(OrderDate)

--测试数据的逻辑分区是哪个
SELECT $PARTITION.PF_Order('20090101')

--测试分区表的分区情况
SELECT partition_number,rows
FROM sys.partitions
WHERE [object_id]=object_id(N'dbo.[Order]')

--Drop index MyTable_IXC on MyTable with (Move To [Data Partition Scheme] (ID) )

[转载]八大Android土鳖设计

mikel阅读(929)

[转载]八大Android土鳖设计 | 优涩控.

Android诞生的那天起,这个可爱的小机器人凭借的开源的力量,硬是把iOS挤下市场占有率第一的宝座。虽然数字占优,但大众的心理中,iOS始终才是最佳体验的移动平台。

诚然,iOS成功的将界面做到了所见即所得的精简化,极致地把手机硬体键减少到一个,从而将用户可操作的范围项,控制在一个很小的空间内,有效降低 了用户的学习成本。但是,既然飘在外向出手三分诺维斯基依然可以与邓肯一样定义为这个世界上最优秀的大前锋,Android为什么不可以与iOS一样定义 为这个世界上最优秀的移动平台系统呢?

Android虽然存在多种硬体键设计,在可操作范围项,他控制得没有iOS那么精简,比如他可以在不同的界面中使用不同的Menu选项进行操作,比如一个应用可以同时跑多个进程和多个服务。但是,如果你能好好利用他,Android同样可以提供另外一种优秀的体验。

阿智写了一篇文章叫做《与其盲目抄袭,不如先研究彻底》,说的是国内缺乏对Android的研究,导致国产的Android应用整体质量不高。设计师们在Android上面大量的山寨了其他平台上的UI元素和设计方法,最终导致Android成为山寨大集合,用户体验的黑洞。这其中,不妨某些我们耳熟能详的产品。

这里所收集的,就是一些缺乏对Android深刻研究,照搬其他平台的UI元素,或者是土鳖的强奸用户的一些设计方法,写出这些的本意不是进行指责,而是希望让大家警醒。毕竟,山寨是我们都不想去做的事情。

1.返回在左上角

新浪微博,返回在左上角

在手机界面中有两种返回:返回上一个界面,返回上一层级的界面。Android应用里,界面上并不出现返回的按钮,而是统一通过硬体Back键完 成。因此无论怎样,在Android界面上出现任何的返回按钮(当然也包括生搬硬套iOS的返回按钮在左上角的这种形式),都是不正确且不合理的。

当然,也是存在例外的,比如在一个设置向导(Wizard)内。

向导中的返回出现在屏幕左下角

2.常驻通知栏

3G网络状态时刻常驻通知栏

在Android系统里,通知栏包含两类信息,Ongoing与Notifications(某些还包括快捷功能开关和程序运行的列表Rom不在此 讨论范围内)。他们的差异是,Notifications属于各种应用的新信息的通知,如新短信,新邮件等。他可以直接被清除,Ongoing则表示当前 正在运行的一些程序或者功能,且不可以直接被清除。

但是我们得留意的是,Ongoing上显示的应该是那些用户必须了解,且可能给用户使用手机带来影响的程序和功能,如正在播放音乐,正在通话中,正 在上传下载等。若你的应用无论是退出还是运行状态,对用户并不存在什么影响。那就完全不用通过常驻通知栏的方式告知用户,交给系统管理你的应用的进程 (Process)即好。

3.退出需要确认

新浪微博,退出需要确认

首先我们得理解Android界面的堆栈机制,如图所示,用户的每次操作活动(activity)都会保存起来,当使用Back键时,如系统会自动杀死之前的活动。

diagram_backstack

但若当前已经是在应用的根界面了,使用Back键,这个应用的进程的所有自动被挂起,后台服务除外。它并不消耗CPU资源,但会占一些内存。 Android与Java类似,系统有一个规则来回收内存,进行内存调度有个阀值,只有低于这个值系统才会从一个列表中,从后向前彻底关闭应用的进程。这 样设计的好处是,他能够方便用户在多任务切换时,最大限度的提高速度,因为进程只是被挂起而已。

从系统设计的角度上看,退出需要确认甚至说是一个流氓的行为。而从防止用户误操作的角度上看,这也是一个谬论。因为按Back键时,进程会被挂起, 用户并不存在信息损失等风险,即使是误操作,按照Android的堆栈机制,用户也可以非常轻松地恢复应用。你一定没见过iOS按Home键之后,给你来 个确认退出框吧?

4.检查更新设置

版本更新设置

我深刻理解开发者这么做的原因:Android系统中应用更新都由Market进行推送,而使用Market的前提是,手机绑定了Google帐 号。问题的关键在于,某些厂家的Android手机并不要求用户绑定Google帐号,他们自己甚至也推出应用商场,想分一杯羹。

这可苦了Android应用开发者,为了能够让不同的用户即时获取更新信息,他们不得不在自己的应用内增加检查更新功能,随即,就产生了检查更新的设置。

但是请各位开发者思考一下,您真的有必要给用户这个设置吗?你的应用真的可能每日都会更新吗?也许你只要设定一个默认的某周检查一次更新即好。

5.没有分享

找不到微信实在太可惜了

分享功能属于Android的一大特色,只需两个客户端支持,用户即可在任意两个本地的客户端中进行信息的分享,如把微博保存到本地的Evernote应用中,在图库中挑选一张图片通过WhatsApp发送给朋友。

Android的分享功能,能够任意地本地两个客户端,他能够更加高效的满足用户不同的任务流程。比如拍照分享,Android可以使用Camera 360拍照后设置各种滤镜,直接起本地任意微博客户端发送至微博。先拍照,再分享,也符合用户的操作习惯。

对比起来iOS则比较麻烦,要么开发者麻烦地把滤镜功能做到微博客户端中,要么用户麻烦地先拍照设置滤镜保存至图库,然后在发微博界面从图库中进行挑选。

Android的分享机制,反而能够有效的避免客户端功能膨胀,帮助开发者节省工作量的同时,也切合和用户多种使用场景。真正的实现了,让一个应用只解决用户一个问题的理念,这不得不说是iOS的笑话。

6.没有焦点状态

官方Gallery内的焦点状态

某些Android手机带有轨迹球等输入设备,用户可以滚动轨迹球定焦于界面的某个控件上。这能有效帮助某些触摸障碍的用户。更加重要的是,随着Android@Home的发布,Android系统将有可能出现在冰箱,洗衣机等家电设备上,并且是通过有五维导航键的方式进行控制,这就显得焦点状态变得额外重要了。

更加可以预见的一点是,Android目前还没有像iOS上的Voice Over那样,提供无障碍访问的解决方案,假设一旦提供了,轨迹球就能够给更多盲人用户带来更好的移动设备体验。

7.大量缓存图片

由某个应用在Gallery内产生的大量缓存图片

Android没有像iOS那样,彻底去除了文件的概念,所以,如果你的应用如果没有处理好缓存文件的话如图片,这些图片就大量的积压在系统的Gallery中,严重拖慢速度。对于这种问题,只需要把缓存图片改为Gallery无法识别的类型即好。

8.没有Move to SDcard

坑爹的Google Maps现在还不支持Move to SDcard

如果你的应用大小超过5M,如果不提供Move to SDcard功能就实在过意不去,因为毕竟还有大量的用户只有250M以下的机身内存空间。当然,Google的地图应用一直都还是霸占着多大12M的机身内存。

无论如何,Android是一个优秀的手机平台,我也像热爱iOS那样热爱着这个手机系统。我也时刻相信,虽然Android的开发成本过大,但只要正确理解其系统设计理念,Android的应用依然可以非常优秀。

[转载]程序员常犯的5个非技术性错误

mikel阅读(755)

[转载]程序员常犯的5个非技术性错误 – 职场博客 – 伯乐在线.

一个好的软件开发人员需要培养两种技能:技术技能和非技术技能。不幸的是一些开发者只注重技术的部分,以致养成一些陋习,下面是最常犯的5个非技术性错误:

0. 缺乏自律

Jim Rohn曾经说过:自律是目标和成果之间的桥梁。我一直认为,不论是成为一名软件开发人员,亦或是想在生活的其它任何领域取得成功,自律都是最珍贵的技能之一。事实上,很少有人兼具智慧和自律。

Steve Pavlina强调了自律的5个基本原则“……容忍(Acceptance)、毅力(Willpower)、努力(Hard Work)、勤勉(Industry)以及坚持不懈(Persistence)。将每一个单词的首字母提出,构成一个缩略词:鞭子(A WHIP)。这样更便于记忆,因为很多人总是把自律和鞭策自我联系在一起。……” 我力荐大家阅读Steve Pavlina写的关于自律的一系列文章

正如我以前的文章每天写出好代码的5个建议中解释的一样,对于自律,我的个人做法是每天遵循以下步骤

  • 将一天要做的事情列成清单。
  • 一次只做一件事。
  • 正确做事。
  • 不要半途而废。
  • 与其道歉,不如补救,而放弃最不可取。

1. 自我意识过甚

据我的经验,程序员有点自我意识过甚,但凡过于自我的人都很难意识到这点,以下几个指标可以帮助你认识到自己是否自我意识过甚。

  • 你认为自己是最棒的程序员。
  • 你抵触交流。
  • 你要求检查代码,是为了炫耀而不是为获得建设性的建议。

网上有很多关于程序员及其自我主义的文章,我在此推荐两篇,一篇是来自Mike Bernat的《无私的程序设计(Egoless programmin)》,另一篇是来自stackoverflow.com与此相关的讨论“你如何控制自大”。

2. 不善沟通交流

Woodrow Wilson说:“我若要说上十分钟,须花一个星期准备;若是十五分钟,需三天;若是半个小时,需两天;若是一个小时,我现在就能准备好。”

沟通是我们人类的主要活动。做一个优秀的交流者,这不容易,但就我们的职业而言,却是必不可少的技能。对于设计、代码、同行评估、文档编写、试着去说服别人自己的设计是最好的、编写代码等等,我们总在交流意见。

擅长沟通的人通常会像这样阐述事情:

  • 专注。他们只说需要理解的内容
  • 清晰。容易理解。
  • 简洁。增一分则太过,减一分则不足。

对成为一个更好的沟通者,我有两个建议:

  • 如果自认不是个好的沟通者,事先做好充分的准备直到达到集中、清晰、简洁的要求
  • 交谈之中,首先倾听,思考妥当后再说出自己的看法。

在我先前发布的文章《在开发团队中做出决定的七个最佳惯例》中,有更多关于提高交际能力的小窍门。

3. 忽略用户

“如果我们不关心用户,自有他人关心。”你在此的唯一原因就是服务用户,但有时候很容易忘记这一信条。我曾经所在的团队只注重于技术和平台,而不是令 用户满意。我们花费一个多月的时间创造一个构架,却未能给用户带来任何价值;到开始使用的时候,我们发现它完全不适应用户的需要。

4. 不能合理安排工作

开发者们总是为自己镀金,他们研究新的或更有趣的技术;做所有觉得更酷的工程处理方法。这样无疑妨碍到了项目,但我并不是说时不时投入到旁的活动中是 不正常的。诚然我们都需要分散注意力,但是你若发现自己老是处于前面所提到的状态,那么你有必要重新考虑自己优先处理工作的方式。我再次推荐你读每天写出好代码的5个建议这篇文章。