Adhearsion初体验

我是偶尔在Asterisk: The Future of Telephony上看到Adhearsion的介绍的.以下是摘自Adhearsion主页http://adhearsion.com/的一段对Adhearsion的定义.

Adhearsion is a new way to write voice-enabled applications. It's not just an API or library — it's a fully-featured framework, the first of its kind, designed for maximal code reuse and intuitiveness. The name "Adhearsion" is a combination of "adhesion" and "hear" because Adhearsion shines best when integrating technologies with voice.

简单的说就是基于Asterisk AGI,一套完整的应用于Voice Application的Ruby框架.VoIP Application + Ruby,还有什么比这个更适合我呢?二话不说,马上开始试用.
Adhearsion Getting Start


Adhearsion的主页还是非常的人性化的。不仅提供了完全免费,电话测试系统,使得你建立的Adhearsion应用可以方便的进行调试运行,还提供了多种Voice客户端的选择,包括Skype, 各种SIP Phones甚至In-browser Phone。按照下面的步骤,你可以轻松的建立你的第一个Adhearsion Application.
Step 1:注册Adhearsion帐号
默认会加入Adhearsion的Mailing List,不算很热闹,偶尔会有一些邮件。Adhearsion帐号同时也是电话系统的测试帐号,有了它你就可以连接到Adhearsion提供的SandBox上了.

Step 2:安装Ruby, RubyGems, Adhearsion
Ruby和Gems的安装就不多说了.安装Adhearsion也就是一句话的事情.感谢伟大的Ubuntu和RubyGems.

sudo gem install adhearsion

Step 3:创建你的第一个Adhearsion应用
类似Rails,Adhearsion会创建一整套基础部件,解决了类似Adhearsion服务器启动,停止等工作,使得你可以专心在Adhearsion应用的开发上.

ahn create my_first_app

Step 4:启用Sandbox Component
Adhearsion中有一个Component的概念.Component类似插件的意思,代表了一组功能的集合.所有的Components都放在my_first_app/components目录下.其中Sandbox就是一个包含了连接注册Adhearsion电话测试系统的Component.

cd my_first_app
ahn enable component sandbox

修改my_first_app/components/sandbox/sandbox.yml,按照你在Ahearsion注册的帐号密码修改该文件,这样你无需编写任何代码就可以连接注册到Adhearsion电话测试系统了.

username: xxxxxxx
password: xxxxxxx

Step 5:编写你的Adhearsion应用
打开my_first_app/dialplan.rb,添加如下代码:

sandbox {
play "hello-world"
}

sandbox代表的是Asterisk中规定的context,Adhearsion测试系统默认的context就是sandbox. play “hello-world”的意思就是播放”hello-world”的音频.简单的就好像说话一样-.-


Step 6:运行你的Adhearsion应用
直接通过ahn命令就可以运行你的adhearsion应用了.由于启用了sandbox component,你的应用会先去连接adhearsion测试系统进行登录注册,然后启动后台进程监听请求.

ahn start .



OK了,这就是Adhearsion全部需要做得了.测试一下吧.选一款你觉得最酷的soft phone,按照Ahdearsion的提示拨打电话,听到一声清脆的”Hello World”,你的Adhearsion蹦出一些log信息.看这就爽,你也快来试试看吧.

 

在Rails Layout中使用JQuery的解决办法

Rails的Layout非常的好用,可以把Header,Footer,SideBar在一个公共的页面,统一风格而且非常的易于维护.
JQuery是我比较喜欢的js framework,强大的selector绝对符合我的口味,不二的选择.

问题就来了,Layout中通常包含了

的内容,而JQuery需要在header通过如下的code实现初始化.

