<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9123119364780846450</id><updated>2011-10-07T09:37:17.129-04:00</updated><category term='cronjob'/><category term='mysql cronjob'/><category term='regex'/><category term='mediawiki'/><category term='Network Programming'/><category term='boot'/><category term='debugging'/><category term='software'/><category term='browser'/><category term='convert'/><category term='rails'/><category term='ram'/><category term='ruby encryption'/><category term='tomcat'/><category term='testing'/><category term='sym link'/><category term='bash'/><category term='imagemagik'/><category term='vmware linux vmtools'/><title type='text'>Stuff about Linux and Open Source Software</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dejant.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-233703828639610642</id><published>2011-10-07T09:35:00.001-04:00</published><updated>2011-10-07T09:37:17.165-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cronjob'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Tomcat: check if process is running</title><content type='html'>Put this in a cronjob and check every 5 min:&lt;br /&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;if [ `ps x | grep "java.*&lt;my_process_name&gt;" | grep -v grep | grep -vi screen | wc -l` = "0" ]&lt;br /&gt;then&lt;br /&gt;  cd /root/my_app&lt;br /&gt;  ./start &amp;gt; /dev/null &amp;amp;&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;/my_process_name&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-233703828639610642?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/233703828639610642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/233703828639610642'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2011/10/tomcat-check-if-process-is-running.html' title='Tomcat: check if process is running'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-6402578199508460256</id><published>2011-09-07T10:52:00.002-04:00</published><updated>2011-09-07T10:59:54.473-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ram'/><category scheme='http://www.blogger.com/atom/ns#' term='boot'/><title type='text'>Run Linux in RAM</title><content type='html'>vmlinuz initrd=initrd.img ro quiet&lt;br /&gt;root=CDLABEL=Fedora7-Live-i386 rootfstype=iso9660&lt;br /&gt;liveimg live_ram&lt;br /&gt;&lt;br /&gt;RAM &amp;lt;- /lib, /usr/lib (0.5G)&lt;br /&gt;You can also make a folder in /usr called preload (or whatever) and mount that in RAM, link things back to /usr/lib and the symlinks that rely on (..) to point to /usr will still work. Lets you pick and choose whats loaded and could be automated with back script!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-6402578199508460256?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/6402578199508460256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/6402578199508460256'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2011/09/run-linux-in-ram.html' title='Run Linux in RAM'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-7810554041313535143</id><published>2011-07-23T15:36:00.002-04:00</published><updated>2011-07-23T15:44:54.596-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vmware linux vmtools'/><title type='text'>Install VMware tools on Linux</title><content type='html'>&lt;ol&gt;&lt;li&gt;Install your Red Hat or CentOS virtual machine (VM) using  whichever mechanism works best for your environment. I use a Preboot  eXecution Environment, or PXE, bootserver for such things. &lt;/li&gt;&lt;li&gt; Configure the Red Hat or CentOS VM using your standard procedures.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Then, perform the following additional configuration steps: &lt;/p&gt;&lt;ol&gt;&lt;li&gt; &lt;tt&gt;rpm --import http://packages.vmware.com/tools/VMWARE-PACKAGING-GPG-KEY.pub&lt;/tt&gt; &lt;/li&gt;&lt;li&gt; Use the following script to create a repository file useable by the yum command. &lt;p&gt;Note  that you need to substitute &lt;esx-version&gt; with 3.5u2, 3.5u3, or  3.5u4. You also need to substitute &lt;arch&gt; with either i686 or  x86_64 depending on whether your VM is a 32-or 64-bit VM, respectively. &lt;/arch&gt;&lt;/esx-version&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;tt&gt;cat &amp;gt; &amp;gt;  /etc/yum.repos.d/vmware-tools.repo &amp;lt; &amp;lt;  EOF [vmware-tools]&lt;br /&gt;name=VMware Tools for Red Hat Enterprise Linux $releasever - $basearch&lt;br /&gt;baseurl=http://packages.vmware.com/tools/esx/&lt;esx-version&gt;/rhel5/&lt;arch&gt; &lt;p&gt;&lt;tt&gt;enabled=1&lt;br /&gt;gpgcheck=1&lt;br /&gt;gpgkey= http://packages.vmware.com/tools/VMWARE-PACKAGING-GPG-KEY.pub&lt;br /&gt;&lt;/tt&gt;&lt;/p&gt;&lt;p&gt;&lt;tt&gt;&lt;tt&gt;EOF&lt;/tt&gt;&lt;/tt&gt;  &lt;/p&gt;&lt;/arch&gt;&lt;/esx-version&gt;&lt;/tt&gt;&lt;p&gt;For example, within a 32-bit VM where the ESX version is v3.5 U3 I used the following: &lt;/p&gt;&lt;p&gt;&lt;tt&gt;cat &amp;gt; &amp;gt;  /etc/yum.repos.d/vmware-tools.repo &amp;lt; &amp;lt;  EOF&lt;br /&gt;[vmware-tools]&lt;br /&gt;name=VMware Tools for Red Hat Enterprise Linux $releasever - $basearch&lt;br /&gt;baseurl=http://packages.vmware.com/tools/esx/3.5u3/rhel5/i686&lt;br /&gt;enabled=1&lt;br /&gt;gpgcheck=1&lt;br /&gt;gpgkey= http://packages.vmware.com/tools/VMWARE-PACKAGING-GPG-KEY.pub&lt;br /&gt;EOF&lt;/tt&gt;&lt;/p&gt;&lt;p&gt;To remove the tools, make the following commands:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;tt&gt; yum remove vmware-tools-* open-vm-tools-*&lt;/tt&gt; &lt;/li&gt;&lt;li&gt; &lt;tt&gt;yum -y install xorg-x11-drv-vmware xorg-x11-drv-vmmouse&lt;/tt&gt; &lt;/li&gt;&lt;li&gt; &lt;tt&gt;yum -y install vmware-tools open-vm-tools-xorg-drv-display open-vm-tools-xorg-drv-mouse&lt;/tt&gt;&lt;/li&gt;&lt;/ol&gt;    &lt;p&gt; Attempting this method with RHEL 5 Update 3 versions of VMware  Tools, however, will result in failure to install VMware Tools as the  GPG key is handled incorrectly. The only solution is to disable GPG  checking. To do so, change the line within  /etc/yum.repos.d/vmware-tools.repo from &lt;/p&gt;&lt;blockquote&gt;&lt;tt&gt; gpgkey=1&lt;/tt&gt;&lt;/blockquote&gt; to &lt;blockquote&gt;&lt;tt&gt; gpgkey=0&lt;/tt&gt;&lt;/blockquote&gt;  &lt;p&gt;Once completed, you can safely update and install VMware Tools without GPG errors.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Upgrading VMware Tools&lt;/b&gt;&lt;br /&gt;It's easy to upgrade VMware Tools when you update your Red Hat distribution by using the following command:   &lt;/p&gt;&lt;blockquote&gt;&lt;tt&gt;yum -y update&lt;/tt&gt;&lt;/blockquote&gt;  &lt;p&gt;If, however, your kernel is too new, you can't update from the VMware  Tools OS-specific package repository and will have to build drivers  locally. To do so, execute the following commands. Of importance:  &lt;esx-version&gt; will be 3.5u2, 3.5u3 or 3.5u4. Also, you'll most  likely want to run these commands on a development machine, as you need  to install compilers and other build tools. The result will be a  redistributable VMware Tools kernel module image that you can install in  other VMs.   &lt;/esx-version&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt; &lt;tt&gt; yum list &amp;lt; /tmp/t &lt;p&gt; &lt;/p&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt; vname=`grep vmware-tools /tmp/t|awk '{print $2}'` &lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt; version=`basename $vname .el` &lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt; wget http://packages.vmware.com/tools/esx/&lt;esx-version&gt;/rhel5/SRPMS/open-vm-tools-kmod-$version.src.rpm &lt;/esx-version&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt; wget http://packages.vmware.com/tools/esx/&lt;esx-version&gt;/rhel5/SRPMS/vmware-tools-kmod-$version.src.rpm &lt;/esx-version&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt; yum -y install yum-utils rpm-build &lt;/tt&gt;&lt;p&gt;You may need to double-check the version of  kernel-devel that is installed by the next command so that it matches  your running kernel. In some cases, it will not be the latest version of  the kernel. &lt;/p&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt; &lt;tt&gt; yum-builddep -y open-vm-tools-kmod-$version.src.rpm vmware-tools-kmod-$version.src.rpm &lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;  &lt;tt&gt;rpmbuild --rebuild open-vm-tools-kmod-$version.src.rpm &lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt; rpmbuild --rebuild vmware-tools-kmod-$version.src.rpm &lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt; &lt;tt&gt; rpm -ivh  /usr/src/redhat/RPMS/i386/open-vm-tools-kmod -`uname  -r`-$version.i386.rpm /usr/src/redhat/RPMS/i386/vmware-tools-kmod-`uname  -r`-$version.i386.rpm&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;tt&gt;-&lt;/tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;tt&gt;&lt;span class="a2"&gt;&lt;b&gt;Edward L. Haletky&lt;/b&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/tt&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-7810554041313535143?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/7810554041313535143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/7810554041313535143'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2011/07/install-vmware-tools-on-linux.html' title='Install VMware tools on Linux'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-5436474251065447584</id><published>2011-06-21T13:34:00.002-04:00</published><updated>2011-06-21T13:43:31.977-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby encryption'/><title type='text'>sha2 encryption in ruby</title><content type='html'>&lt;span style="font-family:courier new;"&gt;require 'digest/sha2'; hash = Digest::SHA2.new; hash &amp;lt;&amp;lt; "text to encrypt"; hash.to_s&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt; basically adds the parameter to the object. 'f' &amp;lt;&amp;lt; 'oo' # -&amp;gt; 'foo' and [1] &amp;lt;&amp;lt; 2 # -&amp;gt; [1,2]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;but it might be a left shift also ;) 2 &amp;lt;&amp;lt; 3 # -&amp;gt; 16&lt;/span&gt;&lt;div class="linestyle1 colourline"&gt;&lt;span&gt;it shifts the bit representation of a number. 0b001 &amp;lt;&amp;lt; 1 # -&amp;gt; 0b010&lt;/span&gt;&lt;/div&gt;&lt;div class="linestyle2 colourline"&gt;&lt;span&gt;with 0b001 == 1 and 0b010 == 2&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-5436474251065447584?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/5436474251065447584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/5436474251065447584'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2011/06/sha2-encryption-in-ruby.html' title='sha2 encryption in ruby'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-3020136238172571105</id><published>2011-05-26T22:01:00.005-04:00</published><updated>2011-05-26T22:21:32.567-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='browser'/><title type='text'>Web Developer Tools</title><content type='html'>&lt;span style="font-weight: bold;"&gt;General debugging tools:&lt;br /&gt;&lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; - &lt;/span&gt;&lt;span&gt;Popular Firefox extension for web developers.&lt;br /&gt;&lt;a href="http://chrispederick.com/work/web-developer/"&gt;Web Developer&lt;/a&gt; - Another Firefox extension containing good set of tools.&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-us/firefox/addon/deminifier/"&gt;JS Deminifier&lt;/a&gt; - Good for expending minified JS.&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/firecookie/"&gt;Firecookie&lt;/a&gt; - Cookie manager for Firebug.&lt;br /&gt;&lt;a href="http://www.javascriptbeautifier.com/"&gt;JS beautifier&lt;/a&gt; - &lt;/span&gt;Reformats JavaScript source code to make it more readable.&lt;br /&gt;&lt;a href="http://jsbeautifier.org/"&gt;JS beautifier2&lt;/a&gt; - Reformats JavaScript source code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web Application Testing Frameworks&lt;/span&gt;:&lt;br /&gt;&lt;a href="http://watir.com/"&gt;Watir&lt;/a&gt; - Ruby based framework for browser automation. &lt;a href="http://wiki.openqa.org/display/WTR/Examples"&gt;examples&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/selenium/?redir=1"&gt;Webdriver &lt;/a&gt;- Browser automation framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-3020136238172571105?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/3020136238172571105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/3020136238172571105'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2011/05/web-developer-tools.html' title='Web Developer Tools'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-4808703609608594965</id><published>2011-05-06T11:50:00.002-04:00</published><updated>2011-05-06T11:53:38.691-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Create Rails project with any version</title><content type='html'>gem list&lt;br /&gt;rails (3.0.5,2.3.11)&lt;br /&gt;&lt;br /&gt;rails -v &lt;br /&gt;Rails 3.0.5&lt;br /&gt;&lt;br /&gt;#Create a rails project with version 2.3.11&lt;br /&gt;rails _2.3.11_ MyProject&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-4808703609608594965?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/4808703609608594965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/4808703609608594965'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2011/05/create-rails-project-with-any-version.html' title='Create Rails project with any version'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-8949750043769051301</id><published>2011-02-07T09:10:00.002-05:00</published><updated>2011-02-07T09:14:13.653-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql cronjob'/><title type='text'>MySql dump with Cronjob</title><content type='html'>0 0 * * 0 /usr/bin/mysqldump -uroot -p'PASS' DBName &gt; /path/DB_backup/$(date +\%Y-\%m-\%d_\%Hh\%M).sql&lt;br /&gt;&lt;br /&gt;example output file:&lt;br /&gt;2011-02-06_00h00.sql&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-8949750043769051301?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/8949750043769051301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/8949750043769051301'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2011/02/mysql-dump-with-cronjob.html' title='MySql dump with Cronjob'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-1214351907609473753</id><published>2010-09-15T14:41:00.004-04:00</published><updated>2010-09-15T14:48:10.921-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sym link'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>Sym Link to multiple CIFS mounts</title><content type='html'>A simple script that creates sym links to multiple cifs mounts and dumps them into a master folder.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;DIR="/media/MDrive/"&lt;br /&gt;DIR2="/media/ZDrive/"&lt;br /&gt;DIR3="$DIR $DIR2"&lt;br /&gt;DIR4="masterDownloads"&lt;br /&gt;#echo $DIR3&lt;br /&gt;&lt;br /&gt;IFS=$'\n'&lt;br /&gt;&lt;br /&gt;#for i in $(find $DIR -type f -printf "%f\n")&lt;br /&gt;for i in $(find $DIR -type f)&lt;br /&gt;do&lt;br /&gt; echo   "Processing... $i"&lt;br /&gt; mkdir -p ./$DIR4/$(dirname $i)&lt;br /&gt; ln -s $i ./$DIR4$i&lt;br /&gt; clear&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-1214351907609473753?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/1214351907609473753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/1214351907609473753'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2010/09/sym-link-to-multiple-cifs-mounts.html' title='Sym Link to multiple CIFS mounts'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-5668592732818708753</id><published>2010-07-22T12:17:00.001-04:00</published><updated>2010-09-15T14:50:35.178-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='imagemagik'/><category scheme='http://www.blogger.com/atom/ns#' term='convert'/><title type='text'>Quick Image resize</title><content type='html'>&lt;code&gt;&lt;br /&gt;for a in $(find . -iname \*.jpg); do convert $a -resize 640x480 small/$a;  done&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-5668592732818708753?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/5668592732818708753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/5668592732818708753'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2010/07/quick-image-resize.html' title='Quick Image resize'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-3602045694824597198</id><published>2010-07-07T16:06:00.006-04:00</published><updated>2010-07-08T10:36:37.821-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><title type='text'>data integrity check from CSV</title><content type='html'>To test the data integrity in your CSV file and locate any lines that contain the delimiter in the data field so that it can be removed manually.&lt;br /&gt;&lt;br /&gt;Regular Expression:&lt;br /&gt;/(?:.*?\|){4,}.*/&lt;br /&gt;&lt;br /&gt;Will select lines that contain 4 or more pipes per line.&lt;br /&gt;(?: ) is a non-capturing group. Similar to ( ), except that it doesn't store the result for later reference.&lt;br /&gt;&lt;br /&gt;A more greedy approach is to write something like this:&lt;br /&gt;/^(?:[^|]*\|){4}[^|]*$/&lt;br /&gt;&lt;br /&gt;This will match lines that contain only four pipes&lt;br /&gt;&lt;br /&gt;Test it:&lt;br /&gt;http://rubular.com/r/f7Vd9O1c4k&lt;br /&gt;&lt;br /&gt;Or using ruby one-liners: &lt;br /&gt;&lt;br /&gt;#print only lines that match a regular expression (emulates 'grep')&lt;br /&gt;$  ruby -pe 'next unless $_ =~ /regexp/' &lt; file.txt&lt;br /&gt;&lt;br /&gt;#print only lines that DO NOT match a regular expression (emulates 'grep')&lt;br /&gt;$  ruby -pe 'next if $_ =~ /regexp/' &lt; file.txt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-3602045694824597198?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/3602045694824597198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/3602045694824597198'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2010/07/data-integrity-check-from-csv.html' title='data integrity check from CSV'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-8117064892271923544</id><published>2008-05-24T17:42:00.003-04:00</published><updated>2008-05-24T18:46:38.342-04:00</updated><title type='text'>How to setup local Yum repository in Fedora 8</title><content type='html'>The advantage of running a local repository is to save bandwidth. With this method you can distribute RPMs across your network from a central server and only worry about keeping your server in sync with the other Fedora mirrors.&lt;br /&gt;&lt;br /&gt;1) Install Apache web server: &lt;code&gt;yum install httpd&lt;/code&gt; and start it: &lt;code&gt;/etc/init.d/httpd start&lt;/code&gt;&lt;br /&gt;2) Install a tool to index your repo: &lt;code&gt;yum install createrepo&lt;/code&gt;&lt;br /&gt;3) Now is the time to download the Fedora repository. If you have the install DVD you can copy the contents from there, however it only contains a limited set of packages. If you want everything then download it from a good &lt;a href="http://mirrors.fedoraproject.org/publiclist/Fedora/8/i386/"&gt;mirror server&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In this case I used rsync but you can also use http or ftp protocol and download using wget command.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;rsync -avrt rsync://rsync.muug.mb.ca/fedora-enchilada/linux/releases/8/Everything/i386/os/Packages/ /var/www/html/yum/base/8/i386&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The RPMs will be located in your apache web root folder /var/www/html/yum/base/8/i386 &lt;br /&gt;&lt;br /&gt;4) Index the repo: &lt;code&gt;createrepo /var/www/html/yum/base/8/i386&lt;/code&gt;&lt;br /&gt;5) Now we need to tell yum to use the local repo. Edit the yum.conf file: &lt;code&gt;nano /etc/yum.conf&lt;/code&gt; and append this information:&lt;br /&gt;&lt;br /&gt;[base-local]&lt;br /&gt;name=Fedora 8 - i386&lt;br /&gt;failovermethod=priority&lt;br /&gt;baseurl=http://&lt;WEB_SERVER_IP&gt;/yum/base/$releasever/$basearch&lt;br /&gt;enabled=1&lt;br /&gt;gpgcheck=0&lt;br /&gt;&lt;br /&gt;6) To confirm that we have everything setup run these commands:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;yum repolist&lt;/code&gt;&lt;br /&gt;output:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;repo id              repo name                                 status&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;base-local           Fedora 8 - i386                           enabled&lt;/span&gt;&lt;br /&gt;fedora               Fedora 8 - i386                           enabled&lt;br /&gt;livna                Livna for Fedora Core 8 - i386 - Base     enabled&lt;br /&gt;updates              Fedora 8 - i386 - Updates                 enabled&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;base-local is enabled and we can now start using it.&lt;br /&gt;&lt;br /&gt;Lists all imported packages on the local repo.&lt;br /&gt;&lt;code&gt;yum list all --disablerepo=fedora,updates,livna&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Installs liferea from the local repo. Note that if you don't disable the internet repo and yum finds a later version of liferea online it will try to download that instead. &lt;br /&gt;&lt;code&gt;&lt;br /&gt;yum install liferea --disablerepo=fedora,updates,livna&lt;br /&gt;&lt;code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-8117064892271923544?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/8117064892271923544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/8117064892271923544'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2008/05/how-to-setup-local-yum-repository-in.html' title='How to setup local Yum repository in Fedora 8'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-7125021958909627720</id><published>2007-11-04T09:17:00.000-05:00</published><updated>2007-11-04T09:20:05.960-05:00</updated><title type='text'>Beware of GParted</title><content type='html'>I was in a hurry to create a new partition with Gparted v0.3.3.2 based &lt;br /&gt;on libparted v1.7.1 which appears to be the latest in the Gutsy &lt;br /&gt;repository as of now. There appears to be a strange bug that will do &lt;br /&gt;nasty things to your partition table after you apply your changes and &lt;br /&gt;close the program before it had a chance to repopulate the list of &lt;br /&gt;partitions. I was left with an empty drive, and to be sure I ran "fdisk &lt;br /&gt;/dev/sda" from a live CD which seems to prove that.&lt;br /&gt;Doing a quick Google search I discovered &lt;a href="http://www.cgsecurity.org/wiki/TestDisk"&gt;TestDisk&lt;/a&gt; and attempted to &lt;br /&gt;recover my lost data. The tool did an excellent job and recovered &lt;br /&gt;everything, it also sets up the MBR from the first root partition, this &lt;br /&gt;was not my original setting as I had it setup from another Linux root &lt;br /&gt;partition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-7125021958909627720?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/7125021958909627720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/7125021958909627720'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/11/beware-of-gparted.html' title='Beware of GParted'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-2938707845752992304</id><published>2007-10-13T21:05:00.000-04:00</published><updated>2007-10-13T22:29:53.547-04:00</updated><title type='text'>Ontario Linux Fest</title><content type='html'>Arrived at 8:15, registered and headed to the first presentation called "Howto write a linux kernel module". Never really fiddled with kernel level coding before but I was surprised to learn that it was much easier then I previously thought. The presenter Robert Day from &lt;a href="http://crashcourse.ca"&gt;crashcourse&lt;/a&gt; was good at walking though the code and showing us simple "hello world" like examples of kernel modules and how to load them.&lt;br /&gt;&lt;br /&gt;"Linux forecast through 2020" was another interesting presentation by Dr. John Nash who predicted among other things the fall of Microsoft.&lt;br /&gt;&lt;br /&gt;I was pleased to hear Louis Suarez-Potts from OOo mentioning Seneca College. He noted the success of Mozilla work that we have done and how similar student contribution can help OOo in its development.&lt;br /&gt;&lt;br /&gt;The morning key note was held by Theodore Ts'o. Here he is finishing off with a userfriendly.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_TYreSixeiIc/RxFyp_veFJI/AAAAAAAAAvU/QTXpYz1FmP0/s1600-h/DSC01643.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_TYreSixeiIc/RxFyp_veFJI/AAAAAAAAAvU/QTXpYz1FmP0/s320/DSC01643.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5121000317107704978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The other presentations I attended were Gnome, Eclipse IDE, performance tuning for High-traffic web sites.&lt;br /&gt;&lt;br /&gt;In the exhibition hall I bumped into Cesar and Lukas who did a good job at promoting the next FSOSS.&lt;br /&gt;&lt;br /&gt;Finally maddog closed the fest with a ending keynote on LTSP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-2938707845752992304?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/2938707845752992304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/2938707845752992304'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/10/ontario-linux-fest.html' title='Ontario Linux Fest'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_TYreSixeiIc/RxFyp_veFJI/AAAAAAAAAvU/QTXpYz1FmP0/s72-c/DSC01643.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-4919220501764505861</id><published>2007-10-01T18:36:00.000-04:00</published><updated>2007-10-01T18:49:30.169-04:00</updated><title type='text'>UbuntuZilla</title><content type='html'>Found a cool script to install the latest version of Firefox, Seamonkey and Thunderbird on Ubuntu. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://ubuntuzilla.wiki.sourceforge.net/"&gt;http://ubuntuzilla.wiki.sourceforge.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-4919220501764505861?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/4919220501764505861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/4919220501764505861'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/10/ubuntuzilla.html' title='UbuntuZilla'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-480735323764896834</id><published>2007-09-09T12:18:00.000-04:00</published><updated>2007-09-10T12:23:00.652-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mediawiki'/><title type='text'>MediaWiki+Ldap</title><content type='html'>Recently I started implementing a wiki for my company, specifically for the HR department. They addressed the need to have a system that would allow them to edit pages seamlessly, upload pdf's which contain sensitive information only visible to certain groups on an internal server and authenticating against MS Active Directory.&lt;br /&gt;&lt;br /&gt;I installed the latest &lt;a href="http://mediawiki.org/"&gt;mediawiki&lt;/a&gt; release and selected &lt;a href="http://paulgu.com/wiki/Mediawiki_Skins"&gt;Paul Gu's mediawiki&lt;/a&gt; skin which is rewrite of Monobook default wiki skin. Thanks Paul.&lt;br /&gt;&lt;br /&gt;Next I installed the &lt;a href="http://www.mediawiki.org/wiki/Ldap"&gt;LDAP extension&lt;/a&gt; for mediawiki. It was a bit of a pain to configure the first time, but after reading their wiki a few times and trying out different settings, the debugging option will also help in determining the problem.&lt;br /&gt;&lt;br /&gt;All the settings are applied in LocalSettings.php which makes it convenient to edit.&lt;br /&gt;&lt;br /&gt;#Beginning of LDAP settings======================================&lt;br /&gt;require_once( "includes/LdapAuthentication.php" );&lt;br /&gt;$wgAuth = new LdapAuthenticationPlugin();&lt;br /&gt;$wgLDAPDomainNames = array( "exampleDomain" );&lt;br /&gt;$wgLDAPServerNames = array( "exampleDomain"=&gt;"IPofADserver" );&lt;br /&gt;$wgLDAPSearchStrings = array("exampleDomain"=&gt;"exampleDomain\\USER-NAME" );&lt;br /&gt;$wgLDAPEncryptionType = array( "exampleDomain"=&gt;"false" );&lt;br /&gt;#$wgLDAPUseLocal = true; //allow use of local user DB $wgMinimalPasswordLength = 1;&lt;br /&gt;$wgLDAPRetrievePrefs = array( "exampleDomain"=&gt;"true" );&lt;br /&gt;#$wgLDAPUpdateLDAP = array( "exampleDomain"=&gt;"false" ); //disables mediawiki from updating LDAP&lt;br /&gt;#$wgLDAPAddLDAPUsers = array("exampleDomain"=&gt;"false");&lt;br /&gt;&lt;br /&gt;$wgLDAPDebug=3;&lt;br /&gt;&lt;br /&gt;#DNs in $wgLDAPRequiredGroups must be lowercase, as search result attribute values are...&lt;br /&gt;$wgLDAPBaseDNs = array( "exampleDomain"=&gt;"dc=otn,dc=local" );&lt;br /&gt;$wgLDAPSearchAttributes = array( "exampleDomain"=&gt;"sAMAccountName" );&lt;br /&gt;&lt;br /&gt;#Allo two groups to log in tech team and HR&lt;br /&gt;$wgLDAPRequiredGroups = array(&lt;br /&gt;"OTN"=&gt;array("cn=technical_team,ou=global security groups,ou=otn,dc=otn,dc=local",&lt;br /&gt;cn=hr_team,ou=global security groups,ou=otn,dc=otn,dc=local"&lt;br /&gt;) );&lt;br /&gt;&lt;br /&gt;$wgLDAPGroupUseFullDN = array( "exampleDomain"=&gt;true );&lt;br /&gt;$wgLDAPGroupObjectclass = array( "exampleDomain"=&gt;"group" );&lt;br /&gt;$wgLDAPGroupAttribute = array( "exampleDomain"=&gt;"member" );&lt;br /&gt;$wgLDAPGroupSearchNestedGroups = array( "exampleDomain"=&gt;true );&lt;br /&gt;//Pull LDAP groups a user is in, and update local wiki security group.&lt;br /&gt;$wgLDAPUseLDAPGroups = array( "exampleDomain"=&gt;"true");&lt;br /&gt;$wgLDAPGroupNameAttribute = array( "exampleDomain"=&gt;"cn" );&lt;br /&gt;&lt;br /&gt;$wgShowExceptionDetails = true;&lt;br /&gt;&lt;br /&gt;After that grant specific access to certain groups:&lt;br /&gt;&lt;br /&gt;#Restrict access to non logged in users========================&lt;br /&gt;#Restrict edit to logged in users&lt;br /&gt;$wgGroupPermissions['*']['edit']=false;&lt;br /&gt;&lt;br /&gt;$wgGroupPermissions['user']['read'] = false;&lt;br /&gt;$wgGroupPermissions['user']['edit'] = false;&lt;br /&gt;$wgGroupPermissions['user']['createpage'] = false;&lt;br /&gt;$wgGroupPermissions['user']['createtalk'] = false;&lt;br /&gt;$wgGroupPermissions['user']['upload'] = false;&lt;br /&gt;$wgGroupPermissions['user']['userrights'] = false;&lt;br /&gt;&lt;br /&gt;$wgGroupPermissions['technical_team']['read'] = true;&lt;br /&gt;$wgGroupPermissions['technical_team']['edit'] = true;&lt;br /&gt;$wgGroupPermissions['technical_team']['createpage'] = true;&lt;br /&gt;$wgGroupPermissions['technical_team']['createtalk'] = true;&lt;br /&gt;$wgGroupPermissions['technical_team']['upload'] = true;&lt;br /&gt;$wgGroupPermissions['technical_team']['userrights'] = true;&lt;br /&gt;&lt;br /&gt;$wgGroupPermissions['hr_team']['read'] = true;&lt;br /&gt;$wgGroupPermissions['hr_team']['edit'] = true;&lt;br /&gt;$wgGroupPermissions['hr_team']['createpage'] = true;&lt;br /&gt;$wgGroupPermissions['hr_team']['createtalk'] = true;&lt;br /&gt;$wgGroupPermissions['hr_team']['upload'] = true;&lt;br /&gt;&lt;br /&gt;#Prevent new registrations from anonymous users(Sysops can still create accounts&lt;br /&gt;$wgGroupPermissions['*']['createaccount'] = false;&lt;br /&gt;&lt;br /&gt;#Define the pages un-authenticate users can see. This is crucial. Otherwise, there's&lt;br /&gt;#no way for people to login&lt;br /&gt;$wgWhitelistRead = array( "Main Page", "Special:Userlogout", "Special:Userlogin", "-", "MediaWiki:Monobook.css" );&lt;br /&gt;$wgGroupPermissions['*']['read']= false;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Many companies are running their intranet on wiki technology and it gives non-technical people a short learning curve on how to create and edit pages.&lt;br /&gt;For the new group of BSD students taking DPS909 you will learn a lot about wikis and its a valuable resource to have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-480735323764896834?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/480735323764896834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/480735323764896834'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/09/mediawikildap.html' title='MediaWiki+Ldap'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-4057659928614080134</id><published>2007-08-11T07:58:00.003-04:00</published><updated>2010-11-01T21:51:13.102-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Network Programming'/><title type='text'>Chat program in C</title><content type='html'>Here is a proof of concept chat program written in C.&lt;br /&gt;Beeing written in C, the code brings a higher level of understanding &lt;br /&gt;to the programmer about the underlying functionality of network programming. &lt;br /&gt;&lt;br /&gt;&lt;del&gt;Download the code &lt;a href="http://matrix.senecac.on.ca/~dtolj/chat.tar.gz"&gt;here&lt;/a&gt;&lt;/del&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GitHub repo has been created to host this project: &lt;a href="http://github.com/dtolj/simple-chat-client-server"&gt;http://github.com/dtolj/simple-chat-client-server&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is the server code:&lt;br /&gt;&lt;br /&gt;Server accepts parameters "chat" or "chat -p [PORTNUM]"&lt;br /&gt;In case of only one parameter we will use MYPORT which is 7400&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;/*Server==================================================*/&lt;br /&gt;   if(argc==1 || argc == 3){&lt;br /&gt;     if(argc==3){&lt;br /&gt;       if(!strcmp("-p",argv[1])){&lt;br /&gt;         sscanf(argv[2],"%i",&amp;port);&lt;br /&gt;       }else{&lt;br /&gt;         printf("Invalid parameter.\nUsage: chat [-p PORT] HOSTNAME\n");&lt;br /&gt;         exit(0);&lt;br /&gt;       }&lt;br /&gt;     }else port=MYPORT;&lt;br /&gt;     &lt;br /&gt;     printf("\n*** Server program starting (enter \"quit\" to stop): \n");&lt;br /&gt;     fflush(stdout);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Here we are creating a socket for the server which is defined by this function: &lt;a href="http://www.retran.com/beej/syscalls.html#socket"&gt;int socket(int domain, int type, int protocol);&lt;/a&gt;&lt;br /&gt;Next we populate the server_address instance of &lt;a href="http://www.retran.com/beej/sockaddr_inman.html"&gt;sockadd_in&lt;/a&gt; structure&lt;br /&gt;Finally &lt;a href="http://www.retran.com/beej/syscalls.html#bind"&gt;bind&lt;/a&gt; the port to the servers file descriptor.&lt;br /&gt;A note about file descriptors, fd0=stdin, fd1=stdout, fd2=stderr. These are preserved and therefore the next available fd is 3 for listening socket and the first client connected to the server will receive a socket fd 4.&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;     /* Create and name a socket for the server */&lt;br /&gt;     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);&lt;br /&gt;     server_address.sin_family = AF_INET;&lt;br /&gt;     server_address.sin_addr.s_addr = htonl(INADDR_ANY);&lt;br /&gt;     server_address.sin_port = htons(port);&lt;br /&gt;     bind(server_sockfd, (struct sockaddr *)&amp;server_address, addresslen);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.retran.com/beej/syscalls.html#listen"&gt;int listen(int sockfd, int backlog); &lt;/a&gt; &lt;br /&gt;We are now listening for incoming connections on that fd.&lt;br /&gt;We zero out the readfds set and assign the server_sockfd to it as well as the stdin aka fd0&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;     /* Create a connection queue and initialize a file descriptor set */&lt;br /&gt;     listen(server_sockfd, 1);&lt;br /&gt;     FD_ZERO(&amp;readfds);&lt;br /&gt;     FD_SET(server_sockfd, &amp;readfds);&lt;br /&gt;     FD_SET(0, &amp;readfds);  /* Add keyboard to file descriptor set */&lt;br /&gt;     &lt;br /&gt;     //struct clientinfo c;&lt;br /&gt;     &lt;br /&gt;     //printf("sizeof(readfds)/(testfds): %d/%d\n",sizeof(readfds),sizeof(testfds));&lt;br /&gt;     //printf("Number of bits in readfds/testfds: %d/%d\n", sizeof(readfds)*8,sizeof(testfds)*8);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Assign readfds to testfds, we are now working with testfds.&lt;br /&gt;&lt;a href="http://www.retran.com/beej/advanced.html#select"&gt;select()&lt;/a&gt; allows for monitoring several sockets simultaniously.&lt;br /&gt;The set currently contains 2 fds 0 and 3&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;     /*  Now wait for clients and requests */&lt;br /&gt;     while (1) {&lt;br /&gt;        testfds = readfds;&lt;br /&gt;        select(FD_SETSIZE, &amp;testfds, NULL, NULL, NULL);&lt;br /&gt;                    &lt;br /&gt;        /* If there is activity, find which descriptor it's on using FD_ISSET */&lt;br /&gt;        for (fd = 0; fd &lt; FD_SETSIZE; fd++) {&lt;br /&gt;           if (FD_ISSET(fd, &amp;testfds)) {&lt;br /&gt;              &lt;br /&gt;              if (fd == server_sockfd) { /* Accept a new connection request */&lt;br /&gt;                 client_sockfd = accept(server_sockfd, NULL, NULL);&lt;br /&gt;                 /*printf("client_sockfd: %d\n",client_sockfd);*/&lt;br /&gt;                &lt;br /&gt;                                &lt;br /&gt;                 if (num_clients &lt; MAX_CLIENTS) {&lt;br /&gt;                    FD_SET(client_sockfd, &amp;readfds);&lt;br /&gt;                    fd_array[num_clients]=client_sockfd;&lt;br /&gt;                    /*Client ID*/&lt;br /&gt;                    printf("Client %d joined\n",num_clients++);&lt;br /&gt;                    fflush(stdout);&lt;br /&gt;                    &lt;br /&gt;                    sprintf(msg,"M%2d",client_sockfd);&lt;br /&gt;                    /*write 2 byte clientID */&lt;br /&gt;                    send(client_sockfd,msg,strlen(msg),0);&lt;br /&gt;                 }&lt;br /&gt;                 else {&lt;br /&gt;                    sprintf(msg, "XSorry, too many clients.  Try again later.\n");&lt;br /&gt;                    write(client_sockfd, msg, strlen(msg));&lt;br /&gt;                    close(client_sockfd);&lt;br /&gt;                 }&lt;br /&gt;              }&lt;br /&gt;              else if (fd == 0)  {  /* Process keyboard activity */                 &lt;br /&gt;                 fgets(kb_msg, MSG_SIZE + 1, stdin);&lt;br /&gt;                 //printf("%s\n",kb_msg);&lt;br /&gt;                 if (strcmp(kb_msg, "quit\n")==0) {&lt;br /&gt;                    sprintf(msg, "XServer is shutting down.\n");&lt;br /&gt;                    for (i = 0; i &lt; num_clients ; i++) {&lt;br /&gt;                       write(fd_array[i], msg, strlen(msg));&lt;br /&gt;                       close(fd_array[i]);&lt;br /&gt;                    }&lt;br /&gt;                    close(server_sockfd);&lt;br /&gt;                    exit(0);&lt;br /&gt;                 }&lt;br /&gt;                 else {&lt;br /&gt;                    //printf("server - send\n");&lt;br /&gt;                    sprintf(msg, "M%s", kb_msg);&lt;br /&gt;                    for (i = 0; i &lt; num_clients ; i++)&lt;br /&gt;                       write(fd_array[i], msg, strlen(msg));&lt;br /&gt;                 }&lt;br /&gt;              }&lt;br /&gt;              else if(fd) {  /*Process Client specific activity*/&lt;br /&gt;                 //printf("server - read\n");&lt;br /&gt;                 //read data from open socket&lt;br /&gt;                 result = read(fd, msg, MSG_SIZE);&lt;br /&gt;                 &lt;br /&gt;                 if(result==-1) perror("read()");&lt;br /&gt;                 else if(result&gt;0){&lt;br /&gt;                    /*read 2 bytes client id*/&lt;br /&gt;                    sprintf(kb_msg,"M%2d",fd);&lt;br /&gt;                    msg[result]='\0';&lt;br /&gt;                    &lt;br /&gt;                    /*concatinate the client id with the client's message*/&lt;br /&gt;                    strcat(kb_msg,msg+1);                                        &lt;br /&gt;                    &lt;br /&gt;                    /*print to other clients*/&lt;br /&gt;                    for(i=0;i &lt; num_clients;i++){&lt;br /&gt;                       if (fd_array[i] != fd)  /*dont write msg to same client*/&lt;br /&gt;                          write(fd_array[i],kb_msg,strlen(kb_msg));&lt;br /&gt;                    }&lt;br /&gt;                    /*print to server*/&lt;br /&gt;                    printf("%s",kb_msg+1);&lt;br /&gt;                    &lt;br /&gt;                     /*Exit Client*/&lt;br /&gt;                    if(msg[0] == 'X'){&lt;br /&gt;                       exitClient(fd,&amp;readfds, fd_array,&amp;num_clients);&lt;br /&gt;                    }   &lt;br /&gt;                 }                                   &lt;br /&gt;              }                  &lt;br /&gt;              else {  /* A client is leaving */&lt;br /&gt;                 exitClient(fd,&amp;readfds, fd_array,&amp;num_clients);&lt;br /&gt;              }//if&lt;br /&gt;           }//if&lt;br /&gt;        }//for&lt;br /&gt;     }//while&lt;br /&gt;  }//end Server code&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is client code:&lt;br /&gt;&lt;br /&gt;Client accepts parameters "chat [hostname]" or "chat -p [portnum] [hostname]"&lt;br /&gt;In case of only two parameter we will use MYPORT which is 7400&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt; /*Client variables=======================*/&lt;br /&gt;   int sockfd;&lt;br /&gt;   int result;&lt;br /&gt;   char hostname[MSG_SIZE];&lt;br /&gt;   struct hostent *hostinfo;&lt;br /&gt;   struct sockaddr_in address;&lt;br /&gt;   char alias[MSG_SIZE];&lt;br /&gt;   int clientid;&lt;br /&gt;/*Client==================================================*/&lt;br /&gt;   if(argc==2 || argc==4){&lt;br /&gt;     if(!strcmp("-p",argv[1])){&lt;br /&gt;       if(argc==2){&lt;br /&gt;         printf("Invalid parameters.\nUsage: chat [-p PORT] HOSTNAME\n");&lt;br /&gt;         exit(0);&lt;br /&gt;       }else{&lt;br /&gt;         sscanf(argv[2],"%i",&amp;port);&lt;br /&gt;         strcpy(hostname,argv[3]);&lt;br /&gt;       }&lt;br /&gt;     }else{&lt;br /&gt;       port=MYPORT;&lt;br /&gt;       strcpy(hostname,argv[1]);&lt;br /&gt;     }&lt;br /&gt;     printf("\n*** Client program starting (enter \"quit\" to stop): \n");&lt;br /&gt;     fflush(stdout);&lt;br /&gt;&lt;br /&gt;     /* Create a socket for the client */&lt;br /&gt;     sockfd = socket(AF_INET, SOCK_STREAM, 0);&lt;br /&gt;&lt;br /&gt;     /* Name the socket, as agreed with the server */&lt;br /&gt;     hostinfo = gethostbyname(hostname);  /* look for host's name */&lt;br /&gt;     address.sin_addr = *(struct in_addr *)*hostinfo -&gt; h_addr_list;&lt;br /&gt;     address.sin_family = AF_INET;&lt;br /&gt;     address.sin_port = htons(port);&lt;br /&gt;&lt;br /&gt;     /* Connect the socket to the server's socket */&lt;br /&gt;     if(connect(sockfd, (struct sockaddr *)&amp;address, sizeof(address)) &lt; 0){&lt;br /&gt;       perror("connecting");&lt;br /&gt;       exit(1);&lt;br /&gt;     }&lt;br /&gt;     &lt;br /&gt;     fflush(stdout);&lt;br /&gt;     &lt;br /&gt;     FD_ZERO(&amp;clientfds);&lt;br /&gt;     FD_SET(sockfd,&amp;clientfds);&lt;br /&gt;     FD_SET(0,&amp;clientfds);//stdin&lt;br /&gt;     &lt;br /&gt;     /*  Now wait for messages from the server */&lt;br /&gt;     while (1) {&lt;br /&gt;       testfds=clientfds;&lt;br /&gt;       select(FD_SETSIZE,&amp;testfds,NULL,NULL,NULL);&lt;br /&gt;       &lt;br /&gt;       for(fd=0;fd&lt;FD_SETSIZE;fd++){&lt;br /&gt;          if(FD_ISSET(fd,&amp;testfds)){&lt;br /&gt;             if(fd==sockfd){   /*Accept data from open socket */&lt;br /&gt;                //printf("client - read\n");&lt;br /&gt;                &lt;br /&gt;                //read data from open socket&lt;br /&gt;                result = read(sockfd, msg, MSG_SIZE);&lt;br /&gt;                msg[result] = '\0';  /* Terminate string with null */&lt;br /&gt;                printf("%s", msg +1);&lt;br /&gt;                &lt;br /&gt;                if (msg[0] == 'X') {                   &lt;br /&gt;                    close(sockfd);&lt;br /&gt;                    exit(0);&lt;br /&gt;                }                             &lt;br /&gt;             }&lt;br /&gt;             else if(fd == 0){ /*process keyboard activiy*/&lt;br /&gt;               // printf("client - send\n");&lt;br /&gt;                &lt;br /&gt;                fgets(kb_msg, MSG_SIZE+1, stdin);&lt;br /&gt;                //printf("%s\n",kb_msg);&lt;br /&gt;                if (strcmp(kb_msg, "quit\n")==0) {&lt;br /&gt;                    sprintf(msg, "XClient is shutting down.\n");&lt;br /&gt;                    write(sockfd, msg, strlen(msg));&lt;br /&gt;                    close(sockfd); //close the current client&lt;br /&gt;                    exit(0); //end program&lt;br /&gt;                }&lt;br /&gt;                else {&lt;br /&gt;                   /* sprintf(kb_msg,"%s",alias);&lt;br /&gt;                    msg[result]='\0';&lt;br /&gt;                    strcat(kb_msg,msg+1);*/&lt;br /&gt;&lt;br /&gt;                    sprintf(msg, "M%s", kb_msg);&lt;br /&gt;                    write(sockfd, msg, strlen(msg));&lt;br /&gt;                }                                                 &lt;br /&gt;             }          &lt;br /&gt;          }&lt;br /&gt;       }      &lt;br /&gt;     }&lt;br /&gt;   }// end client code&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_TYreSixeiIc/Rr3OTMPUhlI/AAAAAAAAAts/zLv_3E2jGeE/s1600-h/chat.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_TYreSixeiIc/Rr3OTMPUhlI/AAAAAAAAAts/zLv_3E2jGeE/s320/chat.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5097457182351590994" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-4057659928614080134?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/4057659928614080134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/4057659928614080134'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/08/chat-program-in-c.html' title='Chat program in C'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_TYreSixeiIc/Rr3OTMPUhlI/AAAAAAAAAts/zLv_3E2jGeE/s72-c/chat.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-8700456884981900803</id><published>2007-07-30T21:21:00.000-04:00</published><updated>2007-08-02T20:16:04.835-04:00</updated><title type='text'>Sort Digital Photos</title><content type='html'>Over the years I have collected thousands of digital photos from birthday parties, events etc. Having only a 64MB in my Sony Memory Stick it gets filled up very fast even at 600x480 resolution which is the lowest setting. Its become a habit dumping the pictures onto a new folder on my hard drive every now and then. After trying to sort the mess manually to try to organize the photos chronologically I managed to lose the one most important piece of information, the datestamp when the image was originally taken. Apparently when you do a &lt;span style="font-style: italic;"&gt;copy &lt;/span&gt;in bash it does not preserve the datestamp instead it overwrites it with the one at which time the file was copied. Had I used the &lt;span style="font-style: italic;"&gt;-a&lt;/span&gt; switch with copy I wouldn't be in this mess.&lt;br /&gt;Fortunately there was still hope. I discovered that all jpegs included header information which contains the original datestamp as well as some other things that I wasn't interested in.&lt;br /&gt;&lt;br /&gt;This lead me to write a simple bash script to extract the datestamp and sort the pictures chronologically in my album.&lt;br /&gt;&lt;br /&gt;Here is the pseudo code:&lt;br /&gt;*accept minimum 2 arguments the path_to_images path_to_write_location recursive_flag&lt;br /&gt;*parse the date string from the jpeg&lt;br /&gt;*loop thru all the images&lt;br /&gt;*if write location does not exist create it&lt;br /&gt;*construct a directory structure to place the images in the format Year/Month&lt;br /&gt;*if format directory structure does not exists create it&lt;br /&gt;*otherwise check if the file  name exists in that directory so that we dont  overwrite it&lt;br /&gt;*if it does rename it before we copy it to the destination folder&lt;br /&gt;&lt;br /&gt;Here is the entire code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;#filename: chronJpg.sh&lt;br /&gt;#Date: Feb 17 2007&lt;br /&gt;#Author: Dejan Tolj &lt;dejan1[at]gmail.com&gt;&lt;br /&gt;#License: GPL&lt;br /&gt;#&lt;br /&gt;#Bash script to arrange jpeg images chronologically&lt;br /&gt;#&lt;br /&gt;#Usefull when original picture taken date has not been preserved by&lt;br /&gt;#accidentally coping without the -a option.&lt;br /&gt;&lt;br /&gt;which identify &amp;&gt;/dev/null&lt;br /&gt;if [ $? != "0" ];&lt;br /&gt;then&lt;br /&gt; echo -e "identify not found, please install ImageMagick. http://imagemagick.com";&lt;br /&gt; exit 0&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;restoreDateStamp(){&lt;br /&gt;#  echo "Date stamp =$1"&lt;br /&gt;#  echo $1 | tr -d [:space:][:punct:] |touch -t /{} $2&lt;br /&gt; date=`echo $1|cut -d: -f 1-4|tr -d [:space:][:punct:]` #2005:05:18 13:50:66&lt;br /&gt;&lt;br /&gt; touch -t $date $2&lt;br /&gt;#  echo "Touch $date -&gt;$2"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Month[1]="Jan"&lt;br /&gt;Month[2]="Feb"&lt;br /&gt;Month[3]="Mar"&lt;br /&gt;Month[4]="Apr"&lt;br /&gt;Month[5]="May"&lt;br /&gt;Month[6]="Jun"&lt;br /&gt;Month[7]="Jul"&lt;br /&gt;Month[8]="Aug"&lt;br /&gt;Month[9]="Sep"&lt;br /&gt;Month[10]="Oct"&lt;br /&gt;Month[11]="Nov"&lt;br /&gt;Month[12]="Dec"&lt;br /&gt;&lt;br /&gt;#parameters: jpg_path, write_location, recursive copy(optional)&lt;br /&gt;PARAMSIZE=2&lt;br /&gt;&lt;br /&gt;if [ $# -lt "$PARAMSIZE" ];&lt;br /&gt;then&lt;br /&gt; echo "Enter the path to your jpeg files and the write location"&lt;br /&gt; echo `basename $0` "[path] [write_location] -r"&lt;br /&gt;else&lt;br /&gt; #get first parameter&lt;br /&gt; jpg_path=$1&lt;br /&gt; #  echo $jpg_path&lt;br /&gt; #get second parameter&lt;br /&gt; write_location=$2&lt;br /&gt; #echo $write_location&lt;br /&gt; #get third parameter if present else search in current folder only&lt;br /&gt; if [ "$3" = "-r" ]; then&lt;br /&gt;   echo "$3"&lt;br /&gt;   recursive=""&lt;br /&gt; else&lt;br /&gt;   recursive="-maxdepth 1"&lt;br /&gt;   echo "$recursive"&lt;br /&gt; fi&lt;br /&gt;&lt;br /&gt; #Loop thru all jpegs and find the original date&lt;br /&gt; for i in $( find $jpg_path $recursive -iname \*.jpg );&lt;br /&gt; do&lt;br /&gt;   original_date=`identify -verbose $i |grep "Date Time Original"|awk '{print $4, $5}'`&lt;br /&gt;   #echo "OD=$original_date"&lt;br /&gt;&lt;br /&gt;   #Get Original year&lt;br /&gt;   original_year=`echo $original_date|cut -d: -f1`&lt;br /&gt;   #echo "OY=$original_year"&lt;br /&gt;&lt;br /&gt;   #Get Original month&lt;br /&gt;   original_month=`echo $original_date|cut -d: -f2`&lt;br /&gt;   #optionaly change date stamp&lt;br /&gt; &lt;br /&gt;   if [ ! -d "$write_location" ];&lt;br /&gt;   then&lt;br /&gt;     mkdir "$write_location"&lt;br /&gt;   fi&lt;br /&gt;&lt;br /&gt;   mydir="$write_location/$original_year/${Month[original_month]}"&lt;br /&gt;   filename=`basename $i` #strip the name of the image&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   if [ ! -d $mydir ];&lt;br /&gt;   then&lt;br /&gt;     #   echo "Original month =$original_month"&lt;br /&gt;&lt;br /&gt;     mkdir -p $mydir&lt;br /&gt;     cp $i $mydir&lt;br /&gt;     #Optionally change the date stamp&lt;br /&gt;     #restoreDateStamp "$original_date" "$mydir/$filename"&lt;br /&gt;   else&lt;br /&gt;     #check name&lt;br /&gt;     if [ -f "$mydir/$filename" ];&lt;br /&gt;     then&lt;br /&gt;       echo "Renaming duplicate file"&lt;br /&gt;       if [ -f "$mydir/$filename"_$count ];&lt;br /&gt;       then&lt;br /&gt;         count=`ls $mydir/$filename_* |tail -1|cut -d_ -f2|tr -d [:alpha:][:punct:]`&lt;br /&gt;         count=$[$count+1]&lt;br /&gt;       else&lt;br /&gt;         count=0&lt;br /&gt;       fi&lt;br /&gt;       #rename&lt;br /&gt;       cp $i "$mydir/$filename"_$count&lt;br /&gt;     else&lt;br /&gt;       cp $i $mydir&lt;br /&gt;     fi&lt;br /&gt;     #restoreDateStamp "$original_date" "$mydir/$filename"&lt;br /&gt;   fi&lt;br /&gt;&lt;br /&gt;   echo "$i -&gt; $mydir";&lt;br /&gt; done&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;exit 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/dejan1[at]gmail.com&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-8700456884981900803?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/8700456884981900803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/8700456884981900803'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/07/sort-digital-photos.html' title='Sort Digital Photos'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-2556369035587928889</id><published>2007-07-28T11:17:00.001-04:00</published><updated>2007-07-30T21:21:04.799-04:00</updated><title type='text'>Building Firefox</title><content type='html'>As a challenge I decided to build Firefox from source. The first thing I noticed is that unlike other Open Source software programs Firefox is not built using the standard &lt;span style="font-style: italic;"&gt;configure, make, make install &lt;/span&gt;methods. They have a slightly different build script which I will explain in a moment.&lt;br /&gt;&lt;br /&gt;My build process was completed on Ubuntu Dapper Drake, Pentium 4 2Ghz and 512MB RAM.&lt;br /&gt;&lt;br /&gt;Here is the list of needed packages that you can download from Synaptic/apt-get in Ubuntu.&lt;br /&gt;&lt;ul&gt;&lt;li&gt; build-essential &lt;/li&gt;&lt;li&gt; libIDL-dev0.8 &lt;/li&gt;&lt;li&gt; cvs &lt;/li&gt;&lt;li&gt; g++4.0 &lt;/li&gt;&lt;li&gt; gcc4.0 &lt;/li&gt;&lt;li&gt; make8.0 &lt;/li&gt;&lt;li&gt; libgtk2.0-dev &lt;/li&gt;&lt;/ul&gt;Now that you have all the tools you need for building you need to check out the Mozilla source tree.&lt;br /&gt;&lt;br /&gt;1. This code will checkout client.mk into ./mozilla from the Bon Echo branch. Go to that directory and the last command will checkout the browser project. This step may take a while depending on your internet speed.&lt;br /&gt;&lt;pre&gt;$ cvs -d :pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/cvsroot co -r&lt;br /&gt;MOZILLA_1_8_BRANCH mozilla/client.mk&lt;br /&gt;$ cd mozilla&lt;br /&gt;$ make -f client.mk checkout MOZ_CO_PROJECT=browser&lt;/pre&gt;2. Before you can build you need to have a .mozconfig file in your ./mozilla directory. I have created this one which builds firefox with shared libraries, no optimization and I also enabled debugging. I also used gtk2 because I have version 0.8 of libIDL. By default the build will use gtk1. Create a new file called .mozconfig and copy the contents below. For a full list of acceptable flags you can see it &lt;a href="http://developer.mozilla.org/en/docs/Configuring_Build_Options#Using_a_.mozconfig_Configuration_File"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;. $topsrcdir/browser/config/mozconfig&lt;br /&gt;mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/ff-static&lt;br /&gt;mk_add_options MOZ_CO_PROJECT=browser&lt;br /&gt;ac_add_options --enable-application=browser&lt;br /&gt;ac_add_options --disable-static&lt;br /&gt;ac_add_options --enable-shared&lt;br /&gt;ac_add_options --disable-tests&lt;br /&gt;ac_add_options --disable-optimize&lt;br /&gt;ac_add_options --enable-debug&lt;br /&gt;ac_add_options --enable-default-toolkit=gtk2&lt;br /&gt;ac_add_options --disable-installer&lt;br /&gt;&lt;/pre&gt; 3. Finally I fired the build command to compile firefox.  &lt;pre&gt;make -f client.mk build&lt;/pre&gt;&lt;br /&gt;Finally the build was complete&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://zenit.senecac.on.ca/wiki/imgs/Bonecho.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://zenit.senecac.on.ca/wiki/imgs/Bonecho.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-2556369035587928889?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/2556369035587928889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/2556369035587928889'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/07/building-firefox.html' title='Building Firefox'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-1354321443367772220</id><published>2007-07-14T16:22:00.000-04:00</published><updated>2007-07-16T13:00:39.062-04:00</updated><title type='text'>Compiz fusion - compositing window manager</title><content type='html'>Last week I bought a new Video Card primarily for the benefit to make use of hardware acceleration on the desktop and as such run Compiz. Its a Nvidia GeForce FX5500, its several years old now but it plays nice with Linux and I have all the drivers to make it work. The driver installation was flawless on my latest Ubuntu gutsy, I then went on to install Compiz fusion. I pulled the latest development package for Compiz and the extra plugins which showcase some interesting effects on the desktop. Now comes the interesting part, the amount of features that you can change in compizconfig-settings-manager are astounding, you can customize just about anything to suite your liking. There are more than a dozen effects you can choose from for closing or opening a window, beam up, domino, fade and horizontal fold to name a few. You can add wobbly windows and my favorite 3D rotation. I increased the number of desktops under General Options&gt;Desktop Size&gt;Horizontal Virtual Size to 6, now when I go into 3D mode I see a hexagon with transparent view onto other desktops.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_TYreSixeiIc/RplLEX1CaII/AAAAAAAAABs/LOiqc6Nnc5E/s1600-h/screen1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5087179792579717250" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: pointer; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_TYreSixeiIc/RplLEX1CaII/AAAAAAAAABs/LOiqc6Nnc5E/s320/screen1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The only thing I was not able to get to work is the Group and Tab windows, but compiz is still in heavy development and I can't wait until they release a stable version.&lt;br /&gt;&lt;br /&gt;One more thing I should mention is that Compiz is not just a toy with eye candy desktop and cool effects, many of the features actually make it a very productive environment to work in. I was a bit pessimistic when I first heard about it but once I had a chance to run it I loved it. Certainly the ability to have multiple desktops and to freely move windows across desktops as well as grouping windows would improve productivity and it feels like an organic way to do work on your desktop.&lt;br /&gt;&lt;br /&gt;The long anticipated year of the Linux desktop has surprised everyone. Compiz may be the killer app on Linux desktop now but there have been many improvement on Gnome and KDE in terms of usability and adaption. No wonder Dell has finally decided to ship Ubuntu preinstalled on their laptops and PCs. I hope other hardware vendors take the same direction as Dell and allow Linux to prosper in the coming years. For now Microsoft and Apple don't even come close to what Linux has to offer on the desktop, what a great turn over because only few years ago everyone was saying that Linux would never go mainstream for having a poor interface. Way to prove these people wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-1354321443367772220?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/1354321443367772220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/1354321443367772220'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/07/compiz-fusion-compositing-window.html' title='Compiz fusion - compositing window manager'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_TYreSixeiIc/RplLEX1CaII/AAAAAAAAABs/LOiqc6Nnc5E/s72-c/screen1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-9123119364780846450.post-1778191519322623092</id><published>2007-06-28T20:53:00.001-04:00</published><updated>2007-07-15T10:28:13.824-04:00</updated><title type='text'>hello</title><content type='html'>This blog will be an attempt at documenting my development and ideas for Open Source Software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9123119364780846450-1778191519322623092?l=dejant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/1778191519322623092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9123119364780846450/posts/default/1778191519322623092'/><link rel='alternate' type='text/html' href='http://dejant.blogspot.com/2007/06/hello.html' title='hello'/><author><name>dejan</name><uri>http://www.blogger.com/profile/12201419104217272582</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
