将OVA格式的虚拟机导入KVM

首先,用file命令查看OVA文件,即可看到OVA文件实际就是tar文件:

$file Hortonworks+Sandbox+2.0+VirtualBox.ova 
Hortonworks+Sandbox+2.0+VirtualBox.ova: POSIX tar archive (GNU)

使用tar命令可以看到,其中包含了两个文件:

$tar tf Hortonworks+Sandbox+2.0+VirtualBox.ova 
Hortonworks Sandbox 2.0 VirtualBox.ovf
Hortonworks Sandbox 2.0 VirtualBox-disk1.vmdk

用tar解压:

$tar xvf Hortonworks+Sandbox+2.0+VirtualBox.ova 
Hortonworks Sandbox 2.0 VirtualBox.ovf
Hortonworks Sandbox 2.0 VirtualBox-disk1.vmdk

ovf文件保存的是配置信息,没法直接导入;但是一般能导入vmdk格式的镜像就可以了。

把vmdk格式的镜像转化为qcow2格式的:

$qemu-img convert -O qcow2 'Hortonworks Sandbox 2.0 VirtualBox-disk1.vmdk' 'Hortonworks Sandbox 2.0 VirtualBox-disk1.qcow2'

转换完成后,用 Hortonworks Sandbox 2.0 VirtualBox-disk1.qcow2文件创建虚拟机即可。

[转载]提升WordPress站点速度的八个建议

转自http://developer.51cto.com/art/201309/409825.htm

WordPress是一个很棒的开源程序,几乎我认识的站长朋友当中,粗略估算有80%使用Wordpress。但很棒不等于完美,就在我所认识的这些朋友中,几乎所有人都会抱怨Wordpress太臃肿,运行效率太低了,大家有无同感?

所以,今天这篇博文和大家分享8个小贴士来提升WP的运行效率,如果您运用了这些方法后发现确实有帮助,请把这篇博文分享给更多的人好吧?当然为了尊重劳动成果,也烦请指明出处。

  • 使用高效的缓存插件

WordPress的插件们是非常有用的, 我推荐一款缓存插件可以改善页面载入时间,它就是W3 Total Cache,有了这个插件之后咱就不再推荐你其他缓存插件了,因为所有缓存插件有的功能它都有了,而且安装和使用非常方便。

拥有这款插件之后,你的页面载入速度会加快,因为网站的主要元素已经被缓存了。

  • 使用内容分发网络 (CDN)

基本上所有你喜欢的大网站都会使用CDN。简单来说,CDN是把你站点上的文件们(CSS\JS\图片等)发布到最接近用户所在的网络区域,让用户就近下载,这样就能提高站点运行速度。在国内ChinaCache是比较有名的CDN供应商,不过价格贵了一些,像各大门户网站,比如腾讯、新浪、网易等等都是用ChinaCache。所以不管你在哪里,访问这些门户网站都会觉得速度很快。当然啦,对于小站来说,这个成本可能会高一些。

所以,你无论是在南方,或者北方,还是在北美,访问这些门户网站,感觉速度都很快,最主要的原因之一就是CDN发挥了效果。一般小网站是用不起这服 务的,所以慢点就慢点了吧,可以租用互联互通的6线机房(6线机房是指包括网通、电信、铁通、移动、联通、教育网等多线接入的骨干网IDC机房,彻底消除 各地网络瓶颈,保证互联网访问畅通无阻的高速机房。)

顺便提一下,还有一个Wordpress插件叫Free-CDN,号称也能达到类似的效果,虽然我还没有做过测试…

  • 图片优化很重要

Yahoo! 有一个图片优化软件叫Smush.it可以最大程度无损压缩图片,不过,除非你超级有耐心,否则一张张压缩图片的话太浪费时间了,好在,还有一个很给力的WP插件叫WP-SmushIt,这货可以为你网站上所有的图片做一次性压缩,所以没有理由不去用它。

  • 优化你的WP数据库

你可以用WP-Optimize这个插件来优化你的WP数据库(清理spam,反复改版的文章,草稿,表格等等为你的服务器腾出更多空间从而提升效率);还有一些插件如WP-Cleaner,DB-Manger等。

  • 开启防盗链机制

