Skip to content Skip to main navigation Skip to footer

Linux

Linux:Ubuntu Touch 预览版安装过程解析

Ubuntu推出了专为智能型手机和平板电脑打造的触摸式界面移动操作系统,计划随Ubuntu智能手机在2014年一起杀入市场。如果你现在就对 这个新的系统感兴趣的话,那么好消息来了:你可以在一款Nexus设备上(包括Galaxy Nexus、Nexus 4,Nexus 7或者Nexus 10)安装Ubuntu Touch系统的预览版。

 

ubuntu-touch-on-nexus-7-icon

警告:这 只是Ubuntu Touch系统的尝鲜版。一般提前发布的预览版本会称为beta版,但这个实际上只能算作是alpha版。还有许多组件都不能正常工作,有些内置应用还没 有实际的功能,只是为了界面的完整性而特意加上去占坑的。安装这个预览版也会清除你的Nexus设备上的数据,因此在继续安装前请确保先备份所有重要的数据。

如果你仍然有兴趣尝试安装Ubuntu Touch的预览版,并亲身体验一下Ubuntu Touch系统的使用感受,不用犹豫,请继续。

Ubuntu Touch是什么?

Ubuntu Touch是Ubuntu Linux操作系统专门针对智能手机和平板电脑推出的触摸式界面的移动版本。Ubuntu计划在2014年将该系统随着Ubuntu智能手机一起推入市场。

Ubuntu Touch最有趣的特点可能就是它能同所有的硬件相整合,提供无缝的使用体验。该系统能运行在智能手机、平板电脑、桌面PC甚至智能TV上,它的操作界面 能适应于每种不同类型的设备,这就是Ubuntu的理念。想得到更加深入的了解,请看下面这段由Ubuntu官方推出的演示视频吧。

准备好桌面版Ubuntu系统

我们将通过一台装有桌面版Ubuntu系统的PC来安装Ubuntu Touch,这是官方推荐的安装方法。如果你没有安装Ubuntu,那么可以通过Ubuntu live CD启动,剩下的安装过程可以在Ubuntu live环境下进行,甚至不需要你事先在计算机上安装Ubuntu系统。要安装所需的软件,请打开一个终端窗口,运行如下的命令:

sudo add-apt-repository ppa:phablet-team/tools

sudo apt-get update

sudo apt-get install phablet-tools android-tools-adb android-tools-fastboot

add-phablet-team-repository

解锁你的设备

要在Nexus设备上安装另一个操作系统,你需要将设备的boot loader解锁。注意,这一步将清除设备上的所有数据。(如果您因为安装过自定义的ROM而解锁过boot loader,或者对设备进行过root操作,那么可以忽略这一步。)

要解锁设备,首先请将设备关闭。接下来,同时按住电源键、音量增大和音量减小键,此时设备将以fastboot模式启动。

nexus-7-android-recovery

用USB线将Nexus设备与电脑连接起来,打开一个终端,运行如下的命令:

sudo fastboot oem unlock

确认解锁,然后按住电源键启动设备。经过典型的Android安装步骤后,进入HOME主界面。

fastboot-oem-unlock

设备准备阶段

现在,你需要在设备上开启USB调试功能。接下来的步骤假设你的设备运行的是Android 4.2系统。

首先,打开Settings并选择About phone或者About tablet。在About界面中,点击Build number这个字段7次。现在你会在屏幕上看到“恭喜,你现在是一名开发者了”这样的消息。

android-about-tablet-build-number

返回到主设定界面,并选择now-visible开发者选项。在开发者选项界面中开启USB调试选项。

android-enable-usb-debugging

接下来,在电脑上运行如下的命令:

adb kill-server

adb start-server

将你的Nexus设备连接到计算机上,此时设备上会跳出一个确认选项,选择确认。(如果你的Nexus设备上运行的是较老版本的Android系统,可能看不到这个跳出的选项。)

android-allow-usb-debugging-confirmation

在About Phone或About Tablet界面中,将你刚点击过的build number号记下来。稍后在重装Android系统时会用到这个号码。

安装Ubuntu Touch

如果你一直遵循着上述的步骤,现在你应该可以开始安装Ubuntu Touch了。运行如下的命令:

phablet-flash –b

ubuntu-on-nexus-flash-warning

该 命令会清除设备上的所有数据,并下载最新的Ubuntu Touch镜像安装到你的设备上。当一切都搞定后,设备会自动重启并进入Ubuntu Touch环境。安装过程中请保持耐心。(如果你看到一条错误信息提示你空间不够,那么请卸载一些应用或者删除一些文件然后再试。)

ubuntu-touch-preview

重装Android

当你体验过Ubuntu Touch后可能会想重新安装回Android系统。要完成重装,请先在Google中搜索Nexus设备官方镜像。找到同你之前记下的build number一致的镜像,然后下载。解压下载的镜像,打开终端,进入解压后的目录。将Nexus设备同计算机连接起来并确保设备电源是打开的。接下来,运行如下的命令:

adb reboot-bootloader

在你的设备重启进入fastboot模式后,运行下面的命令:

sudo ./flash-all.sh

(如果你看到错误提示,请确保你已经解压了镜像文件并进入到解压后的目录中。)

这将重新安装Google的官方Android镜像到你的设备中。完成后,Nexus设备将重启进入Android系统。

flashing-ubuntu-on-nexus-7

如果你遇到了任何困难,你可能会想到Ubuntu官方安装指南的wiki上寻求帮助。

你尝试过Ubuntu Touch预览版了吗?你对Ubuntu手机、平板电脑、智能TV感兴趣吗?请在评论栏中分享一下自己的经验吧!

Linux:自建CDN技术选型: squid varnish nginx

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。

使用CDN有3个好处

  • 优化跨ISP网络访问速度,在国内大联通和大电信之间是世界上最远的距离,在国外,中国和其他地区很平行,用cdn可以优化全球响应速度
  • 节约流量成本,CDN机房都一般都放在带宽便宜的小城市,带宽成本大概是BGP机房的1/3
  • 快速提升性能,对于结构复杂的系统,部署CDN可以在不改动代码段情况提升网站整体性能,立竿见影

市面上有很多CDN供应商,比较著名有

  • Akamai (全球最大)
  • chinacache
  • webluker
  • cloudflare

如果需要自己搭建CDN系统,有3种主流方案可以选择

  1. squid
  2. varnish
  3. Nginx+memcache
软件 存储模式 性能 配置复杂度 purge效率 共享存储
squid 硬盘 较高 简单 可以并联,但是配置复杂
varnish 硬盘/内存 比较简单 不能
nginx 内存 需要编程 可以,支持一致性存储

典型用户

存储共享

对于大规模网站的CDN,存储共享是个强需求。为了消除单点,不可能只使用一台CDN服务器,如果只是简单做负载均衡,单台CDN server 上需要存储全部数据,存储利用率太低了

  • squid支持几个实例并联,实际使用的人不多
  • varnish 只能用单实例
  • nginx+memcache 天然的分布式存储

当然,采用squid/varnish 也有解决办法: 需要在它们前面部署一个支持url hash的负载均衡设备(硬件,软件均可,比如说haproxy)

内存存储的代价

如果CDN把缓存放在内存当中,固然性能会有提升,但是当服务遭遇故障重启之后,全部数据都会丢失需要重建,这个时候

  1. 会给后端应用服务器带来很大的短时压力
  2. 服务需要较长的时间才能完全恢复

而实际运行当中,由于各种原因,CDN服务重启的概率相当高

一个很悲剧的事实

对动态网页使用CDN,无论squid还是varnish都不能直接用,都需定制代码。

例如 varnish 会判断response的header,如果发现里面有set-cookie项,它就认为这个页面不应该被缓存。对于规模庞大/OOP封装严密的网站,普通程序员根本意识不到调用哪一个fucntion会输出set-cookie,这个会导致CDN命中率急剧降低。但你也无力去对每行代码做code review,没有办法,只能去修改varnish代码了,这又引入一个新的维护成本. Squid也有这个问题

purge效率

purge就是CDN删除缓存项的接口,国内的UGC网站,因为严厉的内容检查制度和泛滥的垃圾广告,删帖子删图片特别频繁,某些网站可能高达40%(发100个贴,有40个帖子可能被删除或者修改),所以对purge的效率有要求。

squid和varnish purge效率都达不到国内这种强度要求,nginx+memcache purge性能 要好很多

在当前的中国,遇到突发事件,你要不及时删除指定的链接,你的老板就可能会去拍下面这种相片

老板入狱拍照

某门户网站曾经发生过,某个链接怎么也删不掉,一慌张把CDN所有缓存都删了重启,导致内网流量瞬间暴涨,各业务线的服务器全线报警,集体骂娘。

推荐CDN方案

  1. 中小型网站直接买服务就好,现在CDN已经进按需付费的云计算模式了,性价比是可以准确计算的
  2. 外地部署单点,推荐用squid
  3. 准备在公司内部实施私有云战略,推荐nginx+memcache

不建议使用varnish

以前的工作中,我力主把一个CDN集群从squid迁移到varnish,持续运行了2年,就是如上感受,严重不推荐.

 

via http://www.linuxde.net/2013/05/13492.html 

Linux:可视化分析WEB访问:logstalgia

今早我们转载了一篇文章《服务器遭受黑客DDoS攻击时的情景视频演示》,里面有一个视频,可视化的展示了网站被攻击时的访问情形。

这个视频是通过logstalgia软件(也叫做ApachePong)生成的,它是一个使用WEB日志可视化地展示WEB访问情况的开源软件。

其官方网站在:https://code.google.com/p/logstalgia/ 

当前版本是:1.0.3 (发布于2011年),可以运行在Linux上和Windows(已经编译好)上。它要求运行在一个支持OpenGL显卡的机器上。

支持标准的Apache和Nginx的WEB访问日志。通过视频可以直观的看到来自哪里的IP访问你的WEB上的什么资源,那些资源访问比较频繁。尤其是网站上有热点内容或被DDoS时,其显示的效果非常炫目。

可以实时显示访问情况,也可以离线分析存储的WEB日志。

视频不但可以直接显示,也可以通过软件转换为常见的压缩格式。可以通过参数控制视频速度等,甚至支持在视频播放时直接控制速率等。

 

Linux:字符编码浅谈

你是否认为“ASCII码 = 一个字符就是8比特”?你是否认为一个字节就是一个字符,一个字符就是8比特?你是否还认为你是否还认为UTF-8就是用8比特表示一个字符?如果真的是这样认为认真读完这篇文章吧!

为什么要有编码?

首先大家需要明确的是在计算机里所有的数据都是字节的形式存储,处理的。我们需要这些字节来表示计算机里的信息。但是这些字节本身又是没有任何意义的,所以我们需要对这些字节赋予实际的意义。所以才会制定各种编码标准。

编码模型

首先需要明确的是存在两种编码模型

简单字符集

在这种编码模型里,一个字符集定义了这个字符集里包含什么字符,同时把每个字符如何对应成计算机里的比特也进行了定义。例如ASCII,在ASCII里直接定义了A -> 0100 0001。

现代编码模型

在现代编码模型里要知道一个字符如何映射成计算机里比特,需要经过如下几个步骤。

  1. 知道一个系统需要支持哪些字符,这些字符的集合被称为字符表(Character repertoire)
  2. 给字符表里的抽象字符编上一个数字,也就是字符集合到一个整数集合的映射。这种映射称为编码字符集(CCS:Coded Character Set),unicode是属于这一层的概念,跟计算机里的什么进制啊没有任何关系,它是完全数学的抽象的。
  3. 将CCS里字符对应的整数转换成有限长度的比特值,便于以后计算机使用一定长度的二进制形式表示该整数。这个对应关系被称为字符编码表(CEF:Character Encoding Form)UTF-8, UTF-16都属于这层。
  4. 对于CEF得到的比特值具体如何在计算机中进行存储,传输。因为存在大端小端的问题,这就会跟具体的操作系统相关了。这种解决方案称为字符编码方案(CES:Character Encoding Scheme)。

平常我们所说的编码都在第三步的时候完成了,都没有涉及到CES。所以CES并不在本文的讨论范围之内。现在也许有人会想为什么要有现代的编码模型?为什么在现在的编码模型要拆分出这么多概念?直接像原始的编码模型直接都规定好所有的信息不行吗?这些问题在下文的编码发展史中都会有所阐述。

编码的发展史

ASCII

ASCII出现在上个世纪60年代的美国,ASCII一共定义了128个字符,使用了一个字节的7位。定义的这些字符包括英文字母A-Z,a-z,数字0-9,一些标点符号和控制符号。在Shell里输入man ASCII,可以看到完整的ASCII字符集。ASCII采用的编码模型是简单字符集,它直接定义了一个字符的比特值表示。里例如上文提到的A -> 0100 0001。也就是ASCII直接完成了现代编码模型的前三步工作。在英语系国家里ASCII标准很完美。但是不要忘了世界上可有好几千种语言,这些语言里不仅只有这些符号啊。如果使用这些语言的人也想使用计算机,ASCII就远远不够了。到这里编码进入了混乱的时代。

混乱时代

人们知道计算机的一个字节是8位,可以表示256个字符。ASCII却只使用了7位,所以人们决定把剩余的一位也利用起来。这时问题出现了,人们对 于已经规定好的128个字符是没有异议的,但是不同语系的人对于其他字符的需求是不一样的,所以对于剩下的128个字符的扩展会千奇百怪。而且更加混乱的 是,在亚洲的语言系统中有更多的字符,一个字节无论如何也满足不了需求了。例如仅汉字就有10万多个,一个字节的256表示方式怎么能够满足呢。于是就又 产生了各种多字节的表示一个字符方法(gbk就是其中一种),这就使整个局面更加的混乱不堪。(希望看到这里的你不再认为一个字节就是一个字符,一个字符 就是8比特)。每个语系都有自己特定的编码页(code pages)的状况,使得不同的语言出现在同一台计算机上,不同语系的人在网络上进行交流都成了痴人说梦。这时Unicode出现了。

Unicode

Unicode就是给计算机中所有的字符各自分配一个代号。Unicode通俗来说是什么呢?就是现在实现共产主义了,各国人民不在需要自己特定的 国家身份证,而是给每人一张全世界通用的身份证。Unicode是属于编码字符集(CCS)的范围。Unicode所做的事情就是将我们需要表示的字符表 中的每个字符映射成一个数字,这个数字被称为相应字符的码点(code point)。例如“严”字在Unicode中对应的码点是U+0x4E25。

到目前为止,我们只是找到了一堆字符和数字之间的映射关系而已,只到了CCS的层次。这些数字如何在计算机和网络中存储和展示还没有提到。

字符编码

前面还都属于字符集的概念,现在终于到CEF的层次了。为了便于计算的存储和处理,现在我们要把哪些纯数学数字对应成有限长度的比特值了。最直观的 设计当然是一个字符的码点是什么数字,我们就把这个数字转换成相应的二进制表示,例如“严”在Unicode中对应的数字是0x4E25,他的二进制是100 1110 0010 0101, 也就是严这个字需要两个字节进行存储。按照这种方法大部分汉字都可以用两个字节来表示了。但是还有其他语系的存在,没准儿他们所使用的字符用这种方法转换 就需要4个字节。这样问题又来了到底该使用几个字节表示一个字符呢?如果规定两个字节,有的字符会表示不出来,如果规定较多的字节表示一个字符,很多人又 不答应,因为本来有些语言的字符两个字节处理就可以了,凭什么用更多的字节表示,多么浪费。

这时就会想可不可以用变长的字节来存储一个字符呢?如果使用了变长的字节表示一个字符,那就必须要知道是几个字节表示了一个字符,要不然计算机可没 那么聪明。下面介绍一下最常用的UTF-8(UTF是Unicode Transformation Format的缩写)的设计。请看下图(来自阮一峰的博客)

x表示可用的位

通过UTF-8的对应关系可以把每个字符在Unicode中对应的码点,转换成相应的计算机的二进制表示。可以发现按照UTF-8进行转换是完全兼 容原先的ASCII的;而且在多字节表示一个字符时,开头有几个1就表示这个字符按照UTF-8转换后由几个字节表示。下面一个实例子来自阮一峰的博客

已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是 “11100100 10111000 10100101”,转换成十六进制就是0xE4B8A5。

