Archive for the ‘How-To’ Category

PHP script to add Facebook LIKE button to your website

Friday, November 19th, 2010

You can use below PHP script to add Facebook LIKE button to your website :

// Display facebook LIKE button
echo "<br><iframe scrolling=\"no\"
src=\"http://www.facebook.com/plugins/like.php?href=";
echo 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
echo "&layout=standard&show_faces=false&width=450&action=like&colorscheme=light\"
frameborder=\"0\" style=\"border: none; overflow: hidden; height: 35px;
margin-top: 10px; margin-bottom: 0px;\"></iframe>" ;

RTL support in OpenERP 5.0.11 and openSuSE 11.1 64 bits server.

Thursday, September 2nd, 2010

Today, we managed to implement a solution that allows RTL Arabic support for OpenERP 5.0.11 reporting engine on our openSuSE 11.1 64 bits server.

It has to do with enabling RTL in ReportLab, which is used by OpenERP to produce PDF reports. Also, OpenERP server code has to be patched to allow it to identify RTL and LTR test direction. OpenERP reporting engine is by default recognizes LTR only.

Support for unicode characters has to be enabled to allow the display of Arab and Hebrew characters.

No more details can be provided as although the solution is open source, we don’t have the permission from the author to publish it.

COPY – Enabling Arabic Support in OpenERP Reports – COPY

Sunday, August 8th, 2010

Below post is just a copy of http://brain.centrivision.com/enterprise_applications/openerp/arabic_support :

OpenERP 5.0 relies on ReportLab 2.3 to create PDF reports. However, ReportLab 2.3 does not support RTL languages, and thus OpenERP does not support them as well. The following steps fix the issue in both ReportLab 2.3 and OpenERP 5.0.

Fixing ReportLab

To enable RTL language support in ReportLab 2.3, we need to modify some of its code, and build two supporting libraries, namely FriBiDi2 and PyFribidi2.

Building Dependencies

The following steps were tested on Ubuntu 9.04 (Jaunty). First, remove older libraries and install libraries necessary for building the new sources.

sudo apt-get purge libfribidi0 python-pyfribidi && sudo apt-get install autoconf gcc

Second, download FriBiDi2 (the latest at the time of writing is fribidi-0.19.2), extract it, open a shell in the extracted directory and execute the following command:

./configure && make && sudo make install

Next, download PyFribidi2 (the latest at the time of writing is pyfribidi2-0.8.0), extract it, open a shell in the extracted directory and execute the following command:

sed -i -r 's/\bfribidi2(\b|_)/fribidi\1/g' configure.in configure setup.py

[ `python -c 'import sys; print sys.version[:3]'` == '2.6' ]
&& sed -i -r 's/\bsite-packages\b/dist-packages/g' configure configure.in

./configure && make && sudo make install

Finally, verify the installation by opening a shell, changing to the home directory, starting the Python interpreter and importing pyfribidi2:

cd
python
>>> import pyfribidi2

Note: If you get an error about libfribidi.so.0 not being found, try to reboot your machine. If the error still persists, you may need to edit ”/etc/ld.so.conf”, adding the following line at the end of the file: ”/usr/local/lib” (without the quotes). Then run `sudo ldconfig`.

Modifying the code

Three files need to be modified in ReportLab’s code. The default installation of ReportLab in Ubuntu with Python 2.6 places it in the directory ”/usr/lib/python2.6/dist-packages/reportlab/”. We will need to modify the files there using an editor that is run in super user mode (e.g. `sudo vim`). I will refer to the files below using the relative path in ReportLab’s director.

rl_config.py

We need to modify the search path that ReportLab uses to search for fonts to include the default path on Ubuntu.

In the variable T1SearchPath, add the following value as the last element in the tuple (approximately at line 67):

'/usr/share/fonts/type1',

Do the same for TTFSearchPath, adding the following value as the last element in the tuple (approximately at line 85):

'/usr/share/fonts/truetype',

And do the same for CMapSearchPath, adding the following value as the last element in the tuple (approximately at line 113):