<script type="text/javascript">
$(document).ready(function(){
......
}
</script>

而这部分代码肯定是根据具体的功能页面不同而有所不同的,无法直接写在Layout页面中,那该怎么办?

Solution 1
我自己找到并使用的解决办法:神奇的方法content_for.
http://railscasts.com/episodes/8-layouts-and-content-for.
在Layout文件中加入如下的code.

<head>
<title>My Tasks</title>
<%= yield :jquery %>
</head>

在具体的功能页面中通过如下形式定义JQuery初始化脚本.

<% content_for :jquery do %>
<script type="text/javascript">
$(document).ready(function(){
......
}
</script>
<% end %>

OK了.这样就可以了.这个解决办法的问题是你必须在每个功能页面实现一边初始化脚本.另外如果header,sidebar需要用到jquery的话还需要额外处理.不过因为这些在我的应用中暂时都不需要,所以这个解决办法对我而言还是可以的.

Solution 2
这是Javaeye上小小龙猫提供的解决办法.
http://jonny131.javaeye.com/admin/blogs/179842
最基础的方法还是使用content_for这个方法.不过封装的要更加好,使用起来更加灵活.有兴趣的同学可以参考一下.

 

在Heroku上搭建自己的Tiny URL

随着Twitter的风行,TinyURL服务的需求也被挖掘了出来。虽然这个服务器的盈利模式仍然是一个未知数,但是并不能阻止它的流行.网上应用最广泛的的包括tinyurl.com,bit.ly等等。Source TechcrunchSource TechCrunch.

最近读到一篇不错的blog:Clone TinyURL in 40 lines of Ruby code. 这篇blog的作者用短短40行代码就实现了tinyurl的服务,大为感慨地同时让我对ruby越来越喜欢了.

get '/' do haml :index end
post '/' do
uri = URI::parse(params[:original])
raise "Invalid URL" unless uri.kind_of? URI::HTTP or uri.kind_of? URI::HTTPS
@url = Url.first(:original => uri.to_s)
@url = Url.create(:original => uri.to_s) if @url.nil?
haml :index
end
get '/:snipped' do redirect Url[params[:snipped].to_i(36)].original end
error do haml :index end

基于DSL的Sinatra Framework. 接触的不多。不过用在这种比较简洁的应用中真的非常直观好用。
params[:snipped].to_i(36)
Ruby方便的实现了数字的三十六进制(0-9,a-z)也是这段代码的亮点之一.


DataMapper.setup(:default, ENV['DATABASE_URL'] || 'mysql://root:root@localhost/snip')
class Url
include DataMapper::Resource
property :id, Serial
property :original, String, :length => 255
property :created_at, DateTime
def snipped() self.id.to_s(36) end
end

DataMapper简化下的数据持久化.好用也就是一个字啊。


__END__
@@ layout
!!! 1.1
%html
%head
%title Snip!
%link{:rel => 'stylesheet', :href => 'http://www.w3.org/StyleSheets/Core/Modernist', :type => 'text/css'}
= yield
@@ index
%h1.title Snip!
- unless @url.nil?
%code= @url.original
snipped to
%a{:href => env['HTTP_REFERER'] + @url.snipped}
= env['HTTP_REFERER'] + @url.snipped
#err.warning= env['sinatra.error']
%form{:method => 'post', :action => '/'}
Snip this:
%input{:type => 'text', :name => 'original', :size => '50'}
%input{:type => 'submit', :value => 'snip!'}
%small copyright ©
%a{:href => 'http://blog.saush.com'}
Chang Sau Sheong
%br
%a{:href => 'http://github.com/sausheong/snip'}
Full source code

HAML简化下的html模板.第一次看到html写成了code一般。好坏暂且不计,ruby就是牛啊。

看完以后当然就是自己搞一把,heroku现在也支持sinatra了,强强组合,不用不爽快。-,-
Step 1 下载Snip源码
git clone git://github.com/sausheong/snip.git.
一共就两个文件.基于Rack的配置文件config.ru和主程序snip.rb,简单明了,一目了然.

Step 2 上传至Heroku

heroku create yourapp
git push heroku master


另外一个属于ruby on rails的奇迹Heroku,就是这么喜爱.

Step 3 数据初始化

heroku clone
Ruby console for snip.heroku.com
>> DataMapper.auto_migrate!
=> [Url]

OK,搞定了,属于你自己的tiny url service.
我的Tiny URL: http://tinyurl.8gfriends.com,欢迎使用^@^

 

在Hostmonster上搭建自己的Git服务器

去年开始接触到git之后,就不自觉地喜欢上了它.所有版本信息都储存在单独的.git目录下,对于超讨厌无穷无尽svn folder的我来说,就这一点就让我爱不释手了.

有了Hostmonster空间之后,一直就想搭建一个git repo.这样随便找一个coffee bean(starbucks没办法上网…), git clone, git push.程序员眼中的暇意生活大概就是这个样子吧.

说干就干,google之.找到一篇不错的.Git: private repositories on shared hosting,步骤还是相当简单的.

Step 1 创建自己的版本库

cd yourapp
git init
git add .
git commit -m "init commit"

这样,你自己的版本库搭建好了.就多了一个.git目录,说不出的舒坦啊….

Step 2 在Hostmonster上搭建版本库

cd ../
git clone --bare yourapp yourapp.git
touch yourapp.git/git-daemon-export-ok
scp -rf yourapp.git username@yourdomain.com:/home/username/path/

git –bare会生成一个只包含版本信息的版本库. 通过ssh把yourapp.git上传到hostmonster的目录下.
OK,你的远端私有Git版本库就搭建成功了.

Step 3本地获取项目文件

git clone ssh://username@yourdomain.com/~/path/yourapp.git

简单吧.输入你的密码,就可以获得整个项目文件了.

遗留问题:
1 人心不足蛇吞象.最好能像heroku那样. git push之后直接完成服务器项目部署的工作那自然是最好了.(其实现在也只是要在服务器上pull一下就好了-.-).然后还要自动完成rake db:migrate 之类的工作. 这些事情也许可以通过shell或者Capistrano来完成.过两天再看了….

 

HostMonster初体验

4月2日百无聊赖,心血来潮点击了HostMonster的连接.
“购买两年,3.95$/mon的超低优惠”.哇塞,算下来一共只要94$,貌似比Dreamhost的coupon都便宜(菜鸟就对推荐忽略不计了..).立马拿下…

这其中还有一个小小的插曲,因为公司IP是美国的,和我的等级信息不符,结果我就被人家flagged了,要求verify我的资格…-,-,汗啊,老实本分的公民一枚.Paypal的付费证明,Passport Photo ID,忙活了两天,总算如愿以偿通过了Verification.总的来说HostMonster的HelpDesk还是很热情积极的.技术问题基本1,2个小时就有回应.Verification也是每天及时回复.

终于用上了HostMonster,看着Control Panel一堆一堆的功能,口水都要流出来.

Security

支持SSH,有这个就什么都不怕拉.SFTP下行速度大概在200k/s左右,还是很不错的。

Domain

通过”Subdomain”功能,可以方便的二级域名绑定到指定的文件夹.
另外通过HostMonster,可以方便的与其他域名供应商那里注册的域名进行关联,将其映射指定文件夹(Addon Domain)或者当前域名相同的文件夹(Park Domain).超方便的功能阿,正好在Namecheap有两个闲置域名呢,赶紧联过来.

Log

默认支持Webalizer和Awstats.可以通过”Choose Log Programs”为各个二级域名指定Log Program.

File

支持Full Backup和Partial Backup(Home Directory,Mysql Database和Email Forward,Filter)两种,提供手动备份和自动备份两种.绝对是我这种安装偏执的最爱.

支持Web Disk,FTP和Web File Manager各种功能.

Software/Services

这当然指最关注的部分.PHP和Perl当然是必不可少.支持Ruby on Rails也是我喜欢它的原因.不管三七二十一,当天我就安装了无数需要的,不需要的gems…….

“SimpleScripts”提供了许多流行程序的一键安装功能:Wordpress, phpBB, Joomla, PmWiki.而且直接提供二级域名的映射服务.方便就是一个字.

以上就是目前我用到的部分.慢慢挖掘吧.HostMonster我来啦.

另外安装了SpeedTest Mini来测试速度,有兴趣的朋友可以测试一下,给我反馈。

hostmonster

HostMonster Control Panel Part I

HostMonster Control Panel Part II

HostMonster Control Panel Part II

HostMonster Control Panel Part III

HostMonster Control Panel Part III

 

在Heroku上部署Radiant

Heroku:非常赞的RoR服务提供商(服务好,还免费)
Radiant:基于RoR的开源CMS。
Step 1:
sudo gem install radiant
Radiant很体贴的已经做成了gem.直接安装就可以用了。
如果要查看具体的实现可以在radiant gem的文件夹下找到。
Step 2:
radiant –database sqlite mycms
类似Rails,直接使用这条命令就可以生成整个项目文件。支持各种主流数据库。
Step 3:
cd mycms;rake db:bootstrap
使用rake初始化数据。如果数据库配置不是默认的话需要自己手动修改config/database.yml
Step 4:
将config/environment.rb中的配置修改成如下内容
config.action_controller.page_cache_directory = “#{RAILS_ROOT}/tmp/cache
Radiant会缓存生成的内容页面。Heroku的文件系统权限和默认的不一样,所以要做如上修改。
Step 5:
git init
建立Git版本文件。
Step 6:
在项目根目录下建立新文件–.gems
rspec –version 1.2.2
radiant –version 0.7.1
Heroku的特色,在git push的时候会根据这个文件安装你需要的gems.体贴温馨。
Step 7:
git add .
git commit -m “init”
提交初始项目文件。
Step 8:
heroku create <yourapp>
在Heroku上建立你的系统。yourapp就是你的网站域名。
之后可以根据yourapp.heroku.com对系统进行访问。
Step 9
git push heroku master
提交文件至Heroku Git服务器。
第一次提交需要建立master作为Branch名,以后可以直接通过git push heroku进行提交。
Step 10
heroku db:push
将本地的数据库内容提交至你的Heroku数据库。
需要Heroku 0.6.1以后的版本,如果你没有这个功能,请升级Heroku gem版本。
OK了。访问<yourname>.heroku.com.你的CMS就这样搭建成功了。
Tips 1:
Radiant需要另外两个gem:cucumber和hoe.
在windows下会有提示,在Linux下则会顺利安装,但是Step2的时候会报如下错误。
Missing the Radiant gem. Please `gem install -v= radiant`, update your RADIANT_GEM_VERSION setting in config/environment.rb for the Radiant version you do have installed, or comment out RADIANT_GEM_VERSION to use the latest version installed.
卸载radiant,安装cucumber,hoe后重新安装radiant就可以了。
Tips 2:
理论上Heroku支持各种数据库。
但是Radiant使用mysql安装的话,在Step 10会报错Internal Error.反正Heroku本省使用Postgresql,所以一开始安装的时候还是老实使用sqlite3比较好。

 

Ruby实例三个

Sinatra
微型ruby web framework.非常的简单使用

require ‘rubygems’
require ‘sinatra’
get ‘/hi’ do
“Hello World!”
end

$ gem install sinatra
$ ruby hi.rb
== Sinatra has taken the stage …
>> Listening on 0.0.0.0:4567

Twitter4r
基于Ruby的Twitter API封装,方便好用。
require ‘twitter’
puts ‘begin…’
#login
client = Twitter::Client.new(:login => ‘tony_luo’, :password =>’gene0801′);
#get login user information
user = client.my(:info)
puts user.name
#get followers information
followers = client.my(:followers)
puts followers.size
#get status according to timeline
client.timeline_for(:public) do |status|
puts status.user.screen_name, status.text
end
#post status
status = client.status(:post, ‘Cisco的收购脚步越来越快了!’)
status = client.status(:get, status.id)
#get messages
messages = client.messages(:received)
messages.each do |message|
puts message.text
end
puts ‘end…’
Twibot
基于Twitter4r和DSL的微型twitter framework,非常的方便好用。
设计本身也可圈可点,正在用它学习Ruby DSL的相关知识。

require ‘twibot’

# Receive messages, and tweet them publicly
#
message do |message, params|
post_tweet message
end

# Respond to @replies if they come from the right crowd
#
reply :from => [:cjno, :irbno] do |message, params|
post_tweet “@#{message.sender.screen_name} I agree”
end

# Listen in and log tweets
#
tweet do |message, params|
puts message
end

 

VPS攒机经历(7)

最后还是选择了三个月rashost,皑皑,没办法,用的爽才是硬道理,安装维护都要方便很多。
对于系统一流问题也有了一些update.
对于系统以及进程的监控发现了如下的解决方案
1)htop
很方便的console下的监控软件,进程,系统地内容,cpu都可以一清二楚
2)munin
twitter目前使用的系统监控软件,可以很方便的监控系统各个资源的使用情况,包括apache, mysql等等,还可以生成报表。
3)god
ruby的gem.可以监控mongrel的memory, cpu,并自动重起服务(需要研究对lighttpd,fastcgi的控制)
 
 
对于rails的框架选择
参考了网上很多资料以后,最终选择了javaeye的lighttpd + fastcgi的实现方式。
同时选用了ruby enterprise作为运行环境(本来ruby enterprise是人家公司和mod_rails合作的,皑皑,可惜了)
修改的方法也很方便,直接修改public/dispatch.fcgi中的ruby命令就可以了。
相关的问题是需要为ruby enterprise重新安装一遍所有的gem
目前系统基本稳定在230M左右的内存占用上。
 
