发表时间
评论 没有

Github 是现在知名的软件/程序员集散地。任何人可以免费注册一个帐号,然后使用基于网络的Git软件托管服务。服务分为两种:收费的似有库(软件)和免费的开源库(软件)托管。

GitHub 鼓励开源。那么,如何参与到开源软件开发中呢?也就是贡献代码。通常的流程如下:

第一步:将您看中的软件复制(GitHub 叫做 Fork)自己的库中,例如:

https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git

Fork 后成为

https://github.com/YOUR_USERNAME/YOUR_FORK.git

那么,您就拥有了跟源程序库完全一样的一份备份,这份程序归您所有,是您开发的代码基地。

第二步:将GitHub上您的代码库复制到本地计算机上,

git clone git@github.com:hfl/sinatra.git

任意修改,知道满意为止,再将您修改的代码再推送到GitHub。

第三步:将修改好的代码向原程序库做一个推送请求,等待原程序主管开发人员批准后将代码汇入源程序即完成了一个贡献循环。

这看似正常的过程其实存在着几个问题:

  1. 我们在修改代码的时候如果别人提前修改了我要修改的代码怎么办?
  2. 我怎么才能获得别人的修改?毕竟我只是帮忙,不是专职,有可能很长时间我不会关注该软件,而想关注的时候,我的代码竟然还是我 Fork 时候的样子,没有自动更新!
  3. 如果我只是想做一个单独的分支,而且不想破坏原来的程序怎么办?

由于以上问题,其实上面的贡献代码步骤就需要稍作调整:

同步源

在复制到自己的计算机上后,要添加上游分支的同步源,这是为了随时保持本地程序原程序随时同步。

git remote -v

如果显示的是:

origin  https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
origin  https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)

那么需要增加上游原

git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git

再次验证

git remote -v
origin    https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
origin    https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)
upstream  https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch)
upstream  https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push)

上游源已经添加成功了。接下来,如果需要更新本地源与上游源同步:

git fetch upstream
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
 * [new branch]      master     -> upstream/master

上游源已经同步到 upbstream/master ,然后需要同步本地 master 分支:

git checkout master
Switched to branch 'master'
git merge upstream/master
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

如果您的本地分支同上游分支没有任何冲突,那么 Git 将使用“快速合并”(fast-forward):

git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

现在,随时都有同上游分支完全一样的分支了。

不要或者少动主分支 master

最好使用一个工作分支,做完开发在合并到主分支。

作者
分类

发表时间
评论 没有

天生爱折腾,导致网站系统崩溃!

经过一番整理,前面的文章得以保留,但是日期就不再转发了。

喜欢 Textpattern 很长时间了,喜欢她的简洁、优雅以及对信息有条不紊的组织,甚至很多人不喜欢或者不用她的原因——默认使用 Textile 标记语言记录文字——我都很喜欢,因为这很不利于对于他人文章的直接转载,更利于原创!

Textpattern 很小众,但是不等于没有粉丝,例如在 We Love TXP 就有很多帅气到爆的网站,这里的网站使用者都属于 TXP 的铁粉。

Textpattern 出道多年,但是一直不温不火,或许是源于其高冷气质, TXP 的几位主创也是很拼的,研发软件、写书、建站,一系列的 Textpattern 周边产品一应俱全, Textpattern 的生态圈就这样自成系统。

当然,我对于 Textpattern 也仅仅是初步了解和简单使用,更深层次的了解还在努力中……

作者
分类

发表时间
评论 没有

作为一个非专业的程序员,拥有一款舒心的编辑器是很有必要的。