除了UTF-8这种转换方法,还存在UTF-16,UTF-32等等转换方法。这里就不再多做介绍。(注意UTF后边的数字代表的是码元的大小。码 元(Code Unit)是指一个已编码的文本中具有最短的比特组合的单元。对于UTF-8来说,码元是8比特长;对于UTF-16来说,码元是16比特长。换一种说法 就是UTF-8的是以一个字节为最小单位的,UTF-16是以两个字节为最小单位的。)

结束语

花了两天时间终于写完了,相信看到这里大家对于字符编码有了较为清楚的认识,当然文章中肯定存在不准确之处,希望大家批评指正。邮箱:acmerfight圈gmail.com

参考资料

字符编码The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)字符编码笔记:ASCII,Unicode和UTF-8字符集和字符编码Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?如何向非技术人员解释 Unicode 是什么字符编解码的故事(ASCII,ANSI,Unicode,Utf-8) 

via http://blog.jobbole.com/39309/ 

Linux:Libreoffice 4.0.3 发布 – PPA 安装源

  著名的开源办公软件Libreoffice 发布新版本,Libreoffice 是开源软件 Openoffice 的分支,原属于升阳公司,升阳被甲骨文收购以后,开源办公软件OpenOffice上的决策上与社区产生了冲突。导致开发者出走成立了The Document Foundation,创建了分支LibreOffice。Libreoffice可以在Windows、Linux、Macintosh平台上运行,本 套软件共有六个应用程序供您使用,包括:Writer、Calc、Impress、Draw、Math、Base。

  与其他商业软件不同,本套软件采用LGPL3授权,这种授权方式赋予了一般用户拥有使用,分享,散布本套软件的权利。

  最先版本 4.0.3的变化:

  这是 4.0 版本的第四个版本。它包含了许多令人振奋的新功能,适用于企业的早期采用者和个人用户。

  • This release is bit-for-bit identical to the 4.0.3 Release Candidate 3, so you don’t need to download or reinstall if you have that version already.
  • The distribution for Windows is an international build, so you can choose the user interface language that you prefer. Help content is available via an online service, or alternatively as a separate install.
  • Our Windows binaries are digitally signed by The Document Foundation.
  • For Windows users that have OpenOffice.org installed, we advise uninstalling that beforehand, because it registers the same file type associations.
  • If you run Linux, the GCJ Java variant has known issues with LibreOffice, we advise to e.g. use OpenJDK instead.
  • LibreOffice 4.x drops a few long-deprecated features, including support for legacy binary StarOffice files, export to legacy Word and Excel (version 6.0/95), and legacy ODMA document management.
  • Some menu entries have changed or added. If you miss something, that may be due to the use of customised menu settings from your previous LibreOffice installation.
  • This version still contains a few annoying bugs, as listed here. Specifically, the German Duden Korrektor extension needs a manual fix.

  安装 Libreoffice 4.0.3 打开终端,输入命令(适用于 ubuntu 13.04/12.10/12.04用户)

sudo add-apt-repository ppa:libreoffice/libreoffice-4-0sudo apt-get updatesudo apt-get install libreoffice libreoffice-l10n-en libreoffice-help-en

  其他系统的国内用户访问:https://zh-cn.libreoffice.org/

来自:http://imcn.me/html/y2013/14713.html

Linux:在u盘上安装linux 打造你的portable linux system.

  下面和大家分享一下在 u 盘安装 linux 的步骤(SD卡未试过) 。

  1. 首先需要有一台安装了linux的PC机,我的是debian, 当然还是必须有一个U盘, 大小至少1G吧.
  2. 把U盘插到PC机上, fdisk1个或2个分区, 并把第一个分区设置成可启动分区. 格式化分区. mkfs.ext3 /dev/sdb1 
  3. 安装extlinux到PC机上. apt-get install extlinux syslinux-common.   注: extlinux 是syslinux的改进, 可以直接从ext文件系统启动。 
  4. 准备rootfs。也就是根下面的一堆文件,可以从现有系统或者image获得。
  5. 把U盘mount到PC上, mount /dev/sdb1 /mnt
  6. 把rootfs拷贝到u盘上   tar cf – | (cd /mnt;tar xf -)
  7. 建立extlinux目录。mkdir /mnt/boot/extlinux
  8. 安装extlinux到U盘的boot目录上,extlinux -i /mnt/boot/extlinux
  9. 写入mbr。 cat /usr/lib/extlinux/mbr.bin >/dev/sdb
  10. 编写配置文件/mnt/boot/extlinux/extlinux.conf, 如果没有这个文件就创建它。
    prompt 1
    timeout 01
    default squeeze
    label squeeze
          menu usb debian
          kernel /vmlinuz
          append initrd=/initrd.img root=/dev/sda1 quiet 

  注意: 如果只有u盘,那么u盘的文件名应该是/dev/sda. 如果有硬盘,应该是sdb,sdc…..

  至此就应该大功告成了,可以用你的U盘启动了。   还需要注意一些额外的工作。

  1. Rest root 密码, 不然启动后无法登陆。 
  2. 配置网络设置,不然盲机启动无法联网。 
  3. 配置sshd, 不然无法远程登陆。

来自:https://groups.google.com/forum/#!topic/gzlug/0mEgMGVKpw4

Linux:在 Windows 世界中使用 Linux

简介: Linux 是互联网上大多数服务器首选的操作系统,而且现在越来越多地用作桌面操作系统。但是,在桌面上简单地迁移到 Linux,无法保证仍然可与您的工作或兴趣所需要的所有企业资源交互。本文探讨要与遗留 Microsoft Windows 文件和文件服务器交互,以及从桌面 Linux 系统使用新的网络硬件时,您需要执行的其他配置任务。

  每一年,Linux 新闻记者和爱好者都会公开讨论,下一年是否会成为 “Linux 桌面” 之年。尽管购买一台已在运行 Linux 的新机器或将现有的 Windows 系统迁移到 Linux 比以往更加容易,但简单地安装和启动 Linux 还不足以将其打造为日常使用的操作系统。您可能已开始在桌面上使用 Linux,但您使用新 Linux 系统的环境可能不那么现代化。大部分企业、中小型企业,以及小型办公室/家庭办公环境都拥有必须考虑的 Windows 相关需求。您可能还需要将仅在 Windows 平台上能得到有效支持的硬件用于 Linux 系统。所幸,这些问题已存在各种各样的解决方案。

访问共享的 Windows 文件系统

  访问共享的 Windows 文件系统可能是 Linux 系统用户最常见的业务需求。许多企业仍在使用 Windows 作为基础架构的核心,以支持企业邮件和日历系统(比如 Microsoft Exchange Server),以及通过导出的文件系统(一般称为 Windows 共享)来支持简单的文件和数据共享。

  Linux 提供了多种方式来访问 Windows 共享。具体选择哪种机制,依赖于您需要访问 Windows 共享上的数据的频率,以及您配置的 Linxu 系统是个人、单用户系统还是多个用户共享的系统。

从命令行访问 Windows 共享

  Samba Project(参见 参考资料) 是一个开源项目,支持 Linux、UNIX 和其他类似 UNIX 的操作系统与 Windows 互操作。大部分 Linux 发行版的存储库中都包含 Samba,而且一般通过安装和配置来支持 Linux 系统能够加入一个现有的 Windows 工作组或域并与其互操作,常常用作一个可供 Windows 系统使用的通用互联网文件系统 (Common Internet File System, CIFS) 文件服务器。Samba 4.x 安装还允许 Samba 服务器充当 Windows 域的一个活动目录域服务 (Active Directory Domain Service) 控制器和集成的域名系统 (Domain Name System)。

  尽管 Samba 服务器提供了一种优秀机制来从 Windows 系统提供 Linux 资源,使 Linux 系统可打印到 Windows 打印机,但如果您感兴趣的只是偶尔从 WIndows 共享检索文件,安装和配置 Samba 服务器可能会大材小用。Samba 客户端包 (samba-client) 包含多个专为这类偶尔交互所设计的实用程序,包括 smbclient 应用程序,该应用程序提供了一个交互式命令行接口 (CLI) 来远程访问 Windows 共享。

  如果不确定远程 Windows 服务器上提供的共享名称,则可使用 smbclient 应用程序查询一个服务器,在服务器的名称或 IP 地址后键入 -L 选项来列出该服务器上的可用资源,如 清单 1 中所示。

清单 1. 使用 smbclient 列出 Windows 服务器资源

$ smbclient -L win2008server
Enter wvh's password:
Domain=[WORDSMITHS]
OS=[Windows (R) Small Business Server 2008 6001 Service Pack 1]
Server=[Windows (R) Small Business Server 2008 6.0]
Sharename        Type      Comment
---------        ----      -------
Address           Disk      "Access to address objects"
ADMIN$            Disk      Remote Admin
Brother HL-2070N  Printer   Brother HL-2070N
C$                Disk      Default share
ExchangeOAB       Disk      OAB Distribution share
IPC$              IPC       Remote IPC
NETLOGON          Disk      Logon server share
print$            Disk      Printer Drivers
Public            Disk
RedirectedFolders Disk
Resources$        Disk      "Event logging files"
SYSVOL            Disk      Logon server share
[...]

  如上所示,smbclient 应用程序使用当前的 Linux 用户作为要在远程 Windows 服务器上验证的用户,并提示用户输入密码来访问远程服务器。如果 Windows 服务器上的登录名不同,则可使用 -U 选项指定要使用的登录名。

  确定希望连接到的共享的名称后,可使用 smbclient 应用程序连接到一个特定的共享,以检查或检索文件,如 清单 2 中所示。

清单 2. 使用 smbclient 从 Windows 共享中检索文件

$ smbclient //win2008server/Public
Enter wvh's password:
Domain=[WORDSMITHS]
OS=[Windows (R) Small Business Server 2008 6001 Service Pack 1]
Server=[Windows (R) Small Business Server 2008 6.0]
smb: \> cd Software\Linux
smb: \Software\Linux\> ls
  .                            D        0  Sun Jan 27 23:40:42 2013
  ..                           D        0  Sun Jan 27 23:40:42 2013
  acl82express-linux-x86.bz2   A 44960643  Sun Jan 27 23:40:24 2013
  alien_8.87.tar.gz            A    64336  Sun Jan 27 23:39:24 2013
  crossover-12.1.0-1.i386.rpm  A 47233108  Sun Jan 27 23:39:14 2013
  [...]
		59997 blocks of size 1048576. 32474 blocks available
smb: \Software\Linux\> get softmaker-office-2012-674.x86_64.rpm
getting file \Software\Linux\softmaker-office-2012-674.x86_64.rpm \
        of size 147058656 as softmaker-office-2012-674.x86_64.rpm \
        (16345.5 KiloBytes/sec) (average 16345.5 KiloBytes/sec)
smb: \Software\Linux\> quit

  清单 2 中的示例表明,smbclient 提供了一个 CLI 来连接远程服务器。此接口支持熟悉的 Linux 命令,比如 cd(用于在远程服务器上的目录中移动)和 ls(用于列出给定目录的内容)。找到希望检索的文件后,可使用 get 命令检索该文件,将其存储在您希望从中执行 smbclient 的目录中。要将检索到的文件存储在另一个目录中,可使用 lcd(本地更改目录)命令来更改 smbclient 视为当前目录的目录。

  如果仅需要偶尔访问 Windows 共享中的一个或多个文件,且并不关心使用文件管理器(比如 Gigolo、GNOME Nautilus、KDE Dolphin、Konqueror 或 Thunar)来以图形方式浏览 Windows 共享,那么可以放心地使用 smbclient 应用程序。smbclient 应用程序使一个远程共享可在该应用程序的上下文中使用,而不是在您的整个系统中使用。要浏览 Windows 共享并将其提供给您选择的应用程序,则必须采用挂载本地文件系统的相同方式将该共享挂载到您的系统上。

永久挂载 Windows 共享

  可将 Windows 共享手动挂载在系统上的目录上,方法是以 root 用户身份使用 mount 命令或使用 sudo 应用程序,如 清单 3 中所示。mount 命令的 -t 选项及其 cifs 参数指定您挂载的文件系统类型,而且在此情况下,会导致一般性的 mount 命令调用 /bin/mount.cifs 命令。使用您系统的 package-management 命令安装 cifs-utils 程序包,该程序包是 Samba 套件的一部分。

清单 3. 挂载并列出手动挂载的 Windows 共享的内容

# mkdir /mnt/PUBLIC
# mount -t cifs //winserver2008/Public /mnt/PUBLIC
Password:
# ls -l /mnt/PUBLIC
total 1
drwxr-xr-x. 1 root root   0 Jan 27 16:19 Desktop
-rwxr-xr-x. 1 root root 174 Jan 19  2008 desktop.ini
drwxr-xr-x. 1 root root   0 Jan 19  2008 Documents
drwxr-xr-x. 1 root root   0 Jan 27 23:38 Downloads
drwxr-xr-x. 1 root root   0 Jan 19  2008 Favorites
drwxr-xr-x. 1 root root   0 Jan 19  2008 Music
drwxr-xr-x. 1 root root   0 Jan 19  2008 Pictures
drwxr-xr-x. 1 root root   0 Jan 27 23:37 Software
drwxr-xr-x. 1 root root   0 Jan 19  2008 Videos

  清单 3 中的示例 mount 命令使远程共享可通过 /mnt/PUBLIC 目录使用,但具有一些缺点:

  • 简单地将此命令添加到 /etc/fstab 文件中无法自动挂载该共享,因为您在执行 mount 命令后会被提示输入密码。如果尚未确定要用于验证的特定用户,就必须为用于执行 su 或 sudo 命令的用户提供远程 Windows 密码。
  • 以 root 用户身份执行 mount 命令,将共享挂载为 root 用户所有的资源。如果仅希望读取该共享中的文件,尽管可通过此方式挂载共享,但您只能以 root 用户身份向挂载的共享写入数据,这通常很不方便。

  要解决这些问题,可在执行 mount 命令时指定特殊的 CIFS 相关选项,以挂载一个 CIFS 共享。这些选项包括:

  • username= – 指定将用于对远程共享进行验证的用户。可将此选项缩写为 user=。
  • password= – 指定将对远程共享进行验证的用户(您将该用户指定为将使用的用户)的密码。
  • uid= – 指定将拥有所挂载共享中的文件和目录的用户 ID (UID)。如果在 Linux 桌面上使用密码文件身份验证方式,则可使用grep命令在系统的密码文件中搜索您的登录名,以找到您的 UID,如以下示例中所示。
    $ grep wvh /etc/passwd
    wvh:x:500:500:William von Hagen:/home/wvh:/bin/bash
    

    UID 是密码文件条目中的第三个字段(在本例中为 efficiently500)。

  • gid= – 指定将拥有所挂载共享中的文件和目录的用户的组 ID (GID)。如果在 Linux 桌面上使用密码文件身份验证方式,则可使用 grep 命令在系统的密码文件中搜索您的登录名,以找到您的 GID。GID 是密码文件条目中的第四个字段,如上面的示例中所示。

  下面给出了一个使用这些选项的示例 mount 命令,出于格式化用途将该命令分为两行:

# mount -t cifs -o username=wvh,password=MYPASSWORD,uid=500,gid=500 \
     //win2008server/Public /mnt/PUBLIC

 

  可从 CLI 使用一条类似这样的命令或向 /etc/fstab 文件添加一个类似条目,以在启动系统时自动挂载该文件系统。以下是与前面的 mount 等效的 /etc/fstab 文件条目:

//win2008server/Public /mnt/PUBLIC cifs \
    username=wvh,password=MYPASSWORD,uid=500,gid=500 0 0

 

  此命令将在 /etc/fstab 文件中显示为一行,但在本例中出于格式化用途而分为多行。遗憾的是,此命令具有明显的安全问题,因为您必须在 /etc/fstab 条目中公开密码,而文件 /etc/fstab 通常可供系统上的每个用户读取。要解决此问题,可使用 credentials 挂载选项将用户名和密码放在指定的文本文件中。例如:

//win2008server/Public /mnt/PUBLIC cifs \
    credentials=/etc/cred.wvh,uid=500,gid=500 0 0

 

  一个 credentials 文件的格式如下所示:

username=wvh
password=MYPASSWORD

 

  然后可使用以下命令,使 /etc/cred.wvh 文件仅可供 root 用户(必须以其身份执行 mount 命令的用户)读取:

# chmod 600 /etc/cred.wvh

 

  使用 credentials 挂载选项,可在每次挂载文件系统时必须指定用户名和密码,与不向每个能访问系统的人公开该信息之间实现很好的平衡。

