<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6673249452090473869</id><updated>2012-01-26T15:02:02.835-08:00</updated><category term='linux'/><category term='firefox'/><category term='flash'/><title type='text'>Chuletario de pócimas y recetas</title><subtitle type='html'>Warning: This is not a blog. This is a wikipedia view (http://en.wikipedia.org/wiki/View_%28database%29).</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-1994797483019942275</id><published>2012-01-07T07:11:00.000-08:00</published><updated>2012-01-07T07:11:13.477-08:00</updated><title type='text'>The circle of observability</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Source: http://www.youtube.com/watch?v=l7aQWoTRqKw &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; +-----&amp;gt;&amp;nbsp; PROFILING -----+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; -top&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; -oprofile&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; -perf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; |&lt;br /&gt;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |SystemTap|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; |&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; v&lt;br /&gt;&amp;nbsp;DEBUGGING &amp;lt;------------- TRACING&lt;br /&gt;&amp;nbsp; -gdb&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -strace&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -ltrace&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -ftrace&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-1994797483019942275?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/1994797483019942275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=1994797483019942275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1994797483019942275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1994797483019942275'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2012/01/circle-of-observability.html' title='The circle of observability'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-5790198150603954589</id><published>2011-11-23T14:31:00.000-08:00</published><updated>2011-11-23T14:31:56.004-08:00</updated><title type='text'>I though RAM didn't waste energy ....</title><content type='html'>... I was so wrong!!!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-maQNF3NPW64/Ts10DzYRLrI/AAAAAAAAAGE/WAdJBq91rNQ/s1600/ddr3_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://2.bp.blogspot.com/-maQNF3NPW64/Ts10DzYRLrI/AAAAAAAAAGE/WAdJBq91rNQ/s320/ddr3_2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5xagw0oRvcs/Ts10HClHJVI/AAAAAAAAAGM/QUSHwdC9foM/s1600/ddr3_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-5xagw0oRvcs/Ts10HClHJVI/AAAAAAAAAGM/QUSHwdC9foM/s320/ddr3_1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-5790198150603954589?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/5790198150603954589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=5790198150603954589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/5790198150603954589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/5790198150603954589'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/11/i-though-ram-didnt-waste-energy.html' title='I though RAM didn&apos;t waste energy ....'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-maQNF3NPW64/Ts10DzYRLrI/AAAAAAAAAGE/WAdJBq91rNQ/s72-c/ddr3_2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-2965660509464493637</id><published>2011-08-24T06:46:00.000-07:00</published><updated>2011-08-24T06:54:00.314-07:00</updated><title type='text'>How to improve disk I/O</title><content type='html'>Someone called "Unnikrishnan P." from India posted the next question in the Linked-In Linux Group:&lt;br /&gt;&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;how to improve disk I/O&lt;br /&gt;&lt;br /&gt;I have a server with 128GB RAM and I cannot find the swap memory (120G) being used even when the disk utilization is at %util =95% (using iostat -d -x 5 3). What might be the root cause? What can be done to make the server perform much better?&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As is ussually the case, the thread of answers started to grew in time. Some of them were really interesting so I decided to post here a summarized view of them extracting the most interesting answers and avoiding repeated comments:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Phil Quiney: &lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;The bottleneck is going to be disk I/O performance: Offloading disk operations onto dedicated hardware (RAID controllers - proper ones, not the ones fitted to motherboards) will speed things up. Sun were doing this years ago with SCSI drives as they had enough intelligence to do disk to disk transfers without going via the host, IDE was/is too dumb to do that.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Jim Parks:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;With a minimum of four spindles, you could do a RAID 10 setup. RAID 10 is a non-standard RAID level, but it provides both redundancy and higher performance, as it uses multiple striped volumes in a mirrored configuration.&lt;br /&gt;&lt;br /&gt;From around 12 spindles on up, you're probably better off with a RAID 6 (striping with double-distributed parity) setup. There will almost certainly be people who want to argue with me about this. They have their ideas, I have mine, and I'm not going to engage in a drawn out discussion about it, but the short version is that the more spindles you have, the more RAID 6 will make sense. RAID 6 will allow you to get more usable space than RAID 10. For example, a RAID 10 array comprised of 16 1TB drives will provide 8 TB of usable space. The same 16 1 TB drives in a RAID 6 configuration would provide 14 TB of usable space -- that's 75% more useful diskspace, with the ability to survive the loss of two drives without data loss.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Micheas Herman:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;If /tmp is mounted to tmpfs then the large swap space may be reasonable, but otherwise you might try turning the swapoff temporarily to see if that doesn't reduce the diskio.&lt;br /&gt;If you do have millions of session cookies in /tmp and you are using tmpfs moving the swap to a solid state drive might help a lot.&lt;br /&gt;&lt;br /&gt;If you are trying to get the swap space to be used more aggressively you can check what the swappiness of your system is&lt;br /&gt;&lt;br /&gt;by running: cat /proc/sys/vm/swappiness&lt;br /&gt;&lt;br /&gt;Which will return a number from 0 to 100&lt;br /&gt;&lt;br /&gt;If the number is less than 100 and you want to increase the swap usage as much as possible you can run the following:&lt;br /&gt;&lt;br /&gt;echo 100 &gt; /proc/sys/vm/swappiness&lt;br /&gt;&lt;br /&gt;To make the change persistent across reboots run:&lt;br /&gt;&lt;br /&gt;echo "vm/swappiness=100" &gt;&gt; /etc/sysctl.conf&lt;br /&gt;&lt;br /&gt;If you want to reduce the swap usage to the absolute minimum do the same using 0 instead of 100.&lt;br /&gt;&lt;br /&gt;If you are having a database with a lot of commits disk tuning may not be the best way to improve performance.&lt;br /&gt;&lt;br /&gt;Removing unnecessary indexes can greatly reduce the amount of disk access. using transactions to increase the quantity of data written at one time can also improve performance. It can also make it much worse.&lt;br /&gt;&lt;br /&gt;If the server is a mail server there tends to be a lot that can be done but there tends to be very little general advice other than to make sure that the disk cache is not being flushed after every mail received.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;David Pye&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;I don't see any information regarding hardware configuration here, have I missed something???&lt;br /&gt;&lt;br /&gt;Is the issue really disk utilization - have you investigated the system as a whole?&lt;br /&gt;&lt;br /&gt;If disk I/O is suspect, then there are a number of things which could be addressed, correct RAID config is one, no. of I/O channels is another - how many, fibre / copper, etc, can you get FC direct to the disk?, fastest possible disk hardware?, more extreme areas could be to use only a small % of outermost disk surface via partitioning in order to achieve less head latency, examine the nature of the disk activity, &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;James Sutherland:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;Also check the filesystem in use - given where this question is posted, probably something like ext3? If so, check the journalling mode: data=ordered, data=journaled and data=writeback all perform different in different situations.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;John Lauro: &lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;With 128GB of RAM you are probably better off seeing if you can move some of that I/O to a tmpfs RAM disk, often mounted under /dev/shm for RH/Centos/SL. &lt;br /&gt;...&lt;br /&gt;If you don't need to record when a file is accessed (many people don't even know you can get that info), you can mount the filesystem with noatime. That can make a big difference on the I/O utilization especially for a web server that has lots of small files all over the place.&lt;br /&gt;&lt;br /&gt;If some of your I/O is being generated by mysql or other database, perhaps there is some temporary tables such as for session tracking that you might want to consider converting to memory tables. The rows will be emptied if you have to restart the database, but generally that just means the user has to relogin.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Enrique Arizon Benito (aka, that's me!):&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;&lt;br /&gt;http://en.wikipedia.org/wiki/Hdparm&lt;br /&gt;man hdparm&lt;br /&gt;&lt;br /&gt;Also, maybe some app has "too much" log output enabled and it is just a matter of modifying the /etc/... config file. Inotify can be your friend in this case:&lt;br /&gt;&lt;br /&gt;* http://linux.die.net/man/7/inotify&lt;br /&gt;&lt;br /&gt;Or you can simple use something like:&lt;br /&gt;&lt;br /&gt;find /var -mmin -1 -size +0.5G&lt;br /&gt;(find files 'inside' /var changed/modified in the last minute that are bigger than 0.5Gbytes)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Bond Masuda:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;first of all, you need to figure out what's consuming the I/O? get a tool like iotop to help:&lt;br /&gt;&lt;br /&gt;http://guichaz.free.fr/iotop/&lt;br /&gt;...&lt;br /&gt;I usually use ballpark figures like assuming most modern spinning hard drives can do about 100MB/sec sequential I/O and about 40-60MB/sec random I/O for SATA type drives and add about 10-20% higher numbers for SAS type drives. SSDs of course can have much higher numbers. using those as "guidelines", try to figure out what disk configuration will meet your requirements and add about 20% for overhead. for example, if i have a 8 disk RAID-5 array, which gives me 7 effective spindles, I would assume this can roughly meet a sequential I/O requirement of about 583MB/sec (7x100MB/sec / 1.2 = 583).&lt;br /&gt;&lt;br /&gt;with multi-disk arrays, you'll want to consider the "best on average" stripe size for your array... if your I/O pattern is reading sequentially large files, then a larger stripe size is in your favor. if you're doing random I/O and reading small chunks here and there, then a moderate to smaller stripe size a better choice.&lt;br /&gt;&lt;br /&gt;also, in situations where you are looking are really large arrays that might span multiple controllers, you'll need to consider the bottlenecks of the bus. older PCI-X buses are half-duplex and limited to about 1GB/sec. more modern servers (like yours with 128GB of RAM) will likely use PCI-E 4x or 8x buses which can do full-duplex and 2GB/sec (8x).&lt;br /&gt;&lt;br /&gt;Rob Strong: not attempting to read all these comments, but take a look at the output of iostat "%iowait" field. If this number starts getting up, say past... 20% or more then you possibly have an issue with slow disk and/or bad raid setup.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Oleksiy Dovzhanytsya:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;...&lt;br /&gt;http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Unnikrishnan P. (original author of the question) added some (important) details to its setup:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;This is an NFS server which is used by other servers which runs tools used by the developers. I had moved some users to a dedicated server now and found that performance on this server has increased. Previously there were 4 servers accessing this NFS share. Alot of read/ write happening. I was using RAID 5 (LSI controller) on this server. May be the throughput of RAID 5 is the problem, as that wont support heavy rw operations.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;James Sutherland: &lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;That information helps - yes, RAID5 can be a bottleneck with heavy write activity, particularly scattered writes, since it has to read the corresponding blocks from the other disks to recalculate parity every time.&lt;br /&gt;&lt;br /&gt; What filesystem is it running, ext3? You may find changing the data journalling, or switching to a separate journal device, will help here: mount with data=writeback (risky, if you don't have a very good UPS!) or data=journal. Also see if your LSI card is doing write back caching or not, that can help significantly.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;John Lauro:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;What IO scheduler are you running on your disks? If you have at least 128mb on your controller make sure you don't use the often default of cfq as the IO schedulerer as it is the worst with a raid controller...&lt;br /&gt;&lt;br /&gt;for a in /sys/block/*/queue/scheduler ; do echo $a : `&lt;$a` ; done&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Unnikrishnan P, adding some more info:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;I have a server with 128GB RAM and I cannot find the swap memory (120G) being used even when the disk utilization is at %util =95% (using iostat -d -x 5 3). What might be the root cause? What can be done to make the server perform much better?&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Jeremy Page:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;I'm reasonably certain relatime is now the default for most mount commands.&lt;br /&gt;&lt;br /&gt;Cat /proc/mounts and see what options your clients are. I'm using squeeze so probably not a good test but (edited out my personal stuff)&lt;br /&gt;home.site.company.com:/home/pagej /home/pagej nfs rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.28.17.214,mountvers=3,mountport=4046,mountproto=udp,local_lock=none,addr=10.48.33.214 0 0&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;John Lauro: &lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;reltime is standard on EL6 and nearly as good as noatime for reducing I/O, but it is not the default for EL5 which still common enough that I wouldn't assume someone isn't running it&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Wayne Monfries:&lt;br /&gt;&lt;p style="background-color:#EEEEEE; font-family:courier;"&gt;As mentioned above by Bond Masuda, you may obtain some easy gains by increasing the read ahead buffer size (probably most helpful for sequential loads)&lt;br /&gt;blockdev --setra 2048 /dev/sda # increase readahead buffer size&lt;br /&gt;Another area that is often overlooked with external raid arrays is that they are capable of processing much greater numbers of IO transactions than a single disk - so check out the qdepth on your adapters and devices.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-2965660509464493637?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/2965660509464493637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=2965660509464493637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/2965660509464493637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/2965660509464493637'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/08/how-to-improve-disk-io.html' title='How to improve disk I/O'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-9019004707353878844</id><published>2011-08-22T04:53:00.000-07:00</published><updated>2011-08-24T07:31:03.859-07:00</updated><title type='text'>Somo tips to make XML and HTML+JS files easier to read and mantain</title><content type='html'>Here comes a couple of tips/conventions to easify xml edition. Anyone who has used Ant overengineered parametrization config files and then changed to the beautiful Maven default-by-convention config files will be aware by now how useful conventions are. For the rest of you, believe me, conventions are the best friend of anyone writting XML files.&lt;br /&gt;&lt;br /&gt;Convention 1: Use upper case for ids global/shared constants. Those constants that are normally defined first in file and used then "everywhere". That's and standard convention in most programming languages.&lt;br /&gt;&lt;br /&gt;Convention 2: (This is the important one). XML tags further referenced by other XML tags are usually identified by an id="arbitrary_name" attribute. This arbitrary name is later used to refer to the tag element. This second convention tell us to use the next rule for the arbitrary name:&lt;br /&gt;Prefix it with "type_" where "type_" ussually equals to the tag name that "owns" the id attribute or a real type if the tag name is not descriptive enough / too generic.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Behind is shown two (Ant) XML files before and after applying conventions:&lt;br /&gt;&lt;pre&gt;BEFORE APPLYING CONVENTIONS        ||   AFTER APPLYING CONVENTIONS                                &lt;br /&gt;                                     ||                                                             &lt;br /&gt;&amp;lt;project name=....&gt;                  || &amp;lt;project name=....&gt;&lt;br /&gt;...                                  || ...&lt;br /&gt;&amp;lt;property name="src.java.dir"        || &amp;lt;property name="DIR_JAVA_SRC"&lt;br /&gt;   value="src" /&gt;                    ||    value="src" /&gt;&lt;br /&gt;&amp;lt;property name="lib.dir"             || &amp;lt;property name="DIR_LIB"&lt;br /&gt;   value="../../../lib" /&gt;           ||    value="../../../lib" /&gt;&lt;br /&gt;&amp;lt;property name="build.dir"           || &amp;lt;property name="DIR_BUILD"&lt;br /&gt;   value="bin" /&gt;                    ||    value="bin" /&gt;&lt;br /&gt;                                     || &lt;br /&gt;&amp;lt;path id="project.classpath"&gt;        || &amp;lt;path id="PATH_PROJECT"&gt;&lt;br /&gt;  &amp;lt;fileset dir="${lib.dir}"&gt;         ||   &amp;lt;fileset dir="${DIR_LIB}"&gt;&lt;br /&gt;    &amp;lt;include name="**/*.jar" /&gt;      ||       &amp;lt;include name="**/*.jar" /&gt;&lt;br /&gt;  &amp;lt;/fileset&gt;                         ||   &amp;lt;/fileset&gt;&lt;br /&gt;&amp;lt;/path&gt;                              || &amp;lt;/path&gt;&lt;br /&gt;                                     || &lt;br /&gt;&amp;lt;patternset id="conf"&gt;               || &amp;lt;patternset id="PATTERNSET_CONF"&gt;&lt;br /&gt;  &amp;lt;include name="**/*.xml" /&gt;        ||   &amp;lt;include name="**/*.xml" /&gt;&lt;br /&gt;  &amp;lt;include name="**/*.properties" /&gt; ||   &amp;lt;include name="**/*.properties" /&gt;&lt;br /&gt;  &amp;lt;include name="**/*.conf" /&gt;       || &amp;lt;/patternset&gt;&lt;br /&gt;&amp;lt;/patternset&gt;                        ||&lt;br /&gt;                                     || &amp;lt;patternset id="PATTERNSET_IMAGES"&gt;&lt;br /&gt;&amp;lt;patternset id="images"&gt;             ||   &amp;lt;include name="**/*.png" /&gt;&lt;br /&gt;  &amp;lt;include name="**/*.png" /&gt;        ||   &amp;lt;include name="**/*.jpg" /&gt;&lt;br /&gt;  &amp;lt;include name="**/*.jpg" /&gt;        ||   &amp;lt;include name="**/*.gif" /&gt;&lt;br /&gt;  &amp;lt;include name="**/*.gif" /&gt;        ||   &amp;lt;include name="**/*.gif" /&gt;&lt;br /&gt;&amp;lt;/patternset&gt;                        || &amp;lt;/patternset&gt;&lt;br /&gt;...                                  || &lt;br /&gt;&amp;lt;target name="copyconf"&gt;             || &amp;lt;target name="copyconf"&gt;&lt;br /&gt;  &amp;lt;mkdir dir="${build.dir}" /&gt;       ||   &amp;lt;mkdir dir="${DIR_BUILD}" /&gt;&lt;br /&gt;  &amp;lt;copy todir="${build.dir}"&gt;        ||   &amp;lt;copy todir="${DIR_BUILD}"&gt;&lt;br /&gt;    &amp;lt;fileset dir="${src.java.dir}"&gt;  ||     &amp;lt;fileset dir="${DIR_JAVA_SRC}"&gt;&lt;br /&gt;      &amp;lt;patternset refid="conf" /&gt;    ||       &amp;lt;patternset refid="PATTERNSET_CONF" /&gt;&lt;br /&gt;    &amp;lt;/fileset&gt;                       ||     &amp;lt;/fileset&gt;&lt;br /&gt;  &amp;lt;/copy&gt;                            ||   &amp;lt;/copy&gt;&lt;br /&gt;&amp;lt;/target&gt;                            || &amp;lt;/target&gt;&lt;br /&gt;                                     || &lt;br /&gt;&amp;lt;/project&gt;                           || &amp;lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The first great advantage of using the second convention is that now we can use word/code completion in our favourite text editor. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notice the next points in the previous example:&lt;br /&gt;&lt;br /&gt;- Once conventions are applied, if we want to edit a dir value we just write:&lt;br /&gt;&lt;pre&gt;&amp;lt;tagName dir="{$DIR_&lt;br /&gt;&lt;/pre&gt;and using word_completion in our editor (for example Ctrl+X n in vim) will show a list with the avaible dirs constants defined.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3iHQX7-HVZo/TlI0-lu6ocI/AAAAAAAAAEc/-6yzFTMKRs4/s1600/autocompletion1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="71" src="http://1.bp.blogspot.com/-3iHQX7-HVZo/TlI0-lu6ocI/AAAAAAAAAEc/-6yzFTMKRs4/s400/autocompletion1.png" width="255" /&gt;&lt;/a&gt;&lt;/div&gt;Notice that &amp;lt;property name="arbitrary_name" ...&gt; is a little bit assimetric (Property is actually used as a meta-tag to define constants string values for later replacement in our XML text file). It doesn't follow the convention:&lt;br /&gt;&lt;pre&gt;&amp;lt;tagName id="arbitrary_name" ...&gt;&lt;br /&gt;&lt;/pre&gt;using "name", not "id" for the tag attribute. Also we can't use the tag name, "property" as the prefix since it itself doesn't provide the type of the object (it's always an string type value). We will use something like "DIR_" as in the previous example to indicate that the property value is a directory. Other useful and descriptive prefixes could be "PATH_", "CLASSPATH_", "URL_", ... where the "PREFIX_" is a descriptive string describing the actual type of its value.&lt;br /&gt;&lt;br /&gt;- For the "patternset", that follows the standard '&amp;lt;tagName id="arbitry_name" ' we will write:&lt;br /&gt;&lt;pre&gt;&amp;lt;patternset idref="PATTERNSET_ (Ctrl+X n for autocompletion)&lt;br /&gt;&lt;/pre&gt;And word/code completion will offer now a list of available candidates:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Bx97WOYDcfc/TlI1Dx9EwAI/AAAAAAAAAEk/e1pbb9-5B4w/s1600/autocompletion2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="55" src="http://4.bp.blogspot.com/-Bx97WOYDcfc/TlI1Dx9EwAI/AAAAAAAAAEk/e1pbb9-5B4w/s400/autocompletion2.png" width="315" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;- We could now continue to use code completion with any defined PATH_... element or any other type.&lt;br /&gt;&lt;br /&gt;- The convetion used is also exceptionally useful when mixing  HTML (sort of pseudo-XML) and Javascript. For example instead of identifying a table like:&lt;br /&gt;&lt;pre&gt;&amp;lt;table id="results" .... &gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;table id="buttons" .... &gt;&lt;br /&gt;&lt;/pre&gt;we can use:&lt;br /&gt;&lt;pre&gt;&amp;lt;table id="table_results" .... /&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;table id="table_buttons" .... /&gt;&lt;br /&gt;&lt;/pre&gt;again code completion will be at our disposal when handling the html element (table, div, form,...) through Javascript. Now the editor can help us writting our "risky and error prone" javascript code as the next screenshot probes:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZAYIP-YAbHM/TlJCnZ69XTI/AAAAAAAAAEs/-W_5N8DMTew/s1600/autocompletion3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="171" width="236" src="http://3.bp.blogspot.com/-ZAYIP-YAbHM/TlJCnZ69XTI/AAAAAAAAAEs/-W_5N8DMTew/s400/autocompletion3.png" /&gt;&lt;/a&gt;&lt;/div&gt;Basically the "TYPE_" prefix convention is adding manual type safety to our non-type-safe XML/HTML+JS files. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Magically" now we are half-way between the non-type-safe languages and the compile-check type-safe ones&lt;/b&gt;. We don't yet have a compile-check to advice us of code mistakes, but at least the editor helps us now with code completion (that actually is certainly an indirect check safety measure).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-9019004707353878844?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/9019004707353878844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=9019004707353878844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/9019004707353878844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/9019004707353878844'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/08/somo-tips-to-make-xml-and-htmljs-files.html' title='Somo tips to make XML and HTML+JS files easier to read and mantain'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-3iHQX7-HVZo/TlI0-lu6ocI/AAAAAAAAAEc/-6yzFTMKRs4/s72-c/autocompletion1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-8306511276873760643</id><published>2011-08-06T05:09:00.000-07:00</published><updated>2012-01-26T15:02:02.845-08:00</updated><title type='text'>This is not a joke, this is Java EE.</title><content type='html'>Extracted from the Book "Real World Java EE Patterns":&lt;br /&gt;&lt;blockquote style="color: #674ea7;"&gt;&lt;pre&gt;&lt;i&gt;@Stateful&lt;br /&gt;@Local(BookFacade.class)&lt;br /&gt;@TransactionAttribute(TransactionAttributeType.NEVER)&lt;br /&gt;public class BookFacadeBean implements BookFacade {&lt;br /&gt;    @PersistenceContext(type=PersistenceContextType.EXTENDED) &lt;br /&gt;    private EntityManager em;&lt;br /&gt;    private Book currentBook;&lt;br /&gt;    public Book find(long id) { &lt;/i&gt;&lt;i&gt;&lt;br /&gt;        this.currentBook = this.em.find(Book.class, id); &lt;br /&gt;        return this.currentBook;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void create(Book book){&lt;br /&gt;        this.em.persist(book);&lt;br /&gt;        this.currentBook = book;&lt;br /&gt;    }&lt;br /&gt;    public Book getCurrentBook() { return currentBook; }&lt;br /&gt;&lt;br /&gt;    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) &lt;br /&gt;    public void save() {&lt;br /&gt;        // nothing to do here&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/i&gt;&lt;/pre&gt;&lt;i&gt;&lt;br /&gt;&lt;br /&gt;The transaction setting of the BookFacade may appear a little esoteric at the first glance.&lt;br /&gt;On the class level the TransactionAttributeType.NEVER is used. Therefore it is guaranteed, that no method of the bean will be invoked in an active transaction. The method save, however, overwrites this rule with the setting TransactionAttribute.REQUIRES_NEW at the method level, which in turn starts a new transaction every time. The method create in turn was not annotated with TransactionAttributeType.REQUIRES_NEW even though the EntityManager#persist methos is invoqued inside. This invocation will not fail with the TransactionRequiredException. It will not fail because on an EntityManager with an EXTENDED Persistence context, the perssit,remove,merge, and refresh methdos may be called regardless of whether a transaction is active or not. The effects of these operations will be committed to the database when the exteneded persistence context is enlisted in a transaction and the transaction commits. It actually happens in the empty method save.&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;So in order to avoid a few extra lines of intuitive standard java code in charge of transaction demarcation the author has developed a counter-intuitive code that just work when calling empty function (and just if invoqued in the correct order). What's is worse, the author looks really excited with this way of working.&lt;br /&gt;&lt;br /&gt;I'm completly sure no one except those in charge of developing Java EE containers will think calling and empty function with metadata is the proper way to work.&lt;br /&gt;&lt;br /&gt;Fortunatelly for the rest of us, we have Spring.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-8306511276873760643?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/8306511276873760643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=8306511276873760643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/8306511276873760643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/8306511276873760643'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/08/this-is-not-joke-this-is-java-ee.html' title='This is not a joke, this is Java EE.'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-279440365280392283</id><published>2011-05-29T02:39:00.000-07:00</published><updated>2011-08-29T03:58:10.698-07:00</updated><title type='text'>Xvfb+x11vnc outperforms Xvnc</title><content type='html'>(&lt;b&gt;update 2011/08/29: NX offers a much better aproach to remote X control&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;If anyone of you has ever tried to run a remote X desktop using Xvnc you will probably have got quite dissapointed. The performance is poor and the response to user accions is annoying. Do not despair. There is an much better alternative. Just combine Xvfb (the "virtual in memory" X server) plus x11vnc (the vnc that attach to an existing X server). Extracted &lt;a href="http://en.wikipedia.org/wiki/Xvfb"&gt;from the wikipedia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;export DISPLAY=:1&lt;br /&gt;Xvfb :1 -screen 0 1024x768x16 &amp;&lt;br /&gt;fluxbox &amp;&lt;br /&gt;x11vnc -display :1 -bg -nopw -listen localhost -xkb&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(Another probe in favor of the "&lt;b&gt;Do one thing and do it right!&lt;/b&gt;" Unix philosophy)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-279440365280392283?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/279440365280392283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=279440365280392283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/279440365280392283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/279440365280392283'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/05/xvfbx11vnc-outperforms-xvnc.html' title='Xvfb+x11vnc outperforms Xvnc'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-5733535353535314205</id><published>2011-05-15T10:32:00.000-07:00</published><updated>2011-08-22T05:12:54.045-07:00</updated><title type='text'>KILL THE NULL, KILL'EN ALL</title><content type='html'>Some will argue that null values are useful and even needed when writing software. Nulls allows to declare a variable without a defined value and that's something many people will think is needed when we don't known in advance the real value of an entity.&lt;br /&gt;&lt;br /&gt;Imagine for example a database whose squema is upgraded adding a new column "second name" to a table. Since we don't know in advance what value "second name" has to be for each row, and since many new rows possible will have not "second name" it's quite easy to let it default to NULL.&lt;br /&gt;&lt;br /&gt;In fact, I will try to show that using NULL values is always a bad idea. The first trouble many people will have trying to get rid of nulls is solving the problem in the previous paragraph. If I don't know the value of a variable of if a variable has not value at all (maybe because performance reasons force to denormalize a database), there is no other way that assigning NULL.&lt;br /&gt;&lt;br /&gt;Right? wrong. It's always possible to assign a default value to tag a field as NULL. In the previous example we could simple assign the string "NULL" to indicate a non existent second name. It looks an arbitrary decisition that doesn't improve our code at all. In fact it does make our application safer. Let's see why.&lt;br /&gt;Imagine a typicall web app in which a form sends the "second name" to our server in a get/post request. Something like second_name=Armstrong.&lt;br /&gt;Then our php server code will look something like:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$second_name = $_REQUEST["second_name"];&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Look  now what happens if accidentally we misspell second_name in the html form or the php code:&lt;br /&gt;$second_name will be assigned a NULL value. Not the "NULL" string we want in case "second_name" is not used.&lt;br /&gt;&lt;br /&gt;The previous example is just one of the many possible ways in which a variable can be silently set a wrong NULL value.  As you can see NULL values are quite risky, since languages tend to leave variables in a "null" state when something goes wrong. For example Java, probably the most widely used programming language around has a big design mistake:&lt;br /&gt;try-catch exception demarcation bounds are used also as visibility demarcation bounds. That means that we can not write a code like:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;try{&lt;br /&gt;MyClass myObject = new MyClass();&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch(Exception e){&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;myPreparedStatement.set(0,myObject);&lt;br /&gt;myPreparedStatement.execute();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The java language syntax force to do something similar to:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;MyClass myObject = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;try{&lt;br /&gt;myObject = new MyClass();&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch(Exception e){&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;...&lt;br /&gt;myPreparedStatement.set(0,myObject);&lt;br /&gt;myPreparedStatement.execute();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Great! If an exception is thrown at object initialization and we are not cautious enough, we will insert a false null into the database.&lt;br /&gt;&lt;br /&gt;(Note: In the previous example it's possible to move the two last lines inside the try-catch and that will avoid propagating a null to the database. In a larger code it could be impossible and even if it could, it's up to the user writing the code to do so and we are searching a way of writting code that doesn't depends on programmer's skills and experience).&lt;br /&gt;&lt;br /&gt;With C#, the situation is even worse, since C# designers were drunk enough to not only copy the same Java pitfalls, but &lt;a href='http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx'&gt;to encourage the use of nulls "everywhere"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In fact, &lt;a href='http://qconlondon.com/london-2009/presentation/Null+References:+The+Billion+Dollar+Mistake'&gt;NULL values are the biggest mistake ever made in software history&lt;/a&gt;, and as the time pass, the dammage augment.&lt;br /&gt;&lt;br /&gt;The problem with NULL is that NULL actually is/means/maps to *nothing*. Null is not "unknown", Null is not "not applicable", not even "not available", not even "right" o "wrong". &lt;b&gt;Null bears no information at all&lt;/b&gt;. If we were physicists NULL will just compare to a singularity in our ecuations, a clear symptom that something is really, really wrong.&lt;br /&gt;&lt;br /&gt;In the example of the database we can assign the string "NULL" to indicate an unknown value. In fact we can assign the string "Not known" to indicate we don't known it's value, even if it exist, and we can also assign the string "Not applicable" when the row, due to break of normalization doesn't use that value. Our code will now be able to compare the string and apply a bussiness logic or another since now it carries information and state.&lt;br /&gt;&lt;br /&gt;Convention let us replace "null" values with a given value or even better, with a given set of values ("not known","not aplicable","" (empty),...) . That's probably what we really want. That means a little bit of extra coding since we will need to create default rows/objects for each entity in our UML diagram, but the extra work is always worth the effort when our code grows beyond the thousand lines of code. Magically null pointers will vanish. Errors will be detected much early and correct exceptions thrown properly.&lt;br /&gt;&lt;br /&gt;And last but no least, here comes a trick to &lt;span style="font-weight:bold; font-size:1.2em;"&gt;avoid NULLable values in a database in a safe way&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;Imagine you have a set or "core" tables in your squema, for example "client" and "product".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;Imagine now that due to performance issues or whatever the reason you have another not-normalized table "notNormalizedTable" with a foreing key column "fk_client_id" and "fk_product_id" that many times doesn't have a given set value either for client or product or both.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;If you want to avoid the risky NULLs the first step is to create default client and product rows. For example:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;client:&lt;br /&gt;=======&lt;br /&gt;id | name&lt;br /&gt;01 | "Not Known"&lt;br /&gt;02 | "Not Applicable"&lt;br /&gt;...&lt;br /&gt;product:&lt;br /&gt;=======&lt;br /&gt;id | name&lt;br /&gt;01 | "Not Known"&lt;br /&gt;02 | "Not Applicable"&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;A new problem arises now. It's possible to accidentally delete either client or product "meta-rows" that represent "Not applicable"/"Not known"/... values, and then our strategy for NULL replacement will go to an end.&lt;br /&gt;Noneless, the solution is quite easy. Just create a new meta-table "nullKiller" with a foreign key for each table for which we want "meta-rows" with the "ON DELETE NO ACTION ON CASCADE NO ACTION" clause like:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;create table `nullKiller`(&lt;br /&gt;fk_client_id&lt;br /&gt;fk_product_id&lt;br /&gt;...&lt;br /&gt;fk_entityN_id&lt;br /&gt;CONSTRAINT `nullKiller_const1` \&lt;br /&gt;&amp;nbsp;&amp;nbsp;FOREIGN KEY (`fk_client_id`) \&lt;br /&gt;&amp;nbsp;&amp;nbsp;REFERENCES `client` (`id`) \&lt;br /&gt;&amp;nbsp;&amp;nbsp;ON DELETE NO ACTION ON UPDATE NO ACTION,&lt;br /&gt;CONSTRAINT `nullKiller_const2` \&lt;br /&gt;&amp;nbsp;&amp;nbsp;FOREIGN KEY (`fk_product_id`) \&lt;br /&gt;&amp;nbsp;&amp;nbsp;REFERENCES `product` (`id`) \&lt;br /&gt;&amp;nbsp;&amp;nbsp;ON DELETE NO ACTION ON UPDATE NO ACTION,&lt;br /&gt;...&lt;br /&gt;CONSTRAINT `nullKiller_constN` \&lt;br /&gt;&amp;nbsp;&amp;nbsp;FOREIGN KEY (`fk_entityN_id`) \&lt;br /&gt;&amp;nbsp;&amp;nbsp;REFERENCES `entityN` (`id`) \&lt;br /&gt;&amp;nbsp;&amp;nbsp;ON DELETE NO ACTION ON UPDATE NO ACTION&lt;br /&gt;);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;then just insert the new rows:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;INSERT INTO `nullKiller` \&lt;br /&gt;&amp;nbsp;&amp;nbsp;(fk_client_id,fk_product_id,...,fk_entity_N_id) \&lt;br /&gt;&amp;nbsp;&amp;nbsp;VALUES (1,1,....1), (2,2,....2);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Once the `nullKiller` rows are inserted we are sure that a reserved set of ids for each entity are reserved for default values thanks to the "ON UPDATE NO ACTION" clause, and we  are also sure those rows will not be accidentally deleted thanks the "ON DELETE NO ACTION" clause.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So, you know what to do now: "KILL THE NULL, KILL'EN ALL"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-5733535353535314205?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/5733535353535314205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=5733535353535314205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/5733535353535314205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/5733535353535314205'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/05/kill-null-killen-all.html' title='KILL THE NULL, KILL&apos;EN ALL'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-3919591300017572641</id><published>2011-05-03T03:23:00.000-07:00</published><updated>2011-05-03T03:27:42.088-07:00</updated><title type='text'>Monitoring uninterruptible system calls.</title><content type='html'>Here comes a "keep it simple and stupid" one-line script to watch for any process that could have trouble beeing blocked by an uninterruptible system call.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#$ while true; do ps -e fo stat,cmd | grep ^D &amp;&amp; echo "-------"; sleep 0.1 ; done&lt;br /&gt;&lt;br /&gt;D&lt;    \_ [scsi_eh_0]&lt;br /&gt;D         \_ hald-addon-storage: polling /dev/sr0 (every 2 sec)&lt;br /&gt;-------&lt;br /&gt;D         \_ hald-addon-storage: polling /dev/sr0 (every 2 sec)&lt;br /&gt;-------&lt;br /&gt;D&lt;    \_ [md0_raid1]&lt;br /&gt;D&lt;    \_ [kjournald]&lt;br /&gt;-------&lt;br /&gt;D&lt;    \_ [md0_raid1]&lt;br /&gt;-------&lt;br /&gt;D&lt;    \_ [md0_raid1]&lt;br /&gt;-------&lt;br /&gt;D&lt;    \_ [md0_raid1]&lt;br /&gt;-------&lt;br /&gt;D&lt;    \_ [md0_raid1]&lt;br /&gt;-------&lt;br /&gt;D&lt;    \_ [md0_raid1]&lt;br /&gt;Ds   /sbin/syslogd&lt;br /&gt;-------&lt;br /&gt;D&lt;    \_ [md0_raid1]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The output in this case is normal. [md0_raid1],kjournald and syslogd are making frequent disk writes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-3919591300017572641?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/3919591300017572641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=3919591300017572641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/3919591300017572641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/3919591300017572641'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/05/monitoring-uninterruptible-system-calls.html' title='Monitoring uninterruptible system calls.'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-7778137374273850946</id><published>2011-04-20T05:05:00.001-07:00</published><updated>2011-04-20T05:11:29.600-07:00</updated><title type='text'>Wait, wait!!</title><content type='html'>After years of shell scripting I wasn't aware of the useful "wait" command. It makes the parent process wait until all child processes finish. I mean:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  #!/bin/sh&lt;br /&gt;  &lt;br /&gt;  (sleep  5; echo "good bye from child 1") &amp;amp;&lt;br /&gt;  (sleep 10; echo "good bye from child 2") &amp;amp;&lt;br /&gt;  &lt;br /&gt;  wait&lt;br /&gt;  echo "good bye from parent process"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When executed, this script will output:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  good bye from child 1&lt;br /&gt;  good bye from child 2&lt;br /&gt;  good bye from parent process&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Arggg, so many lost hours writing custom code to do what was only one line away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-7778137374273850946?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/7778137374273850946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=7778137374273850946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/7778137374273850946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/7778137374273850946'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/04/wait-wait.html' title='Wait, wait!!'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-1642094198754358839</id><published>2011-03-28T04:50:00.000-07:00</published><updated>2011-03-28T05:06:49.786-07:00</updated><title type='text'>JQTJSF: Java-quick-thread-job-splitting/forking</title><content type='html'>(Sorry about the stupid title but "laws of nature" force me to prefix anything related to Java with an annoying, uggly, empty of content and counter-intuitive acronym).&lt;br /&gt;&lt;br /&gt;Reading about closures I found the next quite useful paragraphs (Copy&amp;amp;Paste from the &lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;Wikipedia&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;Java allows defining "anonymous classes" inside a method; an anonymous class may refer to names in lexically enclosing classes, or read-only variables (marked as final) in the lexically enclosing method.&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-style: italic; color: rgb(51, 0, 153);"&gt;class CalculationWindow extends JFrame {&lt;br /&gt;      private volatile int result;&lt;br /&gt;      ...&lt;br /&gt;      public void calculateInSeparateThread(final URI uri) {&lt;br /&gt;              // The expression "new Runnable() { ... }" is an anonymous class.&lt;br /&gt;              new Thread(&lt;br /&gt;                      new Runnable() {&lt;br /&gt;                              void run() {&lt;br /&gt;                                      // It can read final local variables:&lt;br /&gt;                                      calculate(uri);&lt;br /&gt;                                      // It can access private fields of the enclosing class:&lt;br /&gt;                                      result = result + 10;&lt;br /&gt;                              }&lt;br /&gt;                      }&lt;br /&gt;              ).start();&lt;br /&gt;      }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;Some features of full closures can be emulated by using a final reference to a mutable container, for example, a single-element array. The inner class will not be able to change the value of the container reference itself, but it will be able to change the contents of the container.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;According to a Java 7 proposal[11], closures will allow the above code to be executed as:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;class CalculationWindow extends JFrame {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;        private volatile int result;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;        ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;        public void calculateInSeparateThread(final URI uri) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;                // the code #(){ /* code */ } is a closure&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;                new Thread(#(){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;                    calculate( uri );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;                    result = result + 10;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;                }).start();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 0, 153);"&gt;}&lt;/span&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/6673249452090473869-1642094198754358839?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/1642094198754358839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=1642094198754358839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1642094198754358839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1642094198754358839'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/03/jqtjsf-java-quick-thread-job.html' title='JQTJSF: Java-quick-thread-job-splitting/forking'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-7489906854967600306</id><published>2011-03-18T10:26:00.000-07:00</published><updated>2011-03-19T04:12:42.886-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Limiting Flash CPU usage in Linux (Firefox only)</title><content type='html'>Firefox makes it easy to enable/disable plugins like Flash.&lt;br /&gt;&lt;br /&gt;The problem is that there are many webs out there. Some of them use Flash legitimately and with good intentions, while some others try to invade us with ads banners without taking a minimal effort to keep resource usage low. Switching on/off the flash plugin is not always an option or at least not a confortable one. Ideally it would be great to have Flash running while simultaneously get certain that it will not peak CPU usage slowing down web navigation.&lt;br /&gt;&lt;br /&gt;Newer versions of Firefox use an external process named "plugin-container" to execute external plugins like Flash. Fortunately that makes it quite easy to control the maximum CPU percentage we want to assign to Flash. All we need is to follow the next 2 steps:&lt;br /&gt;&lt;br /&gt;- Install the command line utility "cpulimit". How to do it must be straightforward if its already in our favority linux distro repository.&lt;br /&gt;&lt;br /&gt;- Edit (as root)  /etc/rc.local and add a line similar to:&lt;br /&gt;&lt;br /&gt; cpulimit -l 20 -e plugin-container &amp;&lt;br /&gt;&lt;br /&gt;Once we reboot our system 'cpulimit' will take care that external firefox plugins (aka flash) don't get more than 20% of our CPU. That can be too  slow for people who want to check videos on youtube, so they will probably want to use a higher percentage. 20% is just a personal option. (Don't forget also that VLC allows to play youtube videos and it performs much better than the Flash plugin: http://www.google.com/search?q=vlc+youtube).&lt;br /&gt;&lt;br /&gt;In my particular system, a "not so 3-years-old" laptop, I'm used to set cpu frequency to the minimum available clock, 800Mhz. That let's me use the laptop as a real &lt;span style="font-weight:bold;"&gt;LAP&lt;/span&gt;top, I mean without my laps being burn by the heat dissipated by the CPU. Before using cpulimit I had no other option that turning  off the plugin flash since randomly some "aggresive" flash banner knocked down my web browser. After cpulimiting the plugin those banners will need to manage themselves how to share the 20% cpu left for them. Not my problem anymore.&lt;br /&gt;&lt;br /&gt;What about Chrome? I think, for what I have read about, that Google Chrome is ussing some type of plugin container too, but I found no easy way to control it. "top" just show a single process for the browser and the plugin so I didn't find any easy way to let cpulimit control it. Any hint/idea is wellcome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-7489906854967600306?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/7489906854967600306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=7489906854967600306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/7489906854967600306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/7489906854967600306'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/03/limiting-flash-cpu-ussage-in-linux.html' title='Limiting Flash CPU usage in Linux (Firefox only)'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-7429356285857692088</id><published>2011-03-11T03:12:00.000-08:00</published><updated>2011-07-20T08:18:22.019-07:00</updated><title type='text'>God save VIM!: My personal .vimrc</title><content type='html'>&lt;pre&gt;set number            &lt;-- A must &lt;br /&gt;set ignorecase        &lt;-- quite useful&lt;br /&gt;set encoding=utf-8&lt;br /&gt;set tabstop=4          &lt;br /&gt;set shiftwidth=4      &lt;-- 8 is too much and annoying&lt;br /&gt;set expandtab         &lt;-- replace tabs with spaces. That makes layout independent of tab's setup.&lt;br /&gt;set foldmethod=indent &lt;-- Ummm, depends on taste. Automatic folding based on indentation&lt;br /&gt;Once a file is open it may be better to change it to foldmethod=manul&lt;br /&gt;set cursorline        &lt;-- Visual help (cursorcolumn is useful sometimes) &lt;br /&gt;syntax off            &lt;-- Syntax highlighting never works to me.&lt;br /&gt;set cindent           &lt;-- C indent rules                                           &lt;br /&gt;set smartindent       &lt;-- Make vim smart about indentation&lt;br /&gt;set autoindent        &lt;-- Enable autoindent&lt;br /&gt;&lt;/pre&gt;External Links:&lt;ul&gt;    &lt;li&gt;&lt;a href='http://olex.openlogic.com/wazi/2011/tips-for-using-vim-as-an-ide/' target='new'&gt;Tips for using vim as an ide&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-7429356285857692088?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/7429356285857692088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=7429356285857692088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/7429356285857692088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/7429356285857692088'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2011/03/god-save-vim-my-personal-vimrc.html' title='God save VIM!: My personal .vimrc'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-3588211529590856935</id><published>2010-12-21T07:44:00.000-08:00</published><updated>2010-12-21T07:46:53.063-08:00</updated><title type='text'>Add skip-name-resolve to default my.cnf</title><content type='html'>Copying and pasting myself from an entry in the bugzilla system:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Description of problem:&lt;br /&gt;&lt;br /&gt;The default mysql setup (/etc/my.cnf) indicates to make an inverse dns lookup&lt;br /&gt;for new network connections. Mostly this is a quite primitive way to strength&lt;br /&gt;database security  (IMHO it provides no added security at all) but promotes&lt;br /&gt;buggy behaviour and is quite risky. For example mysql connections will fail if&lt;br /&gt;DNS fails. Even if it works, connections will really slow down (around x100&lt;br /&gt;times slower!!) if using an external DNS or the DNS is overloaded.&lt;br /&gt;&lt;br /&gt;Other potencial problems. After granting access with the command:&lt;br /&gt;&lt;br /&gt; GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'MyPassword' WITH&lt;br /&gt;GRANT OPTION;&lt;br /&gt;&lt;br /&gt; connections will be allowed to 'myuser' from any host, &lt;span style="font-weight: bold;"&gt;EXCEPT&lt;/span&gt; from localhost&lt;br /&gt;(127.0.0.1). An extra command will be needed.&lt;br /&gt;&lt;br /&gt; GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'MyPassword' WITH&lt;br /&gt;GRANT OPTION;&lt;br /&gt;&lt;br /&gt;What's much worse.&lt;span style="font-weight: bold;"&gt; Allowed connections can stop working if suddenly /etc/hosts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;is altered&lt;/span&gt;. (That really hurts in production environments).&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-3588211529590856935?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/3588211529590856935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=3588211529590856935' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/3588211529590856935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/3588211529590856935'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2010/12/add-skip-name-resolve-to-default-mycnf.html' title='Add skip-name-resolve to default my.cnf'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-175968212321631925</id><published>2010-12-17T02:46:00.000-08:00</published><updated>2010-12-17T03:19:07.907-08:00</updated><title type='text'>KVM weekly backup, the easy way</title><content type='html'>&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:times new roman;"&gt;For the joy of all my readers here it comes the master-of-the-universe weekly script backup for KVM:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# Redirect stdout/stderr to custom log.&lt;br /&gt;&lt;br /&gt;exec 1&gt;&gt; /var/log/custom_$(basename ${0}).$(whoami).$(date '+%Y%m%d').log 2&gt;&amp;amp;1&lt;br /&gt;pushd /media/backup/MyServer1/&lt;br /&gt;# Keep copies of the VM for the last 4 weeks.&lt;br /&gt;mv kvm.qemu.gz.1 kvm.qemu.gz.2&lt;br /&gt;mv kvm.qemu.gz.0 kvm.qemu.gz.1&lt;br /&gt;mv kvm.qemu.gz   kvm.qemu.gz.0&lt;br /&gt;&lt;br /&gt;# Stop KVM instance through telnet.&lt;br /&gt;# KVM has to be started with the option:&lt;br /&gt;#    -monitor telnet:127.0.0.1:9942,server,nowait&lt;br /&gt;echo "stop"  | nc -q 10 127.0.0.1 9942&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; # Freeze KVM instance&lt;br /&gt;&lt;br /&gt;#Here we do the real backup of the KVM instance&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cat /VM-Images/kvm.qemu | gzip &gt; /&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;media/backup/MyServer1&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;/&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;kvm.qemu&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.gz&lt;br /&gt;if [ $? != 0 ]; then&lt;br /&gt;   echo "WARN: KVM backup failed"&lt;br /&gt;fi&lt;br /&gt;echo "c"  | nc -q 10 127.0.0.1 9942 # Continue KVM instance&lt;br /&gt;popd&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;For the previous script to work correctly we have to start the KVM instance with the option  -monitor  telnet:127.0.0.1:9942.&lt;br /&gt;&lt;br /&gt;In my particular system I start KVM instances at startup in /etc/rc.local. This is script is also quite interesting so I extracted all the kvm related stuff:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;/etc/rc.local:&lt;br /&gt;&lt;/span&gt;# Setting up the bridge (tip: apt-get install bridge-utils)&lt;br /&gt;brctl addbr ofi1&lt;br /&gt;brctl addif ofi1 eth1&lt;br /&gt;ifconfig eth1 0.0.0.0 promisc up&lt;br /&gt;ifconfig ofi1 192.168.2.100 netmask 255.255.0.0 up&lt;br /&gt;ifconfig ofi1:1 172.16.1.3&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;kvm -net nic,macaddr=52:54:00:19:34:56 \&lt;br /&gt; -net tap,script=/etc/qemu-ifup -hda /VM-Images/kvm.qemu \&lt;br /&gt; -boot c -vnc :5 1&gt;/var/log/custom_kvm.qemu.log \&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;-monitor telnet:127.0.0.1:9942,server,nowait&lt;/span&gt; 2&gt;&amp;amp;1 &amp;amp;&lt;br /&gt;...&lt;br /&gt;# ionice/renice down our virtual machine&lt;br /&gt;PID=$(sof /VM-Images/kvm.qemu | grep -v ^COMMAND | while read cmd pid staff; do echo $pid; done)&lt;br /&gt;ionice -c 3 -p ${PID} &amp;amp;&lt;br /&gt;renice 10 -p &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;${PID}&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &amp;amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;/etc/qemu-ifup:&lt;/span&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;# ofi1 is the choosen name in /etc/rc.local&lt;br /&gt;/usr/sbin/brctl addif ofi1 $1 ;&lt;br /&gt;ifconfig $1 0.0.0.0 up;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:times new roman;"&gt;TIP: KVM console has&lt;/span&gt;&lt;/span&gt; lot of interesting options not shown here, including those for migrating a virtual machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-175968212321631925?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/175968212321631925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=175968212321631925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/175968212321631925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/175968212321631925'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2010/12/kvm-weekly-backup-easy-way.html' title='KVM weekly backup, the easy way'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-4146423687501976267</id><published>2010-12-06T01:12:00.000-08:00</published><updated>2010-12-06T01:19:11.248-08:00</updated><title type='text'>eternal spirit of contradiction</title><content type='html'>Visual/graphics applications tends to be developed with text based programming languages, while text/voice applications tends to be developed with visual based ones. &lt;br /&gt;&lt;br /&gt;Another probe of our natural bias toward self-contradiction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-4146423687501976267?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/4146423687501976267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=4146423687501976267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/4146423687501976267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/4146423687501976267'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2010/12/eternal-spirit-of-contradiction.html' title='eternal spirit of contradiction'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-9044476565064506534</id><published>2010-10-09T09:17:00.000-07:00</published><updated>2010-11-23T08:13:13.089-08:00</updated><title type='text'>A mysql inmigrant in an Oracle world</title><content type='html'>Last few years I've been living in MySQL. A quiet city full of good food and nice people.&lt;br /&gt;&lt;br /&gt;Two months ago I had to relocate to Oracle, a "fast-food-city" where people forget what they are and become slaves of projects, budgets, estimates and more parasitic MBA vocabulary.&lt;br /&gt;&lt;br /&gt;Life style is quite different, even if both cities are close to each other. Just one switch away.&lt;br /&gt;&lt;br /&gt;Beeing I MySQL citizen the first thing I tried to do was to go to the Oracle's city council and sign up for a new database. What a surprise when the public servant ignored me. I was so upset that I didn't known what to do. Fortunatly a gentle citizien next to me laughted and heading to me with a smile in his face said:&lt;br /&gt;&lt;br /&gt;- "I couldn't avoid hearing your conversation. You are new in the city, right?"&lt;br /&gt;&lt;br /&gt;- "Yes am I" replied. "I just arrived in the city a few hours ago  and ..."&lt;br /&gt;&lt;br /&gt;- "and you tried to sign up for a new database as you ussually did in MySQL", interrupted him with an increasing smile and then continued ...&lt;br /&gt;- "you can't do that in Oracle. People here don't like it. Don't worry about that, just do next thing: Tell the officer you want a new user for the existing database. That will automatically provide you with your private schema. The schema will have the same name than your user and you will be able to do whatever you like in it as you previosly could in your private MySQL database."&lt;br /&gt;&lt;br /&gt;-"Thanks you, I was completly lost!" I replied.&lt;br /&gt;&lt;br /&gt;-"You are wellcome. I came time ago from the beatiful PostgreSQL countryside and it was taugh to get used to a bloated big poluted city like this. Still, it's not that bad once you get used to it. have a nice day"&lt;br /&gt;&lt;br /&gt;Now it's time to find a good server to hire! Servers in Oracle are quite expensive when compared to the prices in MySQL. I don't want an luxury one with swimming pool and a garden just something small to pass the night and good neighbours, you known, I don't like conflictive hard-disks next door.  Guess me good luck!&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;en Mysql:&lt;br /&gt;    select id FROM PMC_IVR_APLICACIONES LIMIT 6,10;&lt;br /&gt;se transforma en Oracle en:&lt;br /&gt;SELECT id FROM&lt;br /&gt;(SELECT id, ROW_NUMBER() OVER (ORDER BY id) R FROM PMC_IVR_APLICACIONES)&lt;br /&gt;WHERE R BETWEEN 6 and 10&lt;br /&gt;&lt;br /&gt;En Oracle ; no hace autocommit. Hay que utilizar \ para indicar autocommit.&lt;br /&gt;En caso contrario al finalizar el script, si no indicamos un "COMMIT" las operaciones&lt;br /&gt;realizadas quedan sin ning'un efecto.&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;./app/oracle/flash_recovery_area/XE/ONLINELOG/O1_MF_1_6BMMMN26_.LOG&lt;br /&gt;Oracle Stored Procedures&lt;br /&gt;(Page 1 of 10 )&lt;br /&gt;&lt;br /&gt;What you will learn&lt;br /&gt;&lt;br /&gt;An Oracle stored procedure is a program stored in an Oracle database.&lt;br /&gt;&lt;br /&gt;We often refer to an Oracle stored procedure as a procedure. &lt;br /&gt;&lt;br /&gt;    Steps: &lt;br /&gt;  * create a procedure on an Oracle database, a process which will automatically compile and save the procedure.&lt;br /&gt;  * run a procedure stored on an Oracle database from the SQL*Plus tool supplied by Oracle.&lt;br /&gt;  * debug a procedure by introducing, viewing and fixing a compilation error.&lt;br /&gt;  * drop a procedure, a process which will permanently remove a procedure from an Oracle database.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Oracle Stored Procedures - Before you start&lt;br /&gt;(Page 2 of 10 )&lt;br /&gt;&lt;br /&gt;    The code examples were tested in Oracle's SQL*Plus tool.&lt;br /&gt;    Your user name should be set up with the permission to write procedures: &lt;br /&gt;        the CREATE PROCEDURE system privilege. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   |Ex.1. file skeleton.sql:&lt;br /&gt;   |1 CREATE OR REPLACE PROCEDURE skeleton   &lt;---  compiles&amp;saves a procedure&lt;br /&gt;   |2 IS             &lt;--- Indicates the start of a PL/SQL body follows&lt;br /&gt;   |3 BEGIN          &lt;--- Start of the PL/SQL body&lt;br /&gt;   |4   NULL;        &lt;--- Empty content.&lt;br /&gt;   |5 END;           &lt;--- En of the PL/SQL body&lt;br /&gt;&lt;br /&gt;Oracle Stored Procedures - Run a procedure&lt;br /&gt;(Page 5 of 10 )&lt;br /&gt;&lt;br /&gt;Run your procedure from the SQL*Plus command prompt with the EXECUTE command like this:&lt;br /&gt;&lt;br /&gt;   |SQL&gt; EXECUTE skeleton;&lt;br /&gt;   |PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt; Alternatively:&lt;br /&gt;   |SQL&gt; BEGIN&lt;br /&gt;   |  2    SKELETON;&lt;br /&gt;   |  3  END;&lt;br /&gt;   |  4  /&lt;br /&gt;   |PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;Oracle Stored Procedures - Change a procedure&lt;br /&gt;(Page 6 of 10 )&lt;br /&gt;&lt;br /&gt;   |1 CREATE OR REPLACE PROCEDURE skeleton&lt;br /&gt;   |2 IS&lt;br /&gt;   |3 BEGIN&lt;br /&gt;   |4   DBMS_OUTPUT.PUT_LINE('Hello World!');&lt;br /&gt;   |5 END;&lt;br /&gt;&lt;br /&gt;   |SQL&gt; SET SERVEROUTPUT ON   &lt;--- A SET command is needed before output is&lt;br /&gt;   |SQL&gt; EXECUTE skeleton;          shown from the DBMS_OUTPUT.PUT_LINE&lt;br /&gt;   |Hello World!&lt;br /&gt;   |PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;Oracle Stored Procedures - Debug a procedure&lt;br /&gt;(Page 7 of 10 )&lt;br /&gt;&lt;br /&gt;   |CREATE OR REPLACE PROCEDURE skeleton&lt;br /&gt;   |IS&lt;br /&gt;   |BEGIN&lt;br /&gt;   |  NULLL;   &lt;--- NULLL is wrong (3 L's)&lt;br /&gt;   |END;&lt;br /&gt;   ...&lt;br /&gt;   |Warning: Procedure created with compilation errors.&lt;br /&gt;&lt;br /&gt;Let's see the compilation errors:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At the SQL*Plus command prompt, type:&lt;br /&gt;&lt;br /&gt;    SQL&gt; SET ARRAYSIZE 1    &lt;--- to ensure the SQL*Plus buffer does not overflow.&lt;br /&gt;    SQL&gt; SET MAXDATA 60000  &lt;--- to ensure the SQL*Plus buffer does not overflow.&lt;br /&gt;    SQL&gt; SHOW ERRORS PROCEDURE skeleton  &lt;-- Makes SQL*Plus show the errors.&lt;br /&gt;You should see the compilation error:&lt;br /&gt;    LINE/COL&lt;br /&gt;    ----------------------------------------------&lt;br /&gt;    ERROR&lt;br /&gt;    ----------------------------------------------&lt;br /&gt;    4/3&lt;br /&gt;    PLS-00201: identifier 'NULLL' must be declared&lt;br /&gt;&lt;br /&gt;    4/3&lt;br /&gt;    PL/SQL: Statement ignored&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DROP PROCEDURE is classified in SQL as a Data Definition Language (DDL) statement.&lt;br /&gt;Other examples of SQL statements in this category include CREATE, ALTER, RENAME and TRUNCATE.&lt;br /&gt;!!!Oracle issues an automatic COMMIT after a DDL statement is executed. &lt;br /&gt;   Therefore, no rollback is possible after executing a DDL statement.!!!&lt;br /&gt;   |SQL&gt; DROP PROCEDURE skeleton;&lt;br /&gt;   |Procedure dropped.&lt;br /&gt;&lt;br /&gt;Now let's sum up it all up. &lt;br /&gt; &lt;br /&gt;Oracle Stored Procedures - Further reading&lt;br /&gt;&lt;br /&gt;    Parameters: Our basic procedure accepts no parameters. You can declare input parameters to accept data, and output parameters to return data to the calling environment.&lt;br /&gt;&lt;br /&gt;    Variables: Again, our basic procedure contains no variable declarations, but you can declare any PL/SQL variable in a procedure, including characters, numbers, dates and Booleans.&lt;br /&gt;&lt;br /&gt;    Extracting data: You can use the SQL statement SELECT to extract data from an Oracle database and populate variables in your procedure.&lt;br /&gt;&lt;br /&gt;    Extracting lots of data: You can process batches of records in a procedure using cursors.&lt;br /&gt;&lt;br /&gt;    Transaction control: Manipulate data from within a procedure. Issue SQL statements INSERT, UPDATE and DELETE, and decide if you want to commit the changes, or if they should be rolled back.&lt;br /&gt;--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-9044476565064506534?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/9044476565064506534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=9044476565064506534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/9044476565064506534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/9044476565064506534'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2010/10/mysql-inmigrant-in-oracle-world.html' title='A mysql inmigrant in an Oracle world'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-8526292641167690800</id><published>2010-05-01T09:51:00.000-07:00</published><updated>2010-05-01T09:54:09.703-07:00</updated><title type='text'>There is live after dead...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_waT5JmbFeY8/S9xcfgt-htI/AAAAAAAAADM/thou5VHHOTA/s1600/pantallazo.png"&gt;&lt;br /&gt;&lt;/a&gt;... at least if you have been cached by Google before dying:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_waT5JmbFeY8/S9xcfgt-htI/AAAAAAAAADM/thou5VHHOTA/s1600/pantallazo.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 340px;" src="http://3.bp.blogspot.com/_waT5JmbFeY8/S9xcfgt-htI/AAAAAAAAADM/thou5VHHOTA/s400/pantallazo.png" alt="" id="BLOGGER_PHOTO_ID_5466345744149415634" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-8526292641167690800?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/8526292641167690800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=8526292641167690800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/8526292641167690800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/8526292641167690800'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2010/05/there-is-live-after-dead.html' title='There is live after dead...'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_waT5JmbFeY8/S9xcfgt-htI/AAAAAAAAADM/thou5VHHOTA/s72-c/pantallazo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-5441955595957635417</id><published>2010-03-30T02:47:00.000-07:00</published><updated>2010-03-30T03:31:01.114-07:00</updated><title type='text'>Windows Licences comming to a dead-end</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_waT5JmbFeY8/S7HI4lbHSBI/AAAAAAAAADE/kBar5YAHMqM/s1600/ionPrices.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 104px;" src="http://1.bp.blogspot.com/_waT5JmbFeY8/S7HI4lbHSBI/AAAAAAAAADE/kBar5YAHMqM/s400/ionPrices.png" alt="" id="BLOGGER_PHOTO_ID_5454361498166446098" border="0" /&gt;&lt;/a&gt;The image above reflect real prices for the Zotac ION. The snapshot is dated 2010-03-25. &lt;br /&gt;Prices start at 164.37Eu  (220Dolars) and with such price we get a noise-free nettop with an 1.6Ghz Atom and an Nvidia ION able to play 3D content and FullHD videos. It comes also with a useful handle to hang it on the back of any VESA monitor or TV with HDMI input so in practice, it wastes no space at all.&lt;br /&gt;&lt;br /&gt;The Atom is not big deal but is more than just enough for 90% of common office tasks and the Nvidia ION chipset can do magic.&lt;br /&gt;&lt;br /&gt;Another "feature" is that these equipments come without CD/DVD. Just an internal laptop HD with 160Gb. Enough to install any OS. Anything else must go into the SD slot or conected through USB. &lt;span style="font-weight: bold;"&gt;The price is so adjusted that it doesn't even come with a Windows Licence&lt;/span&gt;. When you go bellow the 200€ price per unit that's not possible. A bunch of extra euros is too much when you have put all the efforts in getting a final low-price.&lt;br /&gt;&lt;br /&gt;This is an start. But something that is going to be more and more normal. Prices will drop down the 150 barrier, then 100. Finally, PCs will be for free for final consumers in maybe one or two years, and most people will get them from its Internet provider.&lt;br /&gt;&lt;br /&gt;People will still be able to buy an expensive quad-core and waste 200 Watts power to write a letter or check their emails, paying a "funny" extra bill each month to its power-supply company, bear with the annoying fan sounds and the hot air comming from the inside of the bloated cages that reminds of a old diesel engine. Yes, the will, but most will not. Today is even possible to get Atom equipments for around 100€ by dropping all the goods of the Nvidia ION.&lt;br /&gt;&lt;br /&gt;In this context I see no place for the Microsoft tax. Whether they like it or not, it's something not in their hands. Hard times are comming for the old Windows monopoly. Microsoft will need to fetch money from anywhere else.  I guess they will try to get it increasing licences fees from their loyal (and somethinglike naïve) customers. They will raise server licences, SQL licences, "whatever" licences. Loyal customers who bet for Microsoft and ignored opensource alternatives, just because Microsoft was a giant in the stock market will now have to confront a world dominated by opensource alternatives. Loyal customers will pay more and more for less and less.&lt;br /&gt;&lt;br /&gt;A final note. When using Linux, &lt;span style="font-weight: bold;"&gt;it's quite easy to make the Zotak ION start through the PXE network protocol&lt;/span&gt;. Since network swithches with 48x100Mbs + 2x1Gbs Uplink ports are around 300€ (and droping) that mean we can drop the internal HD and get even a more adjusted price per unit. And having all network based means software updates and central administration comes for free, even for a farm of hundreds (maybe thousands) of PCs.&lt;br /&gt;&lt;br /&gt;Just one extra piece is needed. A central NFS server acting as root file system. And today such server can even be placed in a virtual machine. Great, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-5441955595957635417?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/5441955595957635417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=5441955595957635417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/5441955595957635417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/5441955595957635417'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2010/03/windows-licences-comming-to-dead-end.html' title='Windows Licences comming to a dead-end'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_waT5JmbFeY8/S7HI4lbHSBI/AAAAAAAAADE/kBar5YAHMqM/s72-c/ionPrices.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-6012024291598628633</id><published>2010-02-01T07:39:00.000-08:00</published><updated>2010-02-11T12:15:48.115-08:00</updated><title type='text'>The King paper has died, God save the new King</title><content type='html'>It has been many years of joy reading news and books using such a great invention that our ancient egipcians called "per-peraâ", later on renamed as "papirus" by the greeks, "papyrus" but the roman empire and more recently "paper" by the english who speak English.&lt;br /&gt;&lt;br /&gt;But now it's time to say "goodbye paper!".&lt;br /&gt;&lt;br /&gt;Modern electronic-ink and books will of course compete, but this weekend I found a much more lethal enemy for our lovely paper. The digital camera.&lt;br /&gt;&lt;br /&gt;I was thinking how to get rid of all those books I've been collecting over the years and that have slowy been deposited in my bookself. You know, all those books you don't think you are going to read in the next comming years/life but are too good to leave appart. But our 3D space is finite and sooner or later  we must surrender to the evidence. There is no place anymore for them.&lt;br /&gt;And so, no without pain, I started to think about how to digitalize all their pages before burying them into  the obscure junk room where they will rest in peace.&lt;br /&gt;&lt;br /&gt;My intuition told me that if I wanted to digitalize something I had to scan it, and nothing is better to scan than an scanner... but my intuition was wrong. I tried with my first book and *slow torture* is the only way to define my experience. Nearly 30 seconds per page, and that multiplied by 300pages on average per book was something I just want for my worst enemy. Even more, placing the correct frame per page was all but easy and around one over fives times, I failed to properly place the page in the scanner so I had to reposition the page in the scan and repeat.&lt;br /&gt;&lt;br /&gt;Frustated as I was I deciced a second strategy. A few weeks ago I bought a cheap camera for arround 120€. Nothing great for such price, but still with a maximum 12Mpx marketing resolution. I was amongst those who thought 12Mpx is an aberrant pixel definition for a camera, but for once such an army of megapixels made my day. I tried to take a shot at a page and compare the result with that of the scanner. Not without surprise, the result was much better. The foreground black text looked &lt;span onclick="dr4sdgryt2(event)" class="clickable"&gt;sharp with a yellowish background&lt;/span&gt;. The shot took about 7 second per page and the previous problems to place correctly the page in the scanner vanished in the air. Scanning with the camera was so fast that it took me no more than 1 hour to digitalize a 300 pages book, and with jpg compression the final space was about 200 Mbytes or around 1/2500 of my 500 external USB HD.&lt;br /&gt;&lt;br /&gt;But the real test came next. Reading the digitized text on my 24" screen and comparing with a normal lecture on paper. It was then that I realised paper had become past (and great) history. The difference in favor of the electronic option was so big that I can't think to go back to normal paper in the rest of my life. My eyes were much less fatigated and I could read the pages at nearly two meters of distance. Suddendly all the pages had become a PowerPoint. Next come a picture that tries to reflect what I'm speaking about. Up is the text in the 24" monitor, down in blueish color that same text in my old friend "the paper".&lt;br /&gt;(The picture camera senses the monitor 60Hz refresh rate and some strange distorsion effects appear on this picture that are actually invisible to the human eye, specially the  aurea around the letters).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_waT5JmbFeY8/S2b10dU5c1I/AAAAAAAAAC8/MsbAe3ONaIQ/s1600-h/gedc0572.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 321px; height: 400px;" src="http://3.bp.blogspot.com/_waT5JmbFeY8/S2b10dU5c1I/AAAAAAAAAC8/MsbAe3ONaIQ/s400/gedc0572.jpg" alt="" id="BLOGGER_PHOTO_ID_5433300282043364178" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-6012024291598628633?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/6012024291598628633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=6012024291598628633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/6012024291598628633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/6012024291598628633'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2010/02/king-paper-has-died-god-save-new-king.html' title='The King paper has died, God save the new King'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_waT5JmbFeY8/S2b10dU5c1I/AAAAAAAAAC8/MsbAe3ONaIQ/s72-c/gedc0572.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-98299588177564651</id><published>2009-12-02T13:47:00.000-08:00</published><updated>2009-12-02T13:53:33.735-08:00</updated><title type='text'>Mi primer circuito integrado.</title><content type='html'>Allí está. Con un par. Si no me lo dice nadie, me lo digo yo:  "Torero", "campeón", oeeeeh, oeeeh, oeeeeh, oeeeh, ..&lt;br /&gt;&lt;br /&gt;Voilá, no sin muchos aims y más efforts aquí están la foto  del recien nacido:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_waT5JmbFeY8/SxbhGNdT6nI/AAAAAAAAACo/zsB6hK5F8fM/s1600-h/MiPrimerIntegrado.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_waT5JmbFeY8/SxbhGNdT6nI/AAAAAAAAACo/zsB6hK5F8fM/s320/MiPrimerIntegrado.jpg" alt="" id="BLOGGER_PHOTO_ID_5410759499140295282" border="0" /&gt;&lt;/a&gt; Ha salido a su padre. Tiene mis mismos ojos y esa sonrisa ... Snifff, snifff. Todavía no sé que nombre ponerle. Estaba pensando en Z80, como el Zilog de 8bits de mi primer ordenador.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-98299588177564651?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/98299588177564651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=98299588177564651' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/98299588177564651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/98299588177564651'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2009/12/mi-primer-circuito-integrado.html' title='Mi primer circuito integrado.'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_waT5JmbFeY8/SxbhGNdT6nI/AAAAAAAAACo/zsB6hK5F8fM/s72-c/MiPrimerIntegrado.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-2495637706409864548</id><published>2009-11-28T04:36:00.000-08:00</published><updated>2009-11-28T04:41:04.224-08:00</updated><title type='text'>¡Larga vida a Wikibooks!</title><content type='html'>Siempre estoy apuntando chuletarios por aquí y por allá. (¿Alguien ha notado el nombre de este blog?). Unas veces en un fichero de texto, otras en papel, de vez en cuando en la intranet o en el blog. Ummm, ninguna me convencía. No era el lugar correcto. Pero al final y tras largos años de angustía y lenta agonía lo encontré. La solución es &lt;a href="http://es.wikibooks.org/wiki/Portada"&gt;Wikibooks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lo siento Google, no es nada personal, pero la wiki te vuelve a ganar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-2495637706409864548?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/2495637706409864548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=2495637706409864548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/2495637706409864548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/2495637706409864548'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2009/11/larga-vida-wikibooks.html' title='¡Larga vida a Wikibooks!'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-3251903538025109870</id><published>2009-04-17T14:30:00.000-07:00</published><updated>2009-04-17T14:52:18.556-07:00</updated><title type='text'>Las cuatro cifras del sistema binario</title><content type='html'>La lógica binaria tal y como se explica en los libros de texto se representa con dos cifras, el cero y el uno.&lt;br /&gt;&lt;br /&gt; En el mundo real, la lógica binaria se apoya sin embargo en cuatro  símbolos para poder describirla correctamente:&lt;br /&gt;  Los dos primeros símbolos representan el cero y el uno bondadosos.  Los dos últimos describen a sus gemelos malvados.&lt;br /&gt;&lt;br /&gt; Para que todo funcione correctamente es necesario elegir el primer par y mezclarlos como deseemos, sin importar si es un cero o un uno.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-3251903538025109870?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/3251903538025109870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=3251903538025109870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/3251903538025109870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/3251903538025109870'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2009/04/las-cuatro-cifras-del-sistema-binario.html' title='Las cuatro cifras del sistema binario'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-1133057537896776132</id><published>2008-05-19T07:59:00.000-07:00</published><updated>2008-05-19T08:18:21.028-07:00</updated><title type='text'>La web se impone sobre el escritorio.</title><content type='html'>Leía hace un par de días que Google había hecho mejoras en su sistema de correo web.&lt;br /&gt;&lt;br /&gt;Según comentaba la noticia, tras un detenido estudio se había conseguido cachear mejor los datos utilizados por el usuario hasta alcanzar un 20% de aumento de velocidad.&lt;br /&gt;&lt;br /&gt;La noticia acaba allí, maravillada por el 20% de incremento de la velocidad. Lo que no cuenta la noticia es quizás el hecho más destacable. Los usuarios de Google mail aprovecharán las mejoras instantáneamente. En el momento en que vuelvan a visitar la web todas las mejoras estarán presentes para todos y cada uno de los millones de usuarios del servicio y sin que ninguno de ellos haya tenido que realizar esfuerzo alguno para aprovechar los cambios, tan solo logearse con su usuario y password.&lt;br /&gt;&lt;br /&gt;Esta es la mayor ventaja de la web. Los programas y los datos están centralizados y el navegador se limita a ejecutar la parte cliente mediante javascript. ¡Que diferencia con las aplicaciones habituales!. No es anormal ver oficinas donde usuarios con la ultimísima versión de Office comparten documentos con usuarios de Office (19)97. Y no sería extraño que dentro 20 años veamos oficinas donde usuarios con la ultimísima versión de Office compartan documentos con usuarios de Office (19)97. Un disco duro roto o un nuevo ordenador significa perder horas reinstalando todo lo que teníamos, todas las configuraciones y todas las cuentas, usuarios, passwords, perfiles, e incompletos backups con todos nuestros documentos. A veces, recuperar el CD original con el programa de instalación le hace sentir a uno Indiana Jones en busca del Santo Grial.&lt;br /&gt;&lt;br /&gt;El futuro está claro y pertenece a la web, igual que este blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-1133057537896776132?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/1133057537896776132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=1133057537896776132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1133057537896776132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1133057537896776132'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2008/05/la-web-se-impone-sobre-el-escritorio.html' title='La web se impone sobre el escritorio.'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-1578652591597741413</id><published>2008-03-29T11:05:00.000-07:00</published><updated>2008-03-29T13:51:10.645-07:00</updated><title type='text'>Hoy es un día histórico para Linux</title><content type='html'>Durante años llevo anotando periódicamente las ofertas laborales relacionadas con Linux, Windows y Unix en Jobserve.com, uno de las mayores web de empleos para informáticos. Realmente creo que estas webs son el mejor reflejo de la realidad del mundillo del "Information Technologies" ya que los análisis de los ¿analístas? se pueden calificar como curiosos, graciosos, impactantes pero desde luego nunca objetivos, realistas o independientes:&lt;br /&gt;&lt;br /&gt; Baste decir, por poner un ejemplo, que el rimbombante grupo Garner (queda muy "cool" si se pronuncia con acento yanqui) está parcialmente liderado por compañias de inversión con importantes "brazos" en empresas de informáticas sobre las cuales se supone que mantiene la neutralidad. Silver Lake Parteners, que ostenta el 33% de Garnet cuenta con Michal Dell, Bill Gates, Larry Ellison y otros entre sus inversores. (*http://www.informationweek.com/story/showArticle.jhtml?articleID=178601879).&lt;br /&gt;&lt;br /&gt; Volviendo al tema de interés. ¿Qué nos cuenta Jobserve acerca de Linux ahora mismo?. Bueno, pues ni más ni menos que por primera vez Linux supera el 20% de cuota de ofertas laborales, respecto a un 43'19% de Windows y un 36.45% de Unix (entendiendo por Unix todo y cuanto se parece a Linux sin ser Linux).&lt;br /&gt;&lt;br /&gt; Empecé a anotar la relación en Linux, Windows y Unix allá por Abril del 2001. En aquél entonces Linux contaba con un 3.8% del mercado de ofertas laborales, frente aun 48% de Unix y Windows aproximadamente.  Durante 2 años Linux fué creciendo suavemente al tiempo que Unix bajaba, mientras que Windows se mantenía e incluso crecia un poco. Por fín, en diciembre del 2003 Linux se colocaba en el 10%. Durante los 3 años siguiente Linux continuó progresivamente su escalada a costa de Unix y en menor medida de Windows. En diciembre de 2006 Linux contaba con un 19.0%, Windows con un 43.5 y Unix con un 37.4%. Y entonces de repente, Linux perdió cancha, pasó todo el 2007 sin subidas ni bajadas. Un més subía un 1% y al mes siguiente bajaba otro 1% y por fín, hoy 29 de Marzo de 2008, un año y 3 meses más tarde supera el 20%. A comienzos del 2001 la relación entre ofertas relacionadas con Windows y linux superaba el 10 a 1. 7 años más tarde está proxima a 2 a 1.&lt;br /&gt;&lt;br /&gt; ¿Qué paso el 2007? ¿Acaso Linux perdió fuelle? Bueno, yo creo que la respuesta es sencilla, 2007 fué el año de la virtualización. Fué el año en que realmente Linux dejó de alojarse en máquinas físicas y empezó a ejecutarse en entornos virtuales como Xen, Virtuozzo, VMWare, KVM, etc... Esto significó menos administradores para más servicios. Por contra Windows parece haberse quedado un poco a la zaga en el tema de la virtualización, por un lado porque el sistema operativo no ofrecía el soporte que Linux ofrece desde mediados del 2006 (principalmente gracias a Xen) y quizás también porque el perfíl técnico de los trabajadores de linux es más "geek" y absorve antes las "novedades" (novedades que no son tales ya que existen desde hace mucho en sistemas unix de gama tan alta como cara).&lt;br /&gt;&lt;br /&gt; Por supuesto, Microsoft y sus millones no han desaparecido todavía, y esto significa que mañana volveremos a leer los artículos de "expertos" consultores de Gartner hablando de Linux como un sistema minoritario, destinado a un público joven y granos en la cara así como las ventajas y "return of investment" que supone "Güindouusssss" para el businessman de 21th-century.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-1578652591597741413?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/1578652591597741413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=1578652591597741413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1578652591597741413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1578652591597741413'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2008/03/hoy-es-un-da-histrico-para-linux.html' title='Hoy es un día histórico para Linux'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-2611056851821716008</id><published>2008-03-24T11:35:00.000-07:00</published><updated>2008-03-24T11:52:13.857-07:00</updated><title type='text'>Dos útiles utilidades</title><content type='html'>Supongo que no soy el único que al actualizar su Debian Linux y ver un listado de 3 páginas con aplicaciones pendientes de actualizar se limita a decirle "Sí" a todo y espera media horilla a que el PC y el ADSL hagan su trabajo.&lt;br /&gt;&lt;br /&gt; El otro día y sólo por curiosidad dediqué un rato a mirar qué era todo aquello que los señores de Debian habían decidido instalar en mi sistema y me llevé un par de agradables sorpresas. &lt;br /&gt; Curioseando por las opciones de configuración (Sistema -&gt; Preferencias -&gt; Teclado) ví una opción que me permitía establecer descansos de escritura. Esta útil utilidad simplemente se limita a dar una "colleja virtual" avisando de que llevamos mucho tiempo pegados a la pantalla y nos aníma a descansar 3 minutos antes de continuar.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_waT5JmbFeY8/R-f3PfzNrbI/AAAAAAAAAA8/ks3ulLqpeu8/s1600-h/preferenciasDelTeclado.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_waT5JmbFeY8/R-f3PfzNrbI/AAAAAAAAAA8/ks3ulLqpeu8/s400/preferenciasDelTeclado.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5181381741919448498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Por otro lado ví que entre las diversas aplicaciones que se mostraban en el menú de aplicaciones de oficinas había una nueva llamada "AiksaurusGTK". La misma permite mostrar sinónimos "a tuti plen" de cualquier vocablo inglés que venga a nuestra mente ordenándolos por el contexto en el cuál aparecen. Cuando uno no es muy laudo en la lengua de Shakespeare y las Spice Girls pero se ve obligado a escribir en inglés un día sí y otro también pocas utilidades se agradecen tanto como esta.&lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_waT5JmbFeY8/R-f3D_zNraI/AAAAAAAAAA0/lAppyO7qtHw/s1600-h/PantallazoAiksaurusGTK.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_waT5JmbFeY8/R-f3D_zNraI/AAAAAAAAAA0/lAppyO7qtHw/s400/PantallazoAiksaurusGTK.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5181381544350952866" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-2611056851821716008?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/2611056851821716008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=2611056851821716008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/2611056851821716008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/2611056851821716008'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2008/03/dos-tiles-utilidades.html' title='Dos útiles utilidades'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_waT5JmbFeY8/R-f3PfzNrbI/AAAAAAAAAA8/ks3ulLqpeu8/s72-c/preferenciasDelTeclado.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-1143370625078052706</id><published>2008-01-06T08:53:00.001-08:00</published><updated>2008-01-13T11:36:54.110-08:00</updated><title type='text'>Mis primeros pinitos con el Mandarín.</title><content type='html'>Si China va a dominar el Mundo va siendo hora de empezar a estudiar Mandarín.&lt;br /&gt;&lt;br /&gt;El Chino Mandarín puede paracer críptico e inaccesible a primera vista al común de los mortales.&lt;br /&gt;&lt;br /&gt;Sin embargo he podido comprobar experimentalmente que esto es un falso tópico.  Os aseguro  que a segunda, tercera y cuarta vista sigue pareciendo críptico e inaccesible.&lt;br /&gt;&lt;br /&gt;La solución para no tirar la toalla es fácil. Hay que estudiar chino como su fuese un juego rompecabezas. Cualquier otro acercamiento puede resultar mortal para nuestrar pobres y desgastadas neuronas.&lt;br /&gt;&lt;br /&gt;Trás comprarme un manual rápido del chino-4-dummies decidí tras algo más de hora y media y tras conseguir llegar al final de la primera página que ya era de poner en práctica la ingente cantidad de conocimientos adquiridos.&lt;br /&gt;&lt;br /&gt;Sin más dilación puse rumbo con mi navegador hacia los confines que llevan a Baidú (http://www.baidu.com). He de advertír al ocioso y probablemente adormilado lector que pierde el tiempo leyendo mi blog que los siguientes párrafos requieren tener instaladas las fuentes chinas en su sistema para poder captar la magnificiencia de la milenaria lengua.&lt;br /&gt;&lt;br /&gt;Nada más amarrar fuí saludado cortesmente y se me brindó la oportunidad de escoger entre varias opciones:&lt;br /&gt;&lt;br /&gt;新闻               网页                      贴吧                           知道                            MP3                        图片&lt;br /&gt;&lt;br /&gt;Primera sorpresa. Tras hora y media de estudio no tenía problemas en traducir MP3 del Chino al Español (Esto pinta bien pensé).&lt;br /&gt;&lt;br /&gt;Con una pequeña ayuda de algún desconocido que puso a su disposición un traductor de chino&lt;br /&gt;(http://www.mandarintools.com/worddict.html) no tardé mucho en descifrar parte de las demás opciones.&lt;br /&gt;新闻 -&gt; hojear noticias&lt;br /&gt;网页 -&gt; web page&lt;br /&gt;贴吧 -&gt; ¿Búsqueda apróximada?&lt;br /&gt;知道 -&gt; ¿Búsqueda por materia?&lt;br /&gt;图片 -&gt; Imágenes&lt;br /&gt;&lt;br /&gt;Algo que siempre me he preguntado es qué imagen guardan los chinos en su cabeza del antaño imperio español donde nunca se ponía el Sol. Por tanto no resistí la tentación de buscar en imágenes fotos sobre España.&lt;br /&gt;&lt;br /&gt;El resultado fué http://image.baidu.com/i?ct=201326592&amp;amp;cl=2&amp;amp;lm=-1&amp;amp;tn=baiduimage&amp;amp;pv=&amp;amp;word=spain&amp;amp;z=0&lt;br /&gt;&lt;br /&gt;Un momento, ¿Qué demonios es el mapa que aparece en la segunda imagen? Un click y varios segundos de espera aclaraban el misterio:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_waT5JmbFeY8/R4ES7qjhFNI/AAAAAAAAAAk/zhSq2-Oxzt0/s1600-h/spainVistoPorLosChinos.jpg"&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_waT5JmbFeY8/R4ES7qjhFNI/AAAAAAAAAAk/zhSq2-Oxzt0/s400/spainVistoPorLosChinos.jpg" alt="" id="BLOGGER_PHOTO_ID_5152420264933397714" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-1143370625078052706?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/1143370625078052706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=1143370625078052706' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1143370625078052706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/1143370625078052706'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2008/01/mis-primeros-pinitos-con-el-mandarn.html' title='Mis primeros pinitos con el Mandarín.'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_waT5JmbFeY8/R4ES7qjhFNI/AAAAAAAAAAk/zhSq2-Oxzt0/s72-c/spainVistoPorLosChinos.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6673249452090473869.post-6741462764973734972</id><published>2008-01-02T04:12:00.000-08:00</published><updated>2008-01-02T04:18:00.269-08:00</updated><title type='text'>Este es mi nuevo blog.</title><content type='html'>Pues sin más dilación voy a ver qué tal funciona este invento de blogger.&lt;br /&gt;&lt;br /&gt;Yo blogeo, tú blogeas, él blogea...&lt;br /&gt;blogearamos o blogeasemos,&lt;br /&gt;&lt;br /&gt;Ummm, cuando menos parece fácil de conjugar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6673249452090473869-6741462764973734972?l=chuletario.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chuletario.blogspot.com/feeds/6741462764973734972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6673249452090473869&amp;postID=6741462764973734972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/6741462764973734972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6673249452090473869/posts/default/6741462764973734972'/><link rel='alternate' type='text/html' href='http://chuletario.blogspot.com/2008/01/este-es-mi-nuevo-blog.html' title='Este es mi nuevo blog.'/><author><name>Super Ya Te lo Dije</name><uri>http://www.blogger.com/profile/05818596012997858632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_waT5JmbFeY8/Sb7Xioc73tI/AAAAAAAAACI/EesWR3okOY0/S220/Imagen013.jpg'/></author><thr:total>0</thr:total></entry></feed>
