2013年11月9日星期六

使用Github Pages服务建立个人博客


为什么要使用Github Pages来建立个人博客

使用什么博客平台取决于个人的需求,因此,并不是所有人都适合使用本文介绍的这种形式,一般来说,追求简洁的一些程序员可能会使用这种方式。

对于有以下需求的人来说,使用Github Pages建立博客是个好主意:

  • 希望能在本地编写文章
  • 追求简洁、轻便
  • 不想购买主机空间和域名

第一条,本地编写允许文章允许用户选择自己喜欢的编辑器来进行写作,而不是使用博客平台的编辑器——对于我等emacser来说,许多博客平台的编辑器功能实在是有点不够看。著名的博客平台WordPress 提供xml-rpc接口,允许用户通过相关软件在本地编写好文章后远程发布。说实话,我还是比较喜欢WordPress的,但它不满足后面三个需求。说到xml-rpc,早些年国内各大博客平台都是支持xml-rpc借口的(如CSDN,ChinaUnix等),但是后来据说是出于安全因素的考虑,似乎有些网站是关闭了这个接口,现在网上的相关搜索结果普遍是四五年前的讨论结果。新浪以前似乎也支持xml-rpc接口,但据我测试现在是无法进行发布了,CSDN貌似也有点问题,应该是关闭了接口。之所以要说xml-rpc,是因为emacs有一个插件org2blog能够通过xml-rpc接口来进行远程发布,顾名思义org2blog是使用org-mode作为major-mode的,熟悉org-mode并且正在使用WordPress的朋友一定会喜欢这个插件,如果需要,可以到这个链接 下载org2blog,此外org2blog依赖xml-rpc.el,点这里 可以下载。

第二条,还是说WordPress吧,WordPress是使用php编写的,使用mysql数据库来管理文章。从功能上来说WordPress是非常好的,它提供丰富的主题、插件以及拥有很多用户的论坛(好吧我不是在这里推荐WordPress的,不过我确实挺喜欢WordPress,之前也说过了),与此相对应的,为了完全了解WordPress,用户不得不去学习如何安装它的主题和插件、熟悉选项繁多的后台管理界面。至于国内的一些博客平台,外观暂且不说,一般都带有很多广告,我特别讨厌这一点。

第三条,好吧这是我选择这一条路的主要理由,你懂得,我很穷,没有钱买主机空间和域名(求一个土豪朋友)。为什么我穷?因为我现在待业在家,没有工作——没有工作是因为我把工作辞了在家准备考公务员,至于这后面的故事就很复杂啦,如果有兴趣的话可以发邮件给我和我谈谈心哟。

如果看到这里您对我的观点基本赞同的话,您可以继续读下去,否则我觉得您可以考虑一下WordPress或者其他平台。

Github Pages是什么

Github 是一个用于使用Git版本控制系统项目的共享虚拟主机服务1。简单说,它是一个具有版本管理功能的代码仓库,每个项目都有一个主页,列出项目的源文件。

但是对于一个新手来说,看到一大堆源码,只会让人头晕脑涨,不知何处入手。他希望看到的是,一个简明易懂的网页,说明每一步应该怎么做。因此,Github就设计了Pages功能,允许用户自定义项目首页,用来替代默认的源码列表。所以,Github Pages可以被认为是用户编写的、托管在Github上的静态网页。

Github提供模板,允许站内生成网页,但也允许用户自己编写网页,然后上传。有意思的是,这种上传并不是单纯的上传,而是会经过Jekyll程序的再处理。这里的Jekyll 是一个静态站点生成器,它提供了模板、变量、插件等功能,所以实际上可以用来编写整个网站。它也是Github Pages的后端处理工具。

利用Github Pages的这些特点,我们就可以搭建一个个人的博客——虽然是静态的网站,不过足够了。

环境准备

对于想使用Github Pages服务来建立个人博客的朋友来说,您需要以下环境:

  • Github帐号
  • 配置好的本地git工具
  • markdown编辑器或者其他的编辑器
  • Jekyll(可选)

前面两个我不想多说,相关的文章太多了,在这里重复那些内容没有什么意义。

特别要说的是,建议使用linux系统,虽然理论上windows也可以使用msysgit来管理,但我不认为那是个好主意,当然如果愿意折腾,就无所谓了。

至于markdown,它的语法简单明了,很快就能上手,因此不要担心这个问题,需要学习的话,可以到Github的首页,按下键盘的 M 键进行学习。至于编辑器,简单的文本编辑器如gedit、leafpad甚至nano都可以,当然,本人选择使用emacs并且不使用markdown模式而是坚持使用org-mode,感兴趣的可以在文章尾部找到相关的配置以及使用方法。此外一些支持markdown语法的编辑器也是比较好的选择。

