<?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-4725769270409658023</id><updated>2012-01-22T11:31:16.265Z</updated><category term='Redes'/><category term='Programación PHP'/><category term='System Administration'/><category term='Animación3D'/><category term='MySQL'/><category term='Depurador'/><category term='cuda'/><category term='compilers'/><category term='Bases de Datos'/><category term='VirtualBox'/><category term='perl'/><category term='Redes Neuronales'/><category term='Programación'/><category term='About'/><category term='ssh'/><category term='modules'/><category term='gnu'/><category term='Wine'/><category term='MInix'/><category term='django'/><category term='Java'/><category term='dyndns'/><category term='Gnome'/><category term='Algoritmos'/><category term='C++'/><category term='Virtualización'/><category term='Software libre'/><category term='Compiladores'/><category term='Arduino'/><category term='python'/><category term='servers'/><category term='Linux'/><category term='ply'/><category term='pythonbrew'/><category term='RoR'/><category term='Programación Linux'/><category term='gcc'/><category term='Hardware'/><category term='Acer Aspire One'/><category term='vim'/><category term='Ubuntu'/><category term='mercurial'/><category term='News'/><category term='FreePascal'/><category term='svn'/><category term='cpanm'/><category term='OS'/><category term='.NET'/><title type='text'>snatverk</title><subtitle type='html'>::-:-: Just another computer blog :-:-::-:::-:::::-::::::::-:::::::::::::-</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-6648874856737710753</id><published>2012-01-21T12:09:00.001Z</published><updated>2012-01-21T12:09:36.338Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='System Administration'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Cacti error: file size limit exeeded</title><content type='html'>&lt;div style="text-align: justify;"&gt;I work with cacti to monitorize sensors and temperature. The other day I got an error related with file size limit. The error message is similar to this:&lt;br /&gt;&lt;/div&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;pre wrap=""&gt;/bin/bash: line 1: 23691 File size limit exceededphp /var/www/html/cacti/poller.php &amp;gt; /dev/null 2&amp;gt;&lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;This occurs because the cati log file has &lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;exceeded the limit. To solve this[1], we can include the cacti log file in &lt;b&gt;logrotate&lt;/b&gt;. &lt;/span&gt;&lt;/span&gt;So we need &lt;b&gt;logrotate installed&lt;/b&gt; in our system. In resume we must do the following steps:&lt;/div&gt;&lt;pre style="font-family: inherit;" wrap=""&gt;1. We create a new logrotate file for cacti. &lt;/pre&gt;&lt;pre style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" wrap=""&gt;# vim  /etc/logrotate.d/cacti&lt;/pre&gt;&lt;pre style="font-family: inherit;" wrap=""&gt;2. Add the followings lines:&lt;/pre&gt;&lt;pre style="font-family: inherit;" wrap=""&gt;&lt;/pre&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;pre wrap=""&gt;/var/www/html/cacti/log/cacti.log {&lt;br /&gt;	# keep two weeks of versions online&lt;br /&gt;	rotate 14&lt;br /&gt;	# rotate the log each day&lt;br /&gt;	daily&lt;br /&gt;	# compress the logs&lt;br /&gt;	compress&lt;br /&gt;	# create new file with the correct user/group attributes&lt;br /&gt;	create 644 apache apache&lt;br /&gt;	# add a YYYYMMDD extension instead of a number&lt;br /&gt;	dateext&lt;br /&gt;} &lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre style="font-family: inherit;" wrap=""&gt;3. Then, we force the rotation:&lt;/pre&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;pre wrap=""&gt;# logrotate -f /etc/logrotate.conf&lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white; text-align: justify;"&gt;&lt;b&gt;References&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;[1] &lt;a href="http://www.question-defense.com/2008/09/29/how-to-rotate-the-cacti-logs-file-cactilog%20"&gt;http://www.question-defense.com/2008/09/29/how-to-rotate-the-cacti-logs-file-cactilog&lt;/a&gt;&lt;br /&gt;[2] Logrotate manual: &lt;a href="http://linuxcommand.org/man_pages/logrotate8.html"&gt;http://linuxcommand.org/man_pages/logrotate8.html &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-6648874856737710753?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/6648874856737710753/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2012/01/cacti-error-file-size-limit-exeeded.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6648874856737710753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6648874856737710753'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2012/01/cacti-error-file-size-limit-exeeded.html' title='Cacti error: file size limit exeeded'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-1907303389245875095</id><published>2012-01-18T21:31:00.001Z</published><updated>2012-01-18T21:32:23.185Z</updated><title type='text'>Anti-SOPA blackout day</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_BDPu-e7Cjw/Txc6EzE5PjI/AAAAAAAABZE/RRbtDjSgSQ4/s1600/BLACK_SQUARE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-_BDPu-e7Cjw/Txc6EzE5PjI/AAAAAAAABZE/RRbtDjSgSQ4/s1600/BLACK_SQUARE.jpg" /&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/4725769270409658023-1907303389245875095?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/1907303389245875095/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2012/01/anti-sopa-blackout-day.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1907303389245875095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1907303389245875095'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2012/01/anti-sopa-blackout-day.html' title='Anti-SOPA blackout day'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-_BDPu-e7Cjw/Txc6EzE5PjI/AAAAAAAABZE/RRbtDjSgSQ4/s72-c/BLACK_SQUARE.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-8104671856776064683</id><published>2012-01-15T14:19:00.000Z</published><updated>2012-01-15T15:18:47.933Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='compilers'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='ply'/><title type='text'>How to work with states in PLY</title><content type='html'>&lt;div style="text-align: justify;"&gt;We have talked about PLY several times[1]. In this post I want to explain how to work and implement lexer states in PLY. In PLY documentation [2], you can find a whole explanation about the lexer states. I only pretend to show a very simple example with lexer states and how to use it in the parser code. The example shows how to ignore the content between two tokens and return it as a token. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white; text-align: justify;"&gt;&lt;b&gt;How to build states&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;It is easy to create states. PLY wait to find the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;states&lt;/span&gt; variable. In this variable we specify the token and the type of state:&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;Inclusive&lt;/b&gt;: we extends the previous states for lexer. So we can use other tokens defined in the previous states.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Exclusive&lt;/b&gt;: we create a new state. In this case is necessary to implement an error state and a ignore state because we do not extends from previous tokens.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;For instance:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre&gt;states = (&lt;br /&gt;    (&lt;span class="Constant"&gt;'foo'&lt;/span&gt;, &lt;span class="Constant"&gt;'exclusive'&lt;/span&gt;),&lt;/pre&gt;&lt;pre&gt;    (&lt;span class="Constant"&gt;'bar'&lt;/span&gt;, &lt;span class="Constant"&gt;'inclusive'&lt;/span&gt;), &lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Then we join on these states to &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;token&lt;/b&gt; variable.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I want to show a very simple example that ignores all content and return it as a token. In some occasions we need to do it, for example to create a special ignore content node in the AST. Note the regular expression of the rule &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;t_foo_CONTENT&lt;/span&gt;&lt;/b&gt;. This expression match all until &lt;b&gt;#end&lt;/b&gt; string. &lt;/div&gt;&lt;br /&gt;&lt;b&gt;Lexer&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Comment"&gt;#!/usr/bin/env python&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="PreProc"&gt;import&lt;/span&gt; ply.lex &lt;span class="Statement"&gt;as&lt;/span&gt; lex&lt;br /&gt;&lt;br /&gt;states = (&lt;br /&gt;    (&lt;span class="Constant"&gt;'foo'&lt;/span&gt;, &lt;span class="Constant"&gt;'exclusive'&lt;/span&gt;),&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;tokens = [&lt;span class="Constant"&gt;'foo'&lt;/span&gt;, &lt;span class="Constant"&gt;'NUMBERS'&lt;/span&gt;, &lt;span class="Constant"&gt;'END'&lt;/span&gt;, &lt;span class="Constant"&gt;'CONTENT'&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;t_NUMBERS&lt;/span&gt;(t):&lt;br /&gt;    &lt;span class="Constant"&gt;r'\d+'&lt;/span&gt;&lt;br /&gt;    &lt;span class="Identifier"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;'General numbers '&lt;/span&gt;&lt;br /&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; t&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;t_foo&lt;/span&gt;(t):&lt;br /&gt;    &lt;span class="Constant"&gt;r'foo'&lt;/span&gt;&lt;br /&gt;    t.lexer.code_start = t.lexer.lexpos&lt;br /&gt;    &lt;span class="Identifier"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;'I have detected foo token'&lt;/span&gt;&lt;br /&gt;    t.lexer.begin(&lt;span class="Constant"&gt;'foo'&lt;/span&gt;)&lt;br /&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; t&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;t_foo_END&lt;/span&gt;(t):&lt;br /&gt;    &lt;span class="Constant"&gt;r'foo'&lt;/span&gt;&lt;br /&gt;    &lt;span class="Identifier"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;'End of state foo'&lt;/span&gt;&lt;br /&gt;    t.lexer.begin(&lt;span class="Constant"&gt;'INITIAL'&lt;/span&gt;)&lt;br /&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; t&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;t_foo_CONTENT&lt;/span&gt;(t):&lt;br /&gt;    &lt;span class="Constant"&gt;r'[^$]+\#end'&lt;/span&gt;&lt;br /&gt;    &lt;span class="Statement"&gt;return&lt;/span&gt; t&lt;br /&gt;&lt;br /&gt;t_ignore = &lt;span class="Constant"&gt;' &lt;/span&gt;&lt;span class="Special"&gt;\t&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;t_foo_error&lt;/span&gt;(t):&lt;br /&gt;    &lt;span class="Identifier"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;'Lexical error: "'&lt;/span&gt; + &lt;span class="Identifier"&gt;str&lt;/span&gt;(t.value[&lt;span class="Constant"&gt;0&lt;/span&gt;]) + &lt;span class="Constant"&gt;'" in line '&lt;/span&gt; + &lt;span class="Identifier"&gt;str&lt;/span&gt;(t.lineno)&lt;br /&gt;    t.lexer.skip(&lt;span class="Constant"&gt;1&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;t_error&lt;/span&gt;(t):&lt;br /&gt;    &lt;span class="Identifier"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;'Lexical error: "'&lt;/span&gt; + &lt;span class="Identifier"&gt;str&lt;/span&gt;(t.value[&lt;span class="Constant"&gt;0&lt;/span&gt;]) + &lt;span class="Constant"&gt;'" in line '&lt;/span&gt; + &lt;span class="Identifier"&gt;str&lt;/span&gt;(t.lineno)&lt;br /&gt;    t.lexer.skip(&lt;span class="Constant"&gt;1&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;test&lt;/span&gt;(data, lexer):&lt;br /&gt;    lexer.&lt;span class="Identifier"&gt;input&lt;/span&gt;(data)&lt;br /&gt;    &lt;span class="Statement"&gt;while&lt;/span&gt; &lt;span class="Identifier"&gt;True&lt;/span&gt;:&lt;br /&gt;        tok = lexer.token()&lt;br /&gt;        &lt;span class="Statement"&gt;if&lt;/span&gt; &lt;span class="Statement"&gt;not&lt;/span&gt; tok:&lt;br /&gt;            &lt;span class="Statement"&gt;break&lt;/span&gt;&lt;br /&gt;        &lt;span class="Identifier"&gt;print&lt;/span&gt; tok&lt;br /&gt;&lt;br /&gt;lexer = lex.lex()&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;if&lt;/span&gt; __name__ == &lt;span class="Constant"&gt;'__main__'&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;    data = &lt;span class="Constant"&gt;''' foo  123 123 esto bla bla bla &lt;/span&gt;&lt;br /&gt;&lt;span class="Constant"&gt;    #endfoo 123'''&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    lexer.&lt;span class="Identifier"&gt;input&lt;/span&gt;(data)&lt;br /&gt;    test(data, lexer)&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;_______________________________________________________ &lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Parser&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;style type="text/css"&gt;&lt;!--pre { font-family: monospace; color: #000000; background-color: #ffffff; }.Constant { color: #ff40ff; font-weight: bold; }.Identifier { color: #8080ff; font-weight: bold; }.Statement { color: #ff6060; }.PreProc { color: #ff40ff; font-weight: bold; }.Comment { color: #ff6060; font-weight: bold; }--&gt;&lt;/style&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Comment"&gt;#!/usr/bin/env python&lt;/span&gt;&lt;br /&gt;&lt;span class="Comment"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="PreProc"&gt;import&lt;/span&gt; ply.yacc &lt;span class="Statement"&gt;as&lt;/span&gt; yacc&lt;br /&gt;&lt;span class="PreProc"&gt;from&lt;/span&gt; lexer &lt;span class="PreProc"&gt;import&lt;/span&gt; tokens&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;p_start&lt;/span&gt;(p):&lt;br /&gt;    &lt;span class="Constant"&gt;''' start : NUMBERS foo prod END '''&lt;/span&gt;&lt;br /&gt;    p[&lt;span class="Constant"&gt;0&lt;/span&gt;] = p[&lt;span class="Constant"&gt;1&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;p_prod&lt;/span&gt;(p):&lt;br /&gt;    &lt;span class="Constant"&gt;''' prod : &lt;/span&gt;&lt;span class="Constant"&gt;CONTENT '''&lt;/span&gt;&lt;br /&gt;    p[&lt;span class="Constant"&gt;0&lt;/span&gt;] = p[&lt;span class="Constant"&gt;1&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;def&lt;/span&gt; &lt;span class="Identifier"&gt;p_error&lt;/span&gt;(p):&lt;br /&gt;    &lt;span class="Identifier"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;'Syntax error at line '&lt;/span&gt; + &lt;span class="Identifier"&gt;str&lt;/span&gt;(p.lexer.lineno)&lt;br /&gt;&lt;br /&gt;parser = yacc.yacc()&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;if&lt;/span&gt; __name__ == &lt;span class="Constant"&gt;'__main__'&lt;/span&gt;:&lt;br /&gt;    data = &lt;span class="Constant"&gt;''' 123 foo 321 #endfoo '''&lt;/span&gt;&lt;br /&gt;    parser.parse(data)&lt;br /&gt;&lt;br /&gt;    data = &lt;span class="Constant"&gt;''' 123 foo bla bla bla bla #endfoo '''&lt;/span&gt;&lt;br /&gt;    parser.parse(data)&lt;b&gt;&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;/pre&gt;_______________________________________________________&lt;br /&gt;&lt;br /&gt;When &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;foo&lt;/span&gt;&lt;/b&gt; is detected, the DFA entries in a new state (foo state) and will be in this state until &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;#&lt;/b&gt;&lt;b&gt;endfoo&lt;/b&gt;&lt;/span&gt; is detected. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;References&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;[1] &lt;a href="http://snatverk.blogspot.com/search/?q=ply"&gt;Previous entries for PLY&lt;/a&gt;&lt;br /&gt;[2] PLY webpage: &lt;a href="http://www.dabeaz.com/ply/"&gt;http://www.dabeaz.com/ply/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-8104671856776064683?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/8104671856776064683/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2012/01/how-to-work-with-states-in-ply.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8104671856776064683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8104671856776064683'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2012/01/how-to-work-with-states-in-ply.html' title='How to work with states in PLY'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-2617073141898950970</id><published>2011-09-25T21:48:00.000+01:00</published><updated>2012-01-09T18:56:23.793Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='dyndns'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='servers'/><title type='text'>How to configure a public ssh with dyndns?</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/-xW_5PTElvsE/Tn-S-eWKpRI/AAAAAAAABUw/_1xzGQ_Hq4Y/s1600/ssh.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-xW_5PTElvsE/Tn-S-eWKpRI/AAAAAAAABUw/_1xzGQ_Hq4Y/s1600/ssh.png" /&gt;&lt;/a&gt;If you want a web server, ssh, ftp or any other service, you usually need a static IP. So, you have two options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; To pay for a static IP with your ISP&lt;/li&gt;&lt;li&gt;To use a dynamic DNS. Yes, dynamic DNS.&lt;/li&gt;&lt;/ul&gt;A few weeks ago, I wanted to install and configure a public ssh in my computer with dyndns. This weekend I have done it. In this post, I will show you how I did it. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;1. Create an account in DynDNS&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;There are several providers that offer Dynamic DNS. One of best known is &lt;a href="http://dyn.com/dns/"&gt;DynDNS&lt;/a&gt;.&amp;nbsp; This site offers a free DNS until 2 hosts. You have to register and create a new host. This host is a name (under dyndns domain - *.dyndns-blog.com) which you have to connect. Other option is to create a new domain.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;2. To install a virtual machine with Ubuntu&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I have installed an Ubuntu server in a virtual machine. This is going to be my ssh server. So, you have to install at least openssh such as additional packages in the installation of ubuntu server.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Then you have to set up a static IP inside of your private network. For example, you can set up the IP 192.168.1.200. So you have to edit &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/etc/network/interface &lt;/span&gt;file and add the static IP. &lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;# The primary network interface&lt;br /&gt;auto eth0&lt;br /&gt;iface eth0 inet static&lt;br /&gt;address 192.168.1.200&lt;br /&gt;netmask 255.255.255.0&lt;br /&gt;gateway 192.168.1.1&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;To ensure that virtual machine is well installed&amp;nbsp; and configured, you can reboot the virtual machine and try to connect from the phishical computer or other virtual machine. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;&amp;nbsp;3. Configure ddclient&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Ddclient&lt;/b&gt; is a Perl client used to update dynamic DNS entries for accountson Dynamic DNS Network Services' free DNS service. The configuration is very simple. &lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;$ sudo apt-get install ddclient&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;During the installation, the installer will ask us for username, password and the Dynamic DNS service provider. In linhost there is a complete tutorial to configure it. &lt;a href="http://linhost.info/2008/12/ddclient-set-up-for-ubuntu/"&gt;http://linhost.info/2008/12/ddclient-set-up-for-ubuntu/&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Other posibility is to configure in the router instead of ddclient on server. Nowadays, routers have this service by default. You only need is to enable it.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;4. Router &lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;And finally, we have to activate the ssh port in the router and redirect the 22 port to virtual machine. This was a headache, because my router is special (Telefónica). &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In resume we need to activate ssh service from WAN. In this point you can activate for example, Web Server (port 80) or any other. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Then you need to redirect the ports to virtual machine. In my case, I had to add an additional entry to NAT with port 22 to 192.168.1.200. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;References&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;DynDNS: &lt;a href="http://dyn.com/dns/dyndns-free/"&gt;http://dyn.com/dns/dyndns-free/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Ubuntu help: &lt;a href="https://help.ubuntu.com/community/DynamicDNS"&gt;https://help.ubuntu.com/community/DynamicDNS&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-2617073141898950970?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/2617073141898950970/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/09/how-to-configure-public-ssh-with-dyndns.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2617073141898950970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2617073141898950970'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/09/how-to-configure-public-ssh-with-dyndns.html' title='How to configure a public ssh with dyndns?'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-xW_5PTElvsE/Tn-S-eWKpRI/AAAAAAAABUw/_1xzGQ_Hq4Y/s72-c/ssh.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-9041510246440719950</id><published>2011-07-28T22:12:00.003+01:00</published><updated>2011-07-28T22:31:25.578+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>GRID::Machine</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;b&gt;GRID::Machine&lt;/b&gt; is a perl module for Remote Procedure Calls over a SSH link. With this module, we can create, change directories, run remote programs, run perl functions, copy and compile with &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;make&lt;/span&gt;&lt;/b&gt; automatically &lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps" title="Haz clic para obtener otras posibles traducciones"&gt;among other things.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Note that in the other machine is possible that GRID::Machine module does not installed. &lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps" title="Haz clic para obtener otras posibles traducciones"&gt;Moreover&lt;/span&gt;&lt;span class="" title="Haz clic para obtener otras posibles traducciones"&gt;, they may be&lt;/span&gt; &lt;span class="hps" title="Haz clic para obtener otras posibles traducciones"&gt;different versions. This is very useful, especially in heterogeneous systems.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;How to install?&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;GRID::Machine is available from CPAN. So, you can install it with cpan command or cpanm.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$&lt;/span&gt; cpanm GRID::Machine&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;Then you can check if the module was installed properly:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ perl -MGRID::Machine -e 1&lt;/span&gt; &lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The following code is a very simple example to show this module. We have a list of machines and we want to run &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ps command&lt;/span&gt; for each machine.&amp;nbsp; After we create the GRID Machine object, we can write a subrutine. This function will be ran in the other machine. In this example, we print the host and finally we print the result.&lt;/div&gt;&lt;br /&gt;_________________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: yellow;"&gt; 1 &lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;#!/usr/bin/perl&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;2 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;use strict&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;3 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;use &lt;/span&gt;GRID::Machine;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;4 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;5 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;&lt;b&gt;# List of machines&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;6 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;my&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;@machines&lt;/b&gt;&lt;/span&gt;&amp;nbsp;= &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;qw/&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&amp;nbsp;localhost lab1 &lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;/&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;7 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;my&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;%m&lt;/b&gt;&lt;/span&gt;&amp;nbsp;= {};&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;8 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;9 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #8080ff;"&gt;&lt;b&gt;@machines&lt;/b&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: yellow;"&gt;10 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;print&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;Creating object: &lt;/b&gt;&lt;/span&gt;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$_&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;\n&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: yellow;"&gt;11 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;my&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$gm&lt;/b&gt;&lt;/span&gt;&amp;nbsp;= GRID::Machine-&amp;gt;&lt;span style="color: #ff6060;"&gt;new&lt;/span&gt;(&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;host&lt;/b&gt;&lt;/span&gt;=&amp;gt;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$_&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;uses&lt;/b&gt;&lt;/span&gt;=&amp;gt;[&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;qw(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;Sys::Hostname&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;]);&lt;br /&gt;&lt;span style="color: yellow;"&gt;12 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;&lt;b&gt;# We can installed a perl subrutine &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;13 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$gm&lt;/b&gt;&lt;/span&gt;-&amp;gt;&lt;span style="color: #ff6060;"&gt;sub&lt;/span&gt;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;hostname&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;=&amp;gt; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;q&lt;/b&gt;&lt;/span&gt;{&lt;br /&gt;&lt;span style="color: yellow;"&gt;14 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;print&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&amp;nbsp;----------- Machine: &lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;.hostname().&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&amp;nbsp;---------&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;\n&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: yellow;"&gt;15 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&lt;span style="color: yellow;"&gt;16 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$m&lt;/b&gt;&lt;/span&gt;{&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$_&lt;/b&gt;&lt;/span&gt;} = &lt;span style="color: #8080ff;"&gt;&lt;b&gt;$gm&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: yellow;"&gt;17 &lt;/span&gt;}&lt;br /&gt;&lt;span style="color: yellow;"&gt;18 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;19 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;&lt;b&gt;# ...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;20 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;21 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;&lt;b&gt;# Now, we run ps command for all machines&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;22 &lt;/span&gt;&lt;span style="color: #ff6060;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #8080ff;"&gt;&lt;b&gt;@machines&lt;/b&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: yellow;"&gt;23 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;print&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;\n&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: yellow;"&gt;24 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;print&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$m&lt;/b&gt;&lt;/span&gt;{&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$_&lt;/b&gt;&lt;/span&gt;}-&amp;gt;hostname();&lt;br /&gt;&lt;span style="color: yellow;"&gt;25 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;print&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$m&lt;/b&gt;&lt;/span&gt;{&lt;span style="color: #8080ff;"&gt;&lt;b&gt;$_&lt;/b&gt;&lt;/span&gt;}-&amp;gt;&lt;span style="color: #ff6060;"&gt;system&lt;/span&gt;(&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;ps --sort -pcpu aux&amp;nbsp;&amp;nbsp;| head -n 10&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: yellow;"&gt;26 &lt;/span&gt;}&lt;br /&gt;&lt;span style="color: yellow;"&gt;27 &lt;/span&gt;&lt;/span&gt;________________________________________________________&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;References&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/%7Ecasiano/GRID-Machine-0.127/lib/GRID/Machine.pod"&gt;CPAN: GRID::Machine&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://nereida.deioc.ull.es/%7Epp2/perlexamples/node122.html"&gt;A complete example to solve PI problem with GRID::Machine&lt;/a&gt;. (spanish)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-9041510246440719950?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/9041510246440719950/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/07/gridmachine-module.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/9041510246440719950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/9041510246440719950'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/07/gridmachine-module.html' title='GRID::Machine'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-1343399664155225712</id><published>2011-07-25T14:01:00.000+01:00</published><updated>2011-07-25T14:01:51.351+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pythonbrew'/><title type='text'>Pythonbrew</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;b&gt;pythonbrew&lt;/b&gt; is a program to automate the building and installation of python in the users HOME. Pythonbrew is inspired by perlbrew, that we have just commented in a previous post. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The &lt;b&gt;installation&lt;/b&gt; is very simple, actually, is like perlbrew.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$&lt;/span&gt; curl -kLO http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install&lt;br /&gt;$ chmod +x pythonbrew-install&lt;br /&gt;$./pythonbrew-install&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This installation is in &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$HOME&lt;/span&gt; by default. If you want to install in other directory, we will need to set &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;PYTHONBREW_ROOT&lt;/span&gt; variable. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Now, we can install any python version. For instance:&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$&lt;/span&gt; pythonbrew install 3.2&lt;br /&gt;$ pythonbrew use 3.2 &amp;nbsp; &lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Some useful commands:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;pythonbrew use&lt;/i&gt;&amp;nbsp;&amp;nbsp; : Switch a particular version in a current session.&lt;/li&gt;&lt;li&gt;&lt;i&gt;pythonbrew switch&lt;/i&gt;: change system python version.&amp;nbsp;&lt;/li&gt;&lt;li&gt; &lt;i&gt;pythonbrew update&lt;/i&gt;: It updates pythonbrew version&lt;/li&gt;&lt;li&gt;&lt;i&gt;pythonbrew list&lt;/i&gt;: It shows a list with all python installed.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;References&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pypi.python.org/pypi/pythonbrew/0.7.2"&gt;Pythonbrew website&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/4725769270409658023-1343399664155225712?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/1343399664155225712/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/07/pythonbrew.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1343399664155225712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1343399664155225712'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/07/pythonbrew.html' title='Pythonbrew'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-2817677629946145580</id><published>2011-07-22T19:15:00.000+01:00</published><updated>2011-07-22T19:15:10.551+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cpanm'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perlbrew and cpanm</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;b&gt;Perlbrew&lt;/b&gt; is a software to install multiple perl versions in our system without root permissions. Perlbrew is installed in&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$HOME&lt;/span&gt; or in any directory of our file system (for example /opt/soft/perlbrew) with a simple environment variable.&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Installing perlbrew&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Perlbrew  is very simple to install and configure it. In the first reference is explained how to install perlbrew in $HOME. So, I am going to explain a root installation/configuration. &lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black; font-size: small;"&gt;$ sudo su - &lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;# export &lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span id="internal-source-marker_0.25927865875224965" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;PERLBREW_ROOT=/opt/perlbrew&lt;/span&gt;&lt;/span&gt;&lt;span id="internal-source-marker_0.25927865875224965" style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;span id="internal-source-marker_0.25927865875224965" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;# &lt;/span&gt;&lt;span id="internal-source-marker_0.25927865875224965" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;curl -L http://xrl.us/perlbrewinstall | bash&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span id="internal-source-marker_0.25927865875224965" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Perlbrew will install in &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/opt/perlbrew&lt;/span&gt; directory. Now, we need some environment variables. For root, we only need the next line in the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;~/.bashrc&lt;/span&gt; file.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;#.bashrc file&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;source /opt/perlbrew/etc/bashrc &lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Now, we can install a particular perl version. For example:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black; font-size: small;"&gt;$ perlbrew install perl-5.14.1&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Now, the rest of system users need some environment variables to use perlbrew.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# File .bashrc of any user. &lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;source /opt/perlbrew/etc/bashrc&lt;br /&gt;PATH=/opt/perlbrew/bin/:$PATH&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;If we have a system with a lot of users and we haven't enough space, this would be a way to install and configure it. &lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Installing cpanm&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;The next step would be configure cpan for each perl version. Instead of to do that, we&amp;nbsp; can install cpanm (cpan minus) and to save time. We can install cpanm with perlbrew directly or with the source package.&lt;/div&gt;&lt;br /&gt;For example, we switch to perl 5.14 (&lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps" title="Haz clic para obtener otras posibles traducciones"&gt;previously installed)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. With perlbrew:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ perlbrew switch perl-5.14.1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ &lt;/span&gt;perlbrew install-cpanm&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;2. Downloading the package:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ perlbrew switch perl-5.14.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span id="internal-source-marker_0.474662423500428" style="background-color: transparent; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;$ curl -L&lt;/span&gt;&lt;a href="http://cpanmin.us/" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;span style="background-color: transparent; color: #000099; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://cpanmin.us&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color: transparent; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; | perl - App::cpanminus&lt;/span&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Install a perl module:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ cpanm GRID::Machine&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;References&lt;/b&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/%7Egugod/App-perlbrew-0.27/lib/App/perlbrew.pm"&gt;Perlbrew cpan&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/dist/App-cpanminus/bin/cpanm"&gt;Cpanm&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-2817677629946145580?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/2817677629946145580/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/07/perlbrew-and-cpanm.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2817677629946145580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2817677629946145580'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/07/perlbrew-and-cpanm.html' title='Perlbrew and cpanm'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-2975488468231751423</id><published>2011-07-09T19:53:00.000+01:00</published><updated>2011-07-09T19:53:54.991+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnu'/><category scheme='http://www.blogger.com/atom/ns#' term='modules'/><title type='text'>Modules</title><content type='html'>&lt;div style="text-align: justify;"&gt;The Environment Modules package provides for the dynamic modification           of a user's environment via modulefiles. For example, we can have two o more gcc versions (gcc 4.3.5, gcc.4.6.0, etc). With a single command, we can use the appropriate gcc version.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;For instance:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ module list&lt;br /&gt;Currently Loaded Modulefiles:&lt;br /&gt;&amp;nbsp; 1) /java/sun1.6&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ module load gcc/4.6.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ module list&lt;br /&gt;Currently Loaded Modulefiles:&lt;br /&gt;&amp;nbsp; 1) /java/sun1.6&amp;nbsp;&amp;nbsp; 2) /gcc/4.6.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ gcc --version&lt;br /&gt;gcc (GCC) 4.6.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ module del gcc&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ gcc --version&lt;br /&gt;gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;The last line shows the gcc system version. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;How to install?&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Modules depends to tcl. If we have an ubuntu system, we need to install tcl8.4-dev (ubuntu package). &lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install &lt;/span&gt;tcl8.4-dev&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;We download the program and install.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ wget&amp;nbsp; http://sourceforge.net/projects/modules/files/Modules/modules-3.2.8/modules-3.2.8a.tar.gz&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ tar xvzf &lt;/span&gt;&lt;span style="color: black;"&gt;modules-3.2.8a.tar.gz&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ cd&amp;nbsp; &lt;/span&gt;&lt;span style="color: black;"&gt;modules-3.2.8a&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ ./configure&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ make&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ sudo make install&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Then we have to run &lt;b&gt;add.modules&lt;/b&gt; program in &lt;b&gt;/usr/local/Modules/3.2.8/bin/&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo /&lt;/span&gt;usr/local/Modules/3.2.8/bin/add.modules&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;This program will update PATH to module program and will add the information to skel user file.&lt;/div&gt;&lt;br /&gt;Then, we have to create a soft link from Modules directory to bin directory.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ cd /usr/local/Modules &lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ &lt;/span&gt;sudo ln -s 3.2.8/bin/&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Finally, we need to set the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MODULEPATH&lt;/span&gt; variable in&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;~/.bashrc&lt;/span&gt; file&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# bashrc file&lt;/span&gt;&lt;br /&gt;MODULEPATH=/opt/env/&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;In this directory, we will have all sofware. For instance, gcc, icc, mathlab, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;&amp;nbsp;Configuration&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;We need to create a single configuration file. With this file, we indicate to modules the PATH to find the appropiate files. For example, if we have installed the gcc 4.6.0 in our system:&lt;/div&gt;&lt;br /&gt;______________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #8080ff;"&gt;#%Module -*- tcl -*-&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #8080ff;"&gt;#&lt;/span&gt;&lt;br /&gt;proc ModulesHelp { } {&lt;br /&gt;&amp;nbsp; puts stderr &lt;span style="color: #ff6060;"&gt;"\tThis module loads GNU gcc environment variables."&lt;/span&gt;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;module-whatis&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff6060;"&gt;"Loads GNU gcc environment."&lt;/span&gt;&amp;nbsp;&lt;br /&gt;conflict icc&lt;br /&gt;conflict ifort&lt;br /&gt;&lt;br /&gt;prepend-path PATH &lt;span style="color: #ff6060;"&gt;"/opt/envhpc/gcc-4.6.0/bin"&lt;/span&gt;&amp;nbsp;&lt;br /&gt;prepend-path LD_LIBRARY_PATH &lt;span style="color: #ff6060;"&gt;"/opt/envhpc/gcc-4.6.0/lib"&lt;/span&gt;&amp;nbsp;&lt;br /&gt;prepend-path LD_LIBRARY_PATH &lt;span style="color: #ff6060;"&gt;"/opt/envhpc/gcc-4.6.0/lib64"&lt;/span&gt;&amp;nbsp;&lt;br /&gt;prepend-path LD_LIBRARY_PATH &lt;span style="color: #ff6060;"&gt;"/opt/envhpc/mpc/0.9/lib"&lt;/span&gt;&amp;nbsp;&lt;br /&gt;prepend-path LD_LIBRARY_PATH &lt;span style="color: #ff6060;"&gt;"/opt/envhpc/mpfr/3.0.1/lib"&lt;/span&gt;&amp;nbsp;&lt;br /&gt;prepend-path LD_LIBRARY_PATH &lt;span style="color: #ff6060;"&gt;"/opt/envhpc/gmp/5.0.2/lib"&lt;/span&gt;&amp;nbsp;&lt;br /&gt;prepend-path MANPATH &lt;span style="color: #ff6060;"&gt;"/opt/envhpc/gcc-4.6.0/man"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;setenv CC gcc&lt;br /&gt;setenv CXX g++&lt;br /&gt;setenv F77 gfortran&lt;br /&gt;setenv F90 gfortran&lt;br /&gt;&lt;/pre&gt;______________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A complete Tcl code reference is in manual 4 of modules. See reference section to&amp;nbsp; find more information. With &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;module avail&lt;/span&gt; command and m&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;odule add/delete&lt;/span&gt;, we can load and unload a particular version. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;References&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://modules.sourceforge.net/"&gt;Environment modules&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://modules.sourceforge.net/man/module.html"&gt;Manual (1)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://modules.sourceforge.net/man/modulefile.html"&gt;Manual (4) : syntax and examples for tcl files.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-2975488468231751423?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/2975488468231751423/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/07/modules.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2975488468231751423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2975488468231751423'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/07/modules.html' title='Modules'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-1122229642748290264</id><published>2011-07-04T23:05:00.000+01:00</published><updated>2011-07-04T23:05:35.970+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Instalación de gcc en linux</title><content type='html'>Para instalar una nueva versión de GCC nuevo se necesitan algunas librerías: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;libmpfr&lt;/li&gt;&lt;li&gt;GNU Multiple Precision Library (GMP)&amp;nbsp; &lt;/li&gt;&lt;li&gt;MPC Library version 0.8.1&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Depende del sistema operativo que tengamos y de la versión que queramos instalar se necesitarán más o menos librerías. Por ejemplo, Ubuntu, suele traer muchas de estas librerías instaladas por defecto. Por otra parte, se necesita una versión de estas librerías acorde a una determinada versión de gcc, pero, en el caso de que no se tenga, se puede proporcionar dentro del directorio tar.gz del código fuente de gcc y descomprimido en un directorio con el mismo nombre de la librería. En el momento del configure sabe de dónde cogerlo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Nos bajamos el tar.gz del core de gcc (o gcc + g++ + fortran). Descomprimimos el tar.gz y luego creamos otro directorio aparte (build o cualquier otro nombre) que servirá para hacer el configure y el make. En la instalación de gcc no se puede hacer el configure y el make en el mismo directorio del fuente porque da un error, pero parece que algunas distribuciones como Ubuntu saben resolver estos conflictos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ tar xvzf &lt;/span&gt;&lt;span style="color: black;"&gt;gcc-core-4.6.0.tar.gz&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ mkdir build&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Por ejemplo, para la versión 4.6.0:&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ cd ~ &lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ wget http://gcc.skazkaforyou.com/releases/gcc-4.6.0/gcc-core-4.6.0.tar.gz&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Hacemos lo mismo con el código de C++/Fortran, etc. Descomprimimos y creamos el directorio build&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ cd ~&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ mkdir gcc&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ cd gcc&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ tar xvzf &lt;/span&gt;&lt;span style="color: black;"&gt;gcc-core-4.6.0.tar.gz&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ mkdir build&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Desde este directorio hacemos el configure y el make:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;$ ../gcc-4.6.0/configure --prefix=/opt/gcc4.6 --enable-languages=c,c++,fortran &lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Si hemos instalado todas las librarías necesarias, se nos creará en el directorio build el makefile. Por lo que hacemos:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;$ make -j 2&amp;nbsp;&amp;nbsp; # si tenemos 2 cores&lt;br /&gt;# make install&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si combinamos esta forma de instalación con el programa &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;modules&lt;/span&gt; de GNU, podemos tener en nuestro sistema varias versiones de gcc disponibles. &lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Referencias&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;GCC: &lt;a href="http://gcc.gnu.org/%20"&gt;http://gcc.gnu.org/ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;Prerequisitos: &lt;a href="http://gcc.gnu.org/install/prerequisites.html"&gt;http://gcc.gnu.org/install/prerequisites.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Configuración: &lt;a href="http://gcc.gnu.org/install/configure.html"&gt;http://gcc.gnu.org/install/configure.html&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/4725769270409658023-1122229642748290264?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/1122229642748290264/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/07/instalacion-de-gcc-en-linux.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1122229642748290264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1122229642748290264'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/07/instalacion-de-gcc-en-linux.html' title='Instalación de gcc en linux'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-1961790855946757624</id><published>2011-04-21T19:30:00.003+01:00</published><updated>2011-04-23T12:31:22.911+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Generar ficheros excel con Python</title><content type='html'>&lt;article id="project-description"&gt;     &lt;/article&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://sourceforge.net/projects/pyexcelerator/"&gt;pyExcelerator&lt;/a&gt; es un módulo Python creado por Roman V. Kiseliov para escribir y leer datos en formato excel. Se necesita una versión superior a la 2.4 de python. La ventaja (opinión) de usar este módulo frente a otros como CSV, es que permite formatos unicode, se lee/escribe bien tanto en OpenOffice como en Microsoft Office y tiene una API muy sencilla.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Instalar módulo en Ubuntu&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;$ sudo apt-get install python-excelerator&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Lo básico&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez instalado, vamos a lo básico. Comenzaremos por escribir algo. Decir que, si nos descargamos el módulo en &lt;a href="http://sourceforge.net/projects/pyexcelerator/"&gt;http://sourceforge.net/projects/pyexcelerator/&lt;/a&gt; , en él hay muchísimos ejemplos que nos pueden servir de guía para lo que queramos hacer. &lt;/div&gt;&lt;br /&gt;____________________________________________&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #ff40ff;"&gt;from&lt;/span&gt;&amp;nbsp;pyExcelerator &lt;span style="color: #ff40ff;"&gt;import&lt;/span&gt;&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8080ff;"&gt;# Instance the objects&lt;/span&gt;&lt;br /&gt;workbook = Workbook()&lt;br /&gt;worksheet = workbook.add_sheet(&lt;span style="color: #ff6060;"&gt;"my first sheet"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8080ff;"&gt;# Write a row&lt;/span&gt;&lt;br /&gt;worksheet.write(&lt;span style="color: #ff6060;"&gt;1&lt;/span&gt;, &lt;span style="color: #ff6060;"&gt;1&lt;/span&gt;, &lt;span style="color: #ff6060;"&gt;"Example"&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #8080ff;"&gt;# Save the content&lt;/span&gt;&lt;br /&gt;workbook.save(&lt;span style="color: #ff6060;"&gt;'file.xls'&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;______________________________________&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Lo que se hace es, instanciar un libro de trabajo y una hoja. Podemos&amp;nbsp; crear tantas hojas de trabajo como queramos. A continuación escribimos en la posición (1,1) la palabra &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Example&lt;/span&gt; y guardamos con el nombre file.xls.&amp;nbsp; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Dar formato&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;También podemos escribir con distintos tipos de letra, colores, cursiva, etc. Esto lo podemos hacer mediante la clase Font del módulo. Con el font, le indicamos todas las propiedades necesarias.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;______________________________________&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: #ff40ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #ff40ff;"&gt;from&lt;/span&gt;&amp;nbsp;pyExcelerator &lt;span style="color: #ff40ff;"&gt;import&lt;/span&gt;&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8080ff;"&gt;# Instance the objects&lt;/span&gt;&lt;br /&gt;workbook = Workbook()&lt;br /&gt;worksheet = workbook.add_sheet(&lt;span style="color: #ff6060;"&gt;"my first sheet"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8080ff;"&gt;# Style&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;font = Font()&lt;br /&gt;font.name&amp;nbsp;&amp;nbsp;= &lt;span style="color: #ff6060;"&gt;"Arial"&lt;/span&gt;&lt;br /&gt;font.colour_index = &lt;span style="color: #ff6060;"&gt;1&lt;/span&gt;&lt;br /&gt;font.bold = &lt;span style="color: cyan;"&gt;True&lt;/span&gt;&lt;br /&gt;style = XFStyle()&lt;br /&gt;style.font = font&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8080ff;"&gt;# Write&lt;/span&gt;&lt;br /&gt;worksheet.write(&lt;span style="color: #ff6060;"&gt;1&lt;/span&gt;, &lt;span style="color: #ff6060;"&gt;1&lt;/span&gt;, &lt;span style="color: #ff6060;"&gt;"Example"&lt;/span&gt;, style)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #8080ff;"&gt;# Save the content&lt;/span&gt;&lt;br /&gt;workbook.save(&lt;span style="color: #ff6060;"&gt;'file.xls'&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;______________________________________&lt;br /&gt;&lt;br /&gt;Esto también se puede hacer sobre el objeto style, puesto que internamente usa Font. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Leer a formato CSV&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para leer y poder procesar los datos, usamos la función parse_xls, a la que le pasamos un fichero y la codificación, que puede ser utf-8. Esta función, retorna todas las hojas worksheet y sus valores, por lo que tenemos que recorrerlas y por ejemplo, insertarlas en una matriz. A continuación se lista un ejemplo completo de como hacer esto. El siguiente código es una adaptación del código del autor del directorio examples.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Ejemplo completo&lt;/b&gt;&lt;/div&gt;______________________________________&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: #ff6060;"&gt;&lt;b&gt;# -*- coding: utf-8 -*-&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #ff6060;"&gt;&lt;b&gt;# This example was adapted from&lt;span style="color: #ff40ff;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&lt;span style="color: #cc0000;"&gt;Roman V. Kiseliov&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #ff6060;"&gt;&lt;b&gt;# in examples section project&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&amp;nbsp;pyExcelerator &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6060;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;Excel&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: #8080ff;"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;__init__&lt;/b&gt;&lt;/span&gt;(self, name_space=&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'0'&lt;/b&gt;&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.column = &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.row = &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.workbook = Workbook()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.worksheet = self.workbook.add_sheet(name_space)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;write_row&lt;/b&gt;&lt;/span&gt;(self, content):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.column = &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;for&lt;/span&gt;&amp;nbsp;i &lt;span style="color: #ff6060;"&gt;in&lt;/span&gt;&amp;nbsp;content:&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;self.worksheet.write(self.row, self.column, i)&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;self.column += &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.row += &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;write_with_format&lt;/b&gt;&lt;/span&gt;(self, content, bold=&lt;span style="color: #8080ff;"&gt;&lt;b&gt;False&lt;/b&gt;&lt;/span&gt;, name=&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'Arial'&lt;/b&gt;&lt;/span&gt;, colour_index=&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font = Font()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font.name = name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font.colour_index = colour_index&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font.bold = bold&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;style = XFStyle()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;style.font = font&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.column = &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;for&lt;/span&gt;&amp;nbsp;i &lt;span style="color: #ff6060;"&gt;in&lt;/span&gt;&amp;nbsp;content:&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;self.worksheet.write(self.row, self.column, i, style)&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;self.column += &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.row += &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;save&lt;/b&gt;&lt;/span&gt;(self, filename=&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'file.xls'&lt;/b&gt;&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.workbook.save(filename)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;@&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;classmethod&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;read&lt;/b&gt;&lt;/span&gt;(self, filename, coding=&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'utf-8'&lt;/b&gt;&lt;/span&gt;, verbose=&lt;span style="color: #8080ff;"&gt;&lt;b&gt;False&lt;/b&gt;&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;for&lt;/span&gt;&amp;nbsp;sheet_name, values &lt;span style="color: #ff6060;"&gt;in&lt;/span&gt;&amp;nbsp;parse_xls(filename, coding):&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;matrix = [[]]&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;span style="color: #ff6060;"&gt;if&lt;/span&gt;&amp;nbsp;verbose:&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;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'Sheet = "%s"'&lt;/b&gt;&lt;/span&gt;&amp;nbsp;% sheet_name.encode(coding,&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'backslashreplace'&lt;/b&gt;&lt;/span&gt;)&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;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'----------------'&lt;/b&gt;&lt;/span&gt;&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;span style="color: #ff6060;"&gt;for&lt;/span&gt;&amp;nbsp;row_idx, col_idx &lt;span style="color: #ff6060;"&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;sorted&lt;/b&gt;&lt;/span&gt;(values.keys()):&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;v = values[(row_idx, col_idx)]&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;&lt;span style="color: #ff6060;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;isinstance&lt;/b&gt;&lt;/span&gt;(v, &lt;span style="color: #8080ff;"&gt;&lt;b&gt;unicode&lt;/b&gt;&lt;/span&gt;):&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;v = v.encode(coding, &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'backslashreplace'&lt;/b&gt;&lt;/span&gt;)&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;&lt;span style="color: #ff6060;"&gt;else&lt;/span&gt;:&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;v = `v`&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;v = &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'%s'&lt;/b&gt;&lt;/span&gt;&amp;nbsp;% v.strip()&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;last_row, last_col = &lt;span style="color: #8080ff;"&gt;&lt;b&gt;len&lt;/b&gt;&lt;/span&gt;(matrix), &lt;span style="color: #8080ff;"&gt;&lt;b&gt;len&lt;/b&gt;&lt;/span&gt;(matrix[-&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;])&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;&lt;span style="color: #ff6060;"&gt;while&lt;/span&gt;&amp;nbsp;last_row &amp;lt;= row_idx:&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;matrix.extend([[]])&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;last_row = &lt;span style="color: #8080ff;"&gt;&lt;b&gt;len&lt;/b&gt;&lt;/span&gt;(matrix)&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;&lt;span style="color: #ff6060;"&gt;while&lt;/span&gt;&amp;nbsp;last_col &amp;lt; col_idx:&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;matrix[-&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;].extend([&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;''&lt;/b&gt;&lt;/span&gt;])&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;last_col = &lt;span style="color: #8080ff;"&gt;&lt;b&gt;len&lt;/b&gt;&lt;/span&gt;(matrix[-&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;])&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;matrix[-&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;].extend([v] &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;span style="color: #ff6060;"&gt;if&lt;/span&gt;&amp;nbsp;verbose:&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;&lt;span style="color: #ff6060;"&gt;for&lt;/span&gt;&amp;nbsp;row &lt;span style="color: #ff6060;"&gt;in&lt;/span&gt;&amp;nbsp;matrix:&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;csv_row = &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;', '&lt;/b&gt;&lt;/span&gt;.join(row)&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;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;csv_row&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;return&lt;/span&gt;&amp;nbsp;matrix&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6060;"&gt;if&lt;/span&gt;&amp;nbsp;__name__ == &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'__main__'&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'Generando xls ........... '&lt;/b&gt;&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header = [&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'Nombre'&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'Apellidos'&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'DNI'&lt;/b&gt;&lt;/span&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;excel = Excel()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;excel.write_with_format(header, bold=&lt;span style="color: #8080ff;"&gt;&lt;b&gt;True&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datos = [&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;u'Tutú'&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;u'Tiñi'&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'1239812H'&lt;/b&gt;&lt;/span&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;excel.write_row(datos)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datos = [&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;u'Kaká'&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;u'Asd'&lt;/b&gt;&lt;/span&gt;, &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'8712382H'&lt;/b&gt;&lt;/span&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;excel.write_row(datos)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;excel.save()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'ok'&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'Leyendo datos ........... '&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Excel.read(&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'file.xls'&lt;/b&gt;&lt;/span&gt;, verbose=&lt;span style="color: #8080ff;"&gt;&lt;b&gt;True&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'................... ok '&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;______________________________________&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Este módulo contiene muchísimas más cosas. Escritura de fórmulas, imágenes, estilos, conversión a html, etc. En la sección de ejemplos del proyecto se puede ver en detalle todo esto.&amp;nbsp; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Referencias&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/pyexcelerator/"&gt;pyExcelerator project&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/4725769270409658023-1961790855946757624?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/1961790855946757624/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/04/generar-ficheros-excel-con-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1961790855946757624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1961790855946757624'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/04/generar-ficheros-excel-con-python.html' title='Generar ficheros excel con Python'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-4716310702829047824</id><published>2011-03-06T20:12:00.002Z</published><updated>2011-04-23T12:32:43.766+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python: análisis de cubrimiento de código</title><content type='html'>&lt;div style="text-align: justify;"&gt;Una herramienta muy potente que tiene perl es el módulo Devel::Cover. Para python hay un módulo equivalente, &lt;b&gt;coverage&lt;/b&gt;. Este tipo de programas, lo que hace es un análisis de cubrimiento de código, orientado sobre todo a los test. Esto es muy útil para saber si nuestros test de la aplicación cubren la totalidad del código (caso ideal) y si no, cuanto nos falta para llegar a ello, resaltando las partes de código ejecutadas y las que no. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para instalarlo, podemos bajarnos las fuentes y compilarlas o usar el repositorio.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install python-coverage&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Es un programa muy fácil de usar. El programa dispone de una pequeña ayuda:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ python-coverage help&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;Coverage.py, version 3.2&lt;br /&gt;Measure, collect, and report on code coverage in Python programs.&lt;br /&gt;&lt;br /&gt;usage: coverage &lt;command&gt; [options] [args]&lt;br /&gt;&lt;br /&gt;Commands:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; annotate&amp;nbsp;&amp;nbsp;&amp;nbsp; Annotate source files with execution information.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; combine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Combine a number of data files.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; erase&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Erase previously collected coverage data.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; help&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get help on using coverage.py.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; html&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create an HTML report.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; report&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Report coverage stats on modules.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Run a Python program and measure code execution.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create an XML report of coverage results.&lt;br /&gt;&lt;br /&gt;Use "coverage help &lt;command&gt;" for detailed help on any command.&lt;br /&gt;Use "coverage help classic" for help on older command syntax.&lt;br /&gt;For more information, see http://nedbatchelder.com/code/coverage&lt;br /&gt;&lt;/command&gt;&lt;/command&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Generación de informes&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Lo primero que tenemos que hacer es ejecutar el programa. Esto lo que hará es generar un fichero .coverage con la información de cubrimiento. &lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ python-coverage run example02.py&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Para ver los resultados, usamos la opción report:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$&amp;nbsp; python-coverage report -m example02.py &lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stmts&amp;nbsp;&amp;nbsp; Exec&amp;nbsp; Cover&amp;nbsp;&amp;nbsp; Missing&lt;br /&gt;-----------------------------------------&lt;br /&gt;example02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14&amp;nbsp;&amp;nbsp; 100%&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Luego podemos generar el fichero html:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ python-coverage html -d coverhtml&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ firefox coverhtml/index.html&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Usar la API&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Esto no acaba aquí. Si uno quiere, puede hacer un programa para ejecutar el análisis en los puntos del programa que se quiera y luego generar un informe.&lt;br /&gt;&lt;br /&gt;La API está bien explicado, y la verdad, es bastante sencillo.Un ejemplo:&lt;br /&gt;&lt;br /&gt;__________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #ff6060;"&gt;&lt;b&gt;# -*- coding: utf-8 -*-&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&amp;nbsp;coverage&lt;br /&gt;cov = coverage.coverage()&lt;br /&gt;cov.start()&lt;br /&gt;&lt;span style="color: #ff6060;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;cuadrados&lt;/b&gt;&lt;/span&gt;(lista):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;""" Calcula el cuadro de los números de la lista&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;gt;&amp;gt;&amp;gt; l = [&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;gt;&amp;gt; cuadrados(l)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [0, 1, 4, 9]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;"""&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff6060;"&gt;return&lt;/span&gt;&amp;nbsp;[n ** &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ff6060;"&gt;for&lt;/span&gt;&amp;nbsp;n &lt;span style="color: #ff6060;"&gt;in&lt;/span&gt;&amp;nbsp;lista]&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff6060;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #8080ff;"&gt;&lt;b&gt;_test&lt;/b&gt;&lt;/span&gt;():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff40ff;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&amp;nbsp;doctest&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doctest.testmod()&lt;br /&gt;&lt;br /&gt;_test()&lt;br /&gt;&lt;br /&gt;cov.stop()&lt;br /&gt;cov.html_report(directory=&lt;span style="color: #ff40ff;"&gt;&lt;b&gt;'covhtml'&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;_______________________________________________&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ python mycov.py&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;El programa crea un directorio covhtml con los resultados.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://snatverk.blogspot.com/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-ihXal4fc8kw/TXPqWMlCRoI/AAAAAAAABFc/p1DSPis85ps/s1600/cov.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Referencias&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nedbatchelder.com/code/coverage/"&gt;Python-coverage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nedbatchelder.com/code/coverage/api.html#api"&gt;API python-coverage&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/4725769270409658023-4716310702829047824?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/4716310702829047824/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/03/python-analisis-de-cubrimiento-de.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4716310702829047824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4716310702829047824'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/03/python-analisis-de-cubrimiento-de.html' title='Python: análisis de cubrimiento de código'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-ihXal4fc8kw/TXPqWMlCRoI/AAAAAAAABFc/p1DSPis85ps/s72-c/cov.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-8469254790585809648</id><published>2011-02-28T14:58:00.001Z</published><updated>2011-02-28T17:35:13.542Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><title type='text'>Extensión graphlog para Mercurial</title><content type='html'>He encontrado una extensión muy útil en línea de comandos que imprime el log con todas las vías (branchs y clones) por los que ha pasado el proyecto. Es extensión se coloca en el .hgrc dentro de nuestro proyecto.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;[extensions]&lt;br /&gt;hgext.graphlog=&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ahora, usamos la opción glog de mercurial:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg glog&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;@&amp;nbsp;&amp;nbsp;&amp;nbsp; changeset:&amp;nbsp;&amp;nbsp; 434:d407c539f293&lt;br /&gt;|\&amp;nbsp;&amp;nbsp; branch:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c99&lt;br /&gt;| |&amp;nbsp; tag:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tip&lt;br /&gt;| |&amp;nbsp; parent:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 432:e442959c4580&lt;br /&gt;| |&amp;nbsp; parent:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 433:e31e18f8b57d&lt;br /&gt;| |&amp;nbsp; user:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; juanjo&lt;br /&gt;| |&amp;nbsp; summary:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fixed complex type ...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;| |&lt;br /&gt;| o&amp;nbsp; changeset:&amp;nbsp;&amp;nbsp; 433:e31e18f8b57d&lt;br /&gt;| |&amp;nbsp; parent:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 431:19583dce4672&lt;br /&gt;| |&amp;nbsp; user:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ruyman&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;| |&amp;nbsp; date:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sat Feb 26 13:20:31 2011&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;| |&amp;nbsp; summary:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Fixed bug ...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;...&lt;br /&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-8469254790585809648?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/8469254790585809648/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/02/extension-graphics-log-para-mercurial.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8469254790585809648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8469254790585809648'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/02/extension-graphics-log-para-mercurial.html' title='Extensión graphlog para Mercurial'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-1458490702698691890</id><published>2011-01-26T14:43:00.003Z</published><updated>2011-04-04T13:37:53.542+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><title type='text'>Trabajar con branchs en mercurial</title><content type='html'>&lt;div style="text-align: justify;"&gt;Una de las formas de trabajar en paralelo varios desarrolladores es mediante branchs. En mercurial, aparte de tener cada uno su propio clone, también es posible tener una o más ramas independientes. La forma de trabajo es la siguiente:&lt;br /&gt;&lt;br /&gt;Se crea un branch:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg branch new_branch&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Donde new_branch es el nombre que le queremos dar. Para saber en qué branch estamos trabajando, usamos el mismo comando sin argumentos:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg branch&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;new_branch&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ahora, la línea de trabajo es como se muestra en la siguiente figura:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_TAzjkcP2UpE/TUAvLZCUn-I/AAAAAAAABCE/y50V7ortsUA/s1600/branch.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_TAzjkcP2UpE/TUAvLZCUn-I/AAAAAAAABCE/y50V7ortsUA/s1600/branch.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;La forma de trabajo en el branch como si estuviésemos en el default, con la diferencia de que se hacen los commit y los push sin que afecten a la rama principal (default). Entonces, ¿cómo podemos fusionar esos cambios?. Hacemos un merge &lt;b&gt;desde la rama default&lt;/b&gt; hacia el new_branch.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg merge new_branch&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Bajar una rama conmutar entre ellas&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Si queremos hacernos &lt;b&gt;un clon&lt;/b&gt; cuando ya hay ramas creadas, por defecto nos bajaremos la rama default. Para conmutar a otra rama hacemos lo siguiente:&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg branch -f new_branch&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Esto nos sitúa sobre la rama que queremos. Ahora tenemos que actualizar para traernos los últimos cambios:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg update&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;De la misma forma, podemos conmutar de una rama a otra haciendo estos dos pasos.&lt;/div&gt;&lt;br /&gt;Luego, el trabajo normal:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg ci -m "..."&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ hg pull&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ hg push&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Si queremos traernos los cambios de cualquier rama, hacemos un merge con la rama que queremos:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg branch&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;new_branch&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ hg merge default&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Cuando queramos cerrar definitivamente la rama, ejecutamos el commit de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ &lt;/span&gt;hg commit &lt;b&gt;--close-branch&lt;/b&gt; -m 'Branch new_branch closed'&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;&amp;nbsp;Referencias&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Hay un tutorial muy bueno sobre diferentes modos de trabajar con branchs en mercurial, (una de ellas es hacer branch "físicos").&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/"&gt;A guide to Branching in Mercurial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mercurial.selenic.com/wiki/NamedBranches"&gt;http://mercurial.selenic.com/wiki/NamedBranches &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/4725769270409658023-1458490702698691890?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/1458490702698691890/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/01/trabajar-con-branch-en-mercurial.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1458490702698691890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1458490702698691890'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/01/trabajar-con-branch-en-mercurial.html' title='Trabajar con branchs en mercurial'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TAzjkcP2UpE/TUAvLZCUn-I/AAAAAAAABCE/y50V7ortsUA/s72-c/branch.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-2559496801529219151</id><published>2011-01-18T00:49:00.002Z</published><updated>2011-01-18T01:02:46.909Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Añadir hoja de estilo en Django</title><content type='html'>&lt;div style="text-align: justify;"&gt;Para añadir hojas de estilo, el directorio de imágenes y&amp;nbsp; los ficheros javascript de forma que Django sepa dónde está cada cosa y cómo llegar.&amp;nbsp; Una de las formas de resolver esto es la siguiente: suponer que tenemos la siguiente jerarquía de directorios, dentro del proyecto principal. &lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ tree templates/&lt;br /&gt;templates/&lt;br /&gt;|-- css&lt;br /&gt;|-- images&lt;br /&gt;`-- js&lt;br /&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Lo primero que tenemos que hacer es incluir las siguientes URL's en el fichero urls.py:&lt;br /&gt;_______________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="color: blue;"&gt;# Media&lt;/span&gt;&lt;br /&gt;(&lt;span style="color: magenta;"&gt;r'css/(?P&amp;lt;path&amp;gt;.*)$'&lt;/span&gt;, &lt;span style="color: magenta;"&gt;'django.views.static.serve'&lt;/span&gt;,&lt;br /&gt;{&lt;span style="color: magenta;"&gt;'document_root'&lt;/span&gt;: settings.STATIC_ROOT + &lt;span style="color: magenta;"&gt;'templates/css'&lt;/span&gt;}),&lt;br /&gt;(&lt;span style="color: magenta;"&gt;r'images/(?P&amp;lt;path&amp;gt;.*)$'&lt;/span&gt;, &lt;span style="color: magenta;"&gt;'django.views.static.serve'&lt;/span&gt;,&amp;nbsp;&lt;br /&gt;{&lt;span style="color: magenta;"&gt;'document_root'&lt;/span&gt;: settings.STATIC_ROOT + &lt;span style="color: magenta;"&gt;'templates/images'&lt;/span&gt;}),&lt;br /&gt;(&lt;span style="color: magenta;"&gt;r'js/(?P&amp;lt;path&amp;gt;.*)$'&lt;/span&gt;, &lt;span style="color: magenta;"&gt;'django.views.static.serve'&lt;/span&gt;,&lt;br /&gt;{&lt;span style="color: magenta;"&gt;'document_root'&lt;/span&gt;: settings.STATIC_ROOT + &lt;span style="color: magenta;"&gt;'templates/js'&lt;/span&gt;}),&lt;br /&gt;&lt;/pre&gt;_______________________________________________________&lt;br /&gt;&lt;br /&gt;También, tenemos que incluir al inicio del fichero &lt;b&gt;urls.py&lt;/b&gt; el import necesario para usar la variable STATIC_ROOT:&lt;br /&gt;_______________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #a020f0;"&gt;import&lt;/span&gt;&amp;nbsp;settings&lt;/pre&gt;_______________________________________________________&lt;br /&gt;&lt;br /&gt;Ahora, tenemos que definir esta variable en el &lt;b&gt;settings.py&lt;/b&gt;. Lo que haremos es colocarla como la ruta hasta la aplicación: &lt;br /&gt;_______________________________________________________&lt;br /&gt;&lt;pre&gt;STATIC_ROOT = &lt;span style="color: magenta;"&gt;'/path/to/app/'&lt;/span&gt;&lt;/pre&gt;_______________________________________________________&lt;br /&gt;&lt;br /&gt;Y por último, tenemos que actualizar la lista TEMPLATE_DIRS con la url hasta el directorio template:&lt;br /&gt;_______________________________________________________&lt;br /&gt;&lt;pre&gt;STATIC_ROOT + &lt;span style="color: magenta;"&gt;'templates/'&lt;/span&gt;,&lt;/pre&gt;_______________________________________________________&lt;br /&gt;&lt;br /&gt;Con esto, ya tenemos todo le necesario para usar las CSS en nuestra aplicación. Cuando se haga referencia a qué hoja de estilo coger en el html, ésta debe apuntar a la raíz del template, con lo que quedaría así:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;pre id="line1"&gt;&amp;lt;&lt;span class="start-tag"&gt;link&lt;/span&gt;&lt;span class="attribute-name"&gt; href&lt;/span&gt;="&lt;a href="#"&gt;/css/style.css&lt;/a&gt;" &lt;span class="attribute-name"&gt;rel&lt;/span&gt;=&lt;span class="attribute-value"&gt;"stylesheet" &lt;/span&gt;&lt;span class="attribute-name"&gt;type&lt;/span&gt;=&lt;span class="attribute-value"&gt;"text/css"&lt;/span&gt;&lt;span class="attribute-name"&gt;&lt;/span&gt;&lt;span class="attribute-value"&gt;&lt;/span&gt;&lt;span class="error"&gt;&lt;span class="attribute-name"&gt;/&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666;"&gt;&lt;b&gt;&lt;span style="color: white;"&gt;Referencias&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.djangoproject.com/en/1.2/howto/static-files/"&gt;Django-doc&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/4725769270409658023-2559496801529219151?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/2559496801529219151/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/01/anadir-hoja-de-estilo-en-django.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2559496801529219151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2559496801529219151'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/01/anadir-hoja-de-estilo-en-django.html' title='Añadir hoja de estilo en Django'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-2877182487258606250</id><published>2011-01-07T21:00:00.000Z</published><updated>2011-01-07T21:26:07.788Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compiladores'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='ply'/><title type='text'>Parser de mini-C en Python</title><content type='html'>&lt;div style="text-align: justify;"&gt;He estado aprendiendo desde hace algún tiempo un módulo para hacer el lexer y parser de un compilador en Python. Se trata de una herramienta relativamente fácil de usar (comparada con otras como antlr) y muy parecidas en sintaxis a LEX y YACC. De hecho, el nombre de &lt;a href="http://www.dabeaz.com/ply/"&gt;PLY&lt;/a&gt; viene de Python-Lex-Yacc.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hay muchísimos tutoriales y ejemplos de este módulo, así que mi intención aquí no es más que explicar cómo se usa y poco más.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Qué instalar&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Tenemos que instalar el módulo ply para Python. Esto lo podemos hacer desde los repositorios de Ubuntu o a través del tar.gz de la página del proyecto.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install python-ply&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Analizador léxico&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Lo primero en realizar es el analizador léxico. Lo que tenemos que hacer es importar el módulo de ply y comenzar a trabajar con él.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #a020f0;"&gt;import&lt;/span&gt;&amp;nbsp;ply.lex &lt;span style="color: brown;"&gt;&lt;b&gt;as&lt;/b&gt;&lt;/span&gt;&amp;nbsp;lex&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;# list of tokens&lt;/span&gt;&lt;br /&gt;tokens = (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;# Reserverd words&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'ELSE'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'IF'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'INT'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'RETURN'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'VOID'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'WHILE'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;# Symbols&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'PLUS'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'MINUS'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'TIMES'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'DIVIDE'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'LESS'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'LESSEQUAL'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'GREATER'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'GREATEREQUAL'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'EQUAL'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'DEQUAL'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'DISTINT'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'SEMICOLON'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'COMMA'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'LPAREN'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'RPAREN'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'LBRACKET'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'RBRACKET'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'LBLOCK'&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'RBLOCK'&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;# Others&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'ID'&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;'NUMBER'&lt;/span&gt;,&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Lo que se ha hecho es hacer un array con todos los tokens del lenguaje. En este caso de ha cogido un subconjunto de C, al que hemos llamado cminus.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ahora, como es de esperar, debe haber expresiones regulares para todas estos tokens. Una forma de hacer esto es (esto es nuevo a partir de la versión 3 de PLY) coger todos aquellos tokens que solo sea una sentencia y hacerlo directamente de la forma:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: blue;"&gt;# Regular expressions rules for a simple tokens&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;t_PLUS&amp;nbsp;&amp;nbsp; = &lt;span style="color: magenta;"&gt;r'\+'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_MINUS&amp;nbsp;&amp;nbsp;= &lt;span style="color: magenta;"&gt;r'-'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_TIMES&amp;nbsp;&amp;nbsp;= &lt;span style="color: magenta;"&gt;r'\*'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_DIVIDE = &lt;span style="color: magenta;"&gt;r'/'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_EQUAL&amp;nbsp;&amp;nbsp;= &lt;span style="color: magenta;"&gt;r'='&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_LESS&amp;nbsp;&amp;nbsp; = &lt;span style="color: magenta;"&gt;r'&amp;lt;'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_GREATER = &lt;span style="color: magenta;"&gt;r'&amp;gt;'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_SEMICOLON = &lt;span style="color: magenta;"&gt;';'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_COMMA&amp;nbsp;&amp;nbsp;= &lt;span style="color: magenta;"&gt;r','&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_LPAREN = &lt;span style="color: magenta;"&gt;r'\('&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_RPAREN&amp;nbsp;&amp;nbsp;= &lt;span style="color: magenta;"&gt;r'\)'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_LBRACKET = &lt;span style="color: magenta;"&gt;r'\['&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_RBRACKET = &lt;span style="color: magenta;"&gt;r'\]'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_LBLOCK&amp;nbsp;&amp;nbsp; = &lt;span style="color: magenta;"&gt;r'{'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;t_RBLOCK&amp;nbsp;&amp;nbsp; = &lt;span style="color: magenta;"&gt;r'}'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Para el resto de tokens, lo que hacemos es una función. Notar que todas las reglas&amp;nbsp; comienzan con una t, esto es así porque el módulo coge todo aquello que contenga esa t_TOKEN crea el diagrama de transición correspondiente. Algunas de ellas son:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;t_ELSE&lt;/span&gt;(t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;r'else'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: brown;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&amp;nbsp;t&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;t_IF&lt;/span&gt;(t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;r'if'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: brown;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&amp;nbsp;t&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;t_NUMBER&lt;/span&gt;(t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;r'\d+'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.value = &lt;span style="color: darkcyan;"&gt;int&lt;/span&gt;(t.value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: brown;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&amp;nbsp;t&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;t_ID&lt;/span&gt;(t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;r'\w+(_\d\w)*'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: brown;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&amp;nbsp;t&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;t_newline&lt;/span&gt;(t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;r'\n+'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.lexer.lineno += &lt;span style="color: darkcyan;"&gt;len&lt;/span&gt;(t.value)&lt;br /&gt;&lt;br /&gt;t_ignore = &lt;span style="color: magenta;"&gt;' &lt;/span&gt;&lt;span style="color: slateblue;"&gt;\t&lt;/span&gt;&lt;span style="color: magenta;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;t_comments&lt;/span&gt;(t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;r'/*(.|\n)*?\*/'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.lexer.lineno += t.value.count(&lt;span style="color: magenta;"&gt;'&lt;/span&gt;&lt;span style="color: slateblue;"&gt;\n&lt;/span&gt;&lt;span style="color: magenta;"&gt;'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;t_comments_C99&lt;/span&gt;(t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: magenta;"&gt;r'//(.)*?\n'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.lexer.lineno += &lt;span style="color: magenta;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;t_error&lt;/span&gt;(t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;print&lt;/span&gt;&amp;nbsp;&lt;span style="color: magenta;"&gt;"Lexical error: "&lt;/span&gt;&amp;nbsp;+ &lt;span style="color: darkcyan;"&gt;str&lt;/span&gt;(t.value[&lt;span style="color: magenta;"&gt;0&lt;/span&gt;])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.lexer.skip(&lt;span style="color: magenta;"&gt;1&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Análisis sintáctico&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora vamos a darle un orden a todos estos tokens que nos van llegando. Esto lo conseguimos con una gramática. Especificar gramáticas en PLY es muy similar a como se hace en YACC.&lt;/div&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;''' not_terminal : list_of_terminals not_terminals '''&lt;/div&gt;&lt;br /&gt;Por ejemplo,&lt;br /&gt;&lt;br /&gt;""" program : PROGRAM ID SEMICOLON block EOF """&lt;br /&gt;&lt;br /&gt;Lo que hace el PLY, es coger la primera cadena de cada producción, analizarla y crear el analizador sintáctico. Por ejemplo, algunas de las producciones del C-menos son:&lt;br /&gt;______________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #a020f0;"&gt;import&lt;/span&gt;&amp;nbsp;ply.yacc &lt;span style="color: brown;"&gt;&lt;b&gt;as&lt;/b&gt;&lt;/span&gt;&amp;nbsp;yacc&lt;br /&gt;&lt;span style="color: #a020f0;"&gt;from&lt;/span&gt;&amp;nbsp;cminus_lexer &lt;span style="color: #a020f0;"&gt;import&lt;/span&gt;&amp;nbsp;tokens&lt;br /&gt;&lt;span style="color: #a020f0;"&gt;import&lt;/span&gt;&amp;nbsp;cminus_lexer&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_program&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'program : declaration_list'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_declaration_list_1&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'declaration_list : declaration_list declaration'&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;    pass&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_declaration_list_2&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'declaration_list : declaration'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_declaration&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'''declaration : var_declaration&lt;/span&gt;&lt;br /&gt;&lt;span style="color: magenta;"&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; | fun_declaration'''&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_var_declaration_1&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'var_declaration : type_specifier ID SEMICOLON'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_var_declaration_2&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'var_declaration : type_specifier ID LBRACKET NUMBER RBRACKET SEMICOLON'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_type_specifier_1&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'type_specifier : INT'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_type_specifier_2&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'type_specifier : VOID'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_fun_declaration&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'fun_declaration : type_specifier ID LPAREN params RPAREN compount_stmt'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_empty&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: magenta;"&gt;'empty :'&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;______________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nótese que los símbolos no terminales están en minúscula y los terminales están en mayúscula. Esto es por convenio. Además, los tokens son los creados anteriormente en el analizador léxico. En el PLY es necesario colocar una producción tonta que haga la función de &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;epsilon&lt;/span&gt;. (&lt;b&gt;P → epsilon&lt;/b&gt;). Esta no hace nada. Este es un analizador que simplemente comprueba que la sintaxis es correcta, pero si no es correcta, necesitamos que cante el error. Esto lo hacemos mediante la producción &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;p_error()&lt;/span&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;______________________________________________________&lt;/div&gt;&lt;pre&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;p_error&lt;/span&gt;(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&amp;nbsp;p &lt;span style="color: brown;"&gt;&lt;b&gt;is&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: brown;"&gt;&lt;b&gt;not&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: darkcyan;"&gt;None&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: darkcyan;"&gt;print&lt;/span&gt;&amp;nbsp;&lt;span style="color: magenta;"&gt;"Syntax error at line "&lt;/span&gt;&amp;nbsp;+ &lt;span style="color: darkcyan;"&gt;str&lt;/span&gt;(p.lexer.lineno) + &lt;span style="color: magenta;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: magenta;"&gt;        " Unexpected token&amp;nbsp;&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+ &lt;span style="color: darkcyan;"&gt;str&lt;/span&gt;(p.value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: brown;"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: darkcyan;"&gt;print&lt;/span&gt;&amp;nbsp;&lt;span style="color: magenta;"&gt;"Syntax error at line: "&lt;/span&gt;&amp;nbsp;+ &lt;span style="color: darkcyan;"&gt;str&lt;/span&gt;(cminus_lexer.lexer.lineno)&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;br /&gt;______________________________________________________&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez que tengamos todas las reglas escritas, tenemos llamar al método del parser. La primera vez que se ejecute, se construirá un fichero py con el analizador, llamado &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;parsetab.py&lt;/span&gt; y otro con la información del léxico y sintáctico llamado &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;parser.out&lt;/span&gt;.&lt;/div&gt;______________________________________________________&lt;br /&gt;&lt;pre&gt;parser = yacc.yacc()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: brown;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&amp;nbsp;__name__ == &lt;span style="color: magenta;"&gt;'__main__'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = &lt;span style="color: magenta;"&gt;'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: magenta;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Comment C99 style&lt;/span&gt;&lt;br /&gt;&lt;span style="color: magenta;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int gcd (int u, int v) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: magenta;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (v == 0) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: magenta;"&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; return u&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: magenta;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: magenta;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: magenta;"&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; return gcd(v, v-u);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: magenta;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: magenta;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; '''&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parser.parse(data, tracking=&lt;span style="color: darkcyan;"&gt;True&lt;/span&gt;)&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;______________________________________________________&lt;br /&gt;&lt;br /&gt;Para ejecutar el programa, invocamos al parser y éste cogerá el código de ejemplo descrito anteriormente y le pasará el analizador sintáctico. &lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ python cminus_parser.py &lt;br /&gt;Syntax error at line 6 Unexpected token&amp;nbsp; else&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Código completo&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Se puede ver el código completo en el repositorio:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bitbucket.org/jjfumero/cminus"&gt;http://bitbucket.org/jjfumero/cminus&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El siguiente paso es construir el AST. La estrategia a seguir es ir construyéndolo a medida que se hace el parser.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Referencias&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.dabeaz.com/ply/"&gt;PLY&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.juanjoconti.com.ar/2007/11/02/minilisp-un-ejemplo-de-ply/"&gt;Tutorial para un mini-lisp&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/4725769270409658023-2877182487258606250?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/2877182487258606250/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2011/01/parser-de-mini-c-en-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2877182487258606250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2877182487258606250'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2011/01/parser-de-mini-c-en-python.html' title='Parser de mini-C en Python'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-7724512227911656076</id><published>2010-12-28T00:40:00.003Z</published><updated>2010-12-29T00:08:10.159Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='cuda'/><title type='text'>Instalación de Cuda en Ubuntu</title><content type='html'>Lo que tenemos que hacer es bajarnos el CudaToolkit en la página de nvidia.&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://developer.nvidia.com/object/cuda_3_2_downloads.html"&gt;http://developer.nvidia.com/object/cuda_3_2_downloads.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Una vez descargado, ejecutamos el binario como superusuario.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ ./cudatoolkit_3.2.9_linux_64_ubuntu10.04.run&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Esto nos instala, entre otras cosas el compilador de Cuda. Ahora, tenemos que agregar una nueva ruta hacia estos compiladores. Lo podemos hacer en el ~/.bashrc:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# CUDA&lt;br /&gt;export PATH=/usr/local/cuda/bin/:$PATH&lt;br /&gt;export LD_LIBRARY_PATH=/usr/local/cuda/lib64/:/usr/local/cuda/lib/&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Ante el error&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;br /&gt;$ &lt;b&gt;nvcc&lt;/b&gt; ejemplo.cu -o ejemplo&lt;br /&gt;gcc: error trying to exec 'cc1plus': execvp: No existe el archivo o directorio&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Significa que requiere del compilador de c++ =&amp;gt; tenemos que hacer sudo apt-get install g++. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instalación del SDK + Ejemplos&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;También podemos descargarnos GPU Computing SDK code samples, que contiene bastantes programas de ejemplo y simulaciones. Una vez descargado e instalado, probablemente tengamos que instalar algunas librerías más. Por ejemplo, para compilar el fluidsGL, tenemos que ir a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;./NVIDIA_GPU_Computing_SDK/C/src/fluidsGL/&lt;/span&gt;. En src es donde están los ejemplos. Para compilar, simplemente usamos el makefile que nos deja nvidia.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ make&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Al compilar, pueden salir problemas parecidos a los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;/usr/bin/ld: cannot find -lGL&lt;br /&gt;/usr/bin/ld: cannot find -lXi&lt;br /&gt;/usr/bin/ld: cannot find -lXmu&lt;br /&gt;/usr/bin/ld: cannot find -lglut&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;make: *** [../../bin/linux/release/fluidsGL] Error 1&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Y puede que algunos más. Esto es porque nos faltan algunas librerías por instalar. En concreto son necesarias:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install libxmu-dev libxi-dev libxt-dev freeglut3-dev libx11-dev&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_TAzjkcP2UpE/TRp7vMjU72I/AAAAAAAABBU/ZiesdtBRr64/s1600/Pantallazo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_TAzjkcP2UpE/TRp7vMjU72I/AAAAAAAABBU/ZiesdtBRr64/s320/Pantallazo.png" width="304" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Referencias:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.nvidia.com/object/cuda_3_2_downloads.html"&gt;http://developer.nvidia.com/object/cuda_3_2_downloads.html&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/4725769270409658023-7724512227911656076?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/7724512227911656076/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/12/instalacion-de-cuda.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7724512227911656076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7724512227911656076'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/12/instalacion-de-cuda.html' title='Instalación de Cuda en Ubuntu'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TAzjkcP2UpE/TRp7vMjU72I/AAAAAAAABBU/ZiesdtBRr64/s72-c/Pantallazo.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-7411776924550522904</id><published>2010-12-17T22:31:00.000Z</published><updated>2010-12-17T22:31:50.580Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wine'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Cómo ejecutar ficheros msi con Wine</title><content type='html'>Para poder ejecutar los famosos ficheros &lt;b&gt;Windows Installation&lt;/b&gt; en Wine usamos la opción&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; msiexec /i&lt;/span&gt; y el fichero a ejecutar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ wine msiexec /i file.msi&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Otra forma de hacerlo es con la opción &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;start.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ wine start file.msi&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-7411776924550522904?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/7411776924550522904/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/12/como-ejecutar-ficheros-msi-con-wine.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7411776924550522904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7411776924550522904'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/12/como-ejecutar-ficheros-msi-con-wine.html' title='Cómo ejecutar ficheros msi con Wine'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-5678649276406609313</id><published>2010-11-29T15:31:00.000Z</published><updated>2010-11-29T15:31:24.304Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Convertir resaltado de sintaxis a html con ViM</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hay un comando en ViM con el que podemos convertir cualquier código que estemos editando (con colores, tabuladores, etc) a formato HTML.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;:TOhtml&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Este comando de ViM creará un fichero con la extensión html. Para crear el html influye el esquema de color que tengamos en el ViM. Si tenemos el default (lo más común) es que los caracteres cercanos al amarillo, como las palabras reservadas, no se vean muy bien en el html. Un esquema de color adecuado (al menos para mí) es el esquema de color xellner.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;:colorscheme zellner&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-5678649276406609313?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/5678649276406609313/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/11/convertir-resaltado-de-sintaxis-html.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/5678649276406609313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/5678649276406609313'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/11/convertir-resaltado-de-sintaxis-html.html' title='Convertir resaltado de sintaxis a html con ViM'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-8430180537468105468</id><published>2010-11-21T17:22:00.002Z</published><updated>2010-12-08T15:58:57.163Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Convertir un repositorio subversion a un repositorio mercurial</title><content type='html'>&lt;div style="text-align: justify;"&gt;Por trabajo, comencé a usar mercurial como sistema de control de versiones. Me fui acostumbrando al modo de trabajo de Mercurial y ahora me está gustando más que subversion. Ahora, algunas prácticas que tenía pendientes y que las tenía con subversion me he planteado la migración a Mercurial.&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;La pregunta es: &lt;b&gt;¿se puede hacer la migración sin perder el log de lo hecho anteriormente?&lt;/b&gt; La respuesta es &lt;b&gt;sí.&lt;/b&gt; Tras buscar un poco en la documentación (&lt;a href="http://mercurial.selenic.com/wiki/ConvertExtension"&gt;link&lt;/a&gt;) se encuentra un pequeño manual sobre cómo hacerlo. Es más, se pueden convertir desde varios Sistemas de Control de Versiones como Bazaar o CVS.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Por ejemplo, desde subversion, necesitamos un módulo de python: python-subversion.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install python-subversion&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;Luego tendríamos que crear un directorio y hacer un init:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ mkdir proyecto&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ cd proyecto&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ hg init&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ahora, tenemos que editar el fichero&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt; .hg/hgrc&lt;/span&gt; y añadirle una &lt;b&gt;extensión&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ vim .hg/hgrc&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Añadimos las líneas como sigue:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;[extensions]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;hgext.convert=&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Ahora, importamos el proyecto con la opción&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;b&gt;convert&lt;/b&gt;&lt;/span&gt; de mercurial. Por ejemplo, si el repositorio lo tenemos en local:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ hg convert file:///path/to/repo_svn&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ hg update&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ahora podemos trabajar con el mismo repositorio pero con mercurial y sin perder el historial.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-8430180537468105468?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/8430180537468105468/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/11/convertir-un-repositorio-subversion-un.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8430180537468105468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8430180537468105468'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/11/convertir-un-repositorio-subversion-un.html' title='Convertir un repositorio subversion a un repositorio mercurial'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-7335813491186699868</id><published>2010-10-30T11:10:00.000+01:00</published><updated>2010-10-30T11:10:29.823+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>DVDs encriptados en Ubuntu 10.10</title><content type='html'>Lo que tenemos que hacer es instalar la librería libdvdread4 y ejecutar el script de instalación. Este instalará &lt;b&gt;libdvdcss2&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install libdvdread4&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ sudo /usr/share/doc/libdvdread4/install-css-sh&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-7335813491186699868?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/7335813491186699868/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/10/dvds-encriptados-en-ubuntu-1010.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7335813491186699868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7335813491186699868'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/10/dvds-encriptados-en-ubuntu-1010.html' title='DVDs encriptados en Ubuntu 10.10'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-6258925776808835883</id><published>2010-09-14T11:05:00.002+01:00</published><updated>2010-09-20T20:53:31.646+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Memoria compartida en Linux</title><content type='html'>&lt;div style="text-align: justify;"&gt;La memoria compartida es uno de los mecanismos de Comunicación Entre Procesos (&lt;a href="http://en.wikipedia.org/wiki/Inter-process_communication"&gt;IPC&lt;/a&gt;) que hay en Linux.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para usar memoria compartida en Linux es necesario seguir una serie de pasos que luego se traducen a llamadas al sistema.&lt;/div&gt;&lt;ol&gt;&lt;li style="text-align: justify;"&gt; Necesitamos &lt;b&gt;obtener un identificador de IPC&lt;/b&gt;. Para ello convertimos una ruta (path) del sistema en un identificador IPC. Este identificador es necesario para crear la crear la zona de memoria virtual. Esto es muy sencillo de hacer con la llamada al sistema ftok.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Crear el segmento de memoria compartida&lt;/b&gt; con la llamada al sistema shmget.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Operar con la memoria compartida&lt;/b&gt;. Indicamos lo que queremos compartir con la llamada al sistema shmat.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Destruimos el segmento de memoria compartida&lt;/b&gt; con la llamada al sistema shmdt y shmctl. &lt;/li&gt;&lt;/ol&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Obtener el identificador IPC&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Modo de uso:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/ipc.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;key_t ftok(&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;const&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *pathname, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; proj_id);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El primer parámetro es una ruta. Lo que se puede hacer es coger una ruta que siempre esté en el sistema, por ejemplo &lt;b&gt;"/bin/cp"&lt;/b&gt;. El segundo parámetro es un número aleatorio, pero que conozcan todos los procesos que quieren unirse al mismo segmento de memoria compartida (al igual que la ruta).&lt;/div&gt;Por ejemplo podemos hacer:&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; key = ftok (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"/bin/cp"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;123&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Información más detallada:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ man ftok&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Crear el segmento de memoria compartida&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Esto lo hacemos con la llamada al sistema shmget. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/ipc.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/shm.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; shmget(key_t key, size_t size, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; shmflg);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;El primer parámetro es la clave obtenida en la llamada al sistema anterior.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;El segundo parámetro es el tamaño de la memoria a compartir dados en bytes.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;El tercer parámetro son flags para el modo de uso y quién accede al segmento de memoria.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Los flags son:&amp;nbsp; &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IPC_CREAT:&lt;/span&gt;&amp;nbsp; crea un nuevo segmento.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IPC_EXCL:&lt;/span&gt; se combina con IPC_CREAT y si el segmento ya existía, entonces la creación de segmento falla.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mode_flags&lt;/span&gt;: son los permisos del segmento sobre usuario, grupo y otros, además de los permisos especiales.&lt;/li&gt;&lt;/ul&gt;Esta función retorna -1 si hubo error y actualiza la variable &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;errno&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;Por ejemplo, creamos una zona de memoria compartida para 10 enteros&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; id = shmget(key, &lt;b&gt;sizeof&lt;/b&gt;(&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt;) * &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0777&lt;/span&gt;&lt;span style="color: #141312;"&gt; | IPC_CREAT);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Información más detallada:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ man shmget&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Operaciones con la memoria compartida&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora tenemos que unir nuestros datos al segmento de memoria compartida. Esto es lo que hace la llamada al sistema shmat. Se le especifica el ID obtenido en shmget:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; *shmat(&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; shmid, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;const&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; *shmaddr, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; shmflg);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La dirección de memoria compartida a la que se asocia depende del parámetro shmaddr y shmflg. Para más información sobre estos dos parámetros hacer un &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;man shmat&lt;/span&gt;.&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Para el uso que le vamos a dar, bastará con poner estos dos parámetros a 0, &lt;span style="color: black;"&gt;con esto le indicamos que el sistema coja una dirección apropiada donde fijar el segmento. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; *array;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;array = shmat(id, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div style="background-color: #666666; color: white; text-align: justify;"&gt;&lt;b&gt;Desasignar la memoria compartida&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cuando ya hayamos acabado de usar la memoria compartida, se debe liberar el segmento "cogido". Esto se hace con 2 llamadas al sistema: &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;shmdt&lt;/span&gt;&lt;/b&gt; y &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;shmctl&lt;/span&gt;&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;shmdt&lt;/span&gt;: lo que hace es que desasocia la zona de datos del programa con la memoria compartida.&amp;nbsp; &lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;shmctl&lt;/span&gt;: sirve para pasar recibir información de la memoria compartida, o para establecer usuario y permisos del segmento. También sirve para destruir el segmento de memoria compartida.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Ejemplos de uso:&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;/ul&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* Free the shared memory */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;shmdt ((&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *)array);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;shmctl (id, IPC_RMID, (&lt;b&gt;struct&lt;/b&gt; shmid_ds *)NULL);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;El parámetro IPC_RMID lo que hace es eliminar el segmento de memoria compartida.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white; text-align: justify;"&gt;&lt;b&gt;Ejemplo&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Se tienen 2 programas. Uno cliente y otro servidor (si se quiere ver así). El servidor crea la memoria compartida y sirve un dato. El cliente se acopla a la memoria compartida y recoge el dato. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* p1.c -- demostrate the mecanism of&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; *         shared memory&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * blog   : snatverk.blogspot.com&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * date   : Tue Sep 14 10:54:37 WEST 2010&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * compile: $ gcc p1.c -o p1&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/ipc.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/shm.h&amp;gt; &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* shm*  */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#define FILEKEY "/bin/cat"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#define KEY 1300&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#define MAXBUF 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; main () {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* Key to shared memory */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; key = ftok(FILEKEY, KEY);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;if&lt;/b&gt; (key == -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Error with key &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;return&lt;/b&gt; -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   }   &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   /* we create the shared memory */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;   int&lt;/span&gt;&lt;span style="color: #141312;"&gt; id_zone = shmget (key, &lt;b&gt;sizeof&lt;/b&gt;(&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt;)*MAXBUF, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0777&lt;/span&gt;&lt;span style="color: #141312;"&gt; | IPC_CREAT);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;if&lt;/b&gt; (id_zone == -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Error with id_zone &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;return&lt;/b&gt; -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   }&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;   printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"ID zone shared memory: %i&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, id_zone);&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0057ae;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt; &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt;   int&lt;/span&gt;&lt;span style="color: #141312;"&gt; *buffer; &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* shared buffer */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* we declared to zone to share */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   buffer = shmat (id_zone, (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *)&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;if&lt;/b&gt; (buffer == NULL) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Error reserve shared memory &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;return&lt;/b&gt; -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   }&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Pointer buffer shared memory: %p&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, buffer);&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt;   int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;for&lt;/b&gt; (i = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i &amp;lt; MAXBUF; i++) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      buffer[i] = i;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   /* The daemon executes until press some character */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; c;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   c = getchar();&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   /* Free the shared memory */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   shmdt ((&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *)buffer);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   shmctl (id_zone, IPC_RMID, (&lt;b&gt;struct&lt;/b&gt; shmid_ds *)NULL);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;___________________________________________________&lt;br /&gt;El segundo proceso:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* p2.c -- demostrate the mecanism of&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; *         shared memory&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * blog   : snatverk.blogspot.com&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * compile: $ gcc p2.c -o p2&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/ipc.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;errno.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sys/shm.h&amp;gt; &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* shm*  */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#define FILEKEY "/bin/cat"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#define KEY 1300&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#define MAXBUF 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; main () {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   /* Key to shared memory */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; key = ftok(FILEKEY, KEY);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;if&lt;/b&gt; (key == -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;      fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Error with key &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;return&lt;/b&gt; -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   /* we create the shared memory */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; id_zone = shmget (key, &lt;b&gt;sizeof&lt;/b&gt;(&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt;)*MAXBUF, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0777&lt;/span&gt;&lt;span style="color: #141312;"&gt; | IPC_CREAT);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;if&lt;/b&gt; (id_zone == -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Error with id_zone &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;return&lt;/b&gt; -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"ID zone shared memory: %i&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, id_zone);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;   int&lt;/span&gt;&lt;span style="color: #141312;"&gt; *buffer; &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* shared buffer */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* we declared to zone to share */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   buffer = shmat (id_zone, (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *)&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;if&lt;/b&gt; (buffer == NULL) {&lt;/span&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;      fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Error reserve shared memory &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;return&lt;/b&gt; -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   }&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Pointer buffer shared memory: %p&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, buffer);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   /* Write the values of shared memory */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;for&lt;/b&gt; (i = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i &amp;lt; MAXBUF; i++) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"%i&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, buffer[i]);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;   &lt;/b&gt;&lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&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/4725769270409658023-6258925776808835883?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/6258925776808835883/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/09/memoria-compartida-en-linux.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6258925776808835883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6258925776808835883'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/09/memoria-compartida-en-linux.html' title='Memoria compartida en Linux'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-4859927068049862194</id><published>2010-08-30T18:10:00.002+01:00</published><updated>2010-09-01T21:52:43.012+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RoR'/><title type='text'>Instalación de Ruby y Ruby On Rails en Ubuntu</title><content type='html'>&lt;div style="text-align: justify;"&gt;La instalación de Ruby y Ruby on Rails en Ubuntu es muy sencilla.&amp;nbsp; Para instalar Ruby, se necesitan los paquetes ruby, ri (ruby information) e irb (interactive ruby). &lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install ruby ri irb&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora, podemos instalar &lt;b&gt;rubygems&lt;/b&gt; desde los repositorios y bajarnos la última versión (recomendable) para instalar luego Rails. La versión que tiene Ubuntu (al menos en Ubuntu 9.X u 10.04) es la 1.3.5. Cuando instalamos rails con ruby gems, se nos pide que al menos se tenga la versión 1.3.6 de rubygems. Si se intenta actualizar rubygems:&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ &lt;/span&gt;&lt;span style="color: black;"&gt;sudo gem update --system&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nos da un error como que esto se hace mediante los repositorios de Debian/Ubuntu y no desde el propio programa. Yo opté por descargarme el código fuente e instalarlo yo mismo y funcionó.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ tar -xvzf &lt;/span&gt;&lt;span style="color: black;"&gt;rubygems-1.3.7.tgz&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ cd &lt;/span&gt;&lt;span style="color: black;"&gt;rubygems-1.3.7&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ sudo ruby setup.rb &lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Con esto ya tenemos actualizada la versión de rubygems. Ahora toca instalar &lt;b&gt;Rails&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo gem install rails --include-dependencies&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Decir que Rails3 me está dando problemas con la configuración de la base de datos, por lo que otra opción es instalar rails desde los repositorios de Ubuntu, con el nombre de paquete &lt;b&gt;rails&lt;/b&gt;. Ahora, en función de la base de datos que tengamos, tenemos que instalar la correspondiente librería para ruby. Por ejemplo, si tenemos instalado MySQL, entonces hacemos:&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install libmysql-ruby libmysqlclient-dev&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;$ sudo gem install mysql&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;¡Ahora, a disfrutar de Rails!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-4859927068049862194?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/4859927068049862194/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/08/instalacion-de-ruby-y-ruby-on-rails-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4859927068049862194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4859927068049862194'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/08/instalacion-de-ruby-y-ruby-on-rails-en.html' title='Instalación de Ruby y Ruby On Rails en Ubuntu'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-4821813110116487698</id><published>2010-08-27T11:14:00.000+01:00</published><updated>2010-08-27T11:14:41.882+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>netduino</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En &lt;a href="http://blog.bricogeek.com/"&gt;bricogeek&lt;/a&gt;, he encontrado un post interesante presentando este microcontrolador. El nombre de netduino viene de .&lt;b&gt;NET + Arduino&lt;/b&gt;. El microcontrolador que tiene es un Atmel de 32 bits a 48MHz de frecuencia. Además, tiene más memoria, unos 60KB de RAM. El netduino incluye en la placa un pulsador.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_TAzjkcP2UpE/THeM22my0MI/AAAAAAAAA9g/tsB14srLrMc/s1600/CW0001_3.jpg" imageanchor="1"&gt;&lt;img border="0" height="232" src="http://3.bp.blogspot.com/_TAzjkcP2UpE/THeM22my0MI/AAAAAAAAA9g/tsB14srLrMc/s320/CW0001_3.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En la página del proyecto nos podemos descargar este &lt;b&gt;Micro Framework para .NET&lt;/b&gt; y hacer nuestros programas en &lt;b&gt;Visual Studio 2010&lt;/b&gt;. Lo que me gusta es que se programa en &lt;b&gt;C#&lt;/b&gt; con el editor Visual Studio. El framework es gratuito y es bajo licencia Creative Commons. Está en fase de experimentación la posibilidad de programarlo en C# bajo&lt;b&gt; &lt;a href="http://www.mono-project.com/Main_Page"&gt;MONO&lt;/a&gt;&lt;/b&gt;.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La página del proyecto:&amp;nbsp; &lt;a href="http://www.netduino.com/"&gt;http://www.netduino.com/&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/4725769270409658023-4821813110116487698?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/4821813110116487698/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/08/netduino.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4821813110116487698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4821813110116487698'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/08/netduino.html' title='netduino'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TAzjkcP2UpE/THeM22my0MI/AAAAAAAAA9g/tsB14srLrMc/s72-c/CW0001_3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-183510356804295623</id><published>2010-07-31T11:48:00.001+01:00</published><updated>2010-09-06T16:48:47.512+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gnome'/><title type='text'>Solución bloqueo barra gnome-panel</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ayer, como casi siempre todo funcionaba a la perfección en mi Ubuntu 9.10. Hoy, de repente (aún no sé el motivo)&lt;b&gt; la barra gnome-panel se quedó completamente bloqueada&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;"Googleando" un rato, encontré una solución parcial, un apaño. Es matar al proceso gnome-panel, luego vuelve a funcionar como si nada hubiese pasado.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ killall gnome-panel&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;La pega a esta solución, es que cada vez que reinicies, se tiene matar nuevamente el proceso&lt;/b&gt;. Esta solución es prácticamente inaceptable.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Propongo &lt;b&gt;otra solución&lt;/b&gt;, tal como se comenta en Ubuntu-life, si algo falla, una opción es volver a los valores por defecto, que de momento me va bien. Por tanto podemos &lt;b&gt;resetear los parámetros&lt;/b&gt; de los paneles que vienen por defecto en Gnome.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ gconftool-2 --recursive-unset /apps/panel&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Luego reiniciamos la máquina y listo. Puedo confirmar que va bien, al menos a mi se me ha solucionado. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Dejo unos enlaces de donde he sacado esta información.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ubuntulife.wordpress.com/2009/06/01/tip-reiniciar-a-los-valores-de-fabrica-de-gnome/"&gt;Ubuntu life&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ubuntu-es.org/?q=node/128898"&gt;Ubuntu-es&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/4725769270409658023-183510356804295623?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/183510356804295623/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/07/solucion-bloqueo-barra-gnome-panel.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/183510356804295623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/183510356804295623'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/07/solucion-bloqueo-barra-gnome-panel.html' title='Solución bloqueo barra gnome-panel'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-3551475151435468408</id><published>2010-07-26T16:48:00.004+01:00</published><updated>2010-07-26T17:13:37.626+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmos'/><title type='text'>Multiplicación a la Russe en C</title><content type='html'>&lt;div style="text-align: justify;"&gt;Existen varios algoritmos para la multiplicación. Uno bastante curioso y sorprendente es el de la &lt;b&gt;multiplicación a la russe&lt;/b&gt;. Este algoritmo no es que sea muy didáctico, de hecho no se enseña en los colegios, puesto que tan solo requiere dividir y multiplicar por 2. En escencia, saberse la tabla del 2, y por supuesto, saber sumar, ¡y funciona!.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Algoritmo y ejemplo&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Lo mejor para entender como funciona el algoritmo es un ejemplo. Vamos a multiplicar 35*91: el resultado debe ser de 3185.&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/_TAzjkcP2UpE/TE2m17pf4lI/AAAAAAAAA3w/WUvsmDlSIFY/s1600/ALaRusse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://2.bp.blogspot.com/_TAzjkcP2UpE/TE2m17pf4lI/AAAAAAAAA3w/WUvsmDlSIFY/s320/ALaRusse.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Lo que se hace es coger el multiplicando y dividirlo por 2 mientras el resultado sea mayor a 1. Con el multiplicador se hace los contrario, se multiplica por 2. Los números que se suman son aquellas partes derechas en las que la parte izquierda sea impar. Dicho de otro modo, se suman aquellos números de la columna de multiplicaciones en los que la columna de divisiones sea impar.&lt;/div&gt;&lt;br /&gt;Un pseudocódigo sería algo así:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;russe(x, y)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;begin &lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp; while (x &amp;gt;= 1) do&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (x mod 2) then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mult = mult + y;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; x = x/2;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; y = y*2;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp; end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp; return mult; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;end &lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Implementación en C&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Resulta tentador implementar un algoritmo así. Es muy sencillo. Si tenemos en cuenta que las multiplicaciones y divisiones por 2 se hacen mediante desplazamientos a izquierda y a derecha respectivamente, resulta muy fácil.&lt;br /&gt;&lt;br /&gt;Una mejora a esto es poner el número más pequeño como multiplicando, puesto que así nos podemos ahorrar algunas iteraciones.&lt;br /&gt;&lt;br /&gt;_______________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* russe.c -- algoritmo de multiplicación a la russe&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * date: sáb jul 24 09:34:54 WEST 2010&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * Author: Juan José Fumero Alfonso&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * Compile: gcc russe.c -O3 -o russe&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;unistd.h&amp;gt;  &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* getopt */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#define AUTHOR "Juan José Fumero Alfonso"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; author () {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Author: %s&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, AUTHOR);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; version () {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Multiplicación a la Russe, version 0.2&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; help () {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Use mode: &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\t&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;$ ./russe -[-hva] x &amp;lt;number1&amp;gt; -y &amp;lt;number2&amp;gt;  &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\t&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;-v: print version&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\t&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;-a: print author&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\t&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;-h: show this help&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* Función con que realiza la multicación a la russe */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; mrusse (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; auxa, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; auxb) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt; int&lt;/span&gt;&lt;span style="color: #141312;"&gt; mult = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt; while&lt;/b&gt; (auxa &amp;gt;= &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;if&lt;/b&gt; ((auxa % &lt;/span&gt;&lt;span style="color: #b08000;"&gt;2&lt;/span&gt;&lt;span style="color: #141312;"&gt;) == &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;)  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      mult += auxb;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    auxa = auxa &amp;gt;&amp;gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    auxb = auxb &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;return&lt;/b&gt; mult;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* Entrada de los dos número a multiplicar desde la línea de &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * comandos&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; main (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; argc, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; **argv) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* Recogida ie números */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; x, y;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; flgn1 = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, flgn2 = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; opt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;while&lt;/b&gt; ((opt = getopt(argc, argv, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;":havx:y:"&lt;/span&gt;&lt;span style="color: #141312;"&gt;)) != -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;b&gt;    switch&lt;/b&gt; (opt) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;     case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'h'&lt;/span&gt;&lt;span style="color: #141312;"&gt;: &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;           help();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;      return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;     case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'v'&lt;/span&gt;&lt;span style="color: #141312;"&gt;: &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          version();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;      return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;      break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;     case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'a'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          author();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;      return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;      break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'x'&lt;/span&gt;&lt;span style="color: #141312;"&gt;: &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* recogida de números */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;         flgn1 = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;         x = atoi(optarg);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;     break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;    case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'y'&lt;/span&gt;&lt;span style="color: #141312;"&gt;: &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* recogida de números */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;         flgn2 = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;         y = atoi(optarg);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;   break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;      default&lt;/b&gt;: &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* '?' */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;         help();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;         exit(EXIT_FAILURE);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt; if&lt;/b&gt; ((flgn1 == &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;) &amp;amp;&amp;amp; (flgn2 == &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;     fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Error in numbers&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;b&gt;   return&lt;/b&gt; -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  } &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt; int&lt;/span&gt;&lt;span style="color: #141312;"&gt; mult = mrusse(x, y);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  printf (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\t&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;%i * %i = %i&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, x, y, mult);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt; return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;_______________________________________________________&lt;br /&gt;&lt;br /&gt;La función principal es &lt;span style="color: #141312;"&gt;&lt;b&gt;mrusse&lt;/b&gt;, que es la que hace la multiplicación por software. El resto es sólo para permitir diversas opciones de entrada al programa. Modo de uso:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ ./russe -x 35 -y 91 &lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Use la opción&lt;b&gt; -h &lt;/b&gt;para la ayuda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-3551475151435468408?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/3551475151435468408/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/07/multiplicacion-la-russe-en-c.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/3551475151435468408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/3551475151435468408'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/07/multiplicacion-la-russe-en-c.html' title='Multiplicación a la Russe en C'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_TAzjkcP2UpE/TE2m17pf4lI/AAAAAAAAA3w/WUvsmDlSIFY/s72-c/ALaRusse.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-8802816549757443854</id><published>2010-07-07T13:12:00.000+01:00</published><updated>2010-07-07T13:12:21.250+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VirtualBox'/><title type='text'>Asignar un nuevo UUID a máquina virtual de VirtualBox</title><content type='html'>&lt;div style="text-align: justify;"&gt;Si queremos tener más de una copia de una máquina virtual ejecutándose, se necesita que cada máquina tenga su propio &lt;a href="http://es.wikipedia.org/wiki/Universally_Unique_Identifier"&gt;UUID&lt;/a&gt; distinto del resto. Hay al menos dos formas de hacer esto.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;1. Asignación de un nuevo UUID manualmente&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Se hace la copia con el comando &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cp&lt;/span&gt;, por ejemplo, y luego tenemos que asignar manualmente un UUID nuevo para la máquina copiada. Esto se hace:&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ VBoxManage internalcommands setvdiuuid copy.vdi&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;2. Clonando una máquina virtual&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;El segundo método es usar el comando de VirtualBox &lt;b&gt;clonehd&lt;/b&gt;. Este hace una copia y asigna un UUID a la nueva máquina automáticamente.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ VBoxManage clonehd original.vdi copy.vdi&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-8802816549757443854?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/8802816549757443854/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/07/asignar-un-nuevo-uuid-maquina-virtual.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8802816549757443854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8802816549757443854'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/07/asignar-un-nuevo-uuid-maquina-virtual.html' title='Asignar un nuevo UUID a máquina virtual de VirtualBox'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-6891559139526989198</id><published>2010-06-02T09:24:00.005+01:00</published><updated>2010-06-02T09:57:08.962+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Ejemplo listas enlazadas en Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;Algunas de las estructuras de datos que se usan&amp;nbsp; con frecuencia en programación son las listas, pilas y colas. Pero probablemente (al menos a mi me pasa)&amp;nbsp; cuando vayamos a implementar alguna utilidad con estas estructuras de datos, acordarse del nombre de la clase y como se usaba (en Java) es todo un ejercicio de memoria (no sólo con Java sino con cualquier lenguaje), a no ser que estemos constantemente programando en el mismo lenguaje. Aquí pongo un ejemplo muy sencillo que muestra el uso de listas en Java.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tenemos que importar el paquete&lt;span style="font-weight: bold;"&gt; java.util&lt;/span&gt; que contiene las clases apropiadas para el manejo de listas e iteradores. Se puede descargar el código fuente enlace.&lt;/div&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://cid-034b1fe01c759918.skydrive.live.com/embedrow.aspx/WebFeluco/Java/MyList.java" style="background-color: white; border: 1px solid rgb(221, 229, 233); height: 26px; margin: 3px; padding: 0pt; width: 240px;"&gt;&lt;/iframe&gt;&lt;br /&gt;_______________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// Ejemplo de uso de listas en Java&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// Autor: Juan José Fumero Alfonso&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// Blog : snaterk.blogspot.com&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.util.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; MyList {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;static&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;main&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;[] args) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//creamos la lista a&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;List&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; a = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;LinkedList&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//añadimos elementos a la lista&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;for&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i &amp;lt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;100&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i++)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            a.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;add&lt;/span&gt;&lt;span style="color: #141312;"&gt;(i);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Imprimimos la lista&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(a);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Si queremos imprimir los elementos a pelo&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;ListIterator&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; it = a.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;listIterator&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Iterator it2 = a.iterator();&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;while&lt;/b&gt; (it.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;hasNext&lt;/span&gt;&lt;span style="color: #141312;"&gt;())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(it.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;next&lt;/span&gt;&lt;span style="color: #141312;"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Eliminar todos los elementos de la lista    &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        a.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;removeAll&lt;/span&gt;&lt;span style="color: #141312;"&gt;(a);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Imprimir el resultado&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(a);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;exit&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&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/4725769270409658023-6891559139526989198?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/6891559139526989198/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/06/ejemplo-listas-enlazadas-en-java.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6891559139526989198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6891559139526989198'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/06/ejemplo-listas-enlazadas-en-java.html' title='Ejemplo listas enlazadas en Java'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-200890513050109117</id><published>2010-05-29T21:07:00.004+01:00</published><updated>2010-05-29T21:21:13.387+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Scripts administración de redes en Linux</title><content type='html'>El primer script facilita un poco la tarea si tenemos que asignar manualmente una dirección IP a una interfaz de red mediante línea de comandos (en este caso se ha cogido la eth0).&lt;br /&gt;_______________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;#! /bin/bash&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# Autor: Juan José Fumero Alfonso&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# Fecha: 26/03/10&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# Script de automatización de asignación&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# una nueva ip para la interface eth0.&lt;/i&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# comprobamos si las cadenas $1, $2 son&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# vacías&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;if&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt; [&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #006e28;"&gt;-z&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #006e28;"&gt;$1&lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt; ]&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;&amp;amp;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt; [&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #006e28;"&gt;-z&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #006e28;"&gt;$2&lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt; ]&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;; &lt;b&gt;then&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; -e &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Modo uso: ./ip &amp;lt;address&amp;gt; &amp;lt;mask&amp;gt; "&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; -e &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"\n************ eht0 ******************"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; -e &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"\tAsignando ip: &lt;/span&gt;&lt;span style="color: #006e28;"&gt;$1&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; -e &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"\tCon máscara : &lt;/span&gt;&lt;span style="color: #006e28;"&gt;$2&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;&lt;b&gt;sudo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; ifconfig eth0 up &lt;/span&gt;&lt;span style="color: #006e28;"&gt;$1&lt;/span&gt;&lt;span style="color: #141312;"&gt; netmask &lt;/span&gt;&lt;span style="color: #006e28;"&gt;$2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; -e &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;fi&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;_______________________________________ &lt;br /&gt;&lt;br /&gt;El segundo script elimina la puerta de enlace que tenía y añade la que le indiquemos como argumento:&lt;br /&gt;_______________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;#! /bin/bash&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# Autor: Juan José Fumero Alfonso&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# Fecha: 26/03/10&lt;/i&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# Comprobamos si la cadena $1 es vacía&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt; [&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #006e28;"&gt;-z&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #006e28;"&gt;$1&lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt; ]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #880088;"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; -e &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Modo de uso: ./routerGateway &amp;lt;address&amp;gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# eliminamos la ruta por defecto&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;&lt;b&gt;sudo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; route del default&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;# añadimos la nueva&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;&lt;b&gt;sudo&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; route add default gw &lt;/span&gt;&lt;span style="color: #006e28;"&gt;$1&lt;/span&gt;&lt;span style="color: #141312;"&gt; eth0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;fi&lt;/b&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/4725769270409658023-200890513050109117?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/200890513050109117/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/05/scripts-administracion-de-redes-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/200890513050109117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/200890513050109117'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/05/scripts-administracion-de-redes-en.html' title='Scripts administración de redes en Linux'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-897553391887340687</id><published>2010-05-07T21:11:00.005+01:00</published><updated>2010-05-18T13:22:53.180+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Comunicación con arduino en C++</title><content type='html'>&lt;div style="text-align: justify;"&gt;No es muy complicado comunicar nuestra &lt;b&gt;placa arduino&lt;/b&gt; mediante el puerto serial con C++ usando la librería LibSerial. Esta librería tiene una clase, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SerialStream&lt;/span&gt;, que nos abstrae de la &lt;i&gt;"complejidad"&lt;/i&gt; de la estructura &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;termios&lt;/span&gt;. Para usarla es necesario instalarla. En Ubuntu lo podemos encontrar en los repositorios. Si no, aquí está el enlace: &lt;a href="http://sourceforge.net/projects/libserial/files/"&gt;http://sourceforge.net/projects/libserial/files/&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Instalación de la librería (en Ubuntu)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install libserial-dev&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;API de LibSerial&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;En la siguiente URL, se encuentra el API bien documentada.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://libserial.sourceforge.net/doxygen"&gt;http://libserial.sourceforge.net/doxygen&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ahora veremos cómo hacer las operaciones básicas (desde abrir el puerto, hasta la lectura/escritura).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Abrir un puerto&lt;/b&gt;&lt;br /&gt;_________________________________________&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;SerialStream.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: #141312;"&gt;    SerialStream serial_port("/dev/ttyUSB0");&lt;/span&gt;&lt;/div&gt;_________________________________________&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Asignación de baudios&lt;/b&gt;&lt;br /&gt;&amp;nbsp;_________________________________________&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;serial_port.SetBaudRate(SerialStreamBuf::BAUD_9600);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&lt;/span&gt;_________________________________________&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;El ejemplo es para el caso de 9600 baudios (suele ser habitual). Pero asignarle otras (&lt;a href="http://libserial.sourceforge.net/doxygen/class_lib_serial_1_1_serial_stream_buf.html#z8_0"&gt;ver en este enlace&lt;/a&gt;).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #141312;"&gt;Número de bits a transmitir&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;Se hace con la llamada al método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SetCharSize()&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;_________________________________________ &lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;serial_port.SetCharSize( SerialStreamBuf::CHAR_SIZE_8) ;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;_________________________________________&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;br /&gt;CHAR_SIZE_X, la X puede variar entre 5 y 8&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lecturas y escrituras&lt;/b&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;//Escritura (mandar un dato) &lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;char c;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cin &amp;gt;&amp;gt; c;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;serial_port &amp;lt;&amp;lt; c;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;//Lectura: recibir un dato&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;char c;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;serial_port &amp;gt;&amp;gt; c;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ejemplo completo&lt;/b&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   Author: Juan José Fumero Alfonso&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   Date: Fri May  7 19:48:06 WEST 2010&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   Note: To compile is necesary install libserial: Serial port &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;         programming in C++ under POSIX operating system&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;            $ sudo apt-get install libserial-dev&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   Doc : http://libserial.sourceforge.net/doxygen&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;   Compile:&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;     \_ $ g++ ejemplo.cpp -o ejemplo -lserial&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;SerialStream.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;using&lt;/b&gt; &lt;b&gt;namespace&lt;/b&gt; std;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;using&lt;/b&gt; &lt;b&gt;namespace&lt;/b&gt; LibSerial;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; main (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; argc, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; **argv) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; oc; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    string dev;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;bool&lt;/span&gt;&lt;span style="color: #141312;"&gt; dsp = &lt;b&gt;false&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;while&lt;/b&gt; ((oc = getopt(argc, argv, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;":d:"&lt;/span&gt;&lt;span style="color: #141312;"&gt;)) != -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;switch&lt;/b&gt;(oc) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'d'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//device&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Dispositivo: "&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                dev = optarg;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;" :: "&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; dev &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                dsp = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;':'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                cerr &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Missing argument "&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;b&gt;return&lt;/b&gt; -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;if&lt;/b&gt; (!dsp) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        dev = &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"/dev/ttyUSB0"&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    SerialStream serial_port(dev);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    serial_port.SetBaudRate(SerialStreamBuf::BAUD_9600);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    serial_port.SetCharSize( SerialStreamBuf::CHAR_SIZE_8);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; num;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;while&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Number of blinks? : "&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        cin &amp;gt;&amp;gt; num;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        serial_port &amp;lt;&amp;lt; num;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para probarlo, se puede hacer el típico ejemplo blink (conectando un LED al pin 13) y enviar un número entre 0 y 9 que indicará el número de parpadeos que debe realizar el LED en el arduino. El correspondiente código pde es el siguiente: (cogido de &lt;a href="http://todbot.com/"&gt;http://todbot.com/&lt;/a&gt;, aunque no es nada del otro mundo).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/*&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * Serial Read Blink&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * -----------------&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * Turns on and off a light emitting diode(LED) connected to digital  &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * pin 13. The LED will blink the number of times given by a &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * single-digit ASCII number read from the serial port.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; *&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * Created 18 October 2006&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * copyleft 2006 Tod E. Kurt &amp;lt;tod@todbot.com&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * http://todbot.com/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * based on "serial_read_advanced" example&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; ledPin = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;13&lt;/span&gt;&lt;span style="color: #141312;"&gt;;   &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// select the pin for the LED&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; val = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;       &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// variable to store the data from the serial port&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; setup() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  pinMode(ledPin,OUTPUT);    &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// declare the LED's pin as output&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  Serial.begin(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;9600&lt;/span&gt;&lt;span style="color: #141312;"&gt;);        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// connect to the serial port&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; loop () {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  val = Serial.read();      &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// read the serial port&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// if the stored value is a single-digit number, blink the LED that number&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;b&gt;if&lt;/b&gt; (val &amp;gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'0'&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;amp;&amp;amp; val &amp;lt;= &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'9'&lt;/span&gt;&lt;span style="color: #141312;"&gt; ) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    val = val - &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'0'&lt;/span&gt;&lt;span style="color: #141312;"&gt;;          &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// convert from character to number&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;for&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i=&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i&amp;lt;val; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      digitalWrite(ledPin,HIGH);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      delay(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;150&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      digitalWrite(ledPin, LOW);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      delay(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;150&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Esta Clase (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SerialStream&lt;/span&gt;) tiene más métodos como establecer los bits de parada, control de paridad, etc. Se puede ver en la documentación de la clase.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Más información&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://libserial.sourceforge.net/"&gt;http://libserial.sourceforge.net/&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/4725769270409658023-897553391887340687?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/897553391887340687/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/05/comunicacion-con-arduino-en-c.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/897553391887340687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/897553391887340687'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/05/comunicacion-con-arduino-en-c.html' title='Comunicación con arduino en C++'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-6072960469904549346</id><published>2010-05-07T13:50:00.002+01:00</published><updated>2010-05-29T20:14:12.507+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Arduino: books and documentation</title><content type='html'>Hay muchísimas páginas con manuales, tutoriales, ejemplos, etc sobre Arduino. Considero que las siguientes están bastante bien para empezar.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Ejemplos:&lt;/b&gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://arduino.cc/en/Tutorial/HomePage"&gt;http://arduino.cc/en/Tutorial/HomePage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://arduino.cc/es/Ejemplos/Ejemplos%20"&gt;http://arduino.cc/es/Ejemplos/Ejemplos &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Lenguaje (referencia):&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://arduino.cc/en/Reference/HomePage"&gt;http://arduino.cc/en/Reference/HomePage&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Tutoriales|Manuales:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.ladyada.net/learn/arduino/"&gt;http://www.ladyada.net/learn/arduino/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Traducción del libro &lt;i&gt;&lt;b&gt;“&lt;i&gt;Arduino Programming Notebook&lt;/i&gt;”&lt;/b&gt;&lt;b&gt; [Brian W. Evans]&amp;nbsp;&lt;/b&gt;&lt;/i&gt; por &lt;b&gt;Rafael Enríquez Herrado de la Universidad Córdoba&lt;/b&gt;. &lt;br /&gt;&amp;nbsp; [] &lt;a href="http://www.jcarazo.com/tmp/Arduino_user_manual_es.pdf"&gt;http://www.jcarazo.com/tmp/Arduino_user_manual_es.pdf&lt;/a&gt;&lt;br /&gt;&amp;nbsp; [] Código fuente: &lt;a href="http://jcarazo.com/tmp/arduino_user_manual_es_sources.tar.gz"&gt;http://jcarazo.com/tmp/arduino_user_manual_es_sources.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;b&gt;Chuletario:&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_TAzjkcP2UpE/TAFnV_TpgvI/AAAAAAAAAzU/nRW3NXTzlcM/s1600/Arduino+cheat+sheet+v02c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_TAzjkcP2UpE/TAFnV_TpgvI/AAAAAAAAAzU/nRW3NXTzlcM/s320/Arduino+cheat+sheet+v02c.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;En pdf:&amp;nbsp; &lt;a href="http://sites.google.com/site/mechatronicsguy/arduinocheatsheet/Arduinocheatsheetv02c.pdf?attredirects=0&amp;amp;d=1"&gt;link&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Books:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Practical Arduino: &lt;a href="http://www.practicalarduino.com/about"&gt;http://www.practicalarduino.com/about&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_TAzjkcP2UpE/S-QHlK7SiOI/AAAAAAAAAyA/ziqqG5IxPxg/s1600/practical-arduino-cover-small.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_TAzjkcP2UpE/S-QHlK7SiOI/AAAAAAAAAyA/ziqqG5IxPxg/s200/practical-arduino-cover-small.jpg" width="150" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Getting Started with Arduino: &lt;a href="http://oreilly.com/catalog/9780596155520"&gt;http://oreilly.com/catalog/9780596155520&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_TAzjkcP2UpE/S-QH2AoNchI/AAAAAAAAAyI/yyQ-QvuobXk/s1600/cat.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_TAzjkcP2UpE/S-QH2AoNchI/AAAAAAAAAyI/yyQ-QvuobXk/s200/cat.gif" width="129" /&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/4725769270409658023-6072960469904549346?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/6072960469904549346/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/05/arduino-books-and-documentation.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6072960469904549346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6072960469904549346'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/05/arduino-books-and-documentation.html' title='Arduino: books and documentation'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_TAzjkcP2UpE/TAFnV_TpgvI/AAAAAAAAAzU/nRW3NXTzlcM/s72-c/Arduino+cheat+sheet+v02c.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-2507401741544146151</id><published>2010-04-19T20:52:00.000+01:00</published><updated>2010-04-19T20:52:39.861+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Arduino: Lectura potenciómetro y escritura PWM</title><content type='html'>He conseguido un &lt;a href="http://arduino.cc/"&gt;Arduino&lt;/a&gt; y uno de los primeros ejemplos que he hecho es el siguiente: leer por un pin Analógico el valor del potenciómetro, y asignarle ese valor a la PWM, de esta forma, conseguimos que el LED se apaque y se encienda conforme variamos el valor del potenciómetro. El circuito es el siguiente:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_TAzjkcP2UpE/S8yxV6XlvPI/AAAAAAAAAxk/TuKhck9ujzI/s1600/Diagram1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_TAzjkcP2UpE/S8yxV6XlvPI/AAAAAAAAAxk/TuKhck9ujzI/s320/Diagram1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;(La imagen de la placa Arduino es de la &lt;a href="http://upload.wikimedia.org/wikipedia/commons/7/7e/Arduino_board_viquipedia.png"&gt;Wikipedia&lt;/a&gt;).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;El circuito es muy sencillo. Se conecta el potenciómetro al pin 5 de las entradas analógicas. También colocamos un LED conectado al Pin 9 (PWM) con una resistencia para que no se queme.&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/_TAzjkcP2UpE/S8yx656ob9I/AAAAAAAAAxs/j2n2WoJh--U/s1600/IMG_0152.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_TAzjkcP2UpE/S8yx656ob9I/AAAAAAAAAxs/j2n2WoJh--U/s320/IMG_0152.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Lo que he hecho es aprovechar la PWM para poner 2 LEDs. El programa es muy simple también:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;nbsp;&lt;span style="color: yellow;"&gt;1 &lt;/span&gt;/*&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;2 &lt;/span&gt;&amp;nbsp;&amp;nbsp;Ejemplo de uso de potenciómetro y PWM&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;3 &lt;/span&gt;&amp;nbsp;*/&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;4 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;5 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;6 &lt;/span&gt;int ledPin = 9;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// LED connected to digital pin 9&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;7 &lt;/span&gt;int potnPin = 5;&amp;nbsp;&amp;nbsp; // Pin de lectura del potenciómetro&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;8 &lt;/span&gt;int value = 0;&lt;br /&gt;&lt;span style="color: yellow;"&gt;&amp;nbsp;9 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;10 &lt;/span&gt;void setup()&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&lt;span style="color: yellow;"&gt;11 &lt;/span&gt;&amp;nbsp;&amp;nbsp;pinMode(ledPin, OUTPUT);&lt;br /&gt;&lt;span style="color: yellow;"&gt;12 &lt;/span&gt;&amp;nbsp;&amp;nbsp;pinMode(potnPin, INPUT);&lt;br /&gt;&lt;span style="color: yellow;"&gt;13 &lt;/span&gt;&amp;nbsp;&amp;nbsp;Serial.begin(9600);&lt;br /&gt;&lt;span style="color: yellow;"&gt;14 &lt;/span&gt;} &lt;br /&gt;&lt;span style="color: yellow;"&gt;15 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: yellow;"&gt;16 &lt;/span&gt;void loop()&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&lt;span style="color: yellow;"&gt;17 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value = analogRead(potnPin)/4;&lt;br /&gt;&lt;span style="color: yellow;"&gt;18 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analogWrite(ledPin, value);&lt;br /&gt;&lt;span style="color: yellow;"&gt;19 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Serial.print(value, DEC);&lt;br /&gt;&lt;span style="color: yellow;"&gt;20 &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Serial.println();&lt;br /&gt;&lt;span style="color: yellow;"&gt;21 &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-2507401741544146151?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/2507401741544146151/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/04/arduino-lectura-potenciometro-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2507401741544146151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2507401741544146151'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/04/arduino-lectura-potenciometro-y.html' title='Arduino: Lectura potenciómetro y escritura PWM'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TAzjkcP2UpE/S8yxV6XlvPI/AAAAAAAAAxk/TuKhck9ujzI/s72-c/Diagram1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-1146063410598148864</id><published>2010-03-20T11:51:00.000Z</published><updated>2010-03-20T11:51:01.907Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Administración de cuotas en Linux</title><content type='html'>&lt;div style="text-align: justify;"&gt;En GNU/Linux se administran las cuotas con el comando &lt;b&gt;edquota&lt;/b&gt;, donde le asignamos espacio a los diferentes usuarios en un archivo de configuración. Pero para llegar a este punto, necesitamos decirle al sistema que queremos que una determinada partición funcione con cuotas de disco.&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;1. Editar el /etc/fstab&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Editamos (como root) el fichero de &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/etc/fstab&lt;/span&gt;, que es donde están todos las particiones y discos disponibles.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# vi /etc/fstab&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Luego, añadimos en la columna &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;options&lt;/span&gt; y en su correspondiente fila, las opciones &lt;b&gt;usrquota&lt;/b&gt; y &lt;b&gt;grpquota&lt;/b&gt;. Suponer que queremos habilitar la partición /home para la administración de quotas.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;/dev/hda6&amp;nbsp; /home&amp;nbsp; ext3&amp;nbsp; defaults,usequota,grpquota 1 2&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ahora tenemos 2 posibilidades:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Reiniciar.&lt;/li&gt;&lt;li&gt;Ejecutar: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mount -o remount /home&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;2. Crear la base de datos de cuotas&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora, necesitamos crear unos archivos especiales que contiene la base de datos de cuotas de los usuarios. Para hacer esto, ejecutamos el comando &lt;b&gt;quotacheck&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# quotacheck -a /dev/hda6&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Tras ejecutar este comando, se crea en la partición seleccionada 2 ficheros: &lt;b&gt;aquota.user&lt;/b&gt; y &lt;b&gt;aquota.group&lt;/b&gt;. Éstas son las bases de datos que hablamos antes.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;3. Habilitar/deshabilitar cuotas&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Podemos habilitarla cuotas con el comando &lt;b&gt;quotaon&lt;/b&gt; y deshabilitarlas con el comando &lt;b&gt;quotaoff&lt;/b&gt;. Por ejemplo&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# quotaon -uvg /home&lt;br /&gt;/dev/sda6 [/home]: group quotas turned on&lt;br /&gt;/dev/sda6 [/home]: user quotas turned on&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;De la misma forma, usamos el comando &lt;b&gt;quotaoff&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;4. Asignar cuotas a los usuarios &lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Vamos a lo más importante, asignarle un espacio en disco. Es una tarea muy sencilla y se hace con el comando &lt;b&gt;edquota&lt;/b&gt;. Este comando edita un fichero de configuración donde le asignaremos el espacio que queramos. Aquí hay que tener en cuenta 2 cosas. &lt;i&gt;Límite suave (soft), y límite duro (hard)&lt;/i&gt;. El límite duro e estricto, le negará al usuario la capacidad de exceder esta cuota, mientras que si excede el un límite suave o flexible, el sistema le dará una advertencia.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ejemplo: asignar 20MB a un usuario user1&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# edquota -u user1&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Se nos abre un editor, nano, vim (el predeterminado del sistema).&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;Disk quotas for user user1 (uid 1001):&lt;br /&gt;&amp;nbsp; Filesystem&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; blocks&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; soft&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hard&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inodes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; soft$&lt;br /&gt;&amp;nbsp; /dev/sda6 &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; 100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0$&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;De la misma forma, también podemos asignar cuota de disco a grupos con la opción &lt;b&gt;-g&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# edquota -g Grupo &lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hay una opción interesante para replicar la cuota de disco de un usuario, y así no tener que ir uno por uno configurando su cuota. Es la opción &lt;b&gt;-p&lt;/b&gt;. Por ejemplo, queremos que los usuarios user2, user3 y user4 tengan la misma configuración que user1.&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# edquota -p user1 user2 user3 user4&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;5. Ver resumen de cuotas &lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Se pueden ver los resultados con el comando repquota (ejecutarlo como root). Éste genera un resumen del uso en disco de todos los usuarios y grupos.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;# repquota -s /home&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;La opción -s es &lt;b&gt;--human-readable&lt;/b&gt; y nos sale más legible (en MB, GB, etc).&lt;br /&gt;&lt;br /&gt;Otro comando es &lt;b&gt;quota -u user&lt;/b&gt;, para ver la cuota de un usuario en concreto.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;6. Referencias:&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.adrformacion.com/cursos/linuxad/leccion3/tutorial4.html"&gt;http://www.adrformacion.com/cursos/linuxad/leccion3/tutorial4.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mcgraw-hill.com.mx/cgi-bin/book.pl?isbn=9701047672&amp;amp;division=mexh"&gt;&lt;i&gt;Linux. Manual de referencia 6ª Edición&lt;/i&gt;. Mc Graw Hill [Richard Peterson]&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-1146063410598148864?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/1146063410598148864/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/03/administracion-de-cuotas-en-linux.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1146063410598148864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/1146063410598148864'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/03/administracion-de-cuotas-en-linux.html' title='Administración de cuotas en Linux'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-6500719015181890355</id><published>2010-02-28T18:33:00.000Z</published><updated>2010-02-28T18:33:28.349Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Instalar Flash Player 10 en Ubuntu 64 bits</title><content type='html'>En los foros de &lt;a href="http://www.ubuntu-es.org/"&gt;ubuntu-es&lt;/a&gt;, he encontrado este script en bash que descarga e instala el Flash Player para sistemas Ubuntu de 64 bits.&amp;nbsp; Es un script muy sencillo y práctico. &lt;br /&gt;&lt;br /&gt;Link: &lt;a href="http://www.ubuntu-es.org/?q=node/76907#comment-341710"&gt;http://www.ubuntu-es.org/?q=node/76907#comment-341710&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-6500719015181890355?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/6500719015181890355/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/02/instalar-flash-player-10-en-ubuntu-64.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6500719015181890355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6500719015181890355'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/02/instalar-flash-player-10-en-ubuntu-64.html' title='Instalar Flash Player 10 en Ubuntu 64 bits'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-5701913274283347888</id><published>2010-02-24T18:42:00.006Z</published><updated>2010-02-24T22:24:10.652Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Redes Neuronales'/><title type='text'>Problema del XOR con Neuroph</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;b&gt;Neuroph&lt;/b&gt; es un Framework de código abierto que incluye multitud de clases con los algoritmos más conocidos de redes neuronales. Ya hemos hablado de este Framework en alguna ocasión. Toda la documentación de la API e incluso ejemplos la podemos encontrar en la página de ellos:&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://neuroph.sourceforge.net/index.html"&gt;http://neuroph.sourceforge.net/index.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;En este post, pondré un ejemplo con el algoritmo Momentum-Backpropagation que proporciona Neuroph para resolver el problema del XOR. Decir que casi todo el código es basado en los ejemplos de la página del proyecto, simplemente se ha modificado el algoritmo de aprendizaje de la red. No es muy complicado.&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;________________________________________________________________&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// Author: Juan José Fumero Alfonso&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;&lt;br /&gt;// Blog  : snatverk.blogspot.com&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; org.neuroph.core.NeuralNetwork;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; org.neuroph.nnet.MultiLayerPerceptron;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; org.neuroph.core.learning.TrainingSet;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; org.neuroph.core.learning.TrainingElement;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; org.neuroph.core.learning.SupervisedTrainingElement;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; org.neuroph.nnet.learning.MomentumBackpropagation;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.util.Vector;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; org.neuroph.util.TransferFunctionType;&lt;/span&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; XorBackPropagation {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;static&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;main&lt;/span&gt;&lt;span style="color: #141312;"&gt; (&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;[] args) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        TrainingSet trainingSet = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;TrainingSet&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        trainingSet.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;addElement&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;SupervisedTrainingElement&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;[]{&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;}, &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;[]{&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;}));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        trainingSet.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;addElement&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;SupervisedTrainingElement&lt;/span&gt;&lt;span style="color: #141312;"&gt;&lt;br /&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;[]{&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;}, &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;[]{&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;}));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        trainingSet.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;addElement&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;SupervisedTrainingElement&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;[]{&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;}, &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;[]{&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;}));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        trainingSet.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;addElement&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;SupervisedTrainingElement&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;[]{&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;}, &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;[]{&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;}));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;// create multi layer perceptron&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        MultiLayerPerceptron myMlPerceptron = &lt;b&gt;&lt;br /&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;MultiLayerPerceptron&lt;/span&gt;&lt;span style="color: #141312;"&gt;(TransferFunctionType.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;TANH&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;2&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;3&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Create Backpropagation with momentum&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        MomentumBackpropagation mb =&lt;br /&gt;&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;MomentumBackpropagation&lt;/span&gt;&lt;span style="color: #141312;"&gt;(myMlPerceptron);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Properties to MomentumBackpropagation&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        mb.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setMomentum&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0.85&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        mb.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setMaxError&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0.0001&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        mb.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setMaxIterations&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1000&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Learn&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;long&lt;/span&gt;&lt;span style="color: #141312;"&gt; t1, t2;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        t1 = &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;currentTimeMillis&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        mb.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;learn&lt;/span&gt;&lt;span style="color: #141312;"&gt;(trainingSet);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        t2 = &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;currentTimeMillis&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Tiempo de entrenamiento: "&lt;/span&gt;&lt;span style="color: #141312;"&gt; +&lt;br /&gt;(t2-t1) + &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;" milisegundos"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Get net&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        NeuralNetwork nn = mb.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getNeuralNetwork&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Display the results&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;for&lt;/b&gt;(TrainingElement trainingElement :&lt;br /&gt;trainingSet.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;trainingElements&lt;/span&gt;&lt;span style="color: #141312;"&gt;()) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                nn.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setInput&lt;/span&gt;&lt;span style="color: #141312;"&gt;(trainingElement.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getInput&lt;/span&gt;&lt;span style="color: #141312;"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                nn.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;calculate&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Vector&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Double&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&amp;gt; networkOutput = nn.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getOutput&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;print&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Input: "&lt;/span&gt;&lt;span style="color: #141312;"&gt; + trainingElement.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getInput&lt;/span&gt;&lt;span style="color: #141312;"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;" Output: "&lt;/span&gt;&lt;span style="color: #141312;"&gt; + networkOutput);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;exit&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;________________________________________________________________&lt;br /&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-5701913274283347888?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/5701913274283347888/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/02/problema-del-xor-con-neuroph.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/5701913274283347888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/5701913274283347888'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/02/problema-del-xor-con-neuroph.html' title='Problema del XOR con Neuroph'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-2925518337709426109</id><published>2010-02-24T15:19:00.013Z</published><updated>2010-02-26T00:12:55.742Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Redes Neuronales'/><title type='text'>Juego Pong: segunda parte</title><content type='html'>Recordando un poco la primera parte, el objetivo es desarrollar el juego Pong en Java que, mediante una &lt;span style="font-weight: bold;"&gt;red neuronal tipo Backpropagation&lt;/span&gt;, se le presente los datos de entrada (muchos de ellos puede que hayan sido los de entrenamiento) y averigüe dónde va a caer la pelota, desplazando la raqueta hasta la posición deseada.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Para ello primero la red debe pasar una etapa de entrenamiento en la que se irán a recogiendo los movimientos que hace el usuario, es decir, que la red va a intentar aprender de lo que hace el jugador en este proceso de entrenamiento. Una vez entrenado, el juego debe enfrentarse contra lo que ha aprendido.&lt;br /&gt;&lt;br /&gt;El juego está implementado en el lenguaje de programación Java y se hace uso de un framework de software libre &lt;span class="textbf"&gt;neuroph&lt;/span&gt;. El juego se divide en tres etapas:  &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="textbf" style="font-weight: bold;"&gt;Etapa de entrenamiento&lt;/span&gt;: El juego almacena lo que hace el usuario. En este punto, se recogen las acciones del usuario para poder pasárselas en una etapa posterior a la red neuronal. &lt;/li&gt;&lt;li&gt;&lt;span class="textbf" style="font-weight: bold;"&gt;Etapa de aprendizaje&lt;/span&gt;: Se entrena la propia red neuronal, pasándole los valores entrenados con el valor deseado. Es por tanto una red con aprendizaje supervisado. Se emplea una red de tipo &lt;span style="font-weight: bold;"&gt;BackPropagation con Momentum &lt;/span&gt;para agilizar el proceso de aprendizaje. &lt;/li&gt;&lt;li&gt;&lt;span class="textbf" style="font-weight: bold;"&gt;Etapa de juego&lt;/span&gt;: El juego se enfrenta con lo que ha aprendido. Se deduce que mientras más juegue el usuario en la etapa de aprendizaje, mejor entrenada estará la red y mejor será jugando en esta última etapa. &lt;/li&gt;&lt;/ul&gt;&lt;span style="color: black; font-weight: bold;"&gt;&lt;br /&gt;Interfaz gráfica&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;La interfaz gráfica consta de dos partes principales:  &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Un panel de dibujo donde estará la pelota y la raqueta de juego. &lt;/li&gt;&lt;li&gt;Una zona de control, donde estarán varios botones para el entrenamiento y el testeo del juego. &lt;/li&gt;&lt;/ul&gt;El panel de dibujo, corresponde con la clase &lt;tt&gt;PanelDibujo&lt;/tt&gt;. Esta clase implementa, entre otras, a la interfaz &lt;tt&gt;Runnable&lt;/tt&gt;, y por tanto, es un &lt;span class="textbf"&gt;Thread&lt;/span&gt;. El motivo por el que es un Thread es para mantener en un bucle infinito la animación de la pelota y de la raqueta y al mismo tiempo realizando la captura de datos, además de poder dar diferentes velocidades durmiendo menos tiempo el dicho Thread. &lt;br /&gt;La clase &lt;tt&gt;ControlPanel&lt;/tt&gt; corresponde con la creación de los botones y etiquetas con información. La clase &lt;tt&gt;MarcoPong&lt;/tt&gt; es la encargada de componer todos los elementos de la ventana y de registrar los eventos de los botones como oyentes de la clase &lt;tt&gt;PanelDibujo&lt;/tt&gt;. Es por ello, que la clase PanelDibujo también implementa las interfaz &lt;tt&gt;ActionListener&lt;/tt&gt;.  &lt;br /&gt;Por último, la clase &lt;tt&gt;Test&lt;/tt&gt;, instancia la clase &lt;tt&gt;MarcoPong&lt;/tt&gt; y registra el exit para salir.  &lt;br /&gt;&lt;h4&gt;&lt;a href="" name="SECTION00041010000000000000"&gt; Clase Test&lt;/a&gt; &lt;/h4&gt;&lt;pre&gt;1 import java.awt.event.*;&lt;br /&gt;2 import javax.swing.*;&lt;br /&gt;3&lt;br /&gt;4 public class Test {&lt;br /&gt;5&lt;br /&gt;6    public static void main( String args[]) {&lt;br /&gt;7      MarcoPong frame = new MarcoPong("Pong Game");&lt;br /&gt;8      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;9      frame.setVisible(true);&lt;br /&gt;10  }&lt;br /&gt;11 }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="" name="SECTION00041020000000000000"&gt; Clase MarcoPong&lt;/a&gt; &lt;/h4&gt;&lt;pre&gt;1 import java.awt.*;&lt;br /&gt;2 import java.awt.event.*;&lt;br /&gt;3 import javax.swing.*;&lt;br /&gt;4&lt;br /&gt;5 public class MarcoPong extends JFrame {&lt;br /&gt;6&lt;br /&gt;7     public static final int WIDTH = 400;&lt;br /&gt;8     public static final int HEIGHT = 300;&lt;br /&gt;9&lt;br /&gt;10  public MarcoPong(String t) {&lt;br /&gt;11   super(t);&lt;br /&gt;12         setSize(WIDTH, HEIGHT);&lt;br /&gt;13         JPanel panel = new PanelContenedor();&lt;br /&gt;14      Container contentPanel = this.getContentPane();&lt;br /&gt;15      contentPanel.add(panel);&lt;br /&gt;16   }&lt;br /&gt;17 }&lt;br /&gt;18&lt;br /&gt;19 class PanelContenedor extends JPanel {&lt;br /&gt;20     PanelDibujo pd;&lt;br /&gt;21     ControlPanel cp;&lt;br /&gt;22&lt;br /&gt;23     public PanelContenedor() {&lt;br /&gt;24         pd = new PanelDibujo();&lt;br /&gt;25         cp = new ControlPanel();&lt;br /&gt;26         setLayout(new BorderLayout());&lt;br /&gt;27         add(BorderLayout.CENTER, pd);&lt;br /&gt;28         add(BorderLayout.EAST, cp);&lt;br /&gt;29         cp.bTraining.addActionListener(pd);&lt;br /&gt;30         cp.bStop.addActionListener(pd);&lt;br /&gt;31         cp.bPlay.addActionListener(pd);&lt;br /&gt;32   Thread t = new Thread(pd);&lt;br /&gt;33   t.start();&lt;br /&gt;34    }&lt;br /&gt;35 }&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;&lt;a href="" name="SECTION00041030000000000000"&gt; Clase ControlPanel&lt;/a&gt; &lt;/h4&gt;&lt;pre&gt;1 import java.awt.*;&lt;br /&gt;2 import java.awt.event.*;&lt;br /&gt;3 import javax.swing.*;&lt;br /&gt;4&lt;br /&gt;5 public class ControlPanel extends JPanel {&lt;br /&gt;6&lt;br /&gt;7     public JButton bTraining;&lt;br /&gt;8     public JButton bPlay;&lt;br /&gt;9     public JButton bStop;&lt;br /&gt;10     public static JLabel labelT;&lt;br /&gt;11     public static JLabel labelG;&lt;br /&gt;12     public static JLabel labelF;&lt;br /&gt;13&lt;br /&gt;14     public ControlPanel() {&lt;br /&gt;15         // setLayout (new BorderLayout());&lt;br /&gt;16         setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));&lt;br /&gt;17         setLayout(new GridLayout(8, 1, 2, 3));&lt;br /&gt;18         bTraining = new JButton("Training");&lt;br /&gt;19         bPlay = new JButton("Play");&lt;br /&gt;20   bStop = new JButton("Stop");&lt;br /&gt;21         labelT = new JLabel("Total: 0");&lt;br /&gt;22         labelG = new JLabel("Goods: 0");&lt;br /&gt;23         labelF = new JLabel("Failure: 0");&lt;br /&gt;24         add(bTraining);&lt;br /&gt;25         add(bStop);&lt;br /&gt;26         add(bPlay);&lt;br /&gt;27         add(labelT);&lt;br /&gt;28         add(labelG);&lt;br /&gt;29         add(labelF);&lt;br /&gt;30     }&lt;br /&gt;31 }&lt;br /&gt;32&lt;span style="font-size: 130%;"&gt;&lt;a href="" name="SECTION00042000000000000000"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-family: Georgia,serif;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Entrada de datos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al pulsar el botón &lt;span class="textbf" style="font-size: 100%;"&gt;Training&lt;/span&gt;&lt;span style="font-size: 100%;"&gt; comenzará la fase de recogida de datos que serán entregados a la red neuronal. Los datos a recoger son:  &lt;/span&gt;&lt;br /&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;La posición según eje x de la pelota. &lt;/li&gt;&lt;li&gt;La dirección a la que va la pelota: 0 para la izquierda y 1 para la derecha.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;El único dato de salida es:  &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;La posición x a la que tiene que ir la pelota. &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Por tanto, a la entrada de datos, para cada par (x, dirección) se le asocia una salida que es la posición x de la raqueta.  &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para representar los datos de entrada, se ha hecho la clase &lt;tt&gt;NetData&lt;/tt&gt; que cuenta con los siguientes atributos:  &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;int dir : dirección de la pelota. &lt;/li&gt;&lt;li&gt;double xracket: valor entre 0 y 1, pues la red neuronal trabaja con estos valores. Entonces se tiene que hacer es escalado a la entrada y salida de este dato. &lt;/li&gt;&lt;/ul&gt;&lt;h4 style="font-weight: bold;"&gt;&lt;a href="" name="SECTION00042010000000000000"&gt;¿Cómo se asocian los datos?&lt;/a&gt;&lt;/h4&gt;&lt;h4 style="font-weight: normal;"&gt;Se almacena el par (x, dir) cuando la pelota está en y = 10. Esto es una línea en la parte superior de la zona de juego tal y como se ve en la figura (la línea azul). A este par (x, dir) se le asocia como salida la x de la raqueta normalizada, esto es, dividiendo la x de la raqueta entre &lt;tt&gt;MAXX&lt;/tt&gt; (constante en el programa que indica la dimensión de las x del panel de dibujo).&lt;span style="font-size: 100%;"&gt;&lt;a href="" name="SECTION00043000000000000000"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;/h4&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;a href="http://4.bp.blogspot.com/_TAzjkcP2UpE/S4Vt_icS04I/AAAAAAAAArA/X8Dh6T9PEiM/s1600-h/Diagrama1b.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5441876663091778434" src="http://4.bp.blogspot.com/_TAzjkcP2UpE/S4Vt_icS04I/AAAAAAAAArA/X8Dh6T9PEiM/s400/Diagrama1b.png" style="display: block; height: 222px; margin: 0px auto 10px; text-align: center; width: 284px;" /&gt;&lt;/a&gt;&lt;/h4&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="" name="SECTION00043000000000000000"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h4&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: bold;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;&lt;h4 style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: bold;"&gt;Entrenamiento MomentumBackpropagation&lt;/span&gt; &lt;/span&gt;&amp;nbsp;&lt;/h4&gt;&lt;h4 style="font-weight: normal;"&gt;Se ha usado una topología de &lt;b&gt;red multicapa fullconection&lt;/b&gt; con &lt;b&gt;entretamiento tipo Backpropagation y función de activación sigmoide&lt;/b&gt;&lt;b&gt;.&lt;/b&gt; El número de capas son 3: la capa de entrada a a red, la capa oculta que cuenta con &lt;span class="textbf"&gt;4&lt;/span&gt; neuronas y la capa de salida con una neurona.&lt;/h4&gt;&lt;h2&gt;&lt;a href="" name="SECTION00043000000000000000"&gt; &lt;/a&gt;&lt;/h2&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;a href="" name="SECTION00043030000000000000"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Creación de la red&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;&lt;/h4&gt;&lt;pre&gt;78 multiLaterPerceptron = new MultiLayerPerceptron&lt;br /&gt;(TransferFunctionType.SIGMOID, 2, 4, 1);&lt;br /&gt;&lt;/pre&gt;&lt;a href="" name="SECTION00043040000000000000"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Entrenamiento&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="" name="SECTION00043040000000000000"&gt;&lt;/a&gt;&lt;/h4&gt;&lt;pre&gt;357         mb = new MomentumBackpropagation(multiLaterPerceptron);&lt;br /&gt;358         mb.setMomentum(0.9);&lt;br /&gt;359         mb.setMaxError(0.1E-90);&lt;br /&gt;360         mb.setMaxIterations(3000);&lt;br /&gt;361         long t1, t2;&lt;br /&gt;362         t1 = System.currentTimeMillis();&lt;br /&gt;363         mb.learn(trainingSet);&lt;br /&gt;364         t2 = System.currentTimeMillis();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;&lt;span style="font-size: small;"&gt;&lt;a href="" name="SECTION00044000000000000000"&gt; Salida de datos&lt;/a&gt;&lt;/span&gt; &lt;/h2&gt;Accedemos a esta parte pulsando el botón &lt;span class="textbf"&gt;PLAY&lt;/span&gt; (previamente de tiene que haber entrenado). A partir de este momento, la salida x de la raqueta se obtiene tras haber introducido como entrada a la red la x y la dirección por la que va la pelota cuando y = 10. Es decir, cuando la pelota esté en y = 10, se obtiene la dirección de la pelota y su valor en el eje x. Esto se le pasa como entrada a la red neuronal y devuelve un valor de salida. éste, es un valor normalizado que habrá que multiplicar por MAXX para obtener la posición X de la raqueta.&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://neuroph.sourceforge.net/"&gt;http://neuroph.sourceforge.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Backpropagation"&gt;http://en.wikipedia.org/wiki/Backpropagation&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Código fuente completo:&lt;br /&gt;&lt;/span&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://cid-034b1fe01c759918.skydrive.live.com/embedicon.aspx/snatverk/Pong.tar.gz" style="background-color: #fcfcfc; height: 115px; padding: 0pt; width: 98px;" title="Preview"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Para compilar es necesario el compilador de java-sun. Además es necesario incluir el directorio org del framework neuroph en el directorio donde estén los fuentes de juego.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-2925518337709426109?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/2925518337709426109/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/02/juego-pong-segunda-parte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2925518337709426109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2925518337709426109'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/02/juego-pong-segunda-parte.html' title='Juego Pong: segunda parte'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_TAzjkcP2UpE/S4Vt_icS04I/AAAAAAAAArA/X8Dh6T9PEiM/s72-c/Diagrama1b.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-5667424404238204079</id><published>2010-02-03T10:27:00.004Z</published><updated>2010-02-03T10:29:20.771Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Richard Stallman en Tenerife</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Richard_Stallman"&gt;Richard Stallman&lt;/a&gt; dará el próximo día &lt;b&gt;8 de febrero&lt;/b&gt; una charla en el &lt;b&gt;Auditorio de Guía de Isora&lt;/b&gt;. Según el cartel "hablará sobre las metas y la filosofía del movimiento del Software Libre, y el estado y la historia del sistema operativo GNU".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La charla será de 11:30 a 14:30. La &lt;b&gt;entrada será libre y gratuita&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Links: &lt;a href="http://www.fsf.org/events/20100208tenerife%20"&gt;http://www.fsf.org/events/20100208tenerife &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/4725769270409658023-5667424404238204079?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/5667424404238204079/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/02/richard-stallman-en-tenerife.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/5667424404238204079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/5667424404238204079'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/02/richard-stallman-en-tenerife.html' title='Richard Stallman en Tenerife'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-6384787702647482393</id><published>2010-01-13T18:57:00.004Z</published><updated>2010-01-23T18:05:05.804Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Redes Neuronales'/><title type='text'>Juego Pong(I): versión alfa</title><content type='html'>&lt;div style="text-align: justify;"&gt;Tengo que hacer un pequeño proyecto para la asignatura de &lt;b&gt;Modelos Conexionistas&lt;/b&gt; y he decidido implementar el &lt;b&gt;juego Pong mediante una Red Neuronal supervisada&lt;/b&gt; en &lt;b&gt;Java&lt;/b&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El trabajo consiste en que el jugador comience a entrenar la red. Para ello , simplemente se pone a jugar en tipo frontón (contra una pared) y se van recogiendo los datos (para cada tupla (x, y, dirección_pelota), se pueden dar 3 salidas posibles: quedarse parado, ir a la izquierda o ir a la derecha). Luego, se pasan esos datos por una red neuronal. En principio voy a coger BackPropagation. Una vez entrenada la red, un jugador se enfrenta contra los valores aprendidos en el proceso de aprendizaje de la red.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esta versión, a la que he llamado &lt;b&gt;Pong-Alfa2&lt;/b&gt; (la alfa1 es muy simple), sólo está implementada la interfaz gráfica en Java. Mi intención es ir colocando todo el proceso poco a poco (a medida que lo vaya haciendo). En esta versión, aunque aparezca entrenamiento, no se está entrenando, sólo se controla la interfaz gráfica. Se comienza a jugar dando al botón &lt;b&gt;"Training"&lt;/b&gt;. Cuando se falla, sale un mensaje "Game Over", entones se pulsa el botón Play para continuar. De momento lo tengo así, aunque esto lo cambiaré en las siguientes versiones.&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/_TAzjkcP2UpE/S04UKr_X7qI/AAAAAAAAAek/C7lH6LPLC2Q/s1600-h/Pong1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_TAzjkcP2UpE/S04UKr_X7qI/AAAAAAAAAek/C7lH6LPLC2Q/s320/Pong1.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_TAzjkcP2UpE/S04UMNlkjqI/AAAAAAAAAes/fhRD4jY8fjc/s1600-h/Pong2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_TAzjkcP2UpE/S04UMNlkjqI/AAAAAAAAAes/fhRD4jY8fjc/s320/Pong2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La clase principal, responsable de la captura de eventos del ratón y botones es la que he llamada PanelDibujo.java.&lt;br /&gt;_________________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/*&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * Juego PONG&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * Autor: Juan José Fumero Alfonso&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * web  : snatverk.blogspot.com&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.awt.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.awt.event.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; javax.swing.*;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.awt.geom.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.awt.geom.Point2D.*;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; PanelDibujo &lt;b&gt;extends&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;JPanel&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;implements&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Runnable&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;ActionListener&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;static&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;final&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; MAXY = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;405&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;static&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;final&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; MAXX = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;580&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;boolean&lt;/span&gt;&lt;span style="color: #141312;"&gt; arriba, izquierda;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;private&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; r, gr, b;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; x, y;  &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Coordenadas de la pelota&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Point&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; p; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;    Rectangle2D&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;Double&lt;/span&gt;&lt;span style="color: #141312;"&gt; rec;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Ellipse2D&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;Double&lt;/span&gt;&lt;span style="color: #141312;"&gt; cir;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;boolean&lt;/span&gt;&lt;span style="color: #141312;"&gt; gameOver;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    NetData[][] nL;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    NetData[][] nR;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;boolean&lt;/span&gt;&lt;span style="color: #141312;"&gt; training;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;boolean&lt;/span&gt;&lt;span style="color: #141312;"&gt; bloqueado;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;    &lt;/b&gt;&lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;PanelDibujo&lt;/span&gt;&lt;span style="color: #141312;"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setBackground&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Color&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;white&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Inicializamos atributos&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        p = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Point&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        rec = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Rectangle2D&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;Double&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        cir = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Ellipse2D&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;Double&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        gameOver = &lt;b&gt;false&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        nL = &lt;b&gt;new&lt;/b&gt; NetData[MAXX][MAXY];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        nR = &lt;b&gt;new&lt;/b&gt; NetData[MAXX][MAXY];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;for&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i &amp;lt; MAXX; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;for&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; j = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; j &amp;lt; MAXY; j++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                nL[i][j] = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;NetData&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                nR[i][j] = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;NetData&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                nR[i][j].&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setDir&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;true&lt;/b&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Registramos al objeto this como oyente de evento de movimiento&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;    //de ratón&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;this&lt;/b&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;addMouseMotionListener&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;MouseMotionAdapter&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;mouseMoved&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;MouseEvent&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; e)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;              p = e.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getPoint&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;              &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;repaint&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;run&lt;/span&gt;&lt;span style="color: #141312;"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Lógica de la pelota&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;b&gt;while&lt;/b&gt;(&lt;b&gt;true&lt;/b&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;if&lt;/b&gt; ((training) &amp;amp;&amp;amp; (!bloqueado)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; ((x &amp;lt; MAXX) &amp;amp;&amp;amp; (!izquierda)) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                x++;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;else&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                x--;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; (x == MAXX)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                izquierda = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; (x == &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                izquierda = &lt;b&gt;false&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; (y == (MAXY - &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;) &amp;amp;&amp;amp; (!arriba)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;b&gt;if&lt;/b&gt; (((p.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getX&lt;/span&gt;&lt;span style="color: #141312;"&gt;() - &lt;/span&gt;&lt;span style="color: #b08000;"&gt;25&lt;/span&gt;&lt;span style="color: #141312;"&gt;) &amp;lt;= x) &amp;amp;&amp;amp; (p.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getX&lt;/span&gt;&lt;span style="color: #141312;"&gt;() + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;25&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;gt;= x)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Ok: sigue jugando"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    arriba = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;b&gt;else&lt;/b&gt; &lt;b&gt;if&lt;/b&gt; (!arriba) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Matado!!!!"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    gameOver = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;repaint&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    bloqueado = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; ((y &amp;lt; MAXY) &amp;amp;&amp;amp; (!arriba)) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                y++;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;else&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                y--;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; (y == MAXY)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                arriba = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; (y == &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                arriba = &lt;b&gt;false&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            } &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;         repaint&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;         try&lt;/b&gt; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;              &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;sleep&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;5&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;           }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;        catch&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Exception&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; e) { &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Error: Eception"&lt;/span&gt;&lt;span style="color: #141312;"&gt; + e.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;toString&lt;/span&gt;&lt;span style="color: #141312;"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;           }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;paintComponent&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Graphics&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; g) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;super&lt;/b&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;paintComponent&lt;/span&gt;&lt;span style="color: #141312;"&gt;(g);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;if&lt;/b&gt; (!gameOver) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;GeneralPath&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; gp = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;GeneralPath&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Graphics2D&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; g2 = (&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Graphics2D&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;)g;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Dibujamos zona de juego&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            gp.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;moveTo&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            gp.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;lineTo&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;, MAXY + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            gp.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;moveTo&lt;/span&gt;&lt;span style="color: #141312;"&gt;(MAXX + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            gp.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;lineTo&lt;/span&gt;&lt;span style="color: #141312;"&gt;(MAXX + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;, MAXY + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            gp.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;moveTo&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, MAXY + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            gp.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;lineTo&lt;/span&gt;&lt;span style="color: #141312;"&gt;(MAXX  + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;, MAXY + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            gp.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;moveTo&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            gp.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;lineTo&lt;/span&gt;&lt;span style="color: #141312;"&gt;(MAXX + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            g2.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;draw&lt;/span&gt;&lt;span style="color: #141312;"&gt;(gp);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            g2.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setPaint&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Color&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(r, gr, b));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            rec.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setRect&lt;/span&gt;&lt;span style="color: #141312;"&gt;((p.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getX&lt;/span&gt;&lt;span style="color: #141312;"&gt;()-&lt;/span&gt;&lt;span style="color: #b08000;"&gt;25&lt;/span&gt;&lt;span style="color: #141312;"&gt;), MAXY + &lt;/span&gt;&lt;span style="color: #b08000;"&gt;5&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;50&lt;/span&gt;&lt;span style="color: #141312;"&gt;,&lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            g2.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;fill&lt;/span&gt;&lt;span style="color: #141312;"&gt;(rec);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            g2.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setPaint&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Color&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;255&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            cir.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setFrame&lt;/span&gt;&lt;span style="color: #141312;"&gt;(x, y, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;15&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;15&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            g2.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;fill&lt;/span&gt;&lt;span style="color: #141312;"&gt;(cir);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;else&lt;/b&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            g.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setFont&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;( &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Helvetica"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;BOLD&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;50&lt;/span&gt;&lt;span style="color: #141312;"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            g.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;drawString&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"GAME OVER"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;150&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;200&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;actionPerformed&lt;/span&gt;&lt;span style="color: #141312;"&gt; (&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;ActionEvent&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; e) {&lt;/span&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; nameButton = e.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getActionCommand&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;if&lt;/b&gt; (e.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getSource&lt;/span&gt;&lt;span style="color: #141312;"&gt;() &lt;b&gt;instanceof&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;JButton&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Training"&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;equals&lt;/span&gt;&lt;span style="color: #141312;"&gt;(nameButton))  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                training = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Se ha pulsado Training"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Play"&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;equals&lt;/span&gt;&lt;span style="color: #141312;"&gt;(nameButton))  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                training = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Se ha pulsado play"&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                bloqueado = &lt;b&gt;false&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                gameOver = &lt;b&gt;false&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;} &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;_________________________________________________________&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;br /&gt;La clase &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NetData&lt;/span&gt; está preparada para la recogida de datos: en esta primera versión sólo se inicializan. &lt;br /&gt;&lt;br /&gt;Puede descargar el código completo aquí:&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://cid-034b1fe01c759918.skydrive.live.com/embedicon.aspx/snatverk/PongAlfa2.tar.gz" style="background-color: #fcfcfc; height: 115px; padding: 0pt; width: 98px;" title="Preview"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-6384787702647482393?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/6384787702647482393/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2010/01/juego-pong.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6384787702647482393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/6384787702647482393'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2010/01/juego-pong.html' title='Juego Pong(I): versión alfa'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_TAzjkcP2UpE/S04UKr_X7qI/AAAAAAAAAek/C7lH6LPLC2Q/s72-c/Pong1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-3823710666770386114</id><published>2009-12-29T17:29:00.008Z</published><updated>2009-12-29T17:38:51.469Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Animación3D'/><title type='text'>Animación 3D: MultiEyeS</title><content type='html'>&lt;div style="text-align: justify;"&gt;La siguiente animación la hice en una asignatura que tuve hace 2 años (técnicas gráficas). Hace poco, haciendo limpia y copias de seguridad lo encontré y lo grabé por demanda de algunos de mis compañeros de clase. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/iWedydxXxpg&amp;hl=es_ES&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/iWedydxXxpg&amp;hl=es_ES&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La animación está hecha con &lt;b&gt;OpenGL&lt;/b&gt; sobre &lt;b&gt;C#&lt;/b&gt;. Para poder usar OpenGL, incluí en el proyecto &lt;a href="http://www.taoframework.com/"&gt;TAO Framework&lt;/a&gt; que es un conjunto de clases para &lt;b&gt;.NET&lt;/b&gt; y &lt;b&gt;Mono&lt;/b&gt; con OpenGL, OpenAL, FreeGlut entre otros.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Cómo se hizo&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La aplicación está escrita en C# usando la plataforma .NET.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La idea es muy sencilla.&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Un rectángulo donde se proyecta la imagen de fondo. En el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;timer&lt;/span&gt;, lo que se hace es ir variando poco a poco el color del material.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Una esfera, donde se le ha incorporado la imagen del ojo modificada para que no quede la imagen desplazada. En el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;timer&lt;/span&gt; se va incrementando el ángulo de rotación.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;El conjunto de esferas más pequeñas (20) que salen del ojo. Las esferas se van insertando una encima de la otra (trasladando la coordenada de las íes en una distancia igual a la mitad del diámetro).&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Por ejemplo, el bucle donde se van apilando las esferas es el siguiente:&lt;br /&gt;&lt;/div&gt;______________________________________________________________________&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;                &lt;b&gt;for&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i &amp;lt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;20&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i++)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glTranslated&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0.65&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glRotated&lt;/span&gt;&lt;span style="color: #141312;"&gt;(-yrot, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//DrawSphere2();&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                    Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glCallList&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;3&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;______________________________________________________________________&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Donde el método Gl.glCallList(3) es la lista de presentación 3 englobada en el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DrawSphere2.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;______________________________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;private&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;ListDrawSphere2&lt;/span&gt;&lt;span style="color: #141312;"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glNewList&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;3&lt;/span&gt;&lt;span style="color: #141312;"&gt;, Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GL_COMPILE&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;DrawSphere2&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glEndList&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;private&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;DrawSphere2&lt;/span&gt;&lt;span style="color: #141312;"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glPushMatrix&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glEnable&lt;/span&gt;&lt;span style="color: #141312;"&gt;(Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GL_TEXTURE_2D&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glTexEnvi&lt;/span&gt;&lt;span style="color: #141312;"&gt;(Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GL_TEXTURE_2D&lt;/span&gt;&lt;span style="color: #141312;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GL_TEXTURE_ENV_MODE&lt;/span&gt;&lt;span style="color: #141312;"&gt;, (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt;)Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GL_DECAL&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Se usa la textura que el usuario selecciona en el combo&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glBindTexture&lt;/span&gt;&lt;span style="color: #141312;"&gt;(Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GL_TEXTURE_2D&lt;/span&gt;&lt;span style="color: #141312;"&gt;, texture[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;7&lt;/span&gt;&lt;span style="color: #141312;"&gt;]);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glFrontFace&lt;/span&gt;&lt;span style="color: #141312;"&gt;(Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GL_CCW&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Glu.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GLUquadric&lt;/span&gt;&lt;span style="color: #141312;"&gt; p = Glu.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;gluNewQuadric&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Glu.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;gluQuadricDrawStyle&lt;/span&gt;&lt;span style="color: #141312;"&gt;(p, Glu.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GLU_FILL&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Glu.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;gluQuadricNormals&lt;/span&gt;&lt;span style="color: #141312;"&gt;(p, Glu.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GLU_SMOOTH&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Glu.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;gluQuadricTexture&lt;/span&gt;&lt;span style="color: #141312;"&gt;(p, Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;GL_TRUE&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            Glu.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;gluSphere&lt;/span&gt;&lt;span style="color: #141312;"&gt;(p, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1.5&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;30&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;30&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;            Gl.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;glPopMatrix&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;______________________________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Música y Foto &lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;La música es un fragmento de la canción de &lt;b&gt;Tool&lt;/b&gt; (Intension) del álbum Vicarious (2006). Aunque se ha modificado ligeramente con el Audacity.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;La foto del ojo se ha modificado con el Photoshop (aquella época en la que lo usaba), aunque con el GIMP se puede hacer también y queda igual.&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/4725769270409658023-3823710666770386114?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/3823710666770386114/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/12/animacion-3d-multieyes.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/3823710666770386114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/3823710666770386114'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/12/animacion-3d-multieyes.html' title='Animación 3D: MultiEyeS'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-8989767493002833523</id><published>2009-12-28T17:10:00.000Z</published><updated>2009-12-28T17:10:48.677Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acer Aspire One'/><title type='text'>Reconocer tarjetas SD en AAO con Ubuntu 9.10</title><content type='html'>Al instalar Ubuntu en el &lt;b&gt;A&lt;/b&gt;cer &lt;b&gt;A&lt;/b&gt;spire &lt;b&gt;O&lt;/b&gt;ne, es posible que no reconozca el lector de tarjetas SD. Existe al menos una solución. En el blog de &lt;a href="http://www.hayunmundoahifuera.es/27-05-2009/habilitar-el-lector-de-tarjetas-del-aspire-one-con-ubuntu.php"&gt;hayunmundoahifuera&lt;/a&gt; está la solución muy bien explicado, tanto para Ubuntu 9.10 como para versiones anteriores.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-8989767493002833523?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/8989767493002833523/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/12/reconocer-tarjetas-sd-en-aao-con-ubuntu.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8989767493002833523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8989767493002833523'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/12/reconocer-tarjetas-sd-en-aao-con-ubuntu.html' title='Reconocer tarjetas SD en AAO con Ubuntu 9.10'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-7942363396027234714</id><published>2009-11-26T22:09:00.001Z</published><updated>2010-01-04T13:59:50.876Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gnome'/><title type='text'>Plugin Latex para Gedit</title><content type='html'>&lt;div style="text-align: justify;"&gt;He estado buscando por internet y he encontrado un plugin para el editor de predeterminado de Gnome, el Gedit. Éste es un editor bastante sencillo y que confieso que nunca uso, soy más de vim, aunque para este tipo de tareas, si puedo disponer de un editor que agilice un poco la tarea, mucho mejor. El caso es que éste plugin incluye combinaciones de teclas, por ejemplo para generar y previsualizar&amp;nbsp; el pdf. También proporciona algunos botones para el tipo de letra, incluir items, tablas, código, gráficos, un panel lateral con los símbolos más usuales etc. En definitiva, algo parecido al kile, pero más ligero y sin errores (que el kile 2.1 para el KDE4 da bastantes problemas).&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Os dejo el enlace de descarga:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://live.gnome.org/Gedit/LaTeXPlugin/Development"&gt;http://live.gnome.org/Gedit/LaTeXPlugin/Development&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Cómo instalarlo &lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Es muy sencillo. Se descarga el tar.gz, lo descomprimimos y llevamos el contenido, que son un directorio y un fichero (GeditLaTeXPlugin/ y GeditLaTeXPlugin.gedit-plugin), al &lt;b&gt;directorio&lt;/b&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;~./gnome2/gedit/plugins&lt;/span&gt; .En el caso de que no exista el directorio plugins, lo creamos.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Luego abrimos en Gedit y en &lt;b&gt;Editar -&amp;gt; Preferencias&lt;/b&gt; y la pestaña &lt;b&gt;Complementos&lt;/b&gt;, activamos en GeditLatexPlugin.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para poder compilarlo, este plugin hace uso del programa rubber, que es un sistema de construcción de documentos de latex. En caso de que no esté instalado, hacemos:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install rubber &lt;/span&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Con esto, debería de funcionar.&lt;br /&gt;Enjoy!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-7942363396027234714?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/7942363396027234714/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/11/plugin-latex-para-gedit.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7942363396027234714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7942363396027234714'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/11/plugin-latex-para-gedit.html' title='Plugin Latex para Gedit'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-7448341278761137280</id><published>2009-10-23T17:19:00.002+01:00</published><updated>2009-10-23T21:33:34.946+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Mostrar la Hora en un Applet Java</title><content type='html'>El siguiente programa es un ejemplo muy sencillo de un Applet Java que muestra la hora actual del sistema. Se usa la interfaz Runnable para poder preguntar cada segundo por la hora actual. &lt;br /&gt;&lt;br /&gt;________________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/*&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; * Applet que muestra la hora en una etiqueta. &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.awt.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.awt.event.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; javax.swing.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.util.Calendar;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: olive;"&gt; java.util.GregorianCalendar;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; AppletHour &lt;b&gt;extends&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;JApplet&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;implements&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Runnable&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;private&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; hora, minutos, segundos;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;JLabel&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; label;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Calendar&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; calendario;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; h1;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;   public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;init&lt;/span&gt;&lt;span style="color: #141312;"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;    getContentPane&lt;/span&gt;&lt;span style="color: #141312;"&gt;().&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setLayout&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;BorderLayout&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;    Container&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; c = &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getContentPane&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            label = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;JLabel&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;" "&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            label.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setFont&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;( &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Helvetica"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Font&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;BOLD&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;50&lt;/span&gt;&lt;span style="color: #141312;"&gt; ));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            c.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;add&lt;/span&gt;&lt;span style="color: #141312;"&gt;(label, &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;BorderLayout&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;CENTER&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            h1 = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;this&lt;/b&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            h1.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;start&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;calcula&lt;/span&gt;&lt;span style="color: #141312;"&gt; () {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Calendar&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; calendario = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;GregorianCalendar&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        hora = calendario.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;get&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Calendar&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;HOUR_OF_DAY&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        minutos = calendario.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;get&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Calendar&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;MINUTE&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        segundos = calendario.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;get&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Calendar&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;SECOND&lt;/span&gt;&lt;span style="color: #141312;"&gt;); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;run&lt;/span&gt;&lt;span style="color: #141312;"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; ct = &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;currentThread&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;while&lt;/b&gt;(ct == h1) {   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;calcula&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            label.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;setText&lt;/span&gt;&lt;span style="color: #141312;"&gt;(hora + &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;":"&lt;/span&gt;&lt;span style="color: #141312;"&gt; + minutos + &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;":"&lt;/span&gt;&lt;span style="color: #141312;"&gt; + segundos);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;try&lt;/b&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;         &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;  //System.out.println(hora + ":" + minutos + ":" + segundos);&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;sleep&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1000&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;catch&lt;/b&gt;(&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;InterruptedException&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; e) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;stop&lt;/span&gt;&lt;span style="color: #141312;"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        h1 = &lt;b&gt;null&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;________________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_TAzjkcP2UpE/SuITAReBPZI/AAAAAAAAAaI/Ovq8uTAPDhY/s1600-h/Pantallazo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_TAzjkcP2UpE/SuITAReBPZI/AAAAAAAAAaI/Ovq8uTAPDhY/s640/Pantallazo.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-7448341278761137280?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/7448341278761137280/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/10/mostrar-la-hora-en-un-applet-java.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7448341278761137280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7448341278761137280'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/10/mostrar-la-hora-en-un-applet-java.html' title='Mostrar la Hora en un Applet Java'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TAzjkcP2UpE/SuITAReBPZI/AAAAAAAAAaI/Ovq8uTAPDhY/s72-c/Pantallazo.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-8342251979146701293</id><published>2009-10-09T17:13:00.003+01:00</published><updated>2009-10-10T11:19:10.888+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Thread en Java</title><content type='html'>&lt;div style="text-align: justify;"&gt;Los &lt;b&gt;Thread&lt;/b&gt; (hilos) en Java,&amp;nbsp; se les suele llamar también procesos ligeros &lt;i&gt;(lightweight processes)&lt;/i&gt;. Éstos consumen menos recursos que la creación y ejecución de un proceso normal. La creación de un proceso duplica exactamente los mismos recursos que el proceso padre (el que le creó), esto implica el estado del proceso, el contador de programa, información de planificación, etc. Cuando se crea un thread en Java, lo único que necesita es el contador de programa la pila de ejecución, puesto que los demás recursos los comparte con el padre.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Creación de Thread en Java &lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Hay dos formas de crear los Thread.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Heredando (&lt;b&gt;extends&lt;/b&gt;) de la clase &lt;b&gt;Thread&lt;/b&gt;. Esta clase se encuentra en el paquete java.lang. Este paquete se importa por defecto en todo programa Java.&lt;/li&gt;&lt;li&gt;Implementando la &lt;b&gt;interfaz Runnable&lt;/b&gt;. Esta interfaz se encuentra en el paquete java.lang.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Heredando de Thread&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Es muy sencillo. Se hereda y se implementa el método run(). Cuando queramos poner en marcha el thread, se invoca al método start, no al run. El método start es que el planifica y asigna recursos al thread. Un ejemplo: en el método run, se hace un bucle grande e imprime cada 500 Iteraciones y el thread que lo está ejecutando. Variando esta cantidad, se ve como se alternan los thread. &lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;________________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; *  Método 1: Heredando de la clase Thread&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; *  La clase Thread pertenece al paquete  &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; *  java.lang que se importa por defecto.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt; */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; TestThread &lt;b&gt;extends&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;static&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;main&lt;/span&gt;&lt;span style="color: #141312;"&gt; (&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; []args) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        TestThread h1 = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;TestThread&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        TestThread h2 = &lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;TestThread&lt;/span&gt;();&lt;span style="color: #141312;"&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;        //Creamos 2 thread&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;        h1.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;start&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        h2.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;start&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Si se hereda de la clase Thread, se debe &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//implementar el método run()&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;run&lt;/span&gt;&lt;span style="color: #141312;"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;for&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i &amp;lt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;500000&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i++)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; ((i % &lt;/span&gt;&lt;span style="color: #b08000;"&gt;500&lt;/span&gt;&lt;span style="color: #141312;"&gt;) == &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;getName&lt;/span&gt;&lt;span style="color: #141312;"&gt;()+ &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;" : "&lt;/span&gt;&lt;span style="color: #141312;"&gt; + i);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;________________________________________________________&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Implementando la interfaz Runnable&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Java no permite herencia múltiple. Por eso disponemos de la interfaz Runnable y así "permitir" herencia múltiple. Lo que tenemos que hacer es implementar, al igual que antes, el método run(). Además, para crear el Thread, ahora tenemos que crearnos un dato nuevo de tipo Thread y pasarle como argumento (en el contructor) el tipo implementado con la interfaz Runnable. Se ve mejor con un ejemplo.&lt;br /&gt;&lt;pre&gt;________________________________________________________&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; TestRunnable &lt;b&gt;implements&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Runnable&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Dato&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; hilo;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;TestRunnable&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; hilo) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;this&lt;/b&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;hilo&lt;/span&gt;&lt;span style="color: #141312;"&gt; = hilo;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;static&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;main&lt;/span&gt;&lt;span style="color: #141312;"&gt; (&lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt; []args) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        (&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;TestRunnable&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;))).&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;start&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        (&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;Thread&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;b&gt;new&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;TestRunnable&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;))).&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;start&lt;/span&gt;&lt;span style="color: #141312;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;public&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;void&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #644a9b;"&gt;run&lt;/span&gt;&lt;span style="color: #141312;"&gt; () {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;for&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i &amp;lt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;500000&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; ((i % &lt;/span&gt;&lt;span style="color: #b08000;"&gt;500&lt;/span&gt;&lt;span style="color: #141312;"&gt;) == &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;/span&gt;&lt;span style="color: #0095ff;"&gt;&lt;b&gt;System&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;out&lt;/span&gt;&lt;span style="color: #141312;"&gt;.&lt;/span&gt;&lt;span style="color: #644a9b;"&gt;println&lt;/span&gt;&lt;span style="color: #141312;"&gt;(hilo + &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;" : "&lt;/span&gt;&lt;span style="color: #141312;"&gt; + i);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;__________________________________________&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Referencias:&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/procthread.html"&gt;java.sun&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html"&gt;http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap7/creath.html"&gt;http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap7/creath.html&lt;/a&gt;&lt;br /&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/4725769270409658023-8342251979146701293?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/8342251979146701293/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/10/thread-en-java.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8342251979146701293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/8342251979146701293'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/10/thread-en-java.html' title='Thread en Java'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-7317609909319564882</id><published>2009-09-26T20:49:00.001+01:00</published><updated>2009-09-26T20:50:48.458+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FreePascal'/><title type='text'>Generando un makefile con fpcmake</title><content type='html'>&lt;div style="text-align: justify;"&gt;Con FreePascal, existe una herramienta llamada &lt;b&gt;fpcmake&lt;/b&gt; que genera un makefile a partir de un fichero de configuración, y así poder usar el make de GNU.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Instalación &lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;En Ubuntu, esta herramienta está incluida en el paquete &lt;b&gt;fp-utils&lt;/b&gt; (Un único paquete de 3730kB). Para instalarla hacemos:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install fp-utils &lt;/span&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Fichero de configuración&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El fichero de configuración tiene que llamarse &lt;b&gt;makefile.fpc&lt;/b&gt; . En él, escribimos los nombres de los fuentes (units, ficheros principales y ejemplos), versión del compilador a usar, nombre de paquete, versión, etc. No son obligatorias todas las etiquetas, lo que, si no se definen, no estarás dichas disponibles las opciones en el makefile.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Algunas de las secciones son las siguientes:&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;[target]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Esta sección es la más importante del fichero makefile.fpc. Es donde están especificadas las reglas para compilar todo (make all) y de donde se coge el make default. Algunas de las opciones son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;programs&lt;/b&gt;: lista de programas separadas por espacio sin la extensión .pas. El fpcmake los pone automáticamente.&lt;/li&gt;&lt;li&gt;&lt;b&gt;units &lt;/b&gt;: lista de unidades separadas por espacios sin la extensión. El fpcmake los pone automáticamente.&lt;/li&gt;&lt;li&gt;&lt;b&gt;examples&lt;/b&gt;: lista de programas de ejemplo. Al igual que los dos anteriores, separados por espacio y sin extensión.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;[compiler]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;En esta sección se puede especificar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;version&lt;/b&gt;: en esta sección se puede especificar la versión del compiladors&lt;/li&gt;&lt;li&gt;&lt;b&gt;options&lt;/b&gt;: las opciones para compilar. Por ejemplo, le podemos pasar -g para depurar.&lt;/li&gt;&lt;li&gt;&lt;b&gt;unitdir&lt;/b&gt;: lista de directorios separados por dos puntos de las units incluidas (si están en otro directorio). Hay que pasarle al compulador la opción &lt;b&gt;-Fu&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;[package]&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Un paquete es un conjuto de units. En esta sección se pueden especificar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;name&lt;/b&gt;: nombre del paquete.&lt;/li&gt;&lt;li&gt;&lt;b&gt;version&lt;/b&gt;: versión del paquete&lt;/li&gt;&lt;li&gt;&lt;b&gt;main&lt;/b&gt;: para indicar el paquete forma parte de otro paquete.&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;Existen más secciones como &lt;i&gt;&lt;b&gt;install&lt;/b&gt;&lt;/i&gt; (donde se especifican los directorios donde se colocarán los programas y datos), &lt;i&gt;&lt;b&gt;dist&lt;/b&gt;&lt;/i&gt;, para crear una distribución de los programas etc.&lt;br /&gt;Para más detalle, se puede consultar el manual en consola:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ man 5 fpcmake&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Otra fuente es el apéndice E de la guía de programadores de freepascal. &lt;a href="ftp://ftp.freepascal.org/pub/fpc/docs-pdf/prog.pdf"&gt;link&lt;/a&gt;. Aquí está todo bien detallado.&lt;br /&gt;&lt;br /&gt;Un ejemplo sencillo es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ &lt;b&gt;cat -n makefile.fpc&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; [target]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp; programs=main&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Programa principal&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp; units=unit1 unit2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Todas las units&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp; examples=test1 test2 &amp;nbsp; #Programas ejemplo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&amp;nbsp;&amp;nbsp;&amp;nbsp; [compiler]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&amp;nbsp;&amp;nbsp;&amp;nbsp; version=2.2.2-8&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9&amp;nbsp;&amp;nbsp;&amp;nbsp; options=-g&amp;nbsp;&amp;nbsp; #opciones del compilador&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="background-color: #666666; color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Generar el Makefile&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Una vez hecho el archivo de configuración hacemos:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ fpcmake&lt;br /&gt;Processing makefile.fpc&lt;br /&gt;&amp;nbsp;i386-linux requires: rtl&lt;br /&gt;&amp;nbsp;Writing Makefile&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Usando make&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Con el makefile generado, tenemos múltiples opciones. Algunas de ellas son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;make&lt;/b&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : compila los princiales más las units especificadas. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;make examples&lt;/b&gt;: compila los programas ejemplos.&lt;/li&gt;&lt;li&gt;&lt;b&gt;make clean&lt;/b&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; : borra todos los .o y .ppu&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;make install&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : instala los programas más las units.&lt;/li&gt;&lt;li&gt;&lt;b&gt;make info&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : devuelve información acerca del programa, directorios de trabajo, versión, librerías, etc.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Nota: cuando hacemos el make, se nos crea una carpeta units/ donde se van a colocar todos los .o y .ppu. Al hacer make clean, se borrarán de este directorio.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;#bug en versiones debian&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Hay un bug en versiones del compilador 2.2.0 para sistemas de 64 bits: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ &lt;b&gt;fpcmake -v&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;FPCMake Version 2.0.0 [2009/01/08]&lt;br /&gt;Processing makefile.fpc&lt;br /&gt;&amp;nbsp;Targets: "x86_64-linux"&lt;br /&gt;&amp;nbsp;Globals:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FPCDIR = ""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PACKAGESDIR = "$(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra $(FPCDIR)/packages"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNITSDIR = "$(FPCDIR)/units/$(FULLTARGET)"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BASEDIR = "/home/juanjo/Desktop/Clases0910/FreePascal/listas"&lt;br /&gt;&amp;nbsp;Required packages for linux-x86_64: rtl&lt;br /&gt;&amp;nbsp;Package "rtl": Looking for Makefile.fpc: " /packages/rtl/Makefile.fpc /packages/base/rtl/Makefile.fpc /packages/extra/rtl/Makefile.fpc /packages/rtl/Makefile.fpc "&lt;br /&gt;&amp;nbsp;&lt;b&gt;Package "rtl": Looking for Package.fpc: " /units/x86_64-linux/rtl/Package.fpc "&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Error: Target "linux", package "rtl" not found&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Enlace del bug: &lt;a href="http://bugs.freepascal.org/view.php?id=10775"&gt;http://bugs.freepascal.org/view.php?id=10775&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-7317609909319564882?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/7317609909319564882/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/09/generando-un-makefile-con-fpcmake.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7317609909319564882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/7317609909319564882'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/09/generando-un-makefile-con-fpcmake.html' title='Generando un makefile con fpcmake'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-5849379636481364519</id><published>2009-09-24T22:49:00.003+01:00</published><updated>2009-09-24T22:54:11.771+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='Depurador'/><title type='text'>Manual básico de gdb</title><content type='html'>&lt;div style="text-align: justify;"&gt;El depurador &lt;b&gt;gdb&lt;/b&gt; (GNU Debugger) es el depurador estándar de Linux. Fue creado por Richard Stallman en el año 1988. Después de esta introducción de wikipedia, pasamos a ver como se usa.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Con gdb podemos depurar código C/C++, Pascal, y Ada. Es un depurador de línea de comandos, aunque existe una parte gráfica llamada DDD. A mí personalmente, el DDD me dio muchos problemas. Me fío más de la línea de comandos.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para usarlo, es necesario compilar el fuente con la opción de depuración, para C, C++ y Pascal, dicha opción es -g.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Programa de ejemplo pascal para probar con gdb.&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;______________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;program&lt;/b&gt; ejemplo;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;procedure&lt;/b&gt; proc ();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  i : &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;integer&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;b&gt;for&lt;/b&gt; i := &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;to&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;do&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    writeln(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;'In for: '&lt;/span&gt;&lt;span style="color: #141312;"&gt;, i);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;end&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  writeln(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;'This is the first line'&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  proc();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;end&lt;/b&gt;.&lt;/span&gt;&lt;/pre&gt;______________________________________________________ &lt;br /&gt;&lt;br /&gt;Compilamos con la opción -g&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ fpc -g ejemplo.pas&lt;/span&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Cargando el depurador&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;$ gdb ./ejemplo&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;GNU gdb 6.8-debian&lt;br /&gt;Copyright (C) 2008 Free Software Foundation, Inc.&lt;br /&gt;License GPLv3+: GNU GPL version 3 or later &lt;http: gnu.org="" gpl.html="" licenses=""&gt;&lt;br /&gt;This is free software: you are free to change and redistribute it.&lt;br /&gt;There is NO WARRANTY, to the extent permitted by law.&amp;nbsp; Type "show copying"&lt;br /&gt;and "show warranty" for details.&lt;br /&gt;This GDB was configured as "x86_64-linux-gnu"...&lt;br /&gt;(gdb) &lt;br /&gt;&lt;/http:&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Listar el código&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para listar el código usamos el comando &lt;b&gt;list&lt;/b&gt; o &lt;b&gt;l&lt;/b&gt; simplemente. El patrón es el siguiente:&lt;br /&gt;&lt;i&gt;list | l lineInit, lineEnd&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;(gdb) list 1, 5&lt;br /&gt;1&amp;nbsp;&amp;nbsp; &amp;nbsp;program ejemplo;&lt;br /&gt;2&amp;nbsp;&amp;nbsp; &lt;br /&gt;3&amp;nbsp;&amp;nbsp; &amp;nbsp;procedure proc ();&lt;br /&gt;4&amp;nbsp;&amp;nbsp; &amp;nbsp;var&lt;br /&gt;5&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; i : integer;&lt;br /&gt;(gdb) &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Nota: Si le damos a ENTER sin ninguna opción, se vuelve a repetir el último comando&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;(gdb)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; for i := 1 to 10 do&lt;br /&gt;8&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; writeln('In for: ', i);&lt;br /&gt;9&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;11&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; writeln('This is the first line');&lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; proc();&lt;br /&gt;15&amp;nbsp;&amp;nbsp;&amp;nbsp; end.(gdb) &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;&amp;nbsp;Colocar breakpoints&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para colocar breakpoints usamos el comando &lt;b&gt;break&amp;nbsp; &lt;i&gt;line&lt;/i&gt;&lt;/b&gt;, o &lt;b&gt;b&lt;/b&gt; &lt;i&gt;&lt;b&gt;line&lt;/b&gt;&lt;/i&gt;, donde line es el número de línea que queremos el breakpoint. Suponer que la queremos colocar el la línea 13.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;(gdb) b 13&lt;br /&gt;Breakpoint 1 at 0x400229: file ejemplo.pas, line 13.&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Comenzar la ejecución&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Una vez tengamos hayamos puesto puntos de ruptura (también se podría poner wachpoint y catchpoint) pasamos a ejecutar el programa. Para ello usamos la instrucción &lt;b&gt;run&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;(gdb) &lt;b&gt;run&lt;/b&gt;&lt;br /&gt;Starting program: /home/user/Desktop/ejemplo &lt;br /&gt;&lt;br /&gt;Breakpoint 1, main () at ejemplo.pas:13&lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; writeln('This is the first line');&lt;br /&gt;(gdb)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Traza&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ahora tenemos varias posibilidades:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Ir paso a paso pasando por cada función: usamos &lt;b&gt;step&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Ejecutar la instrucción actual: usamos&lt;b&gt; stepi&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Ir paso a paso sin pasar por cada función: &lt;b&gt;cont. &lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;Por ejemplo: &lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;&lt;b&gt;(gdb) step&lt;/b&gt;&lt;br /&gt;This is the first line&lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; proc();&lt;br /&gt;&lt;b&gt;(gdb)&lt;/b&gt; &lt;br /&gt;PROC () at ejemplo.pas:7&lt;br /&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; for i := 1 to 10 do&lt;br /&gt;(gdb) &lt;br /&gt;8&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; writeln('In for: ', i);&lt;br /&gt;&lt;b&gt;(gdb)&lt;/b&gt; &lt;br /&gt;In for: 1&lt;br /&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; for i := 1 to 10 do&lt;br /&gt;&lt;b&gt;(gdb) &lt;/b&gt;&lt;br /&gt;8&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; writeln('In for: ', i);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;b&gt;(gdb) cont&lt;/b&gt;&lt;br /&gt;Continuing.&lt;br /&gt;In for: 2&lt;br /&gt;In for: 3&lt;br /&gt;In for: 4&lt;br /&gt;In for: 5&lt;br /&gt;In for: 6&lt;br /&gt;In for: 7&lt;br /&gt;In for: 8&lt;br /&gt;In for: 9&lt;br /&gt;In for: 10&lt;br /&gt;&lt;br /&gt;Program exited normally.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Imprimir el valor de una variable &lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para mostrar por pantalla el valor de una variable usamos la instrucción&lt;b&gt; print nombre_variable&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;(gdb) &lt;b&gt;step&lt;/b&gt;&lt;br /&gt;8&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writeln('In for: ', i);&lt;br /&gt;(gdb) &lt;b&gt;print i&lt;/b&gt;&lt;br /&gt;$3 = 1&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Limpiar la lista de breakpoints&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para quitar un breakpoint, usamos &lt;b&gt;clear&lt;/b&gt;&lt;i&gt;&lt;b&gt; num_Line&lt;/b&gt;&lt;/i&gt;. Donde num_Line es el número de línea donde teníamos un breakpoint. Si no nos acordamos la línea en la que lo hemos puesto, usamos el comando &lt;b&gt;info breakpoints&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Para eliminar todos los breakpoints usamos &lt;b&gt;delete breakpoints&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;(gdb) &lt;b&gt;info breakpoints&lt;/b&gt;&lt;br /&gt;Num&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Disp Enb Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; What&lt;br /&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; breakpoint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keep y&amp;nbsp;&amp;nbsp; 0x0000000000400229 in main at ejemplo.pas:13&lt;br /&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; breakpoint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keep y&amp;nbsp;&amp;nbsp; 0x00000000004001ac in PROC at ejemplo.pas:7&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;(gdb) &lt;b&gt;delete breakpoints&lt;/b&gt;&lt;br /&gt;Delete all breakpoints? (y or n) y&lt;br /&gt;(gdb) &lt;b&gt;info breakpoints&lt;/b&gt;&lt;br /&gt;No breakpoints or watchpoints.&lt;br /&gt;(gdb) &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-5849379636481364519?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/5849379636481364519/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/09/manual-basico-de-gdb.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/5849379636481364519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/5849379636481364519'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/09/manual-basico-de-gdb.html' title='Manual básico de gdb'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-571659045733866301</id><published>2009-09-17T20:28:00.003+01:00</published><updated>2009-09-17T20:39:14.321+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software libre'/><title type='text'>Uso básico de subversion</title><content type='html'>Subversion es un sistema de control de versiones bajo Licencia Apache. Creado para sustituir a CVS. &lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Instalando subversion&amp;nbsp; &lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Lo podemos descargar desde la página principal de &lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt;. Si estamos un ubuntu podemos hacer:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ sudo apt-get install subversion&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Existen también interfaces gráficas para subversion como son &lt;b&gt;KdeSVN &lt;/b&gt;y &lt;b&gt;Tortoise&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Sistema de Control de Versiones &amp;nbsp;&lt;/b&gt;&lt;/div&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;div style="text-align: justify;"&gt;Un sistema de control de versiones (por dar una definición distinta a los miles de páginas que hablan de esto) es un programa que permite la copia nuestros documentos sin tener que recurrir a copiarlos con distinto nombre, o en directorios distintos mientras lo estamos desarrollando.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Por ejemplo. suponer que estamos desarrollando un programa en C. Podríamos tener una primer programa que funcione, pero que para nada está completada. Pues una primera versión podría ser esta. Al segundo día de desarrollo, mejoramos la interactividad con el usuario y tocamos muchas cosas del código. Si no nos funciona pueden pasar dos cosas:&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;a) Que tengamos una copia de seguridad por cualquier otro lado y recuperarla.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;b) Que no la tengamos y si no nos funciona, nos la tenemos que ingeniar para arreglarlo.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Al usar subversion, guardaríamos los cambios en un repositorio, tantas veces como queramos. Si luego, nos hiciera falta volver a una versión anterior, o queremos saber lo que hicimos el 2 de diciembre del 2005 (siempre y cuando esté en el repositorio), podríamos recuperarlo con un simple comando. Esa es la idea, facilitar al desarrollador la creación de programas.&amp;nbsp; Es más, si hay varios desarrolladores trabajando, cada uno se baja del repositorio los últimos cambios, y al finalizar los expone para que sus compañeros sigan trabajando sin necesidad de tener cientos de carpetas. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Subversion está pensado principalmente para trabajar con ficheros de texto, como es el código fuente de programas. Esto no quiere decir que en nuestro repositorio podamos subir imágenes, ficheros word, etc, pero hay que tener cuidado, porque subversion almacena las diferencias de un fichero a otro. Si es un fichero de texto, las diferencias son las líneas de texto (o trozos de texto, si se quiere ver así) en las que cambia. Mientras que si subimos un fichero binario, al hacer el mínimo cambio, su representación binario es diferente, con lo cuál, el fichero binario será completamente distinto al del repositorio. Esto implica que el repositorio aumentará de tamaño dependiendo del binario y del número de veces que lo versionemos. Por eso, en este aspecto hay que tener cuidado.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;Lo que se suele hacer es versionar los fuentes (ficheros de texto), que es con lo que se trabaja día a día. Si acaso alguna imagen (iconos) que son imágenes que no suelen cambiar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Creando un repositorio&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;La forma de crear un repositorio es con el comando svnadmin. Se entenderá mejor con un ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ &lt;b&gt;svnadmin create&lt;/b&gt; MiRepositorio&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Esto crea una jerarquí de directorios como la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ tree MiRepositorio/&lt;br /&gt;MiRepositorio/&lt;br /&gt;|-- README.txt&lt;br /&gt;|-- conf&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- authz&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- passwd&lt;br /&gt;|&amp;nbsp;&amp;nbsp; `-- svnserve.conf&lt;br /&gt;|-- db&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- current&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- format&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- fs-type&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- revprops&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; `-- 0&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; `-- 0&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- revs&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; `-- 0&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; `-- 0&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- transactions&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- txn-current&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- txn-current-lock&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- txn-protorevs&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- uuid&lt;br /&gt;|&amp;nbsp;&amp;nbsp; `-- write-lock&lt;br /&gt;|-- format&lt;br /&gt;|-- hooks&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- post-commit.tmpl&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- post-lock.tmpl&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- post-revprop-change.tmpl&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- post-unlock.tmpl&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- pre-commit.tmpl&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- pre-lock.tmpl&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- pre-revprop-change.tmpl&lt;br /&gt;|&amp;nbsp;&amp;nbsp; |-- pre-unlock.tmpl&lt;br /&gt;|&amp;nbsp;&amp;nbsp; `-- start-commit.tmpl&lt;br /&gt;`-- locks&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; |-- db-logs.lock&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; `-- db.lock&lt;br /&gt;&lt;br /&gt;10 directories, 25 files&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;No os preocupéis, en principio no hay que tocar nada de aquí, afortunadamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Importar un proyecto &lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Una vez creado el repositorio, lo que tenemos que hacer es importar nuestros ficheros y directorios donde estábamos haciendo el desarrollo. Suponer la siguiente jerarquía de proyecto:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ tree Proyecto/&lt;br /&gt;Proyecto/&lt;br /&gt;|-- Dos&lt;br /&gt;`-- Uno&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; `-- file.txt&lt;br /&gt;&lt;br /&gt;2 directories, 1 file&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Dos carpetas y un fichero. Ahora queremos subir esto al repositorio. A este paso se le llama importar el proyecto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ &lt;b&gt;svn import&lt;/b&gt; /tmp/MiProyecto/ file:///tmp/MiRepositorio/ -m "Creación del proyecto"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;Añadiendo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /tmp/Proyecto/Uno&lt;br /&gt;Añadiendo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /tmp/Proyecto/Uno/file.txt&lt;br /&gt;Añadiendo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /tmp/Proyecto/Dos&lt;br /&gt;&lt;br /&gt;Commit de la revisión 1.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Donde los argumentos son:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;La ruta donde está el proyecto a importar.&lt;/li&gt;&lt;li&gt;La ruta del repositorio.&lt;/li&gt;&lt;li&gt;Comentario acerca de la versión&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Ya podemos borrar la jerarquía de proyecto. Ahora solo nos hace falta el repositorio.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Espacio de trabajo &lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Una vez importado, creamos el espacio de trabajo, que podría ser el el home mismo. Para bajarnos la última versión del programa usamos el argumento &lt;b&gt;checkout&lt;/b&gt; de subversion.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ svn checkout file:///tmp/MiRepositorio/&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;El segundo argumento es la ruta completa donde está el repositorio. Se nos crea, en el directorio donde lo hayamos hecho, la jerarquía que teníamos del proyecto, con la peculiaridad de que ahora tenemos unos archivos .svn donde estará la información necesaria para comunicarse con el repositorio.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Comandos de trabajo&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Los comandos más comunes para el trabajo diario son:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;svn update&lt;/b&gt;&amp;nbsp; :&amp;nbsp; actualiza el repositorio.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ svn update&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;En la revisión 1.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;svn add file&lt;/b&gt; :&amp;nbsp; añade un fichero o un conjunto de ficheros al repositorio.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ svn add file2.txt &lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;svn commit&lt;/b&gt; :&amp;nbsp; guarda los cambios y crea una nueva versión.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ svn commit -m "Comentario de la version"&lt;br /&gt;Añadiendo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Uno/file2.txt&lt;br /&gt;Transmitiendo contenido de archivos .&lt;br /&gt;Commit de la revisión 2.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Si queremos volver a una versión anterior, una de las formas es asociarla por el comentario que se hizo cuando se produjo el commit.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ svn log&lt;br /&gt;------------------------------------------------------------------------&lt;br /&gt;r2 | user | 2009-09-17 20:14:37 +0100 (jue 17 de sep de 2009) | 1 line&lt;br /&gt;&lt;br /&gt;Comentario de la version&lt;br /&gt;------------------------------------------------------------------------&lt;br /&gt;r1 | user | 2009-09-17 19:52:08 +0100 (jue 17 de sep de 2009) | 1 line&lt;br /&gt;&lt;br /&gt;Creación del proyecto&lt;br /&gt;------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Por tanto, si ahora queremos recuperar la primera hacemos un checkout de la primera. &lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ svn checkout -r 1 file:///tmp/MiRepositorio/ Rev2&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Le pasamos -r y luego el número de la versión. La última cadena "Rev2" es simplemente para colocarlo en un directorio llamado Rev2. Lo crea dinámicamente.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para ver las diferencias usamos la opción diff. Por ejemplo, para ver la diferencia entre la versión 1 y la 2 hacemos:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ svn diff -r 1:2 file:///tmp/MiRepositorio/&lt;br /&gt;Index: Uno/file2.txt&lt;br /&gt;============================================&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Manuales&amp;nbsp; &lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;No es muy complicado de usar, al menos lo básico y una vez que se acostumbre es muy útil. Esto no es más que un pequeño comienzo. Para ver manuales y tutoriales están las siguiente urls.&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://chernando.eu/doc/svn/"&gt;http://chernando.eu/doc/svn/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://svnbook.red-bean.com/"&gt;http://svnbook.red-bean.com/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-571659045733866301?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/571659045733866301/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/09/uso-basico-de-subversion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/571659045733866301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/571659045733866301'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/09/uso-basico-de-subversion.html' title='Uso básico de subversion'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-4701761566057434304</id><published>2009-09-11T11:10:00.002+01:00</published><updated>2009-09-11T11:13:18.958+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Bases de Datos'/><title type='text'>Copias de seguridad en MySQL</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hay dos métodos para hacer copias de seguridad. Yo explicaré los dos, aunque el recomendable es el segundo, que hace uso del comando &lt;b&gt;mysqldump&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Método 1: Copiar archivos de la base de datos&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Este método es a pelo, es decir, coger directamente los archivos dentro de la jerarquía de directorios de mysql donde están definidas las bases de datos. Este método no se recomienda porque pueden haber diferencias de formatos entre distintas versiones de MySQL, si lo que pretendemos es traspasar la base de datos de una máquina a otra. En Windows, la ruta donde se guardan las bases de datos es parecida a la siguiente:&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;C:\Archivos de programa\MySQL\MySQL Server5.X\data[nombreBaseDeDatos]&lt;br /&gt;&lt;br /&gt;Donde X completa la versión que tengamos de MySQL. En sistemas Linux y Mac OS x se encuentra en /var/lib/mysql/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Método 2: Uso del comando mysqldump&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;El segundo método, y el recomendado es hacer uso de comando mysqldump. Este comando tiene múltiples opciones. Veremos aquí sólo algunas de ellas. Lo necesario para sobrevivir. Por supuesto, siempre queda la documentación.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ man mysqldump &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;La ventaja de usar este comando, es que no depende de la versión y funciona igual en cualquier máquina. La sintaxis típica para este comando es:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;$ mysqldump -u usuario -p objeto_a_respaldar&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;El objeto a respaldar puede ser toda la base de datos, una base de datos en concreta, una tabla o un conjunto de tablas. Para verlo mejor, hacemos una ejemplos. Suponer que tenemos una &lt;b&gt;base de datos test&lt;/b&gt; y una &lt;b&gt;tabla&lt;/b&gt; dentro de esa base de datos que se llama &lt;b&gt;cliente&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Respaldo de base de datos&lt;/b&gt;: Vamos a copiar la base de datos test:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ mysqldump -u root -p test &amp;gt; test.bk.sql&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Respaldo de una tabla&lt;/b&gt;: Vamos a respaldar la tabla cliente.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$mysqldump -u root -p test cliente &amp;gt; cliente.bk.sql &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Respaldo de toda la base de datos&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ mysqldump -u root -p &lt;b&gt;--all-databases&lt;/b&gt; &amp;gt; database.bk.sql&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Restaurar la base de datos&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;Si queremos recuperar los datos, es&amp;nbsp; muy sencillo. Si hemos usado el método de coger directamente el archivo, es llevarlo nuevamente a su sitio correspondiente. Si hemos usado el comando mysqldump queda como sigue.&lt;br /&gt;&lt;br /&gt;Si hemos hecho copia de toda la base de datos (&lt;span style="color: black;"&gt;&lt;b&gt;--all-databases&lt;/b&gt;) la recuperación queda:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ mysql -u root -p &amp;lt; databases.bk.sql&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Si hemos hecho una copia selectiva de alguna base de datos, hay que añadirle la opción -D.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ mysql -u root -p -D test &amp;lt; test.bk.sql&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-4701761566057434304?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/4701761566057434304/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/09/copias-de-seguridad-en-mysql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4701761566057434304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4701761566057434304'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/09/copias-de-seguridad-en-mysql.html' title='Copias de seguridad en MySQL'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-2752517257725111018</id><published>2009-09-10T17:41:00.001+01:00</published><updated>2011-02-21T11:08:47.821Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Bases de Datos'/><title type='text'>Creación de tablas en MySQL</title><content type='html'>En este post, me centraré en cómo crear tablas, inserción de datos y hacer consultas sencillas usando MySQL. Todo esto lo haré desde la línea de comandos.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Creación de tablas&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;La sintaxis es la siguiente, de forma muy reducida.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;mysql&amp;gt; CREATE TABLE nombre_tabla (&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;nombre_columna1 tipo_dato opciones,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;nombre_columna2 tipo_dato opciones ...);&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;nombre_tabla y nombre_columna son los nombres que les queramos dar. Los tipo de datos &lt;i&gt;más comunes&lt;/i&gt; son:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;1. Numéricos &lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;int (tamaño)&lt;/b&gt;: entero de 4 bytes.&lt;/li&gt;&lt;li&gt;&lt;b&gt;bigint(tamaño)&lt;/b&gt;: entero largo de 8 bytes.&lt;/li&gt;&lt;li&gt;&lt;b&gt;float (precisión)&lt;/b&gt;: flotante de 24 dígitos.&lt;/li&gt;&lt;li&gt;&lt;b&gt;double(precisión)&lt;/b&gt;: real de 53 dígitos.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;2. Cadenas&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;char(tamaño)&lt;/b&gt;: cadenas de longitud fija.&lt;/li&gt;&lt;li&gt;&lt;b&gt;varchar(tamaño)&lt;/b&gt;: cadenas de longitud variable.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;3. Fechas&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;date&lt;/b&gt; : almacena una fecha en formato 'AAAA-MM-DD'&lt;/li&gt;&lt;li&gt;&lt;b&gt;datetime&lt;/b&gt;: almacena una fecha y una hora: 'AAAA-MM-DD HH:MM:SS'&lt;/li&gt;&lt;li&gt;&lt;b&gt;time&lt;/b&gt;: almacena la hora. 'HH:MM:SS'&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Las &lt;i&gt;&lt;b&gt;opciones más comunes&lt;/b&gt;&lt;/i&gt; son las siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;not null&lt;/b&gt;: no permitimos que la columna tenga valores nulos.&lt;/li&gt;&lt;li&gt;&lt;b&gt;primary key&lt;/b&gt;: establecemos la clave primaria de la tabla.&lt;/li&gt;&lt;li&gt;&lt;b&gt;foreign key&lt;/b&gt;: establecemos la clave ajena de la tabla.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;________________________________________________________&lt;br /&gt;&lt;br /&gt;Ejemplo: Se desea crear una tabla Cliente que tenga como atributos el DNI, el nombre y la edad. Cada cliente se identifica por su DNI, por lo que ésta será su clave primaria.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;create&lt;/b&gt; &lt;b&gt;table&lt;/b&gt; cliente (&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;dni &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;VARCHAR&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;9&lt;/span&gt;&lt;span style="color: #141312;"&gt;)&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;NOT&lt;/b&gt; &lt;b&gt;NULL&lt;/b&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;nombre &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;VARCHAR&lt;/span&gt;&lt;span style="color: #141312;"&gt;(&lt;/span&gt;&lt;span style="color: #b08000;"&gt;50&lt;/span&gt;&lt;span style="color: #141312;"&gt;),&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;edad &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;INT&lt;/span&gt;&lt;span style="color: #141312;"&gt;(3&lt;/span&gt;&lt;span style="color: #141312;"&gt;)&lt;/span&gt;&lt;span style="color: #141312;"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;PRIMARY&lt;/b&gt; &lt;b&gt;KEY&lt;/b&gt; (dni));&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Insertar filas en las tablas&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Ahora vamos a insertar filas. Es muy sencillo. La sintaxis es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;mysql&amp;gt;INSERT INTO nombre_tabla VALUES (&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;valor1, valor2, ... , valorn)&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;donde n es igual al número de columnas de la tabla.&lt;br /&gt;&lt;br /&gt;Por ejemplo: si queremos insertar un cliente en la tabla creada anteriormente sería: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;INSERT&lt;/b&gt; &lt;b&gt;INTO&lt;/b&gt; cliente &lt;b&gt;VALUES&lt;/b&gt; (&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;"12345678A"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #006e28;"&gt;"peter"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, &lt;/span&gt;&lt;span style="color: #b08000;"&gt;22&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Selección de filas&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Si queremos ver las filas insertadas la forma es mediante la instrucción SELECT.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;mysql&amp;gt; SELECT nombre_Col1, nombre_Col2,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;FROM nombre_tabla&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;WHERE (condición);&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Esta es la forma general. Por ejemplo, si quisiéramos ver todas las filas y las columnas haríamos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;SELECT&lt;/b&gt; * &lt;b&gt;FROM&lt;/b&gt; cliente;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El siguiente ejemplo muestra sólo los dni de los clientes que sean menores de 30 años. Esta restricción se la especificamos en la cláusula WHERE.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;SELECT&lt;/b&gt; dni&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;FROM&lt;/b&gt; cliente&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;WHERE&lt;/b&gt; (edad &amp;lt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;30&lt;/span&gt;&lt;span style="color: #141312;"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Actualización de valores&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Usamos la sentencia a UPDATE de mysql: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;UPDATE&lt;/b&gt; cliente&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;SET&lt;/b&gt; nombre="juanito"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;WHERE&lt;/b&gt; dni=&lt;/span&gt;&lt;span style="color: #006e28;"&gt;"12345678A";&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Todo esto no es más que una pequeñísima instrucción a MySQL. Para ampliar no hay nada mejor que los manuales de referencia de &lt;a href="http://dev.mysql.com/doc/refman/5.0/es"&gt;mysql&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-2752517257725111018?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/2752517257725111018/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/09/creacion-de-tablas-en-mysql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2752517257725111018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/2752517257725111018'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/09/creacion-de-tablas-en-mysql.html' title='Creación de tablas en MySQL'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-3369224920058308109</id><published>2009-09-08T18:15:00.009+01:00</published><updated>2009-09-09T13:08:02.606+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Bases de Datos'/><title type='text'>Primeros pasos en MySQL</title><content type='html'>&lt;div style="text-align: justify;"&gt;Una vez instalado MySQL,(en un post &lt;a href="http://snatverk.blogspot.com/2009/07/instalacion-de-lamp-en-ubuntu-desktop.html"&gt;anterior&lt;/a&gt; expliqué como instalarlo para Ubuntu) entramos mediante línea de comandos en el Sistema Gestor de Base de Datos (SGBD).&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Entrada a MySQL&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;La instrucción es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ mysql -u root -p&amp;nbsp;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Durante el proceso de instalación, tuvimos que poner la contraseña para el usuario root, pues es esa la que nos pide inmediatamente.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Mostrar las bases de datos&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Lo primero que podemos hacer es ver las bases de datos que están disponibles. Para ello usamos el comando &lt;b&gt;show&lt;/b&gt; con el argumento &lt;b&gt;databases&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;mysql&amp;gt; show databases;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Se nos mostrará una lista, entre las que podemos encontrar&amp;nbsp; &lt;b&gt;information_schema&lt;/b&gt; y &lt;b&gt;mysql&lt;/b&gt;, donde están almacenados, por ejemplo, los usuarios.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Crear una Base de Datos &lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Para crear una base de datos usamos la sentencia &lt;b&gt;create database nombre_BD&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;mysql&amp;gt; CREATE DATABASE test;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #666666; color: white;"&gt;&lt;b&gt;Crear un usuario&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora, creamos un usuario con permisos a la base de datos 'test'. Y así no tener que entrar como &lt;b&gt;root&lt;/b&gt;. Hay varias formas de crear un usuario. Una de ellas es con la sentencia &lt;b&gt;GRANT&lt;/b&gt;.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;1. Sentencia GRANT&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp; Por ejemplo, podemos crear un usuario con todos los provilegios sobre la base de datos&amp;nbsp; test que acabamos de crear. Para ello hacemos lo siguiente:&lt;/div&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;mysql&amp;gt; grant all on test.* to new_user@localhost identified by 'pass';&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La sentencia anterior, crea un usuario llamado new_user con todos los provilegios sobre la base de datos test. Al poner 'all' estamos concediendo todos los privelegios sobre la base de datos test al usuario new_user. Si queremos podemos restringirlo y solamente ponerle, por ejemplo, inserción y consulta. En ese caso, usaremos &lt;b&gt;SELECT, INSERT&lt;/b&gt;. Todos los privilegios van separados por comas. Se puede ver la lista completa de privilegios en la documentación de mysql. Sentencia &lt;a href="http://dev.mysql.com/doc/refman/5.0/es/grant.html"&gt;grant&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;Ahora, para entrar como el nuevo usuario hacemos:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ mysql -u new_user -p pass&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Sentencia CREATE USER&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Otra forma de crear un usuario es mediante la sentencia CREATE USER. Un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;mysql&amp;gt; CREATE USER new_user@localhost IDENTIFIED BY 'pass'&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Con esta forma de crear, el usuario nuevo no tiene ningún privilegio. Por tanto, tendremos que concedérselos con la sentencia GRANT.&lt;br /&gt;&lt;br /&gt;En el siguiente post explicaré como crear tablas y acceder a ellas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-3369224920058308109?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/3369224920058308109/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/09/primeros-pasos-en-mysql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/3369224920058308109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/3369224920058308109'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/09/primeros-pasos-en-mysql.html' title='Primeros pasos en MySQL'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-4595125957606725873</id><published>2009-09-02T15:56:00.004+01:00</published><updated>2009-09-03T16:21:33.402+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algoritmos'/><title type='text'>Sucesión de Fibonacci en C++</title><content type='html'>&lt;div style="text-align: justify;"&gt;Muestro un ejemplo en C++ que devuelve la item n-ésimo de la sucesión de Fibonacci. Es un programa de línea de comandos que tiene 4 opciones: -v para el modo verbose, -h para la ayuda, -t para imprimir el tiempo que tarda en segundos y -n &lt;n-esimo&gt; para calcular el n-ésimo número de Fibonacci.&lt;/n-esimo&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo de uso:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="font-family: courier new; height: 29px; width: 487px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="400"&gt;&lt;span style="color: black;"&gt;$ &lt;/span&gt;./fibo -vtn 15&amp;nbsp;&amp;nbsp; #imprime los 15 primeros coeficientes&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;El programa usa un algoritmo de tipo iterativo (los más sencillitos), y tiene una complejidad de &lt;b&gt;O(n)&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;El código es el siguiente:&lt;br /&gt;______________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/*&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;    Fecha: 01/09/09&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;    Programa: retorna la suma n-ésima&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;           de la sucesión de fibonacci&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;sstream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;time.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;using&lt;/b&gt; &lt;b&gt;namespace&lt;/b&gt; std;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; main (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; argc, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; **argv) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* variables */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt; sum;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt; fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;2&lt;/span&gt;&lt;span style="color: #141312;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;] = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;] = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;unsigned&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;long&lt;/span&gt;&lt;span style="color: #141312;"&gt; num = -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; oc;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;bool&lt;/span&gt;&lt;span style="color: #141312;"&gt; do_time = &lt;b&gt;false&lt;/b&gt;, do_verbose = &lt;b&gt;false&lt;/b&gt;, do_help = &lt;b&gt;false&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;while&lt;/b&gt; ((oc = getopt(argc, argv, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;":vn:ht"&lt;/span&gt;&lt;span style="color: #141312;"&gt;)) != -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;switch&lt;/b&gt; (oc) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'v'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                do_verbose = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'h'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"./fibo [-options] [num]"&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;                cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Options: &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n\t&lt;/span&gt;&lt;span style="color: #bf0303;"&gt; -v : modo verbose &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n\t&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #bf0303;"&gt;                -h: esta ayuda&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n\t&lt;/span&gt;&lt;span style="color: #bf0303;"&gt; -t : imprime el tiempo que tarda &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n\t&lt;/span&gt;&lt;span style="color: #bf0303;"&gt; -n&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #bf0303;"&gt;                 &amp;lt;numero&amp;gt;: calcula fibonacci de orden &amp;lt;numero&amp;gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                do_help = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'t'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                do_time = &lt;b&gt;true&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'n'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                stringstream buf(optarg);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                buf &amp;gt;&amp;gt; num;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;if&lt;/b&gt; (!do_help) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;//Por defecto calcula los 10 primeros&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;        //números de la sucesión de fibonacci&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;if&lt;/b&gt; (num == -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            num = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;10&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;long&lt;/span&gt;&lt;span style="color: #141312;"&gt; t1 = clock();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;if&lt;/b&gt; (do_verbose) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"f[0] = "&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;] &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"f[1] = "&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;] &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;for&lt;/b&gt; (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; i = &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;; i &amp;lt;= num; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;           sum = fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;] + fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;             &lt;b&gt;if&lt;/b&gt; ((do_verbose==&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) &amp;amp;&amp;amp; (i &amp;gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"f["&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"] = "&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;                fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;] &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            &lt;b&gt;if&lt;/b&gt; (num != i) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;] = fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;                fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;] = sum;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;long&lt;/span&gt;&lt;span style="color: #141312;"&gt; t2 = clock();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Fibonacci("&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; num &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;") = "&lt;/span&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;        &amp;lt;&amp;lt; fibo_aux[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;] &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;if&lt;/b&gt; (do_time) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Tiempo total: "&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #141312;"&gt;               (t2-t1)/(&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;double&lt;/span&gt;&lt;span style="color: #141312;"&gt;)CLOCKS_PER_SEC &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;" segundos"&lt;/span&gt;&lt;span style="color: #141312;"&gt; &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;_____________________________________________________&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4725769270409658023-4595125957606725873?l=snatverk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://snatverk.blogspot.com/feeds/4595125957606725873/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://snatverk.blogspot.com/2009/09/sucesion-de-fibonacci-en-c.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4595125957606725873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4725769270409658023/posts/default/4595125957606725873'/><link rel='alternate' type='text/html' href='http://snatverk.blogspot.com/2009/09/sucesion-de-fibonacci-en-c.html' title='Sucesión de Fibonacci en C++'/><author><name>snatverk</name><uri>http://www.blogger.com/profile/09063359958887169227</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_TAzjkcP2UpE/SXya7-WeWrI/AAAAAAAAAQw/xFI6nJj0oyg/S220/2131119905_8c351b1937_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4725769270409658023.post-3041571250061476558</id><published>2009-08-28T17:40:00.005+01:00</published><updated>2009-08-28T17:52:42.606+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación Linux'/><title type='text'>Análisis de opciones en programas Linux</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; En Linux, es habitual usar la línea de comandos. Las opciones dentro de cada comando también lo son. Por ejemplo &lt;b&gt;ls -a&lt;/b&gt;, lista los archivos ocultos. La librería &lt;b&gt;unistd&lt;/b&gt; y &lt;b&gt;getopt&lt;/b&gt; de &lt;b&gt;GNU&lt;/b&gt;, incluyen con conjunto de funciones para tratar estas opciones y así facilitarnos el tratamiento&amp;nbsp; de cadenas en la creación de nuestros programas.&lt;/div&gt;&lt;br /&gt;En Linux se distinguen las opciones cortas y las opciones largas. Las opciones cortas, por lo general, van precedidas de un guión y las largas de dos guiones. Comenzaremos por las opciones cortas. Al final de cada sección hay un ejemplo ilustrativo para enteder su uso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Opciones cortas&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estas son las opciones de una letra. Por ejemplo, en Unix es habitual usar las opción -v como modo verbose. Esta v sería una opción corta. Para este tipo de opciones, disponemos de la librería &lt;b&gt;unistd&lt;/b&gt; y la función &lt;b&gt;getopt&lt;/b&gt;. Es muy sencillo de usar. La función se declara así:&lt;br /&gt;__________________________________________________________ &lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; getopt (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; argc, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;const&lt;/span&gt;&lt;span style="color: #141312;"&gt; argv[], &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;const&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *optstring);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;extern&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *optarg;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&lt;b&gt;extern&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; optind, opterr, optopt;&lt;/span&gt;&lt;br /&gt;__________________________________________________________ &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Parámetros de la función getopt&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;argc&lt;/b&gt;: normalmente se transmite directamente desde los argumentos del main. Es el número de argumentos de argv.&lt;/li&gt;&lt;li&gt;&lt;b&gt;argv&lt;/b&gt;: al igual que argc, se le pasa directamente desde el argv del main.&lt;/li&gt;&lt;li&gt;&lt;b&gt;*optstring&lt;/b&gt;: son las cadenas de letras que se quieren reconocer. Si la letra va seguida de dos puntos, entonces se espera que dicha opción tenga un argumento.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Por ejemplo, supongamos que tenemos dos opciones x, y. La opción x no precisa argumento, pero la "y" si. La cadena&amp;nbsp; optstring quedaría: &lt;b&gt;&lt;span style="color: #cc0000;"&gt;":xy:"&lt;/span&gt;&lt;/b&gt;. Más adelante se verá un ejemplo para enterder esto. Los dos puntos iniciales tienen un significado especial y es el siguiente: la función getopt devuelve un carácter según el tipo de error.&lt;br /&gt;&lt;br /&gt;La función retorna un entero. Si es igual a -1 entonces el análisis de opciones habrá acabado. Es idóneo para meter la función getopt en un while.&amp;nbsp; &lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Variables de la función getopt&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;*optarg&lt;/b&gt;: En esta variable está el argumento de una opción (si dicha opción lo precisa).&lt;/li&gt;&lt;li&gt;&lt;b&gt;optind&lt;/b&gt;: Es el índice actual de argv. Cuando acabe de procesar, los demás argumentos estarán en argv[optind].&lt;/li&gt;&lt;li&gt;&lt;b&gt;optopt&lt;/b&gt;: contiene el carácter no válido en el caso de error.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;opterr&lt;/b&gt;: cuando es igual a cero, getopt imprime sus propios mensajes de error.&amp;nbsp; &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;El ejemplo es el siguiente:&lt;br /&gt;&lt;br /&gt;__________________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;unistd.h&amp;gt;  &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/*Donde está definida la función getopt() */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; main (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; argc, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; **argv) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; oc;  &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* option character */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *arg;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;b&gt;while&lt;/b&gt; ((oc = getopt(argc, argv, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;":vf:"&lt;/span&gt;&lt;span style="color: #141312;"&gt;)) != -&lt;/span&gt;&lt;span style="color: #b08000;"&gt;1&lt;/span&gt;&lt;span style="color: #141312;"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;    &lt;b&gt;switch&lt;/b&gt; (oc) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'v'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* handle -a */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        fputs(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Modo verbose&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, stdout);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'f'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        fputs(&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"Fichero de entrada&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, stdout);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* Recogida del argumento */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        arg = optarg;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        fprintf(stdout, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"El fichero de entrada&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #bf0303;"&gt;               es: %s&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, arg);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;':'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* missing option argument */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"%s: option `-%c`&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #bf0303;"&gt;        requires and arguments&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, argv[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;], optopt);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;        &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;case&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;'?'&lt;/span&gt;&lt;span style="color: #141312;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      &lt;b&gt;default&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          &lt;/span&gt;&lt;span style="color: #888786;"&gt;&lt;i&gt;/* invalid option */&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          fprintf (stderr, &lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"%s: option `-%c` is&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #bf0303;"&gt;          invalid: ignored&lt;/span&gt;&lt;span style="color: #ff80e0;"&gt;\n&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"&lt;/span&gt;&lt;span style="color: #141312;"&gt;, argv[&lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;], optopt);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;          &lt;b&gt;break&lt;/b&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;  &lt;b&gt;return&lt;/b&gt; &lt;/span&gt;&lt;span style="color: #b08000;"&gt;0&lt;/span&gt;&lt;span style="color: #141312;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Opciones largas &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para las opciones largas, usamos la función getopt_long de la librería &lt;b&gt;getopt.h&lt;/b&gt; . La firma es la siguiente:&lt;br /&gt;_________________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; getopt_long (&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; argc, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *&lt;/span&gt;&lt;span style="color: #0057ae;"&gt;const&lt;/span&gt;&lt;span style="color: #141312;"&gt; argv[], &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #0057ae;"&gt;                 const&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;char&lt;/span&gt;&lt;span style="color: #141312;"&gt; *optstring,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #141312;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;const&lt;/span&gt;&lt;span style="color: #141312;"&gt; &lt;b&gt;struct&lt;/b&gt; option *longopts, &lt;/span&gt;&lt;span style="color: #0057ae;"&gt;int&lt;/span&gt;&lt;span style="color: #141312;"&gt; *longindex);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;_________________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Los trs primeros parámetros es igual que para la función getopt.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;longopts&lt;/b&gt;: Es un un array de un struct de tipo option. El struct se define como sigue:&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;&lt;span style="
