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,欢迎使用^@^

 

在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设置二级域名,如果成功可以推广到其他模块

 

从rfacebook 到facebooker

     最近在钻研Facebook + Ruby on Rails的application,坦白说没有当初php那么顺畅。可能因为Rails本身的框架涵盖的东西太多了吧,反而PHP这样最简单直接,反而容易上手。Rfacebook和Facebooker都是Facebook Client Library based on Ruby on Rails,一开始选择前者也没有什么特别的理由,谁让人家就是Using Ruby on Rails with Facebook Platform上的首选呢。
     总体来说Rfacebook就是用Ruby on Rails来解析Facebook请求协议的解析包,如同PHP Client一样,是比较Straight地解决办法。由于有了PHP上的经验,Rfacebook的安装总体来说还是很顺利的,大概前后花了两个晚上Hello World就出来了,直接Scaffold了一个Object 就可以show在facebook上了。当然问题也就接踵而来。
     遇到的最主要问题就是路由。一方面Facebook Application是以apps.facebook.com/xiustodolist作为Context Root来解析的。另外一方面Ruby on Rails有自己的路由解析策略,例如Scaffold出来的new.html.erb中的<%=link_to ‘Back’, users_path %>都是以apps.facebook.com作为根来作路由解析的。所以已开始所有的Link都完全不对,完全没有办法点击。Google了一下,原来是Rails2.0 named routes在作怪。当然也有解决的办法,不过文中更加推荐了Facebooker地解决办法,这也是我第一次听说了Facebooker.
     之后我访问了Rfacebook的主页,看到作者推荐Facebooker的留言,还说如果Facebooker1.0 release,他就要停掉Rfacebook,嗯,还有什么理由不试试看Facebooker呢,嗯,gogogo.
     Facebooker的安装之路远没有Rfacebook来的顺利。主要遇到了两个问题。
1 Facebooker 已经从SVN搬迁到了Git上。最可恨的是SVN上最后的版本还有编译错误。网上比较著名几篇Tutorial都继承了这个错误,让初学者完全摸不到头脑。解决办法,去Git自己下载最新的版本手动安装。
2 Facebooker会按照Rails 2.0的named routes去解析request,所以面对Facebook的请求,他会最后Forward给index.fbml.erb而不是index.html.erb,不仔细看教程就会错过了,例如我。。
3 默认的respond_to没有fbml的Accept_type,所以如果你希望继续使用respond_to这么有趣的东西的话,就需要在/config/initializers/mime_types.rb中添加text/html = fbml 的mapping.
     昨天刚刚完成了Facebooker的安装,总体来说非常的Rails 2.0 oriented.路由问题也都没有出现,可以放心的使用。
 
参考:Rfacebook

 

最近看到的Ruby on Rails 应用

github
http://github.com/
基于RoR的Git hosting.
由于Rails将项目迁移过去而名声鹊起.
介绍参考
GitHub – 基于Rails的Git库托管

lighthouse
http://lighthouseapp.com/
基于RoR的需求问题跟踪系统.
同样由于Rails将Bug,Feature跟踪迁移过去而名声鹊起.
没有中文参考….

heroku
http://heroku.com/
基于RoR的虚拟主机服务提供商.
基于Amazon的EC2服务.
最近获得风投300万美金而成为了RoR项目成功的又一代表.
Heroku: Ruby on Rails服务商得到300万美金投资

 

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