最后的Jekyll为什么标注是可选呢?因为我们并不需要对相关的项目仓库做什么特别的事情,我们只需要写文章,然后commit->push就是了,之所以需要Jekyll,是为了方便本地预览博客以及进行调试。怎么说也要保证自己的网站确实能够运行然后才去让别人阅览吧?总而言之,Jekyll并不是建立博客必须的部分,但它是帮助我们更好地进行管理的工具。

Jekyll的安装:

    #以debian系linux发行版为例  sudo apt-get install rubygems1.8  gem install jekyll liquid open4 maruku classifier rdiscount  

方案选择

可选的方案有三个:

Jekyll-Bootstrap和Octopress是两个基于Jekyll的博客框架,使用它们能够快速地得到一个基本好看的、能够运行的博客系统,不过还是那个问题,因为已经够用了,所以你不会去关心它们到底干了什么怎么干的,直到你遇到问题。不过它们还是不错的,这是真心话。相对来说我个人比较推荐Jekyll-Bootstrap,因为它在Jekyll的基础上并没有作太大的改变,只是增加了主题和一些配置而已,Octopress干的事就多了。

这里主要说一下第三种方案。

自己动手呢,也分两种情况:

  • 复用他人的博客模板
  • 自行编写每一行网站代码

显然第二种情况是如果不是对前端知识足够熟悉是比较困难的。因此复用他人的博客模板是比较好的选择,这里的复用并不是简单的拷贝然后使用(当然你想的话也可以),其他人的博客一般都会有一些细节无法满足自己,所以还需要自己进行修改、定制,这个过程就是意义所在。

这个页面 收集了非常多Jekyll博客的链接及其源代码,我比较喜欢codepiano的风格,然后我最初用来学习的是唐九军的博客,唐九军的博客没有使用Jekyll-Bootstrap等其他东西,完全是自己编写的css和js,其文件结构也比较清晰——这两个人的博客和源代码链接都可以在刚才说的页面上找到,请善用快捷键Ctrl+F 。

行动纲领

按照以下步骤进行:

  1. 在Github上建立一个名为<username>.Github.io的repo,其中的username为Github用户名.
  2. 在本地建立对应的repo目录并设置好.
  3. 将下载下来的模板拷贝到本地repo目录中.

前期的工作就是这么三步,当然这里说得比较简略,详细的步骤可以到Github Pages的帮助页面 里进行了解。后面主要的工作集中在对自己的博客的配置中,下面将讲述博客配置的一些细节。

Jekyll博客配置

之前说Jekyll并不是必须的,但这里为什么要说“Jekyll博客配置”呢?因为虽然我们可以不用Jekyll,但最终Github pages生成我们的博客时就是用的Jekyll,所以我们在配置上还是得按照Jekyll的规矩来。

博客目录结构

首先明确一点,博客目录中不以下划线为命名开始的文件/文件夹都会在生成博客时复制过去,根据个人的不同喜好,博客的结构会不一样,这里只说一下Jekyll要求的一些结构:

    -- index.html         网站首页文件  -- _layouts           博客模板目录     -- default.html     --post.html  -- _posts             文章存放目录     -- 2013-09-08-test.md     -- 2013-09-08-test.html     -- <other posts>                           

除此以外其他文件都不是必须的,但光有这三个东西很难保证能生成一个足够完整的博客——事实上网站模板和文章目录也不是必须的,除了index.html,因为完全可以乱七八糟写一堆html文件然后自己在各个html文件之间理清关系。因此,通常的一个功能完整的Jekyll博客目录包含以下结构和文件:

    -- index.html         网站首页文件  -- archives.html      文章存档页面文件,文件名可改  -- categories.html    文章分类页面文件,文件名可改  -- tags.html          文章标签页面文件,文件名可改  -- about.html         “关于我”页面文件,文件名可改  -- rss.xml或atom.xml  博客feed文件,文件名可改  -- sitemap.xml        博客地图,为博客做SEO优化,这个我不太懂  -- _config.yml        Jekyll博客配置文件  -- _layouts           博客模板目录     -- default.html     -- post.html  -- _includes          可复用的公用模板文件目录,例如博客的导航条。不是必须的,                        但分离出各个页面的公有部分可以使得模板更易读,结构更清晰     -- footer.html     -- footer.html     -- <other file to include in template>  -- _posts             文章存放目录     -- 2013-09-08-test.md     -- 2013-09-08-test.html     -- <other posts>                           -- assets/            其他博客文件存放目录,如css,图片,js文件,目录结构仅为                        示例,可根据个人意愿自行设置     -- css        -- style.css     -- img        -- favicon.ico     -- js        -- blog.js  