Linux:Yupoo(又拍网)的系统架构

  Yupoo!(又拍网) 是目前国内最大的图片服务提供商,整个网站构建于大量的开源软件之上。以下为其使用到的开源软件信息:

(信息来源:http://www.yupoo.com/info/about/)。

一、Yupoo的整体架构

https://dn-linuxcn.qbox.me/data/attachment/album/201305/21/1015591kyompacukxv6axl.jpg

二、程序语言的选择

  Yupoo的服务器端开发语言主要是PHP和Python,其中PHP用于编写Web逻辑(通过HTTP和用户直接打交道), 而Python则主要用于开发内部服务和后台任务。在客户端则使用了大量基于MooTools框架的Javascript。 另外,Yupoo把图片处理过程从PHP进程里独立出来变成一个服务。这个服务基于nginx,作为nginx的一个模块开放REST API。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/21/1016007sy3dn8pttoms58u.png

三、服务器的选用

  选用Squid的原因是“目前暂时还没找到效率比 Squid 高的缓存系统,原来命中率的确很差,后来在 Squid 前又装了层 Lighttpd, 基于 url 做 hash, 同一个图片始终会到同一台 squid 去,所以命中率彻底提高了。”

https://dn-linuxcn.qbox.me/data/attachment/album/201305/21/101600sualblwwbullbbt9.png

  同时Yupoo也使用Python开发了YPWS/YPFS:

  • YPWS–Yupoo Web Server 是用 Python开发的一个小型 Web 服务器,提供基本的 Web 服务外,可以增加针对用户、图片、外链网站显示的逻辑判断,可以安装于任何有空闲资源的服务器中,遇到性能瓶颈时方便横向扩展。
  • YPFS–Yupoo File System 与 YPWS 类似,也是基于这个 Web 服务器上开发的图片上传服务器。

  有网友留言质疑 Python 的效率,Yupoo 老大刘平阳在 del.icio.us 上写到 “YPWS用Python自己写的,每台机器每秒可以处理294个请求, 现在压力几乎都在10%以下”

四、Yupoo的消息系统

  由于PHP的单线程模型,Yupoo把耗时较久的运算和I/O操作从HTTP请求周期中分离出来, 交给由Python实现的任务进程来完成,以保证请求响应速度。这些任务主要包括:邮件发送、数据索引、数据聚合和好友动态推送等等。PHP通过消息队列 (Yupoo用的是RabbitMQ)来触发任务执行。这些任务的主要特点为:

  • 由用户或者定时触发的
  • 耗时比较长的
  • 需要异步执行的

  整个任务系统主要分为以消息分发、进程管理和工作进程组成。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/21/101600hhhpw39qphqvbje0.png

五、数据库的设计

  数据库一向是网站架构中最具挑战性的,瓶颈通常出现在这里。又拍网的照片数据量很大,数据库也几度出现严重的压力问题。和很多使用MySQL的 2.0站点一样,又拍网的MySQL集群经历了从最初的一个主库一个从库、到一个主库多个从库、 然后到多个主库多个从库的一个发展过程。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/21/10160121dhj7khjhajj251.png

  最初是由一台主库和一台从库组成,当时从库只用作备份和容灾,当主库出现故障时,从库就手动变成主库,一般情况下,从库 不作读写操作(同步除外)。随着压力的增加,加上了memcached,当时只用其缓存单行数据。 但是,单行数据的缓存并不能很好地解决压力问题,因为单行数据的查询通常很快。所以把一些实时性要求不高的Query放到从库去执行。后面又通过添加多个 从库来分流查询压力,不过随着数据量的增加,主库的写压力也越来越大。在参考了一些相关产品和其它网站的做法后,进了行数据库拆分。也就是将数据存放到不 同的数据库服务器中。

如何进行数据库拆分?

  • 垂直拆分:是指按功能模块拆分,比如可以将群组相关表和照片相关表存放在不同的数据库中,这种方式多个数据库之间的表结构不同。
  • 水平拆分:而水平拆分是将同一个表的数据进行分块保存到不同的数据库中,这些数据库中的表结构完全相同。

  一般都会先进行垂直拆分,因为这种方式拆分方式实现起来比较简单,根据表名访问不同的数据库就可以了。但是垂直拆分方式并不能彻底解决所有压力问 题,另外,也要看应用类型是否合适这种拆分方式。如果合适的话,也能很好的起到分散数据库压力的作用。比如对于豆瓣我比较适合采用垂直拆分, 因为豆瓣的各核心业务/模块(书籍、电影、音乐)相对独立,数据的增加速度也比较平稳。不同的是,又拍网的核心业务对象是用户上传的照片,而照片数据的增 加速度随着用户量的增加越来越快。压力基本上都在照片表上,显然垂直拆分并不能从根本上解决我们的问题,所以,Yupoo采用水平拆分的方式。

  水平拆分实现起来相对复杂,我们要先确定一个拆分规则,也就是按什么条件将数据进行切分。 一般2.0网站都以用户为中心,数据基本都跟随用户,比如用户的照片、朋友和评论等等。因此一个比较自然的选择是根据用户来切分。每个用户都对应一个数据 库,访问某个用户的数据时, 要先确定他/她所对应的数据库,然后连接到该数据库进行实际的数据读写。那么,怎么样对应用户和数据库呢?Yupoo有这些选择:

1、按算法对应

  最简单的算法是按用户ID的奇偶性来对应,将奇数ID的用户对应到数据库A,而偶数ID的用户则对应到数据库B。这个方法的最大问题是,只能分成两 个库。另一个算法是按用户ID所在区间对应,比如ID在0-10000之间的用户对应到数据库A, ID在10000-20000这个范围的对应到数据库B,以此类推。按算法分实现起来比较方便,也比较高效,但是不能满足后续的伸缩性要求,如果需要增加 数据库节点,必需调整算法或移动很大的数据集, 比较难做到在不停止服务的前提下进行扩充数据库节点。

2、按索引/映射表对应

  这种方法是指建立一个索引表,保存每个用户的ID和数据库ID的对应关系,每次读写用户数据时先从这个表获取对应数据库。新用户注册后,在所有可用 的数据库中随机挑选一个为其建立索引。这种方法比较灵活,有很好的伸缩性。一个缺点是增加了一次数据库访问,所以性能上没有按算法对应好。

  比较之后,Yupoo采用的是索引表的方式,我们愿意为其灵活性损失一些性能,更何况我们还有memcached, 因为索引数据基本不会改变的缘故,缓存命中率非常高。所以能很大程度上减少了性能损失。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/21/101601t8dmrdifwvllidz3.png

  索引表的方式能够比较方便地添加数据库节点,在增加节点时,只要将其添加到可用数据库列表里即可。 当然如果需要平衡各个节点的压力的话,还是需要进行数据的迁移,但是这个时候的迁移是少量的,可以逐步进行。要迁移用户A的数据,首先要将其状态置为迁移 数据中,这个状态的用户不能进行写操作,并在页面上进行提示。 然后将用户A的数据全部复制到新增加的节点上后,更新映射表,然后将用户A的状态置为正常,最后将原来对应的数据库上的数据删除。这个过程通常会在临晨进 行,所以,所以很少会有用户碰到迁移数据中的情况。当然,有些数据是不属于某个用户的,比如系统消息、配置等等,把这些数据保存在一个全局库中。

Linux:Vmware 安装 Fedora 18 注意事项

  以下为我使用VMware安装Fedora中出现的问题及解决方案,整理出来供其它遇到相同问题的人参考。

1、Fedora 18 安装盘无法启动

  具体提示内容:

https://dn-linuxcn.qbox.me/data/attachment/album/201305/21/100836cu1ko1u1zkxsk11t.png

  其中 mount: /dev/sr1 is write-protected,mouting read-only这个问题具体我也不知道是什么问题,从大致的意思中了解到可能是光驱不可写引起的。但是安装系统为什么要在系统盘中写入东西了,可能 Fedora的建议安装出了问题。于是删除虚拟化进行重新的配置。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/21/100836wrpedvysydy9hs49.png

  选择创建一个虚拟硬盘,以后在安装操作系统。然后再加载光盘来跳过简易安装。于是顺利搞定了安装盘的启动。

2、安装完后无法显示Fedora桌面

  当整个系统安装完毕后,发现无法进行Fedora桌面,画面中永远只有一张壁纸,也不弹出登陆框。在网上找了很久终于找到了问题原因~3D图形加速!解决方案其实非常的简单,只需要关闭虚拟机后编辑虚拟机设置,将显示器设置中的3D图形加速的勾选去除就可~

  到此,一切安装完毕。如你也需要安装期望此文章对你有用~

Linux:8个实用的netcat命令实例

Netcat 或者叫 nc 是 Linux 下的一个用于调试和检查网络工具包。可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP/UDP 套接字。

这里我们将通过一些实例来学习 netcat 命令。

1. 在服务器-客户端架构上使用 Netcat

netcat 工具可运行于服务器模式,侦听指定端口

$ nc -l 2389

然后你可以使用客户端模式来连接到 2389 端口:

$ nc localhost 2389

现在如果你输入一些文本,它将被发送到服务器端:

$ nc localhost 2389
HI, server

在服务器的终端窗口将会显示下面内容:

$ nc -l 2389
HI, server

 

2. 使用 Netcat 来传输文件

netcat 工具还可用来传输文件,在客户端,假设我们有一个 testfile 文件:

$ cat testfile
hello server

而在服务器端有一个空文件名为 test

然后我们使用如下命令来启用服务器端:

$ nc -l 2389 > test

紧接着运行客户端:

$ cat testfile | nc localhost 2389

然后你停止服务器端,你可以查看 test 内容就是刚才客户端传过来的 testfile 文件的内容:

$ cat test
hello server

 

3. Netcat 支持超时控制

多数情况我们不希望连接一直保持,那么我们可以使用 -w 参数来指定连接的空闲超时时间,该参数紧接一个数值,代表秒数,如果连接超过指定时间则连接会被终止。

服务器:

$ nc -l 2389

客户端:

$ nc -w 10 localhost 2389

该连接将在 10 秒后中断。

注意: 不要在服务器端同时使用 -w 和 -l 参数,因为 -w 参数将在服务器端无效果。

4. Netcat 支持 IPv6

netcat 的 -4 和 -6 参数用来指定 IP 地址类型,分别是 IPv4 和 IPv6:

服务器端:

$ nc -4 -l 2389

客户端:

$ nc -4 localhost 2389

然后我们可以使用 netstat 命令来查看网络的情况:

$ netstat | grep 2389
tcp        0      0 localhost:2389          localhost:50851         ESTABLISHED
tcp        0      0 localhost:50851         localhost:2389          ESTABLISHED

接下来我们看看IPv6 的情况:

服务器端:

$ nc -6 -l 2389

客户端:

$ nc -6 localhost 2389

再次运行 netstat 命令:

$ netstat | grep 2389
tcp6       0      0 localhost:2389          localhost:33234         ESTABLISHED
tcp6       0      0 localhost:33234         localhost:2389          ESTABLISHED

前缀是 tcp6 表示使用的是 IPv6 的地址。

 

5. 在 Netcat 中禁止从标准输入中读取数据

该功能使用 -d 参数,请看下面例子:

服务器端:

$ nc -l 2389

客户端:

$ nc -d localhost 2389
Hi

你输入的 Hi 文本并不会送到服务器端。

 

6. 强制 Netcat 服务器端保持启动状态

如果连接到服务器的客户端断开连接,那么服务器端也会跟着退出。

服务器端:

$ nc -l 2389

客户端:

$ nc localhost 2389
^C

服务器端:

$ nc -l 2389
$

上述例子中,但客户端断开时服务器端也立即退出。

我们可以通过 -k 参数来控制让服务器不会因为客户端的断开连接而退出。

服务器端:

$ nc -k -l 2389

客户端:

$ nc localhost 2389
^C

服务器端:

$ nc -k -l 2389

 

7. 配置 Netcat 客户端不会因为 EOF 而退出

Netcat 客户端可以通过 -q 参数来控制接收到 EOF 后隔多长时间才退出,该参数的单位是秒:

客户端使用如下方式启动:

$ nc  -q 5  localhost 2389

现在如果客户端接收到 EOF ,它将等待 5 秒后退出。

 

8. 使用 Netcat 来处理 UDP 协议

netcat 默认是使用 TCP 协议,但也支持 UDP,可使用 -u 参数来启用 UDP 协议通讯。

服务器端:

$ nc -4 -u -l 2389

客户端:

$ nc -4 -u localhost 2389

这样客户端和服务器端都使用了 UDP 协议,可通过 netstat 命令来查看:

$ netstat | grep 2389
udp        0      0 localhost:42634         localhost:2389          ESTABLISHED

英文原文, OSCHINA原创翻译

Linux:说说JSON和JSONP

说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服务器端代理来解决。

但到目前为止最被推崇或者说首选的方案还是用JSON来传数据,靠JSONP来跨域。而这就是本文将要讲述的内容。 

JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议。我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的“暗号”,而JSONP则是把用暗号书写的情报传递给自己同志时使用的接头方式。看到没?一个是描述信息的格式,一个是信息传递双方约定的方法。

既然随便聊聊,那我们就不再采用教条的方式来讲述,而是把关注重心放在帮助开发人员理解是否应当选择使用以及如何使用上。

什么是JSON? 

前面简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,你是否该选用他首先肯定要关注它所拥有的优点。 

JSON的优点:

1、基于纯文本,跨平台传递极其简单;

2、Javascript原生支持,后台语言几乎全部支持;

3、轻量级数据格式,占用字符数量极少,特别适合互联网传递;

4、可读性较强,虽然比不上XML那么一目了然,但在合理的依次缩进之后还是很容易识别的;

5、容易编写和解析,当然前提是你要知道数据结构;

JSON的缺点当然也有,但在作者看来实在是无关紧要的东西,所以不再单独说明。

JSON的格式或者叫规则:

JSON能够以非常简单的方式来描述数据结构,XML能做的它都能做,因此在跨平台方面两者完全不分伯仲。

1、JSON只有两种数据类型描述符,大括号{}和方括号[],其余英文冒号:是映射符,英文逗号,是分隔符,英文双引号””是定义符。

2、大括号{}用来描述一组“不同类型的无序键值对集合”(每个键值对可以理解为OOP的属性描述),方括号[]用来描述一组“相同类型的有序数据集合”(可对应OOP的数组)。

3、上述两种集合中若有多个子项,则通过英文逗号,进行分隔。

4、键值对以英文冒号:进行分隔,并且建议键名都加上英文双引号””,以便于不同语言的解析。

5、JSON内部常用数据类型无非就是字符串、数字、布尔、日期、null 这么几个,字符串必须用双引号引起来,其余的都不用,日期类型比较特殊,这里就不展开讲述了,只是建议如果客户端没有按日期排序功能需求的话,那么把日期时间直接作为字符串传递就好,可以省去很多麻烦。 

JSON实例:

// 描述一个人
var person = { "Name": "Bob", "Age": 32, "Company": "IBM", "Engineer": true } // 获取这个人的信息
var personAge = person.Age; // 描述几个人
var members = [ { "Name": "Bob", "Age": 32, "Company": "IBM", "Engineer": true }, { "Name": "John", "Age": 20, "Company": "Oracle", "Engineer": false }, { "Name": "Henry", "Age": 45, "Company": "Microsoft", "Engineer": false } ] // 读取其中John的公司名称
var johnsCompany = members[1].Company; // 描述一次会议
var conference = { "Conference": "Future Marketing", "Date": "2012-6-1", "Address": "Beijing", "Members": [ { "Name": "Bob", "Age": 32, "Company": "IBM", "Engineer": true }, { "Name": "John", "Age": 20, "Company": "Oracle", "Engineer": false }, { "Name": "Henry", "Age": 45, "Company": "Microsoft", "Engineer": false } ] } // 读取参会者Henry是否工程师
var henryIsAnEngineer = conference.Members[2].Engineer;

关于JSON,就说这么多,更多细节请在开发过程中查阅资料深入学习。

什么是JSONP? 

先说说JSONP是怎么产生的: 

其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助。

1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;

2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如

毫无疑问,页面将会弹出一个提示窗体,显示跨域调用成功。

2、现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。

jsonp.html页面代码如下:



remote.js文件代码如下:

localHandler({"result":"我是远程js带来的数据"});

运行之后查看结果,页面成功弹出提示窗口,显示本地函数被跨域的远程js调用成功,并且还接收到了远程js带来的数据。很欣喜,跨域远程获取数据的目的基本实现了,但是又一个问题出现了,我怎么让远程js知道它应该调用的本地函数叫什么名字呢?毕竟是jsonp的服务者都要面对很多服务对象,而这些服务对象各自的本地函数都不相同啊?我们接着往下看。

3、聪明的开发者很容易想到,只要服务端提供的js脚本是动态生成的就行了呗,这样调用者可以传一个参数过去告诉服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是服务器就可以按照客户端的需求来生成js脚本并响应了。

看jsonp.html页面的代码:


这次的代码变化比较大,不再直接把远程js文件写死,而是编码实现动态查询,而这也正是jsonp客户端实现的核心部分,本例中的重点也就在于如何完成jsonp调用的全过程。

我们看到调用的url中传递了一个code参数,告诉服务器我要查的是CA1998次航班的信息,而callback参数则告诉服务器,我的本地回调函数叫做flightHandler,所以请把查询结果传入这个函数中进行调用。

OK,服务器很聪明,这个叫做flightResult.aspx的页面生成了一段这样的代码提供给jsonp.html(服务端的实现这里就不演示了,与你选用的语言无关,说到底就是拼接字符串):

flightHandler({ "code": "CA1998", "price": 1780, "tickets": 5 });

我们看到,传递给flightHandler函数的是一个json,它描述了航班的基本信息。运行一下页面,成功弹出提示窗口,jsonp的执行全过程顺利完成!

4、到这里为止的话,相信你已经能够理解jsonp的客户端实现原理了吧?剩下的就是如何把代码封装一下,以便于与用户界面交互,从而实现多次和重复调用。

什么?你用的是jQuery,想知道jQuery如何实现jsonp调用?好吧,那我就好人做到底,再给你一段jQuery使用jsonp的代码(我们依然沿用上面那个航班信息查询的例子,假定返回jsonp结果不变):

Untitled Page


是不是有点奇怪?为什么我这次没有写flightHandler这个函数呢?而且竟然也运行成功了!哈哈,这就是jQuery的功劳了,jquery在处理jsonp类型的ajax时(还是忍不住吐槽,虽然jquery也把jsonp归入了ajax,但其实它们真的不是一回事儿),自动帮你生成回调函数并把数据取出来供success属性方法来调用,是不是很爽呀?

好啦,写到这里,我已经无力再写下去,又困又累,得赶紧睡觉。朋友们要是看这不错,觉得有启发,给点个“推荐”呗!由于实在比较简单,所以就不再提供demo源码下载了。

4月20日下午的补充: 

没想到上了博客园的头条推荐。看到大家对这篇文章的认可和评论,还是很开心的,这里针对ajax与jsonp的异同再做一些补充说明: 

1、ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;

2、但ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加

Linux:Debian 7.0 常见问题的处理方法

  随着社区Linux版本Debian7.0.0稳定版的发布,笔者也和很多Linux系统的爱好者一样,进行了下载以及安装使用。现就存在的一些小问题及解决办法进行整理编辑,希望能帮助更多的Linux爱好者们一同感受Linux操作系统带来的稳定以及魅力。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/23/122831c3x2gxfjrg2cw8c1.jpg

1、时区设置问题

  Debian 7.0 在安装时尽管选择了中国时区以及非UTC时钟,但机器安装好启动后时间还是会发生错误,因此需要进行将时钟调整为当前时间,同时需要修改文件/etc/default/rcS,并在该文件中加入UTC=no参数。

2、普通用户使用KVM报错问题

  Debian 7.0 中普通用户使用virt-manager虚拟系统管理器时会报错,但切换到root用户又可以正常使用。其实这个问题是用户权限的问 题,virt-manager虚拟系统管理器需要libvirt组用户才可以正常使用和管理,因此用户只要执行useradd -g libvirt birdofprey 命令就可以正常使用该虚拟机管理工具了。

  命令模式如下:

useradd -g libvirt birdofprey

  其中birdofprey为需要使用virt-manager虚拟系统管理器工具的用户名。

3、在KVM中客户机使用NAT方式联网无法正常进行PPTP拨号以及FTP问题

  在KVM中客户机之前使用桥模式进行网络连接,PPTP拨号及FTP都没有问题,修改为NAT模式之后,KVM客户机使用PPTP拨号出现619错 误,访问FTP服务器也出现无法登录500错误。该问题存在的原因是因为PPTP方式的VPN使用了GRE协议,这个协议跟TCP/UDP是同一级的协 议。因为GRE协议没有端口的概念,LINUX不能像TCP/UDP那样IP伪装。所以,LINUX网关后面的pptp vpn客户机连接vpn时总会遇见这种那种的问题。也就是所谓pptp pass through  PPTP VPN协议 NAT穿透性问题!,解决该问题需要对Debian7的/etc/modules文件进行修改加入如下行内容:

    ip_nat_pptp     ip_conntrack_pptp     ip_conntrack_ftp     ip_nat_ftp

  这样iptables在每次启动的时候都自动加载以上4个NAT穿透功能模块。再次在KVM客户机中以NAT模式网络进行相关的PPTP拨号及FTP访问时早先存在的619及500错误得到解决。

4、GNOME3任务栏、标题栏过宽问题

  Debian 7.0 默认安装的是GNOME 3.4.2桌面系统,缺省状态下,用户会发现桌面系统的桌面任务栏及标题栏宽度太大,影响美观,同时也浪费屏幕显示的有效宽度,针对这个问题我们可以通过以下方式进行优化。

  任务栏优化:

  使用vi /usr/share/gnome-shell/theme/gnome-shell.css,直接找到如下行:

    #panel {     background-color: black;     font-weight: bold;     height: 1.28em;     }

  将原来的height:1.68em;修改为height:1.28em;按ALT+F2输入r,直接从起桌面应该就很好看了。

  标题栏的优化:

  在终端中直接输入如下内容:

    sed -i “/title_vertical_pad/s/value=\”[0-9]\{1,2\}\”/value=\”0\”/g” /usr/share/themes/Adwaita/metacity-1/metacity-theme-3.xml

  之后按ALT+F2输入r,直接从起桌面应该就好了。

5、安装GNOME-SHELL插件netspeed、Coverflow Alt-Tab网站报You do not appear to have an up to date version of GNOME3. You won’t be able to install extensions from here. See the about pagefor more information.错误问题。

  GNOME-SHELL作为GNOME3桌面系统的重要特性之一,给用户带来了很多不一样的感受和体验,其插件安装在3.6以后非常方便,只需要通过网页登录到网站将相应插件的相应开关打开到ON的位置,那么系统将自动为你在本地系统中创建插件功能。但在Debian 7.0 中,因为GNOME版本为GNOME3.4.2,通过网页访问网站时, 网站会报如下提示You do not appear to have an up to date version of GNOME3. You won’t be able to install extensions from here. See the about pagefor more information。因此安装以上两个插件包需要进行手动安装。

  首先在https://github.com/hedayaty/NetSpeed、https://github.com/dmo60 /CoverflowAltTab下载相关软件组建的ZIP包,将他们解压在用户的.local/share/gnome-shell /extensions/ 目录中,并将文件目录设置为XXX@XXX.XX模式,然后用tweak tool开启就行了。

来自:http://os.51cto.com/art/201305/395213.htm

Linux:如何安装透明窗口主题Emerald在Ubuntu 13.04/12.10/12.04中-PPA

  Emerald 窗口装饰可能已经停止发展,在Ubuntu软件库也只提供几个版本的包,但也有用户想继续使用,所以以使其更易于安装,国外webupd8博客上传了Emerald到主WebUpd8 PPA,可支持Ubuntu13.04,12.10和12.04。

  Emerald是一款Compiz的窗口装饰主题,可实现全面的复合窗装饰,非常漂亮。主题很多有附带框、标题栏、按钮,所以你会看到在其他窗口看不到的装饰效果,这也是Emerald如此受欢迎最主要的原因.emerald高度可定制。

  因为它需要Compiz配合使用,不然Emerald在GNOME Shell中不会运行。

  这里有一些在Gnome-look,deviantART等网上找的一下Emerald主题:

点击查看原始大图

a-new-hope

点击查看原始大图

dark-glass-ambiance

点击查看原始大图

halftime

点击查看原始大图

littleglass

点击查看原始大图

ordinary

点击查看原始大图

radial

  使用Emerald主题管理器可更改窗口边框大小、阴影、标题栏字体和对齐方式等,可以调整主题。

Ubuntu 13.04/12.10/12.04用户安装Emerald Window Decorator

  1、通过WebUpd8 PPA安装,打开终端,输入命令:

sudo add-apt-repository ppa:nilarimogard/webupd8sudo apt-get updatesudo apt-get install emerald

2、安装完成之后,你可以在gnome-look\deviantART上下面一些自己的主题窗口进行导入。

3、运行Emerald,需要把原来的装口切换过来,按ALT + F2 快捷键然后输入:”emerald –replace” 注意不带引号

4、安装CompizConfig设置管理器:

sudo apt-get install compizconfig-settings-manager

然后打开CompizConfig设置管理器(CCSM),点击“窗口装饰”插件“命令”下,输入:“emerald”(不带引号):

点击查看原始大图

恢复到以前的状态

如果你想返回到默认的窗口装饰,打开CompizConfig设置管理器,再点击”窗口装饰“插件”命令“,按一下复位键。

点击查看原始大图

然后注销并重新登录。您也可以删除emerald:

sudo apt-get remove emerald

原文:http://www.webupd8.org/2013/05/how-to-install-emerald-in-ubuntu-1304.html

译文:http://imcn.me/html/y2013/14809.html

Linux:如何在安装双启动后卸载 Windows 或者 Linux

  关于如何在同一台电脑上运行多个操作系统的文章数不胜数,比如有的文章介绍了如何同时安装Windows和Linux,有的文章介绍了如何同时安装Windows和OS X,还有一些其他的文章。但是,当你想卸载其中的某个操作系统,你应该怎么办呢?下面,我们就介绍一下你安装了“Windows+Linux”双系统后,如何卸载Windows或Linux。

  这个过程其实非常简单,但很多人安装双系统后第一次遇到这类问题时总会向我们求助,因此我们决定把方法写在这里,以便大家能够很容易看到。当你想卸载某个操作系统时,只需要找到它在哪里,然后把对应的分区删除就可以了。当然,不同的操作系统操作起来可能不太一样,所以我们给出三种解决办法。

  注意:在开始操作之前,一定要备份你要保留的那个操作系统。因为,一旦你操作失误,很有可能就会删错系统,后果会相当相当严重。

保留Windows删除Linux

如果你想将Linux从机器中删除,只保留Windows,你需要进行以下几步操作:

  1. 从开始菜单(或开始屏幕)找到“Disk Management”(磁盘管理工具)并启动.

  2. 找到Linux分区。在Windows下无法识别Linux分区,所以,你需要按照驱动器和分区大小去判断,确认好以后继续下面的步骤。

  3. 右键选好的分区,然后选择“删除卷”,这将会把分区删除成自由空间,如果你再选择自由空间,选择删除卷,就会变成未分配空间。

  4. 在Windows分区上右键,选择“扩展卷”,扩展它以填补删除Linux所留下的自由空间。

  5. 最后,插入Windows恢复光盘(或恢复USB驱动器),并从它启动。选择“修复计算机”,去“疑难解答”,然后输入一个命令提示符。键入以下命令

    bootrec.exe /fixmbr

    这将删除Linux的bootloader和恢复Windows’。

  6. 重新启动你的电脑,你会发现,它直接引导进入Windows,不会有Linux分区。

  如果你设置了双启动不同或把一个单独的硬盘驱动器上的Linux,又或者有其他的操作系统在驱动器上的,操作方式可能会略有不同。但对于大多数人来说,这些指令就足够了。

保留 OS X 并移除 Windows 或 Linux

  如果你在用 Mac,删除其它分区非常简易。同样的,假设你的分区都在同一块硬盘上。

  更新:读者 MartyF81 指出 ,最好的卸载 Windows 的方法就是使用 Boot Camp 内置的卸载器。你只需打开 Boot Camp 助理,并跟随提示逐步完成。

  若需要移除 Linux 分区(或者你在 Hackintosh) 上,你需要做:

  1. 打开“/应用/实用工具”中的“磁盘工具”。

  2. 在左侧面板上点击你的硬盘(硬盘,而非分区),并进入“分区”分页。找到要移除的 Windows 或 Linux 分区(你可能在创建时添加了卷)。
  3. 点击你要移除的分区,然后点击窗口底部的小减号按钮。这样分区将从你的系统中移除。
  4. 点击你的 Mac 分区的一角并下拉,这样它将占据出现的自由空间。完成操作后点击应用。

  你的 Mac 可能会花一点时间完成一些必要的步骤,当它结束后,你的系统将恢复原来的 Macintosh。如果你的系统中安装了 rEFIt,你可以不管它——这不会损害任何东西——不过你只需要 删除几个文件就可以移除它。

保留 Linux 并删除 Windows

  如果你喜爱冒险,决定全部时间都是用 Linux,那么你要做的事非常简单。发行版和你特别安装版的说明可能有些不同,但对于传统 Ubuntu 安装,应该类似于下面:

  1. 插入你所用 Linux 发行版的 Live CD 或 USB 并启动其分区管理器(例如 Gparted)。在 Gparted 的菜单中找到你的 Windows 分区——它将被列为 NTFS 分区。
  2. 右键点击 Windows 分区,在菜单中选择“删除”。你的电脑中可能还有其它与 Windows 相关的分区,如 “System Reserved” 和恢复分区。要是愿意,你也可以删除这些分区(但请在删除恢复分区前确定你有恢复盘)
  3. 右键点击你的 Linux 分区,选择“调整/移动”。调整它的大小,以使用你硬盘上的自由空间。
  4. 点击工具栏上的“确认所有操作”按钮,执行所选任务。。它可能警告你电脑将无法启动,但对多数 Linux 安装这都不成问题(如果有问题,查阅 此文以修复)。可能要耗些时间,没办法。

  结束之后,你的硬盘里应该就只剩下Linux系统了。这时启动菜单中还会有些Windows系统痕迹,不删掉也没什么影响,但如果你想把这些痕迹清除,你可以在Linux中启动“终端”,并运行:

sudo update-grub

  这样就可以把Windows的痕迹清除了。

  就像我们说过的那样,每一个双系统都“跟雪花一样美丽且唯一”,所以在不同的环境下操作步骤也不尽然与我们提到的这几种一模一样,你需要酌情处理。希望我们的文章能够给你带去帮助。

  结语:一定一定不要忘记先备份,祝你好运!

 

原文:http://lifehacker.com/how-to-uninstall-windows-or-linux-after-dual-booting-508710422

译文:http://www.oschina.net/translate/how-to-uninstall-windows-or-linux-after-dual-booting

参与翻译(6人):Khiyuan, zanyang1103, OneDict, PKUCATer, skyline520, hanQ

Linux:Linux 上最优秀的数据恢复工具

  不管是不是由于自己的失误,总有些时候我们存储的数据会出点问题。硬盘、固态硬盘以及移动媒介都有可能因为各种不同的原因而“丢失”掉文件。此外,有时候 你可能想删除某个文件——不管是有意的还是无意的——稍后你突然意识到自己正好需要那个文件。与其因为文件丢失而抓狂,不如先试试文件恢复工具,看能不能 挽回自己的损失。本文着重介绍Linux上的几个数据恢复工具。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/26/144447j76qzq6sqpkpjwpp.jpg

数据恢复的原理是什么?

  数据恢复工具都会基于一个基本的事实,那就是尽管操作系统可能认为文件已经是“删除”的了,但数据可能仍然存在于你的存储设备上。比如,现代的文件 系统都可以判断空间是“空闲”的还是“已占用”的。从技术角度来说,尽管数据仍然存在,但文件系统仍可以声明这个空间是“空闲”的,它只是简单的让“空 余”空间最终被新的数据所覆盖。

  即使文件系统已经声称这些文件已不存在了,但数据恢复工具能对存储设备进行扫描,以查看是否有任何文件仍然在物理上存在于设备之上。Linux下这类工具有不少,这里是我所大力推荐的几种。

Safecopy

https://dn-linuxcn.qbox.me/data/attachment/album/201305/26/144448fu7aq7y77yy7e2uu.jpg

  Safecopy是一个相当简单的数据恢复工具,它只是简单地将数据拷贝到一个新的位置上。它不会恢复单独的文件,但是可以将数据从故障的存储设备中拷贝出来。

  这个工具和普通的copy命令之间的区别在于Safecopy在出现文件损毁的情况下并不会退出,无论损毁原因是由于写操作失败或者是扇区中有坏 道。Safecopy还带有许多额外的选项能自定义工具具体的行为,包括在故障的存储媒介上创建文件系统的能力、尽可能或尽快地恢复数据,从多个不同的源 来集合数据而不只是仅仅从一个源,以及访问存储媒介的RAW区域(未分区)。

  这个工具可以通过在你的Linux发行版的软件源中搜索Safecopy来安装。Ubuntu用户只需要输入apt-get install safecopy就能自动安装了。一旦安装完成,如果你要从驱动器a的X分区恢复数据并将它们写到U盘里,那么可以用下面这条命令完成:

sudo safecopy /dev/sdaX /media/PENDRIVE_PATH/recovery_image

TestDisk

https://dn-linuxcn.qbox.me/data/attachment/album/201305/26/14444815387h1rqs138fbq.jpg

  和Safecopy不同,TestDisk是另一种类型的数据恢复工具。它不能从故障的存储设备上拷贝数据,相反,它可以解决一些因为分区的原因而 造成数据无法访问的问题。该工具可以帮助你恢复丢失的分区,让磁盘重新变得可以启动,整理分区表,恢复主引导记录,恢复引导扇区以及文件系统表,可以从 NTFS、FAT、exFAT和ext2类型的文件系统中恢复被删除的文件,还能从已经删除了的NTFS、FAT、exFAT和ext2/3/4文件系统 中拷贝文件。

  完成上述这些任务的命令将有很大不同,所以最好在开始前先看看工具的文档手册或者仔细查看程序的用户接口。总的来说,TestDisk有着很多很棒 的功能,肯定能够帮助到很多人将他们的数据安全的找回来。可以在软件源中搜索testdisk来安装。Ubuntu用户只需要输入apt-get install testdisk就可以了。

PhotoRec

https://dn-linuxcn.qbox.me/data/attachment/album/201305/26/1444492nczczkolloc5lkb.jpg

  最后但同样重要的是如果你主要是想恢复视频、文档和归档类文件,你应该试试PhotoRec。PhotoRec的优点在于它完全忽略了文件系统,只去搜寻底层的数据。这表示如果设备损坏或者被重新格式化了PhotoRec仍然能工作。

  为了防止在使用PhotoRec时所产生的任何问题,该工具在恢复数据时采用只读方式——这样它就不会意外地覆盖掉你希望得到恢复的数据。使用 PhotoRec时请注意,一旦你需要恢复某个文件,请立刻停止任何的写磁盘操作。否则就会存在底层的数据被新写入的数据覆盖的可能,那样就没法再恢复 了。

  再次说明一下,使用这个工具时有很多的选项可供使用,包括可选择你希望恢复的文件扩展名,因此为了能正确使用这个工具请先查看工具的文档说明。要安装这个工具,你可以在软件源中搜索testdisk或photorec。

  有一些Linux发行版如Ubuntu会将Testdisk和PhotoRec这两个程序集合为一个单独的包,因为它们的开发者是同一个人。因此,Ubuntu用户也可以通过sudo apt-get install testdisk来安装PhotoRec。

结论

  本文介绍的这3个数据恢复工具应该能够涵盖大多数数据恢复的需求,从恢复误删除的文件到从损坏的媒介中将数据拷贝出来都能胜任。在使用前请确保先仔 细查阅工具的手册文档,保证它们所执行的操作能完全符合你的需要。Linux上的这类系统软件大多数都没有图形用户界面,它们只能通过终端来运行。值得庆 幸的是,TestDisk和PhotoRec都有基于终端的界面可使用,这比纯粹靠命令驱动的程序相比还是好了很多。

  那么,你最喜爱的数据恢复工具是什么呢?有什么独门秘籍或解决方案呢?请在评论栏中为大家分享一下吧。

 

原文:Danny Stieben

译者:陈舸

译文:http://www.geekfan.net/1300/

Linux:SPDY 是什么?如何部署 SPDY?

当老迈的 HTTP 协议逐渐不能满足人们需求的时候,Google 的 SPDY 协议出现在面前,那么这个长期以来一直被认为是 HTTP 2.0 唯一可行选择的 SPDY 是什么呢?当下我们如何能部署上 SPDY 呢?

左边是普通 HTTPS 加载,右边是 SPDY 加载。是不是很神奇?

SPDY 是什么 ?

SPDY 是 Google 开发的基于传输控制协议 (TCP) 的应用层协议 ,开发组正在推动 SPDY 成为正式标准(现为互联网草案)。SPDY 协议旨在通过压缩、多路复用和优先级来缩短网页的加载时间和提高安全性。(SPDY 是 Speedy 的昵音,意思是更快)

SPDY 与 HTTP 的关系

http-spdy

SPDY 协议只是在性能上对 HTTP 做了很大的优化,其核心思想是尽量减少连接个数,而对于 HTTP 的语义并没有做太大的修改。具体来说是,SPDY 使用了 HTTP 的方法和页眉,但是删除了一些头并重写了 HTTP 中管理连接和数据转移格式的部分,所以基本上是兼容 HTTP 的。

Google 在 SPDY 白皮书里表示要向协议栈下面渗透并替换掉传输层协议(TCP),但是因为这样无论是部署起来还是实现起来暂时相当困难,因此 Google 准备先对应用层协议 HTTP 进行改进,先在 SSL 之上增加一个会话层来实现 SPDY 协议,而 HTTP 的 GET 和 POST 消息格式保持不变,即现有的所有服务端应用均不用做任何修改。

因此在目前,SPDY 的目的是为了加强 HTTP,是对 HTTP 一个更好的实现和支持。至于未来 SPDY 得到广泛应用后会不会演一出狸猫换太子,替换掉 HTTP 并彻底颠覆整个 Internet 就是 Google 的事情了。

为什么要重新建立一个 SPDY ?

距离万维网之父蒂姆·伯纳斯-李发明并推动 HTTP 成为如今互联网最流行的协议已经过去十几年了(现用 HTTP 1.1 规范也停滞了 13 年了),随着现在 WEB 技术的飞速发展尤其是 HTML5 的不断演进,包括 WebSockets 协议的出现以及当前网络环境的改变、传输内容的变化,当初的 HTTP 规范已经逐渐无法满足人们的需要了,HTTP 需要进一步发展,因此 HTTPbis 工作组已经被组建并被授权考虑 HTTP 2.0 ,希望能解决掉目前 HTTP 所带来的诸多限制。而 SPDY 正是 Google 在 HTTP 即将从 1.1 跨越到 2.0 之际推出的试图成为下一代互联网通信的协议,长期以来一直被认为是 HTTP 2.0 唯一可行选择。

HTTP 协议的不足

1. 单路连接 请求低效

HTTP 协议的最大弊端就是每个 TCP 连接只能对应一个 HTTP 请求,即每个 HTTP 连接只请求一个资源,浏览器只能通过建立多个连接来解决。此外在 HTTP 中对请求是严格的先入先出(FIFO)进行的,如果中间某个请求处理时间较长会阻塞后面的请求。

(注:虽然 HTTP pipelining 对连接请求做了改善,但复杂度增加很大,并未普及)

2. HTTP 只允许由客户端主动发起请求

服务端只能等待客户端发送一个请求,在可以满足预加载的现状是一种桎梏。

3. HTTP 头冗余

HTTP 头在同一个会话里是反复发送的,中间的冗余信息,比如 User-Agent、Host 等不需要重复发送的信息也在反复发送,浪费带宽和资源。

SPDY 协议的优点

1. 多路复用 请求优化

SPDY 规定在一个 SPDY 连接内可以有无限个并行请求,即允许多个并发 HTTP 请求共用一个 TCP会话。这样 SPDY 通过复用在单个 TCP 连接上的多次请求,而非为每个请求单独开放连接,这样只需建立一个 TCP 连接就可以传送网页上所有资源,不仅可以减少消息交互往返的时间还可以避免创建新连接造成的延迟,使得 TCP 的效率更高。

此外,SPDY 的多路复用可以设置优先级,而不像传统 HTTP 那样严格按照先入先出一个一个处理请求,它会选择性的先传输 CSS 这样更重要的资源,然后再传输网站图标之类不太重要的资源,可以避免让非关键资源占用网络通道的问题,提升 TCP 的性能。

2. 支持服务器推送技术

服务器可以主动向客户端发起通信向客户端推送数据,这种预加载可以使用户一直保持一个快速的网络。

3. SPDY 压缩了 HTTP 头

舍弃掉了不必要的头信息,经过压缩之后可以节省多余数据传输所带来的等待时间和带宽。

4. 强制使用 SSL 传输协议

Google 认为 Web 未来的发展方向必定是安全的网络连接,全部请求 SSL 加密后,信息传输更加安全。

SPDY 协议的意义

按照 Google 的说法,SPDY 被创造出来的唯一目的就是让 Web 更快(strive to make the whole web fast),其名字 SPDY(Speedy) 也似乎在暗示着这一点。那么 SPDY 的意义又在哪里呢?

1. 普通用户:

对于使用者来说,隐藏在浏览器下面的 SPDY 相比 HTTP 没有任何区别,但是我们可以感觉到 Google 服务在 Chrome 下异常的快,这就是 SPDY 的功劳了。此外网站信息传输加密后不用担心信息被截取等,大大增加了安全性和保密性。

2. 前端人员:

对于前端工程师们来说,提升页面效率是一件很重要的事情,目前大多采用像 CSS Sprites 等方法来优化网站,对于因为页面加载时每张图片、icon 都请求一个连接甚至采用在不同页面引用不同图片来降低一个页面内图片的请求数量。而现在有了 SPDY 的请求优化可以将请求顺序进行重排,这样可以在很大程度上缓解页面加载时图片请求带来的影响。例如像极客公园的报名页面,如果报名用户过多,例如极客公园2012年创新大会极客公园第 27 期长城会,可以很明显的感觉出头像的请求会拖累整体页面加载变慢甚至变卡,相信对于这点,经常上淘宝或刷微博的会深有体会,一旦网速稍微慢点就会出现页面加载异常,还有像苹果 App Store(除去服务器因为地区的延迟),豌豆荚这类应用分发平台上应用图标刷新缓慢等,如下面这个视频所示。

3. 运维人员:

SPDY 在降低连接数目的同时,还使得服务器上每个客户端占用的资源也减少,从而可以释放出更多内存和 CPU 。此外 SPDY 综合起来可以将浏览速度提升一倍,页面加载延迟方面的改进达 64% 。

众家支持的 SPDY 协议

如果你在使用 Chrome 浏览器,同时使用像 Gmail 等 Google 的网络服务的话,其实你已经不再是通过 HTTP 访问这些服务了。在浏览器打开 chrome://net-internals/#spdy 就会发现你已经在使用 SPDY 协议了。(除了包括 Google 自家的 Gmail、Google Plus 等 Google 系服务外,其他公共站点例如 Twitter 和 Webtide 也已经支持该协议。在国内,基于 WebKit 的豌豆荚 2.0 也曾表示将引进Chrome的SPDY技术来进一步提升速度

就像上图所示的那样,SPDY 的实现需要浏览器客户端和 Web 服务器同时支持。在客户端浏览器这快 Google自家的 Chrome 和Chromium 全系列不用说,都已经支持SPDY; Mozilla 家的 Firefox 自 Firefox 13 也默认开启对 SPDY 的支持。而亚马逊家的 Silk 利用 SPDY 的深度其实不比 Google 自家的 Chrome 和 Firefox 差。

在Web 服务器方面包括最流行和最广泛的 Apache 在内,Netty、Jeety、Varnish、Erlang 和 Hightide 应用服务器以及面向 node.js 的服务器也都已经宣布支持 SPDY。(Nginx 也表示将支持 SPDY

如何部署 SPDY?

近日 Google 正式发布了适用于最流行 Web 服务器 Apache 的插件 mod_spdy,将其下载安装后你的 Apache 服务器就能使用 SPDY 协议与兼容 SPDY 协议的浏览器如 Chrome、FireFox 等进行通信。像之前所说的那样,SPDY 是运行在 HTTPS 上,非 HTTPS 流量并不会受到 mod_spdy 影响。

SPDY 部署要求:

1. Apache 2.2 (≥2.2.4) 2. mod_ssl 模块开启

SPDY 部署步骤:

1. 下载 mod_spdy 模块

下载页面下载对应系统的安装包

2. 安装 mod_spdy 模块

在系统终端运行下面命令行

dpkg -i mod-spdy-*.debapt-get -f install

-系统为 Debian/Ubuntu

————————————————————

yum install at (if you do not already have ‘at’ installed)rpm -U mod-spdy-*.rpm

-系统为 CentOS/Fedora

3. 重启服务器(Apache)

sudo /etc/init.d/apache2 restart (Debian/Ubuntu)

4. 确定开启与否

打开 Chrome 浏览器,输入并前往 chrome://net-internals/#spdy 页面,查看主机名称是否出现在标识栏中。如果出现说明已经部署完毕,如果没有出现去服务器错误日志(error.log)里查询。

未来的web基础?

在最新的协议文档里 Google 重新将 SPDY 分为了两层,其中一层被描述为 HTTP-like,大有取代 HTTP 的意图(Google 最近的一篇文章已经直呼 SPDY 为“a replacement for HTTP”)。同时 HTTP 2.0 标准制定工作组(HTTPbis)也表示,SPDY 很有希望接替当前的 HTTP 传输实现

考虑到 Chrome 和安卓的份额以及标准的推动,相信 SPDY 会有一个好前景。因此选择此刻支持 SPDY 也是明智的选择。

VIA http://www.geekpark.net/read/view/158198 

 

Linux:在终端命令行下播放音乐的命令

  现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单。那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了。

  不过现在我们可以先安装一个小软件,然后通过命令行来使用这个软件播放音乐,感觉还是很不错滴。

  这个软件的名字叫:SOX,支持很多格式的音频文件,如 WAV,MP3,MPG,OGG,FLAC 等等。满足我们日常使用是足够足够的了。

  好了,首先,第一步我们需要把它安装到我们的系统里。

1、打开一个终端(Ctrl+Alt+T),然后输入如下命令:

sudo apt-get install sox

https://dn-linuxcn.qbox.me/data/attachment/album/201305/28/142822773dnmm8okkkfne7.png

2、给系统安装软件需要管理员密码。输入密码后回车。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/28/142823izikp3e1kkjy3qm8.png

3、在安装的时候询问你是否继续的时候输入 Y 来确认继续安装。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/28/14282483eqxebqbtm7t64l.png

4、好了,只要等待它完成安装就可以了。完成安装以后,我们就可以通过下面的命令来让 SOX 可以播放它所支持的音频格式文件:

sudo apt-get install sox libsox-fmt-all

https://dn-linuxcn.qbox.me/data/attachment/album/201305/28/142825c1vvvgsvcv1x670x.png

5、好了,现在可以使用 SOX 来播放我们计算机里的音频文件了。

6、比如要播放系统中所有音频文件,我们可以采用这个命令:

play *mp3

https://dn-linuxcn.qbox.me/data/attachment/album/201305/28/1428263a5oeo5uyes72s3a.png

7、如果要播放某个特定的文件,那么采用这个命令:

play file-name.extension

比如:

play Aqua_Barbie_Girl.mp3

可以只播放 Aqua_Barbie_Girl.mp3 这 MP3。

https://dn-linuxcn.qbox.me/data/attachment/album/201305/28/1428274xxjrdaj18pww149.png

8、在播放的时候,我们可以按下 Ctrl+C 来终端当前音频的播放转到下一个音频。

9、关于更多的 SOX 的操作命令我们可以使用 man 命令来查看详细的介绍。希望大家能有所发现。

man sox

来自:http://www.unixmen.com/how-to-play-music-from-command-line-terminal/

来源:https://linux.cn/article-1393-1.html

Linux:Linux TCP 系统参数配置

我们这里应用的是CentOS5.3,并内核使用的是2.6.18-128.el5PAE #1 SMP 。修改部分TCP ,有的是为了提高性能与负载,但是存在降低稳定性的风险。有的则是安全方面的配置,则有可能牺牲了性能。

1.TCP keepalive TCP连接保鲜设置

echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes

keepalive是TCP保鲜定时器。当网络两端建立了TCP连接之后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,如果一直没有收到对方的ack,一共会尝试tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。

2. syn cookies设置

echo 0 > /proc/sys/net/ipv4/tcp_syncookies

在CentOS5.3中,该选项默认值是1,即启用syn cookies功能。我们建议先关闭,直到确定受到syn flood攻击的时候再开启syn cookies功能,有效地防止syn flood攻击。也可以通过iptables规则拒绝syn flood攻击。

3.TCP  连接建立设置

echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 2 > /proc/sys/net/ipv4/tcp_syn_retries
echo 2 > /proc/sys/net/ipv4/tcp_synack_retries

tcp_max_syn_backlog  SYN队列的长度,时常称之为未建立连接队列。系统内核维护着这样的一个队列,用于容纳状态为SYN_RESC的TCP连接(half-open connection),即那些依然尚未得到客户端确认(ack)的TCP连接请求。加大该值,可以容纳更多的等待连接的网络连接数。

tcp_syn_retries  新建TCP连接请求,需要发送一个SYN包,该值决定内核需要尝试发送多少次syn连接请求才决定放弃建立连接。默认值是5. 对于高负责且通信良好的物理网络而言,调整为2

tcp_synack_retries  对于远端SYN连接请求,内核会发送SYN+ACK数据包来确认收到了上一个SYN连接请求包,然后等待远端的确认(ack数据包)。该值则指定了内核会向远端发送tcp_synack_retires次SYN+ACK数据包。默认设定值是5,可以调整为2

4. TCP 连接断开相关设置

echo 30 >  /proc/sys/net/ipv4/tcp_fin_timeout
echo 15000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 >  /proc/sys/net/ipv4/tcp_tw_recycle

tcp_fin_timeout 对于由本端主动断开连接的TCP连接,本端会主动发送一个FIN数据报,在收到远端ACK后,且并没有收到远端FIN包之前,该TCP连接的状态是FIN_WAIT_2状态,此时当远端关闭了应用,网络不可达(拔网张),程序不可断僵死等等,本端会一直保留状态为FIN_WAIT_2状态的TCP连接,该值tcp_fin_timeout则指定了状态为FIN_WAIT_2的TCP连接保存多长时间,一个FIN_WAIT_2的TCP连接最多占1.5k内存。系统默认值是60秒,可以将此值调整为30秒,甚至10秒。

tcp_max_tw_buckets 系统同时处理TIME_WAIT sockets数目。如果一旦TIME_WAIT tcp连接数超过了这个数目,系统会强制清除并且显示警告消息。设立该限制,主要是防止那些简单的DoS攻击,加大该值有可能消耗更多的内存资源。如果TIME_WAIT socket过多,则有可能耗尽内存资源。默认值是18w,可以将此值设置为5000~30000 tcp_tw_resue 是否可以使用TIME_WAIT tcp连接用于建立新的tcp连接。

tcp_tw_recycle 是否开启快带回收TIME_WAIT tcp连接的功能。

5. tcp 内存资源使用相参数设定

echo 16777216 > /proc/sys/net/core/rmem_max
echo 16777216 > /proc/sys/net/core/wmem_max
cat /proc/sys/net/ipv4/tcp_mem
echo “4096 65536 16777216″ > /proc/sys/net/ipv4/tcp_rmem
echo “4096 87380 16777216″ > /proc/sys/net/ipv4/tcp_wmem

rmem_max 定义了接收窗口可以使用的最大值,可以根据BDP值进行调节。

wmem_max 定义了发送窗口可以使用的最大值,可以根据BDP什值进行调整。

tcp_mem [low, pressure, high] TCP用这三个值来跟踪内存使用情况,来限定资源占用。通常情况下,在系统boot之时,内核会根据可用内存总数计算出这些值。如果出现了Out of socket memory,则可以试着修改这个参数。

1)low: 当TCP使用了低于该值的内存页面数时,TCP不会考滤释放内存。

2)pressure: 当TCP使用了超过该值的内存页面数量,TCP试图稳定其对内存的占用,进入pressure模式,直到内存消耗达于low值,退出该模式。

