Spiga

Advanced guide to Aspire one

December 28, 08 by Gabi Solomon

A friend of mine just bought a e-pc from acer that runs a custom linux OS called aspire one.
At first sight it seems like it a great solution for basic users since it has a very friendly interface, and it comes preinstalled with a a pack of software that is generally used like IM client, email reader, browser, office suite and much more.

aspire one 10 OS

But although this looks nice, it becomes a problem when you want more from your epc, when you want to install new apps or want to customize something. You dont even have a right menu on the desktop.

How to enable advanced menu [small hack]

To do this you will need to go to Files > My Documents. In the window opened go to the File Menu and click on Terminal.
In the terminal window input xfce-setting-show and hit enter.
This will bring up the Xfce Settings Manager.

Click on the Desktop link and you will get the Desktop Preferences window where you must select the Behavior tab.
Now mark under Menus the Show desktop menu on right click option and close the window.

Now you will bring up the normal desktop menu when you right click somewhere on the desktop which contains more options than the limited user interface on the Aspire One.

Changing the root password

Now for even more advanced usage you will need to use the root user. But after a lot of searching i came to the conclusion that you cant find out what the password for the root is, instead you can change it.

To do so you must click on the desktop and open a terminal window ( you can find it under System > Terminal ).
In the terminal window first type “Sudo –su” and hit Enter.
Then type “passwd” and hit Enter.
You will now be prompted to enter the new password. After typing press enter and retype it.
That is it. You have successfully changed the root password :D

Installing new applications

Now that you have enabled the advanced menu and have the root password you can proceed to installing new applications.
This is quite simple, you just right click on the desktop and select System > Add/Remove Software.
You will be prompted to enter the root password and after you enter it the package manager will launch.
And now the install should be easy as cake and is similar to any Linux based OS.

Adding new shortcuts to your desktop

Even though you have enabled the new advanced menu and you can access your new installed software from that menu, it just doesn’t feel right. I bet you want them to be included in the shortcuts from the desktop. Well that is just a bit tricky, you will need to edit an xml config file.
The address for it is :

/home/user/.config/xfce4/desktop/group-a pp.xml

Hope this was helpfull,
Cheers

Multilanguage database design approach

December 26, 08 by Gabi Solomon

Preinfo

Before you go right to the comment section and recommend gettext or other similar ways, know that i am talking about content that is manageable from an admin panel or is added by the user

Also this article is based on personal experience and is not necessary the best way to do this.

Building a metalanguage website poses a lot of problems, and one of them is how you store the content in the database for each language.

If you do a google search you will find little resources about it, and most of the are on forums. This seem a bit strange to me, so after i had decided on a database schema for a metalanguage website i decided to post it here in the hope that other people might find it useful and save them some googling time.

As far as i searched there are more or less 4 databases schemas for metalanguage website.

1. Column approach

This approach is very common and basically it duplicates the column of content for each language.

table pages
-- id (int)
-- title_en (varchar)
-- title_es (varchar)
-- content_en (varchar)
-- content_es (varchar)

The way you would query it is by automatically selecting the right columns according to the language chosen:

SQL:
  1. SELECT `id`, `title_en` AS `title`, `content_en` AS `content` FROM `pages`

Or you could select all and do the column selection from php :

PHP:
  1. echo $rowPage['title' . $_SESSION['currentLanguage']];

Advantages

  • It doesn't have duplicate content, since there is only one row for each record, and only the language columns are duplicated
  • Easy to implement

Disadvantages

  • You need to build the watch what column you are working with depending on the language
  • Hard to maintain. Although this is a easy way for 2-3 languages its becomes a real drag when you have a lot of columns or a lot of languages
  • Hard to add a new language

2. Multirow approach

Another approach that i saw but i have never worked with it. It is simillar to the one above but instead of duplicating the content in columns it does it in rows.

table pages
-- id (int)
-- language_id (int)
-- title (varchar)
-- content (varchar)

So you will basically have 3 rows for the same page if you have 3 languages. The main problem i see with this approach is that it would be a bit tricky to know witch id you will use for the table relations.

Sorry but since i dont really have experience with this i cant show you sql & php examples.

Advantages

  • Ease in adding a new language