博客模板

正如上面的示例一样,博客模板一般包含一个default.html和一个post.html,正如其名字一样,default.html是博客的模板,而post.html一般是文章的生成模板。查看一些Jekyll博客的模板,您会发现其中会有

{{ site.url }} {{ for post in site.posts }}

这样的语句,这是因为Jekyll使用liquid语法 来解析模板,诸如 site.url 、 site.posts 这样的部分是Jekyll内置的一些变量,关于Jekyll的变量的更多内容可以到Jekyll的官网 上深入了解。

有了模板文件后,其他的页面都可以通过Jekyll所谓的front-matter来使用模板,举例来说,撰写文章时,一般这样写:

--- layout : post title : <文章标题> categories : <分类> tags : <标签> --- <正文> …

这样在编写文章时就只需要关心文章内容了。

_config.yml

_config.yml文件是Jekyll博客的配置文件,用户可以在这个配置文件中设定博客名称、博客描述、作者名称等信息,并可以在模板中作为变量使用。

我的配置文件如下所示:

    permalink:        /:year/:month/:day.html  markdown:         rdiscount  pygments:         true  paginate:         5    title:            笼中梦  url:              http://linusp.Github.io/  feed:             /atom.xml  author:      name:         发条兔子      email:        linusp1024@gmail.com      description:  "变成兔子的青蛙"    follow:      email:        linusp1024@gmail.com      Github:       https://Github.com/Linusp      description:      发条兔子的不完全技术博客    indexContent:     true    style:            /assets/css/style.css  blogName:         笼中梦  blogDesc:         发条兔子的不完全技术博客  favicon:          /assets/img/favicon.ico  theme:            blue    disqus:           linuspb    copyright:        © 2013   test:             ok  

archives页面示例

一个简单的archives页面2如下

    ---  layout: default  title : Archives  ---  <ul>        <li>      <a href="/2013/11/06/emacs-pdf.html" title="丧心病狂:用Emacs阅读PDF文档">        <span class="date">          <span class="day">06</span>          <span class="month"><abbr>Nov</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">丧心病狂:用Emacs阅读PDF文档</span>      </a>    </li>        <li>      <a href="/2013/11/04/video-card.html" title="在Linux系统中屏蔽独立显卡">        <span class="date">          <span class="day">04</span>          <span class="month"><abbr>Nov</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">在Linux系统中屏蔽独立显卡</span>      </a>    </li>        <li>      <a href="/2013/11/04/blog-plan-finished.html" title="博客拆分完成">        <span class="date">          <span class="day">04</span>          <span class="month"><abbr>Nov</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">博客拆分完成</span>      </a>    </li>        <li>      <a href="/2013/10/20/daily-shell-t2s2.html" title="伪语音合成(2)">        <span class="date">          <span class="day">20</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">伪语音合成(2)</span>      </a>    </li>        <li>      <a href="/2013/10/20/blog-plan.html" title="博客分拆计划">        <span class="date">          <span class="day">20</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">博客分拆计划</span>      </a>    </li>        <li>      <a href="/2013/10/19/daily-shell-text2speech.html" title="伪语音合成(1)">        <span class="date">          <span class="day">19</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">伪语音合成(1)</span>      </a>    </li>        <li>      <a href="/2013/10/15/node.js-blog-platform-ghost.html" title="基于Node.js的博客平台Ghost试用">        <span class="date">          <span class="day">15</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">基于Node.js的博客平台Ghost试用</span>      </a>    </li>        <li>      <a href="/2013/10/14/liquid-in-post.html" title="在Github Pages博客内容中插入liquid语句示例">        <span class="date">          <span class="day">14</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">在Github Pages博客内容中插入liquid语句示例</span>      </a>    </li>        <li>      <a href="/2013/10/13/change-theme.html" title="更换博客主题">        <span class="date">          <span class="day">13</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">更换博客主题</span>      </a>    </li>        <li>      <a href="/2013/10/10/free-in-internet-time.html" title="论信息自由">        <span class="date">          <span class="day">10</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">论信息自由</span>      </a>    </li>        <li>      <a href="/2013/10/09/script-with-emacs-lisp.html" title="使用elisp编写脚本">        <span class="date">          <span class="day">09</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">使用elisp编写脚本</span>      </a>    </li>        <li>      <a href="/2013/10/07/one-year.html" title="一年">        <span class="date">          <span class="day">07</span>          <span class="month"><abbr>Oct</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">一年</span>      </a>    </li>        <li>      <a href="/2013/09/30/writings-io.html" title="博客平台writings.io即将关闭">        <span class="date">          <span class="day">30</span>          <span class="month"><abbr>Sep</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">博客平台writings.io即将关闭</span>      </a>    </li>        <li>      <a href="/2013/09/30/static-blog-way.html" title="简洁、轻便——静态博客写作方案">        <span class="date">          <span class="day">30</span>          <span class="month"><abbr>Sep</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">简洁、轻便——静态博客写作方案</span>      </a>    </li>        <li>      <a href="/2013/09/14/blogging-with-jekyll-emacs.html" title="使用Github Pages服务建立个人博客">        <span class="date">          <span class="day">14</span>          <span class="month"><abbr>Sep</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">使用Github Pages服务建立个人博客</span>      </a>    </li>        <li>      <a href="/2013/09/11/first-post.html" title="第一篇博客">        <span class="date">          <span class="day">11</span>          <span class="month"><abbr>Sep</abbr></span>          <span class="year">2013</span>        </span>        <span class="title">第一篇博客</span>      </a>    </li>      </ul>  

