scala的hello world

手痒,捡起scala这把牛刀耍耍相对erlang,scala提供了OO风格,静态类型检查和自定义plugin,是一把好牛刀我们今天用它来杀杀小鸡。安装环境是很普通的xp,jdk1.6。不选择编译好的集成安装版,我们从源码自己编辑,这样看起来比较拉风。

安装

svn上checkout到D:scala,checkout源是:

http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk

然后用ant编译,如果没有安装好ant,需要先安装一下,

先设置环境变量,假设你的JDK已经配置好,从
下载ant解压在D:ant目录下,设置一下系统环境变量


ANT_HOME=D:ant

PATH=%PATH%;%ANT_HOME%bin
设置好环境编辑,进入D:scala目录,执行
ant

遇到错误

[scalacfork] Could not reserve enough space for object heap

内存太小了,不够jvm用,把jvm可用内存调小。打开 build.xml,找到
<property name=”env.ANT_OPTS” value=”-Xms512M -Xmx1536M -Xss1M -XX:MaxPermSize=128M” />
改成
<property name=”env.ANT_OPTS” value=”-Xmx1024M ” />

继续

ant
第一次用ant编译程序,明显不如gnu make这么拉风,跑半天屏幕上的文字都不滚一下。

最终结果是这样:

BUILD SUCCESSFUL
Total time: 17 minutes 9 seconds

看来静态语言写程序是很痛苦的一件事,想要马上看到结果很难。生成的程序将在build/pack目录中。为了方便使用,我们将D:scalabuildpackbin目录加入到系统环境变量中。

验证

从这里抄一份经典的并发模型代码来测试一下

http://www.scala-lang.org/node/54

保存为pingpong.scala,然后编译一下

scalac pingpong.scala

然后执行

scala -cp . examples.actors.pingpong

和java的class一样的。如果一切正常将可以看到一堆消息在滚。

archlinux无法识别大于4G内存的问题

机器是8G内存,默认安装的archlinux只认到了2.85G,需要更换内核来解决这个问题。
执行wget,发生这样错误:
[root@01 local]# wget http://aur.archlinux.org/packages/kernel26-pae/kernel26-pae.tar.gz
wget: error while loading shared libraries: libssl.so.0.9.8: cannot open shared object file: No such file or directory
更新一下wget
pacman -S wget

更新内核firmware

pacman -S kernel26-firmware

安装abs

pacman -Sy abs

安装PAE内核
wget http://aur.archlinux.org/packages/kernel26-pae/kernel26-pae.tar.gz
tar xvf kernel26-pae.tar.gz
cd kernel26-pae

makepkg –asroot

pacman -U kernel26-pae-2.6.33.3-1-i686.pkg.tar.xz

这时候在/boot目录下应该会有vmlinuz26-pae这样文件,然后修改一下/boot/grub/menu.lst文件把这个内核列入启动候选名单,并且设置为默认启动项目,重启一下机器,用free命令就可以看到正常的内存了。
参考资料

从u盘安装archlinux

用usb光驱无法在服务器上启动安装进程,在进入到grub的引导界面就grub就非常不幸的挂掉了。觉得换用u盘进行安装,碰碰运气。具体的操作流程如下:
先用unetbootin这个工具将archlinux的iso拷贝到u盘中,方法很简单,见下图:

拷贝一份iso到u盘中,下面要用到它。

然后用u盘去引导系统,引导过程中会报

waiting 30 seconds for device /dev/archiso
ERROR: boot device didn’t show up after 30 seconds
无法加载/dev/archiso设备,我们可以用下面的命令去加载光盘iso到/dev/archiso中
mkdir -p /iso
mount -t vfat /dev/sda1 /iso
modprobe loop
losetup /dev/loop6 /iso/archlinux-2009.08-core-i686.iso
ln -s /dev/loop6 /dev/archiso
然后按
Ctrl +D

返回安装流程。这时应该能顺利进入login界面了,输入root然后直接回车就可以以root身份进入shell了,执行

/arch/setup
启动安装进程
首先分区,选择了自动分区,boot区设置为100m,swap分区设置为物理内存大小,其他的分配给跟分区,根分区选择ext4格式
然后选择包,要记得把devel包选择上,我们日后软件维护要用到自己编译的情况。

然后是安装包,一直回车

