<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DE8MQXw9fSp7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587</id><updated>2011-11-27T15:34:40.265-08:00</updated><category term="linux" /><category term="jquery" /><category term="net use" /><category term="mediawiki" /><category term="javascript" /><category term="php" /><category term="extension" /><category term="C" /><category term="programming" /><category term="python html wiki tables converter" /><category term="samba" /><category term="auto-complete" /><category term="networkdrive" /><category term="eval" /><category term="metaprogramming" /><category term="cheatmap" /><category term="word" /><category term="embed" /><category term="reuse" /><category term="latex pictures" /><title>Just technical stuffs</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://just-tech.blogspot.com/" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/JustTechnicalStuffs" /><feedburner:info uri="justtechnicalstuffs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DkMNSH08cSp7ImA9WxNaEkQ.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-2474086216674815658</id><published>2009-11-26T20:01:00.000-08:00</published><updated>2009-11-26T20:01:39.379-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-26T20:01:39.379-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="word" /><category scheme="http://www.blogger.com/atom/ns#" term="embed" /><title>Embed images in word linked from external sources</title><content type="html">It took me a while to realize how to embed images in word, linked to the external files. Normally this case arises when you open html files in word and save it. Amazingly you will find "Edit Links to Files" in such case. It would have been great to find that option while saving not in the &lt;a href="http://www.onemanwrites.co.uk/2009/03/16/how-to-embed-linked-images-in-word-2007/"&gt;internet&lt;/a&gt;.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_QN194vlI-6c/Sw9OSa05WnI/AAAAAAAABLM/48-xcqvKI-g/s1600/word.prepare.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_QN194vlI-6c/Sw9OSa05WnI/AAAAAAAABLM/48-xcqvKI-g/s320/word.prepare.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;On clicking that an option box will appear.&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_QN194vlI-6c/Sw9OTKzPWSI/AAAAAAAABLU/Rx258lCVYLM/s1600/word.link.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sw9OTKzPWSI/AAAAAAAABLU/Rx258lCVYLM/s320/word.link.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Select all the files, click "Break Link" and check "Save pictures in document". And you are done.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-2474086216674815658?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tYREsL9q8ReCkciohdqQZd1bDcM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tYREsL9q8ReCkciohdqQZd1bDcM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tYREsL9q8ReCkciohdqQZd1bDcM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tYREsL9q8ReCkciohdqQZd1bDcM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/dEl4qW1evC8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/2474086216674815658/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=2474086216674815658" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/2474086216674815658?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/2474086216674815658?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/dEl4qW1evC8/embed-images-in-word-linked-from.html" title="Embed images in word linked from external sources" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_QN194vlI-6c/Sw9OSa05WnI/AAAAAAAABLM/48-xcqvKI-g/s72-c/word.prepare.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2009/11/embed-images-in-word-linked-from.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04EQnk5eSp7ImA9WxNVF0U.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-4994174429300630610</id><published>2009-10-28T21:18:00.000-07:00</published><updated>2009-10-28T21:18:23.721-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-28T21:18:23.721-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="networkdrive" /><category scheme="http://www.blogger.com/atom/ns#" term="net use" /><title>Auto-map Network drives</title><content type="html">The command lines for connecting, disconnecting and mapping the network drive are trivia once you know them.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;net use X: \\192.168.10.17\www&lt;/pre&gt;maps X: to 192.168.10.17\www&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;net use /DELETE X:&lt;/pre&gt;removes the mapped network drive&lt;br /&gt;
&lt;br /&gt;
Now I can just run this batch file .. easy!&lt;br /&gt;
&lt;pre&gt;net use /DELETE X:
net use X: \\192.168.10.17\www
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-4994174429300630610?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-rDYJ3GL9Skh5SxQoouIPacKXb8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-rDYJ3GL9Skh5SxQoouIPacKXb8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-rDYJ3GL9Skh5SxQoouIPacKXb8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-rDYJ3GL9Skh5SxQoouIPacKXb8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/tZ2zuNAjVPM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/4994174429300630610/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=4994174429300630610" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/4994174429300630610?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/4994174429300630610?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/tZ2zuNAjVPM/auto-map-network-drives.html" title="Auto-map Network drives" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2009/10/auto-map-network-drives.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMHSXk5cCp7ImA9WxNVFUg.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-7641999672372730775</id><published>2009-10-26T03:37:00.000-07:00</published><updated>2009-10-26T03:37:18.728-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T03:37:18.728-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="samba" /><category scheme="http://www.blogger.com/atom/ns#" term="cheatmap" /><title>Samba Cheatmap</title><content type="html">I created this mindmap for Samba Configuration using &lt;a href="http://freemind.sourceforge.net/"&gt;freemind&lt;/a&gt;- hence cheatmap. I am always baffled with what to do next. I find this very useful to move ahead while configuring.&lt;br /&gt;
First you create a group for accessing samba directory, add samba users and change their primary group to newly created group. This group is used to access the samba folder with directory mask and create mask set. Any user with this group will have read and write access to the folder. You have to open some ports for samba - i directly make change in iptables file. Command is recommended. In fedora, you also have to make changes in SELinux. Finally after making changes in the configuration file, start/restart the samba service.&lt;br /&gt;
You &amp;nbsp;may also download the &lt;a href="http://github.com/anjesh/misc/tree/master/sambacheat/"&gt;pdf or freemind file from github&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://github.com/anjesh/misc/raw/master/sambacheat/sambacheat.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://github.com/anjesh/misc/raw/master/sambacheat/sambacheat.jpeg" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-7641999672372730775?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2Ykv-q5z5TH70xO-GupnLJKfnRY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Ykv-q5z5TH70xO-GupnLJKfnRY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2Ykv-q5z5TH70xO-GupnLJKfnRY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Ykv-q5z5TH70xO-GupnLJKfnRY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/isiR-qQzWAs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/7641999672372730775/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=7641999672372730775" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/7641999672372730775?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/7641999672372730775?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/isiR-qQzWAs/samba-cheatmap.html" title="Samba Cheatmap" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2009/10/samba-cheatmap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ABSH0-cSp7ImA9WxNVEU0.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-5423689728393238843</id><published>2009-10-20T23:15:00.001-07:00</published><updated>2009-10-20T23:15:59.359-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-20T23:15:59.359-07:00</app:edited><title>Looping in bash for multiple operations</title><content type="html">Just learned that bash also supports looping that can be used to do the multiple operations on the files in a given folder.&lt;br&gt;&lt;br&gt;&lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; "&gt; for old in *.png; do  convert $old `basename $old .png`.eps;done&lt;/blockquote&gt;&lt;br&gt;converts all the png files in a given folder to postscript file.&lt;br&gt;&lt;br&gt;If there are i1.png, i2.png and i3.png then expansion of above loop will be &lt;br&gt; &lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; "&gt; convert i1.png e1.eps&lt;/blockquote&gt;&lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; "&gt; convert i2.png e2.eps&lt;/blockquote&gt;&lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; "&gt; convert i3.png e3.eps&lt;/blockquote&gt;&lt;br&gt;Note there is space between $old and .png&lt;br&gt;&lt;br&gt;Similarly renaming *.png to mt_*.png&lt;br&gt;&lt;blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; "&gt; for old in *.png; do cp $old my_.`basename $old .png`;done&lt;/blockquote&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-5423689728393238843?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LsVY5ZD3_ErYZ6W-UzQYETNiBj4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LsVY5ZD3_ErYZ6W-UzQYETNiBj4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LsVY5ZD3_ErYZ6W-UzQYETNiBj4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LsVY5ZD3_ErYZ6W-UzQYETNiBj4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/ELm59wEU6m0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/5423689728393238843/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=5423689728393238843" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/5423689728393238843?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/5423689728393238843?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/ELm59wEU6m0/looping-in-bash-for-multiple-operations.html" title="Looping in bash for multiple operations" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2009/10/looping-in-bash-for-multiple-operations.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYHR3cyeyp7ImA9WxNWEUQ.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-5051843292026659042</id><published>2009-10-10T09:28:00.000-07:00</published><updated>2009-10-10T09:28:56.993-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-10T09:28:56.993-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="metaprogramming" /><category scheme="http://www.blogger.com/atom/ns#" term="eval" /><title>Update: PHP eval is powerful indeed</title><content type="html">I came up with a solution though not very elegant one to the options dependent looping, by using eval() function once more. Took time to came up with the solution, especially it's not very easy to debug, except for outputting the code to the screen before executing eval(). &lt;br /&gt;
&lt;pre&gt;&lt;?
$data = array(
  array("NAME"=&gt;"Person A", "PROJECT"=&gt;1, "COUNTRY"=&gt;1, "HOURS"=&gt;40),
  array("NAME"=&gt;"Person A", "PROJECT"=&gt;1, "COUNTRY"=&gt;1, "HOURS"=&gt;30),
  array("NAME"=&gt;"Person A", "PROJECT"=&gt;1, "COUNTRY"=&gt;2, "HOURS"=&gt;70),
  array("NAME"=&gt;"Person A", "PROJECT"=&gt;2, "COUNTRY"=&gt;2, "HOURS"=&gt;10),
  array("NAME"=&gt;"Person A", "PROJECT"=&gt;3, "COUNTRY"=&gt;1, "HOURS"=&gt;50),
  array("NAME"=&gt;"Person B", "PROJECT"=&gt;1, "COUNTRY"=&gt;2, "HOURS"=&gt;40),
  array("NAME"=&gt;"Person B", "PROJECT"=&gt;1, "COUNTRY"=&gt;2, "HOURS"=&gt;10),
  array("NAME"=&gt;"Person B", "PROJECT"=&gt;2, "COUNTRY"=&gt;2, "HOURS"=&gt;50),
  );