同样的,categories页面和tags页面的形式差不多,也是使用Jekyll内置的变量,当然要做得好看还是要费点功夫的,比如说本人这个博客的这两个页面还是一团糟(因为博客主题的作者并没有提供这两个页面,这就是所谓 自己动手丰衣足食 啦)。

_site目录

本地调试时,Jekyll会在目录下生成一个_site目录,目录就是真正生成的博客目录和文件,但这个文件对Github Pages是无意义的,仅仅是用来方便本地预览和调试,因此建议在.gitignore文件中添加该目录以在push时不用上传该目录及其中的文件。

使用emacs的org-mode

对于emacser来说,使用org-mode来写作才是最幸福的事情,因此就有了这一部分。这一部分的绝大部分内容来自脚注22中提到的文章,基本的配置过程和要点在文章中都已经说得很详细了,因此我在这里就简略地说几点。

因为Jekyll可以识别markdown文件和html文件,所以使用emacs的org-mode将org文件publish成html文件就是我们要做的。值得一提的是Jekyll-Bootstrap在本地调试时直接无视_posts目录下后缀为html的文件,虽然说肯定有办法改变这种行为,但我找了一会没找到就放弃了,加之Jekyll-Bootstrap在Jekyll的基础上又多加了一些东西,所以导致我并没有去使用Jekyll-Bootstrap以及使用了Jekyll-Bootstrap的博客模板。

我的方案:

  1. 建立一个目录,在其中建立两个子目录,一个名为 org ,一个名为 Jekyll 。后者是和username.Github.io这个repo对应的本地repo目录,前者是org格式的文章存放目录,注意org目录下再建立一个 _posts 目录,将文章存放到 org/_posts 下面,这样在执行 org-publish-project 时才能保证生成到指定目录。
  2. 使用org-mode 7.x。emacs23自带的org-mode版本为6.x,其中的bug会导致插入的front-matter在生成时发生错误。emacs24自带的org-mode工作良好。
  3. org-mode的publish参数中一定要加上 :body-only t 否则就会生成完整的html文件,这不是我们想要的。
  4. 编写文章时,在头部添加front matter,如下
    #+BEGIN_HTML  ---  layout     : post  title      : 使用Github Pages服务建立个人博客  categories : IT  tags       : Github emacs org-mode Jekyll  ---  #+END_HTML  

而不需要其他信息,并在之后编写正文。