3)hight:允许所有tcp sockets用于排队缓冲数据报的内存页数。

tcp_rmem [min, default, max]

1)min 为每个TCP连接(tcp socket)预留用于接收缓冲的内存数量,即使在内存出现紧张情况下TCP socket都至少会有这么多数量的内存用于接收缓冲。

2)default 为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 rmem_default的值,所以有可能被rmem_default覆盖。

3)max 该值为每个tcp连接(tcp socket)用于接收缓冲的内存最大值。该值不会影响wmem_max的值,设置了选项参数 SO_SNDBUF则不受该值影响。

tcp_wmem [min, default, max] 如上(tcp_rmen)只不过用于发送缓存。

注:

1)可以通过sysctl -w 或者写入/etc/sysctl.conf永久保存

2)性能调优仅在于需要的时候进行调整,调整以后需要采集数据与基准测试数据进行比较。建议,不需要盲从地调整这些参数。

via http://www.linuxde.net/2013/05/13600.html

Linux:防御XSS攻击的七条原则

前言

本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:《Stored and Reflected XSS Attack》《DOM Based XSS

攻击者可以利用XSS漏洞向用户发送攻击脚本,而用户的浏览器因为没有办法知道这段脚本是不可信的,所以依然会执行它。对于浏览器而言,它认为这段脚本是来自可以信任的服务器的,所以脚本可以光明正大地访问Cookie,或者保存在浏览器里被当前网站所用的敏感信息,甚至可以知道用户电脑安装了哪些软件。这些脚本还可以改写HTML页面,进行钓鱼攻击。