$expecteddata1 = array(
  array("NAME"=&gt;"Person A", "HOURS"=&gt;200),
  array("NAME"=&gt;"Person B", "HOURS"=&gt;100),
);
$expecteddata2 = array(
  array("NAME"=&gt;"Person A", "PROJECT"=&gt;1, "HOURS"=&gt;140),
  array("NAME"=&gt;"Person A", "PROJECT"=&gt;2, "HOURS"=&gt;10),
  array("NAME"=&gt;"Person A", "PROJECT"=&gt;3, "HOURS"=&gt;50),
  array("NAME"=&gt;"Person B", "PROJECT"=&gt;1, "HOURS"=&gt;50),
  array("NAME"=&gt;"Person B", "PROJECT"=&gt;2, "HOURS"=&gt;50),
);

function groupData($input, $byOptions) {
  $str = "";
  foreach($byOptions as $option) {
    $str .= '[$row['.$option.']]';
  }
  $data = array();
  foreach($input as $rowid=&gt;$row) {
    eval("@\$data".$str."['hours'] += ".$row['HOURS'].";");
  }
  
  $newdata = array();
  
  $str = ""; 
  $count = 0;
  foreach($byOptions as $option) {
    $str .= '"'.$option.'"=&gt;"$id'.$count.'",';
    $count ++;
  }
  $str='array('.$str.'"HOURS"=&gt;"$hours")';

  $count = 0;
  $forstr = 'foreach($data as $id'.($count).'=&gt;$arr'.($count).') {';
  foreach($byOptions as $option) {
    if($count &gt;= (sizeof($byOptions)-1))  {
      $forstr .= '$hours=$arr'.$count.'["hours"];';
      break;
    }
    $forstr .= 'foreach($arr'.$count.' as $id'.($count+1).'=&gt;$arr'.($count+1).') {';
    $count++;
  }
  $forstr .= '$newdata[]='.$str.';';
  $count = 0;
  foreach($byOptions as $option) {
    if($count &gt;= (sizeof($byOptions)-1))  {
      break;
    }
    $forstr .= '}';
    $count ++;
  }
  $forstr .= '}';
  
  //print $forstr;
  eval("$forstr");
  return $newdata;
}

$output1 = groupData($data, array("NAME"));
print ($expecteddata1 == $output1)?"Same":"Different Objects";

$output2 = groupData($data, array("NAME", "PROJECT"));
print ($expecteddata2== $output2)?"Same":"Different Objects";  
?&gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-5051843292026659042?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XpxwjsJ8ATpkJCvHDVD4w2BTKdA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XpxwjsJ8ATpkJCvHDVD4w2BTKdA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XpxwjsJ8ATpkJCvHDVD4w2BTKdA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XpxwjsJ8ATpkJCvHDVD4w2BTKdA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/Pv0558B60og" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/5051843292026659042/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=5051843292026659042" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/5051843292026659042?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/5051843292026659042?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/Pv0558B60og/update-php-eval-is-powerful-indeed.html" title="Update: PHP eval is powerful indeed" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2009/10/update-php-eval-is-powerful-indeed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4NSXs-eCp7ImA9WxNWEUQ.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-1475676527597742827</id><published>2009-10-09T03:03:00.000-07:00</published><updated>2009-10-10T09:43:18.550-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-10T09:43:18.550-07:00</app:edited><title>PHP eval is powerful indeed!</title><content type="html">I have this array probem.&lt;br /&gt;
A set of data &lt;br /&gt;
&lt;pre&gt;$data = array(
  array("NAME"=&amp;gt;"Person A", "PROJECT"=&amp;gt;1, "COUNTRY"=&amp;gt;1, "HOURS"=&amp;gt;40),
  array("NAME"=&amp;gt;"Person A", "PROJECT"=&amp;gt;1, "COUNTRY"=&amp;gt;1, "HOURS"=&amp;gt;30),
  array("NAME"=&amp;gt;"Person A", "PROJECT"=&amp;gt;1, "COUNTRY"=&amp;gt;2, "HOURS"=&amp;gt;70),
  array("NAME"=&amp;gt;"Person A", "PROJECT"=&amp;gt;2, "COUNTRY"=&amp;gt;2, "HOURS"=&amp;gt;10),
  array("NAME"=&amp;gt;"Person A", "PROJECT"=&amp;gt;3, "COUNTRY"=&amp;gt;1, "HOURS"=&amp;gt;50),
  array("NAME"=&amp;gt;"Person B", "PROJECT"=&amp;gt;1, "COUNTRY"=&amp;gt;2, "HOURS"=&amp;gt;40),
  array("NAME"=&amp;gt;"Person B", "PROJECT"=&amp;gt;1, "COUNTRY"=&amp;gt;2, "HOURS"=&amp;gt;10),
  array("NAME"=&amp;gt;"Person B", "PROJECT"=&amp;gt;2, "COUNTRY"=&amp;gt;2, "HOURS"=&amp;gt;50),
  );