我的publish配置(仅供参考)

    (require 'org-publish)  (setq org-publish-project-alist        '(          ("org-linusp"           ;; Path to your org files.           :base-directory "~/blog/org/"           :base-extension "org"           ;; Path to your Jekyll project.           :publishing-directory "~/blog/Jekyll/"           :recursive t           :publishing-function org-publish-org-to-html           :headline-levels 4            :html-extension "html"           :body-only t ;; Only export section between <body> </body>           )          ("org-static-linusp"           :base-directory "~/blog/org/"           :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|php"           :publishing-directory "~/blog/Jekyll/"           :recursive t           :publishing-function org-publish-attachment           )          ("blog-linusp" :components ("org-linusp" "org-static-linusp"))          ))  

执行 org-publish-project 时,选择 blog-linusp 进行publish(按照我这个配置)。

尚存的问题

目前还存在以下问题:

  • 在emacs中使用 *#+begin_src* 插入的代码块背景色太浅导致有些部分看不清. (解决办法:修改css文件中pre的背景色为深色)
  • 在emacs中使用 *#+begin_quote* 插入的引用行间距很大而且有下划线,应该是博客主题 *The One* 的css导致的.
  • 在emacs中引用liquid语法的语句会被Jekyll解析而不能正确显示.
  • 分类页面和标签页面还存在问题 (如果您想使用本博客模板的话,建议使用初始模板).
  • 首页显示了每篇文章的全部内容,应当改成显示文章概要以处理像本文这样内容较多的文章.

如果您看了这篇文章并发现本文未描述出的一些问题,或者觉得我有可以帮上忙的地方,都可以发邮件给我

关于本博客

如果您够细心,应该会发现博客底端的脚注上的信息。在这里感谢PIZn ,本博客使用的就是他设计的主题 The One ,当然本人在该主题的基础上做了一定的修改并还会继续进行修改。此外还要感谢唐九军,他的结构清晰、简洁的博客模板让我对Jekyll博客的基础有了足够的了解。

脚注:

1 详情见维基百科的Github条目.

2 来自Using org to Blog with Jekyll.

简洁、轻便――静态博客写作方案


静态博客写作的优势

纯静态博客写作有以下优势:

  1. 响应速度快(访问时)

    博客站点页面都是静态页面,访问时不需要查询数据库,因此自然就能够有较好的响应速度。

  2. 最大限度的控制

    对于大部分静态博客写作方案而言,网站的每一个实现细节都是可以由自己来调整掌控的,这样虽然带来了一定的技术难度,但一来流行的解决方案在网上都有许多可用的模板,二来网站的可定制性非常高。

  3. 更好的写作体验

    在解决了网站的外观后,就可以体验静态博客写作的最大好处了。常见的静态博客写作方案都支持在本地编写文章,这样的优势是可以自行选用最合适最顺手的编辑器,而不是那些常见博客平台上简陋的在线编辑器。

  4. 更加方便进行备份

    静态博客写作方案都支持本地编写文章(甚至有的解决方案只能在本地编写文章),这样的好处是我们可以在本地有所有自己文章的一个备份,只要小心地使用你的计算机,这些数据就能够得到很好的保护,不放心的话还可以使用Dropbox之类的工具进行进一步的备份。

  5. 省钱

    我不是开玩笑的,待会你就知道了。

解决方案

大致有三种解决方案,且看我一一道来。

自购主机方案

如果能够有条件购买主机空间,那么这是最理想的。试想一下,都有自己的主机空间了,想怎么折腾不行是不?想用Wordpress就用Wordpress,想自己写html就自己写html。这种情况下如果还是想构建静态博客,参看下一个解决方案。

Github Pages

Github Pages的介绍以及使用它来建立个人博客的内容可以看我之前的一篇文章使用Github Pages服务建立个人博客 。使用Github Pages的好处是不用花钱购买自己的主机空间,这后面的Dropbox方案同样如此。

说到Github Pages,大部分人对其有所了解的人可能会第一时间联想到Jekyll。没错,Github Pages是在后端使用Jekyll来生成我们的静态博客,但我们在本地并不是只有Jekyll一个选择。

Jekyll是一个静态博客生成器,事实上还有很多其他静态博客生成器供我们选择——它们和Github Pages合作得很好,因为其中的一些就是为了和Github Pages适配而开发出来的。

此外还包括了一些基于某些静态博客生成器的框架也可以使用。

这里列举一些比较流行的静态博客生成器或者静态博客框架:

  • Jekyll

    Github Pages官方推荐产品,依赖ruby。

  • Jekyll-bootstrap

    基于Jekyll的框架,提供了几种现成的外观主题。

  • OctoPress

    基于Jekyll的框架,只用过短短几天时间,不予置评。

  • hexo

    由Node.js驱动的博客框架,功能强大、使用简单。

  • Pelican

    Python编写的静态博客生成器,对Python有爱的人不妨一用。

  • OpooPress

    一个基于Java 的可用于博客的静态网站生成器。

以上所有方案都支持Markdown语法。

Dropbox App

DropBox 是一款非常优秀的免费网络文件同步工具,它有以下几个优点:

  • 全平台支持
  • 稳定,不用担心宕机
  • 第三方应用丰富

前两个特点是对于现在的云存储服务来说并无特殊之处,Dropbox的强大之处就在于第三点。这里有一篇文章 讲述了Dropbox的“另类”功用。

文中第一条就是

使用Dropbox搭建一个网站或博客

没错,我们要的就是这个。

以下应用可以用于和Dropbox一起来搭建个人博客:

  • Scriptogr.am

    我尝试了一下Scriptogr.am,这里是我用它搭建的博客 。

    Scriptogr.am只要求用户编写Markdown格式的文章即可,除了通用的在本地编写文章外,Scriptogr.am还提供了一个非常简洁的后台管理界面,在那里可以管理文章、编写文章,此外还能修改网站的css和html源代码。

    网站的默认外观干净、清爽,不过除了首页外,只有一个Archive页面,可能稍显美中不足。

  • DropPages

    DropPages不同于Scriptogr.am,它会将网站的构成细节交由用户,用户可以自由地修改网站布局、外观等等,默认提供一个可用的主题,不过说实话,我不知道它用的是什么模板语言。

  • site44

    site44和DropPages类似,但也有不同之处,DropPages生成的应用目录下并不是网站的完整结构,而是一些用户可以修改的文件;site44则不一样,它将对应的应用目录下的文件作为网站来进行发布,相对来说site44的自由度更高一些——此外,site44默认只有一个index.html,所以要想有一个功能完整、丰富的博客,还得下点功夫,可以考虑用之前提到的静态博客生成器来做这件事情。

  • FarBox

    FarBox也是一款受到相关人群喜爱的Dropbox应用,其使用和Scriptogr.am类似,用户只要关心文章的撰写就可以了,至于外观,官方提供六种模板。相对Scriptogr.am来说,FarBox的后台管理功能更为强大,而且支持categories。另外,FarBox不仅可以和Dropbox一起使用,通过Google Drive同样可以利用FarBox进行博客写作。

    不知道是Bug还是什么,我在FarBox上写文时,插入的链接不能正常显示,看这里 ——我保证我遵守了Markdown的语法。

事实上相关的Dropbox应用不止上述四个,只不过这四个是比较常用的。

其他一些话

总的来说,可选的解决方案是很多的,选择何种方式就看自己喜好了,不过我想不应该太纠结于形式,一旦选定了一个平台,老实点多写点东西才是正道吧。

完。

2013年11月8日星期五

Re: 10个优秀 Google Code 代码项目


一些google开源的项目介绍

编程中,经常会用到一些开源库或者项目,比如c++中经常用到的boost。

google的主要软件架构基于linux,c,c++,java,而且作为一个创新型的公司,他们也经常性的回馈社区一些优秀的代码。在不断的反馈修改中,代码质量得到了提高,用户得到优质服务,这也算是双赢的结果。而且google里面牛人多,写出来的代码质量相对比较高,有很大的学习价值。

周末无事,搜索code.google.com/p,找到一些有趣的google参与的项目,在这里简单分享一下。有一些开源项目没有列出来,主要因为平台是linux-only或者对项目本身不感兴趣。如果想找完全列表,可以在这里看到: 
http://code.google.com/hosting/projects.html

另外也可以使用google这个label来搜索code.google.com/p,但是这样也许搜出来的并不一定是google开发的项目。

———————————-

http://code.google.com/p/omaha/

这是最新放出来的google update的代码,想做windows在线update功能的可以参考。(c++)

http://code.google.com/p/google-breakpad

http://code.google.com/p/google-glog/

breakpad,一个项目的开始需要做一些什么样的基础设施,crash dump和运行logging毫无疑问都是应该有的,这个项目就是负责在crash的时候收集信息,发出crash dump报告的。(c++)

glog就是用于项目中logging功能的,一般桌面程序不太需要logging,但是对于大规模长时间服务的系统来说,logging功能一定要有,而且要记录足够多的信息。(c++)

http://code.google.com/p/protobuf/

protocol buffer,可以用来在跨进程、跨机器,不同操作系统,不同编程语言之间进行数据交换。类似于微软的COM IDL或者XML,但是解析速度更快,需要传输字节数更少。(c++, java, python)

http://code.google.com/p/chromium/

google chrome浏览器项目,基于webkit,想自己开发个浏览器,学习这个吧。(c++)

http://code.google.com/p/google-perftools/

TCMalloc,heap检测,是一个google用于性能检测的工具。(c++)

http://code.google.com/p/jaikuengine/

jaiku是被google收购的微博客服务,类似twitter,但是google买下了以后没有什么动作。在将jaiku移植到appengine平台以后就做出了开源而且不再继续开发的决定,jaiku也就这样了。当然,幸福的还是我们这些程序员。(python)

http://code.google.com/p/googleappengine/

这个只是appengine在桌面进行测试运行的项目,相比google服务器上的appengine,肯定还是有着相当大的区别。不过我们也可以从中学到google对于python的使用,不是么?(python)

http://code.google.com/p/v8/

google chrome浏览器中的javascript引擎项目。可以单独用作解析javascript,号称速度非常快。(c++)

http://code.google.com/p/app-engine-site-creator/

使用appengine建立企业及个人网站的朋友,可以试试这个项目。(python)

http://code.google.com/p/googlemock/

http://code.google.com/p/googletest/

测试框架组合,mock怎么用实话说我也不清楚。

http://code.google.com/p/google-styleguide/

google c++编码规范,可以学习学习,网上有中文版的了。

http://code.google.com/p/google-email-uploader

outlook邮件上传到gmail,可以学学c#

sourceforge 优秀 开源 项目 介绍


sourceforge优秀项目介绍之一:PowerFolder 文件同步

sourceforge优秀项目介绍之二:MindTouch 数据共享

sourceforge优秀项目介绍之三:Ehcache 分布式缓存

sourceforge优秀项目介绍之四:Hyperic HQ 企业监管

sourceforge优秀项目介绍之五:Firebird 数据库引擎

sourceforge优秀项目介绍之六:Barcode4J 条形码生成器

sourceforge优秀项目介绍之七:Openbravo 企业项目管理

sourceforge优秀项目介绍之八:Inkscape 向量绘图

sourceforge优秀项目介绍之九:Scorched 3D 游戏

sourceforge优秀项目介绍之十: Art of Illusion 图像处理

sourceforge优秀项目介绍之十一: Zenoss Core 企业IT管理

sourceforge优秀项目介绍之十二: FreeCol 回合制策略

sourceforge优秀项目介绍之十三: ICEcore 开放团队协作软件

sourceforge优秀项目介绍之十四: FreeNAS 操作系统

sourceforge优秀项目介绍之十五:Pentaho-商务智能

sourceforge优秀项目介绍之十六:openQRM 开源系统管理

sourceforge优秀项目介绍之十七:Sahana 赈灾管理系统

sourceforge优秀项目介绍之十八:Stellarium 模拟星空

sourceforge优秀项目介绍之十九: FreeMind 思维导图

sourceforge优秀项目介绍之二十:NSIS "Nullsoft 脚本安装系统"

sourceforge优秀项目介绍之二十一:FCKeditor 文本编辑器

sourceforge优秀项目介绍之二十二:NHibernate ".Net的Hibernate实现"

sourceforge优秀项目介绍之二十三:MediaWiki 维基百科

sourceforge优秀项目介绍之二十四:MinGW " GNU工具集合"

sourceforge优秀项目介绍之二十五:JasperReports 报表制作

sourceforge优秀项目介绍之二十六:Nagios 监视服务

sourceforge优秀项目介绍之二十七:WinSCP 文件传输

sourceforge优秀项目介绍之二十八:phpMyAdmin 数据库管理

sourceforge优秀项目介绍之二十九:JBoss 服务器

sourceforge优秀项目介绍之三十:FileZilla"FTP客户端软件"

sourceforge优秀项目介绍之三十一:OGRE 三维仿真

sourceforge优秀项目介绍之三十二:Net-SNMP "BSD系统"

sourceforge优秀项目介绍之三十三:phpBB "论坛系统"

sourceforge优秀项目介绍之三十四:SugarCRM "关系管理"

sourceforge优秀项目介绍之三十五:MegaMek "Java游戏"

sourceforge优秀项目介绍之三十六:TUTOS"生命周期管理"

sourceforge优秀项目介绍之三十七:Gallery 图片管理

sourceforge优秀项目介绍之三十八:magento 电子商务系统

sourceforge优秀项目介绍之三十九:OpenOffice.org 办公软件

sourceforge优秀项目介绍之四十:Audacity 音频编辑

sourceforge优秀项目介绍之四十一:TortoiseSVN

sourceforge优秀项目介绍之四十二: OpenNMS 网络管理

sourceforge优秀项目介绍之四十三:concrete5 内容管理

sourceforge优秀项目介绍之四十四:OpenSwing 开源框架

sourceforge优秀项目介绍之四十五:Notepad++ 代码编辑器

sourceforge优秀项目介绍之四十六:Shareaza"P2P软件"

sourceforge优秀项目介绍之四十七:OrangeHRM 人力资源管理

sourceforge优秀项目介绍之四十八:TinyMCE 编辑器

sourceforge优秀项目介绍之四十九:ZK 'Ajax框架'

10个优秀 Google Code 代码项目


以下为您推荐10个来自Google Code的优秀代码项目,它们可以在网页设计与制作、站点优化、SEO等方面对站长和博主们有很大帮助。它们是ZeroClipboard、 yourls、Minify、Thematic、Flexlib、Zen Coding、Sexybuttons、jQuery transmit、dompdf、stop-spam。

ZeroClipboard

10个优秀 Google Code 代码项目 033f5d205b96aadc thumb

在IE6时代,复制到剪贴板非常简单。但是如今Firefox等浏览器出于安全考虑,默认禁止直接访问剪贴板。对于某些必须具备访问剪贴板能力的网站,通 过使用强大的Javascript和Flash文件,ZeroClipboard可以让你绕过浏览器的限制。可以访问Coupons For Bloggers网站,看看实际效果。

访问:ZeroClipboard

yourls

10个优秀 Google Code 代码项目 c3947ac52f5c695e thumb

我们经常需要通过微博客分享自己博客的文章给朋友,但是微博客每条信息只允许140个字符。为了获得短网址,你可以使用网址缩短服务,或者使用 yourls创建你自己的短网址服务。Yourls使用PHP制作且易于配置。而且yourls已经推出了它自己的WordPress插件。

访问:Yourls

Minify

10个优秀 Google Code 代码项目 3ee2571d6b82f291 thumb

Minify可以按需对JavaScript以及CSS文件进行合并、压缩以及缓存,以加快页面的载入速度。而安装minify则极其简单,只需在网站根 目录下上传程序目录即可。

访问:Minify

Thematic

10个优秀 Google Code 代码项目 574b1894b8133029 thumb

WordPress不仅提供丰富的主题,还提供主题框架用来管理一组外观和功能类似的分类主题,通过添加子主题,可以对外观和功能进行扩展。商业主题框架 也有很多,但是Thematic完全免费。

访问:Thematic

Flexlib

10个优秀 Google Code 代码项目 48a8b799a7d89412 thumb

Flexlib是一个开源的Adobe Flex的库,提供了许多组件,你可以在你的Flex或Air项目中随意使用。目前可以使用的组件包括:dvancedForm, Base64Image, EnhancedButtonSkin, CanvasButton, ConvertibleTreeList, Draggable Slider, Fire, Highlighter, HorizontalAxisDataSelector IconLoader, ImageMap, PromptingTextArea, PromptingTextInput, Scrollable Menu Controls, SuperTabNavigator, Alternative Scrolling Canvases, Horizontal Accordion, TreeGrid, FlowBox, Docking ToolBar, and Flex Scheduling Framework.

访问:
Flexlib

Zen Coding

10个优秀 Google Code 代码项目 c520d91d68fd2110 thumb

网页开发者通常要输入大量重复的标签和属性标记才能获得想要的效果,为了解决重复劳动的痛苦,Sergey Chikuyonok开发了Zen Coding,它是一组专门用来提高书写HTML和CSS代码速度的便利工具。将它整合进文本编辑器,可以提供一些功能和快捷方式,加快开发速度。
例如,下面这段内容

div#content>h1+p

相当于输入:

<div id=”content”>
<h1></h1>
<p></p>
</div>

Smashing Magazine上有一篇关于Zen Coding不错的文章,感兴趣的可以去了解一下。

访问:Zen Coding

Sexybuttons

10个优秀 Google Code 代码项目 13b16a5eb774f26f thumb

不善于网页编程和开发的普通人士通过借助一些编译好的代码包可以快速得到自己想要的效果。Sexybuttons是个小巧的CSS框架,可以为博客,网站 以及网络应用创建出华丽的按钮。另外还有《十大CSS按钮教程列表》可供阅读。

访问:Sexybuttons

jQuery transmit

10个优秀 Google Code 代码项目 584b1ce72c615861 thumb

jQuery这个非常方便的Javascipt框架可以让开发者增强网站的设计和可用性。在Google Code上有许多非常酷的jQuery插件,这款插件对文件上传功能的开发非常有帮助。它将繁琐的上传对话框简化为下面这段代码:

$(document).ready(function() {
var options = {
allowedFileTypes: [{
description: "Images",
extensions: "*.jpg; *.gif; *.png"
}]
};

$(”#transmit”).transmit(”http://mysite.com/upload/“, options);
})

访问:jQuery Transmit

dompdf

10个优秀 Google Code 代码项目 2d4d2b572f8b1c16 thumb

dompdf是一个网页到PDF格式的高级转换工具,它可以下载和读取CSS,和含有内置样式的标签,以及单个HTML元素的样式属性。它也支持大多数可 视的HTML属性。

访问:dompdf

stop-spam

10个优秀 Google Code 代码项目 30463b8ff5d534d3 thumb

除了WordPress平台的Akismet插件以外,Stop-spam也是一个轻量级的选择。这款垃圾信息过滤插件可以与主流博客和论坛程序相兼容 (WordPress,PhpBB,MovableType等),安装也很简单。它会自动将一些垃圾信息发送者的域名和IP地址列入黑名单。当然,你也可 以编辑黑名单和白名单。

访问: stop-spam