虽然产生XSS漏洞的原因各种各样,对于漏洞的利用也是花样百出,但是如果我们遵循本文提到防御原则,我们依然可以做到防止XSS攻击的发生。

有人可能会问,防御XSS的核心不就是在输出不可信数据的时候进行编码,而现如今流行的Web框架(比如Rails)大多都在默认情况下就对不可信数据进行了HTML编码,帮我们做了防御,还用得着我们自己再花时间研究如何防御XSS吗?答案是肯定的,对于将要放置到HTML页面body里的不可信数据,进行HTML编码已经足够防御XSS攻击了,甚至将HTML编码后的数据放到HTML标签(TAG)的属性(attribute)里也不会产生XSS漏洞(但前提是这些属性都正确使用了引号),但是,如果你将HTML编码后的数据放到了
直接插入到SCRIPT标签里 插入到HTML注释里

 

插入到HTML标签的属性名里

 

插入到HTML标签的属性值里 <不要在这里直接插入不可信数据 href=”…”> 作为HTML标签的名字直接插入到CSS里

最重要的是,千万不要引入任何不可信的第三方JavaScript到页面里,一旦引入了,这些脚本就能够操纵你的HTML页面,窃取敏感信息或者发起钓鱼攻击等等。

原则2:在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码

在这里相当强调是往HTML标签之间插入不可信数据,以区别于往HTML标签属性部分插入不可信数据,因为这两者需要进行不同类型的编码。当你确实需要往HTML标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行HTML Entity编码。比如,我们经常需要往DIV,P,TD这些标签里放入一些用户提交的数据,这些数据是不可信的,需要对它们进行HTML Entity编码。很多Web框架都提供了HTML Entity编码的函数,我们只需要调用这些函数就好,而有些Web框架似乎更“智能”,比如Rails,它能在默认情况下对所有插入到HTML页面的数据进行HTML Entity编码,尽管不能完全防御XSS,但着实减轻了开发人员的负担。