从开始编程序,我大概用过这些编辑器:

  • 用 FrontPage:编辑网页,仅仅是网页;
  • DreamWeaver:编辑网页,编写JSP;
  • Windows 记事本:编写Java程序以及其他需要严格使用Unicode的程序;
  • JCreator:编写Java程序和JSP;
  • JEditor:编写Java程序和JSP;
  • Netbeans:编写Java程序和JSP,但是太大了,当时计算机配置低,没有多使用;
  • Eclipse:编写Java程序和JSP,但是太大了,当时计算机配置低,没有多使用;
  • NotePad++:可以编写各种程序,确实是程序员的“匕首”;
  • Vim:转战Linux系统,开始使用Vim,但是没有大规模长时间使用;
  • Gedit:类似于记事本,但是通过定制之后,类似于NotePad++,无往而不胜啊;
  • Sublime Text:非常好用,但是在Linux上对于汉文的支持很差,而这在很多时候又是避不开的,所以在Linux上弃用;
  • Geany:类似与Gedit,通过安装插件定制之后,也很好用;
  • Atom:Github推出的可定制的21世纪的编辑器,好用;

经过这么多选择之后,还是很难说哪个编辑器就是最好的编辑器,只能是根据使用情况,根据个人爱好,你可以选择最适合你的那款编辑器。例如输入一些很简单的东西,记事本、Gedit就可以胜任;Vim可以胜任各种情况,前提是你对她够熟悉,定制够到位;而一些大的编辑器,甚至不能叫做编辑器了,是一种大规模的程序开发软件,例如Eclipse和Netbeans更适合规模化开发。

所以,萝卜白菜,各有所爱,选择最适合你的——才是最好的。

作者
分类

发表时间
评论 没有

前面曾经简单介绍过 ISBN ,关于ISBN的校对,有新码和旧码两种校对方法:

  • 新码的校对方法:取前12位数字,将奇数位乘以1,偶数位乘以3,然后将12个积加到一起除以10得到余数,再用10减去余数,得到的数字即为校验数(第12位);
  • 旧码的校对方法:取前9位数字,依次乘以10,9,8,7,6,5,4,3,2,然后将乘积相加除以11得到余数,再用11减去余数,如果得到10,校验位(第10位)应该是X;如果得到11,校验位应该是0,其他的得到几即为几;

这是Ruby写的校验方法(isbn.rb):

def check_isbn(isbn)
  # delete all - from isbn string
  isbn = isbn.gsub(/-/,"")
  sum = 0
  # new isbn
  if isbn.length == 13
    for i in 0..11
      if isbn[i].to_i.odd?
        sum += isbn[i].to_i * 1
      else
        sum += isbn[i].to_i * 3
      end
    end
    if 10 - sum%10 == isbn[12].to_i
      return true
    else
      return false
    end
  # old isbn
  elsif isbn.length == 10
    for i in 0..8
      sum += isbn[i].to_i * (10 - i)
    end
    if 11 - sum%11 == 10 and isbn[9] == "X"
      return true
    elsif 11 - sum%11 == 11 and isbn[9] == "0"
      return true
    elsif 11 - sum%11 == isbn[9].to_i
      return true
    else
      return false
    end
  else
    return false
  end
end

if check_isbn(ARGV[0])
  puts 'yes'
else
  puts 'wrong'
end

运行 ruby isbn.rb 978-7-2343-266-3 即可得到校对结果。

作者
分类

发表时间
评论 没有

Rails开发中,需要使用远程主机Oracle数据库,本来以为很简单,没想到需要这么多周折:

安装链接适配器程序

需要对应的数据库适配器程序,到GitHub上很容易找到人气很高的 oracle-enhanced ,因为我使用的是Rails 4.2 ,所以,按照要求在Gemfile中加入

gem 'activerecord-oracle_enhanced-adapter', '~> 1.6.0'

安装顺利,然后运行应用程序 rails s 测试,结果出错:

bin/rails:6: warning: already initialized constant APP_PATH
/path_to_my_app/bin/rails:6: warning: previous definition of APP_PATH was here
Usage: rails COMMAND [ARGS]

The most common rails commands are:
 generate    Generate new code (short-cut alias: "g")
 console     Start the Rails console (short-cut alias: "c")
 server      Start the Rails server (short-cut alias: "s")
 dbconsole   Start a console for the database specified in config/database.yml
             (short-cut alias: "db")
 new         Create a new Rails application. "rails new my_app" creates a
             new application called MyApp in "./my_app"

