helion-prime
home about us blogs contacts

Blogs

This weblog by Helion-Prime Solutions about software design, experience, business, the web, simplicity and more
Blogs

New google design

March 15th, 2010 by vasiliy.kiryanov

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!

Be Sociable, Share!

    Tuning of Postgresql under OpenBSD

    February 25th, 2010 by alex.shapovalov

    Preamble

    I assume that you already made your best with help of your favorite programming language
    and recommended postgresql performance tips: http://www.postgresql.org/docs/8.4/static/performance-tips.html

    Postgresql resources

    No doubt that standard postgresql configuration is far from modern production environments.
    Therefore you need to spend enough time with following sources.

    1. resource consumption documentation:
    http://www.postgresql.org/docs/8.4/static/runtime-config-resource.html

    The most important parameters are:
    work_mem (integer)
    shared_buffers (integer)

    2. Query Planning documentation:
    http://www.postgresql.org/docs/current/static/runtime-config-query.html

    The most important parameters are:
    effective_cache_size (integer)
    random_page_cost (floating point)

    OpenBSD resources

    The default sizes in the GENERIC kernel are insignificant also and waiting for your tuning as well.
    Posgtresql doesn’t start without enough memory size so always know when you need to increase kern.shminfo.shmmax.

    Setting that we can change in /etc/sysctl.conf
    the maximum number of System V IPC system-wide semaphore sets (and identifiers) which can exist at any given time:
    kern.seminfo.semmni

    the maximum total individual System V IPC semaphores which can be assigned by applications:
    kern.seminfo.semmns

    the amount of shared memory available in the system (bytes):
    kern.shminfo.shmmax

    the maximum number of shared memory segments:
    sysctl kern.shminfo.shmseg

    Full list of setting you can see with:
    # man sysctl

    OpenBSD kernel parameters
    So, there are set of parameters that can be tuned only with kernel rebuild.

    You should tune them only if system works unstable with default values and you have:
    kernel warnings: “uvm_mapent_alloc: out of static map entries”
    or panics like: “panic: malloc: out of space in kmem_map”

    NKMEMPAGES
    This option defines number of pages in kernel kmem_map structure.

    MAX_KMAPENT
    It defines number of static entries in kernel kmem_map (kernel virtual memory).

    They can be changed in:
    /usr/src/sys/arch/conf/GENERIC

    As start you need to recheck ‘Building the System from Source’ part of OpenBSD documentation:
    http://openbsd.org/faq/faq5.htm

    Usually administrators select these parameters using set of tests on dedicated testing box where
    they emulate load of production servers.

    Example

    our test server: 1x Intel Quad core CPU, 2GB RAM
    software: Ruby on Rails application, postgresql DB, memcached.
    load: about 15.000 users/day, peak load: 10 users/sec.

    postgresql_dir/data/postgresql.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # RESOURCE USAGE
    shared_buffers = 738MB
    max_prepared_transactions = 30
    work_mem = 16MB
    max_fsm_pages = 2000000

    # QUERY TUNING
    effective_cache_size = 512MB
    random_page_cost = 1.7

    /etc/sysctl.conf

    1
    2
    3
    kern.seminfo.semmni = 256
    kern.seminfo.semmns = 2048
    kern.shminfo.shmmax = 805306368    # Shared memory segment size is 768M

    /usr/src/sys/arch/conf/GENERIC

    1
    2
    3
    ## custom settings
    option MAX_KMAPENT = 3072
    option NKMEMPAGES = 32768
    Be Sociable, Share!

      Log rotation in Ruby on Rails applications

      November 19th, 2009 by alex.shapovalov

      preamble

      Even on mid-size applications logs grow enormously fast, it’s a pity Rails doesn’t provide built-in functionality for that like Apache web-server does. Fortunately there is an easy and fast solution for that issue.

      1. Install cronolog

      “cronolog [http://cronolog.org/] is a simple filter program that reads log file entries from standard input and writes each entry to the output file specified by a filename template and the current date and time.”

      For details, and list of parameters see: [http://cronolog.org/usage.html]

      On GNU/Linux Debian:

      # apt-get install cronolog

      2. Setup your Rails application

      Edit necessary environment file: like ‘config/environments/production.rb’ file

      1
      2
      3
      4
      5
      # system logger configuration
      # config.logger = SyslogLogger.new

      config.logger = Logger.new(IO.popen("FULL_PATH_TO_CRONOLOG log/production.log.%Y%m%d", "w"))
      config.logger.level = Logger::INFO

      That’s all, fast and easy .. Enjoy!

      Be Sociable, Share!

        Easy image scaling for RoR developers

        November 2nd, 2009 by alex.shapovalov

        We have common task: image scaling [http://en.wikipedia.org/wiki/Image_scaling], and correct understanding that: we can’t ask users to provide image of appropriate sizes, just use width and height CSS parameters for images, and thumbnail is always required feature.

        Luckily we have ImageMagic library [http://www.imagemagick.org] and program interfaces for popular languages.

        install RMagic gem
        # gem install rmagick

        add small code:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        require 'rubygems'
        require 'RMagick'

        class ImageController < ApplicationController

        def index

          # determine basic params
          w = params[:w]
          h = params[:h]
          path = params[:path]

          if !w.to_s.empty? && !h.to_s.empty? && File.exists?(path)
              begin
                image = Magick::Image.read(path).first
                transformed_image = image.resize_to_fill(w.to_i, h.to_i)

                # send image
                send_data(transformed_image.to_blob, :disposition => 'inline',
                 :type => "image/#{image.format.downcase}")

              rescue Exception => e
                Rails.logger.error e.message
                Rails.logger.error e.backtrace.join("\n")
                render :text => "Error processing image #{type}/#{aliaz}", :code => 404, :layout => false
              end

          end

        end

        Here to re-size images we use ‘resize_to_fill’ ImageMagic method:
        re-size the image to fit within the specified dimensions while retaining the aspect ratio of the original image, and if necessary, crop the image in the larger dimension.

        Sure you understand that resizing takes time and so you should cache re-sized images.

        For additional info look thru:
        [http://studio.imagemagick.org/RMagick/doc/]

        Be Sociable, Share!

          Multi-domain applications in Ruby on Rails

          September 3rd, 2009 by alex.shapovalov

          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.

          Be Sociable, Share!
            ©2010 Helion-Prime Solutions Ltd.
            Custom Software Development Agile Company.