…插入不可信数据前,对其进行HTML Entity编码…
…插入不可信数据前,对其进行HTML Entity编码…

…插入不可信数据前,对其进行HTML Entity编码…

以此类推,往其他HTML标签之间插入不可信数据前,对其进行HTML Entity编码

[编码规则]那么HTML Entity编码具体应该做哪些事情呢?它需要对下面这6个特殊字符进行编码:

&     –>     &
<     –>     <
>     –>     >
”     –>     "
‘     –>     '
/     –>     /

有两点需要特别说明的是:

  • 不推荐将单引号( ‘ )编码为 ' 因为它并不是标准的HTML标签
  • 需要对斜杠号( / )编码,因为在进行XSS攻击时,斜杠号对于关闭当前HTML标签非常有用

推荐使用OWASP提供的ESAPI函数库,它提供了一系列非常严格的用于进行各种安全编码的函数。在当前这个例子里,你可以使用:

String encodedContent = ESAPI.encoder().encodeForHTML(
   request.getParameter(“input”));

原则3:在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码

这条原则是指,当你要往HTML属性(例如width、name、value属性)的值部分(data value)插入不可信数据的时候,应该对数据进行HTML属性编码。不过需要注意的是,当要往HTML标签的事件处理属性(例如onmouseover)里插入数据的时候,本条原则不适用,应该用下面介绍的原则4对其进行JavaScript编码。

 
属性值部分没有使用引号,不推荐
 
属性值部分使用了单引号
 
属性值部分使用了双引号

[编码规则]

