适用于cloudstack二次开发的源码结果分析,及开发流程说明
from wordpress to hexo
自己搭建独立博客,最简单的总结就是两个字,折腾。
我从2012年开始了博客折腾之路,貌似漫长,其实中间因为两个字,懒惰,导致写博客的状态是断断续续,并且质量不高。博客折腾的历程,从所使用的程序来看,是由wordpress开始,转typecho,再转回wordpress,转hexo。wordpress自然不必说,强大,之所以转typecho是主要是因为好奇、而且typecho非常轻量,整个程序才几兆,后来typecho官方不更新了,久而久之自己也懒了,又开始感觉wordpress才是王道,转回wordpress一直用到去年底,某天突然发现博客访问不了了,但wp-admin.php后台能进,猜想是模板什么地方出问题了吧,还是因为懒,没去细究,就这样一直放着,放了好几个月了,最近突然想起来不能再这样荒废下去了,我要重新勤奋起来!
之前就接触过基于node.js的静态博客hexo,这次我决定不再用那几百块一年的虚拟主机了,尽管还有大半年才到期。周末花时间一阵折腾,于是我正式把博客转到了hexo!!!这里简单记录一下hexo的折腾过程。
1.安装篇
安装Git
下载 msysgit 并执行即可完成安装。
安装Node.js
在 Windows 环境下安装 Node.js 非常简单,仅须下载安装文件并执行即可完成安装。
安装hexo
利用 npm 命令即可安装。(在任意位置点击鼠标右键,选择Git bash)
npm install -g hexo
额外参考:::
1.安装brewhome,一句话搞定
ruby -e “$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)”
2.0 安装nodejs
2.1 第一种方式,brewhome安装,一句话搞定
brew install node
2.2 第二种方式,前提是已经安装好Xcode和git,安装git方法在下面介绍
git clone git://github.com/joyent/node.gitcd node
./configure
make
sudo make install
2.3 第三种方式,下载源码( http://nodejs.org/download/ ),编译执行同上
2.本地运行
创建hexo文件夹
安装完成后,在你喜爱的文件夹下(如H:\hexo),执行以下指令(在H:\hexo内点击鼠标右键,选择Git bash),Hexo 即会自动在目标文件夹建立网站所需要的所有文件。
hexo init
安装依赖包
npm install
本地查看
现在我们已经搭建起本地的hexo博客了,执行以下命令(在H:\hexo),然后到浏览器输入localhost:4000看看。
hexo generate
hexo server
3.部署
编辑_config.yml(在H:\hexo下)。你在部署时,要把下面的zippera都换成你的账号名。
deploy:
type: github
repository: https://github.com/senbiao/senbiao.github.io.git
branch: master
据说最新版本的hexo 中,这里的 type 要写成 git,而不是 github。
执行下列指令即可完成部署。
hexo generate
hexo deploy
注意:有些新用户需要设置 ssh,否则上述命令会失败。ssh 的介绍和设置方法请看官方教程,不用担心,很简单。
记住:每次修改本地文件后,需要hexo generate才能保存。每次使用命令时,都要在H:\hexo目录下。
4.技巧
遇到什么其他的问题,不妨删除.deploy 和db.json 再重新生成试一试。
tips
hexo现在支持更加简单的命令格式了,比如:
hexo g == hexo generate
hexo d == hexo deploy
hexo s == hexo server
hexo n == hexo new
其他Tips
有的时候当你修改页面或更改配置后发现并没有立即生效,可以执行hexo clean然后再启动hexo server。
默认的评论组件可能并不太适合中国大陆用户(你懂的。。),你可以选择性的换成别的组件,或主题,比如我用的多说评论以及Pacman主题。
参与开源项目很简单,你只需要学会使用Git以及Github,遇到bug或任何程序问题可以递交issue,当然如果你有能力自己解决问题或可以为Hexo开发新的功能,那么请pull request。
hexo可能更新过了,所以老的hexo可能会报错:
{ [Error: Cannot find module ‘./build/Release/DTraceProviderBindings’] code: ‘MODULE_NOT_FOUND’ }
{ [Error: Cannot find module ‘./build/default/DTraceProviderBindings’] code: ‘MODULE_NOT_FOUND’ }
{ [Error: Cannot find module ‘./build/Debug/DTraceProviderBindings’] code: ‘MODULE_NOT_FOUND’ }
解决办法:
先执行: npm uninstall hexo
再执行: npm install hexo –no-optional
从Wordpress转移过来的,写了一段时间之后,文章全部在那里面,如果一篇篇的复制粘贴那工作量就太大了。好在Hexo提供了Wordpress插件,可以一次性把wordpress数据导入到Hexo博客,html文件都转换成了Markdown文件,非常的方便,有图片的更改一下图片的路径就好了。
首先导出wordpress数据,得到的回事一个xml格式的文件,先把这个复制到Hexo文件夹下,假设文件是wordpress.xml。
安装好wordpress插件,再使用迁移命令就可以实现从Wordpress到Hexo的转移。
npm install hexo-migrator-wordpress –save
hexo migrate wordpress wordpress.xml
额,不知道是不是有人跟我一样有一个库没有README.md文件就浑身不舒服的强迫症= =
正如大家所知道的,在source文件夹下的所有md文件都会被hexo渲染成html文件,导致README.md文件不能好好的放在里面了,即使是添加了layout: false依然没有用。
不过现在有一个另外的好办法,那就是利用主题的source目录,也就是themes/themes-name/source。因为这个文件夹里面的所有文件都会被复制到网站的根目录中去,也就是说,如果在里面放上README,就可以正常的存在于网站的主目录了。
同样的,对于一些需要在网站下添加html文件的需求也可以这样来达成。比如百度或者谷歌在验证站长权限的时候,通常都会要求在主目录下添加一个html文件。同样的,只要把这个文件放在themes/themes-name/source就可以搞定了。
5.问题解决
(1)
git push -u origin master
(gnome-ssh-askpass:20853): Gtk-WARNING **: cannot open display:
unset SSH_ASKPASS
(2)git rm 误删文件找回方法
git rm a.txt ,误将a.txt删除后找回方法:
- git log 找到离没删文件前最近的commit id
- 将操作过的其它文件转移
- git reset –hard “commit id”
(3)git操作
#添加当前修改的文件到暂存区
git add .
#如果你自动追踪文件,包括你已经手动删除的,状态为Deleted的文件
git add -u
#提交你的修改
git commit –m “你的注释”
#推送你的更新到远程服务器,语法为 git push [远程名] [本地分支]:[远程分支]
git push origin master
#查看文件状态
git status
(4)
[git@AYZ github01]$ git push -u origin master
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/iopqrst/learn20140823.git/info/refs
在要推送项目的文件目录下:
vi .git/config
将
[remote “origin”]
url = https://github.com/iopqrst/learn20140823.git
修改为:
[remote “origin”]
url = https://iopqrst@github.com/iopqrst/learn20140823.git
(5)
git remote rm origin
git remote add origin git@github.com:Liutos/foobar.git
方法二:直接修改.git/config
注意事项
所有键的冒号后面留一个空格,如language: zh-CN
url不能为空,否则报错
type: github报错hexo ERROR Deployer not found: github的解决方法:
先运行 npm install hexo-deployer-git –save
再改为 type: git
1.导入『Wordpress数据』
开篇我说过我写博客的基本经历,是从Wordpress转移过来的,写了一段时间之后,文章全部在那里面,如果一篇篇的复制粘贴那工作量就太大了。好在Hexo提供了Wordpress插件,可以一次性把wordpress数据导入到Hexo博客,html文件都转换成了Markdown文件,非常的方便,有图片的更改一下图片的路径就好了。
首先导出wordpress数据,得到的回事一个xml格式的文件,先把这个复制到Hexo文件夹下,假设文件是wordpress.xml。
安装好wordpress插件,再使用迁移命令就可以实现从Wordpress到Hexo的转移。
npm install hexo-migrator-wordpress –savehexo migrate wordpress wordpress.xml
文/起今知行(简书作者)
原文链接:http://www.jianshu.com/p/739bf1305e66
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
hexo d,执行该命令,报错:
1
ERROR Deployer not found: git
执行命令:
npm install hexo-deployer-git –save,再次执行hexo d
升级至Hexo 3.0版本后,deploy报错
cloudstack二次开发——编译单个模块来升级系统
cloudstack二次开发中,当修改了代码时,需要重新编译,此时编译整个cloudstack尤为不便:
$ mvn clean
$ mvn install -Dnoredist
因此,考虑针对单个模块进行编译并替换到已安装的相关节点中,以cloudstack中的kvm模块为例:
首先,编译cloudstack中的kvm工程:
$ mvn clean
$ mvn -pl:cloud-plugin-hypervisor-kvm
然后,把plugins/hypervisors/kvm/target/下的cloud-plugin-hypervisor-kvm-4.2.1.jar 替换到安装KVM的agent节点中:/usr/share/cloudstack-agent/lib/cloud-plugin-hypervisor-kvm-4.2.1.jar,最后,重启一下agent节点。
至此,便已成功把kvm模块中修改过的部分更新到已部署好的cloudstack中了。
cannot open file /etc/cloudstack/management/tomcat6.conf
修改tomcat,由于tomcat为了区分ssl和没有ssl,所以配置分为tomcat6-nonssl.conf和tomcat6-ssl.conf,需要把tomcat6
-nonssl.conf更改tomcat6.conf,否则启动会报没有tomcat6.conf文件错误
[root@manage5156 run]#cp /usr/share/cloudstack-management/conf/server-nonssl.xml /usr/share/cloudstack-management/conf/server.xml
[root@manage5156 run]#cp /etc/cloudstack/management/tomcat6-nonssl.conf
/etc/cloudstack/management/tomcat6.conf
NFS umount 提示 device is busy
[root@node11 SecStorage]# umount /mnt/SecStorage/
umount.nfs: /mnt/SecStorage: device is busy
umount.nfs: /mnt/SecStorage: device is busy
解决方法:
增加一个-l参数:umount -l /mnt/SecStorage
或者:
fuser -m -v /mnt/SecStorage
进程占用了,将其kill掉,再重新umount
kill -xxxx
umount /mnt/SecStorage
java笔记——IO操作小结
1.FileWriter与BufferedWriter的区别
- FileWriter fw = new FileWriter(file);
- BufferedWriter bw = new BufferedWriter (fw);
- fw.write(“你好”);
- fw.close();
- fw.close();
这里有一个 “修饰类 “的概念
FileWriter 是被修饰者
BufferedWriter 是修饰者
一般用法为
BufferedWriter bw = new BufferedWriter(new FileWriter( “filename “));
上面这个加了一个缓冲,缓冲写满后在将数据写入硬盘
这样做极大的提高了性能
如果单独使用 FileWriter 也可以,你每写一个数据,硬盘就有一个写动作,性能极差
相同点:都是使用字符流写文件。
不同点:前者采用缓冲区,可以预读一些准备写入的数据,增加写入文件时的效率,
而后者则没有这个功能。具体的在BufferedWriter的API DOC中有说明。
2.写入txt文件出现乱码
windows自身采用的编码格式是gbk(而gbk和gb2312基本上是一样的编码方式),而IDE中Encode不修改的话,默认是utf-8的编码,这就是为什么会出现乱码的原因。当在OS下手工创建并写入的txt文件(gbk),用程序直接去读(utf-8),就会乱码。为了避免可能的中文乱码问题,最好在文件写入和读出的时候显式指定编码格式。
private static void readTxt() {
try {
File f1 = new File(“e:/qqgroup.txt”);// 打开文件
FileInputStream in = new FileInputStream(f1);
// 指定读取文件时以UTF-8的格式读取
BufferedReader br = new BufferedReader(new InputStreamReader(in,
“UTF-8”)); // 读取文件
String name = “”;
String numb = “”;
String str;
System.out.println(“群名*群号”);
while ((str = br.readLine()) != null) {
if (str.indexOf(“class=\”addrtitle\”>”)>-1) {
name = str.substring(str.indexOf(“>”), str.indexOf(“</“));
System.out.println(“群名:” + name);
}
if (str.indexOf(“gid=”)>-1) {
numb = str.substring(str.indexOf(“gid=”), str.indexOf(“@groupmail”));
System.out.println(“群号:” + numb);
}
}
in.close();// 关闭读取
} catch (Exception e1) {// 如果有错误,这里进行处理
e1.printStackTrace();// 打印错误信息
}
}
(1)写入乱码
File f = new File(filePathAndName);
OutputStreamWriter w = new OutputStreamWriter(new FileOutputStream(f),”UTF-8”); BufferedWriter writer=new BufferedWriter(w);
writer.write(“file content”);
writer.flush();
writer.close();
(2)读取txt文件
File f = new File(“PathAndName”);
if(f.isFile()&&f.exists()){
InputStreamReader read = new InputStreamReader(new FileInputStream(f),”UTF-8”); BufferedReader reader=new BufferedReader(read);
String line;
while ((line = reader.readLine()) != null) {
“file content” += line;
}
read.close();
}
File file = ``new
File(``"d:/1.txt"``);
BufferedWriter bw = ``new
BufferedWriter(``new
FileWriter(file));
``bw.write(``"abc"``);
``bw.newLine();
``bw.write(``"efg"``);
``bw.flush();
``bw.close();
3.字符流的写入写出
``File file=``new
File(``"F:\\io\\abc.txt"``);
``FileOutputStream fos=``new
FileOutputStream(file);
``OutputStreamWriter osw=``new
OutputStreamWriter(fos);
``osw.write(``'大'``);
``osw.close();
``FileInputStream fis=``new
FileInputStream(file);
``InputStreamReader isr=``new
InputStreamReader(fis);
``System.out.println((``char``)isr.read());
``isr.close();
CentOS6下yum方式安装svn客户端subversion(亲测可用)
目前找到一个当下能用的yum源,进行快速安装subversion
在 /etc/yum.repos.d/ 创建源文件 wandisco-svn1.8.repo
[WANdisco]
name=WANdisco SVN Repo 1.8
enabled=1
baseurl=http://opensource.wandisco.com/rhel/6/svn-1.8/RPMS/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-WANdisco
然后导入GPG-KEY
wget http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
rpm –import RPM-GPG-KEY-WANdisco
再进行安装:
yum update
yum -y install subversion
温故而知新之java代码片段
1.检测Java代码的执行时间
long startTime=System.currentTimeMillis();
//获取开始时间,单位是毫秒ms。若需取纳秒ns,则System.nanoTime(); doSomeThing();
//需要检测的代码段
long endTime=System.currentTimeMillis();
//获取结束时间
System.out.println(“运行时间: “+(endTime-startTime)+”ms”);
2.数组打印出来
// List<String>类型的列表
List<String> list = new ArrayList<String>();
list.add(“First”); list.add(“Second”);
System.out.println(list);
//Array类输出数组
String[] array = new String[] { “First”, “Second” }; System.out.println(Arrays.toString(array));
//使用Arrays.deepToString()输出数组的数组
String[] arr1 = new String[] { “One”, “Two” };
String[] arr2 = new String[] { “Three”, “Four” };
String[][] arrayOfArray = new String[][] { arr1, arr2 };
//输出
System.out.println(arrayOfArray);
System.out.println(Arrays.toString(arrayOfArray));
System.out.println(Arrays.deepToString(arrayOfArray));
产品等级结构与产品族
在理解抽象工厂模式之前,先了解两个概念:
1.产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是冰箱,其子类有海尔冰箱、TCL冰箱,则抽象冰箱与具体品牌的冰箱之间构成了一个产品等级结构,抽象冰箱是父类,而具体品牌的冰箱是其子类。这是从纵向的角度来看。
2.产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视、海尔冰箱,海尔电视位于电视产品等级结构中,海尔冰箱位于冰箱产品结构中,海尔电视、海尔冰箱构成了一个产品族。这是从横向的角度来看。
当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构、属于不同类型的具体产品时,就可以使用抽象工厂模式。
抽象工厂模式与工厂方法模式的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单和有效。