'/usr/share/fonts/cmap',

pdfgen/textobject.py

We need to import PyFribidi2 and call it before text is output to the PDF.

Add the following lines after the import statements (approximately at line 19):

# try to import pyfribidi
try:
    import pyfribidi2 as pyfribidi
    log2vis = pyfribidi.log2vis
    DIR_ON = pyfribidi.ON
    DIR_LTR = pyfribidi.LTR
    DIR_RTL = pyfribidi.RTL
except:
    import warnings
    warnings.warn('pyfribidi is not installed - RTL not supported')
    log2vis = None
    DIR_ON = DIR_LTR = DIR_RTL = None

Add a parameter to specify direction in PDFTextObject.init (approximately at line 135), so that the method declaration becomes as follows:

    def __init__(self, canvas, x=0,y=0, direction = 'LTR'):
        self.direction = direction

Finally, add a call to PyFribidi2 at the top of PDFTextObject._formatText (approximately at line 314), so that it becomes like this:

    def _formatText(self, text):
        "Generates PDF text output operator(s)"
        # Use pyfribidi to write the text in the correct visual order.
        directions = { 'LTR': DIR_LTR, 'RTL': DIR_RTL }
        text = log2vis(text, directions.get(self.direction, DIR_ON))

platypus/paragraph.py

Right before the comment ”#now the font for the rest of the paragraph”, add the following lines (approximately at line 1337):

                # set the paragraph direction
                if self.style.wordWrap == 'RTL':
                    tx.direction = 'RTL'

Fixing OpenERP

The fixes below have been adapted from the ReportsUnicode wiki on OpenObject’s website. However, the code in the wiki does not work correctly, so I have fixed a few things in it (and will hopefully fix the wiki soon). Only two files need to be changed: ”[bin/]report/render/rml2pdf/init.py” and ”[bin/]report/render/rml2pdf/trml2pdf.py”.

report/render/rml2pdf/__init__.py

Replace the code in this file by the following code:

import os, stat
from tools.misc import debug
from reportlab import rl_config
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase import ttfonts
from reportlab.lib.fonts import addMapping

def rl_isreg(filename, dirname):
    try:
        st = os.stat(os.path.join(dirname, filename))
    except OSError, reason:
        if reason.errno == 2:
            return False
        raise
    return stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)

for dirname in rl_config.TTFSearchPath:
    for root, dirs, files in os.walk(dirname): #@UnusedVariable
        for file in [x for x in files
                     if x.lower().endswith('.ttf') and rl_isreg(x, root)
                     ]:
            filename = os.path.join(root, file)
            try:
                face = ttfonts.TTFontFace(filename)
                face.extractInfo(1)
                pdfmetrics.registerFont(ttfonts.TTFont(face.name, filename, asciiReadable=0))
                addMapping(face.familyName, face.bold, face.italic, face.name)
            except:
                pass

from trml2pdf import parseString, parseNode

report/render/rml2pdf/trml2pdf.py

Right before the parseNode function, add the following function (approximately at line 777). It replaces a number of standard PDF fonts with alternatives that support Unicode characters. I haven’t tried all of them, but Helvetica –> DejaVuSans works for me.

def changeFonts(data):
    fontmap = {
        'Times-Roman':                   'DejaVuSerif',
        'Times-BoldItalic':              'DejaVuSerif-BoldItalic',
        'Times-Bold':                    'DejaVuSerif-Bold',
        'Times-Italic':                  'DejaVuSerif-Italic',

        'Helvetica':                     'DejaVuSans',
        'Helvetica-BoldItalic':          'DejaVuSans-BoldOblique',
        'Helvetica-Bold':                'DejaVuSans-Bold',
        'Helvetica-Italic':              'DejaVuSans-Oblique',

        'Courier':                       'DejaVuSansMono',
        'Courier-Bold':                  'DejaVuSansMono-Bold',
        'Courier-BoldItalic':            'DejaVuSansMono-BoldOblique',
        'Courier-Italic':                'DejaVuSansMono-Oblique',

        'Helvetica-ExtraLight':          'DejaVuSans-ExtraLight',

        'TimesCondensed-Roman':          'DejaVuSerifCondensed',
        'TimesCondensed-BoldItalic':     'DejaVuSerifCondensed-BoldItalic',
        'TimesCondensed-Bold':           'DejaVuSerifCondensed-Bold',
        'TimesCondensed-Italic':         'DejaVuSerifCondensed-Italic',

        'HelveticaCondensed':            'DejaVuSansCondensed',
        'HelveticaCondensed-BoldItalic': 'DejaVuSansCondensed-BoldOblique',
        'HelveticaCondensed-Bold':       'DejaVuSansCondensed-Bold',
        'HelveticaCondensed-Italic':     'DejaVuSansCondensed-Oblique',
    }
    for old, new in fontmap.iteritems():
        data = data.replace('"'+old+'"', '"'+new+'"')
    return data