除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 (以&#x开头,HH则是指该字符对应的十六进制数字,分号作为结束符)

之所以编码规则如此严格,是因为开发者有时会忘记给属性的值部分加上引号。如果属性值部分没有使用引号的话,攻击者很容易就能闭合掉当前属性,随后即可插入攻击脚本。例如,如果属性没有使用引号,又没有对数据进行严格编码,那么一个空格符就可以闭合掉当前属性。请看下面这个攻击:

假设HTML代码是这样的:

…content…

攻击者可以构造这样的输入:

x onmouseover=”javascript:alert(/xss/)”

最后,在用户的浏览器里的最终HTML代码会变成这个样子:

…content…

只要用户的鼠标移动到这个DIV上,就会触发攻击者写好的攻击脚本。在这个例子里,脚本仅仅弹出一个警告框,除了恶作剧一下也没有太多的危害,但是在真实的攻击中,攻击者会使用更加具有破坏力的脚本,例如下面这个窃取用户cookie的XSS攻击:

x />






除了空格符可以闭合当前属性外,这些符号也可以:

%     *     +     ,     –     /     ;     <     =     >     ^     |     `(反单引号,IE会认为它是单引号)

可以使用ESAPI提供的函数进行HTML属性编码:

String encodedContent = ESAPI.encoder().encodeForHTMLAttribute(
    request.getParameter(“input”));

原则4:在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码

这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(Event Handler,如onmouseover, onload等)。在往JavaScript代码里插入数据的时候,只有一种情况是安全的,那就是对不可信数据进行JavaScript编码,并且只把这些数据放到使用引号包围起来的值部分(data value)之中,例如:


除此之外,往JavaScript代码里其他任何地方插入不可信数据都是相当危险的,攻击者可以很容易地插入攻击代码。


值部分使用了单引号

值部分使用了双引号
值部分使用了引号,且事件处理属性的值部分也使用了引号 特别需要注意的是,在XSS防御中,有些JavaScript函数是极度危险的,就算对不可信数据进行JavaScript编码, 也依然会产生XSS漏洞,例如:

[编码规则]

除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 \xHH (以 \x 开头,HH则是指该字符对应的十六进制数字)

在对不可信数据做编码的时候,千万不能图方便使用反斜杠( \ )对特殊字符进行简单转义,比如将双引号 ” 转义成 \” ,这样做是不可靠的,因为浏览器在对页面做解析的时候,会先进行HTML解析,然后才是JavaScript解析,所以双引号很可能会被当做HTML字符进行HTML解析,这时双引号就可以突破代码的值部分,使得攻击者可以继续进行XSS攻击。例如:

假设代码片段如下:


攻击者输入的内容为:

\”; alert(‘xss’);//

如果只是对双引号进行简单转义,将其替换成 \” 的话,攻击者输入的内容在最终的页面上会变成:


浏览器在解析的时候,会认为反斜杠后面的那个双引号和第一个双引号相匹配,继而认为后续的alert(‘xss’)是正常的JavaScript脚本,因此允许执行。

可以使用ESAPI提供的函数进行JavaScript编码:

String encodedContent = ESAPI.encoder().encodeForJavaScript(
   request.getParameter(“input”));

原则5:在将不可信数据插入到Style属性里时,对这些数据进行CSS编码

当需要往Stylesheet,Style标签或者Style属性里插入不可信数据的时候,需要对这些数据进行CSS编码。传统印象里CSS不过是负责页面样式的,但是实际上它比我们想象的要强大许多,而且还可以用来进行各种攻击。因此,不要对CSS里存放不可信数据掉以轻心,应该只允许把不可信数据放入到CSS属性的值部分,并进行适当的编码。除此以外,最好不要把不可信数据放到一些复杂属性里,比如url, behavior等,只能被IE认识的Expression属性允许执行JavaScript脚本,因此也不推荐把不可信数据放到这里。

[编码规则]

除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 \HH (以 \ 开头,HH则是指该字符对应的十六进制数字)

同原则2,原则3,在对不可信数据进行编码的时候,切忌投机取巧对双引号等特殊字符进行简单转义,攻击者可以想办法绕开这类限制。

可以使用ESAPI提供的函数进行CSS编码:

String encodedContent = ESAPI.encoder().encodeForCSS(
    request.getParameter(“input”));

原则6:在将不可信数据插入到HTML URL里时,对这些数据进行URL编码

当需要往HTML页面中的URL里插入不可信数据的时候,需要对其进行URL编码,如下:


    Link Content 

[编码规则]

除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 %HH (以 % 开头,HH则是指该字符对应的十六进制数字)

在对URL进行编码的时候,有两点是需要特别注意的:

1) URL属性应该使用引号将值部分包围起来,否则攻击者可以很容易突破当前属性区域,插入后续攻击代码2) 不要对整个URL进行编码,因为不可信数据可能会被插入到href, src或者其他以URL为基础的属性里,这时需要对数据的起始部分的协议字段进行验证,否则攻击者可以改变URL的协议,例如从HTTP协议改为DATA伪协议,或者javascript伪协议。

可以使用ESAPI提供的函数进行URL编码:

String encodedContent = ESAPI.encoder().encodeForURL(
    request.getParameter(“input”));

ESAPI还提供了一些用于检测不可信数据的函数,在这里我们可以使用其来检测不可信数据是否真的是一个URL:

String userProvidedURL = request.getParameter(“userProvidedURL”);
boolean isValidURL = ESAPI.validator().isValidInput(
   “URLContext”, userProvidedURL, “URL”, 255, false);
if (isValidURL) {
  ”>
}

原则7:使用富文本时,使用XSS规则引擎进行编码过滤

Web应用一般都会提供用户输入富文本信息的功能,比如BBS发帖,写博客文章等,用户提交的富文本信息里往往包含了HTML标签,甚至是JavaScript脚本,如果不对其进行适当的编码过滤的话,则会形成XSS漏洞。但我们又不能因为害怕产生XSS漏洞,所以就不允许用户输入富文本,这样对用户体验伤害很大。

针对富文本的特殊性,我们可以使用XSS规则引擎对用户输入进行编码过滤,只允许用户输入安全的HTML标签,如, ,

等,对其他数据进行HTML编码。需要注意的是,经过规则引擎编码过滤后的内容只能放在

,

等安全的HTML标签里,不要放到HTML标签的属性值里,更不要放到HTML事件处理属性里,或者放到

Linux:linux下部署goagent

下载以下两个软件

1.Google App Engine SDK for Python
https://developers.google.com/appengine/downloads?hl=zh-CN#Google_App_Engine_SDK_for_Python
2.goagent
https://code.google.com/p/goagent/

在此提供已经包含goagent的google appengine压缩包 http://pan.baidu.com/share/link?shareid=472887&uk=1493434283  (goagent 3.0.1)

下载后解压,将解压后的goagent文件夹放到google_appengine目录下,我的目录结构如下:~/google_appengine/goagent-goagent-d488f2

准备好申请的Google application_ID与两步验证密码,如何申请请问google

下来是配置goagent

编辑~/google_appengine/goagent-goagent-d488f2/local/proxy.ini

填写正确的appid,在此建议将profile由默认的google_cn改为google_hk,编辑完成后保存退出

运行以下命令更新app

aquan@edge ~/google_appengine $ python appcfg.py update goagent-goagent-d4488f2/server/python/
07:03 PM Host: appengine.google.com
07:03 PM Application: wrchiublog; version: 1
07:03 PM
Starting update of app: wrchiublog, version: 1
07:03 PM Getting current resource limits.
Email: wrchiu@126.com  //在此填写googleid
Password for wrchiu@126.com:    //此处填写两步验证密码,而不是帐号密码
07:04 PM Scanning files on local disk.
07:04 PM Cloning 1 static file.
07:04 PM Cloning 6 application files.
07:04 PM Uploading 1 files and blobs.
07:04 PM Uploaded 1 files and blobs
07:04 PM Compilation starting.
07:04 PM Compilation completed.
07:04 PM Starting deployment.
07:04 PM Checking if deployment succeeded.
07:04 PM Deployment successful.
07:04 PM Checking if updated app version is serving.
07:04 PM Completed update of app: wrchiublog, version: 1

更新完成后便可以使用以下命令开是appengine/goagent-goagent-d4488f2/local $ python proxy.py

注意:有时在更新app时会出现如下错误

aquan@edge ~/google_appengine $ python appcfg.py update goagent-goagent-d4488f2/server/python/
07:00 PM Host: appengine.google.com
Error parsing yaml file:
Unable to assign value 'your_appid' to attribute 'application':
Value 'your_appid' for application does not match expression
  '^(?:(?:[a-z\d\-]{1,100}\~)?(?:(?!\-)[a-z\d\-\.]{1,100}:)?(?!-)[a-z\d\-]{0,99}[a-z\d])$'
  in "goagent-goagent-d4488f2/server/python/app.yaml", line 1, column 14

可按照提示修改goagent-goagent-d4488f2/server/python/app.yaml中的application为正确的appid

至此linux下goagent部署完成,推荐使用chromium浏览器配合Proxy SwitchySharp插件,使用方法可以参考这里

以上操作在linuxmint 15下实现

via http://aotee.com/linux-and-goagent

Linux:SQL联合语句的视觉解释

我认为Ligaya Turmelle的关于SQL联合(join)语句的帖子对于新开发者来说是份很好的材料。SQL 联合语句好像是基于集合的,用韦恩图来解释咋一看是很自然而然的。不过正如在她的帖子的回复中所说的,在测试中我发现韦恩图并不是十分的匹配SQL联合语法。

不过我还是喜欢这个观点,所以我们来看看能不能用上韦恩图。假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。 

内联合(inner join)

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

内联合(inner join)只生成同时匹配表A和表B的记录集。(如下图)

inner join

 

全外联合(full outer join)

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)

Full outer join

左外联合(left outer join)

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。(如下图)

Left outer join

仅在左表的左外联合(left outer join)

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
id  name       id     name
--  ----       --     ----
2   Monkey     null   null
4   Spaghetti  null   null
为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。(如下图)

不重复的全外联合(full outer join)

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null
id    name       id    name
--    ----       --    ----
2     Monkey     null  null
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。(如下图)

 

交叉联合(cross join)

还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示:

 
SELECT * FROM TableA
CROSS JOIN TableB

这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。如果你学过数学,你便知道为什么这个联合遇上大型的表很危险。

 

英文原文;Jeff Atwood,编译:伯乐在线 – @奇风余谷

译文链接:http://blog.jobbole.com/40443/

Linux:Linux 3.10完全无滴嗒特性详解

在一个典型的Linux系统中,运行中的CPU通常每秒会被时钟打断100到1000次。时钟中断是为了重新考虑应该运行哪个进程、响应读写更新 (RCU)调用,以及处理其它必要的事务。这种周期性的时钟中断或滴嗒比臭名昭著的全局内核锁(BKL)要合理得多,但它的缺点是影响性能,也称不上节 能。

几年前,Linux社区开发出了可选的无滴答(tickless)模式,当CPU处于空闲状态,默认关闭时钟中断。它允许空闲CPU长时间处于深度睡 眠状态,减少电力消耗。它对于笔记本手机之类电池供电系统具有重要意义。然而这种无滴答模式也存在缺陷,不利于高延迟敏感环境,因为唤醒睡眠中的CPU有 时间开销。

Linux 3.10内核引入了一个近似完全无滴嗒(full tickless)模式, 该模式默认关闭。根据内核开发者的测试,它能节省1%的CPU时间。在启用完全无滴答模式后,运行中的CPU如果只有一个可运行进程,它将关闭时钟中断。 如果出现第二个进程,滴嗒会再次出现以供调度器根据时间段分配资源。

从技术角度说,这并不是完全无滴嗒,只能说近似。高性能和实时计算将会受益于这个新模 式,因为在这两种环境下,一个CPU执行一个任务是一种常见的策略。

via http://www.linuxde.net/2013/06/13709.html 

Linux:四款 Linux 下照片元数据(EXIF)编辑软件

  现在随着数码相机已经一统天下的局面,我们所有的相片都已经数字化了。而每张数字化的相片,除了我们肉眼看到的信息外,还有很多我们是不直接看到的信息,这些信息对于摄影爱好者来说都是宝贵的数据。这些信息包括照片的标题、描述、曝光时间、ISO值、焦距、版权、一些高级相机还能包括照片成形时的经纬度等等。

  这些信息我们一方面需要查看,一方面我们可能根据需求要修改。这些信息全部以 EXIF 的格式存在照片内,像 Flickr 和 Picasa 网站都可以读取这些信息来给图片提供更加直观的信息。

  下面的四款软件是读取和修改 Exif 的佼佼者:

  • Phatch 简单易用的跨平台的GUI图片批量处理器
  • Photini 容易上手的数码照片 Exif 编辑器
  • ExifTool 可以以命令行来修改 Exif 的软件
  • digiKam 查看和编辑元数据的工具

来源:https://linux.cn/article-1417-1.html

Linux:电子书转换软件 Calibre 0.9.33 加强 PDF 输出功能

  Calibre 在 5 月 31 日发布了 0.9.33 版本。Calibre 一直以来都保持一个稳定的发布过程,每次升级变化不大,不过却一直以 Bug 少和稳定著称。不知道什么时候我们能看到他们发布具有历史意义的 1.0 版本。

点击查看原始大图

这次的 0.9.33 版本期中有一个很重要的改进:

  • 增加输出 PDF 目录页码功能。这是一个很有用的功能,可以在您将文档转换为 PDF 的时候给 PDF 文档自动加上页码。
  • 增加浏览文档评论的功能
  • 修正搜索时使用 _daysago 时发生的错误

官方发布通告:http://calibre-ebook.com/whats-new

如果您想自己编译安装这个软件,您可能需要 GLIBC 2.10 或更高版本、xdg-utils、python 2.6版本以上但是 3.x 版本一,详细的编译需求可以在官方网站查询。

Linux 版下载:

  • tar.xz[sources] [27.63 MB]
  • tar.gz (32-bit)[binary] [54.54 MB]
  • tar.gz (64-bit)[binary] [55.78 MB]

来源:https://linux.cn/article-1419-1.html

Linux:选择WebSockets还是REST?

过去的几年,WebSockets逐渐成熟并变得可用。去年年底,WebSockets距离成为标准更近了一步:成为了W3C CR。Oracle和其他一些组织最近也提交了关于在下个版本的Java EE中启动WebSockets标准化的请求。所有的主流浏览器如Chrome,FireFox,Safari和IE都支持众多WebSockets版本中的一种,但如果标准一旦制定,无论如何他们也将最终遵循制定的标准。在一个相对较短的时间里,WebSockets几乎已经成了Web不可分割的一部分。然而,仍然有部分开发者不确定WebSockes是否或者适应Web的架构风格:REST。他们中的一些,例如Nathan Evans就比较激进,他认为WebSockets可能给REST蒙上阴影。

在详细阅读了标准以及吸收了一些网上围绕此话题展开的讨论之后,我日益认为这份标准将占有RESTful服务的大量思想。我的意思是说,未来某个时间在产品开发时将会有人问到: “好吧兄弟们,这个产品中我们到底是用WebSockets呢还是REST?” 我期望在一两年内 WebSockets将开始阻止RESTful Web服务的发展,至少如我们现在所知的那样。

在他的文章中,Nathan认为尽管他承认WebSockets并非完美,但基于他使用REST的经验,REST也不是他人所描述的银弹。然后他列出了WebSockets为何会成为REST的威胁的几条理由,包括“不够格”的REST框架依赖基于文本协议的情况。还有一些相比REST,WebSockets提供的重要好处,比如双向交互的能力。

WebSockets提供的真正的双工通信是任何其他HTTP传输的协议所不具备的,无论它是SOAP还是REST。而Comet,Push和长轮询也只能模拟,还非常低效。双工通信天性就足够好滴允许你建立实时TCP通讯协议,比如RDP或VNC。

Nathan相信WebSockets提供的好处比REST(HTTP)更有用,所以开发者们将会喜欢WebSockets而转向使用它。

REST可能仍将是需要可视性和跨平台互操作性的项目的首选。然而不需要这些特性的项目将很可能选取WebSockets,在其上仍可使用JSON,或 一种预定的通讯协议。尽管他们是竞争者的关系,他们仍可共存.事实上,他们其实是相辅相成的,因为他们都是建立在HTTP基础之上。  

然而,Nathan并非提出”WebSockets or/versus REST”这一问题的唯一一人。例如Shay Bannon在2010年曾提出是否可以在WebSockets中使用REST的原则的一些问题。

首要的是,如何表示一个URL?其次,你如何表示一个HTTP方法?最后,你如何表示HTTP URL参数和HTTP头?看起来一种解决办法是在让内容文本遵循一种规则,就像JSON字符串那样,具有一个URL字段和参数字段等等。但这也是很恼人的,因为在HTTP中,你可以直接使用HTTP头或者参数来很简单地创建连接,而不需要解析内容。

他觉得为何WebSockets就没有“URI”或“头”的概念,因此是否需要一种REST-over-WebSockets的规范,以防止人们重新发明REST并最终导致“各行其道”?那时他的文章收到了各种答复,比如一个答复者说他在一个WebSockets公司工作,所以他的观点可能不是客观的,他提到:

REST和WebSocket的通讯看起来是分布式计算管道的两种类型。REST是那个老学校,坐在HTTP的顶上,同步风格的web调用。WebSocket是新的,坐在HTTP旁边的,通常是异步的web通信。恕我直言,长期看来,WebSocket将显著地降低WAN计算中对于REST的需求。使用WebSocket,过去几十年中我们所熟知和喜爱的所有协议将被扩展,并且不会出现在使用HTTP的情况下的笨拙和低效。

还有另外一个提到:

我认为REST陷入了传统的请求/响应模式。而WebSocket满足了Comet和长轮询的场景,通讯管道在多次通讯过程中并不关闭。同时,到WS初始的握手仍然由HTTP发起,所以实际上他们并非互斥的。我还认为WS协议的目的就在于摆脱HTTP头中那些令人讨厌的东西,因为它们冗长并且只增加了负载。

然而,在同意REST和WebSockets能并且应该共存的同时,一些评论者完全不同意REST-over-WebSockets规范的概念。一个说道:

如果你把REST看作字段式的,具有地址的资源,那么这在双向通讯中无法工作。你无法期待资源会初始化对话,WebSocket会改变Web,但不是作为一个REST风格的通信协议。

而另一个更详细地描述了自己的观点:

WebSockets就像两个人的对话,是完全双工的,因此双方都可以同时说话,而且双方在说话的时候也都必须同时保持监听。REST是无状态和同步的,只能处理请求->响应。要获得自发的服务器向客户端的通信,你必须扩展REST的概念。我看到过一个使用WebSocket实现了REST的库,但它也只能对于那些已经有了RESTful API并且想要获得低开支的好处,以使单个连接即可满足通信要求而不用重构代码的应用有好处。

REST社区也有一些人,比如 Jim Webber,认为WebSockets 对web来说不是好的选择

Jim Webber tweet

在WebSockets即将成为标准之际,它正在被广泛支持并使用于浏览器、手机,想要弄清楚它们对正在使用REST和HTTP的开发者会产生多大的影响是很有趣的,亦或它们针对的是不同的开发者团体?更糟的是,一些人相信我们正在冒着“破坏Web网络”的危险?

英文原文:WebSockets versus REST?

 

via http://www.oschina.net/translate/websockets-rest 

 

Linux:Iptables DDOS/CC 自动屏蔽脚本

最近不停地被 CC (DDOS的一种)频繁干扰,分享一个 iptables 屏蔽 DDOS 的脚本。 

让 crond 每分钟运行一次。

############### KILL DDOS ##############
iptables_log="/data/logs/iptables_conf.log"
### Iptables 配置导出的路径,可任意修改 ###
########################################
status=`netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}'|awk -F ":" -- '{print $1}' |sort -n|uniq -c |sort -n|grep -v 127.0.0.1|tail -n 1`
NUM=`echo $status|awk '{print $1}'`
IP=`echo $status|awk '{print $2}'`
result=`echo "$NUM > 200" | bc`
### 如果同时连接数大于 200 则干掉!###
if [[ $result = 1 ]]
then
echo IP:$IP is over $NUM, BAN IT!
/sbin/iptables -A INPUT -s $IP -j DROP
fi
########################################
iptables-save > ${iptables_log}
### 输出当前的 iptable 配置作为日志 ###
########################################

有朋友指出,“ 這個腳本裏應該把tail -n 1和grep -v 127.0.0.1倒一倒,否則有些情況下會完全不起作用的”,所以对原脚本有修改。

via http://www.linuxde.net/2013/05/13538.html

Linux:Linux 上的鼠标 Hack 应用

  鼠标自发明以来就成为了一种极为有用的工具。鼠标和图形界面配合起来使得电脑操作变得非常简单。但是,身为极客的你一定认为鼠标应该还可以为你做更多的事情。如果你更喜欢使用键盘的话,那么其实可以在键盘上使用鼠标的功能,当然这时你并不需要实际去控制鼠标。

https://dn-linuxcn.qbox.me/data/attachment/album/201306/03/202634xta5tv6o5yi7505i.jpg

  由于Linux是一个非常灵活且自定义功能丰富的操作系统,在这里nothing is impossible。本文将为您介绍几个非常酷的hack技巧,能让你的鼠标发挥出更大的功效。

鼠标手势操作

  要让鼠标发挥更多的功效,最好的一种方式就是使用鼠标手势操作。有些应用程序比如Opera浏览器就已经实现了一系列专有的鼠标手势操作,只是这些手势操作只能在浏览器上使用。那么,如果你想在任何地方都能使用鼠标手势,甚至想自定义属于自己的手势操作又该怎么办呢?

https://dn-linuxcn.qbox.me/data/attachment/album/201306/03/202634qdbbicf1hipqxttq.jpg

  Easystroke Gesture Recognition是 一个评分很高的应用,它能让你创建属于自己的鼠标手势操作。在这里,你能创建出无数种类的手势操作,只有想象力才是极限。举个例子,你可以创建一种能在你 最爱的浏览器中打开YouTube视频站的手势——只要通过鼠标光标划出一个“y”就行了。一旦手势定义完成,Easystroke就会监视你的鼠标光 标,一旦触发了你所设定的条件,就会执行定义的操作。

  尽管这个应用程序在触摸屏类的设备上会更有用,但对于鼠标来说仍然非常适合。该应用在你的Linux发行版的软件源中应该能很快找到。

鼠标分辨率

https://dn-linuxcn.qbox.me/data/attachment/album/201306/03/202634zpvf7roqpq48478t.jpg

  如果你所用的Linux发行版使用了xorg配置文件的话,那么你其实是可以提高鼠标光标的速度而不损失任何精度的。因为一般情况下,如果你修改了 系统设定中的鼠标灵敏度和加速度参数的话,会损失部分鼠标精度。对于那些使用Arch Linux的高端用户,这个文件应该保存在/etc/xorg.conf上。

  编辑这个文件,下拉文档直到找到标注有“Input Device”的这一行。在这一栏下你会找到一些标识,比如Driver、Option等。在最后一行Option处回车,然后添加一行Option “Resolution” “1600”。这将增加你的鼠标分辨率到1600dpi(也许没有这么高,取决于你鼠标所支持的最大值)。分辨率越高就越能保持鼠标光标的精度,而与你划 过屏幕的速度无关。

Mouse Keys