其他相关的内容
1安装uchome
2安装ucenter
3安装discuz
4安装ecshop
5安装wordpress
6安装munin
7mapping domain name to ip
8安装phpmyadmin
 
遗留问题
1)如何为munin设置二级域名,如果成功可以推广到其他模块

 

VPS攒机经历(6)

所谓饿死胆小的,撑死胆大的。
昨天ark提到ruby enterprise大概能提高效率解决内存溢出。
马上安装
安装倒是很容易
./installer
/opt/ruby-enterprise/bin/gem install rails mongrel mongrel_cluster heroku memcache-client
问题
1怎么使用
解决
想了半天,靠我的聪明才智想到了了
修改rails/public/dispatch.fcgi中ruby路径
 
2lighttpd启动成功,日志报错又是那个backend idle ;5 seconds之类的。。。
解决
ruby-fcgi没装。。。
./opt/ruby-enterprise/bin/gem install fcgi
 
3ruby-fcgi安装失败
have_header: checking for fcgiapp.h… ——————– no
没有fcgi的头文件
解决
原来fcgi是自己装的,系统不认。
进入fcgi gem的安装目录
/opt/ruby-enterprise/bin/ruby ./extconf.rb –with-fcgi-dir=…..
make ** make install
/opt/ruby-enterprise/bin/gem install fcgi
搞定
 