Then, put the following line at the very top of each of parseNode and parseString (approximately at lines 812 and 820), before the call eTree.XML(rml):

    rml = changeFonts(rml)

report/render/rml2pdf/trml2pdf.py

(Tested on OpenERP Server 5.0.5 only)

In the method _rml_flowable._textual, modify the line that reads rc1 += etree.tostring(txt_n, encoding=unicode) (approximately at line 460) to become:

                rc1 += etree.tostring(txt_n, encoding=unicode)

That should be all. OpenERP should be all set and ready for creating Arabic reports.

Batch converting audio files :

Sunday, May 16th, 2010

This script may be of interest and value :

File: convertomp3
#!/bin/bash
#
# Usage: convertomp3 fileextention
#
if [ $1 = "" ];then
  echo 'Please give a audio file extention as argument.'
  exit 1
fi

for i in *.$1
do
  if [ -f "$i" ]; then
  rm -f "$i.wav"
  mkfifo "$i.wav"
  mplayer \
   -quiet \
   -vo null \
   -vc dummy \
   -af volume=0,resample=44100:0:1 \
   -ao pcm:waveheader:file="$i.wav" "$i" &
  dest=`echo "$i"|sed -e "s/$1$/mp3/"`
  lame -V0 -h -b 160 --vbr-new "$i.wav" "$dest"
  rm -f "$i.wav"
fi
done

Running convertomp3 wma will covert every .wma file in the current folder to .mp3.

How to win against your competitors in the search engines war ??

Friday, February 19th, 2010

Getting your website ranking as high as possible with major search engines is crucial for your business. It also gives you winning advantage against your competition. We will discuss in this article several factors that contribute to how high you can go on a search engine query result.

Please realize there is no such thing as a magic silver bullet that will vault you to the top of the search engines – if there were, everyone would know it, they would do it, and it would cease to work because of saturation.

Several strategies contribute to this, as you can see from the following. First, we will discuss the general strategies and techniques used with all major search engine. Then we will discuss the specific the specifics of what is currently working on each of the major search engines.

Part One : General Guidelines

Choosing your domain name :

One of the most basic, yet critically important, strategies is to use your best keywords in your domain address. An example would look like…

http://www.laptopshome.com

http://www.notebooksforsale.com

The reason for doing this is because search engines and directories assume the domain to be relevant to the keyword. It’s something that, in practicality, can’t be faked.

Getting your keywords into your domain name is strategically critical and chances are it will only become even more important in the future. Remember, by registering all possible keyword combination domain names you can think of you not only have them available to your company when needed but you’ve also prevented your competition from securing them and using them against you.

If your company name is your domain name, then that’s fine but you should still register all relevant keyword-rich domain names pertaining to your goods and services. This will give you the option of setting up specialized sites that place your services into the paths of the engines and directories.

Getting Your Web Page Titles Right :

This is all about your pages <TITLE> tag. Note in mind that Title is the most important aspect of web page design in respects to scoring well on most search engines.

Always make sure every word in your title is one that is likely to be used by a person when doing a keyword search for your business or service. AND, keep in mind that unless the name of your business is prominently recognized or likely to be used in a keyword search – something like “SONY cameras”, it does NOT belong in the Title tags.