配置系统的时候,要注意,由于u盘占用了sda的名字,所以,物理硬盘是sdb,但是拔掉u盘后,物理硬盘又会变成了sda,所以配置fstab的时候一定要注意把sdb假装是sda来配置
然后是安装引导器,我们选择grub,把它安装在sdb上,也就是物理硬盘的mbr上。但是进入配置文件menu.lst的时候要把hd1都替换为hd0,原因同上。
折腾完毕之后就可以拔掉u,重启机器。
进入新系统的第一步呢是
pacmon更新源,我们选择163的镜像,这些IT豪门的举手之劳真,造福了千千万万的平民百姓
名称:网易
协议:HTTP
地址:mirrors.163.com/archlinux/
软件仓库:core、extra、community
架构:i686、x86_64、iso
相应的修改是在/etc/pacmon.d/mirrorlist文件中最后添加


# 163.com
Server = http://mirrors.163.com/archlinux/$repo/os/i686
重新进入系统后,我们要配置好sshd服务,用下面的命令安装sshd服务
#pacman -Sy openssh #安装opensssh

安装完成后在/etc/rc.conf的最底部DAEMONS后添加sshd让系统启动时自动启动openssh

DAEMONS=(syslog-ng network netfs crond sshd)

也可手动启动openssl,执行

#/etc/rc.d/sshd start

默认情况下其它电脑是不能通过ssh来访问archlinux的,需要修改两个文件来实现:
/etc/hosts.deny #默认拒绝所有连接,打开这个文件用#号注释掉这行,

ALL:ALL:DENY
让所有人都可以连接到这台服务器,最后重启openssh
#/etc/rc.d/sshd restart
最后openssh默认也是不允许root帐户直接登录的,需要修改/etc/ssh/sshd_config文件
将PermitRootLogin yes前的#号去掉就可以了.

用watir做自动化测试

watir是一个开源的测试框架,相对loadruner和qtp这些大家好而已,watir操作起来要方便得多。

安装

用下面的命令安装

gem install watir

碰到这个错误

RubyGems will revert to legacy indexes degrading performance.
Building native extensions.  This could take a while…
ERROR:  Error installing watir:
ERROR: Failed to build gem native extension.

需要安装ruby的开发包devkit,详情见这里:http://wiki.github.com/oneclick/rubyinstaller/development-kit

从这里下载包

http://rubyforge.org/frs/download.php/66888/devkit-3.4.5r3-20091110.7z

解压后,将所有内容拷贝到D:Ruby下,然后修改D:Rubydevkitmsys1.0.11etcfstab为下面内容

D:/Ruby/devkit/gcc/3.4.5 /mingw
D:/Ruby/devkit/msys/1.0.11/usr/local /usr/local

重新执行

gem install watir

碰到第二个错误

ERROR:  Error installing watir:
watir requires commonwatir (= 1.6.5, runtime)

尝试执行

gem install commonwatir

本地安装

从这里下载watir的gem包:

http://rubyforge.org/frs/download.php/66928/watir-1.6.5.gem
http://rubyforge.org/frs/download.php/66929/firewatir-1.6.5.gem

在命令行转到gem包存放的目录,执行

gem install firewatir-1.6.5.gem –local
gem install watir-1.6.5.gem –local

简单测试

打开命令行窗口,输入

irb

