New website done Neighbourhood Language Club 78

Logo of NLC78 Association

I’ve just done a new website for one of my personal client as an auto-entrepreneur. NLC78 is an association-profit organization that offers language courses and personalized support for everyone ! From the youngest to seniors. They also offer education support for disabled people. It was really interesting working for them and see how motivated is the team behind the scene. The particularity of this website was the fact it was totally localized to a specific area of France (Yvelines).

More to come about this website as it will be internationalized.

I’m pretty proud about this website as it’s my first one as an auto-entrepreneur. Thanks to my client who trust me all along the project !

Finally, this project will be added to my portfolio in a few weeks.

Job in the gaming industry

I’ve found a job beginning of November in the gaming industry which I thought never ended in such an industry.
When recruiter asked me about what video games I was playing on my PS3, I’ve answered only games that weren’t from the company I was trying to join.

Long story short, now I’m more an project & account manager than a lead web project manager. Higher vision of all big projects going on within the company.

On vacation

I’m currently in holidays and be back beginning in September. Good upcoming posts about e-commerce and Magento.

Add column to product grid properly

app/code/local/My/Module/etc/config.xml

<config>
    <adminhtml>
        <events>
            <adminhtml_block_html_before>
                <observers>
                    <mymodule>
                        <!-- Add column to catalog product grid -->
                        <class>mymodule/adminhtml_observer</class>
                        <method>onBlockHtmlBefore</method>
                    </mymodule>
                </observers>
            </adminhtml_block_html_before>
            <eav_collection_abstract_load_before>
                <observers>
                    <mymodule>
                        <!-- Add column to product list -->
                        <class>mymodule/adminhtml_observer</class>
                        <method>onEavLoadBefore</method>
                    </mymodule>
                </observers>
            </eav_collection_abstract_load_before>
        </events>
    </adminhtml>
</config>

app/code/local/My/Module/Model/Adminhtml/Observer

class My_Module_Model_Adminhtml_Observer
{
 
    public function onBlockHtmlBefore(Varien_Event_Observer $observer) {
        $block = $observer->getBlock();
        if (!isset($block)) return;
 
        switch ($block->getType()) {
            case 'adminhtml/catalog_product_grid':
                /* @var $block Mage_Adminhtml_Block_Catalog_Product_Grid */
                $block->addColumn('COLUMN_ID', array(
                    'header' => Mage::helper('mymodule')->__('COLUMN HEADER'),
                    'index'  => 'COLUMN_ID',
                ));
                break;
        }
    }
 
    public function onEavLoadBefore(Varien_Event_Observer $observer) {
        $collection = $observer->getCollection();
        if (!isset($collection)) return;
 
        if (is_a($collection, 'Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection')) {
            /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection */
            // Manipulate $collection here to add a COLUMN_ID column
            $collection->addExpressionAttributeToSelect('COLUMN_ID', '...Some SQL goes here...');
        }
    }
 
}

This come from Clockworkgeek user on a stackoverflow question. This is gold!

WordPress bash deployment script

programming-blog_wp-content

Recently in my current company we had a client asking for a restaurant website. We’ve decided to do it with WordPress and used it as a CMS instead of a blog. Beside the fact that we needed to create the website, they also requested us to make all the maintenance of the website and their blog. What I suggested was to have a staging platform and of course the production platform.

To do make the deployment process from staging to production seamless, I’ve created a WordPress bash deployment script to easily go from staging to production. Some of you will ask me about the development platform? To do so, we’ve used a service called DeployHQ that works pretty well. It fetch all the content of your SVN repository and push it straight to the FTP. The only tricky part was for the database. I know it wasn’t clean but I made the decision to work on the same database for the staging and development part.

If you have any suggestions about improving this script do not hesitate.

Please consider the following on our installation:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/bin/sh
#
# Written by Emmanuel Pays <landmanu /a-t/ ekoote.com>
#
# Description : Use this script to deploy in production a Wordpress blog that already exist on the same machine
#
# staging_to_production_wordpress.sh ver. 1.0
#
# Latest version can be found at http://blog.loopion.com/
# Todo
# - DONE - Email when deployment is done
# - Execution time for the script
# - Set version on meta or anywhere else to keep track of deployment version
 
# Global config
www_path="/var/www/vhosts/${domain}/"
backup_path_db="${www_path}backup_db/"
backup_path_files="${www_path}backup_files/"
domain="yourdomain.com"
SUBJECT="${prod_uri} deployment successful"
EMAIL="your@email.com"
 
