helion-prime
home about us blogs contacts

Archive for the ‘internet’ Category

Google voice versus skype

Thursday, August 26th, 2010

Yes, it’s finally happened, we can call regular phones with Google voice. That Google Voice VoIP functionality based on Gizmo5 technology [http://www.google.com/gizmo5/]. Also good news are: Google agreed to trial free calling booths at an airport and a pair of universities!

Now, all that we need is to compare prices and test quality.

Prices comparison

Country Google voice Skype
United States free 2.4 ¢/min (incl. VAT)
Canada free 2.4 ¢/min (incl. VAT)
India 6 ¢/min 10.6 ¢/min (incl. VAT)
UK landline 2 ¢/min 2.4 ¢/min (incl. VAT)
UK mobile 18 ¢/min 29.10 ¢/min (incl. VAT)
Mexico landline 10 ¢/min 11.4 ¢/min (incl. VAT)
Mexico mobile 19 ¢/min 38.6 ¢/min (incl. VAT)
France landline 2 ¢/min 2.4 ¢/min (incl. VAT)
France mobile 15 ¢/min 23.3 ¢/min (incl. VAT)
Russia landline 4 ¢/min 5.5 ¢/min (incl. VAT)
Russia mobile 6 ¢/min 8.2 ¢/min (incl. VAT)
Russia Moscow 2 ¢/min 2.4 ¢/min (incl. VAT)
Russia Saint-Petersburg 2 ¢/min 2.4 ¢/min (incl. VAT)



As you see Google set lower prices for all cases, even if it’s few cents. You can make own comparisons for your local places:
Skype rates [http://www.skype.com/intl/en-us/prices/payg-rates/]
Google rates [https://www.google.com/voice/b/0/rates].

Quality testing

We have compared quality of sound in the same places with same computer configuration. For most cases they show almost same results.

Here we need to mention only 2 things:
Gmail Voice has clearer sound in most cases.
Skype provides better noise cancellation.

New google design

Monday, March 15th, 2010

One of our developers had enough luck to see new Google design which is pretty simple and clean.
Sure he made few screen-shots and we glad to share it now with All World.

main screen:

SILK audio codec

search results screen:

new google design results screen



And surely we hope Google will approve it for mass use and tomorrow we will see it on almost any browser in the World.
Comments are welcome!

Multi-domain applications in Ruby on Rails

Thursday, September 3rd, 2009

preamble

Ruby on Rails is a great framework that still luck some common features, among them: multi-domain support.
Here I will describe fast solution that doesn’t work for every browser and another one that do the work.

Ok, you did your homework and google something like ‘ruby on rails multi-domain’.
Very often provided solution:

edit environment.rb

1
config.action_controller.session = {:domain => '.mydomain.com'}

With that parameter Rails always read cookies from same domain. In real some browsers forbid for applications to read cookies from other domain due to insecurity of that operation. And as Mozilla Firefox in set of browsers that forbid that we just need another solution.

Now it’s clear that we should implement necessary functionality other way.

Here we go:

1. will store session ID in the database(by default Rails2 store it in cookies)

environment.rb:

1
config.action_controller.session_store = :active_record_store

and then execute rake task that create necessary DB migration:

1
rake db:sessions:create

Apply it with: rake db:migrate.

2. setup session parameters

environment.rb:

1
2
3
4
5
6
7
8
9
require "rubygems"
require "active_support"

config.action_controller.session = {
   :session_key => '_myapp_session_id',    # session identification key
   :secret      => '89sHslddfsd98klasdKd', # hash code of session generator(make it random and longer)
   :cookie_only => false,
   :expire_after => 1.week,                # TTL (time to live)
}

3. let’s create session creation handler

application_controller.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
before_filter { |controller|
   opts = controller.request.session_options
   key = opts[:key]

   # use session ID if it's passed
   if controller.params[key]       
      # session initialization with old ID
      controller.session[:nothing]

      opts[:id] = controller.params[key]
      controller.request.session_options = opts
     
      # session initialization with new ID
      controller.session[:nothing]
   end
}

4. session pass

We need to pass session ID as parameter when user change domain name, and within domain we still use cookie.

1
“#{request.session_options[:key]}” => request.session_options[:id]

It’s wise to use session initialization before request.session_options[:id] invocation due to Rails use lazy loading, and session can be uninitialized.
Use something like: session[:nothing].

Pay attention that information that Rails get from cookie has bigger priority, and so if you have some parameter in cookie Rails will use it firstly.

Note:
An attacker can still steal you session ID by sniffing the network, or exploiting javascript, he/she gets the value from the cookie itself. If you care about security so much just use HTTPS.

Advices for customer as part of project

Wednesday, August 26th, 2009

Today even great application can die alone .. world has too many great applications.
me

Do you know what software development company sell?
Not just some abstract peace of software but application that can solve customer’s problems .. we should understand what customer wants from the application, what tasks he/she wants to solve with application.

We provide to customer our vision and suggest technology/platform/approach, customer provide ideas/plans/limitations .. together we will end with some satisfied result. But what then?
Then as usual we get our money and leave customer alone with his application.

What else we can give to them?

We should give business advices that can bring closer customer’s target.
Client can take them or not but part of our work is to give ones. Customers see that we care, that help to build better relationship and get great satisfaction .. we make great applications that work!

Fast scalability of Ruby on Rails with mongrel under OpenBSD

Wednesday, August 12th, 2009

preamble

Everybody who works with ruby on rails more then month knows at least 2 things:
it’s great framework, but can’t handle multiple requests simultaneously due to it still doesn’t use threads.

fast start

As scalability is common issue, rubyonrails site wiki provides full set of solutions:
[http://wiki.rubyonrails.org/#deployment_stacks]

But we as fast solution will use great OpenBSD pf (Packet Filter) that capable to do many cool things.
First issue is standard mongrail cluster that can start several instances of mongrail can only create them on one IP with different ports, and pf can’t distribute requests among different ports on same IP.

Here we can create 2 simple scripts that start and destroy server instances:
# cat start.sh

1
2
3
4
5
6
7
8
9
10
count=1
for ip in 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4 10.0.0.5
do
mongrel_rails start -e production -d --user myapp --group myapp --chdir /var/www/railsdocs/myapp \
--address ${ip} \
--pid /var/www/railsdocs/myapp/tmp/pids/mongrel.${count}.pid \
--log /var/www/railsdocs/myapp/log/mongrel.${count}.log

count=$(($count + 1))
done

# cat stop.sh

1
2
3
4
5
for instance in {1..5}
do
mongrel_rails stop --wait 3 --chdir /var/www/railsdocs/myapp \
--pid /var/www/railsdocs/myapp/tmp/pids/mongrel.${instance}.pid
end

And we need to enable pf:
#/etc/rc.conf.local

1
2
pf=YES
#pflogd_flags=                   # add more flags, ie. "-s 256"

add one string to configuration file for load distribution:
#/etc/pf.conf

1
2
rdr pass log on re0 proto tcp from any to SOME_IP port 80 ->
{10.0.0.1, 10.0.0.2, 10.0.0.3, 10.0.0.4, 10.0.0.5 } port 3000 round-robin

check work with:
# pfctl -s nat

monitor with:
tcpdump -n -e -ttt -i pflog0

for more info on pf:
http://www.openbsd.org/faq/pf/
man pf.conf (especially ‘TRANSLATION’ and ‘POOL OPTIONS’ sections)

Then when you see you need more advanced solution for load distribution you can install haproxy.
Check it with [http://www.openbsd.org/4.5_packages/i386/haproxy-1.3.15.7.tgz-long.html]

©2010 Helion-Prime Solutions Ltd.
Custom Software Development Agile Company.