&lt;/pre&gt;which i want in this format&lt;br /&gt;
&lt;pre&gt;$expecteddata1 = array(
  array("NAME"=&amp;gt;"Person A", "HOURS"=&amp;gt;200),
  array("NAME"=&amp;gt;"Person B", "HOURS"=&amp;gt;100),
);
&lt;/pre&gt;and also this, &lt;br /&gt;
&lt;pre&gt;$expecteddata2 = array(
  array("NAME"=&amp;gt;"Person A", "PROJECT"=&amp;gt;1, "HOURS"=&amp;gt;140),
  array("NAME"=&amp;gt;"Person A", "PROJECT"=&amp;gt;2, "HOURS"=&amp;gt;10),
  array("NAME"=&amp;gt;"Person A", "PROJECT"=&amp;gt;3, "HOURS"=&amp;gt;50),
  array("NAME"=&amp;gt;"Person B", "PROJECT"=&amp;gt;1, "HOURS"=&amp;gt;50),
  array("NAME"=&amp;gt;"Person B", "PROJECT"=&amp;gt;2, "HOURS"=&amp;gt;50),
);
&lt;/pre&gt;The expected data need grouping among multiple numbers of options. Note the Total.&lt;br /&gt;
&lt;br /&gt;
It took some time to come with the solution after working a bit with the powerful eval() function.&lt;br /&gt;
&lt;br /&gt;
It's much easy to do the looping and grouping as follows&lt;br /&gt;
&lt;pre&gt;for($data as $rowid=&amp;gt;$row) {
  $newdata[$row["NAME"]] += $row["HOURS]; //gives the data required for $expecteddata1
  $newdata[$row["NAME"]][$row["PROJECT]] += $row["HOURS]; //gives the data required for $expecteddata2
}
&lt;/pre&gt;which can be made to work for any number of options with &lt;br /&gt;
for first case  $byOptions = array("NAME");&lt;br /&gt;
and for second case  $byOptions = array("NAME", "PROJECT");&lt;br /&gt;
&lt;pre&gt;$str = "";
  foreach($byOptions as $option) {
    $str .= '[$row['.$option.']]';
  }
  $data = array();
  foreach($input as $rowid=&amp;gt;$row) {
    eval("@\$data".$str."['hours'] += ".$row['HOURS'].";");
  }
&lt;/pre&gt;&lt;br /&gt;
and next loop through $newdata and generate the expecteddata. This part of code needs to be refactored. If any of you can come up with good solution to remove the options dependent looping, it would be great. [update: &lt;a href="http://just-tech.blogspot.com/2009/10/update-php-eval-is-powerful-indeed.html"&gt;I came up with solution in next post that eliminates the options dependent looping using eva&lt;/a&gt;l]&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;function groupData($input, $byOptions) {
  $str = "";
  foreach($byOptions as $option) {
    $str .= '[$row['.$option.']]';
  }
  $data = array();
  foreach($input as $rowid=&amp;gt;$row) {
    eval("@\$data".$str."['hours'] += ".$row['HOURS'].";");
  }
  
  $newdata = array();
  foreach($data as $id=&amp;gt;$arr) {
    if(isset($arr['hours'])) {
      $newdata[] = array($byOptions[0]=&amp;gt;$id, 'HOURS'=&amp;gt;$arr['hours']);
    } else {
      foreach($arr as $id1=&amp;gt;$arr1) {
        if(isset($arr1['hours'])) {
          $newdata[] = array($byOptions[0]=&amp;gt;$id, $byOptions[1]=&amp;gt;$id1, 'HOURS'=&amp;gt;$arr1['hours']);      
        } else {
          foreach($arr1 as $id2=&amp;gt;$arr2) {
            $newdata[] = array($byOptions[0]=&amp;gt;$id, $byOptions[1]=&amp;gt;$id1, $byOptions[2]=&amp;gt;$id2, 'HOURS'=&amp;gt;$arr2['hours']);     
          }
        }
      }
    }
  }  
  return $newdata;
}
&lt;/pre&gt;&lt;br /&gt;
Test the function. It should work.&lt;br /&gt;
&lt;pre&gt;$output1 = groupData($data, array("NAME"));
print ($expecteddata1 == $output1)?"Same":"Different Objects";

$output2 = groupData($data, array("NAME", "PROJECT"));
print ($expecteddata2== $output2)?"Same":"Different Objects";  
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-1475676527597742827?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fxH6U6tgKRJKfrS_CbW5URCEG5k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fxH6U6tgKRJKfrS_CbW5URCEG5k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fxH6U6tgKRJKfrS_CbW5URCEG5k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fxH6U6tgKRJKfrS_CbW5URCEG5k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/lgW7s32yc5s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/1475676527597742827/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=1475676527597742827" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/1475676527597742827?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/1475676527597742827?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/lgW7s32yc5s/i-have-this-array-probem.html" title="PHP eval is powerful indeed!" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2009/10/i-have-this-array-probem.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8NRnY9fSp7ImA9WxNXGUo.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-1955742495764087278</id><published>2009-10-07T21:47:00.001-07:00</published><updated>2009-10-07T21:58:17.865-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-07T21:58:17.865-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="latex pictures" /><title>Split big image to two in Latex with ease</title><content type="html">&lt;div&gt;If you have one large image that doesn't fit in your page, then you open some photo editor, split the image into two and put those images in two images. Nice! Now your text gets edited (added, removed, updated) and the split images do not seem to fit as they were. You again open up image editor and do the process, hoping that no more edits are required.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;You are in luck if you are latex user, you can just change some numbers and split the image on the fly without having to tinker with image editors.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;(0,1500) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(600,1500)&lt;br /&gt;
&lt;/div&gt;&amp;nbsp;---------------------&lt;br /&gt;
| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;
&lt;div&gt;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&amp;nbsp;---------------------&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;(0,900) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(600,900)&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&amp;nbsp;---------------------&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;
&lt;div&gt;&amp;nbsp;---------------------&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;(0,0) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (600,0)&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;First display the first half image with the coordinates(0,900) and (600,1500).&lt;br /&gt;
&lt;/div&gt;&lt;pre&gt;\begin{figure}[h]
&amp;nbsp;\centering
&amp;nbsp; \fbox{
   \scalebox{0.5}{\includegraphics*[viewport=0 900 600 1500]{large_image.png}}
&amp;nbsp; }
\end{figure}
&lt;/pre&gt;&lt;div&gt;Now display the second part of the image.&lt;br /&gt;
&lt;/div&gt;&lt;pre&gt;\begin{figure}[h]
&amp;nbsp;\centering
&amp;nbsp; \fbox{
   \scalebox{0.5}{\includegraphics*[viewport=0 0 600 900]{large_image.png}}
&amp;nbsp; }
&amp;nbsp;\caption{Caption only here}
&amp;nbsp;\label{Label only here}
\end{figure}
&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-1955742495764087278?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/U2B0_yIm5U_aTs8AYv7gZsjwfxo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/U2B0_yIm5U_aTs8AYv7gZsjwfxo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/U2B0_yIm5U_aTs8AYv7gZsjwfxo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/U2B0_yIm5U_aTs8AYv7gZsjwfxo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/lRv1v4aUahk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/1955742495764087278/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=1955742495764087278" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/1955742495764087278?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/1955742495764087278?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/lRv1v4aUahk/split-big-image-to-two-in-latex.html" title="Split big image to two in Latex with ease" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2009/10/split-big-image-to-two-in-latex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cBQH85eSp7ImA9WB9bFUQ.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-5362381481515689075</id><published>2007-12-25T08:02:00.001-08:00</published><updated>2007-12-25T08:10:51.121-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-25T08:10:51.121-08:00</app:edited><title>xdebug: Function Tracing using Profiling</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Every now and then you would be looking at the codes of others. Thanks to open-source, I have had many such instances and had really hard time following the code. Take mediawiki, drupal, owl, dotproject just to name a few. &lt;b&gt;&lt;i&gt;Xdebug allows you to log all function calls, including parameters and return values to a file in different formats.&lt;/i&gt;&lt;/b&gt; The output log format can be customized. Like I may need the function calls only, just to trace the order of function calls. &lt;br/&gt;&lt;br/&gt;The xdebug.org has a &lt;a href='http://www.xdebug.org/docs/execution_trace'&gt;page on function trace&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;It's not a good practice to write the configuration parameters in php.ini or xdebug.ini file (you may also do that, but you don't want to trace other applications). These ini files set global configuration. It's no wonder that xdebug makes everything slow. So be careful. If you are wondering about xdebug.ini, it's a separate config file for xdebug extension. rather than writing to php.ini file. See my previous &lt;a href='http://just-tech.blogspot.com/2007/12/starting-xdebug-in-linux-machine.html'&gt;post on building xdebug&lt;/a&gt;. &lt;br/&gt;&lt;br/&gt;.htaccess comes to aid, when you don't want to write either to your source code or .ini file. &lt;br/&gt;&lt;br/&gt;Create .htaccess file in the directory of the application you want to trace.&lt;br/&gt;&lt;pre style='border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;'&gt;php_value xdebug.auto_trace 1&lt;br/&gt;php_value xdebug.trace_format  0&lt;br/&gt;php_value xdebug.trace_output_dir  /var/www/trace&lt;br/&gt;php_value xdebug.trace_options  1&lt;/pre&gt;See the meaning of above configuration from here. There are other parameters if you need to see the parameters passed and the return values.&lt;br/&gt;&lt;br/&gt;Make sure that the directory /var/www/trace is writable by your web-server.&lt;br/&gt;&lt;br/&gt;Load the php script in your browser. You will see a new file has been created at the output location.&lt;br/&gt;&lt;br/&gt;The file size can get very huge. Like in the case of mediawiki code, loading index.php creates a trace file of size 3M. &lt;br/&gt;&lt;br/&gt;&lt;pre style='border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;'&gt;TRACE START [2007-12-25 05:24:23]&lt;br/&gt;    0.0018      68304   -&amp;amp;gt; {main}() /var/www/testwiki/index.php:0&lt;br/&gt;    0.0037      87332     -&amp;amp;gt; require_once(/var/www/testwiki/includes/WebStart.php) /var/www/testwiki/index.php:38&lt;br/&gt;    0.0039      87460       -&amp;amp;gt; str_replace() /var/www/testwiki/includes/WebStart.php:10&lt;br/&gt;    0.0041      87800       -&amp;amp;gt; ini_get() /var/www/testwiki/includes/WebStart.php:19&lt;br/&gt;    0.0043      87800       -&amp;amp;gt; microtime() /var/www/testwiki/includes/WebStart.php:51&lt;br/&gt;    0.0045      87860       -&amp;amp;gt; function_exists() /var/www/testwiki/includes/WebStart.php:53&lt;br/&gt;    0.0047      87880       -&amp;amp;gt; getrusage() /var/www/testwiki/includes/WebStart.php:54&lt;br/&gt;    0.0050      89420       -&amp;amp;gt; ini_set() /var/www/testwiki/includes/WebStart.php:59&lt;br/&gt;    0.0052      89420       -&amp;amp;gt; define() /var/www/testwiki/includes/WebStart.php:66&lt;br/&gt;    0.0057      91252       -&amp;amp;gt; require_once(/var/www/testwiki/StartProfiler.php) /var/www/testwiki/includes/WebStart.php:69&lt;br/&gt;    0.0059      91252         -&amp;amp;gt; dirname() /var/www/testwiki/StartProfiler.php:3&lt;br/&gt;    0.0071     101736         -&amp;amp;gt; require_once(/var/www/testwiki/includes/ProfilerStub.php)&lt;br/&gt;.....&lt;br/&gt;.....&lt;br/&gt;    2.1464    8033332     -&amp;amp;gt; strlen() /var/www/testwiki/includes/OutputHandler.php:14&lt;br/&gt;    2.1466    8033332     -&amp;amp;gt; wfDoContentLength() /var/www/testwiki/includes/OutputHandler.php:14&lt;br/&gt;    2.1467    8033332       -&amp;amp;gt; headers_sent() /var/www/testwiki/includes/OutputHandler.php:96&lt;br/&gt;    2.1930      74168&lt;br/&gt;TRACE END   [2007-12-25 05:24:37]&lt;br/&gt;    &lt;/pre&gt;&lt;br/&gt;This file is 27028 lines long. Huge, isn't it? The file looks simple, nonetheless long. It should give a good idea of what functions are being called. &lt;br/&gt;&lt;br/&gt;I just found another convenient way of function tracing by using the profiling feature.&lt;br/&gt;&lt;br/&gt;&lt;i&gt;&lt;b&gt;Xdebug's built-in profiler allows you to find bottlenecks in your script and visualize those with an external tool such as KCacheGrind or WinCacheGrind.&lt;/b&gt;&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;While viewing the profiler output, I realized that it's an excellent way of viewing the tracing function calls. &lt;br/&gt;&lt;br/&gt;To enable profiler, replace the content of .htaccess file with the following lines&lt;br/&gt;&lt;pre style='border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;'&gt;php_value xdebug.profiler_output_dir /var/www/trace&lt;br/&gt;php_value xdebug.profiler_enable 1&lt;/pre&gt;Load the php script from browser. You will see the file cachegrind.out file being created. There are two such files in my case. I wonder why. &lt;br/&gt;&lt;br/&gt;Now download &lt;a href='http://sourceforge.net/projects/wincachegrind'&gt;WinCacheGrind&lt;/a&gt; that beautifies the above created file in a very convenient manner.&lt;br/&gt;&lt;br/&gt;Load the cachegrind.out file in WinCacheGrind. You will notice that the left pane displays the function calls, and included file in a same sequence as that of function trace output file above.&lt;br/&gt;&lt;br/&gt;&lt;center&gt;&lt;a href='http://picasaweb.google.com/anjeshtuladhar/MyPhotos/photo#5147935280445103010'&gt;&lt;img src='http://lh3.google.com/anjeshtuladhar/R3Ej3NWhm6I/AAAAAAAAAbg/Ysw7ds9okA8/s800/wincachegrind.jpg'/&gt;&lt;/a&gt;&lt;/center&gt;&lt;br/&gt;You may browse through the tree of function calls and probably understand the code flow in much less time. You will also see that the php internal function are labelled as php::functionname so you can just concentrate on user functions. Happy hacking.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-5362381481515689075?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PHVQ-2h8o7fHQguC9ywrjrxzcfw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PHVQ-2h8o7fHQguC9ywrjrxzcfw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PHVQ-2h8o7fHQguC9ywrjrxzcfw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PHVQ-2h8o7fHQguC9ywrjrxzcfw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/SbFUa7Akl20" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/5362381481515689075/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=5362381481515689075" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/5362381481515689075?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/5362381481515689075?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/SbFUa7Akl20/xdebug-function-tracing-using-profiling.html" title="xdebug: Function Tracing using Profiling" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2007/12/xdebug-function-tracing-using-profiling.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECQH46fSp7ImA9WB9bFUQ.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-7454022409985113538</id><published>2007-12-25T07:51:00.001-08:00</published><updated>2007-12-25T08:04:21.015-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-25T08:04:21.015-08:00</app:edited><title>building xdebug in linux machine</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Though the instructions at &lt;a href='http://www.xdebug.org/'&gt;xdebug.org&lt;/a&gt; were good, I still had a little hard time getting through the details. It took me a while to understand and get xdebug running in my linux machines. I tried with ubuntu gusty server (7.10) and fedora core 5, and had xdebug compiled and built in both. &lt;br/&gt;&lt;br/&gt;You may also want to see the &lt;a href='http://www.xdebug.org/docs/install'&gt;instruction at xdebug&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;First download xdebug source from xdebug.org&lt;br/&gt;I prefer wget. &lt;br/&gt;&lt;code&gt;#wget http://www.xdebug.org/files/xdebug-2.0.2.tgz&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Untar tgz file and go into the xdebug-2.0.2 folder&lt;br/&gt;&lt;code&gt;#tar -xzf xdebug-2.0.2.tgz&lt;br/&gt;#cd xdebug-2.0.2&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;To build the php extension, you need several binaries like phpize, php-config (part of php-dev package). The chances are your system may not have this particular package. &lt;br/&gt;&lt;br/&gt;&lt;code&gt;#apt-get install php5-dev (in ubuntu)&lt;br/&gt;#yum install php5-dev (in fedora)&lt;/code&gt;&lt;br/&gt;will automate the nitty-gritty job of solving dependencies. Some may even ask to upgrade mysql-server along with php depending upon the versions in your machine. Make sure your data are backed-up, before you say yes to install and upgrade dependencies packages. &lt;br/&gt;&lt;br/&gt;After the installation, phpize should be available. phpize is a shell script to prepare PHP extension for compiling. Believe me I couldn't find the purpose of phpize anywhere in the internet. Maybe I haven't searched enough :( &lt;br/&gt;Run phpize in your xdebug source directory. phpize generates several files, necessary for compiling, building the xdebug extension. &lt;br/&gt;&lt;br/&gt;&lt;code&gt;#phpize&lt;/code&gt;&lt;br/&gt;will give the following output&lt;br/&gt;&lt;pre style='border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;'&gt;Configuring for:&lt;br/&gt;PHP Api Version:         20041225&lt;br/&gt;Zend Module Api No:      20050922&lt;br/&gt;Zend Extension Api No:   220051025&lt;br/&gt;&lt;/pre&gt;You will see that 'configure' script and several others are created. &lt;br/&gt;&lt;br/&gt;&lt;code&gt;#./configure --enable-xdebug&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;See the install instruction, if you get any errors. I didn't run into any. Hope you won't too.&lt;br/&gt;&lt;br/&gt;&lt;code&gt;#make&lt;/code&gt;&lt;br/&gt;will build the extension xdebug.so in modules directory. &lt;br/&gt;&lt;br/&gt;Move the extension to any folder you want. I moved to /opt/phpmodules/xdebug.so&lt;br/&gt;&lt;br/&gt;You may either put the extension loading statement in php.ini or you may create a new ini file (xdebug.ini) in php.d directory. The configuration files will be automatically read from this directory (/etc/php5/conf.d in my case) and the extensions get loaded.&lt;br/&gt;&lt;br/&gt;I wrote the following line to xdebug.ini &lt;br/&gt;&lt;pre style='border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;'&gt;zend_extension="/opt/phpmodules/xdebug.so"&lt;/pre&gt;restart the apache server.&lt;br/&gt;&lt;br/&gt;Load phpinfo (write a php script that calls phpinfo()) from the browser. If everything goes fine, you should see that xdebug module and zend logo in the browser. &lt;br/&gt;&lt;center&gt;&lt;a href='http://picasaweb.google.com/anjeshtuladhar/MyPhotos/photo#5147935280445103026'&gt;&lt;img style='' src='http://lh3.google.com/anjeshtuladhar/R3Ej3NWhm7I/AAAAAAAAAbo/vx2WcD9fFyg/s400/xdebug.phpinfo.jpg'/&gt;&lt;/a&gt;&lt;/center&gt;&lt;br/&gt;&lt;code&gt;#php -m&lt;/code&gt;&lt;br/&gt;will also show xdebug under "PHP Modules" and "Zend Modules".&lt;br/&gt;&lt;br/&gt;Congratulation. xDebug is successfully built and installed.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-7454022409985113538?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qKsTX1MqsMATPDPPzkS8RUq33u0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qKsTX1MqsMATPDPPzkS8RUq33u0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qKsTX1MqsMATPDPPzkS8RUq33u0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qKsTX1MqsMATPDPPzkS8RUq33u0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/8QYmbhq4NIA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/7454022409985113538/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=7454022409985113538" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/7454022409985113538?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/7454022409985113538?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/8QYmbhq4NIA/starting-xdebug-in-linux-machine.html" title="building xdebug in linux machine" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2007/12/starting-xdebug-in-linux-machine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8AQ345eip7ImA9WB9UGEU.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-7815563841656464297</id><published>2007-12-17T02:52:00.001-08:00</published><updated>2007-12-17T02:54:02.022-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-17T02:54:02.022-08:00</app:edited><title>find and delete files at once... the shortcut</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I was trying to delete a list of files with a character '-' in their filenames from a directory, containing lots of other files. Thanks to linux, you get everything you need here. &lt;br/&gt;&lt;br/&gt;&lt;code&gt;#find ./directorypath -regex '.*-.*' &lt;/code&gt;&lt;br/&gt;lists all the files/directories containing '-' anywhere in the filename or directory name.&lt;br/&gt;-regex allows to give any pattern to do powerful custom search.&lt;br/&gt;&lt;br/&gt;To list only the files, add &lt;code&gt;-type f&lt;/code&gt;&lt;br/&gt;&lt;code&gt;#find ./directorypath -type f -regex '.*-.*' &lt;/code&gt;&lt;br/&gt;&lt;br/&gt;To delete all the files/directories with any pattern, just add command to the above line as shown below&lt;br/&gt;&lt;code&gt;#find ./directorypath -regex '.*-.*' -exec rm -rf {} \;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;-exec rm -rf {} \; &lt;/code&gt;&lt;br/&gt;executes &lt;code&gt;rm -rf&lt;/code&gt; (remove forcefully and recursively in case of directory). The files/directories found by find command is passed to the &lt;code&gt;rm -rf&lt;/code&gt; command via &lt;code&gt;{}&lt;/code&gt;, which deletes them. &lt;code&gt;\;&lt;/code&gt; marks the end of the command.&lt;br/&gt;&lt;br/&gt;I suggest you first move all the files to some directory, before deleting them, just incase you don't accidentally delete some important files.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-7815563841656464297?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vDuMu_ZT01SdIvKRtaJaQheFiqk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vDuMu_ZT01SdIvKRtaJaQheFiqk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vDuMu_ZT01SdIvKRtaJaQheFiqk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vDuMu_ZT01SdIvKRtaJaQheFiqk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/CxNIF8B_cKM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/7815563841656464297/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=7815563841656464297" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/7815563841656464297?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/7815563841656464297?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/CxNIF8B_cKM/linux-shortcut-for-everything.html" title="find and delete files at once... the shortcut" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2007/12/linux-shortcut-for-everything.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAHSH86eSp7ImA9WB9UGEU.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-6194457114409709733</id><published>2007-12-17T01:54:00.001-08:00</published><updated>2007-12-17T02:18:59.111-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-17T02:18:59.111-08:00</app:edited><title>iptables... an easy way</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I have been trying to open a trivial MySQL port in the fedora server box - just wanted to use desktop MySQL Client (like freeware EMS SQL Manager Lite for MySQL) rather than ubiquitous phpMyAdmin. I never understood this perplexing iptables command and its rules. &lt;br/&gt;&lt;br/&gt;The easy way is to do a "Copy and paste" of a line from /etc/sysconfig/iptables and changing the port number (3306 for mysql - default).&lt;br/&gt;&lt;code&gt;&lt;br/&gt;-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;Restarting the iptables service does the remaining job.&lt;br/&gt;&lt;code&gt;&lt;br/&gt;service iptables stop&lt;br/&gt;service iptables start&lt;br/&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-6194457114409709733?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pV1eQ8FVeN-7LzsdAzqEHWHy9E0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pV1eQ8FVeN-7LzsdAzqEHWHy9E0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pV1eQ8FVeN-7LzsdAzqEHWHy9E0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pV1eQ8FVeN-7LzsdAzqEHWHy9E0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/GUdlr4D7Pxs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/6194457114409709733/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=6194457114409709733" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/6194457114409709733?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/6194457114409709733?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/GUdlr4D7Pxs/iptables-easy-way.html" title="iptables... an easy way" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2007/12/iptables-easy-way.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYGRXg_eip7ImA9WB9UGU0.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-5910859252898855740</id><published>2007-12-16T08:44:00.000-08:00</published><updated>2007-12-17T07:08:44.642-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-17T07:08:44.642-08:00</app:edited><title>Dekiwiki running along with other apps</title><content type="html">I finally &lt;a href="http://wiki.opengarden.org/Deki_Wiki/Installation_and_Upgrade/1.8_Hayes_Official_Install_and_Upgrade_Guide/Ubuntu_7.10_%28Gutsy%29"&gt;managed to install&lt;/a&gt; and run &lt;a href="http://wiki.opengarden.org/Deki_Wiki"&gt;Dekiwiki&lt;/a&gt; in my Ubuntu 7.10 (gutsy) server machine. The problem with DekiWiki is that it has to be installed in the root directory. If I have other apps serving by the server, then DekiWiki will just claim the entire apache server, depriving me from accessing other apps - even phpMyAdmin.&lt;br /&gt;&lt;br /&gt;After having Dekiwiki working, I made a tweak so that dekiwiki is run in port 8080 and port 80 is used to serve my default DocumentRoot (/var/www).&lt;br /&gt;&lt;br /&gt;Here's my directory structure&lt;br /&gt;/var/www/&lt;br /&gt;------------phpMyAdmin/...&lt;br /&gt;------------dekiwiki/web/...&lt;br /&gt;------------testapps/&lt;br /&gt;&lt;br /&gt;I added the following lines in /var/www/ports.conf below with Listen 80&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Listen 8080&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now the apache will also listen in a different port 8080&lt;br /&gt;&lt;br /&gt;I changed the deki-apache.conf file, included with the dekiwiki application. I just made sure that DocumentRoot is different when served in port 8080.&lt;br /&gt;&lt;br /&gt;Now dekiwiki is accessed from http://192.168.0.45:8080/&lt;br /&gt;While other apps can be accessed from http://192.168.0.45/&lt;br /&gt;&lt;br /&gt;My hours of labor in Dekiwiki seem to get paid off.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;DocumentRoot "/var/www"&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;VirtualHost *:8080&amp;gt;&lt;br /&gt;ServerName 192.168.0.45&lt;br /&gt;&lt;br /&gt;ErrorLog /var/log/apache2/error.log&lt;br /&gt;CustomLog /var/log/apache2/access.log common&lt;br /&gt;&lt;br /&gt;DocumentRoot "/var/www/dekiwiki/web"&lt;br /&gt;&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteCond %{REQUEST_URI} ^/$&lt;br /&gt;RewriteRule ^/$ /index.php?title= [L,NE]&lt;br /&gt;&lt;br /&gt;RewriteCond %{REQUEST_URI} !/(@api|editor|skins|config)/&lt;br /&gt;RewriteCond %{REQUEST_URI} !/(redirect|texvc|index|Version).php&lt;br /&gt;RewriteCond %{REQUEST_URI} !/error/(40(1|3|4)|500).html&lt;br /&gt;RewriteCond %{REQUEST_URI} !/favicon.ico&lt;br /&gt;RewriteCond %{REQUEST_URI} !/robots.txt&lt;br /&gt;RewriteCond %{QUERY_STRING} ^$ [OR] %{REQUEST_URI} ^/Special:Search&lt;br /&gt;RewriteRule ^/(.*)$ /index.php?title=$1 [L,QSA,NE]&lt;br /&gt;&lt;br /&gt;# deki-api uses encoded slashes in query parameters so AllowEncodedSlashes must be On&lt;br /&gt;AllowEncodedSlashes On&lt;br /&gt;&lt;br /&gt;# mod_proxy rules&lt;br /&gt;ProxyPass /@api http://localhost:8081 retry=1&lt;br /&gt;ProxyPassReverse /@api http://localhost:8081&lt;br /&gt;SetEnv force-proxy-request-1.0 1&lt;br /&gt;SetEnv proxy-nokeepalive 1&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-5910859252898855740?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/f8hS_kA4NEYB55TfyoRtEsmEaaM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f8hS_kA4NEYB55TfyoRtEsmEaaM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/f8hS_kA4NEYB55TfyoRtEsmEaaM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f8hS_kA4NEYB55TfyoRtEsmEaaM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/Z9JWLO0wNLk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/5910859252898855740/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=5910859252898855740" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/5910859252898855740?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/5910859252898855740?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/Z9JWLO0wNLk/dekiwiki-running-along-with-other-apps.html" title="Dekiwiki running along with other apps" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2007/12/dekiwiki-running-along-with-other-apps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8NSH0_eyp7ImA9WBFTEU4.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-1303343748087729579</id><published>2007-01-29T20:04:00.000-08:00</published><updated>2007-01-29T21:11:39.343-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-01-29T21:11:39.343-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python html wiki tables converter" /><title>Python: HTML tables to Mediawiki converter</title><content type="html">Some ideas and codes for the html2wiki are borrowed from &lt;a href="http://sebsauvage.net/python/html2csv.py"&gt;html2csv converter&lt;/a&gt;. It reads any file and converts tables, if present, to wiki format. The code, in colored, can also be viewed from &lt;a href="http://www.bigbold.com/snippets/posts/show/3371"&gt;the code snippets&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;import HTMLParser, re, sys&lt;br /&gt;class html2wiki(HTMLParser.HTMLParser):&lt;br /&gt;def __init__(self):&lt;br /&gt;   HTMLParser.HTMLParser.__init__(self)&lt;br /&gt;   self.wiki = ''      # The Wiki text&lt;br /&gt;   self.wikirow = ''   # The current Wiki row of table being constructed from HTML&lt;br /&gt;   self.inTD = 0      # Used to track if we are inside or outside a &amp;lt;TD&amp;gt;...&amp;lt;/TD&amp;gt; tag.&lt;br /&gt;   self.inTR = 0      # Used to track if we are inside or outside a &amp;lt;TR&amp;gt;...&amp;lt;/TR&amp;gt; tag.&lt;br /&gt;   self.re_multiplespaces = re.compile('\s+')  # regular expression used to remove spaces in excess&lt;br /&gt;   self.rowCount = 0  # output row counter.&lt;br /&gt;   self.rowspan = ''&lt;br /&gt;   self.colspan = ''&lt;br /&gt;   self.linebreak = '&amp;lt;br&amp;gt;'&lt;br /&gt;   self.data = ''&lt;br /&gt;   self.prop = ''&lt;br /&gt;&lt;br /&gt;def handle_starttag(self, tag, attrs):&lt;br /&gt;   if tag == 'table': self.start_table()&lt;br /&gt;   elif   tag == 'tr': self.start_tr()&lt;br /&gt;   elif tag == 'td': self.start_td(attrs)&lt;br /&gt;&lt;br /&gt;def handle_endtag(self, tag):&lt;br /&gt;   if tag == 'table': self.end_table();&lt;br /&gt;   elif   tag == 'tr': self.end_tr()&lt;br /&gt;   elif tag == 'td': self.end_td()&lt;br /&gt;&lt;br /&gt;def start_table(self):&lt;br /&gt;   self.wiki += '{| border=1' + self.linebreak&lt;br /&gt;   self.wiki += '|-' + self.linebreak&lt;br /&gt;&lt;br /&gt;def end_table(self):&lt;br /&gt;   self.wiki += '|}' + self.linebreak&lt;br /&gt;&lt;br /&gt;def start_tr(self):&lt;br /&gt;   if self.inTR: self.end_tr()  # &amp;lt;TR&amp;gt; implies &amp;lt;/TR&amp;gt;&lt;br /&gt;   self.inTR = 1&lt;br /&gt;&lt;br /&gt;def end_tr(self):&lt;br /&gt;   if self.inTD: self.end_td()  # &amp;lt;/TR&amp;gt; implies &amp;lt;/TD&amp;gt;&lt;br /&gt;   self.inTR = 0       &lt;br /&gt;   if len(self.wikirow) &amp;gt; 0:&lt;br /&gt;       self.wiki += self.wikirow&lt;br /&gt;       self.wiki += '|-' + self.linebreak&lt;br /&gt;       self.wikirow = ''&lt;br /&gt;   self.rowCount += 1&lt;br /&gt;&lt;br /&gt;def start_td(self, attrs):&lt;br /&gt;   if not self.inTR: self.start_tr() # &amp;lt;TD&amp;gt; implies &amp;lt;TR&amp;gt;&lt;br /&gt;   self.data = ''&lt;br /&gt;   self.prop = ''&lt;br /&gt;   self.rowspan = ''&lt;br /&gt;   self.colspan = ''&lt;br /&gt;   for key, value in attrs:&lt;br /&gt;       if key == 'rowspan':&lt;br /&gt;           self.rowspan = value&lt;br /&gt;       elif key == 'colspan':&lt;br /&gt;           self.colspan = value       &lt;br /&gt;   self.inTD = 1&lt;br /&gt;&lt;br /&gt;def end_td(self):&lt;br /&gt;   if self.inTD:           &lt;br /&gt;       self.wikirow += '| ' + self.prop + self.re_multiplespaces.sub(' ',self.data.replace('\t',' ').replace(self.linebreak,'').replace('\r','').replace('"','""'))+ self.linebreak;&lt;br /&gt;       self.data = ''&lt;br /&gt;       self.inTD = 0&lt;br /&gt;&lt;br /&gt;def handle_data(self, data):&lt;br /&gt;   if self.inTD:&lt;br /&gt;       if data.strip() != '':           &lt;br /&gt;           self.prop = ''&lt;br /&gt;           if self.rowspan != '':&lt;br /&gt;               self.prop = ' rowspan = '+self.rowspan&lt;br /&gt;           if self.colspan != '':&lt;br /&gt;               self.prop += ' colspan = '+self.colspan&lt;br /&gt;           if self.prop:&lt;br /&gt;               self.prop += ' | '&lt;br /&gt;           self.data += data&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':           &lt;br /&gt;parser = html2wiki()&lt;br /&gt;if len(sys.argv) == 2:&lt;br /&gt;   in_file = open(sys.argv[1],"r")&lt;br /&gt;   text = in_file.read()&lt;br /&gt;   parser.feed(text)&lt;br /&gt;   in_file.close()&lt;br /&gt;   print parser.wiki&lt;br /&gt;else:&lt;br /&gt;   print 'Argument - filename required'&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Since I need a web interface for users, I don't want to create another similar app in php nor do I want to write cgi in python. So I wrote another tiny php script and exploit the python script. I have used tinymce so that I can now just copy and paste html tables directly to the edit box and do the conversion easily.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?&lt;br /&gt;if($_POST['submit']) {&lt;br /&gt; if(trim($_POST['html'])) {&lt;br /&gt;     $input = stripslashes(trim($_POST['html']));&lt;br /&gt;  &lt;br /&gt;     $filename = 'uploads/'.date('Ymdhis').'.txt';&lt;br /&gt;     $fp = fopen($filename, 'w');&lt;br /&gt;     fwrite($fp,$input);&lt;br /&gt;     fclose($fp);         &lt;br /&gt;     $ret = exec("python html2wiki.py $filename", $output, $retval);&lt;br /&gt;     $output = implode("\n",$output);&lt;br /&gt;     unlink($filename);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript" type="text/javascript" src="/lib/tinymce/jscripts/tiny_mce/tiny_mce.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript" type="text/javascript"&amp;gt;&lt;br /&gt;tinyMCE.init({&lt;br /&gt; theme:"simple",&lt;br /&gt; mode : "textareas"&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;form name='converter' method='post'&amp;gt;&lt;br /&gt;&amp;lt;input type='submit' value = 'Convert Html2Wiki &amp;gt;&amp;gt;' name='submit'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;textarea name='html' cols='50' rows='40'&amp;gt;&amp;lt;?=$input?&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;textarea name='wiki' cols='50' rows='40'&amp;gt;&amp;lt;?=$output?&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The output is something like shown below.&lt;br /&gt;&lt;a href="http://img187.imageshack.us/my.php?image=html2wikioutputao1.jpg" target="_blank"&gt;&lt;img src="http://img413.imageshack.us/img413/7601/html2wikioutputsi7.jpg" style='border:1px solid #000;' alt="Image Hosted by ImageShack.us" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-1303343748087729579?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G-DWFP5lFRCK6-jBI0HOHzH-ZSw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G-DWFP5lFRCK6-jBI0HOHzH-ZSw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/G-DWFP5lFRCK6-jBI0HOHzH-ZSw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G-DWFP5lFRCK6-jBI0HOHzH-ZSw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/BOedZim60bQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/1303343748087729579/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=1303343748087729579" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/1303343748087729579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/1303343748087729579?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/BOedZim60bQ/python-html-tables-to-mediawiki.html" title="Python: HTML tables to Mediawiki converter" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2007/01/python-html-tables-to-mediawiki.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEFRXwzfyp7ImA9WBBaEEk.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-4693065938067322619</id><published>2007-01-12T10:00:00.001-08:00</published><updated>2007-01-17T07:10:14.287-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-01-17T07:10:14.287-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="reuse" /><category scheme="http://www.blogger.com/atom/ns#" term="mediawiki" /><category scheme="http://www.blogger.com/atom/ns#" term="extension" /><title>Mediawiki: Reusing the same code for multiple Wikis</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Sometimes you may need to install separate wikis for in the same server. One inefficient solution (in terms of time and space) is to install everytime you need Wiki. Other solution is to reuse the wiki code for all. But you need to install database separately for each -for this, you first need to dump fresh database right after first installation so that it can be used for other potential Wikis that may need to be installed for other purpose in the same server.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;This has been tried for &lt;a href='http://www.mediawiki.org/'&gt;Mediawiki &lt;/a&gt;1.6.7 only. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;1. First install Mediawiki in any folder (say wikicode). &lt;br&gt;&lt;/br&gt;2. Dump/Export mysql database from phpMyAdmin.&lt;br&gt;&lt;/br&gt;3. Create a new folder in document root (say testwiki).&lt;br&gt;&lt;/br&gt;4. Copy index.php and LocalSettings.php from wiki installed directory (wikicode, in our case) to the newly created folder.&lt;br&gt;&lt;/br&gt;The folder structure should be like this.&lt;br&gt;&lt;/br&gt;&lt;pre&gt;public_html/&lt;br&gt;&lt;/br&gt;	wikicode/&lt;br&gt;&lt;/br&gt;		mediawiki folders/files&lt;br&gt;&lt;/br&gt;	testwiki/&lt;br&gt;&lt;/br&gt;		index.php&lt;br&gt;&lt;/br&gt;		LocalSettings.php&lt;br&gt;&lt;/br&gt;&lt;/pre&gt;&lt;br&gt;&lt;/br&gt;5. Make necessary changes in the LocalSettings.php, as shown below. The original and altered code excerpts are shown.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Original Localsettings.php right after installation.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div style='border: 1px solid rgb(0, 0, 0); padding: 4px; background: rgb(254, 254, 254) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;'&gt;&lt;pre&gt;[...]&lt;br&gt;&lt;/br&gt;if( defined( 'MW_INSTALL_PATH' ) ) {&lt;br&gt;&lt;/br&gt;	$IP = MW_INSTALL_PATH;&lt;br&gt;&lt;/br&gt;} else {&lt;br&gt;&lt;/br&gt;	$IP = dirname( __FILE__ );&lt;br&gt;&lt;/br&gt;}&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;$path = array( $IP, "$IP/includes", "$IP/languages" );&lt;br&gt;&lt;/br&gt;set_include_path( implode( PATH_SEPARATOR, $path ) );&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;[...]&lt;br&gt;&lt;/br&gt;$wgSitename         = "Demowiki";&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;$wgScriptPath	    = "/wikicode";&lt;br&gt;&lt;/br&gt;$wgScript           = "$wgScriptPath/index.php";&lt;br&gt;&lt;/br&gt;[...]&lt;br&gt;&lt;/br&gt;$wgStylePath        = "$wgScriptPath/skins";&lt;br&gt;&lt;/br&gt;$wgStyleDirectory   = "$IP/skins";&lt;br&gt;&lt;/br&gt;[...]&lt;br&gt;&lt;/br&gt;$wgUploadPath       = "$wgScriptPath/images";&lt;br&gt;&lt;/br&gt;$wgUploadDirectory  = "$IP/images";&lt;br&gt;&lt;/br&gt;[...]&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;Changed Localsettings.php in the new folder (testwiki, in our case)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div style='border: 1px solid rgb(0, 0, 0); padding: 4px; background: rgb(254, 254, 254) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;'&gt;&lt;pre&gt;[...]&lt;br&gt;&lt;/br&gt;if( defined( 'MW_INSTALL_PATH' ) ) {&lt;br&gt;&lt;/br&gt;	$IP = MW_INSTALL_PATH;&lt;br&gt;&lt;/br&gt;} else {&lt;br&gt;&lt;/br&gt;	$IP = dirname( __FILE__ );&lt;br&gt;&lt;/br&gt;}&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;$IP = $_SERVER['DOCUMENT_ROOT'].'/wikicode/';&lt;/span&gt;&lt;br&gt;&lt;/br&gt;$path = array( $IP, "$IP/includes", "$IP/languages" );&lt;br&gt;&lt;/br&gt;set_include_path( implode( PATH_SEPARATOR, $path ) );&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;[...]&lt;br&gt;&lt;/br&gt;$wgSitename         = "Demowiki";&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 204, 0);'&gt;//$wgScriptPath	    = "/wikicode";&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;$wgScriptPath	    = "/testwiki";&lt;/span&gt;&lt;br&gt;&lt;/br&gt;$wgScript           = "$wgScriptPath/index.php";&lt;br&gt;&lt;/br&gt;[...]&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 204, 0);'&gt;//$wgStylePath        = "$wgScriptPath/skins";&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;$wgStylePath        = "http://localhost/wikicode/skins";&lt;/span&gt;&lt;br&gt;&lt;/br&gt;$wgStyleDirectory   = "$IP/skins";&lt;br&gt;&lt;/br&gt;[...]&lt;br&gt;&lt;/br&gt;$wgUploadPath       = "$wgScriptPath/images";&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 204, 0);'&gt;//$wgUploadDirectory  = "$IP/images";&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;$wgUploadDirectory  = $_SERVER['DOCUMENT_ROOT'].'/demowiki/images';&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;6. Change database information accordingly.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;Blue color&lt;/span&gt; represents the added lines&lt;br&gt;&lt;/br&gt;&lt;span style='color: rgb(51, 204, 0);'&gt;Green color &lt;/span&gt;represents the commented lines in the modified LocalSettings.php&lt;br&gt;&lt;/br&gt;[...] represents some codes, those are removed for brevity.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Now you can copy the folder (testwiki) as many times as you like, install databases and make necessary changes in the LocalSettings.php. This should allow you to install Wiki with very little effort from your part.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style='text-decoration: underline;'&gt;Updates:&lt;/span&gt;&lt;br&gt;&lt;/br&gt;Sorry I didn't realize that there is also a small addition in index.php, if any of you have been trying to follow this. It's funny that as I was trying to follow this myself, i realize that it's not working yet. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Original index.php&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div style='border: 1px solid rgb(0, 0, 0); padding: 4px; background: rgb(254, 254, 254) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;'&gt;&lt;pre&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;&lt;/span&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;&lt;/span&gt;require_once( './includes/Defines.php' );&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/br&gt;Changed &lt;span style='font-style: italic;'&gt;index.php&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;div style='border: 1px solid rgb(0, 0, 0); padding: 4px; background: rgb(254, 254, 254) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;'&gt;&lt;pre&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;set_include_path(get_include_path().PATH_SEPARATOR.&lt;/span&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;$_SERVER['DOCUMENT_ROOT']&lt;/span&gt;&lt;span style='color: rgb(51, 51, 255);'&gt;.'/wikicode/');&lt;/span&gt;&lt;br&gt;&lt;/br&gt;require_once( 'includes/Defines.php' );&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-4693065938067322619?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c7gFNBaBL9UsGnGmVwnj5An8usc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c7gFNBaBL9UsGnGmVwnj5An8usc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c7gFNBaBL9UsGnGmVwnj5An8usc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c7gFNBaBL9UsGnGmVwnj5An8usc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/9wjD-PqhhoI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/4693065938067322619/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=4693065938067322619" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/4693065938067322619?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/4693065938067322619?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/9wjD-PqhhoI/mediawiki-reusing-same-code-for.html" title="Mediawiki: Reusing the same code for multiple Wikis" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2007/01/mediawiki-reusing-same-code-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MFSH0zeCp7ImA9WxRbGEs.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-2936025016380357084</id><published>2006-12-25T07:32:00.000-08:00</published><updated>2008-12-09T16:36:59.380-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T16:36:59.380-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="auto-complete" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>jquery: tweaking auto-complete plugin for multiple words in a single input</title><content type="html">If you have composed mails in &lt;a href="http://gmail.com/"&gt;gmail&lt;/a&gt;, then you would know that it allows to select multiple auto-complete email addresses separated by commas. That's what I want to implement in jquery auto-complete plugin. Currently it works like &lt;a href="http://www.google.com/webhp?hl=en&amp;complete=1"&gt;google suggest&lt;/a&gt;, allowing only one auto-complete word.&lt;br /&gt;&lt;br /&gt;If you haven't used &lt;a href="http://jquery.com/"&gt;JQuery &lt;/a&gt;before, I suggest you to go over the site and see some examples and try some.&lt;br /&gt;&lt;br /&gt;Well JQuery is the first javascript framework that I have ever used and got stuck with its beauty. Later I came to know about similar javascript frameworks like prototype, scriptulous. But now I am used to jquery. The another beauty is there are many third party plugins.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QN194vlI-6c/RY_tFgPGiaI/AAAAAAAAABI/KjthTYYdEjM/s1600-h/jquery.auto.complete.multiple.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_QN194vlI-6c/RY_tFgPGiaI/AAAAAAAAABI/KjthTYYdEjM/s320/jquery.auto.complete.multiple.jpg" alt="" id="BLOGGER_PHOTO_ID_5012485589095057826" border="0" /&gt;&lt;/a&gt;I extended the &lt;a href="http://www.dyve.net/jquery/?autocomplete"&gt;auto-complete plugin&lt;/a&gt; so that now it allows to choose the auto-complete mode - multiple or single. With multiple, it will work like gmail compose and with single it works like google suggest. Well single is what the original plugin provides. I will explain the changes done to achieve multiple mode.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$.fn.autocomplete = function(url, options) {&lt;br /&gt; ...&lt;br /&gt;       options.mode = options.mode || "single";&lt;br /&gt;       options.multipleSeparator =&lt;br /&gt;  options.multipleSeparator || ",";&lt;br /&gt; ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The default mode is single. If you pass 'multiple', now it should work like gmail compose. multipleSeparator separates the multiple words. The default is comma. Try to pass different parameters when you initialize the function.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    $(document).ready(function() {&lt;br /&gt;             $("#suggest").autocomplete('search.php', { minChars:1,&lt;br /&gt;   matchSubset:1, matchContains:1, cacheLength:10,&lt;br /&gt;   onItemSelect:selectItem, formatItem:formatItem,&lt;br /&gt;   selectOnly:1, mode:"multiple",&lt;br /&gt;   multipleSeparator:"|" });&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When the item gets selected, you need to find whether it's multiple or single. If it's single, you don't need to do anything. But for multiple, you have to search for the separator and append the selected new value to the old one in the selectItem(...) function.&lt;br /&gt;&lt;pre&gt;function selectItem(li) {&lt;br /&gt;...&lt;br /&gt;      if(options.mode == "multiple") {&lt;br /&gt; old_value = $input.val();&lt;br /&gt; if(old_value.lastIndexOf(options.multipleSeparator) &amp;gt;= 1) {&lt;br /&gt;  sep_pos = old_value.lastIndexOf(options.multipleSeparator);&lt;br /&gt;  value = old_value.substr(0,sep_pos+1);&lt;br /&gt;  new_value = value + v +options.multipleSeparator;&lt;br /&gt; } else {&lt;br /&gt;  new_value = v + options.multipleSeparator;&lt;br /&gt; }&lt;br /&gt;} else {&lt;br /&gt; new_value = v;&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The plugin use ajax to fetch the items from either file or database. For that it needs to construct url on its own. If you type 'a', then the url will be http://abc.com/search.php?q=a and it fetches data from that url. However when we are in multiple mode, the input will contain something like "ant,b", in this case, the constructed url will be http://abc.com/search.php?q=ant,b. Since only "b" needs to be passed , the text before comma should be excluded. So this needs some tweaks in the makeUrl(...) function.&lt;br /&gt;&lt;pre&gt;function makeUrl(q) {&lt;br /&gt;if(options.mode == "multiple") {&lt;br /&gt; if(q.lastIndexOf(options.multipleSeparator) &amp;gt;= 1) {&lt;br /&gt;  sep_pos = q.lastIndexOf(options.multipleSeparator);&lt;br /&gt;  q = q.substr(sep_pos+1);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The package, containing jquery and modified auto-plugin code, can be downloaded from &lt;a href="http://mycodes.schtuff.com/auto_complete_zip"&gt;here&lt;/a&gt;.&lt;br /&gt;Click &lt;a href="http://www.dyve.net/jquery/?autocomplete"&gt;here&lt;/a&gt; for the original auto-complete source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-2936025016380357084?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3cIJ64ZzXuPrK8TnD4pkifW_Nvg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3cIJ64ZzXuPrK8TnD4pkifW_Nvg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3cIJ64ZzXuPrK8TnD4pkifW_Nvg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3cIJ64ZzXuPrK8TnD4pkifW_Nvg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/0q5jl5frqTA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/2936025016380357084/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=2936025016380357084" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/2936025016380357084?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/2936025016380357084?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/0q5jl5frqTA/jquery-tweaking-auto-complete-plugin.html" title="jquery: tweaking auto-complete plugin for multiple words in a single input" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_QN194vlI-6c/RY_tFgPGiaI/AAAAAAAAABI/KjthTYYdEjM/s72-c/jquery.auto.complete.multiple.jpg" height="72" width="72" /><thr:total>10</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2006/12/jquery-tweaking-auto-complete-plugin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cCQ3o_eip7ImA9WBBXEEk.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-2515135779065111081</id><published>2006-11-07T01:04:00.000-08:00</published><updated>2006-11-20T08:44:22.442-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2006-11-20T08:44:22.442-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Zerone: Loading Bitmap (BMP) Files in C</title><content type="html">I still remember the days of my effort in displaying Bitmap files using &lt;a href="http://en.wikipedia.org/wiki/C_programming_language"&gt;C&lt;/a&gt;. My first technical article '&lt;a href="http://everest.ioe.edu.np/zerone/articles/2002/showarticle.php?id=bmpc.htm"&gt;Loading Bitmap (BMP) Files in C&lt;/a&gt;' was even published in department journal '&lt;a href="http://everest.ioe.edu.np/zerone/issues.php"&gt;Zerone&lt;/a&gt;'.&lt;br /&gt;&lt;br /&gt;The complete code can be viewed at &lt;a href="http://mycodes.schtuff.com/source_loading_bitmap_files_in_c"&gt;http://mycodes.schtuff.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-2515135779065111081?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PrdLhxv4g7t0gBCUt39vykgsG3A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PrdLhxv4g7t0gBCUt39vykgsG3A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PrdLhxv4g7t0gBCUt39vykgsG3A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PrdLhxv4g7t0gBCUt39vykgsG3A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/Q7cJvHfZEl8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/2515135779065111081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=2515135779065111081" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/2515135779065111081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/2515135779065111081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/Q7cJvHfZEl8/zerone-loading-bitmap-bmp-files-in-c.html" title="Zerone: Loading Bitmap (BMP) Files in C" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2006/11/zerone-loading-bitmap-bmp-files-in-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ERX06fip7ImA9WBBRGEU.&quot;"><id>tag:blogger.com,1999:blog-650533671467988587.post-584291248531318417</id><published>2006-11-06T21:50:00.000-08:00</published><updated>2006-11-06T22:26:44.316-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2006-11-06T22:26:44.316-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mediawiki" /><category scheme="http://www.blogger.com/atom/ns#" term="extension" /><title>Mediawiki hacks: Page by Page Access Restriction Extension</title><content type="html">I created a &lt;a href="http://www.mediawiki.org/"&gt;mediawiki&lt;/a&gt; &lt;a href="http://meta.wikimedia.org/wiki/Page_by_page_access"&gt;extension that restricts page access&lt;/a&gt; (view/edit) based upon users, group. I posted the extension in &lt;a href="http://meta.wikimedia.org/wiki/Page_by_page_access"&gt;meta.wikimedia.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There's one convincing extension &lt;a href="http://meta.wikimedia.org/wiki/PageProtection"&gt;PageProtection&lt;/a&gt;, but it requires &lt;a href="http://pear.php.net/"&gt;PEAR&lt;/a&gt;. I was looking for a simple extension.&lt;br /&gt;&lt;br /&gt;I altered and added features to &lt;a href="http://www.epistemographer.com/?p=238"&gt;http://www.epistemographer.com/?p=238&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also cache was also giving problem. The code at &lt;a href="http://thinkhole.org/wp/2006/09/13/disabling-caching-in-mediawiki/"&gt;thinkhole.org&lt;/a&gt; helped in disabling cache.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/650533671467988587-584291248531318417?l=just-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mBca2C_1013MRYDNvy6t0py7HrQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mBca2C_1013MRYDNvy6t0py7HrQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mBca2C_1013MRYDNvy6t0py7HrQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mBca2C_1013MRYDNvy6t0py7HrQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JustTechnicalStuffs/~4/-hH68xGeuBw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://just-tech.blogspot.com/feeds/584291248531318417/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=650533671467988587&amp;postID=584291248531318417" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/584291248531318417?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/650533671467988587/posts/default/584291248531318417?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JustTechnicalStuffs/~3/-hH68xGeuBw/mediawiki-hacks-page-by-page-access.html" title="Mediawiki hacks: Page by Page Access Restriction Extension" /><author><name>anjesh</name><uri>http://www.blogger.com/profile/13413297749571541886</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://1.bp.blogspot.com/_QN194vlI-6c/Sy-BNe1-1hI/AAAAAAAABLg/AdFcdzI-_nA/S220/Picture+317.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://just-tech.blogspot.com/2006/11/mediawiki-hacks-page-by-page-access.html</feedburner:origLink></entry></feed>