#Staging info
staging_uri="staging.${domain}"
root_staging_path="${www_path}subdomains/staging/httpdocs/"
staging_db_name="dbname"
staging_db_username="dbusername"
staging_db_pass="dbpass"
 
#Production info
prod_uri="testdeploy.${domain}"
root_prod_path="${www_path}"
prod_db_name="dbprod"
prod_db_username="dbusername"
prod_db_pass="dbpass"
 
#Create backup
backup_db_filename="database_$(date +%F_%Hh%M).bak.sql.bz2"
backup_file_filename="files_$(date +%F_%Hh%M).tar.bz2"
 
#Create files backups
tar -cjPf ${backup_path_files}prod_${backup_file_filename} ${root_prod_path}
chown ftproot:psaserv ${backup_path_files}prod_${backup_file_filename}
echo "Backup prod files done..."
tar -cjPf ${backup_path_files}staging_${backup_file_filename} ${root_staging_path}
chown ftproot:psaserv ${backup_path_files}staging_${backup_file_filename}
echo "Backup staging files done..."
 
mysqldump --add-drop-table -h ${staging_uri} -u ${staging_db_username} -p${staging_db_pass} ${staging_db_name} | bzip2 -c > ${backup_path_db}${backup_db_filename}
chown ftproot:psaserv ${backup_path_db}${backup_db_filename}
echo "All backups done..."
 
#Copy staging database to production database
mysqldump --add-drop-table -h ${staging_uri} -u ${staging_db_username} -p${staging_db_pass} ${staging_db_name} | mysql -h ${prod_uri} -u ${prod_db_username} -p${prod_db
_pass} ${prod_db_name}
echo "Database replication to production done..."
#Copy all files from staging to production
cp -rR  ${root_staging_path}. ${root_prod_path}
echo "Files copied from ${staging_uri} to ${prod_uri}"
#Update production tables
mysql -h ${prod_uri} -u ${prod_db_username} -p${prod_db_pass} ${prod_db_name}<<EOFMYSQL
UPDATE wp_posts SET post_content = REPLACE (post_content,'$staging_uri','$prod_uri');
UPDATE wp_posts SET guid = REPLACE (guid,'$staging_uri','$prod_uri');
UPDATE wp_posts SET guid = REPLACE (guid,'localhost','$prod_uri');
UPDATE wp_blc_instances SET raw_url = REPLACE (raw_url,'$staging_uri','$prod_uri');
UPDATE wp_blc_links SET url = REPLACE (url,'$staging_uri','$prod_uri');
UPDATE wp_blc_links SET final_url = REPLACE (final_url,'$staging_uri','$prod_uri');
UPDATE wp_contact_form_7 SET mail_2 = REPLACE (mail_2,'$staging_uri','$prod_uri');
UPDATE wp_contact_form_7 SET mail = REPLACE (mail,'$staging_uri','$prod_uri');
UPDATE wp_options SET option_value = REPLACE (option_value,'$staging_uri','$prod_uri');
UPDATE wp_options_bak SET option_value = REPLACE (option_value,'$staging_uri','$prod_uri');
UPDATE wp_usermeta SET meta_value = REPLACE (meta_value,'$staging_uri','$prod_uri');
UPDATE wp_sitemeta SET meta_value = REPLACE (meta_value,'$staging_uri','$prod_uri');
UPDATE wp_site SET domain = REPLACE (domain,'$staging_uri','$prod_uri');
UPDATE wp_postmeta SET meta_value = REPLACE (meta_value,'$staging_uri','$prod_uri');
UPDATE wp_blogs SET domain = REPLACE (domain,'$staging_uri','$prod_uri');
#Replace upload path
UPDATE wp_options SET option_value = REPLACE (option_value,'${root_staging_path}','${root_prod_path}');
UPDATE wp_options_bak SET option_value = REPLACE (option_value,'${root_staging_path}','${root_prod_path}');
#Blog replacement
UPDATE wp_2_posts SET post_content = REPLACE (post_content,'$staging_uri','$prod_uri');
UPDATE wp_2_posts SET guid = REPLACE (guid,'$staging_uri','$prod_uri');
UPDATE wp_2_postmeta SET meta_value = REPLACE (meta_value,'$staging_uri','$prod_uri');
UPDATE wp_2_options SET option_value = REPLACE (option_value,'$staging_uri','$prod_uri');
EOFMYSQL
echo "MySQL production database URI changed"
cp -f ${www_path}subdomains/testdeploy/conf/wp-config.php ${root_prod_path}wp-config.php
echo "wp-config.php copied"
mv ${root_prod_path}wp-content/w3tc-${staging_uri} ${root_prod_path}wp-content/w3tc-${prod_uri}
mv ${root_prod_path}wp-content/w3tc-fig-and-olive-blog.${staging_uri} ${root_prod_path}wp-content/w3tc-fig-and-olive-blog.${prod_uri}
mv ${root_prod_path}wp-content/w3-total-cache-config-${staging_uri}.php ${root_prod_path}wp-content/w3-total-cache-config-${prod_uri}.php
mv ${root_prod_path}wp-content/w3-total-cache-config-fig-and-olive-blog.${staging_uri}.php ${root_prod_path}wp-content/w3-total-cache-config-fig-and-olive-blog.${prod_uri}.php
chown ftproot:psaserv httpdocs/
 