Keyword Selection Techniques :

Make a list of every possible search word (keyword) and search phrase (keyphrase) that your potential customers
might use when looking for your information, product or service. Remember to include synonyms as well as the common misspellings of your keywords and pay particular attention to noun phrases. Next, use these keywords and keyphrases to find your competition on the top search engines.

Keyword Relevancy :

Simply put, your keywords must be relevant to the contents, or theme of your web page.

Keyword Density :

By this I mean the number of times your keyword(s) appear in relation to the other words on your web page.  Theoretically, a webpage that said only “Chicago” verses the “Eat at Chicago’s…” page would be given a higher score for the keyword Chicago due to a higher keyword density.

Description Meta Tag :

The meta description tag is used by many engines as the summary for your site when listed in the search results. It’s what tells a real person whether or not your site is relevant to their search. You should view it as a sales presentation for your link. If the meta description tag entices the searcher they will, theoretically, click your link and visit your site. Obviously that’s the purpose for being listed in the search engine in the first place.

Most search engines place a limit on the number of characters that a meta tag can contain. Once the limit is reached they typically ignore the rest of the tag contents. In general, 250 characters – including spaces and commas – is a good rule of thumb that falls within the guidelines of most engines.

Two Firefox add-ons to increase your productivity

Monday, January 18th, 2010

Below are two firefox add-ons productivity tools that should make your life a lot easier :

QuickFox Notes :

This is a note-taking add-on for Firefox that saves notes as bookmarks in Firefox. This means you get all the convenience of browser-based note-taking, and cross-browser syncing if you’re using Mozilla Weave, Xmarks, or another method to sync your bookmarks between instances of Firefox.

Read It Later :

Read it Later is an extension that works with a Web-based service.  Here’s how it works. Once you install the extension, RiL adds a yellow icon to the “Awesome bar” in Firefox, and a similar icon to the toolbar next to your search. When you’re on a page you want to save for later, just click the yellow icon.

Google Reader fans will also love RiL because it will also clip items from Google Reader without having to view the page first. Once the extension is installed, it adds a RiL icon to Google Reader items (right next to the star). Just click that and the entry will be added to.


Using Clam AntiVirus to provide real-time protection for your iFolder 3 Server

Sunday, September 13th, 2009

“Because iFolder is a cross-platform distributed solution, there is a possibility of a virus infection on a platform migrating across the iFolder server to other platforms, and vice versa. You should enforce server-based virus scanning to prevent viruses from entering the corporate network.”

This solution applies for openSuSE 11.1 :

The following packages need to be installed :

clamav
dazuko
postfix

Execute modprobe dazuko (as root)

Run lsmod and check that dazuko is loaded:

Edit /etc/init.d/boot.local

  • Add:
    modprobe dazuko

Edit /etc/clamd.conf

Enable logging by activating :
LogFile /var/log/clamd

* Activate:
# Path to a local socket file the daemon will listen on.
LocalSocket /var/lib/clamav/clamd-socket

* Deactivate:
# TCP port address.
#TCPSocket 3310

* Deactivate:
# TCP address.
#TCPAddr 127.0.0.1

* Activate and edit:
# Execute a command when virus is found.
VirusEvent /bin/echo “iFolder VIRUS ALERT: %v” | /bin/mail -s “ClamAV – iFolder” -r ClamAV@server.domain ToUser@domain

* Deactivate:
# Run as a selected user (clamd must be started by root).
#User vscan

Note:
If not deaktivating “User vscan” you receive the error: “clamuko cannot connect to dazuko” in /var/log/clamd

* Clamuko settings, Activate the following :

ClamukoScanOnAccess yes
ClamukoScanOnOpen yes
ClamukoScanOnClose yes
ClamukoScanOnExec yes
ClamukoIncludePath /YOUR_PATH_TO_IFOLDER/ifolder/simias/SimiasFiles

Change any other settings in the file to reflect your needs (see ClamAV documentation).

Start clamd:
/etc/init.d/clamd start