杀死所有fcgi进程
重起lighttpd,等待结果

 

VPS攒机经历(2)

1安装memcached, libevent
yum install memcached
 
2安装git
 
问题
2.1
Error: Missing Dependency: libapr-0.so.0 is needed by package subver
解决:
 and so on….(I hate rpm )
 
3安装ruby,rubygems,rails,mongrel,mongrel_cluster
问题
3.1
checking build system type… i686-pc-linux-gnu
checking host system type… i686-pc-linux-gnu
checking target system type… i686-pc-linux-gnu
checking for gcc… no
checking for cc… no
checking for cl.exe… no
configure: error: no acceptable C compiler found in $PATH
See `config.log’ for more details.
解决:
安装gcc
 
3.2
Error: Missing Dependency: glibc-common = 2.3.4-2.13 is needed by package glibc-dummy-centos-4
解决
yum erase glibc-dummy-centos-4
 
3.3
vim /etc/profile
添加ruby 路径
 
3.4
gem list

*** LOCAL GEMS ***

actionmailer (2.1.0)
actionpack (2.1.0)
activerecord (2.1.0)
activeresource (2.1.0)
activesupport (2.1.0)
cgi_multipart_eof_fix (2.5.0)
daemons (1.0.10)
fastthread (1.0.1)
gem_plugin (0.2.3)
heroku (0.4.1)
hoe (1.7.0)
memcache-client (1.5.0)
mongrel (1.1.5)
mongrel_cluster (1.0.5)
rails (2.1.0)
rake (0.8.3)
rest-client (0.7)
rspec (1.1.8)
rubyforge (1.0.0)
ZenTest (3.10.0)

 

 

无觅相关文章插件,快速提升流量