Disadvantages

  • Need to watch the table relations
  • A lot of duplicate content. You will have duplicate content for all the columns that are not translated

3. Single Translation table approach

This is an approach that becomes a little more complex then the other 2, but it is more suited for dinamic websites and which have a large number of languages or which intend to add a new language in the future and want to do it with ease.

table languages
-- id (int)
-- name (varchar)

table pages
-- id (int)
-- language_id (int)
-- title (int fk)
-- content (int fk)

table translation
-- id (int)

table translation_entry
-- translation_id (int)
-- language_id (int)
-- content (text)

In this approach you would store the id from the translation table in the title and content columns from the pages table, and then do a join with the translation_entry table based on the language id.

Advantages

  • Proper normalization
  • Ease in adding a new language

Disadvantages

  • Longer joins and query to get the content
  • All the translated content goes into one table
  • For me it just looks hard to work with and maintain

4. Coupled Translation table approach [my aproach :D ]

This is a variation of the above approach that to me seems easier to maintain and work with.
Instead of having just one translation table, you have one for each table. and you move the columns from the pages that need to be translated to the translation table.

table languages
-- id (int)
-- name (varchar)

table pages
-- id (int)

table pages_translation
-- id (int)
-- page_id (int)
-- language_id (int)
-- title (text)
-- content (text)

To get your data you just do a simple join:

SQL:
  1. SELECT * FROM `pages` JOIN `pages_translation` ON `pages`.`id` = `pages_translation`.`page_id` WHERE `map_landmarks_translation`.`language_id`='1'

Advantages

  • Proper normalization
  • Ease in adding a new language
  • Easy to query
  • Columns keep there names

Disadvantages

  • You have to create translation tables for all your tables that have columns that need to be translated

Conclusion

I am sure that there are other methods of doing a multilingual website, this are just the ones that i thought are most commonly used. My solution is the best, its just the best for me, because it works for my project and its easier for me to work with compared to other approaches.
In the end the best approach is the one that is the best for you. The one that you find the most easier to work with and maintain.

Cheers,
and good coding.

Netbeans review

December 15, 08 by Gabi Solomon

There seems to be quite a few talks about netbeans these days. A lot of people blogged about it and sayd its the next big thing or something. I personally tested it a while ago, like 4-5 months i think, i dont remember exaclly what made me drop it so i said i must try this new version to see what all the fuss is about.