盗链是带宽的窃贼,当其他网站直接引用你站点的图片的时候,这会影响占用你本身的服务器资源从而影响网站运行效率,你的站点越出名,就会有越多的人盗用你的图片,解决方法是Wordpress有现成的插件Hotlink Protection。当然也可以通过重写htaccess文件来达到同样的效果,欲深入了解的童鞋可以询问自己的空间商如何设置。

  • 为文件添加过期时间

关于这个文件过期时间,听起来很玄乎,其实就是通过header报文来指定特定类型的文件在浏览器中的缓存时间。有些文件(例如样式表中调用的背景 图片和一些装饰性图片)其实在很长一段时间内这些图片都不会有很大的变化,所以对这类文件我们不妨设置长一些的缓存时间,这样浏览器就不需要每次从服务器 下载这些文件而直接从缓存中读取,这样绝对可以提升加载速度。

当然,所以做法很简单,只需要在网站的.htaccess文件中加入以下代码:

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault A600
  ExpiresByType image/x-icon A2592000
  ExpiresByType application/x-javascript A604800
  ExpiresByType text/css A604800
  ExpiresByType image/gif A2592000
  ExpiresByType image/png A2592000
  ExpiresByType image/jpeg A2592000
  ExpiresByType text/plain A86400
  ExpiresByType application/x-shockwave-flash A2592000
  ExpiresByType video/x-flv A2592000
  ExpiresByType application/pdf A2592000
  ExpiresByType text/html A600
</IfModule>

稍微解释一下,text/css表示样式表文件,text/plain代表的纯文本类文件,依次类推。其中A2592000就表示这种类型文件在浏览器中的缓存时间,以秒为单位。一天86400秒,2592000就表示这类文件可以缓存30天。

如果你不是经常修改模板,那样式表文件和javasctipt文件基本上也可以设置缓存一周到一个月左右。text/html文件不要设置太长的缓存时间,因为这些东西修改的频率很高,一天更新一次是有必要的。

  • 为你的图片添加延时加载

延时加载就是当用户停留在第一屏的时候,不加载任何第一屏以下的图片信息,只有当用户把鼠标往下滚动的时候,这些图片才开始加载。这玩意儿不仅可以提升站点载入速度,更是可以节省带宽。要轻松的拥有这项功能,请安装WP的jQuery Image Lazy Load 插件吧。

  • 控制文章草稿存数数

通常一篇博文我会保存10次以上的草稿,而Wordpress会无限制的存储每个草稿;如果我的博文已经发布了,为啥我还需要这些储存的草稿文章呢?所以这就是为啥我会用 Revision Control 插件来确保这些草稿内容的最小化。通常我会设置只存储2-3篇草稿来防止万一,但存储的数量绝对不会太高,否则你的WordPress backend只会被这些无意义的内容塞满从而降低运行效率。

好了,今天的分享就到这里,希望对大家有帮助,其实这些要点不仅仅对Wordpress有帮助,对其他开源网站也同样奏效。:-)

原文链接:http://seotime.org/blog/8-easy-ways-to-speed-up-wordpress/

C/C++语言对宽字符集的处理

我们接触C语言中的字符是从char开始的,但是众所周知,char类型是不支持中文的,于是那些先贤们把字符扩展为宽字符来表示一些非ANSI字符。

但是没有C语言标准支持的话,各个厂商又要开始各自为政,C语言的代码跨平台优势也就没有了,所以C99添加了对宽字符的支持。

C语言对宽字符的支持

wchar_t

对应与常见的char,宽字符版的char是wchar_t,wchar_t不是内置类型,而是定义在wchar.h文件中的。

有了wchar_t,我们可以在程序中存储宽字符了。

另外,wchar.h中定义了一个极为有用的宏L,它用来存储wchar_t常量。举例如下:

L”鲁”,L’鲁’ 分别表示的是字符串鲁和宽字符鲁。至于”鲁”,则在不同的平台下有不同的程序内表示方法,不跨平台。

wscanf, wprintf

能存储宽字符后,我们还得输入输出宽字符,所以wscanf, wprintf, wgets 等等函数都出现了,他们都是对应函数的宽字符版。