Check that clamd was started without any errors:
tail -f /var/log/clamd

Download the EICAR test signature from:
http://www.f-secure.com/virus-info/eicar_test_file.shtml

Note!
This is not a real virus.

Run: tail -f /var/log/clamd

Save the test file (eicar.zip and/or eicar.com) in your iFolder and wait for sync.

When the virus pattern is detected you should see this (see below) in the log file
/var/log/clamd.

Check that a mail has been sent: tail /var/log/mail

Update ClamAV:
You can update ClamAV using the command: freshclam

A better way is to use the freshclam daemon for automatic updates.

Settings for freshclam: /etc/freshclam.conf

Edit /etc/freshclam.conf

  • Activate:
    # Path to the log file (make sure it has proper permissions)
    UpdateLogFile /var/log/freshclam.log
  • Activate and provide your country code:
    # Uncomment the following line and replace XY with your country code.
    DatabaseMirror db.se.clamav.net
  • Activate and provide update interval (e.g 24 for every hour):
    # Number of database checks per day.
    Checks 24

Create a log file for freshclam:
touch /var/log/freshclam.log

Set file rights:
chown vscan:vscan /var/log/freshclam.log

Start freshclam:
/etc/init.d/freshclam start

Check the log file:
tail /var/log/freshclam.log

Activate automatic start for clamd, freshclam and postfix from Yast –> System –> System Services (Run Level).

Now you have a real-time anti-virus scanning for your iFolder3 server.

Basic FTP Commands

Wednesday, September 2nd, 2009

The FTP (File Transfer Protocol) utility program is commonly used for copying files to and from other computers. These computers may be at the same site or at different sites thousands of miles apart. FTP is a general protocol that works on UNIX systems as well as a variety of other (non-UNIX) systems.

Find below a listing of basic FTP commands :

? to request help or information about the FTP commands
ascii to set the mode of file transfer to ASCII
(this is the default and transmits seven bits per character)
binary to set the mode of file transfer to binary
(the binary mode transmits all eight bits per byte and thus provides less chance of a transmission error and must be used to transmit files other than ASCII files)
bye to exit the FTP environment (same as quit)
cd to change directory on the remote machine
close to terminate a connection with another computer
close brubeck closes the current FTP connection with brubeck,
but still leaves you within the FTP environment.
delete to delete (remove) a file in the current remote directory (same as rm in UNIX)
get to copy one file from the remote machine to the local machine
get ABC DEF copies file ABC in the current remote directory to (or on top of) a file named DEF in your current local directory.
get ABC copies file ABC in the current remote directory to (or on top of) a file with the same name, ABC, in your current local directory.
help to request a list of all available FTP commands
lcd to change directory on your local machine (same as UNIX cd)
ls to list the names of the files in the current remote directory
mkdir to make a new directory within the current remote directory
mget to copy multiple files from the remote machine to the local machine;
you are prompted for a y/n answer before transferring each file
mget * copies all the files in the current remote directory to your current local directory, using the same filenames. Notice the use of the wild card character, *.
mput to copy multiple files from the local machine to the remote machine;
you are prompted for a y/n answer before transferring each file
open to open a connection with another computer
open brubeck opens a new FTP connection with brubeck;
you must enter a username and password for a brubeck account
(unless it is to be an anonymous connection).
put to copy one file from the local machine to the remote machine
pwd to find out the pathname of the current directory on the remote machine
quit to exit the FTP environment (same as bye)
rmdir to to remove (delete) a directory in the current remote directory

Installing iFolder server on openSuSE 11.1

Monday, August 24th, 2009

iFolder is a simple and secure storage solution that can increase your productivity by enabling you to back up, access and manage your personal files-from anywhere, at any time. Once you have installed iFolder, you simply save your files locally-as you have always done-and iFolder automatically updates the files on a network server and delivers them to the other machines you use.

Using iFolder, you can designate any network server as an iFolder server and publish information to a personal iFolder created on that server. Once your folder is established, you can install iFolder on the computers you regularly use and download information from your personal iFolder to any of those computers. Not only that, but using iFolder, you can also invite other iFolder users to share your files in the same safe and secure way so that your teams always have the most relevant copy of a document.