In addition to those, there are:
 destroy      Undo code generated with "generate" (short-cut alias: "d")
 plugin new   Generates skeleton for developing a Rails plugin
 runner       Run a piece of code in the application environment (short-cut alias: "r")

All commands can be run with -h (or --help) for more information.

很奇怪的错误信息,经过网络搜索后,发现 这篇文章 ,说是需要运行 rake rails:update:bin ,运行后提示:

rake aborted!
LoadError: ERROR: 'cannot load such file -- oci8'. ActiveRecord oracle_enhanced adapter could not load ruby-oci8 library. You may need install ruby-oci8 gem.
/home/hfl/library/imulib/config/application.rb:7:in `<top (required)>'
/home/hfl/library/imulib/Rakefile:4:in `<top (required)>'
LoadError: cannot load such file -- oci8
/home/hfl/library/imulib/config/application.rb:7:in `<top (required)>'
/home/hfl/library/imulib/Rakefile:4:in `<top (required)>'
(See full trace by running task with --trace)

需要安装 ruby-oci8

安装 ruby-oci8

gem install ruby-oci8

出错:

Fetching: ruby-oci8-2.2.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing ruby-oci8:
	ERROR: Failed to build gem native extension.

checking for load library path... 
  LD_LIBRARY_PATH is not set.
  checking ld.so.conf... no
checking for cc... ok
checking for gcc... yes
checking for LP64... yes
checking for sys/types.h... yes
checking for ruby header... ok
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--with-instant-client
	--without-instant-client
---------------------------------------------------
Error Message:
  Set the environment variable ORACLE_HOME if Oracle Full Client.
  Append the path of Oracle client libraries to LD_LIBRARY_PATH if Oracle Instant Client.

提示需要设置 ORACLE_HOMELD_LIBRARY_PATH ,这是什么东西呢?经查,原来需要在使用Oracle的Rails应用服务器上安装客户端 Oracle Instant Client,到 这里 下载(下载还需要注册登录一下)。

下载完毕,安装见说明:

1. Download the desired Instant Client ZIP files. All installations require the Basic or Basic Lite package. 

2. Unzip the packages into a single directory such as "/opt/oracle/instantclient_12_1" that is accessible to your application.

3. Create the appropriate libclntsh.so and libocci.so links for the version of Instant Client. For example:

cd /opt/oracle/instantclient_12_1
ln -s libclntsh.so.12.1 libclntsh.so
ln -s libocci.so.12.1 libocci.so

4. Set the environment variable LD_LIBRARY_PATH to the directory created in Step 2, for example:

export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_1:$LD_LIBRARY_PATH

Alternatively, add this path to an ldconfig configuration file if there is no other Oracle software that will be impacted.

5. To use supplied binaries such as SQL*Plus, update your PATH environment variable, for example:

export PATH=/opt/oracle/instantclient_12_1:$PATH

6. Start your application.

安装完毕,再次安装ruby-oci8,又报错了:

LoadError: You need to install libaio.so.1. Run 'apt-get install libaio1'.

需要安装 libaio1

sudo apt-get install libaio1

然后在安装 ruby-oci8 ,成功!

运行 rails s 还是出开始运行应用服务器时出现的错误,运行 rake rails:update:bin ,提示

Warning: NLS_LANG is not set. fallback to US7ASCII.
       exist  bin
   identical  bin/bundle
    conflict  bin/rails
Overwrite /home_to_app/bin/rails? (enter "h" for help) [Ynaqdh] Y
       force  bin/rails
    conflict  bin/rake
Overwrite /home_to_app/bin/rake? (enter "h" for help) [Ynaqdh] Y
       force  bin/rake
   identical  bin/setup

两次Y之后,可以运行应用服务器了。

作者
分类

← 较早的 较新的 →