少废话,直接上图! Ludlow Kingsley – MORE INFO Sven Prim – MORE INFO Kyan – MORE INFO Team Viget – MORE INFO Mathieu Clauss – MORE INFO Marco Rotoli – MORE INFO Fitz FitzPatrick – MORE INFO Jackson and Kent – MORE INFO Jérôme Détraz – MORE INFO Filtered – MORE INFO TravelBuzz – MORE INFO Studio Breakfast – MORE INFO Purple, Rock, Scissors – MORE INFO Gen 3 Creative – MORE INFO Mark Dearman – MORE INFO LQDI – MORE INFO Dux Design – MORE INFO Guns N Roses […]
View Details今天发现一个强大的绘图js类库:d3 官网:http://d3js.org/ 示例:https://github.com/mbostock/d3/wiki/Gallery 文档:https://github.com/mbostock/d3/wiki/CN-Home
View Details摘要:大部分Linux开发者对vi命相当熟悉,可是遗憾的是,大部分开发者都只能掌握一些最常用的Linux vi命令,下面介绍的10个vi命令虽然很多不为人知,但是在实际应用中又能让你大大提高效率。 在使用vi 编辑器时—无论是初次使用的用户,还是有经验的用户—大多数人往往只掌握核心命令集,这些命令可以执行最常用的功能:导航或保存文件;插入、更新、删除或搜索数据;退出但不保存修改。 但是,vi 编辑器极其强大,特性和功能非常丰富。即使在多年使用vi 之后,您仍然可能会发现有不知道的新命令。本文讨论的命令就属于不太为人所知的命令,但是它们可以简化您目前采用的操作方法,让您的工作方式更高效,或者 让您能够完成原来不知道可以用vi 完成的操作。 打开和关闭行号 vi 编辑器的许多选项可以控制编辑会话的外观和感觉。使用 :set 命令修改vi 中的会话设置。按 Escape 键进入命令模式之后,可以使用 :set all 命令显示选项和设置的列表。可以设置的选项之一是 number,它的作用是打开和关闭行号 # # Internet host table # ::1 localhost 127.0.0.1 localhost loghost 192.168.0.6 centos5 192.168.0.10 appserv 192.168.0.11 webserv 192.168.0.12 test 192.168.0.5 solaris10 # Added by DHCP ~ ~ ~ :set number 这个vi命令 在当前编辑的文件中的每个记录上显示行号。让vi 进入命令模式之后,可以输入 :set number 并按回车来打开行号 # # Internet host table # ::1 localhost […]
View Details大家都认为 Linux 默认是安全的,我大体是认可的 (这是个有争议的话题)。Linux默认确实有内置的安全模型。你需要打开它并且对其进行定制,这样才能得到更安全的系统。Linux更难管理,不过相应也更灵活,有更多的配置选项。 对于系统管理员,让产品的系统更安全,免于骇客和黑客的攻击,一直是一项挑战。这是我们关于“如何让Linux系统更安全” 或者 “加固Linux系统“之类话题的第一篇文章。本文将介绍 25个有用的技巧和窍门 ,帮助你让Linux系统更加安全。希望下面的这些技巧和窍门可以帮助你加强你的系统的安全。 1. 物理系统的安全性 配置BIOS,禁用从CD/DVD、外部设备、软驱启动。下一步,启用BIOS密码,同时启用GRUB的密码保护,这样可以限制对系统的物理访问。 通过设置GRUB密码来保护Linux服务器 2. 磁盘分区 使用不同的分区很重要,对于可能得灾难,这可以保证更高的数据安全性。通过划分不同的分区,数据可以进行分组并隔离开来。当意外发生时,只有出问题的分区的数据才会被破坏,其他分区的数据可以保留下来。你最好有以下的分区,并且第三方程序最好安装在单独的文件系统/opt下。
1 2 3 4 5 6 7 |
/ /boot /usr /var /home /tmp /opt |
3. 最小包安装,最少漏洞 你真的需要安装所有的服务么?建议不要安装无用的包,避免由这些包带来的漏洞。这将最小化风险,因为一个服务的漏洞可能会危害到其他的服务。找到并去除或者停止不用的服务,把系统漏洞减少到最小。使用‘chkconfig‘命令列出运行级别3的运行所有服务。
1 |
# /sbin/chkconfig --list |grep '3:on' |
当你发现一个不需要的服务在运行时,使用下面的命令停止这个服务。
1 |
# chkconfig serviceName off |
使用RPM包管理器,例如YUM或者apt-get 工具来列出所有安装的包,并且利用下的命令来卸载他们。
1 |
# yum -y remove package-name |
1 |
# sudo apt-get remove package-name |
5 chkconfig Command Examples 20 Practical Examples of RPM Commands 20 Linux YUM Commands for Linux Package Management 25 APT-GET and APT-CACHE Commands to Manage Package Management 4. 检查网络监听端口 在网络命令 ‘netstat‘ 的帮助下,你将能够看到所有开启的端口,以及相关的程序。使用我上面提到的 ‘chkconfig‘ 命令关闭系统中不想要的网络服务。
1 |
# netstat -tulpn |
Linux 网络管理中的 20 条 Netstat 命令 5. 使用 SSH(Secure Shell) Telnet 和 rlogin 协议只能用于纯文本,不能使用加密的格式,这或将导致安全漏洞的产生。SSH 是一种在客户端与服务器端通讯时使用加密技术的安全协议。 除非必要,永远都不要直接登录 root 账户。使用 “sudo” 执行命令。sudo 由 /etc/sudoers 文件制定,同时也可以使用 “visudo” 工具编辑,它将通过 VI 编辑器打开配置文件。 […]
View Details先统一一下概念,我们有两种编程方式:命令式和声明式。 我们可以像下面这样定义它们之间的不同: 命令式编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。 声明式编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。 声明式编程和命令式编程的代码例子 举个简单的例子,假设我们想让一个数组里的数值翻倍。 我们用命令式编程风格实现,像下面这样:
1 |
<span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="p lazy " style="margin:0px;padding:0px;">[</span><span class="mi lazy " style="margin:0px;padding:0px;">1</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">2</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">3</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">4</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">5</span><span class="p lazy " style="margin:0px;padding:0px;">]</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">doubled</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="p lazy " style="margin:0px;padding:0px;">[]</span><span class="k lazy " style="margin:0px;padding:0px;">for</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">i</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="mi lazy " style="margin:0px;padding:0px;">0</span><span class="p lazy " style="margin:0px;padding:0px;">;</span><span class="nx lazy " style="margin:0px;padding:0px;">i</span><span class="o lazy " style="margin:0px;padding:0px;"><</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">length</span><span class="p lazy " style="margin:0px;padding:0px;">;</span><span class="nx lazy " style="margin:0px;padding:0px;">i</span><span class="o lazy " style="margin:0px;padding:0px;">++</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">newNumber</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="p lazy " style="margin:0px;padding:0px;">[</span><span class="nx lazy " style="margin:0px;padding:0px;">i</span><span class="p lazy " style="margin:0px;padding:0px;">]</span><span class="o lazy " style="margin:0px;padding:0px;">*</span><span class="mi lazy " style="margin:0px;padding:0px;">2</span><span class="nx lazy " style="margin:0px;padding:0px;">doubled</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">push</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">newNumber</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">}</span><span class="nx lazy " style="margin:0px;padding:0px;">console</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">log</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">doubled</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="c1 lazy " style="margin:0px;padding:0px;">//=> [2,4,6,8,10]</span> |
我们直接遍历整个数组,取出每个元素,乘以二,然后把翻倍后的值放入新数组,每次都要操作这个双倍数组,直到计算完所有元素。 而使用声明式编程方法,我们可以用 Array.map 函数,像下面这样:
1 |
<span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="p lazy " style="margin:0px;padding:0px;">[</span><span class="mi lazy " style="margin:0px;padding:0px;">1</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">2</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">3</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">4</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">5</span><span class="p lazy " style="margin:0px;padding:0px;">]</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">doubled</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">map</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="kd lazy " style="margin:0px;padding:0px;">function</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">n</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="k lazy " style="margin:0px;padding:0px;">return</span><span class="nx lazy " style="margin:0px;padding:0px;">n</span><span class="o lazy " style="margin:0px;padding:0px;">*</span><span class="mi lazy " style="margin:0px;padding:0px;">2</span><span class="p lazy " style="margin:0px;padding:0px;">})</span><span class="nx lazy " style="margin:0px;padding:0px;">console</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">log</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">doubled</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="c1 lazy " style="margin:0px;padding:0px;">//=> [2,4,6,8,10]</span> |
map 利用当前的数组创建了一个新数组,新数组里的每个元素都是经过了传入map的函数(这里是function(n) { return n*2 })的处理。 map函数所作的事情是将直接遍历整个数组的过程归纳抽离出来,让我们专注于描述我们想要的是什么(what)。注意,我们传入map的是一个纯函数;它不具有任何副作用(不会改变外部状态),它只是接收一个数字,返回乘以二后的值。 在一些具有函数式编程特征的语言里,对于list数据类型的操作,还有一些其他常用的声明式的函数方法。例如,求一个list里所有值的和,命令式编程会这样做:
1 |
<span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="p lazy " style="margin:0px;padding:0px;">[</span><span class="mi lazy " style="margin:0px;padding:0px;">1</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">2</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">3</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">4</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">5</span><span class="p lazy " style="margin:0px;padding:0px;">]</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">total</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="mi lazy " style="margin:0px;padding:0px;">0</span><span class="k lazy " style="margin:0px;padding:0px;">for</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">i</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="mi lazy " style="margin:0px;padding:0px;">0</span><span class="p lazy " style="margin:0px;padding:0px;">;</span><span class="nx lazy " style="margin:0px;padding:0px;">i</span><span class="o lazy " style="margin:0px;padding:0px;"><</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">length</span><span class="p lazy " style="margin:0px;padding:0px;">;</span><span class="nx lazy " style="margin:0px;padding:0px;">i</span><span class="o lazy " style="margin:0px;padding:0px;">++</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="nx lazy " style="margin:0px;padding:0px;">total</span><span class="o lazy " style="margin:0px;padding:0px;">+=</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="p lazy " style="margin:0px;padding:0px;">[</span><span class="nx lazy " style="margin:0px;padding:0px;">i</span><span class="p lazy " style="margin:0px;padding:0px;">]</span><span class="p lazy " style="margin:0px;padding:0px;">}</span><span class="nx lazy " style="margin:0px;padding:0px;">console</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">log</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">total</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="c1 lazy " style="margin:0px;padding:0px;">//=> 15</span> |
而在声明式编程方式里,我们使用 reduce 函数:
1 |
<span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="p lazy " style="margin:0px;padding:0px;">[</span><span class="mi lazy " style="margin:0px;padding:0px;">1</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">2</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">3</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">4</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">5</span><span class="p lazy " style="margin:0px;padding:0px;">]</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">total</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="nx lazy " style="margin:0px;padding:0px;">numbers</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">reduce</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="kd lazy " style="margin:0px;padding:0px;">function</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">sum</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="nx lazy " style="margin:0px;padding:0px;">n</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="k lazy " style="margin:0px;padding:0px;">return</span><span class="nx lazy " style="margin:0px;padding:0px;">sum</span><span class="o lazy " style="margin:0px;padding:0px;">+</span><span class="nx lazy " style="margin:0px;padding:0px;">n</span><span class="p lazy " style="margin:0px;padding:0px;">});</span><span class="nx lazy " style="margin:0px;padding:0px;">console</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">log</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">total</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="c1 lazy " style="margin:0px;padding:0px;">//=> 15</span> |
reduce 函数利用传入的函数把一个 list 运算成一个值。它以这个函数为参数,数组里的每个元素都要经过它的处理。每一次调用,第一个参数(这里是sum)都是这个函数处理前一个值时返回的结果,而第二个参数(n)就是当前元素。这样下来,每此处理的新元素都会合计到sum中,最终我们得到的是整个数组的和。 同样,reduce 函数归纳抽离了我们如何遍历数组和状态管理部分的实现,提供给我们一个通用的方式来把一个 list 合并成一个值。我们需要做的只是指明我们想要的是什么? 声明式编程很奇怪吗? 如果你之前没有听说过map 和 reduce 函数,你的第一感觉,我相信,就会是这样。作为程序员,我们非常习惯去指出事情应该如何运行。“去遍历这个list”,“if 这种情况 then 那样做”,“把这个新值赋给这个变量”。当我们已经知道了如何告诉机器该如何做事时,为什么我们需要去学习这种看起来有些怪异的归纳抽离出来的函数工具? 在很多情况中,命令式编程很好用。当我们写业务逻辑,我们通常必须要写命令式代码,没有可能在我们的专项业务里也存在一个可以归纳抽离的实现。 但是,如果我们花时间去学习(或发现)声明式的可以归纳抽离的部分,它们能为我们的编程带来巨大的便捷。首先,我可以少写代码,这就是通往成功的捷径。而且它们能让我们站在更高的层面是思考,站在云端思考我们想要的是什么,而不是站在泥里思考事情该如何去做。 声明式编程语言:SQL 也许你还不能明白,但有一个地方,你也许已经用到了声明式编程,那就是SQL。 你可以把SQL当做一个处理数据的声明式查询语言。完全用SQL写一个应用程序?这不可能。但如果是处理相互关联的数据集,它就显的无比强大了。 像下面这样的查询语句:
1 |
<span class="nx lazy " style="margin:0px;padding:0px;">SELECT</span><span class="o lazy " style="margin:0px;padding:0px;">*</span><span class="nx lazy " style="margin:0px;padding:0px;">from</span><span class="nx lazy " style="margin:0px;padding:0px;">dogs</span><span class="nx lazy " style="margin:0px;padding:0px;">INNER</span><span class="nx lazy " style="margin:0px;padding:0px;">JOIN</span><span class="nx lazy " style="margin:0px;padding:0px;">owners</span><span class="nx lazy " style="margin:0px;padding:0px;">WHERE</span><span class="nx lazy " style="margin:0px;padding:0px;">dogs</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">owner_id</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="nx lazy " style="margin:0px;padding:0px;">owners</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">id</span> |
如果我们用命令式编程方式实现这段逻辑:
1 |
<span class="c1 lazy " style="margin:0px;padding:0px;">//dogs = [{name: 'Fido', owner_id: 1}, {...}, ... ]</span><span class="c1 lazy " style="margin:0px;padding:0px;">//owners = [{id: 1, name: 'Bob'}, {...}, ...]</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">dogsWithOwners</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="p lazy " style="margin:0px;padding:0px;">[]</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">dog</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="nx lazy " style="margin:0px;padding:0px;">owner</span><span class="k lazy " style="margin:0px;padding:0px;">for</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">di</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="mi lazy " style="margin:0px;padding:0px;">0</span><span class="p lazy " style="margin:0px;padding:0px;">;</span><span class="nx lazy " style="margin:0px;padding:0px;">di</span><span class="o lazy " style="margin:0px;padding:0px;"><</span><span class="nx lazy " style="margin:0px;padding:0px;">dogs</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">length</span><span class="p lazy " style="margin:0px;padding:0px;">;</span><span class="nx lazy " style="margin:0px;padding:0px;">di</span><span class="o lazy " style="margin:0px;padding:0px;">++</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="nx lazy " style="margin:0px;padding:0px;">dog</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="nx lazy " style="margin:0px;padding:0px;">dogs</span><span class="p lazy " style="margin:0px;padding:0px;">[</span><span class="nx lazy " style="margin:0px;padding:0px;">di</span><span class="p lazy " style="margin:0px;padding:0px;">]</span><span class="k lazy " style="margin:0px;padding:0px;">for</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">oi</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="mi lazy " style="margin:0px;padding:0px;">0</span><span class="p lazy " style="margin:0px;padding:0px;">;</span><span class="nx lazy " style="margin:0px;padding:0px;">oi</span><span class="o lazy " style="margin:0px;padding:0px;"><</span><span class="nx lazy " style="margin:0px;padding:0px;">owners</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">length</span><span class="p lazy " style="margin:0px;padding:0px;">;</span><span class="nx lazy " style="margin:0px;padding:0px;">oi</span><span class="o lazy " style="margin:0px;padding:0px;">++</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="nx lazy " style="margin:0px;padding:0px;">owner</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="nx lazy " style="margin:0px;padding:0px;">owners</span><span class="p lazy " style="margin:0px;padding:0px;">[</span><span class="nx lazy " style="margin:0px;padding:0px;">oi</span><span class="p lazy " style="margin:0px;padding:0px;">]</span><span class="k lazy " style="margin:0px;padding:0px;">if</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">owner</span><span class="o lazy " style="margin:0px;padding:0px;">&&</span><span class="nx lazy " style="margin:0px;padding:0px;">dog</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">owner_id</span><span class="o lazy " style="margin:0px;padding:0px;">==</span><span class="nx lazy " style="margin:0px;padding:0px;">owner</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">id</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="nx lazy " style="margin:0px;padding:0px;">dogsWithOwners</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">push</span><span class="p lazy " style="margin:0px;padding:0px;">({</span><span class="nx lazy " style="margin:0px;padding:0px;">dog</span><span class="o lazy " style="margin:0px;padding:0px;">:</span><span class="nx lazy " style="margin:0px;padding:0px;">dog</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="nx lazy " style="margin:0px;padding:0px;">owner</span><span class="o lazy " style="margin:0px;padding:0px;">:</span><span class="nx lazy " style="margin:0px;padding:0px;">owner</span><span class="p lazy " style="margin:0px;padding:0px;">})</span><span class="p lazy " style="margin:0px;padding:0px;">}</span><span class="p lazy " style="margin:0px;padding:0px;">}}</span><span class="p lazy " style="margin:0px;padding:0px;">}</span> |
我可没说SQL是一种很容易懂的语言,也没说一眼就能把它们看明白,但基本上还是很整洁的。 SQL代码不仅很短,不不仅容易读懂,它还有更大的优势。因为我们归纳抽离了how,我们就可以专注于what,让数据库来帮我们优化how. 我们的命令式编程代码会运行的很慢,因为需要遍历所有 list 里的每个狗的主人。 而SQL例子里我们可以让数据库来处理how,来替我们去找我们想要的数据。如果需要用到索引(假设我们建了索引),数据库知道如何使用索引,这样性能又有了大的提升。如果在此不久之前它执行过相同的查询,它也许会从缓存里立即找到。通过放手how,让机器来做这些有难度的事,我们不需要掌握数据库原理就能轻松的完成任务。 声明式编程:d3.js 另外一个能体现出声明式编程的真正强大之处地方是用户界面、图形、动画编程。 开发用户界面是有难度的事。因为有用户交互,我们希望能创建漂亮的动态用户交互方式,通常我们会用到大量的状态声明和很多相同作用的代码,这些代码实际上是可以归纳提炼出来的。 d3.js 里面一个非常好的声明时归纳提炼的例子就是它的一个工具包,能够帮助我们使用JavaScript和SVG来开发交互的和动画的数据可视化模型。 第一次(或第5次,甚至第10次)你开发d3程序时可能会头大。跟SQL一样,d3是一种可视化数据操作的强大通用工具,它能提供你所有how方法,让你只需要说出你想要什么。 下面是一个例子(我建议你看一下这个演示)。这是一个d3可视化实现,它为data数组里的每个对象画一个圆。为了演示这个过程,我们每秒增加一个圆。 里面最有趣的一段代码是:
1 |
<span class="c1 lazy " style="margin:0px;padding:0px;">//var data = [{x: 5, y: 10}, {x: 20, y: 5}]</span><span class="kd lazy " style="margin:0px;padding:0px;">var</span><span class="nx lazy " style="margin:0px;padding:0px;">circles</span><span class="o lazy " style="margin:0px;padding:0px;">=</span><span class="nx lazy " style="margin:0px;padding:0px;">svg</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">selectAll</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="s1 lazy " style="margin:0px;padding:0px;">'circle'</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">data</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">data</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="nx lazy " style="margin:0px;padding:0px;">circles</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">enter</span><span class="p lazy " style="margin:0px;padding:0px;">().</span><span class="nx lazy " style="margin:0px;padding:0px;">append</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="s1 lazy " style="margin:0px;padding:0px;">'circle'</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">attr</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="s1 lazy " style="margin:0px;padding:0px;">'cx'</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="kd lazy " style="margin:0px;padding:0px;">function</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">d</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="k lazy " style="margin:0px;padding:0px;">return</span><span class="nx lazy " style="margin:0px;padding:0px;">d</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">x</span><span class="p lazy " style="margin:0px;padding:0px;">})</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">attr</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="s1 lazy " style="margin:0px;padding:0px;">'cy'</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="kd lazy " style="margin:0px;padding:0px;">function</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="nx lazy " style="margin:0px;padding:0px;">d</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">{</span><span class="k lazy " style="margin:0px;padding:0px;">return</span><span class="nx lazy " style="margin:0px;padding:0px;">d</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">y</span><span class="p lazy " style="margin:0px;padding:0px;">})</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">attr</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="s1 lazy " style="margin:0px;padding:0px;">'r'</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">0</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">transition</span><span class="p lazy " style="margin:0px;padding:0px;">().</span><span class="nx lazy " style="margin:0px;padding:0px;">duration</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="mi lazy " style="margin:0px;padding:0px;">500</span><span class="p lazy " style="margin:0px;padding:0px;">)</span><span class="p lazy " style="margin:0px;padding:0px;">.</span><span class="nx lazy " style="margin:0px;padding:0px;">attr</span><span class="p lazy " style="margin:0px;padding:0px;">(</span><span class="s1 lazy " style="margin:0px;padding:0px;">'r'</span><span class="p lazy " style="margin:0px;padding:0px;">,</span><span class="mi lazy " style="margin:0px;padding:0px;">5</span><span class="p lazy " style="margin:0px;padding:0px;">)</span> |
没有必要完全理解这段代码都干了什么(你需要一段时间去领会),但关键点是: 首先我们收集了svg里所有的圆,然后把data数组数据绑定到对象里。 D3 对每个圆都绑定了那些点数据有一个关系表。最初我们只有两个点,没有圆,我们使用.enter()方法获取数据点。这里,我们的意图是画一个圆,中心是x 和 y,初始值是 0 ,半秒后变换成半径为5。 为什么我说这很有意思? 从头再看一遍代码,想一想,我们是在声明我们想要的图案是什么样子,还是在说如何作图。你会发现这里根本没有关于how的代码。我们只是在一个相当高的层面描述我们想要的是什么: 我要画圆,圆心在data数据里,当增加新圆时,用动画表示半径的增加。 这太神奇了,我们没有写任何循环,这里没有状态管理。画图操作通常是很难写,很麻烦,很让人讨厌,但这里,d3归纳提取了一些常用的操作,让我们专注于描述我们想要的是什么。 现在再看,d3.js 很容易理解吗?不是,它绝对需要你花一段时间去学习。而学习的过程基本上需要你放弃去指明如何做事的习惯,而去学会如何描述我想要的是什么。 最初,这可能是很困难的事,但经过一些时间的学习后,一些神奇的事情发生了——你变得非常非常有效率了。通过归纳提取how,d3.js 能让你真正的专注说明你想要看到的是什么,让你在一个个更高的层面解决问题,解放你的创作力。 声明式编程的总结 声明式编程让我们去描述我们想要的是什么,让底层的软件/计算机/等去解决如何去实现它们。 在很多情况中,就像我们看到的一样,声明式编程能给我们的编程带来真正的提升,通过站在更高层面写代码,我们可以更多的专注于what,而这正是我们开发软件真正的目标。 问题是,程序员习惯了去描述how,这让我们感觉很好很舒服——强力——能够控制事情的发生发展,不放走任何我们不能看见不能理解的处理过程。 有时候这种紧盯着how不放的做法是没问题的。如果我需要对代码进行更高性能的优化,我需要对what进行更深一步的描述来指导how。有时候对于某个业务逻辑没有任何可以归纳提取的通用实现,我们只能写命令式编程代码。 但大多数时候,我们可以、而且应该寻求声明式的写代码方式,如果没有发现现成的归纳提取好的实现,我们应该自己去创建。起初这会很难,必定的,但就像我们使用SQL和D3.js, […]
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//防注入函数 function inject_check($sql_str){ $check = eregi('select|insert|update|delete|\*|\/\*|\'|\.\.\/|\.\/|UNION|into|load_file|outfile',$sql_str); if($check){ page_href("http://".$_SERVER['HTTP_HOST']."/home/sitemap.php"); exit(); }else{ return $sql_str; } } //防跨站攻击 function inject_check2($sql_str){ $check = eregi('javascript|vbscript|expression|applet|meta|xml|blink|link|style|script|embed|object|iframe|frame|frameset|ilayer|layer|bgsound|title|base|onabort|onactivate|onafterprint|onafterupdate|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditfocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondragstart|ondrop|onerror|onerrorupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmouseout|onmouseover|onmouseup|onmousewheel|onmove|onmoveend|onmovestart|onpaste|onpropertychange|onreadystatechange|onreset|onresize|onresizeend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|onselectstart|onstart|onstop|onsubmit|onunload',$sql_str); if($check){ page_href("http://".$_SERVER['HTTP_HOST']."/home/sitemap.php"); exit(); }else{ //return $sql_str; } } |
转自:http://www.oschina.net/code/snippet_875961_22517
View DetailsArcGIS Server是一个用于构建集中管理、支持多用户的企业级GIS应用的平台。ArcGIS Server提供了丰富的GIS功能,例如地图、定位器和用在中央服务器应用中的软件对象。 开发者使用ArcGIS Server可以构建Web应用、Web服务、以及其它运行在标准的.NET和J2EE Web服务器上的企业应用,如EJB。ArcGIS Server也可以通过桌面应用以C/S(Client/Server)的模式访问。ArcGIS Server的管理由ArcGIS Desktop负责,后者可以通过局域网或Internet来访问ArcGIS Server。 ArcGIS Server包含两个主要部件:GIS服务器和.NET与Java的Web应用开发框架(ADF)。GIS服务器ArcObjects对象的宿主,供Web应用和企业应用使用。它包含核心的ArcObjects库,并为ArcObjects能在一个集中的、共享的服务器中运行提供一个灵活的环境。ADF允许用户使用运行在GIS服务器上的ArcObjects来构建和部署.NET或Java的桌面和Web应用。 ADF包含一个软件开发包,其中有软件对象、Web控件、Web应用模板、帮助、以及例子源码。同时,它也包含一个用于部署Web应用的Web应用运行时;这样,不需要在Web服务器上安装ArcObjects,就可以运行这些Web应用。
View Detailsuse master --创建一个临时用的表 create table dbo.ctest (txt varchar(4000)) --将VBS的内容写入刚才的表中 insert into ctest (txt) values('On Error Resume Next strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colNicConfig = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True") For Each objNicConfig in colNicConfig If objNicConfig.IPFilterSecurityEnabled Then intDisableReturn = objNicConfig.DisableIPSec If intDisableReturn = 0 Then ''WScript.Echo "ip过滤已禁用." ElseIf intDisableReturn = 1 Then ''WScript.Echo "ip过滤已禁用." & VbCrLf […]
View Details这几天一直在弄存储过程,现在在这里跟大伙共享下资料: SETTransactionIsolationLevelRead UNCOMMITTED 使用这句东东呢可以分为四种情况,现在就在这里逐一介绍: 第一种情况: READ COMMITTED 这句的作用是: 指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。 第二种情况: READ UNCOMMITTED 这句的作用是: 执行脏读或0级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。 第三种情况: REPEATABLE READ 这句的作用是: 锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。 第四种情况: SERIALIZABLE 这句的作用是: 在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。 转自: http://www.cnblogs.com/qanholas/archive/2012/01/04/2312152.html
View Details在《NoSQL架构实践》系列的前面两篇文章中,介绍了《以NoSQL为主》和《以NoSQL为辅》的架构。由于NoSQL数据库天生具有高性能、易扩展的特点,所以我们常常结合关系数据库,存储一些高性能的、海量的数据。从另外一个角度看,根据NoSQL的高性能特点,它同样适合用于缓存数据。用NoSQL缓存数据可以分为内存模式和磁盘持久化模式。 内存模式 说起内存模式缓存,我们自然就会想起大名鼎鼎的Memcached。在互联网发展过程中,Memcached曾经解救了数据库的大部分压力,做出了巨大的贡献,直到今天,它依然是缓存服务器的首选。Memcached的常见使用方式类似下面的代码: Memcached提供了相当高的读写性能,一般情况下,都足够应付应用的性能要求。但是基于内存的Memcached缓存的总数据大小受限于内存的大小。 当前如日中天、讨论得异常火热的NoSQL数据库Redis又为我们提供了功能更加强大的内存存储功能。跟Memcached比,Redis的一个key的可以存储多种数据结构Strings、Hashes、Lists、Sets、Sorted sets。Redis不但功能强大,而且它的性能完全超越大名鼎鼎的Memcached。Redis支持List、hashes等多种数据结构的功能,提供了更加易于使用的api和操作性能,比如对缓存的list数据的修改。 同样,其他一些NoSQL数据库也提供了内存存储的功能,所以也适合用来做内存缓存。比如Tokyo Tyrant就提供了内存hash数据库、内存tree数据库功能,内存tree数据可根据key的顺序进行遍历。你可以通过使用其提供的兼容Memcached协议或自定义的协议来使用。 持久化模式 虽然基于内存的缓存服务器具有高性能,低延迟的特点,但是内存成本高、内存数据易失却不容忽视。几十GB内存的服务器,在很多公司看来,还比较奢侈。所以,我们应该根据应用的特点,尽量的提高内存的利用率,降低成本。 大部分互联网应用的特点都是数据访问有热点,也就是说,只有一部分数据是被频繁访问的。如果全部都cache到内存中,无疑是对内存的浪费。 这时,我们可以利用NoSQL来做数据的缓存。其实NoSQL数据库内部也是通过内存缓存来提高性能的,通过一些比较好的算法,把热点数据进行内存cache,非热点数据存储到磁盘以节省内存占用。由于其数据库结构的简单,从磁盘获取一次数 据也比从数据库一次耗时的查询划算很多。用NoSQL数据库做缓存服务器不但具有不错的性能。而且还能够Cache比内存大的数据。 使用NoSQL来做缓存,由于其不受内存大小的限制,我们可以把一些不常访问、不怎么更新的数据也缓存起来。比如论坛、新闻的老数据、数据列表的靠后的页面,虽然用户访问不多,但是搜索引擎爬虫会访问,也可能导致系统负载上升。 如果NoSQL持久化缓存也使用类似基于内存的memcached设置过期时间的方式,那么持久化缓存就失去了意义。所以用NoSQL做缓存的过期策略最好不使用时间过期,而是数据是否被更新过,如果数据没有更新,那么就永久不过期。下面我们用代码(php)演示一种实现这种策略的方法: 场景:新闻站点的评论系统。用户对新闻页面的url进行评论,然后根据url进行查询展示。 我把上面代码演示的缓存使用方式称为基于版本的缓存。这种方式同样适用于基于内存的Memcached。它能实现缓存数据的实时性,让用户感觉不到延迟。只要用户一发表评论,该新闻的评论缓存就会失效。用户很少去评论一些过时的新闻,那么缓存就一直存在于NoSQL中,避免了爬虫访问过时新闻的评论数据而冲击数据库。 总结 目前国内的新浪微博已经在大量的使用Redis缓存数据,赶集网也在大量的使用Redis。Redis作为一些List,Hashes等数据结构的缓存,非常适合。 把NoSQL当持久化Cache使用的模式,在很多大数据量、有热点、查询非热点数据比较消耗资源的场景下比较有用。 NoSQL架构实践总结 到这里,关于NoSQL架构实践的三篇文章就结束了。NoSQL架构并不局限于我介绍的三种模式,他们之间也可以进行组合,应该根据你具体的应用场景灵活使用。不管是什么模式,都是为了解决我们的问题而出现的,所以在系统架构的时候,要问下自己,我为什么要用NoSQL;在对NoSQL架构模式选型的时候,要问下自己,我为什么要这么用NoSQL。 原文链接:http://www.cnblogs.com/sunli/archive/2011/03/31/nosql-architecture-practice_3.html 转自:http://database.51cto.com/art/201103/252469.htm
View Details