wscanf和wprintf的第一个参数是指向wchar_t的指针,为格式化字符串。

为了能同时输入ANSI字符和宽字符,%s和%c依旧用来输入ANSI字符,而%ls和%lc则用来输入宽字符。

举例如下:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
	wchar_t wstr[11];

	setlocale(LC_CTYPE, "");

	if (wscanf(L"%10ls", wstr))
		wprintf(L"%ls\n", wstr);
	return 0;
}

注:必须用setlocale函数来设置输出字符集,负责可能输出乱码。

其他

wchar.h定义了WCHAR_MIN, WCHAR_MAX来表示wchar_t的最小最大值,定义了WEOF来表示eof。

wctype.h定义了iswdigit, iswupper等函数,但是它们仍然只对英文表示法有效;最典型的例子是iswdigit(L’一’)返回假。

C++中的宽字符

注意:C++中也要使用setlocale(LC_CTYPE, “”);来设置宽字符输出的字符集。

wstring

在string中定义了wstring类来表示宽字符串,比如:

wstring wstr=L"请输入您的姓:";

wcin, wcout, wcerr

为了输入输出宽字符,仍然需要定义cin, cout的宽字符版,于是wcin, wcout应运而生。

最后来个例子:

#include <iostream>
#include <string>
#include <wchar.h>
#include <locale.h>

using namespace std;

int main() {
	setlocale(LC_CTYPE, "");

	wstring wstr = L"请输入您的姓:";
	wcout << wstr << endl;
	wcin >> wstr;
	wcout << wstr << L"先生,您好!" << endl;
	return 0;
}

运行结果:

1

给Eclipse添加pkg-config支持

原来用gedit+gcc来编写GTK程序(主要是学习例程),后来随着代码越写越多,需要一个IDE来辅助开发,于是想到了万能的Eclipse。

可是Eclipse可以支持C语言开发,却不支持pkg-config命令集成。搞得每次新建GTK工程都要把pkgconfig的输出改到Eclipse中。

后来烦了,自己google之,得解:http://marketplace.eclipse.org/content/pkg-config-support-eclipse-cdt

安装Eclipse

首先,安装jre和jdk等依赖。

接下来下载Eclipse。我原来下载了Eclipse 4.3 Classic ,但是最新版成了Eclipse 4.3 Standard ,都是可以的。

然后解压Eclipse。(双击eclipse文件即可运行Eclipse)

另外,Eclipse CDT和gtk开发的其他依赖包也要安装。

安装Eclipse Marketpalce Client(MPC)

我下载的是Eclipse 4.3 Classic,所以需要安装MPC;如果你下载的是Eclipse 4.3 Standard,可以跳过此步。

在Install New Software窗口中选上所有网站,然后搜索market即可看到MPC;点击下一步,然后同意许可协议等。

安装完成后重启Eclipse即可完成MPC的安装。

在market中安装Pkg-config support

在帮助菜单中打开Eclipse Marketpalce:

1

搜索pkg-config,如图:

2

点击安装,一直确认、同意许可协议。

Pkg-config support的使用

首先,创建一个Hello World C工程,贴入GTK程序代码(代码附后),此时Eclipse提示程序中有好几处错误/警告:

3

接下来,打开项目的设置菜单 -> C/C++ Build -> Settings -> Pkg-config 选项卡:

4

在其中的选项中勾选 GTK+-2.0 (我个人使用的是GTK 2.0,可根据自己的情况酌情选择):

5

然后点击确定。

稍等几秒后就会发现Eclipse识别出来了头文件包含、GTK类型定义等,如图:

6

点击运行(Run),可以看到GTK程序在Eclipse中正常运行:

7

GTK测试代码

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

static gboolean delete_event(GtkWidget * widget, GdkEvent * event,
		gpointer data) {
	gtk_main_quit();
	return FALSE;
}

