最近一直在为 Golang Wiki 选择维基引擎,最开始选择的是 DokuWiki 与 MoinMoinWiki ,前者是因为它足够的简单,后者是因为个人对 Python 的喜爱,然后,在网上找寻的过程中知道了 Instiki Wiki Engine,基于Ruby,它让我眼前一亮的是内置的 SVG编辑器 以及 Slideshow功能 ,尤其是前者,太爽了,所以,现在也在自己的本地测试与试用这个系统了。

简单的特性介绍 - Introduction to Instiki

Instiki 提供了基于 itex2MML 的对数学公式的支持,但是要求文本格式为系统默认的 “Markdown + itex2MML” 格式。同时,在每一个维基页面底部都有一个名为 “TeX” 的链接,用户可以通过它将内容导出为 LaTex 格式,不过这个我还没有测试过导出来的文档是不是对中文也很友好。

最让我眼前一亮的就是 “SVG编辑器以及直接将SVG图片插入内容中“ 的功能,它使使得我们可以在编辑内容的时候直接打开一个SVG图片编辑器,完成图片编辑之后,可以选择保存至本地图片库或者远程图片库(这需要提供相关图片库的帐号),更简单的,是可以直接将编辑后的图片插入文本内容中,因为SVG可以使用纯文本描述,所以我们根据就不需要将它保存为文件,如果选择直接插入SVG图片代码,我们还是可以再修改它的,办法就是把整个SVG代码选中,创建SVG图片的按钮就会变成编辑已有图片,点击它就会载入选中的图片进行编辑。

另外一个很不错的功能(但是有可能我会用不着),就是对数据公式的支持(可以说是完美的支持),它并不将我们的公式转为图片,而是使用的MathJax库,以文本的方式展示公式,这个有机会使用得到的时候再好好的去研究一下下。

一个 Instiki 实例可以创建无数个维基站点(在 Instiki 中称之为 “Webs”),每一个站点又都可以被设置为密码保护(使用独立的密码),如果你愿意,还可以将一个密码保护的站点发布一份“只读(Read-Only)”版权,这样其它人可以读取它的内容但是无法对其做出任何修改。

安装与系统需求 - Install & Requirements

在我写这篇文章时,它要求Ruby版本为 1.8.6、1.8.7或者1.9.2,Rubygems版本为 1.3.6或者更高的版本。

Mac OS X - Leopard, Snow Leopard 以及 Lion

Ruby 1.8.7 以及 Rubygems 是跟随开发者工具套件(Developer Tools) 一起被安装的,该套件现在已经可以在 App Store 上面直接下载到,只需要你有一个 Apple ID 即可,在苹果电脑上面安装 Instiki 需要该套件的支持,如果你没有安装,需要先安装它,这根据你的网速可能需要一些时间,尤其是在国内网络情况并不太理想的前提下。

首先将 Rubygems 升级到最新版本:

sudo gem update --system
sudo gem update

如果你的 Rubygems 版本过老的话,可能上面的命令无法成功执行,这需要你手工升级它,详情请移步这里:http://rubygems.org/pages/download ,之后你就可以安装 Instiki 了,关于如何在 Tiger 上面的安装 Instiki ,请移步这里:http://golem.ph.utexas.edu/wiki/instiki/show/Installing+under+MacOSX+Tiger

Linux

在 Debian 或者 Ubuntu 上面安装Instiki,你可以执行下面这行命令安装一些需求包(我安装的时候因为被SVG编辑器完全吸引了,而忘记了安装说明,最后是自己一次一次出错才成功安装的,每出一次错补装一个需求包):

$ sudo apt-get install ruby ruby1.8-dev libopenssl-ruby rake rubygems libsqlite3-ruby1.8 ri1.8 libxslt-dev libxml2-dev libsqlite3-dev swig flex bison

如果你的机器上面都有这些了,那就没必须再安装了,我的电脑上面就是没有 libxslt-ruby 、libsqlite3-dev 以及 libxml2-dev 。

如果你使用的是 Febora 的话,则可以执行下面这行命令来完成需求包的安装:

$ yum install make ruby ruby-devel rubygems sqlite sqlite-devel swig flex bison

然后还需要执行下面这行命令来创建一个软链接:

$ ln -s /usr/lib/libsqlite3.so.0.8.6  /usr/lib/libsqlite3.so
注意 :如果你得到下面这样一个错误信息:

install_gem_spec_stubs': undefined method `loaded_specs' for Gem:Module (NoMethodError)

那表示你的 Rubygems 版本过低,你可以通过下面这两人行命令升级它:

sudo gem install rubygems-update
   sudo update_rubygems

CentOS 是一个 RedHat 家族的Linux发行版,所以,你可以直接像 Fedora 一样做,只是有已知的有两个不一样的错误可能会发成在CentOS上面:

  1. /dev/null is not world-writable ,你需要:
    chmod 777 /dev/null
  2. /dev/urandom is not a "special character device.” ,你需要:
    rm /dev/urandom
    mknod -m 644 /dev/urandom c 1 9
    chown root:root /dev/urandom