You can download iFolder server for openSuSE 10.3 from this URL : http://www.ifolder.com/download/

But installing iFolder server on openSuSE 11.1 is a bit tedious as mono packages packed with version 11.1 are a bit advanced for iFolder. Find below instructions to help you out :

- Install iFolder server and plugins from this repo.

- Configure apache2 with SSL support.

- Setup by typing as root :

simias-server-setup

ifolder-admin-setup

ifolder-web-setup

in console and follow question given by each command.

- Change folder directory to /etc/apache2/conf.d by cd command and copy all .conf file to /etc/apache2 with cp command on console.

- Start apache service by typing service rcapache2 start in console.

- Allow services http and https in Firewall.

And you’re done.

IMPORTANT :

If you experience the following error code while the client is trying to connect to the server : Authentication Status Code: Unknown. The problem can be solved by NOT choosing the default server data location while running simias-server-setup. I have chosen /home/iFolder instead and that solved my problems. The server will create the folder for you with correct setup and permissions.

I would like to thank http://www.decriptor.com/2009/05/22/ifolder-on-opensuse-11-1/ for helping in creating the repository and making the above information available.


Installing ifolder3 server on openSuSE 10.3

Friday, July 10th, 2009

iFolder is a simple and secure storage solution that can increase your productivity by enabling you to back up, access and manage your personal files-from anywhere, at any time. Once you have installed iFolder, you simply save your files locally-as you have always done-and iFolder automatically updates the files on a network server and delivers them to the other machines you use.

Using iFolder, you can designate any network server as an iFolder server and publish information to a personal iFolder created on that server. Once your folder is established, you can install iFolder on the computers you regularly use and download information from your personal iFolder to any of those computers. Not only that, but using iFolder, you can also invite other iFolder users to share your files in the same safe and secure way so that your teams always have the most relevant copy of a document.

Below are installation instructions for openSuSE 10.3 server :

Download the following packages :

ifolder3 from http://www.kablink.org/index.php

http://ftp.novell.com/pub/mono/download/x86/mono/1.2.6-4/mono-core-1.2.6-4.novell.i586.rpm
http://ftp.novell.com/pub/mono/download/x86/mono/1.2.6-4/mono-data-1.2.6-4.novell.i586.rpm
http://ftp.novell.com/pub/mono/download/x86/mono/1.2.6-4/mono-data-sqlite-1.2.6-4.novell.i586.rpm
http://ftp.novell.com/pub/mono/download/x86/mono/1.2.6-4/mono-web-1.2.6-4.novell.i586.rpm
http://ftp.novell.com/pub/mono/download/x86/mono/1.2.6-4/mono-nunit-1.2.6-4.novell.i586.rpm
http://ftp.novell.com/pub/mono/download/x86/mono/1.2.6-4/mono-winforms-1.2.6-4.novell.i586.rpm
http://ftp.novell.com/pub/mono/download/noarch/xsp/1.2.6-2/xsp-1.2.6-2.novell.noarch.rpm
http://ftp.novell.com/pub/mono/download/suse-103-i586/mod_mono/1.2.6-1/apache2-mod_mono-1.2.6-1.suse103.novell.i586.rpm

Install as following :

rpm -i mono-core-1.2.6-4.novell.i586.rpm
rpm -i mono-data-1.2.6-4.novell.i586.rpm
rpm -i mono-data-sqlite-1.2.6-4.novell.i586.rpm
rpm -i mono-nunit-1.2.6-4.novell.i586.rpm
rpm -i mono-web-1.2.6-4.novell.i586.rpm –nodeps
rpm -i mono-winforms-1.2.6-4.novell.i586.rpm
rpm -i xsp-1.2.6-2.novell.noarch.rpm
rpm -i apache2-mod_mono-1.2.6-1.suse103.novell.i586.rpm

Then install iFolder server.


Bad Behavior has blocked 19 access attempts in the last 7 days.