int main(int argc, char *argv[]) {
	GtkWidget *window;
	GtkWidget *label;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_title(GTK_WINDOW(window), "RobberPhex");
	gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);

	g_signal_connect(window, "delete-event", G_CALLBACK(delete_event), NULL);
	gtk_container_set_border_width(GTK_CONTAINER(window), 10);

	label = gtk_label_new("Hello GTK!");
	gtk_container_add(GTK_CONTAINER(window), label);
	gtk_widget_show(label);

	gtk_widget_show(window);

	gtk_main();

	return 0;
}

unzip的中文问题

唉,unzip的-O选项一直是一个传说中的存在,而且unzip的开发者一直没有意向修复。

故自己动手,丰衣足食,用python写了一个MultiCharset ZIP,代码附上:

#!/usr/bin/python
# -*- coding: utf-8 -*- 

import os
import sys
import zipfile
from optparse import OptionParser

def listZip(zipf):
    print "Archive:  %s" %zipf
    print "  Length      Date    Time    Name"
    print "---------  ---------- -----   ----"
    filist=zipfile.ZipFile(zipf).infolist()
    totalnum=0
    totalsize=0
    for finfo in filist:
        totalnum+=1
        totalsize+=finfo.file_size
        print "%9d " %finfo.file_size ,
        print "%04d-%02d-%02d" %(finfo.date_time[0],finfo.date_time[1],finfo.date_time[2]),
        print "%02d:%02d  " %(finfo.date_time[3],finfo.date_time[4]),
        print finfo.filename.decode('gb18030').encode('utf-8')
    print "---------                     -------"
    print "%9d" %totalsize ,
    print "                   ",
    print "%d files" %totalnum

def exZip(zipf,exdir):
    zf=zipfile.ZipFile(zipf)
    nlist=zf.namelist()
    nlist.sort(key=lambda x:len(x))
    for fn in nlist:
        fnew=unicode(fn,'gb2312').encode('utf8')
        if fnew.endswith('/'):
            os.mkdir(exdir+fnew)
        else:
            file(exdir+fnew,'wb').write(zf.read(fn))
        print fnew
    zf.close()

def main():
    usage = "usage: "+sys.argv[0]+" [options] zipfile1 zipfile2"
    parser = OptionParser(usage=usage)
    parser.add_option("-l","--list",action="store_true",help="list files in zip file",dest="islist",default=True)
    parser.add_option("-x","--extract",action="store_true",help="extract zip files",dest="isex",default=False)
    parser.add_option("-d","--exdir",action="store",help="define extract directory",dest="exdir",default=".")
    #parser.add_option("-z","--exdir",action="store",dest="exidr")

    (options,args)=parser.parse_args();

    if(options.isex):
        for zf in args:
            exZip(zf,options.exdir+"/")
    else:
        if(options.islist):
            for zf in args:
                listZip(zf)

if __name__ == "__main__":
    main()

可以在~/bin/目录下创建一个mczip文件,写入代码,添加可执行权限,

即可在终端中用mczip来列出zip文件内容、解压zip文件。

用法

Usage:mczip.py [options] zipfile1 zipfile2

Options:
-h, --help            show this help message and exit
-l, --list            list files in zip file
-x, --extract         extract zip files
-d EXDIR, --exdir=EXDIR     define extract directory

只有列出zip包的文件内容和解压zip文件两个功能,只能处理gb18030编码。

Python3的zip模块判断更加奇葩了,只要文件名不是ascii编码,就认为是utf8编码,而且不保留bytes格式的文件名,有点难办啊。

gcc的使用和编译时的符号确定

一般来说,我们编译c语言程序要经过编译(预处理)、和链接两步。当然教材上讲的时候还有预处理。

预处理

gcc -E code.c -o code.e.c

预处理主要处理文件包含和宏定义等等。

编译

gcc -c code.c -o code.o

编译主要把c语句翻译成二进制代码(一般此步骤包括了预处理)。

但是有一些函数的实现没有在预处理过的c语言文件中,类似的还有extern声明的变量,所以现在编译的文件还没有办法执行。这些无法决定位置的函数和变量,在.o文件中统称为未定义的符号。

链接

gcc code.o -o code

在这一步我们要把所有.o文件中的未定义符号给确定下来,确定的来源有两种,查看其他.o文件的导出表中查找,从其他.so(dll)文件的导出表中查找。