https://dn-linuxcn.qbox.me/data/attachment/album/201306/03/202635w933i53e2qe92q9p.jpg

  作为一个键盘重度使用者,你可能会希望能将鼠标所有的功能都转移到键盘上来,这样你的手就再也不用在鼠标和键盘间不断移动了。(译者注:Vim重度使用者笑了…)

  要将鼠标上的某些功能在键盘上激活,请打开系统设置,然后选择Universal Access。从这里选择Pointing and Clicking然后激活Mouse Keys。这将使你能够通过键盘来移动鼠标光标(虽然这么做移动速度会很慢),通过数字键“5”来完成左键点击。

  这些步骤只适用于Ubuntu/Gnome桌面用户,但是在其他发行版和桌面环境中也可以通过类似的步骤实现。

鼠标自动点击和移动

  最后,对于鼠标的重度用户来说,最大的烦恼就是那些重复的动作。如果你知道有某个任务需要你不断重复移动和点击鼠标,那么你就应该考虑通过工具来替你完成这些琐事。

https://dn-linuxcn.qbox.me/data/attachment/album/201306/03/202635yuh9zuwsjjxhyxpa.jpg

  Linux Auto Mouse Click Software应该能工作在任何Linux发行版下。只要下载一个.zip文件然后解压到任意路径就能用了。

  有了这个软件你就能创建自己的宏了(一组指令,程序会按照这组指令来完成相应的工作)。可以用来控制鼠标光标的坐标,点击的类型(不止包含左键和右 键点击,还支持点击时按住某个虚拟的键盘按钮),以及每个指令间的延时。该应用也允许你将宏重复执行任意多次,还可以将其隐藏到任务栏。

总结

  本文介绍的4种秘籍应该能为你的鼠标带来更多的灵活性,无论是让鼠标变的更有用还是将鼠标的功能转移到键盘。在任何情况下,总是会有很多解决方案存在能让你的Linux电脑更容易使用。因此,对于这些能够帮助到你的应用,实在没什么理由不去好好利用。

  如果你对Linux系统感兴趣,又不知道该选择哪一种发行版的话,请查看我们的Linux发行版大全

  对于鼠标或者键盘,你还有什么酷毙了的hack应用?请在评论栏中为大家分享一下吧。

 

原文链接: Danny Stieben 翻译: 极客范 GeekFan.net 陈舸译文链接: http://www.geekfan.net/1415/

Linux:Linux中dd命令详解

一、dd命令

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512;c=1;k=1024;w=2

参数注释:

  1. if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
  2. of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
  3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  4. cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
  5. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
  6. seek=blocks:从输出文件开头跳过blocks个块后再开始复制。注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
  7. count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
  8. conv=conversion:用指定的参数转换文件。
  • ascii:转换ebcdic为ascii
  • ebcdic:转换ascii为ebcdic
  • ibm:转换ascii为alternate ebcdic
  • block:把每一行转换为长度为cbs,不足部分用空格填充
  • unblock:使每一行的长度都为cbs,不足部分用空格填充
  • lcase:把大写字符转换为小写字符
  • ucase:把小写字符转换为大写字符
  • swab:交换输入的每对字节
  • noerror:出错时不停止
  • notrunc:不截短输出文件
  • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

二、dd应用实例

1.将本地的/dev/hdb整盘备份到/dev/hdd

heng@me: dd if=/dev/hdb of=/dev/hdd

2.将/dev/hdb全盘数据备份到指定路径的image文件

heng@me: dd if=/dev/hdb of=/root/image

3.将备份文件恢复到指定盘

heng@me: dd if=/root/image of=/dev/hdb

4.备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径

heng@me: dd if=/dev/hdb | gzip > /root/image.gz

5.将压缩的备份文件恢复到指定盘

heng@me: gzip -dc /root/image.gz | dd of=/dev/hdb

6.备份与恢复MBR

备份磁盘开始的512个字节大小的MBR信息到指定文件:

heng@me: dd if=/dev/hda of=/root/image count=1 bs=512

count=1指仅拷贝一个块;bs=512指块大小为512个字节。

恢复:

heng@me: dd if=/root/image of=/dev/had

将备份的MBR信息写到磁盘开始部分

7.备份软盘

heng@me: dd if=/dev/fd0 of=disk.img count=1 bs=1440k (即块大小为1.44M)

8.拷贝内存内容到硬盘

heng@me: dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)

9.拷贝光盘内容到指定文件夹,并保存为cd.iso文件

heng@me: dd if=/dev/cdrom(hdc) of=/root/cd.iso

10.增加swap分区文件大小

第一步:创建一个大小为256M的文件:

heng@me: dd if=/dev/zero of=/swapfile bs=1024 count=262144

第二步:把这个文件变成swap文件:

heng@me: mkswap /swapfile

第三步:启用这个swap文件:

heng@me: swapon /swapfile

第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:

/swapfile swap swap default 0 0

11.销毁磁盘数据

heng@me: dd if=/dev/urandom of=/dev/hda1

注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。

12.测试硬盘的读写速度

heng@me: dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

heng@me: dd if=/root/1Gb.file bs=64k | dd of=/dev/null

通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。

13.确定硬盘的最佳块大小:

heng@me: dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

heng@me: dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file

heng@me: dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file

heng@me: dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。

14.修复硬盘:

heng@me: dd if=/dev/sda of=/dev/sda 或dd if=/dev/hda of=/dev/hda

当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetic flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数 据起死回生。并且这个过程是安全、高效的。

15.利用netcat远程备份

heng@me: dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234

在源主机上执行此命令备份/dev/hda

heng@me: netcat -l -p 1234 | dd of=/dev/hdc bs=16065b

在目的主机上执行此命令来接收数据并写入/dev/hdc

heng@me: netcat -l -p 1234 | bzip2 > partition.img

heng@me: netcat -l -p 1234 | gzip > partition.img

以上两条指令是目的主机指令的变化分别采用bzip2、gzip对数据进行压缩,并将备份文件保存在当前目录。

16.将一个很大的视频文件中的第i个字节的值改成0x41(也就是大写字母A的ASCII值)

echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc

三、/dev/null和/dev/zero的区别

/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!

/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。

/dev/null——它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。

heng@me:if=/dev/zero of=./test.txt bs=1k count=1
heng@me:ls –l
total 4-rw-r–r– 1 oracle dba 1024 Jul 15 16:56 test.txtheng@me:find / -name access_log 2>/dev/null

3.1使用/dev/null

把/dev/null看作”黑洞”, 它等价于一个只写文件,所有写入它的内容都会永远丢失.,而尝试从它那儿读取内容则什么也读不到。然而, /dev/null对命令行和脚本都非常的有用

禁止标准输出

heng@me:cat $filename >/dev/null #文件内容丢失,而不会输出到标准输出.

禁止标准错误

heng@me:rm $badname 2>/dev/null #这样错误信息[标准错误]就被丢到太平洋去了

禁止标准输出和标准错误的输出

heng@me:cat $filename 2>/dev/null >/dev/null

如果”$filename”不存在,将不会有任何错误信息提示;如果”$filename”存在, 文件的内容不会打印到标准输出。因此,上面的代码根本不会输出任何信息。当只想测试命令的退出码而不想有任何输出时非常有用。

3.2使用/dev/zero

像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到。

/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。

用/dev/zero创建一个交换临时文件

#!/bin/bash
# 创建一个交换文件.
ROOT_UID=0 # Root 用户的 $UID 是 0.
E_WRONG_USER=65 # 不是 root?
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0
# 这个脚本必须用root来运行.
if [ "$UID" -ne "$ROOT_UID" ]
then
echo; echo "You must be root to run this script."; echo
exit $E_WRONG_USER
fi
blocks=${1:-$MINBLOCKS} # 如果命令行没有指定,
#+ 则设置为默认的40块.
# 上面这句等同如:
# --------------------------------------------------
# if [ -n "$1" ]
# then
# blocks=$1
# else
# blocks=$MINBLOCKS
# fi
# --------------------------------------------------
if [ "$blocks" -lt $MINBLOCKS ]
then
blocks=$MINBLOCKS # 最少要有 40 个块长.
fi
echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # 把零写入文件.
mkswap $FILE $blocks # 将此文件建为交换文件(或称交换分区).
swapon $FILE # 激活交换文件.
echo "Swap file created and activated."
exit $SUCCESS

关于 /dev/zero 的另一个应用是为特定的目的而用零去填充一个指定大小的文件, 如挂载一个文件系统到环回设备 (loopback device)或”安全地” 删除一个文件。

例子创建ramdisk

#!/bin/bash
# ramdisk.sh
# "ramdisk"是系统RAM内存的一段,
#+ 它可以被当成是一个文件系统来操作.
# 它的优点是存取速度非常快 (包括读和写).
# 缺点: 易失性, 当计算机重启或关机时会丢失数据.
#+ 会减少系统可用的RAM.
# 10 # 那么ramdisk有什么作用呢?
# 保存一个较大的数据集在ramdisk, 比如一张表或字典,
#+ 这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.
E_NON_ROOT_USER=70 # 必须用root来运行.
ROOTUSER_NAME=root
MOUNTPT=/mnt/ramdisk
SIZE=2000 # 2K 个块 (可以合适的做修改)
BLOCKSIZE=1024 # 每块有1K (1024 byte) 的大小
DEVICE=/dev/ram0 # 第一个 ram 设备
username=`id -nu`
if [ "$username" != "$ROOTUSER_NAME" ]
then
echo "Must be root to run "`basename $0`"."
exit $E_NON_ROOT_USER
fi
if [ ! -d "$MOUNTPT" ] # 测试挂载点是否已经存在了,
then #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了
mkdir $MOUNTPT #+ 因为前面已经建立了.
fi
dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE
# 把RAM设备的内容用零填充.
# 为何需要这么做?
mke2fs $DEVICE # 在RAM设备上创建一个ext2文件系统.
mount $DEVICE $MOUNTPT # 挂载设备.
chmod 777 $MOUNTPT # 使普通用户也可以存取这个ramdisk.
# 但是, 只能由root来缷载它.
echo ""$MOUNTPT" now available for use."
# 现在 ramdisk 即使普通用户也可以用来存取文件了.
# 注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.
# 拷贝所有你想保存文件到一个常规的磁盘目录下.
# 重启之后, 运行这个脚本再次建立起一个 ramdisk.
# 仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.
# 如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,
#+ 以使系统启动时能自动设立一个ramdisk.
# 这样很合适速度要求高的数据库服务器.
exit 0

 

via http://www.linuxde.net/2013/03/12928.html 

 

Linux:syslog:类Unix系统常用的log服务

当前的一个项目需要音视频的技术,而公司刚好没有类似的产品。幸好开源社区如此的强大,稍微谷歌一下,就找到了强大的Kamailio整合Asstersik的解决方案。

接下来的事情非常顺利,安装ubuntu操作系统、下载源码、编译、安装软件,一步步安装官方文档进行中。并且过程中没有提示任何错误,这让我们很兴奋。

最后我们使用imsandroid(一个Android系统的Sip客户端)进行测试,结果却显示连接失败。这个客户端软件严格遵守”不要打印任何让用户挫败的错误”原则,这是非常正确的,但是对开发人员来说,这并不是个好消息。

我们只能从服务器端开始查错,首先查看服务端的kamailio是否正常启动,执行命令 pa –ef | grep kamailio。结果显示我们sip服务没有启动。接下来我们需要的则是更多的关于软件执行的信息,包括启动信息、错误信息、以及任何软件开发人员想告诉我们的信息。

可是,问题来了。

如果你经常在windows下开发,并且没有太多的Linux开发经验,你会试图在软件的安装目录下查找包含log关键字的文字,结果是not found。

查错需要的信息

●系统打印的信息:比如远端链接失败、账密验证失败等信息,或者是软件依赖的底层服务启动失败的信息以及本地服务启动的执行信息。●网络服务的错误信息:远端服务不存在、链接超时、或者需要代理等等信息。●事件记录簿:这里可以很快找到关于服务运行的某个事件信息,失败以及失败原因等等。

谁可以帮助你

linux提供一个syslogd服务可以提供你log文件,帮助你获得以上的信息,syslogd记录的同时还会帮助你分类这些信息。比如在/var/log目录下,你可以找到以上的信息:

/var/log/cron:
 记录系统排程启动的信息。
 /var/log/dmesg:
 记录系统开机时产生的各种信息。
 /var/log/lastlog:
 记录用户登录系统的信息。
 /var/log/maillog 或 /var/log/mail/*:
 记录邮件相关的信息,主要有sendmain与devecot产生的信息,
 前者是SMTP协议的提供者,而后者是POP3协议的提供者。
 /var/log/messages:
 记录系统发生的错误信息,对于差错非常重要。
 /var/log/secure:
 记录软件验证的信息。包含ssh、telnet以及login程序等程序的验证信息,
 基本上,涉及验证的软体都会在这个档案中记录。
 /var/log/wtmp, /var/log/faillog:
 这两个档案记录正确登入系统的账号与错误登入的账号信息。
 /var/log/httpd/*, /var/log/news/*, /var/log/samba/*:
 不同的服务可能使用自己的log档记录产生的各项信息,这需要软件在配置
 档中进行相应的配置。

你可能不知道,你的系统已经在使用syslogd服务了

这是文章的目的之一,syslog是unix like系统记录log的规范,非常多的系统都默认支持它。redhat、ubuntu centos等等。你可以在你系统中执行ps –ef | grep syslogd来确认。

正因为它是如此广泛地被支持,所以很可能你的软件就刚好是使用它来记录log的。

软件是否使用syslog,还是自定义log呢?

为了确认软件使用何种方式记录log,可以查看官方文档提到的该软件的log配置,比如Asterisk的logger.conf配置文件,其中就有一段:

 ;debug => debug
 ;security => security
 console => notice,warning,error
 ;console => notice,warning,error,debug
 messages => notice,warning,error
 ;full => notice,warning,error,debug,verbose,dtmf,fax
 ;syslog keyword : This special keyword logs to syslog facility ;
 ;syslog.local0 => notice,warning,error ;

上面的syslog facility告诉你,软件支持syslog(这里facility意为服务类别)。即使它不说,如果你熟知syslog的facility,也可以猜到它是否支持。syslog有以下级别的服务类别:

服务类别 说明
auth (authpriv) 记录与验证有关的信息
cron 记录系统排程的信息
daemon 记录各个daemon产生的信息
kern 记录核心产生的信息
lpr 记录列印相关的信息
mail 记录邮件的有关的信息
news 记录新闻有关的信息
syslog 记录syslog本省产生的信息
user, uucp, local0 ~ local7 记录各种传统的Unix系统本身有关的信息

 

调用每个服务产生的对应log文件,它是在/etc/syslog.conf中配置的(ubuntu是/etc/rsyslog.d/50-default.conf)中配置的,这里不详细介绍。

还应该注意的是,每个服务还有相应的log级别,这和java 的log4j工具很类似。

 

等级 等级名称 说明
1 info 一般的说明信息,一般提示用户级别的操作信息
2 notice 比info还需要被注意的信息
3 warning(warn) 警示信息,可能出现了问题,但是不影响软件的正常运行
4 err(error) 一些重大的错误,可能导致软件不能正常使用
5 crit 严重的信息
6 alert 比crit更为严重的信息
7 emerg(panic) 最严重的警告,意指系统可能当机。通常只有硬件出现错误,导致核心无法正常工作才会出现。

教你看懂syslog文件

每条信息均会记录以下的重要信息:

●事件发生的日期和时间。

●启动事件的主机名称。

●启动事件的服务名称(比如httpd、samba等)或函数名称(oam_unix)。

●信息的实际内容

如果你想要更多的信息,或者比较少的、特别关注的信息,你可修改syslog的配置档来实现,这个在以后的章节会介绍。例子为系统/var/log/secure的截取:

[root@www ~]# cat /var/log/secure
 1 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session opened for user root by (uid=0)
 2 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session closed for user root
 3 Mar 16 16:01:51 www su: pam_unix(su-l:auth): authentication failure; logn ame=vbird uid=500 euid=0 tty=pts/1 ruser=vbird rhost= user=root
 4 Mar 16 16:01:55 www su: pam_unix(su-l:session): session opened for user root by vbird(uid=500)
 5 Mar 16 16:02:22 www su: pam_unix(su-l:session): session closed for user root
 |--日期/时间------|-H-|--------服务或函数---------|--訊息說明------>

结论

syslog的应用是如此的广泛,许多的软件采用它来记录log,所以我们很有必要理解并掌握它。不仅要认识syslog提供的服务,以及如何去发现、甚至配置服务对应的log文档路径,还要知道如何在软件中定义服务的log级别。

via http://blog.jobbole.com/29633/