对于这上面这个解决办法,你可能需要写进自启动脚本中,因为我们现在所作的任何修改,在系统重新启动之后都会失效。

Windows 系列

饿……没什么想法,我从来不认为这些软件应该被安装在Windows 系统之上,所以,如果你真的有这样的需求,自己去找解决办法吧……

安装 Instiki - Install Instiki

从 http://rubyforge.org/frs/?group_id=186 下载 Instiki 的最新版并解压,如果你想试用最新的开发版本,则可以下载 http://golem.ph.utexas.edu/~distler/code/instiki-svn.tar.gz ,不过开发中的版本可能存在很多的Bug,但是Instiki一直使用的都是开发中的版本,所以,如果有Bug的话,应该也是能在第一时间得到解决的。

如果你选择开发版,你还可以使用 bzr :

bzr branch http://golem.ph.utexas.edu/~distler/code/instiki/svn/ location-of-Instiki/

或者使用 Git :

git clone http://github.com/parasew/instiki.git location-of-Instiki/

之后如果要更新开发版本,只需要使用 [bzr pull]golem.ph.utexas.edu/wiki/instiki/show/Bazaar 或者git pull 即可。

注意 :安装时请讲上面两人行命令中的 location-of-Instiki/ 修改成为你要安装它的目录,同时保证整个路径中没有空格。

运行 Bundler 并启动你的 Instiki 之旅 - Running Bundler and starting Instiki

如果上面的安装或者取得文档都没有错误发生,那么可以在你的 Instiki 主目录中运行下面这行命令了:

ruby bundle install --path vendor/bundle

这将下载并安装其它的一些需求包(sqlite3-ruby/itextomml等),最后:

./instiki --daemon

将启动 Instiki。

打开你的浏览器,并在地址栏中输入:http://localhost:2500 并设置你的第一个维基站点,这很简单,只需要填写维基的名称以及路径和管理它的密码即可。

维护 - Care and Feeding

你可以通过下面这行命令停止 Instiki

% kill pid-of-Instiki

然后 Instiki 还提供了很多的命令行工具用来维护与保养你的 Instiki。

运行:

./instiki

将使用 Mongrel(如果你安装了的话)或者 WEBrick 启动 Instiki,如果你已经安装了 Mongrel,但是却还是想通过 WEBrick 启动 Instiki的话,需要给上面的命令加上 webrick 参数:

./instiki webrick

但是这样的方式启动的 Instiki 将直接在前端运行,所以当你退出终端或者键入 Ctrl + C 之后就会立马停止,如果你想在后端运行,那么你需要像前面那样运行:

./instiki --daemon

或者:

./instiki webrick --daemon

下面还有一些其它的命令行标记:

  • -d, –daemon :以守护进程的方式运行 Instiki
  • -p, –port=Port :定义Instiki监听的端口,默认端口号为 2500
  • -b, –binding=1p :绑定 Instiki 到特定的地址,默认监听 0.0.0.0,即监听所有地址
  • -c, –config=file :使用一个特定的配置文件
  • -u, –debugger :启用Debug模式
  • -e, –environment=name :设定服务器运行的模式(test/development/production),默认为产品模式,即 production
  • -P, –path=/path :绑定一个URL路径给Instiki,默认为 /
  • -h, –help :显示帮助信息,并列出可用的命令

为 Instiki 优化的主机服务 - Dreamhost

Dreamhost 总是为这些开源软件进行各种各样的优化,同样的,在DreamHost上面安装并运行 Instiki 也是十分简单的一件事情,DreamHost 通过 mod_rails 对 Ruby-on-Rails* 提供支持,唯一不足是它只提供了老版本的 sqlite3。

  1. 在DreamHost上面创建一个新的域名虚拟主机(比如 wiki.matrixstack.com)
  2. 在 Specify your web directory 选项中选中 Ruby on Rails Passenger(mod_rails) 选项,并填写路径wiki.matrixstack.com/public

这会在你的家目录中创建一个名为 wiki.matrixstack.com 的目录,登陆 Shell 然后执行下面这些命令:

cd wiki.yourdomain.com
wget http://golem.ph.utexas.edu/~distler/code/instiki-svn.tar.gz
tar --strip-components 1 -xzf instiki-svn.tar.gz
sed '/sqlite3-ruby", :r/s//sqlite3-ruby", "~>1.2.0", :r/' Gemfile > Gemfile.tmp
mv Gemfile.tmp Gemfile
unset GEM_HOME GEM_PATH
ruby bundle

打开浏览器并访问 http://wiki.matrixstack.com对维基进行设置即可。

升级已有的 Instiki 安装

Instiki 的开发还处于活跃期,经常会有新功能被添加或者Bug被修补,所以你肯定时常想升级你现有的Instiki安装,如果你通过 Bazaar 安装,那么:

  1. 运行
    % bzr pull

    或者
    % git pull
  2. 进行所有需要的升级
    % ruby bundle update
    % ruby bundle exec rake upgrade_instiki
  3. 重新启动 Instiki
    % ps -ax | grep instiki
    % kill PID-of-Instiki
    % ./instiki --daemon