gcc还有一个重要的参数是-g,表示编译的时候保留调试信息(包括c语句和汇编语句的对应关系,变量的分配)

gcc的-o参数指定输出文件的名字。

让我们通过一个例子来了解这个流程

test.c文件:

#include <stdio.h>

extern int a;

extern void test();

int main()
{
	test();
	return 0;
}

先预处理它:

gcc -E test.c -o test.e.c

可以看到源文件多了许多头文件中的代码。

编译它:

gcc -c test.c -o test.o

我们用nm命令来获取其中有哪些符号:

nm test.o

输出(第一列是符号地址,第二列是状态,第三列是符号名):

                 U a
0000000000000000 B b
0000000000000000 T main
                 U test

可以看到,a和test的状态是未定义(U),因为gcc目前无法确定这两个符号的地址。

T表示main函数位于代码区,B表示b位于非初始化数据段(bss)中。

此时直接链接会出现若干undefined reference 。

我们再写一个c文件:

test2.c

int a;
void test()
{
}

编译,用nm查看相应.o文件

0000000000000004 C a
0000000000000000 T test

此时链接就没有错误:gcc test.o test2.o -o test

但是我们可以看到nm test的结果中仍然有未定义的符号:

nm test

输出如下:

..............
                 U [email protected]@GLIBC_2.2.5
..............

这涉及到动态链接库技术,程序在执行的时候才能决定符号地址(一般来说,这个符号地址在某个so/dll文件中)。

现在我们来查看程序使用了哪些动态链接库(so/dll文件):

执行

ldd test

结果如下

	linux-vdso.so.1 =>  (0x00007fff629fe000)
	libc.so.6 => /lib64/libc.so.6 (0x00000038f9200000)
	/lib64/ld-linux-x86-64.so.2 (0x00000038f8e00000)

可以看到,我们的程序用到了三个动态链接库。

最后一个动态链接库严格说来并不是动态链接库,是动态库的装载器。

libc.so属于glibc(一个linux下c语言的运行时库),Windows下对应的文件是msvcrt.dll。

fedora 18 安装配置

安装fastestmirror:

个人不推荐更改repo文件,因为有单点依赖

yum install yum-plugin-fastestmirror

安装rpmfusion源:

RPM Fusion is a merger of Dribble, Freshrpms, and Livna.

yum localinstall --nogpgcheck http://mirrors.163.com/rpmfusion/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://mirrors.163.com/rpmfusion/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm

字体:

yum install wqy-bitmap-fonts wqy-zenhei-fonts wqy-unibit-fonts wqy-microhei-fonts
yum install cjkuni-uming-fonts cjkuni-ukai-fonts

gedit乱码:

gsettings set org.gnome.gedit.preferences.encodings auto-detected "['GB18030', 'BIG5', 'UTF-8', 'CURRENT', 'UTF-16']"
gsettings set org.gnome.gedit.preferences.encodings shown-in-menu "['GB18030', 'BIG5', 'ISO-8859-15']"

#复原
#gsettings set org.gnome.gedit.preferences.encodings auto-detected “[‘UTF-8’, ‘CURRENT’, ‘ISO-8859-15’, ‘UTF-16’]”
#gsettings set org.gnome.gedit.preferences.encodings shown-in-menu “[‘GB18030’, ‘ISO-8859-15’]”

输入法:

当然,得另外配置一下才可以哦

yum install fcitx-gtk3 fcitx-libpinyin fcitx-cloudpinyin fcitx-configtool

办公软件:

Libre office 是一个非常优秀的办公软件。

yum install libreoffice-base libreoffice-calc libreoffice-math libreoffice-writer libreoffice-ogltrans libreoffice-wiki-publisher libreoffice-draw

Adobe Flash Plugin:

可以自动更新。

yum localinstall --nogpgcheck http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpm
yum install flash-plugin

多媒体/解码器:

yum install ffmpeg ffmpeg-libs gstreamer-ffmpeg xvidcore libdvdread libdvdnav lsdvd gstreamer-plugins-good gstreamer-plugins-bad gstreamer-plugins-ugly

FileZilla:

非常优秀的开源ftp客户端

yum install filezilla