Now before i start, i want to give you a heads up :) . I am a big fan of zend studio, (am using 5.5, hate the 6 series) and all its features, so when i test a new editor i tend to compare it to zend. I know its not free and it really inst the cheapest editor, but i was lucky enough (or good enough, if i wasn't this modest) to win it as a prize at the Innovation Award on phpclasses.com.

Now back to NetBeans.

The first thing u should know is that its free. And this always counts as a big plus for any software.

As far as the interface is concerned, i like very much. Its very intuitive and simple to use. You have the general layout with projects on the left, content editor with all the basic features: tabs, sintax highlight, php code assist.
The first plus for netbeans would be the support for html, css, javascript and all the major javascript frameworks. Wich for some people count very much. This is something i admit i miss in Zend. There is a small support for html but that is it.

Another cool feature are the snippets (they caled them templates), this is when you tipe in class and it can automplete a basic class code for you. This templates can be edited so you can add any code snippet that u use very often here for faster writing.

I found that it has the functionality i didnt find in other editor except zend before. Things like :
- code assist for you own functions and classes
- really good code folding (some IDEs tend to get confused and have bad code folding)
- opening the file that contains the function/method on CTRL+click on the name (or any mouse + keyboard combination)

via http://codeutopia.net/

via http://codeutopia.net/

Altough some might disagree about the importance of these functions, i think they are crucial when working on big projects. I tend to forget where a function is on my projects after a while of not working on it, much more when it comes to projects running a script that is not coded by me. So the persons that don't think that is necessary ... try modifying lets say a magento powered store. Lets see how you find where a function is declared, and how much time you loose on this task.

So all these put together really made me think of switching to netbeans.
So i really gave it a try and started to use it to code a project.

I found that it is really great to work with, and personally it seemed a little faster then zend on loading times (sometimes zend would freeze a little on ALT+TAB).

Also found new features that i didn't find in Zend, that really were nice to have:
- Refactoring ( you can rename a variable or a method in your class and it gets renamed whereever its used in your project )
- ToDo list ( it has a small tab where it parses the files for TODO comment lines and shows them in that tab)
- phpdoc comments code assist
- a really nice debuger that integrates with Xdebug
- code assist offers a link to php website for the php functions
- support for CVS, Subversion and Mercurial

The bad side

At this point i was 95% convinced of switching to netbeans. But then it let me down. The Ftp support really sucked. This is another must have feature for me.
I am used of working on remote servers, dont really enjoy working localy. So i want a verry good FTP client in my IDE. I enjoy the way Zend has done it. You just add a ftp server and your done ... you can edit the files at will as if they were localy, you dont care how he downloads them makes the a temporary file etc. As soon as you hit Save the files gets uploaded to the server.

The way that netbeans does it is by downloading all the files localy at first, work on them locally and when you hit RUN in the IDE the ones modified gets transferred to the server. Wich might work when your developing a project on your own ... but when you develop with a team its just not going to work. Or even if your alone, but you just want to do some quick modification to a website that is online, its going to take a while to setup the project in netbeans.

I found a workaround to this problem, you could use an automatic syncronization tool like Fling to do the synk between the files online and the ones locally. But you must be carefull how you setup it so you don't overwrite others coworkers modification on the project.

Another smaller issue in netbeans is the file path. If your working on a file it doesnt show you the path of that file. So you dont know on wich file your actualy working since many times files have the same names either in diferent components of the same project or you can mistakenly edit the same file from a diferent project. It does display it as a tool tip on the tabs name but the best way i see this done is in the application title bar.

Conclusion

I agree that Netbeans is a great IDE and it has a lot of features, even ones i cant find in Zend, and if your a javascript developer thant this would be right for you. But until they redo the FTP client or someone writes a better FTP plugin, i cant use it. So i am stuck with Zend again :D
Altough i will be following the evolution of netbeans and maybe switch when they will have a better ftp support.

Cheers

using Zend Framework Language component

by Gabi Solomon

Today i will continue the series of articles on the zend framework and i am going to talk about how i come to use the language component from zend.

The way i decided to go with it is by having a controller plugin that starts the language component and also detects the language.

But first thing first. We need to make the url to allow us to change the language. And to do that i added a new rule in the bootstrap file:

PHP:
  1. $route = new Zend_Controller_Router_Route(
  2.             ':language/:controller/:action/*',
  3.                 array(
  4.                     'language'   => 'en',
  5.                     'module'     => 'default',
  6.                     'controller' => 'index',
  7.                     'action'     => 'index'
  8.                 )
  9.             );
  10.         $router->addRoute('lang_default', $route);

This rule will produce urls like:

http://www.domain.com/en/controller/action

http://www.domain.com/es/controller/action

I decided to go with this type of URL instead of caching or storing the language in the session to not have google consider our pages as duplicate content. I have read that it better to go with subdomains (ex: http://en.domain.com/controller/action ) that with directories but for now i will do it this way.

Now that we are still in the bootstrapfile, we will also add our plugin:

PHP:
  1. Zend_Controller_Front::getInstance()->registerPlugin(new GSD_Controller_Plugin_Language());

ANd now for the final touch the plugin:

PHP:
  1. <?php
  2.  
  3.  
  4.  
  5. /**
  6. * Front Controller Plugin
  7. *
  8. * @uses       Zend_Controller_Plugin_Abstract
  9. * @category   GSD
  10. * @package    GSD_Controller
  11. * @subpackage Plugins
  12. */
  13. class GSD_Controller_Plugin_Language extends Zend_Controller_Plugin_Abstract
  14. {
  15.        
  16.     public function routeShutdown(Zend_Controller_Request_Abstract $request)
  17.     {
  18.        
  19.         $locale = new Zend_Locale();
  20.        
  21.         $options = array('scan' => Zend_Translate::LOCALE_FILENAME);
  22.         $translate = new Zend_Translate('gettext', Zend_Registry::get('siteRootDir') . '/application/languages/', 'auto', $options);
  23.        
  24.         $requestParams = $this->getRequest()->getParams();
  25.         $language = (isset($requestParams['language'])) ? $requestParams['language'] : false;
  26.                 if ($language == false) {
  27.                      $language = ($translate->isAvailable($locale->getLanguage())) ? $locale->getLanguage() : 'en';
  28.                 }   
  29.         if (!$translate->isAvailable($language)) {
  30.             throw new Zend_Controller_Action_Exception('This page dont exist',404);
  31.         } else {
  32.        $locale->setLocale($language);
  33.             $translate->setLocale($locale);
  34.             
  35.             Zend_Form::setDefaultTranslator($translate);                                
  36.    
  37.            
  38.             setcookie('lang', $locale->getLanguage(), null, '/');
  39.             
  40.             Zend_Registry::set('Zend_Locale', $locale);
  41.             Zend_Registry::set('Zend_Translate', $translate);
  42.         }
  43.     }
  44. }

A few explanations on the code.
I am using gettext adapter with auto mode ... witch will basically crawl the language directory to detect what languages can you support. I also use it conjunction with Zend Locale and at the end i store the in the Registry.
Storing Zend translate in the registry will enable you to use it in the view in a very easy way using a built in helper.

Using translate in you controllers

PHP:
  1. $this->view->title = $this->view->translate('default-register-index-title');

Using translate in you views

PHP:
  1. <?php echo $this->translate('default-register-index-title'); ?>

As a note i am not using the full text for translate i am using keys that have a naming conventions like "module-controller-action-message". I find it much more easier then putting the whole string and also much more easier to maintain. Imagine if you misspelled a string, or want to modify it ? you will then have to modify it every in your code.

That is basically it.
Cheers

Update:
I have also published this plugin on phpclasses, you can find it here.

Automatic FTP Uploading & Synchronize

December 14, 08 by Gabi Solomon

The problem

If you are developing or using remote files you might be interested in services like dropbox witch allow you to copy a file in a folder in your computer and have it uploaded to a remote location. I personally love dropbox and usit as a back-up & sharing that i can access from multiple locations. I store my password manager software on it for example :)

But services like dropbox dont solve all your problems since sometimes you might want to sincronize to a location of your choise, like a FTP server.

This really comes in handy when you develop web application on a server you installed on your computer. I personally dont do it because of 2 reasons:
1. i have to remember to upload the copy to the remote server
Cant really show the client from my computer or have it stored on a stick with a portable webserver.
Also, having the last copy online is good when you might login and do modifications from multiple computers.

2. compatibility issues
There is always the possibility of the application working on my computer and not on the server. This is both due to the difference in OS but also in the serves configurations.

But i can see the advantage of having application developed locally. The most important would be speed ( saving files and viewing the website ), also not depending on the internet connection ( yes, e i get that sometimes, at night, probably from all the guys logging in to download torrents & porn ).

The solution

Well i recently discovered a really handy piece of software that solve my first problem. Its called
Fling FTP Software and is a powerful ftp program that allows you to synchronize a local folder with an remote one by using FTP.

The cool feature about it is that it integrates really well with your Windows explorer.

Also you have several options of synchronization, including sync between hardisks, network folders and flash sticks.

The way fling works is you setup rules for each folders you want to sync.
This is done in 2 steps:
1. You setup the source and destination folder

1. You setup the scanning options
Here you have the options of telling fling when you want the transfers to be executed and in which way. You have options to do it manually, automatically or at preset intervals. You can also specify witch is the primary source ( when files are conflicting witch one to keep )

I find this software really useful and another cool feature about it : Fling is completely free.

Download Fling FTP Software 2.02

Cheers

determining the application root path and url in php

December 13, 08 by Gabi Solomon

If you buid any web application you will eventually need to find a way to specify the application root path and URL. This is inevitable if you don't build your links in a relative way ( by unsing ./ and ../ combinations ), and also if you want to have a way of keeping things organized and working even if you move script to a new server or in a folder.

Well there are several ways you can do this. The first one would be to write them in a config file by hand, and edit them as you move the project.

PHP:
  1. define('ROOT_PATH', '/home/user/public_html/folder/');
  2. define('PROJECT_DIR', '/folder/');
  3. define('BASE_URL', 'http://' . $_SERVER['HTTP_HOST'] . PROJECT_DIR);

But even if that works well, it will give a bit of work when you move the application since you have to edit them by hand.
So the next method would be to have them be generated automatically. The ROOT_PATH is relatively easy to determine . What i do is have a directory called config in wich i place my config files, in it i have one called main_config.php which includes the rest of the config files. One of them is called paths.php.
Now to determine the root_path i use a function called dirname() and the __FILE__ constant.

PHP:
  1. define('ROOT_PATH', dirname(dirname(__FILE__)));
  2. define('PROJECT_DIR', '/folder/');
  3. define('BASE_URL', 'http://' . $_SERVER['HTTP_HOST'] . PROJECT_DIR);

Now we have the root_path solved and base_url to some extend, but need to specify the project directory.
We can solve that too automatically.

PHP:
  1. define('ROOT_PATH', '/home/user/public_html/folder/');
  2. $projectDir = implode('/', array_intersect(explode('/', $_SERVER["REQUEST_URI"]), explode('/', str_replace('\\', '/', ROOT_PATH))));
  3. if ($projectDir[strlen($projectDir)-1] != '/') {
  4.         $projectDir .= '/';
  5. }
  6. define('PROJECT_DIR', $projectDir);
  7. define('BASE_URL', 'http://' . $_SERVER['HTTP_HOST'] . PROJECT_DIR);

What that code does is take the ROOT_PATH that we defined and the REQUEST_URI from the server global variable and do an intersection of them to determine the project dir.

Hope this small snippet helped you.
Cheers

Zend Framework View Helper for Smarty Cycle

December 09, 08 by Gabi Solomon

As i stated in a recent post i am now starting to learn Zend Framework. And with all new things that you learn, you try to find the old ways ( at least i do :D ).

So today i was trying to find a method of creating a zebra table. The old way i used to this back when i was using smarty is by using the cycle custom function. Basically it will just alternate through a set of values to create the effect.

PHP:
  1. {section name=rows loop=$data}
  2. <tr bgcolor="{cycle values="#eeeeee,#d0d0d0"}">
  3.    <td>{$data[rows]}</td>
  4. </tr>
  5. {/section}

Then when i moved on and stop using smarty, i wrote a similar function for my template engine.

So now i am looking for a similar solution on Zend Framework. Luckily for me some bright fellows have already thought of me :D .
In the zend wiki there is a Zend_View_Helper_Cycle Component Proposal that does exacly what i was wishing for :D .

Heres an example of how you can use it:

PHP:
  1. <?php $cycle=$this->cycle(array("#F0F0F0","#FFFFFF"));?>
  2. <?php foreach ($this->books as $book):?>
  3.   <tr  style="background-color:<?=$cycle->next()?>">
  4.   <td><?=$this->escape($book['author']) ?></td>
  5. </tr>
  6. <?php endforeach;?>

The proposal has been approved for development in standard/incubator.
You can download it from here.

Cheers.

[php class] Open Inviter – Get contacts of friends of different networks

December 01, 08 by Gabi Solomon

Yet another great class found on the php classes website.
This one has been in my draft folder for a while (the place i keep my articles ideas ), and finally it came time to write about it (manage to put my laziness away and write it).

The class is called open Inviter and has received the rank of november 2008 Nominee for Innovation Award. I personally hope it will win it, i think it really deserves it.

Describtion

This package can be use to get the contacts of friends of different e-mail providers and social networks.

It can access the Web services servers of different networks to retrieve the contacts of friends of a given user.

Each network is accessed by the means of plug-in classes. Some plug-ins support sending invitation messages to friends to be added to the user contacts.

The class currently comes with plug-ins that support :
* AOL
* GMail
* GMX.net
* Windows Live (Hotmail)
* Katamail
* Lycos
* Mail.com
* Mail.ru
* Rambler.ru
* Rediff
* Yahoo!
* Yandex
* Facebook
* Hi5
* LinkedIn
* MySpace
* Orkut
* Twitter

The class is very easy to use, and comes with a very detailed example of how you can implement it.

[Class full description & download link]

Hope it helps you in your development.

Cheers.

Zend Framework modular directory structure

by Gabi Solomon

After a lot of thinking and going back and forth about this idea, i finally decided to start using ( learning at first ) zend framework.

The main decision was to go with an already built framework or an inhouse one. And although i really like reinventing the wheel sometimes, i said i will not do the same this time.

After deciding i wanted to use an exiting framework, i had 2 candidates in mind : CodeIgniter or zend framework. The plus for codeigniter was the fact that it went with a more familiar approach to MVC, and the plus for zend was the company behind it. The downside about zend, was for me at least, the size of it, and the fact that it seemed a lot to learn.

But i decided to take a chance and learn Zend. The main problem i had was how to start ( as all things are :D ). Because the have such a freedom in development, i was a little puzzled on how to structure my application.

The only thing i knew was that i wanted to go with a modular structure. From there i did a lot of googling, read and watched a few presentation about this topic and finaly came up with a structure wich is bassed much on Wil Sinclair proposal.

My Zend modular structure

I will try to explain it, why i chose it this way and what each folder contains.

1. Application

The main aplication folder
1.1 Config - Contains application configuration files ( ex: mysql details )
1.2 Controllers - General Controllers, that are common in all modules
1.3 Languages - Holds the language files
1.4 Layouts - This directory is for MCV based layouts.
1.5 Models - This directory holds the application models ( in put them here instead of the modules directory since i belive there are common to all application and its more better this way )
1.6 Modules - I really liked the idea of modules that zend used because it enables you to organize your controllers and views much better in a separate folder for different sections of a website ( for example the main website, editors area and admin panel )
1.7 Views - I also included a views folder in the main application because i though i could use it to store common views for the 3 modules.

2. Data

This folder holds various information that is temporary, like cache, session data etc.

3. Docs

This directory is for documentation automatically generated or hand written.

4. Library

This directory holds the library Zend Framework files and also other folders for your own library (extended from Zend or not). I have one called GSD that extends some zend classes.

5. Public

This directory would contain the public files for your application: index.php. index.php ( this will include the bootstrap.php file from your application/ directory) and the front end assets (css, javascript, images, flash etc )

6. Tests

This directory would hold the application tests. This is a cool feature about Zend that it has support for writing application tests to better test your code during development.

Final Words

Ok this is about it so far. I am still a beginer with zend, and this structure is what i have thought off so far, and it doesn't have some real application testing. Use it at your own expense :) )
I am sure as i start developing using zend that it will be modified.

Another bad thing about zend is that there aren't so much resources and real examples about it, this is why i will write about my journey with zend here. Hopefully somebody will benefit from it. :)

Cheers

[phpclass] dinamicParams – Calling function with named params

November 23, 08 by Gabi Solomon

A lot of time while developing a function or a method of a class you need to specify 1, 2 or 3 parameters as inputs for that function or method. But usually as you develop further you might end-up in the situation where you would want to add a new parameter to your function.

And so you might have coded a function that has 5 or more parameters, and although it works fine, eventually you will want to call that function and leave the first 4 parameters with the default value and only change the last one. I ended up here a lot of times, and normally in php there is nothing you can do.

A workaround would be to specify the params as a single array variable, but that is just making you write more code and it looks really bad ( at least in my opinion).

Well today i found a new method of doing this in php5 with the help of the Reflection API that is offer in php5. I will not get into to much details about what it does, you can read that in the documentation, basicly it provides a way to reverse-engineer classes, interfaces, functions and methods.

So i wrote a simple class that is going to solve that problem.

With the help of the Reflection API from php5 the class will allow you to call function and methods by providing the parameters as an array specifying names and values even if the original function or methods receives them in the normal fashion.

But enough talk, heres the example.

PHP:
  1. <?php
  2. require('dinamicParams.class.php');
  3.  
  4. class news {
  5.  
  6.     function fetch ( $id, $page = 0, $items_pp = 10, $order_by = 'date', $method = 'desc') {
  7.         echo "
  8.             id: $id,
  9.             page: $page,
  10.             items_pp: $items_pp,
  11.             order_by: $order_by,
  12.             method: $method
  13.         ";
  14.     }
  15.  
  16. }
  17.  
  18.  
  19.  
  20. $news = new news();
  21. $dinamicParams = new dinamicParams();
  22.  
  23. $dinamicParams->call(array($news, 'fetch'), array('order_by' => 'name'));

This will output :

id: , page: 0, items_pp: 10, order_by: name, method: desc

This class is based on this implementation of the reflection API.
It is available on phpclasses can be downloaded here