# Email text/message
EMAILMESSAGE="/tmp/emailmessage.txt"
echo "Deployment on ${prod_uri} platform completed at $(date +%F_%Hh%M)"> $EMAILMESSAGE
echo "This is email text" >>$EMAILMESSAGE
# send an email using /bin/mail
mail -s "${SUBJECT}" "${EMAIL}" < $EMAILMESSAGE

Nightly backup your WordPress database and files

boot_sgd[1]

After rading Using a Cron job to keep things safe I didn’t found this really a complete procedure as it only backup the database… I think it’s better to backup everything at once and we usually have some associated files like for example themes, images uploaded, etc… remaining that we don’t won’t to lost. So here is a solution to keep a copy of everything no matter what happen and unobstructive while visitors are visiting.

UPDATE 03/02/2011 -1.1:

  • Added a functionality to remove all file into the backup folder older than the specified number of days. Just set days_delete and it will delete all files older than days_delete days.
  • Added security to stop script if an error goes wrong

Just set up a cronjob and you’re good to go.

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
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/sh
#
# Written by Emmanuel Pays <landmanu /a-t/ ekoote.com>
#
# Description : Use this script to backup a Wordpress blog
#
# wordpress_backup.sh ver. 1.1
#
# Latest version can be found at http://blog.loopion.com/
 
# Global config
set -e
www_path="/var/www/vhosts/"
backup_path_db="${www_path}backup_db/"
backup_path_files="${www_path}backup_files/"
domain="yourdomain.tld"
days_delete=5
 
#Production info
prod_uri="www.${domain}"
root_prod_path="${www_path}httpdocs/"
prod_db_name="name"
prod_db_username="username"
prod_db_pass="password"
#Create backup
backup_db_filename="database_$(date +%F_%Hh%M).bak.sql.bz2"
backup_file_filename="files_$(date +%F_%Hh%M).tar.bz2"
 
#Create files backups
tar -cjPf ${backup_path_files}prod_${backup_file_filename} ${root_prod_path}
chown ftproot:psaserv ${backup_path_files}prod_${backup_file_filename}
echo "Backup prod files done..."
 
mysqldump --add-drop-table -h localhost -u ${prod_db_username} -p${prod_db_pass} ${prod_db_name} | bzip2 -c > ${backup_path_db}${backup_db_filename}
chown ftproot:psaserv ${backup_path_db}${backup_db_filename}
echo "All backups done..."
 
#Delete older backups
find ${backup_path_db}* -mtime +${days_delete} -exec rm {} \;
echo "Deleted last ${days_delete} database backup"
find ${backup_path_files}* -mtime +${days_delete} -exec rm {} \;
echo "Deleted last ${days_delete} files backup"

Coming soon a deployment script…

Delete all .SVN folders and files from a directory

Nice DOS command script to remove all .svn files and folders. Some guy’s don’t know already the export function of SVN…

for /f "tokens=* delims=" %%i in ('dir /s /b /a:d *svn') do (
rd /s /q "%%i"
)

Am I a curator?

Link: Am I a curator?

En lisant cet article je me suis énormément reconnu. Pouvez vous me le confirmer ?

Il faut toujours avoir des projections pessimiste mais avoir une motivation et un morale optimiste. Non ?

Mulve.com – Mp3 Music Search and Music Downloads

Link: Mulve.com – Mp3 Music Search and Music Downloads

Ok, now we are talking! Piracy will continue and drain a lot of new users everyday. How do you want to stop that?

Mulve sounds to get 90’s and early 00’s back on the stage with Napster like software, where are we going?

Answer: in a KISS direction. Keep It Stupid Simple!

Page 1 of 1012345...10...Last »