分类: 默认

  • 海外博客使用CDN加速

    海外博客使用CDN加速

    因为在祖国的怀抱中自建博客很麻烦,所以最后还是选择全套购买海外的东西。

    不过博客主要的访客还是祖国的,所以这响应速度还是比较重要的。

    Hexo的一个好处就是全站静态化,生成以后再压缩一下,轻松加愉快。

    参考了网上很多博主的文章,决定CDN是个不错的东西,可以考虑一下。

    百度加速乐

    因为本身空间不错,访问速度也很快,所以国外的CDN基本就不考虑了,英文折腾起来太麻烦。

    国内的话看了一下挺多的,对于未备案的网站也可以分配海外节点。

    因为百度的云引擎BAE不错,所以对百度的服务期待很高。

    百度的CDN是百度加速乐,免费版3G/h,30万PV/日。

    这个数据大家别觉得特别好…这么大的量一般站点还用不上。

    我选用的别名接入,接入以后可以看大部分请求被香港节点处理了。速度有轻微提升,感觉还可以,就用着吧…然后就遇到坑爹的400(unknown virtual host)错误了。

    400错误

    我当时还琢磨这估计是抽风一下吧,刷新无数次都没有用。

    在百度经验和加速乐的论坛看了看,说需要等等或者删除再创建一下。

    确实管用,不过几分钟以后又会出现400错误,这样折腾不起呀,考虑到速度提升也不大,果断放弃之。

    毕竟是百度的服务,估计也不会太差。不过国内节点必须备案…所以也就只是看看。

    安全宝

    安全宝是一家名为星云融创的公司提供的,同样是未备案分配海外节点。

    安全宝的海外节点在美国,不过速度还挺快的。

    使用方法差不多,不过接入和解析生效都是人工审核的,一般一个小时左右。

    安全宝使用起来比较流畅,速度提升也比较明显,本站现在使用的就是它,安全宝把节点换到了日本的,基本不能用。不是速度慢,而是基本无法访问,慎用之。

    域名界面

    不过这个数据统计我就有些疑惑了。

    我是在购买了主机刚刚迁移完博客就去申请的服务,凌晨时分接入的。

    第二天早上就提示我拦截了恶意攻击

    控制面板的恶意攻击提示

    要不要这样…我一个静态博客,才搬迁就有攻击…

    不过一看就知道是自动攻击,我主机上一个php文件都没有。…

  • 从博客园迁移到Hexo

    备注:该文章写于2014年,相关思路可以作为参考,但是hexo的版本更新相关导致相关工具无法使用了。

    很早以前就开始使用博客园的服务,虽然有这样那样的问题,但是始终还是觉得不错。

    一来不用自己维护空间什么的,二来博客园的原创文章很好被收录,偶尔写写文章也不操心。

    大概从去年起将操作系统全面切换到ubuntu,没有想到最不习惯的居然是没有live writer。博客园的在线编辑器实在太难用了,反复折腾决定用node-webkit快速的做一个linux下的编辑器。

    就在这之间接触到了Hexo,最终决定从博客园迁移出来,自建博客。

    这里分享一下迁移中的各种收获。

    Hexo

    Hexo是基于Nodejs的静态博客工具。所谓静态博客区别于Wordress之类的博客系统主要是并不是由动态语言在服务端生成,而是使用者在使用完博客后生成全站静态文件。

    Hexo的优点其实我没有啥深刻的体会,这是我接触到的第一款静态博客工具。对我而言它的优势有三:

    • 书写方便,使用markdown书写。

    很多人觉得md很潮,其实我很现实的,只要好用就行了。用md来写不需要专用软件支持,一个记事本就好了。

    • 容易保存原始资料

    在博客园的时候就有定期备份数据的习惯,倒也不是害怕哪天它突然关闭了,只是决定数据在自己手中有一份比较安全。

    Hexo的原始资料可以纳入版本管理之中,还是挺方便的。

    • 使用方便,易于扩展

    Hexo在设计上预留了扩充点,而且本身原理很简单,实在不行也是可以自己修改的。这样如果有不合意的地方可以自己动手完成。接下来我也会谈到我为了迁移做的一个迁移插件。

    准备工作

    Hexo要求nodejs环境,具体安装大家随意搜索以下就可以找到。而npm是nodejs的包管理器,默认也会自动安装上。
    然后运行

    npm install -g hexo
    hexo init <blogFolder>

    初始化完成以后运行hexo server可以看到效果。

    基本的配置在_config.xml文件中,有部分配置也会在对应的主题目录的_config.xml中。

    从博客园迁移数据

    博客园是由一个未公开的API的,不过API中没有提供分类和标签,所以不适合迁移时的数据获取,所以还是抓取网页比较值得信赖。

    首先来看看插件列别。

    Hexo将插件分类7类。分别是生成,渲染,迁移,标签,辅助,其他。…

  • 注入器和发布库–AngularJS学习笔记(三)

    注入器和发布库–AngularJS学习笔记(三)

    AngularJS的一大特性就是Module的加载和依赖注入,本文将分析一下loader.js和最后这些代码文件是怎么组织和运行的。

    Loader.js

    该文件中只有setupModuleLoader函数,当然它的返回值是一个函数,包含了angular.Module的API。

    首先是位置,这些配置和模块保存在哪里

    var $injectorMinErr = minErr('$injector');
    var ngMinErr = minErr('ng');
    
    function ensure(obj, name, factory) {
    return obj[name] || (obj[name] = factory());
    }
    
    var angular = ensure(window,'angular',Object);

    前两句建立两个错误提示用的对象,这个在前一篇文章有介绍。

    接下来声明的函数用于新建对象,return语句利用惰性求知保证了对象的存在性。如果存在就直接返回,否则利用提供的函数新建。

    下一句就声明了angular对象,传入的参数是window,angular字符串和Object。

    所有浏览器都支持 window 对象。而全局变量是 window 对象的属性。 全局函数是 window 对象的方法。

    这句话将angular绑定在window对象上。当然这是的angular只是一个普通的Object对象。…

  • 启动和JQuery绑定–AngularJS学习笔记(二)

    启动和JQuery绑定–AngularJS学习笔记(二)

    上一篇简单的分析了AngularJS的项目结构,后面就开始分析具体的源代码了。

    从angularFiles.js中的定义可以看出有几个文件直接位于src根目录,并不是隶属于某个模块。这几 个分别是minErr.js,Angular.js,loader.js,AngularPublic.js,jqLite.js,apis.js。

    这几个提供了AngularJS中很基础的工具,比如angular.equals等,在文档中它们中的部分被归属于 Global API中。

    本文主要看看AngularJS的启动和JQuery绑定。

    minErr.js

    Javascript中有Error对象,用于表示运行时错误,但是它的功能比较单一,一般使用

    newError(message)

    但是它的功能比较单一。而minErr是一个提供更丰富信息的工具。这样生成的错误信息将包含模块名 称和其他信息,同时还提供了模板功能。比如

    var exampleMinErr = minErr('example');
    var detailMinErr=exampleMinErr('one','This {0} is {1}',"v1","v2");
    detailMinErr.stack

    显示如下:

    screenshot13

    可以看出错误还提供了对应了文档地址,不过其中的NG_VERSION_FULL看着有点奇怪,这里应该显示诸如1.2.7这样的版本号。在 lib/grunt/utils.js中有一个处理,将NG_VERSION_FULL、NG_VERSION_MAJOR等替换了。

    function(src, NG_VERSION, strict){
    var processed = src
    .replace(/"NG_VERSION_FULL"/g, NG_VERSION.full)
    .replace(/"NG_VERSION_MAJOR"/, NG_VERSION.major)
    .replace(/"NG_VERSION_MINOR"/, NG_VERSION.minor)
    
  • 源代码目录结构–AngularJS学习笔记(一)

    源代码目录结构–AngularJS学习笔记(一)

    最近开始接触AngularJS,确实是一个相当不错的东西,可以把很多东西简化掉。又对于其中的双向绑定等的实现很好奇,加之正在学习Javascript的东西,所以觉得从源代码这块开始深入学习AngularJs。

    获取AngularJs源代码

    虽然可以直接通过阅读最终的js文件来学习,不过总觉得这样入手不太容易,而项目源代码本身就是一块一块的,同时又配有测试,从这里开始学习的话应该比较容易一些。

    AngularJs的源码在github上,地址是:https://github.com/angular/angular.js

    实现先获取到代码:

    git clone https://github.com/angular/angular.js.git

    下载需要一点点时间…特别是你访问github速度比较慢的时候…

    目录结构和构建工具

    首先来看看项目有哪些文件夹:

    • src目录是项目的源代码,也是学习的主要对象
    • test目录是对应的测试
    • closure中的文件是Google Closure Compiler使用的
    • scripts目录中有一些脚本,主要用于bower、travis等的任务使用

    再来看看文件:

    • angularFiles.js中定义了AngularJs中每个某块所包含的js文件地址,很多地方使用到了这个文件配置。
    • bower.json是包管理工具的配置文件,更多介绍点击Bower
    • check-size.sh将angular.min.js文件压缩,然后显示文件大小…(说实话,我不是太清楚这有什么意义)
    • changelog.js是一个nodejs脚本,它可以从git仓库中获取更新日志。通过
    node changelog.js

    运行脚本。如果提示[Error: Cannot find module ‘qq’],可以通过npm安装

    npm install qq

    changelog.spec.js是对应的测试文件。

    • compare-master-to-stable.js也是一个nodejs脚本,它可以比较稳定版和当前版本的区别。
    • gen_docs.sh会使用Jasmine进行测试,然后调用docs/src/中的gen-docs.js生成文档。
    • Gruntfile.js是Grunt的配置文件,更多介绍参考
  • 在stacklab上搭建Hadoop平台

    在stacklab上搭建Hadoop平台

    什么是stacklab

    stacklab是中国开源云联盟(COSCL)和中国OpenStack用户组(COSUG)联合成立OpenStack实验室,简单的来说就是一个免费申请和使用OpenStack的平台,和国外的那个TryOpenstack有点像,不过stacklab没有门槛,不需要邀请码什么的就可以申请使用。稍微试用了一下感觉很爽,特意和大家分享一下。

    在stacklab建立镜像

    网址:http://stacklab.org/

    点击Register注册,验证完邮箱以后登录。

    在建立镜像以前先配置好Keypairs。

    点击Create Keypair,名字随便填写就行了。完成可以得到一个pem文件。

    在Security Groups中添加一个22端口的许可(起初是为了添加对ssh的许可,后来我发现好像不加也没有关系…这里大家随意吧)

    在Images and Snapshots中选择一个喜欢的镜像,我这里选择的是CentOS6.2_x64,点击Launch。

    这里的Keypair选择我们刚才创建的那个,其他的随便填写。

    我创建了hmaster和hsalve两个镜像。

    注意一下中间的Size里面Disk是0,这个没有关系,可以使用的。点击Public Domain可以看到连接命令。

    比如

    ssh -i hmaster.pem -p11011 [email protected]

    第一次登录输入一个yes接受ssh的证书。

    登录以后输入passwd修改密码,这样就可以通过VNC登录了。

    网页上的那个VNC经常失灵…最好还是用ssh吧。如果是用putty,先把pem转成ppk就行了。

    使用CDH4搭建Hadoop

    CDH4使用很方便,参考:https://ccp.cloudera.com/display/CDH4DOC/CDH4+Installation

    先看一下主机名称和对应的IP,修改一下host。

    执行

    wgethttp://archive.cloudera.com/cdh4/one-click-install/redhat/6/x86_64/cloudera-cdh-4-0.noarch.rpm

    然后

    yum--nogpgchecklocalinstallcloudera-cdh-4-0.noarch.rpm

    再把Key加上

    rpm --import http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera

    在hmaster上安装hadoop-yarn-resourcemanager…

  • 基础工具–Guava-Libraries学习笔记(一)

    基础工具–Guava-Libraries学习笔记(一)

    什么是Guava-Libraries?

    Guava-Libraries是google对java的一个扩展,主要涵盖集合、缓存、并发、I/O、反射等等。

    它本来是Google内部所使用的一个类库,后来整理开源出来了。这套库的设计引入了很多新的理念,研究一下可能会使你对Java这门语言有新的认识和看法。

    地址:http://code.google.com/p/guava-libraries/

    这篇短文主要是关于Guava-Libraries基础工具,内容是我参考官方wiki和自己的使用体验结合而成。

    null的使用

    null在java中是一个很特殊的东西。它可以标识一个不确定的对象,比如

    Ojbect o =null

    同时在很多个集合中它代表key不存在,也可以代表值为null。

    null使用需要给外的小心,稍不注意就会出现很多问题。当然更多的时候只是单纯的觉得null不够优雅而已。

    Guava为我们提供了一个Optional的抽象类来解决这个问题。用类Present和Absent代表值存在和不存在。

    以下是一个例子:

    Optional possible = Optional.of(5);
    if (possible.isPresent()) {
    System.out.println(possible.get());
    }
    
    Optional absentValue = Optional. absent();
    if (absentValue.isPresent())
    System.out.println(absentValue.get());
    System.out.println(absentValue.or(-1));
    System.out.println(absentValue.orNull());
    System.out.println(absentValue.asSet());

    第一种是值存在的,第二种是值不存在的。执行效果如下:

    guava-1-1

    这里说明一下isPresent()方法是判断是否有值的。or方法是非null返回Optional的值,否则返回传入值。

    orNull()方法是非null返回Optional的值,否则返回null。

    我个人觉得or方法比较常用就是了。

    条件判断

  • java通过jna调用科大讯飞语音云实现语音识别功能

    java通过jna调用科大讯飞语音云实现语音识别功能

    说明:写本文时还没有提供java平台的,现在官方有java平台的sdk了,可以直接使用。本文已经没有太多实际意义了。

    语音识别技术

    语音识别就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令。语音识别技术主要包括特征提取技术、模式匹配准则及模型训练技术三个方面。说实话其中的技术比较多,要独立开发新的基本上不现实。所以自然把目光放到开源项目或者其他公司的API上面了。开源项目我尝试了SpeakRight和sphinx4,但是效果都是一般。AT&T的API老是申请不上,最后把目光放在科大讯飞上了。试用了一下,效果还行,但是它提供的Windows平台的API是C/C++的,我只懂点皮毛,所以稍微研究了一下通过Java调用它的语音云SDK。

    JNA

    java调用.dll获取.so一般通过JNI,但是JNI的使用比较复杂,需要用C另写一个共享库进行适配。而JNA是一个自动适配工具,通过它调用.dll只需要一个借口即可。

    官网:https://github.com/twall/jna/

    下载jna.jar即可。

    编写接口

    科大讯飞语音云主要提供语音合成和语音识别两个方面的东西,我主要使用语音识别这块的功能。

    建立接口QTSR,继承Library。

    将msc.dll等文件复制到项目根目录。

    jna-yuyinshibie-01

    加载msc.dll

    QTSR INSTANCE = (QTSR) Native.loadLibrary("msc", QTSR.class);

    然后来看一下msc.dll公开了哪些方法。首先是QISRInit,这是一个全局初始化函数。

    jna-yuyinshibie-02

    它的返回值为int,参数是const char。int还是java的int,但是char就对应的是java的String了。

    所以在QTSR中添加方法:

    publicintQISRInit(String configs);

    返回值在msp_errors.h中定义,等一下我们还是要弄在java里面去。

    继续看QISRInit函数,在官方文档中有调用示例:

    constchar* configs=“server_url=dev.voicecloud.cn, timeout=10000, vad_enable=true”;
    
    int ret = QISRInit( configs );
    
    if(MSP_SUCCESS 
  • 在win7上部署umbraco

    在win7上部署umbraco

    什么是umbraco

    Umbraco是一个开放源码的CMS内容管理系统,基于asp.net建立,使用mssql进行存储数据。 使用Umbraco ,设计师能创造出有效的XHTML标记模板和开发人员可以创建任何基于.Net的模块。主要特点包括:

    • 漂亮,友好的用户界面
    • 综合所见即所得编辑器
    • 支持编辑在Microsoft Word
    • 全部源代码可用(开放源代码)
    • 超级简单的模板引擎
    • 完全支持Web标准

    最近需要把一个asp的软件下载站点转移到asp.net,数据库最好用MSSQL。在网上Google一番以后决定试试umbraco,看着一大票的英文文档是在有些难受,还是先看看umbraco是什么样子的再研究文档。我的电脑是Win7的,装了MSSQL 2005 DEV和VS2010,没有IIS7。

    获取umbraco

    umbraco的官网是:http://www.umbraco.org/

    下载地址:http://www.umbraco.org/download

    还有一个中文的爱好者网站:http://www.umbracochina.com/

    这个中文网站提供了汉化包,针对4.7和4.X版本(是这么写着的),但是我不推荐用这个。因为文档毕竟没有汉化,汉化的界面虽然看着舒服,但是文档有些东西就对不上了。当然个人观点哈。

    umbraco-win7-1

    下载界面最上面的是针对Microsoft Web Platform Installer or WebMatrix的,没用过…

    点下面那个下到4.7.2的编译好的版本,直接解压到D盘去,在IIS中新建一个站点,然后访问…

    错误和解决

    访问直接报服务器错误:HTTP 错误 500.19 – Internal Server Error,无法访问请求的页面,因为该页的相关配置数据无效。

    umbraco-win7-2

    看情况是缺少配置,我打开Web.config确实没有这个节点的配置。我比较好奇为什么这个有名的一个开源项目的配置有错误…难道是我无意中跳了步骤?

    不管了,参考一下标准配置将配置文件补全,在configSections节点中添加:

    <sectiongroupname="system.web.extensions"type="System.Web.Configuration.SystemWebExtensionsSectionGroup, 
  • Ormlite在一般java环境中操作Sqlite

    Ormlite在一般java环境中操作Sqlite

    简介

    最开始接触ormlite是在android的开发中,ormlite的简单便利让我印象深刻。

    这几天在研究顾客购物行为,需要使用到数据库,但是对于数据库的速度什么的要求不大,我首先想到的是Ormlite+Sqlite。

    实体类

    ormlite的官网http://ormlite.com/,最新版本4.41

    因为是在一般java环境中使用,所以不需要那个android包。

    ormlite-sqlite

    引入包以后建立modal,例如:Commodity.java。因为使用的sqlite,主键自增长,设置为

    @DatabaseField(generatedId =true)

    完整的代码如下:

    package com.cnblogs.htynkn.DataSpider.Modal;
    
    import com.j256.ormlite.field.DatabaseField;
    import com.j256.ormlite.table.DatabaseTable;
    
    /**
    *@author 夜明的孤行灯
    *@date 2012-6-29
    */
    
    @DatabaseTable(tableName ="Commodity")
    publicclass Commodity {
    @DatabaseField(generatedId =true)
    privateint id;
    @DatabaseField(columnName ="Name")
    private String name;
    @DatabaseField(columnName ="JdKey")