然后的命令序列如下
  1. require ‘rubygems’,ruby新版好像都需要先装载这个模块
  2. require ‘watir’,装载watir
  3. ie = Watri::IE.new,实例化一个ie对象,这时会弹出一个ie窗口
  4. ie.goto(“http://live.shopex.cn”),弹出的ie窗口会打开http://live.shopex.cn,10.890625是打开这个页面所花费的时间

测试实例

我们做一个shopex484网店系统的用户注册过程自动化测试

http://shop25457.p02.shopex.cn/shopex484/?passport-signup.html

用firefox打开这个页面,找出要填表单的name或则id
序号 表单名称 id name
1 用户名 reg_user kyle
2. 密码 reg_passwd shopex
3. 确认密码 reg_passwd_r shopex
4. 电子邮箱 reg_email kyle@shopcare.net
5. 立刻注册 submit

我们自动化测试脚本如下

require ‘rubygems’
require ‘watir’
include Watir
@reg_user=”kyle”
@reg_passwd=”shopex”
@reg_email=”kyle@shopcare.net”
ie=IE.new
#注册
ie.goto(‘http://shop25457.p02.shopex.cn/shopex484/?passport-signup.html’)
ie.text_field(:id,”reg_user”).set(@reg_user)
puts ‘user name:’+@reg_user
ie.text_field(:id,”reg_passwd”).set(@reg_passwd)
puts ‘password:’+@reg_passwd
ie.text_field(:id,”reg_passwd_r”).set(@reg_passwd)
puts ‘re-password:’+@reg_passwd
ie.text_field(:id,”reg_email”).set(@reg_email)
puts ‘email:’+@reg_email
ret = ie.button(:type,”submit”).click
puts ‘use time:’+ret.to_s
#登录
ie.goto(‘http://shop25457.p02.shopex.cn/shopex484/?passport-login.html’)
ie.text_field(:id,”in_login”).set(@reg_user)
ie.text_field(:id,”in_passwd”).set(@reg_passwd)
ret = ie.button(:type,”submit”).click
puts ‘use time:’+ret.to_s
ie.close
将上面的脚步保存为
shopex_sign.rb
然后在命令行窗户执行
ruby shopex_sign.rb
可以看到watir会打开一个ie窗口,然后依次执行相应的操作。是不是觉得很简单呢?

参考资料

watir5分钟入门

http://wiki.openqa.org/display/WTR/Watir+in+5+Minutes

ROR的hello world

Ruby安装配置

从这里下载ruby

ftp://ftp.ruby-lang.org//pub/ruby/binaries/mswin32/ruby-1.9.1-p376-i386-mswin32.zip

设置环境变量TOPDIR指向解压目录,%TOPDIR%bin加入到path变量中,我把ruby放在

D:\Ruby

用户Gem管理软件包。

安装rails

D:\Ruby\bin>gem install rails

WARNING:  RubyGems 1.2+ index not found for:
RubyGems will revert to legacy indexes degrading performance.
Bulk updating Gem source index for: http://gems.rubyforge.org/

在经历的无数次失败的尝试后,终于找到了比较靠谱的入门教程

http://developer.51cto.com/art/200907/138271.htm

rails的安装命令序列如下:

gem install rack
gem install rake
gem install rails –source http://gems.rubyonrails.org

ROR和hello world

在命令行窗口执行

rails rorweb

cd rorweb

ruby scriptserver

浏览器打开

http://localhost:3000/

建立自己的hello world

ruby script\generate controller HelloRoR

可以建立一个hello_ro_r的控制器,注意控制器名称下划线和大写字母的对应关系,Rails有很多这样的约定!在ror中的原则”习惯约定优于配置”

有建立就有删除,删除一个控制器

ruby script\destroy  controller HelloRoR

接下来是修改appcontrollershello_ro_r_controller.rb代码为

class HelloRoRController < ApplicationController
def index
render_text=>”Hello RoR”
end
def rails
render_text=>”Hello Rails”
end
end

从代码可以看出来,这个是python风格的,靠缩进去区分代码块的。验证一下,用浏览器访问下面的地址

应该看到这样的讯息

可能会碰到的问题:

新版本的rails ,报找不到页面,web服务器报下面的错误

Status: 500 Internal Server Erro
no such file to load — sqlite3

从错误提示信息可以看出是sqlite模块没有正确装载,方法有二

其一、安装好sqlite

gem install sqlite3-ruby

其二、取消sqllite,改用mysql

rails -d mysql rorweb

用url rewrite实现禁止ip访问

概述

电信部门开始要求网站都必须要有域名,把所有的网站都赶进工信部的备案系统,所以要求网站不能用ip访问的。在apache中网上的文章都是介绍建立一个虚拟机,这个虚机绑定ip,再设置虚机禁止任何人访问。其实用url rewrite去做也很简便。特别是在shopex的一键安装包中,BT的flaboy精简太厉害,不能设置虚机,只能用url rewrite去实现。

操作

例如,我们要实现访问

得到是一个禁止访问结果页。那么我们只需要在apache配置文件httpd.conf最后加上

RewriteEngine on
RewriteCond %{HTTP_HOST}  8.8.8.8
RewriteRule (.*) / [F]

这样的rewrite语句就可以实现了。