如果你是通过 tarball 安装的,那么:

  1. 备份所有上传的文件,它们被保存在 webs/Name-Of-Web/files/ 目录中
  2. 如果你使用默认的 SQLite3 数据库,则需要备份它,它位于 db/production.db.sqlite3 ,如果你使用的是MySQL,则需要备份 config/database.yml 文件
  3. 停止 Instiki
    % ps -ax | grep instiki
    % kill PID-of-Instiki
  4. 下载并解压最新版本
  5. 将第 1 与第 2 步备份的文件重新恢复到对应的目录中
  6. 运行
    % ruby bundle update
    % ruby bundle exec rake upgrade_instiki
  7. 重新启动 Instiki
    % ./instiki --daemon

完成 Instiki 的升级。

安全相关 - Security

软件再好也不可能达到完美的安全,要不然也不会有人站出来说:“永远不要相信用户的输入”了。

以非特权用户运行 Instiki

如果你是一个具有服务器特权的用户,那么我不建议你直接以该用户的身份运行 Instiki,你可以创建一个新的无特权的用户来运行:

  1. 创建一个无特权的没有 shell 访问权限的新用户,我这里就创建一个 instiki 用户
  2. 让该用户仅仅只能访问以下这些必须的文件:
    % sudo chown instiki public secret db db/production.db.sqlite3 config/environment.rb config/database.yml
    % sudo chown -R instiki log storage cache webs tmp
  3. 以 instiki 用户的身份运行 Instiki:
    % sudo -u instiki ./instiki --daemon
  4. 在这种情况下,你可以通过下面这种方式停止 Instiki
    % sudo -u instiki kill pid-of-Instiki

使用 MySQL 数据库替换默认的 SQLite

如果你使用 Sqlite 已经运行你的Instiki一段时间,现在计划转到 MySQL 数据库上去,那么你可以这样做:

  1. 确定你现在运行的Instiki版本大于 0.19,然后执行下面这行命令:
    % ruby bundle exec rake upgrade_instiki

    这会升级你的数据库Schema到最新版本,老版本的数据库Schame可能导致在SQLite3⇒MySQL的转换过程中数据的丢失。
  2. 在 Gemfile 文件的最后面添加下行这一行:
    gem "mysql"

    然后重新执行:
    % ruby bundle

    这将为你安装好 Mysql Gem
  3. 在你的系统环境变量中添加一个新的变量:
- 如果你使用的是 sh ( bash, zsh 等):

        % RAILS_ENV='production'

- 如果你使用的是 csh (tcsh 等):

        % setenv RAILS_ENV production
  1. 导出你的文件至 dump/fixtures/.yml*
    % ruby bundle exec rake db:fixtures:export_all
  2. 编辑 config/database.yml ,并修改:
    production:
       adapter: sqlite3
       database: db/production.db.sqlite3

    为:
    production:
      adapter: mysql
      database: your_db_name
      username: your_db_username
      password: your_db_password
      host: 127.0.0.1
      port: 3306
  3. 创建一个新的MySQL数据库,数据库信息与你上面填写的一保持一致:
    % echo "create database your_db_name" | mysql -u your_db_username -p your_db_password
  4. 初始化你的数据库表并导入你的数据:
    % ruby bundle exec rake db:migrate
    % ruby bundle exec rake db:fixtures:import_all

大小写敏感问题

这里可能还有一个小问题需要你注意一下下,那就是在 SQLite3中,字符串是大小写敏感的,这也就是说你可以有一个页面的名称为 Foo ,而另一个页面的名称为 foo ,这使得 Instiki 会将它们分开对待,但是在 MySQL 下面,这个正好是相反的,字符串默认是大小写不敏感的。

这并没有哪一种方法可以说是绝对正确的,只们只是对待事物的方式不一样而已,如果你想在MySQl数据库中也对页面的名称大小写敏感,你可以单独的通过SQL命令修改受该问题影响的字段,根据你自己数据库的字符集编码选择下面命令中的任何一种即可:

ALTER TABLE `pages` MODIFY `name` varchar(255) COLLATE latin1_bin DEFAULT NULL;
ALTER TABLE `wiki_references` MODIFY `referenced_name` varchar(255) COLLATE latin1_bin NOT NULL DEFAULT '';
ALTER TABLE `wiki_files` MODIFY `file_name` varchar(255) COLLATE latin1_bin NOT NULL;

或者

ALTER TABLE `pages` MODIFY `name` varchar(255) COLLATE utf8_bin DEFAULT NULL;
ALTER TABLE `wiki_references` MODIFY `referenced_name` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '';
ALTER TABLE `wiki_files` MODIFY `file_name` varchar(255) COLLATE utf8_bin NOT NULL;

标签: none

评论已关闭