图形相关:

yum install gimp blender

远程桌面:

yum install rdesktop spice-client
sudo yum install remmina remmina-plugins-rdp remmina-plugins-gnome remmina-plugins-vnc

系统工具:

yum install system-storage-manager systemd-ui gparted

小工具/插件:

包括字体查看器、nautilus插件、gonme插件、gedit插件。

yum install gnome-font-viewer nautilus-open-terminal gnome-shell-extension-alternative-status-menu gnome-exe-thumbnailer
yum install gedit-plugins gedit-beesu-plugin gnome-nettool

常用工具:

yum install wget patch unrar axel

开发工具:

yum install git-svn git
yum install gcc gcc-c++ gdb autoconf automake java-1.7.0-openjdk java-1.7.0-openjdk-devel indent

web/ftp 服务器:

yum install httpd mysql mysql-server php php-mysql
yum install proftpd

虚拟化:

yum group install virtualization

用reveal.js+markdown制作树型结构的slides

reveal.js 可以让你制作出基于网页的slides,轻量级,跨平台,非私有格式。

说来惭愧,我做的大多slides都是想表达这样的结构:

image1

于是,就做出了这样的slides:

image2

我们姑且称这样的slides为“树型结构slides”。我们要用 reveal.js来制作这样的 slides 。

fork项目:

git clone git://github.com/hakimel/reveal.js.git

然后修改index.html文件,把class为slides的div元素换为如下div元素(覆盖掉原来的div元素及其子孙元素)

<div class="slides">
  <section data-markdown data-separator="^\n\n\n" data-vertical="^\n\n">
    <script type="text/template">
      <!-- [markdown 内容] -->
    </script>
  </section>
</div>

data-separator=”^\n\n\n”表示用三个连续的换行作为横向分隔符(即顶层slide之间的分隔),data-vertical=”^\n\n”表示用两个个连续的换行作为纵向分隔符(即第二层slide之间的分隔)。

举例如下:

<div class="slides">
  <section data-markdown data-separator="= = =" data-vertical="- - -">
    <script type="text/template">
      #start slide
      = = =
      #slide 1
      - - -
      #slide 1.1
      - - -
      #slide 1.2
      = = =
      #slide 2
      - - -
      #slide 2.1
      - - -
      #slide 2.2
      = = =
      #end slide
    </script>
  </section>
</div>

使用方法:首先展示开始页,按右或者回车显示下一页,按左显示上一页,按上下显示相应页面子页面。Esc显示概览。

如图:

image3

不足:

需要slides作者有html/css基础。

加载时需要下载网页字体(这个可以先用离线模式解决,日后联系开发者解决)

只适用于“扁平”状的slides,如果层数太多,展示效果不好。

建立xdebug+eclipse的调试环境

几周了,终于让 eclipse 能够调试php代码了,期间找了许多资料,但是总不能如愿,于是记录如下。

安装xdebug

fedora 下直接安装 php-pecl-xdebug 包就算是配置好了 php 的 xdebug 扩展。

记得systemctl reload httpd.service

访问 phpinfo 页面时应该有 xdebug 的相关信息:

Screenshot from 2013-04-03 16:01:51

然后打开 display_errors ,即 php.ini 里面有 display_errors= On ,那么打开一个有异常的页面会出现彩色提示。Screenshot from 2013-04-03 15:51:52

配置远程调试

这时可以配置远程调试。在 /etc/php.d/xdebug.ini 中写入如下几行:

[Xdebug]
xdebug.remote_autostart=On
xdebug.remote_enable=On
xdebug.remote_host=127.0.0.1
xdebug.remote_handler=dbgp

然后systemctl reload httpd.service ,在 phpinfo 页面确认上述参数已经生效。

然后用 debugclient 来测试xdebug是否正常工作。

运行 debugclient ,显示等待连接:

Screenshot from 2013-04-03 16:10:25

然后访问一个会产生异常的页面,debugclient 会得到连接:

Screenshot from 2013-04-03 17:06:43

配置eclipse

eclipse安装好相关的插件(PDT),创建项目,把项目目录配置为虚拟主机,然后设置项目的调试器。

有待完善啊。。