tag:blogger.com,1999:blog-127903342024-03-05T01:40:17.589-06:00Ideas dispersasComentarios y temas sobre software libre y computaciónCésarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.comBlogger127125tag:blogger.com,1999:blog-12790334.post-5879510940891563042021-11-24T10:26:00.003-06:002021-11-24T10:26:47.871-06:00Usando índices de matrices en Octave<p> Los elementos que conforma a una matriz, en Octave, tiene una posición determinada por renglón y por columna. Por ejemplo, para acceder a un elemento específico de un vector u, se usa un número entero:</p><p><span style="font-family: courier;">>> u(5)</span></p><p>Por ejemplo, si el vector u está conformado por los elementos [6 7 8 9 10], al ejecutar lo anterior, se obtiene:</p><div style="text-align: left;"><span style="font-family: courier;">>> u=[6.1 7.2 8.3 9.4 10.5];<br /></span><span style="font-family: courier;">>> u(5)<br /></span><span style="font-family: courier;">ans = 10.5</span></div><p>También se puede usar un vector de enteros que se puede usar como índices para recuperar los valores de otro vector. Por ejemplo:</p><div style="text-align: left;"><span style="font-family: courier;">>> u=[6.1 7.2 8.3 9.4 10.5];<br />>> in = [1 2 3];<br />>> u(in)<br />ans =<br /> 6.1000 7.2000 8.3000<br /></span></div><p style="text-align: left;">Otra forma de recuperar un subconjunto continuo de elementos de un vector es usando el caracter ":" seguido de los números enteros que indican los índices donde comienza y termina el segmento a recuperar. Por ejemplo, para el mismo vector u:</p><div style="text-align: left;"><span style="font-family: courier;">>> u(1:3)<br />ans =<br /> 6.1000 7.2000 8.3000</span></div><p style="text-align: left;">También se puede usar una variable como conjunto de índices. Por ejemplo, para el mismo vector u:</p><div style="text-align: left;"><span style="font-family: courier;">>> i=1:3<br /></span><span style="font-family: courier;">i =</span><span style="font-family: courier;"><br /></span><span style="font-family: courier;"> 1 2 3</span><span style="font-family: courier;"><br /></span><span style="font-family: courier;">>> u(i)<br /></span><span style="font-family: courier;">ans =</span><span style="font-family: courier;"><br /></span><span style="font-family: courier;"> 6.1000 7.2000 8.3000</span></div><p style="text-align: left;">Para una matriz de dos dimensiones, las reglas son equivalentes, con el agregado que es necesario usar índices para renglones y columnas.</p><p style="text-align: left;">Dada la siguiente matriz M:</p><div style="text-align: left;"><span style="font-family: courier;">>> M = [1.5 2.5 3.5; 4.5 5.5 6.5; 7.5 8.5 9.5]<br />M =<br /> 1.5000 2.5000 3.5000<br /> 4.5000 5.5000 6.5000<br /> 7.5000 8.5000 9.5000</span><br /></div><p style="text-align: left;">Para poder recuperar un elemento particular se especifica un par de números enteros que representan la posición por renglón y por columna. Por ejemplo, para recuperar el elemento del segundo renglón y tercer columna:</p><p><span style="font-family: courier;">>> M(2,3)</span></p><p><span style="font-family: courier;">ans = 6.5000</span></p><p style="text-align: left;">Y para recuperar una submatriz de M:</p><div style="text-align: left;"><span style="font-family: courier;">>> i=[1 2]<br />i =<br /> 1 2<br />>> M(i,i)<br />ans =<br /> 1.5000 2.5000<br /> 4.5000 5.5000</span></div><p style="text-align: left;">Es muy importante notar que el primer elemento está en el índice 1, y que al usar los índices, éstos no deben referir a una posición que no forme parte de la matriz; por ejemplo, para la matriz M, una posición inválida por estar fuera de la matriz es M(4,4).</p><p><br /></p>Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-12288459035479995892021-09-12T02:21:00.006-05:002021-11-24T09:20:01.479-06:00Algunos generadores de matrices en Octave y Python<p>Existen algunas matrices básicas que resultan útiles al momento de comenzar a trabajar, ya sea por que permiten inicializar variables matriz o por que será útil en cálculos posteriores.</p><p> <span> E</span>s posible recurrir a funciones en lenguaje M que nos permiten crear esas matrices y que están disponibles en <b>Octave</b>.</p><p><span> </span>Algunas de estás funciones son:</p><p></p>
<table class="tg">
<thead>
<tr>
<th class="tg-0lax"><span style="font-weight: bold;">Función</span></th>
<th class="tg-1wig">Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tg-0pky">zeros</td>
<td class="tg-0pky">Una matriz de ceros</td>
</tr>
<tr>
<td class="tg-0pky">ones</td>
<td class="tg-0pky">Una matriz de unos</td>
</tr>
<tr>
<td class="tg-0pky">rand</td>
<td class="tg-0pky">Una matriz con elementos aleatorios de distribuición uniforme</td>
</tr>
<tr>
<td class="tg-0pky">randn</td>
<td class="tg-0pky">Una matriz con elementos aleatorios de distribución normal</td>
</tr>
<tr>
<td class="tg-0lax">eye</td>
<td class="tg-0lax">Una matriz identidad</td>
</tr>
</tbody>
</table><br /><p><span> </span>Para crear un vector renglón de ceros:<br /></p><p><span style="font-family: courier;">>> x = zeros(1,3)<br />x =<br /><br /> 0 0 0</span></p><p>y un vector columna de ceros:</p><p><span style="font-family: courier;">>> y = zeros(3,1)<br />y =<br /><br /> 0<br /> 0<br /> 0</span></p><p><span> </span>Una matriz de ceros de 3x3:</p><p><span style="font-family: courier;">>> M = zeros(3)<br />M =<br /><br /> 0 0 0<br /> 0 0 0<br /> 0 0 0</span><br /></p><p>y una matriz rectangular de 3x2:</p><p><span style="font-family: courier;">>> N = zeros(3,2)<br />N =<br /><br /> 0 0<br /> 0 0<br /> 0 0</span><br /></p><p><span> </span>La misma forma de invocacion se puede emplear para la función ones. Así por ejemplo, para crear una matriz llena de 0.5 de dimensión 4x3, se puede usar la función ones y dividir entre 2:</p><p><span style="font-family: courier;">>> M1 = ones(4,3)/2<br />M1 =<br /><br /> 0.50000 0.50000 0.50000<br /> 0.50000 0.50000 0.50000<br /> 0.50000 0.50000 0.50000<br /> 0.50000 0.50000 0.50000</span></p><p><span> </span>O crear una matriz rectangular de 3x4 llena de unos:</p>
<p><span style="font-family: courier;">>> M2 = ones(3,4)<br />
M2 =<br />
<br />
1 1 1 1<br />
1 1 1 1<br />
1 1 1 1</span></p><p><span> </span>Y la forma de invocar es extensible al resto de las funciones.</p><p><span> </span>Por ejemplo, para crear un vector de elementos pseudoaleatorios:</p><p><span style="font-family: courier;">>> u = rand(1,6)<br />u =<br /><br /> 0.82166 0.74930 0.79187 0.73530 0.73373 0.84726</span></p><p><span> Una matriz de 2x2:</span><br /></p><p><span style="font-family: courier;">>> Mr = rand(2,2)<br />
Mr =<br />
<br />
0.16396 0.75682<br />
0.77751 0.28670</span><br />
</p><p><span> </span>O crear una matriz identidad de 4x4:</p><p><span style="font-family: courier;">>> I=eye(4)<br />I =<br /><br />Diagonal Matrix<br /><br /> 1 0 0 0<br /> 0 1 0 0<br /> 0 0 1 0<br /> 0 0 0 1</span><br /></p><p><span> </span>En el caso particular de la función eye, si lo que se solicita es una matriz rectangular, coloca unos en la posición a(i,i), por ejemplo:</p><p><span style="font-family: courier;">>> J=eye(2,4)<br />J =<br /><br />Diagonal Matrix<br /><br /> 1 0 0 0<br /> 0 1 0 0</span><br /></p><p><span> Existen f</span>unciones equivalente en <b>Python</b> con <b>Numpy</b>, que usa el mismo nombre y se comportan de forma similar.<br /></p><p><span> Para que estén disponibles es necesario importar el paquete y después invocarlas para obtener arreglos Numpy con contenido equivalente.</span><br /></p><p><span style="font-family: courier;">>>> import numpy as np</span></p><p><span> Para crear un arreglo numpy de una dimensión de ceros en Python:</span><br /></p><p><span style="font-family: courier;">>>> x = np.zeros(3)</span></p><p><span style="font-family: courier;">>>> print(x)</span></p><p></p><p><span style="font-family: courier;">[0. 0. 0.]</span></p><p><span> Para crear </span>un arreglo numpy<span> de ceros de 3x3:</span></p><p><span style="font-family: courier;">>>> Mc = np.zeros([3,3])</span></p><p><span style="font-family: courier;">>>> print(Mc)</span></p><p><span style="font-family: courier;">[[0. 0. 0.]</span></p><p><span style="font-family: courier;"> [0. 0. 0.]</span></p><p></p><p><span style="font-family: courier;"> [0. 0. 0.]]</span></p><p><span><span> Para crear una "matriz" rectangular de 4x2:</span><br /></span></p><p><span style="font-family: courier;">>>> Mc = np.zeros([4,2])</span></p><p><span style="font-family: courier;">>>> print(Mc)</span></p><p><span style="font-family: courier;">[[0. 0.]</span></p><p><span style="font-family: courier;"> [0. 0.]</span></p><p><span style="font-family: courier;"> [0. 0.]</span></p><p></p><p><span style="font-family: courier;"> [0. 0.]]</span></p><p><span><span><span> Existe también la función ones que se puede utilizar de igual forma que en Octave:</span><br /></span></span></p><p><span style="font-family: courier;">>>> M1 = np.ones([4,3])/2</span></p><p><span style="font-family: courier;">>>> print(M1)</span></p><p><span style="font-family: courier;">[[0.5 0.5 0.5]</span></p><p><span style="font-family: courier;"> [0.5 0.5 0.5]</span></p><p><span style="font-family: courier;"> [0.5 0.5 0.5]</span></p><p></p><p><span style="font-family: courier;"> [0.5 0.5 0.5]]</span></p><p><span> O una matriz rectangular inicializada con 1.5:</span><br /></p><p><span style="font-family: courier;">>>> M2 = np.ones([3,4])*1.5</span></p><p><span style="font-family: courier;">>>> print(M2)</span></p><p><span style="font-family: courier;">[[1.5 1.5 1.5 1.5]</span></p><p><span style="font-family: courier;"> [1.5 1.5 1.5 1.5]</span></p><p></p><p><span style="font-family: courier;"> [1.5 1.5 1.5 1.5]]</span></p><p><span><span><span><span> La función rand en Python requiere un poco más de escritura, al usar la clase random. Por ejemplo, para crear una "matriz" de 2x2 de números pseudoaleatorios:</span><br /></span></span></span></p><p><span style="font-family: courier;">>>> u = np.random.rand(2,2)</span></p><p><span style="font-family: courier;">>>> print(u)</span></p><p><span style="font-family: courier;">[[0.05328813 0.79864914]</span></p><p></p><p><span style="font-family: courier;"> [0.46865742 0.85856544]]</span></p><p><span><span><span><span><span> </span>O para crear una matriz de 2x4 con números pseudoaleatorios con una distribución normal:</span></span></span></span></p><p><span style="font-family: courier;">>>> v = np.random.randn(2,4)</span></p><p><span style="font-family: courier;">>>> print(v)</span></p><p><span style="font-family: courier;">[[-1.45490502 -0.76736795 0.05142855 0.02027987]</span></p><p></p><p><span style="font-family: courier;"> [-0.36772701 1.39209878 -0.58810718 1.22065564]]</span></p><p><span><span><span><span><span> </span>Y existen las funciones identity y eye para crear "matrices" identidad; en donde la función eye tiene un comportamiento semejante al de Octave, mientras que identity siempre devuelve una matriz cuadrada con unos en su diagonal principal.</span></span></span></span></p><p><span><span><span><span><span> Por ejemplo para crear una "matriz" rectangular con unos en su elemento a(i,i):</span><br /></span></span></span></span></p><p><span style="font-family: courier;">>>> I1 = np.eye(4,3)</span></p><p><span style="font-family: courier;">>>> print(I1)</span></p><p><span style="font-family: courier;">[[1. 0. 0.]</span></p><p><span style="font-family: courier;"> [0. 1. 0.]</span></p><p><span style="font-family: courier;"> [0. 0. 1.]</span></p><p></p><p><span style="font-family: courier;"> [0. 0. 0.]]</span></p><div><br /></div><div>y para crear una "matriz" identidad de 3x3:</div><p><span style="font-family: courier;">>>> I2 = np.identity(3)</span></p><p><span style="font-family: courier;">>>> print(I2)</span></p><p><span style="font-family: courier;">[[1. 0. 0.]</span></p><p><span style="font-family: courier;"> [0. 1. 0.]</span></p><p></p><p><span style="font-family: courier;"> [0. 0. 1.]]</span></p><p><span> </span>Finalmente es importante notar que los métodos zero y ones consumen una lista cuando se necesita crear un arreglo de dos o más dimensiones, mientras que random.rand, random.randn, identity y eye, se pasan escalares como argumentos para el tamaño en cada dimensión. </p><p> </p>Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-16641485094407909562021-09-04T01:38:00.000-05:002021-09-04T01:38:00.961-05:00Un poco de matrices en Octave y Python<p> Crear matrices en Octave es relativamente fácil, solo hay que delimitar los elementos que la conforman entre paréntesis cuadrados. Los elementos de un renglón se separan por espacios, y los renglones se separan utilizando punto y coma (;).</p><p><span> Por ejemplo, para un vector de cinco elementos, en Octave se define de la siguiente manera:</span><br /></p><p><span><span style="font-family: courier;">x = [1.1 2.1 3.1 4.1 5.1]</span></span></p><p><span> Y para una matriz de 3x4, se define:</span><br /></p><p><span><span style="font-family: courier;">A = [1.1 2</span></span><span style="font-family: courier;">.1</span><span style="font-family: courier;"> 3</span><span style="font-family: courier;">.1</span><span style="font-family: courier;"> 4</span><span style="font-family: courier;">.1</span><span style="font-family: courier;">; 5</span><span style="font-family: courier;">.1</span><span style="font-family: courier;"> 6</span><span style="font-family: courier;">.1</span><span style="font-family: courier;"> 7</span><span style="font-family: courier;">.1</span><span style="font-family: courier;"> 8</span><span style="font-family: courier;">.1</span><span style="font-family: courier;">; 9</span><span style="font-family: courier;">.1</span><span style="font-family: courier;"> 10</span><span style="font-family: courier;">.1</span><span style="font-family: courier;"> 11</span><span style="font-family: courier;">.</span><span style="font-family: courier;">1 12</span><span style="font-family: courier;">.1</span><span style="font-family: courier;">]</span></p><p>mostrando lo siguiente:</p><p><span style="font-family: courier;">A =</span></p><p><span style="font-family: courier;"> 1.1000 2.1000 3.1000 4.1000</span></p><p><span style="font-family: courier;"> 5.1000 6.1000 7.1000 8.1000</span></p><p><span style="font-family: courier;"> 9.1000 10.1000 11.1000 12.1000</span></p><p> Se pueden concatenar vectores y matrices para crear matrices más grandes.</p><p><span> Por ejemplo, dado el siguiente vector:</span><br /></p><p><span><span style="font-family: courier;">x = [1 2 3]</span></span></p><p><span><span> Se puede construir la siguiente matriz a partir de concatenar x varias veces:</span><br /></span></p><p><span><span><span style="font-family: courier;">A = [x; x; x]</span></span></span></p><p><span><span><span>dando como resultado:</span><br /></span></span></p><p><span style="font-family: courier;">A =</span></p><p><span style="font-family: courier;"> 1 2 3</span></p><p><span style="font-family: courier;"> 1 2 3</span></p><p></p><p><span style="font-family: courier;"> 1 2 3</span></p><p><span> S</span>i definimos el vector "y" de la siguiente forma:</p><p><span style="font-family: courier;">y = [1; 2; 3]</span></p><p>y se concatena el vector y varias veces para crear una matriz de la siguiente forma:</p><p><span style="font-family: courier;">B = [y y y]</span></p><p>da como resultado:</p><p><span style="font-family: courier;">B =</span></p><p><span style="font-family: courier;"> 1 1 1</span></p><p><span style="font-family: courier;"> 2 2 2</span></p><p><span style="font-family: courier;"> 3 3 3</span></p><p> Podemos usar las matrices A y B para construir una matriz más grande.</p><p><span style="font-family: courier;">C = [A 2*A; B [1 0 0; 0 1 0; 0 0 1]]</span></p><p>dando como resultado:</p><p><span style="font-family: courier;">C =</span></p><p><span style="font-family: courier;"> 1 2 3 2 4 6</span></p><p><span style="font-family: courier;"> 1 2 3 2 4 6</span></p><p><span style="font-family: courier;"> 1 2 3 2 4 6</span></p><p><span style="font-family: courier;"> 1 1 1 1 0 0</span></p><p><span style="font-family: courier;"> 2 2 2 0 1 0</span></p><p><span style="font-family: courier;"> 3 3 3 0 0 1</span></p><div><br /></div><p><span> Para realizar la misma tarea en Python requiere más pasos, empezando por importar el paquete Numpy.</span> </p><p><span style="font-family: courier;">import numpy as np</span></p><p><span> Para definir el vector "x":</span><br /></p><p><span><span style="font-family: courier;">x = np.array([1.1, 2.1, 3.1, 4.1, 5.1])</span></span></p><p><span><span> Y para definir la matriz ejemplo anterior en Python:</span><br /></span></p><p><span style="font-family: courier;">A = np.array([[1.1, 2.1, 3.1, 4.1], [5.1, 6.1, 7.1, 8.1], [9.1, 10.1, 11.1, 12.1]])</span></p><p>que devuelve:</p><p><span style="font-family: courier;">array([[ 1.1, 2.1, 3.1, 4.1],</span></p><p><span style="font-family: courier;"> [ 5.1, 6.1, 7.1, 8.1],</span></p><p><span style="font-family: courier;"> [ 9.1, 10.1, 11.1, 12.1]])</span></p><p><span> </span>En Python para concatenar arreglos Numpy se usa el método <i>concatenate</i>, por lo que a partir del vector "x" definido de la siguiente forma:</p><p><span style="font-family: courier;">x = np.array([[1, 2, 3]])</span></p><p>crear una matriz A de la siguiente forma:</p><p><span style="font-family: courier;">A = np.concatenate((x, x, x))</span></p><p>da como resultado lo siguiente:</p><p><span style="font-family: courier;">array([[1, 2, 3],</span></p><p><span style="font-family: courier;"> [1, 2, 3],</span></p><p><span style="font-family: courier;"> [1, 2, 3]])</span></p><p><span> </span>Para este ejemplo es importante notar que el vector x en realidad es una matriz Numpy de un único renglon y es importante porque en Python y Numpy no es lo mismo concatenar vectores que concatenar matrices.</p><p>Para el vector "y" utilizado previamente, definido de la siguiente forma:</p><p><span style="font-family: courier;">y = np.array([[1],[2],[3]])</span></p><p>al concatenarlo de la siguiente forma:</p><p><span style="font-family: courier;">B = np.concatenate((y,y,y), axis=1) </span></p><p>se obtiene:</p><p><span style="font-family: courier;">array([[1, 1, 1],</span></p><p><span style="font-family: courier;"> [2, 2, 2],</span></p><p><span style="font-family: courier;"> [3, 3, 3]])</span></p><p>En este ejemplo es importante notar que se usó el argumento axis, para indicar que se concatene a la derecha y no hacia abajo.</p><p><span> Finalmente utilizando ambas matrices resultantes A y B al concatenarlas de la siguiente forma:</span><br /></p><p><span style="font-family: courier;">C1 = np.concatenate((A, 2*A), axis=1)</span></p><p><span style="font-family: courier;">C2 = np.concatenate((B,[[1, 0, 0], [0, 1, 0], [0, 0, 1]]), axis = 1)</span></p><p><span style="font-family: courier;">C = np.concatenate((C1, C2)) </span></p><p><span>se obtiene:</span></p><p><span style="font-family: courier;"> print(C) </span></p><p><span style="font-family: courier;">[[1 2 3 2 4 6]</span></p><p><span style="font-family: courier;"> [1 2 3 2 4 6]</span></p><p><span style="font-family: courier;"> [1 2 3 2 4 6]</span></p><p><span style="font-family: courier;"> [1 1 1 1 0 0]</span></p><p><span style="font-family: courier;"> [2 2 2 0 1 0]</span></p><p><span style="font-family: courier;"> [3 3 3 0 0 1]]</span></p><p>Obteniendo desde Python, resultados equivalentes a los vistos en Octave.</p>Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-43126547625656003672021-08-27T13:52:00.003-05:002021-09-04T01:38:25.336-05:00Creando gráficas básicas en Octave y su equivalente en Python<p> En Octave es posible usar muchas de las sentencias disponibles en M, el lenguaje de script de Matlab.</p><p><br /></p><p>Es por ello que para realizar una gráfica 2d en Octave, solo se requiere crear los vectores; de los términos independientes y dependientes.</p><p><br /></p><p>Así, para crear la gráfica de la función seno en Octave:</p><p><span style="font-family: courier;">>> x=0:0.1:2*pi;<br />>> y1=sin(x);<br />>> plot(x,y1);</span> <br /></p><p> creando la siguiente gráfica:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqQdUEvCRVRy8rYfI03Mjuyc0HhIpF0F7MUy6Ykt8e0xB8NQOcjQ7CIXCvHEFbnzUumK2KFAd8e28JoBYG-ZeV59d4tqNJsDy3P3dMTQF34YSaZJO-N4UFl9FCFftLRBJaKLT2yQ/s768/fun-seno-Octave.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Gráfica de la función seno en Octave" border="0" data-original-height="653" data-original-width="768" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqQdUEvCRVRy8rYfI03Mjuyc0HhIpF0F7MUy6Ykt8e0xB8NQOcjQ7CIXCvHEFbnzUumK2KFAd8e28JoBYG-ZeV59d4tqNJsDy3P3dMTQF34YSaZJO-N4UFl9FCFftLRBJaKLT2yQ/w400-h340/fun-seno-Octave.png" title="Función seno de x" width="400" /></a></div><br /><p><br /></p><p> Para crear la misma gráfica en Python su equivalente es:</p><p><span style="font-family: courier;">>>> import numpy as np<br />>>> import matplotlib.pyplot as plt<br />>>> x=np.arange(0,2*np.pi,0.1)<br />>>> y=np.sin(x)<br />>>> plt.plot(x,y)<br />[<matplotlib.lines.Line2D object at ...>]<br />>>> plt.show()</span><br /></p><p>obteniendo la siguiente gráfica:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij5Ifk_-Nvk0xSVcaTQKFyt_nMhtZnTlHE6-DfUf3GFDL-Cl-APClt8Aba9pIgrEYPIZmMZiav76BAc6oC_FyT1985rvT_I34O93WIVC-R-9xBSjG7hRSYf9x-GVzQEbGjd3v8sQ/s800/fun-seno-Python3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Gráfica de la función seno en Python3" border="0" data-original-height="600" data-original-width="800" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij5Ifk_-Nvk0xSVcaTQKFyt_nMhtZnTlHE6-DfUf3GFDL-Cl-APClt8Aba9pIgrEYPIZmMZiav76BAc6oC_FyT1985rvT_I34O93WIVC-R-9xBSjG7hRSYf9x-GVzQEbGjd3v8sQ/w400-h300/fun-seno-Python3.png" title="Función seno de x" width="400" /></a></div><br /><p><br /></p><p>Cómo se puede apreciar, en Octave es un poco más simple realizar la gráfica.</p><p>Para el caso de Python, es necesario tener objetos que se puedan tratar como arreglos, y es necesario un paquete adicional para realizar las gráficas. Por ello es necesario importar los paquete NumPy y Matplotlib.pyplot.</p><p><br /></p><p>Numpy es el paquete que además, para este ejemplo, provee de la definición de pi, de la función seno y de una función que permite poblar el "vector" x; es decir np.pi, np.sin() y np.arange(inicio, fin, incremento).<br /></p><p><br /></p>Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-45766492202228183592019-10-23T18:53:00.000-05:002019-10-23T18:53:09.405-05:00Tip. Depurando un script de BashEn todo proceso de programación, contar con un método que permita realizar la depuración del código fuente es siempre una herramienta fundamental.<br />
<br />
También resulta útil cuando se está trabajando con scripts de Bash de otras personas y no se tiene del todo claro que es lo que hace.<br />
<br />
Bash proporciona opciones que permiten depurar scripts.<br />
<br />
Una forma es, al momento de correr nuestro script:<br />
<br />
$ bash -x ./script.s<br />
<br />
Otra alternativa es incluir set -x dentro de script para que se obtenga una salida.<br />
<br />
Para tener un archivo de salida numerado con el seguimiento de una ejecución del script, hay que agregar las siguientes líneas.<br />
<br />
exec 5> archivo_salida_depuracion.txt<br />
BASH_XTRACEFD="5"<br />
PS4='$LINENO: ' # Permite numerar las líneas de salida.<br />
set -x # Comienza el proceso de depuración.<br />
<br />
<br />Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-46506504715151358942019-10-05T18:43:00.003-05:002019-10-05T18:43:46.527-05:00Graficándo tiempos con gnuplotDel experimento de la entrada anterior tengo un archivo con los tiempos de pared del programa de interés, cuyos renglones tienen una forma semejante a la siguiente:<br />
<br />
real<span style="white-space: pre;"> </span>75m20.477s<br />
user<span style="white-space: pre;"> </span>75m20.464s<br />
sys<span style="white-space: pre;"> </span>0m0.300s<br />
<div>
<br /></div>
<div>
del cual solo me interesan los renglones con la etiqueta "real".</div>
<div>
<br /></div>
<div>
Necesito recuperar solo esos renglones y enumerarlos para hacer la gráfica que me interesa. Para ello con grep, cut y nl tendré la tabla que me interesa graficar.</div>
<div>
<br /></div>
<div>
<tt>
grep real tiempos.lfs.8e3.txt | cut -c6-20 | nl > archivo.data.graf.txt</tt></div>
<div>
<br /></div>
<div>
El archivo resultante tiene renglones semejantes a esto:<br />
<br />
10<span style="white-space: pre;"> </span>75m20.477s</div>
<div>
<br /></div>
<div>
que de esta forma se puede usar en gnuplot.<br />
<br />
Desde gnuplot es necesario indicar que formato usar para interpretar los datos, en este caso que entienda que la segunda columna son datos de tiempo.<br />
<br />
Cómo solo me interesa ver los datos graficados, uso solo dos sentencias:<br />
<br /></div>
<div>
gnuplot> set timefmt "%mm%ss"<br />
gnuplot> plot "./archivo.data.graf.txt" using 1:2 t "Tiempos de pared"<br />
<br />
Quedando la agráfica siguiente:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7m9gmurhWoCHOUA0D0ADHsRSLO9yW4NryRAi4LYQqoE4Vu8cKFgzyu0CG_bEUL9ZBM0_NUokqFtjsiA3RrFYYHwekHlcutAwXQKWm9bNGcV3QI3nwYgO0wasCviXvZlmR-b9sjg/s1600/ej.graf.tiempos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7m9gmurhWoCHOUA0D0ADHsRSLO9yW4NryRAi4LYQqoE4Vu8cKFgzyu0CG_bEUL9ZBM0_NUokqFtjsiA3RrFYYHwekHlcutAwXQKWm9bNGcV3QI3nwYgO0wasCviXvZlmR-b9sjg/s320/ej.graf.tiempos.png" width="320" /></a></div>
<br /></div>
Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-12698891984563945092019-10-05T00:26:00.001-05:002021-09-04T01:39:00.312-05:00Por qué necesito crear métricasEn un cierto caso, necesito generar métricas de comportamiento de un programa en particular. Y el comando <i>time</i> me es muy conveniente.<br />
<br />
Pero como siempre olvido como hacerlo, dejo esto por acá como futura referencia.<br />
<br />
Para fines del experimento, necesito repetir la ejecución de un programa n veces, pero medir el tiempo de cada una de esas ejecuciones y adicionalmente, para después hacer un poco de estadísitca básica, guardar los tiempos de pared de cada ejecución.<br />
<br />
Así, la ejecución completa queda:<br />
<br />
<tt> for i in {1..10}</tt><br />
<tt>do</tt><br />
<tt> echo "Incia"</tt><br />
<tt> (time ./programa) >> salida.programa.txt 2>> tiempos.programa.txt</tt><br />
<tt> echo "Termina"</tt><br />
<tt>done</tt><br />
<br />Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-18749271499605140732010-05-24T11:07:00.002-05:002021-09-04T01:39:11.570-05:00Más de programacion paralela: OpenMPOpenMP es un estandar creado por un grupo de fabricantes de software y hardware, con la intención de crear herramientas que sean útiles y de fácil uso, para la programación de máquinas de varias unidades de procesamiento con memoria compartida.<br /><br />Es decir, herramientas que permitan a cualquier programar supercomputadoras clásicas (como la Cray). Y la idea es que sea posible programar de manera secuencial, para que cualquiera pueda desarrollar sus algoritmos sin tantas complicaciones y que a su vez, la porción paralela se ejecute en hilos, pero la decisión de cuantos hilos y de como sincronizarlos se le deja al compilador y no al programador. Que como se puede intuir, ayuda al programador.<br /><br />Esto se logra mediante <a href="http://es.wiktionary.org/wiki/pragma">pragmas</a>, directivas, llamadas a funciones y variables, que le indican al compilador que debe paralelizar en hilos.<br /><br />Pero si es para programar supercomputadoras ¿qué sentido tiene hablar de ello cuando muy pocos pueden acceder a una de esas máquinas? Lo interesante, Open MP es independiente de plataforma (portable), y es posible usar OpenMP si se cuenta con una computadora con al menos dos núcleos. Es decir, gracias al avance de los procesadores, hoy cuanquiera con al menos dos núcleos, puede aprovechar el uso de OpenMP.<br /><br />Y lo mejor aún, el compilador de GNU gcc soporta el más reciente estándar OpenMP 3.0; por lo que si además se tiene instalado alguna distribución GNU/Linux, ya se puede comenzar a jugar con OpenMP.<br /><br />La página oficial de OpenMP:<br /><br /><a href="http://openmp.org/wp/">http://openmp.org/wp/</a><br /><br />Y ahí mismo hay mucho material para comenzar a trabajar, en donde se puede encontrar un tutorial de intel, que me ha parecido bastante bueno para comenzar a entender que es y como funciona OpenMP.<br /><br /><a href="http://software.intel.com/en-us/articles/getting-started-with-openmp/">http://software.intel.com/en-us/articles/getting-started-with-openmp/</a>Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com1tag:blogger.com,1999:blog-12790334.post-44588303314298245392010-04-20T16:39:00.002-05:002010-04-20T16:53:17.771-05:00FLISoL 2010 en la UNAM<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lidsol.fi-b.unam.mx/flisol-010/FLISOL2010%20-%20FLISOL_archivos/FLISOL2010.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 728px; height: 90px;" src="http://lidsol.fi-b.unam.mx/flisol-010/FLISOL2010%20-%20FLISOL_archivos/FLISOL2010.gif" alt="" border="0" /></a><br />Nuevamente este año, la Facultad de Ingeniería será sede el Festival Latinoamericano de Software Libre. Que comenzará sus actividades el próximo jueves 22 de abril.<br /><br />Estas activiades consiste en un conjunto de conferencias que se darán en el Auditorio del Edificio Principal.<br /><br />Para continuar el sábado 24 de abril con la instalación de software libre en conjunto con más de 200 ciudades en Latinoamérica.<br /><br />Para más información consulten los siguientes enlaces:<br /><br /><a href="http://lidsol.fi-b.unam.mx/">http://lidsol.fi-b.unam.mx</a><br /><br /><a href="http://wiki.lidsol.org/">http://wiki.lidsol.org</a><br /><br />Pero no solo se efectuará el FLISoL en la FI, nuevamente este año también participa FES Acatlán.<br /><br /><a href="http://flisol.acatlan.unam.mx/">http://flisol.acatlan.unam.mx/</a><br /><br /><br />Para ver el resto de lugares y buscar uno más cercano se puede consultar:<br /><br /><a href="http://flisol.info/FLISOL2010/Mexico">http://flisol.info/FLISOL2010/Mexico</a>Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-80037753321117098312010-04-11T00:09:00.002-05:002010-04-11T00:13:21.495-05:00Unos cuantos mini tips para consola.Algunos comandos básicos que no están por demás recordar.<br /><br />>$ ls -lt<br /><br />Muestra un listado de los archivos en el directorio actual, ordenados de acuerdo a la fecha de última modificación, comenzando por mostrar el más reciente.<br /><br />>$ ls -lt --reverse<br /><br />Con la opción --reverse se invierte el orden, mostrando primero el archivo más antiguo.<br /><br />Y si lo que interesa es ver el contenido de un archivo zip, se puede usar el comando zipinfo, que muestra el contenido del archivo sin descomprimirlo.<br /><br />>$ zipinfo <archivo>.zipCésarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-51719989234519900402010-02-14T19:50:00.002-06:002010-02-14T20:29:13.989-06:00Minitip: Actualizando el menú de grubEn Ubuntu hasta la versión 9.04 trae el gestor de arranque grub 0.97, y existe un archivo llamado menu.lst en /boo/grub; que es el que se usa para gestionar el arranque de los diferentes sistemas operativos que estén instalados y en el caso de las distribuciones GNU/Linux, cada que se instala un nuevo kernel, se anexa una entrada al menú.<br /><br />Se puede alterar el archivo menu.lst para modificar el orden presentado de opciones de arranque, o para eliminar o agregar entradas al menú.<br /><br />Cuando se hace una actualización de Linux (el kernel) en Ubuntu, el gestor de paquetes puede detectar que se ha alteraro el archivo menu.lst y pregunta que se desea hacer, si conservar el archivo que fue modificado de manera manual o si se desea actualizar el archivo a través del gestor.<br /><br />Si se opta por la opción conservar el archivo modificado, no se anexa al menú la opción del nuevo Linux; por lo que se trabajará con las versiones antiguas.<br /><br />Para actualizar el menu.lst se puede usar el comando update-grub para actualizar el menu.lst.<br /><br />En este caso, lo que se debe hacer es mover el viejo menu.lst a por ejemplo menu.lst.old,<br /><br />>$ sudo mv /boot/grub/menu.lst /boot/grub/menu.lst.old<br /><br /> y después como root en /boot/grub ejecutar update-grub,<br /><br />>$ cd /boot/grub/; sudo update-grub<br /><br /> dando como resultado la generación de un nuevo archivo menu.lst que solo contiene las opciones Linux que encuentre; por lo que después se edita para agregar los demás S. O. que se tengan instalados, comparando el archivo menu.lst nuevo y el que se respaldó como menu.lst.oldCésarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-2326260130470697882009-08-23T18:14:00.002-05:002009-08-23T19:45:10.619-05:00Minitip: agregando un elemento de boot a GRUBInicialmente en una computadora se tiene dual boot, está instalado Win XP y Ubuntu 9.04 y se requería instalar Fedora 11.<br /><br />Como había espacio libre disponible, se le indicó al instalador de Fedora, que usara el espacio libre disponible. Fedora 11 usa <a href="http://www.solusan.com/%C2%BFque-es-lvm.html">LVM</a> y sobre esto crea las particiones y actualmente el tipo que asigna es ext4.<br /><br />Preferí cambiar el tipo de ext4 a ext3 y no usar LVM, si no que sobre la particion extendida, crear las particiones lógicas, una para /boot otra para / y la de /home.<br /><br />Aunque el proceso de instalación se realizó satisfactoriamente, y llegó al punto en que pide colocar el orden de inicio de los sistemas instalados, y además si es necesario, permite agregar otras entradas para otros sistemas operativos instalados; al reiniciar mi sorpresa fue grande porque en lugar de estar el grub que instala Fedora, seguía corriendo el grub que había instalado Ubuntu. Y por supuesto, la entrada para iniciar Fedora no estaba disponible.<br /><br />El método para arrancar Fedora fue agregar la entrada del mismo al menu.lts de Ubuntu, tomando como información de referencia, la entrada generada en el menu.lts de Fedora.<br /><br />El menu.lts de Ubuntu para la ubicación del dispositivo desde donde arrancar, usa <a href="http://en.wikipedia.org/wiki/Universally_Unique_Identifier">uuid</a>, y Fedora no, por lo que era necesario determinar el uuid de la partición.<br /><br />Para ello se puede hacer uso del comando vol_id, que entre otros datos, devuelve el uuid del dispositivo que se le pase por referencia.<br /><br />>$ sudo vol_id /dev/<dispositivo ><br /><br />Donde <dispositivo > es el dispositivo que se desea saber, por ejemplo, suponniendo que sea un disco duro ide y que sea el primer disco dur, y la partición que me interesa saber su uuid es la 10, queda de la siguiente forma:<br /><br />>$ sudo vol_id /dev/hda10<br /><br />El valor que se obtiene se puede usar para agregarlo al menu.lts; que en mi caso, me permitió agregar la partición de arranque donde estaba Fedora.Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-28199583962018894682009-08-22T16:27:00.004-05:002009-08-22T16:48:29.733-05:00Un ejemplo de programacion paralelaEn una materia de programación en paralelo, se me solicitó que presentara la solución a un problema empleando el esquema farmer - worker.<br /><br />El material resultante también me sirvió para dar una plática en el <a href="http://www.consol.org.mx/2009/">CONSOL 2009</a>, y llevé como parte de la exposición el código fuente que soluciona el problema.<br /><br />Lo que presenté fue una forma de calcular el conjunto de Mandelbrot en paralelo, en C y usando como biblioteca de paso de mensajes mpich para poder ejecutarse en paralelo en un cluster.<br /><br />La idea detrás del esquema farmer - worker es que cada tarea tarda diferente tiempo en resolverse, por lo que el proceso farmer lo que hace es distribuir las tareas entre los procesos worker que se encuentran desocupados. Es decir, sin importar quien es, el primero que termina, es el siguiente en recibir nuevo trabajo.<br /><br />El esquema farmer - worker es conveniente para tareas que tardan diferente tiempo en terminarse, porque es una forma automática de balancear la carga.<br /><br />Hoy me entero que <a href="http://www.consol.org.mx/2009/CONSOL2009.tgz">ya está disponible</a> el material de las diferentes exposiciones que se dieron en el CONSOL 2009 (lo malo es que es un único archivo de más de 500 MB), y entre el material se encuentra lo que expuse, así que si quieren ver tanto la presentación como el código fuente, hay que descargar el archivo, descomprimir y disfrutar de todo el contenido.<br /><br />Y si solo quieren ver el material referente a mi presentación, también pueden obtenerlo de:<br /><br /><a href="http://rompope.fi-b.unam.mx/clemens/intro-prog-paralela.tar.gz">http://rompope.fi-b.unam.mx/clemens/intro-prog-paralela.tar.gz</a>Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com2tag:blogger.com,1999:blog-12790334.post-34221272924705335552009-08-13T15:22:00.003-05:002009-08-13T15:41:28.777-05:00Reponiendo FLISoL 2009 en C. U. - UNAMComo recordarán, en el mes de abril se dió una contingencia por la epidemia de influeza que tuvo un fuerte impacto en México; por lo cual muchas de las actividades en el país se vieron suspendidas.<br /><br />Por otro lado, el Festival Latinoamericano de Software Libre, se celebra cada año aproximadamente el penúltimo sábado de abril, que en este 2009 coincidió con la aparición de la influenza en México, es por ello que todas las cedes de la zona metropolitana (DF-Edo. México), se vieron obligadas a posponerlo indefinidamente.<br /><br />La mayoría de las cedes ya ha logrado efectuar su respectivo install-fest, pero en el caso de la UNAM, los periodos de apertura de los espacios tardaron un poco más, y además al estar cerca de fin de semestre, y próximas las vacaciones administrativas, impidieron que en un intervalo relativamente corto, se contara con las condiciones adecuadas para realizarlo.<br /><br />Pero finalmente se comienza un nuevo semestre que aporta condiciones muy adecuadas para efectuar un install-fest con motivo del FLISoL 2009.<br /><br />Es por ello que la coordinación del install-fest en la Facultad de Ingeniería en C. U. está realizando los preparativos para que el sàbado 5 de septiembre se realice en el lobby del edificio principal.<br /><br />Las actividades que se están organizando son:<br /><br />- Talleres<br />- Conferencias (el viernes 4 de septiembre)<br />- Y por supuesto, el install-fest.<br /><br />De momento todavía no se tiene el calendario de actividades, pero será publicado a la brevedad posible, por si desean participar o acopañarnos en C. U.Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-90913106661118081432009-04-20T11:28:00.003-05:002009-04-20T11:32:53.164-05:00PUMASOL 2009, esta semanaDel día martes 21 al día viernes 24, se realizará el segundo coloquio universitario de software libre <a href="http://pumasol.org">PUMASOL</a> 2009, en el auditorio del edificio principal de la Facultad de Ingeniería de la UNAM en CU.<br /><br />El calendario de ponencias lo pueden consultar en:<br /><br /><a href="http://wiki.lidsol.org/index.php?title=PUMASOL_2009">http://wiki.lidsol.org/index.php?title=PUMASOL_2009</a><br /><br />Quedan todos invitados. La entrada es libreCésarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com1tag:blogger.com,1999:blog-12790334.post-89182399260581824502009-04-04T17:28:00.004-06:002009-04-04T20:46:40.465-06:00Editores LaTeX para GNU/LinuxLaTeX según la definición de la wikipedia " ... es un lenguaje de marcado para documentos, y un sistema de preparación de documentos, formado por un gran conjunto de macros de TeX"[1]; que permite la edición de documentos con una gran calidad de presentación.<br /><br />Como es un lenguaje de marcado, para generar el produncto final es necesario describir el contenido del documento a partir de etiquetas, que determinan el formato que se le ha de aplicar a cada elemento en el documento.<br /><br />Describir el documento en LaTeX tiene un parecido a la manera en como se escribían las primeras páginas web, con la diferencia de que LaTeX es mucho más rico, y algo más complejo. Además, para poder ver el resultado final, es necesario compilar el archivo tex para obtener el documento final, que por defecto es en formato dvi. Es decir, el archivo descriptor, que es el fuente, tiene la extensión tex; se compila con el comando latex, y el resultado es el mismo archivo con extension dvi.<br /><br />El documento se puede exportar a otros formatos, como postcrip o pdf.<br /><br />Existe una herramienta visual que permite trabajar con LaTeX sin usar directamente el lenguaje, llamada <a href="http://www.lyx.org/">LyX</a>, que es un editor tipo YSIWIM (What You See Is What You Mean); además de ser multiplataforma.<br /><br />A muchos no les gusta usar LyX porque al igual que cualquier herramienta "generadora de código", LyX agrega elementos innecesarios, que pueden incrementar considerablemente el tamaño del producto final, así que prefieren codificar el documento directamente.<br /><br />En este sentido, existen varias herramientas que ayudan a la creación de archivos tex; emacs tiene auctex; pero para aquellos que prefieren las ventanas y no gustan de usar emac hay otras alternativas.<br /><br />Para los que usan eclipse, existe un plugin para trabajar con LaTeX llamado <a href="http://texlipse.sourceforge.net/">texlipse</a>; y para los que usan KDE pueden hacer uso de KDevelop, pero además existe una herramienta (un IDE) exclusiva para trabajar con archivos fuente de LaTeX llamada <a href="http://kile.sourceforge.net/">Kile</a>. Personalmente, me gustó mucho ésta última.<br /><br />Y para los que trabajan con GNOME, y no quieren usar herramientas de KDE, me enteré gracias al blog <a href="http://tobal.cymaho.com/">Linux Music 2.0</a> de la <a href="http://tobal.cymaho.com/?p=145">existencia</a> de un plugin para gedit que permite trabajar con LaTeX que se encuentra en: <a href="http://sourceforge.net/projects/gedit-latex/">http://sourceforge.net/projects/gedit-latex/</a><br /><br />Por cierto, si te interesa aprender LaTeX, existe un <a href="http://en.wikibooks.org/wiki/Latex">libro</a> que enseña el uso del lenguaje, que está en <a href="http://wikibooks.org/">wikibooks</a>, llamado LaTex que se puede descargar libremente y compartir.<br /><br />[1] <a href="http://es.wikipedia.org/wiki/LaTeX">http://es.wikipedia.org/wiki/LaTeX</a>Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com4tag:blogger.com,1999:blog-12790334.post-62371252725470780182009-02-08T22:44:00.002-06:002009-02-08T22:54:23.673-06:00Minitip: Graficando el espacio usado de disco duroSi en algún momento se está interesado en ver de manera gráfica en que se tiene gastado el disco duro, existen varias aplicaciones que permiten hacerlo.<br /><br />Si se tiene instalado GNOME, viene con una aplicación que se llama baobab, que al ejectuarlo, se puede seleccionar algún directorio, y sobre éste hace el análisis, mostrando en una gráfica tipo pie, la proporción de uso que corresponde a cada subdirectorio.<br /><br />En KDE se disponde de una herramienta parecida, llamada filelight, que también despliega en un gráfico tipo pie, como está ocupado el directorio.<br /><br />Además existe una herramienta que solo necesita el servidor X para funcionar que se llama xdu. Se utiliza como:<br /><br />>$ du | xdu.<br /><br />Para saber más<br /><br />>$ man baobab<br />>$ man filelight<br />>$ man xduCésarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com1tag:blogger.com,1999:blog-12790334.post-30247864082053517702009-01-18T23:34:00.005-06:002009-01-19T12:43:16.996-06:00Curiosidades en los compiladores de GNUHaciendo unos programitas de ejemplos, escritos en lenguaje C++, como son muy pequeños y son compilados con el compilador de GNU, g++ en un sistema GNU/Linux, pensé que el binario iba a resultar tan pequeño, dado el tamaño del código fuente, que con respecto el mismo programa escrito en C, no iba a haber mucha diferencia en el tamaño.<br /><br />Sin embargo la diferencia entre uno y otro si es notable, por ejemplo para el caso particular del siguiente código en C++:<br /><br /><pre><br />using namespace std;<br />#include <iostream><br /><br />// Funcion que es llamada<br />int llamada(int x, int y){<br /> cout << "Estamos en la funcion!!" << endl;<br /> return(x+y);<br />}<br /><br />int main(void){<br /> //Estos comentarios son propios de C++<br /> cout << "Vamos a llamar a la funcion..." << endl;<br /><br /> // Llamamos a la funcion<br /> // y asignamos<br /> int z=llamada(5,7);<br /> cout << "Resultado: "<< z << endl;<br /><br /> // Llamamos desde la salida estandar<br /> cout << "Resultado desde la llamada: " << llamada(6,7) << endl;<br /> cout << "Programa terminado\n" << endl;<br /><br /> return 0;<br />}<br /></pre><br />Y el mismo programa en C:<br /><pre><br />#include <stdio.h><br /><br />// Funcion que es llamada<br />int llamada(int x, int y){<br /> printf("Estamos en la funcion!!i\n");<br /> return(x+y);<br />}<br /><br />int main(void){<br /> //Estos comentarios son propios de C/C++<br /> printf("Vamos a llamar a la funcion...\n");<br /><br /> // Llamamos a la funcion<br /> // y asignamos<br /> int z=llamada(5,7);<br /> printf("Resultado: %d\n", z);<br /><br /> // Llamamos desde la salida estandar<br /> printf("Resultado desde la llamada: %d \n", llamada(6,7));<br /> printf("Programa terminado\n");<br /><br /> return 0;<br />}<br /></pre><br /><br />Que como se observa, no hay mayor diferencia en las declaraciones y en el propósito del programa, y sin embargo al compilarlo el primero genera un ejecutable de tamaño de 9372 bytes, mientras que el segundo su tamaño es de 6718 bytes, lo que me lleva a pensar que en una aplicación realmente grande, ese tamaño seguramente se ha de incrementar bastante.<br /><br />La compilación fue el primero con g++ sin más argumentos, el segundo fue con gcc sin argumentos, el ejemplo es de un documento llamado: <a href="http://es.tldp.org/Manuales-LuCAS/doc-tutorial-c++/doc-tutorial-c++.pdf">Tutorial de C++ (o el diario de Peter Class)</a><br /><br /><span style="font-weight: bold;">ACTUALIZACIÓN</span>:<br /><br />Después de leer el comentario, debo aclarar que solo es una suposición, y que en donde dice:"... lo que me lleva a pensar que en una aplicación realmente grande, ese tamaño seguramente se ha de incrementar bastante..."<br />Una mejor forma de explicar mi idea es:"... lo que me lleva a pensar que en una aplicación realmente grande, una proporción equivalente pudiera mantenerse, siendo el binario de la versión en c++, de mayor tamaño..."Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com4tag:blogger.com,1999:blog-12790334.post-74311596418708899862008-10-15T10:30:00.001-05:002008-10-15T10:37:47.786-05:00Conferencia en la FI de la UNAM por Luciano Bello"Explotando vulnerabilidades de seguridad en OpenSSL" por Luciano Bello<br /><br />Resumen:<br /><br />"Luciano Bello descubrió la gran vulnerabilidad del PRNG (Pseudo-Random Number Generator) de OpenSSL en la distribución de Debian. Es ingeniero en Computación y trabaja como investigador en el SI6 Laboratorio de Investigación y Desarrollo de Seguridad Informática del Instituto de Investigaciones Científicas y Técnicas para la Defensa (CITEFA) en Buenos Aires, Argentina.<br /><br />En esta charla se hablará sobre el problema, su descubrimiento, publicación, consecuencias y explotación. Se mosotrarán herramientas para la explotación y demostraciones prácticas."<br /><br />La cita es el día jueves 16 de octubre de 2008 de 16:00 a 18:00 hrs en el auditorio Sotero Prieto, del edificio Anexo de la Facultad de Ingenieria, en Ciudad Universitaria.<br /><br />LIDSoL y la FI-UNAM invitan.Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com1tag:blogger.com,1999:blog-12790334.post-45969422033722228672008-10-11T22:02:00.002-05:002008-10-11T22:16:21.011-05:00¿Crisis finaciera buen momento para el FOSS?Es de todos conocido la gran crisis financiera por la que están pasando la economía mundial y que resulta en grandes pérdidas para muchos (quiebras, despidos, etc).<br /><br />Y sin embargo, es un momento propicio para los que se saben mover en los mundos de las casas de bolsa. Quienes podrán hacer leña de tantos y tantos árboles caidos (metáfora, claro).<br /><br />De igual forma, considero que es un momento propicio para quienes se dedican a proveer servicios basados en FOSS, porque muchas empresas se verán obligadas a hacer recortes en sus gastos, para poder paliar lo mejor posible la recesión, que para los que son conocedores, dicen que será larga.<br /><br />Dado que es necesario gastar menos, ¿porqué no considerar entre esas reducciones el costo de licencias?; es decir, si una empresa tiene instalado una X cantidad de software por el cual paga licencias, anuales, o tal vez mensuales; podría omitir el gasto de ellas, reduciendolo o al sueldo de un especializta en software equivalente libre, o al contrato con quien puede ofrecer ese servicio.<br /><br />De hecho, Google ha logrado algo parecido, al lograr que el <a href="http://google.dirson.com/post/4141-google-apps-licencias-microsoft-office/">gobierno regional de Washington DC, sustituya sus licencias de MS Office por su Google Apps</a>, que le redundará en un ahorro considerable a dicho gobierno. Mejor sería, si una empresa FOSS fuera quien lo hubiese logrado.<br /><br />Así que a río revuelto, ganancia de pescadores, que para aquellos que se dedican seriamente a servicios basados en FOSS, creo que hay un buen pretexto para avanzar.Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-8561715776916988492008-09-03T23:25:00.003-05:002008-09-03T23:32:53.874-05:00minitip: Compilando con varias tareasSi tienes a tu disposición uno de esos nuevos procesadores que tienen varios nucleos, y te gusta descargar codigo fuente para compilar aplicaciones en tu propia máquina, se puede realizar más rápido si al comando make (que es quien indica en que forma se ha de compilar), se le especifica cuantas tareas deseamos que se realicen al mismo tiempo.<br /><br />Así, si por ejemplo se tienen dos núcleos, se puede especificar simplemente (después del respectivo ./configure):<br /><br />>$ make -j 2<br /><br />Si por ejemplo se cuenta con 3 núcleos, se especifican las tareas con un número igual al de nucleos que se dispone, es decir, para este caso:<br /><br />>$ make -j 3<br /><br />Es importante notar, que el número de tareas no necesariamente es igual al número de nucleos o procesadores con los que se cuenta. De hecho la opción existe desde hace tiempo, así que se pueden colocar más tareas que nucleos, solo hay que hacer notar, que esas tareas "sobrantes" se ejecutarán de manera concurrente.Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-43334318720471911462008-05-14T23:22:00.002-05:002008-05-15T00:13:25.570-05:00Procesamiento digital de imágenes en GNU/Linux (2)Para manipular las imágenes hay que cargarlas en el ambiente de trabajo que se desea usar.<br /><br />Como mencioné en otra entrada, se puede hacer procesamiento digital de imágenes en octave, previa instalación de gnuplot e ImageMagick y después de haber instalado en octave el paquete Image de octave-forge.<br /><br />Entonces para cargar una imagen y almacenarlar en una matriz en octave, se hace uso del mismo comando que en matlab:<br /><br /> octave> imagen=imread('imagen.formato')<br /><br />En donde imagen, es el nombre de la imagen a cargar y el formato es la extensión del tipo de imagen a cargar, es decir, hay que poner el nombre completo de la imagen a cargar.<br /><br />Por ejemplo, si se tiene una imagen llamada arroz.jpg en su directorio de trabajo, para cargar la imagen en una matriz llamada imagen_prueba, se escribe:<br /><br />octave> imagen_prueba=imread('arroz.jpg')<br /><br />Lo cual permite cargar los tres canales de color de la imagen en la matriz imagen_prueba.<br /><br />Suponiendo una imagen de 40 x 40 pixeles , al pedir el tamaño de la matriz con el comando size, devuelve algo como:<br /><br />octave> size(imagen_prueba)<br /> 40 40 3<br /><br />Y si se desea visualizar la imagen, se hace con el comando imagesc (se puede usar también el comando imshow).<br /><br />octave> imagesc(imagen_prueba) % despliega imagen_prueba<br /><br />Como es una matriz, solo hay que aplicarle la teoría de procesamiento digitial de imágenes.<br /><br />Por último, para trabajar la imagen en tonos de gris, se puede hacer con el comando rgb2gray, que genera una nueva imagen guardada en una matriz de dos dimensiones que solo tiene valores enteros entre 0 y 255.<br /><br />octave>imagen_grises=rgb2gray(imagen_prueba)<br /><br />En cualquier caso, para saber más sobre los comandos solo hay que teclear<br /><br /> octave > help imread<br /> octave > help imagesc<br /> octave > help size<br /> octave > help imshow<br /> octave > help rgb2gray<br /> octave > help colormapCésarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com3tag:blogger.com,1999:blog-12790334.post-16603988727971107852008-05-03T14:27:00.002-05:002008-05-03T14:41:03.142-05:00minitips: Algunas cosas útiles<span style="font-weight: bold;">Capturando pantallas</span><br /><br />Al estar trabajando con octave para hacer tratamiento digital a imágenes, tuve la necesidad de capturar los resultados, y como estoy trabajando en Xubuntu, la tecla "imprimir pantalla" no funcionó.<br /><br />Pero como instalado Image Magick, hice uso de los comandos que provee para lograr capturar la pantalla.<br /><br />Para capturar toda la pantalla se puede lograr con:<br /><br />>$ import -window root captura.jpg<br /><br />Es conveniente poner un retardo (por ejemplo usar el comando sleep), para habilitar la ventana a capturar, tal cual el comando, capturará todo lo visible en e la pantalla después del enter.<br /><br />Ahora que si solo se desea capturar una ventana de interés, se puede usar el comando import de la siguiente forma:<br /><br />>$ import h ruta/donde/dejar/imagen.jpg<br /><br />Que habilitará al cursor para elegir la ventana y la guradará en la ruta especificada; con este método los marcos de la ventana desaparecen, solo guarda el contenido de la ventana.<br /><br /><span style="font-weight: bold;">IDE's para trabajar con PHP</span><br /><br />Andando por aquí y por allá, encontré algunas recomendaciones para trabajar con PHP:<br /><br /><ul><li>quanta plus</li><li> bluefish editor</li><li> kompozer</li><li> trustudio</li><li> nuv</li><li> cssed</li><li> komodo</li><li>gPHPEdit</li><li>Screem</li></ul>De todos ellos he probado algunos muy someramente, y el que me gustó más fue gPHPEdit, que me pareció bastante práctico.Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com0tag:blogger.com,1999:blog-12790334.post-52016891773893254582008-05-02T12:16:00.003-05:002008-05-02T13:17:53.904-05:00Procesamiento digital de imágenes en GNU/Linux (1)Comenzando<br /><br />Para realizar procesamiento digital de imágenes básico; se puede trabajar desde <a href="http://www.gnu.org/software/octave/">octave</a>, <a href="http://www.gnuplot.info/">gnuplot</a> y el paquete de tratamiento de imágenes de <a href="http://octave.sourceforge.net/index.html">octave-forge</a>. Herramientas mínimas necesarias para hacer (hasta donde yo he visto), lo mismo que se haría en Matlab.<br /><br />Así que primero hay que instalarlos, y para ello solo es cuestión de, para los primeros dos, utilizar su gestor de paquetes favorito.<br /><br />Ahora que si se desea instalar octave desde el código fuente, ya sea porque siempre se quiere lo último, o porque se requiera hacer uso de una función que solo está en la última versión, es necesario contar con todo lo necesario para hacer binarios (en el caso de Ubuntu, es necesario instalar buil-essential); tener g77, y varias bibliotecas de procesamiento numérico, bibliotecas para manipular archivos comprimidos; además de las herramientas para trabajar con latex, por si se desea compilar también la documentación.<br /><br />Es muy recomendable que si se va a trabajar con imágenes, se instale también <a href="http://www.imagemagick.org/script/index.php">imagemagick</a>.<br /><br />En tal caso, después de descomprimir el tarball de octave, dentro del directorio descrompreso, solo hay que hacer la típica rutina:<br /><br />>$ ./configure<br />>$ make<br />>$ sudo make install<br /><br />El configure por supuesto dirá que es necesario cuando no se logre satisfacer la dependencia para construir octave.<br /><br />El make puede tardar bastante si no se cuenta con un procesador eficiente; en mi caso, en un adm athlon xp 2000+ tardó algo así como entre 2 y 3 horas, (perdí la cueneta a las 3 am). Por supuesto, el make no se debe ejecutar hasta que el configure termine satisfactoriamente (es decir, que no se queje de que falta algo).<br /><br />Y si todo termina bien, el make install (con privilegios de root), lo pondrá en el lugar más adecuado. En este punto solo resta ir a la página oficial de octave-forge y descargar los paquetes que sea de nuestro interés; en el caso de procesamiento digital de imágenes, con el paquete <a href="http://octave.sourceforge.net/image/index.html">Image</a> es suficiente.<br /><br />Y para instalar los paquetes, se ejecuta octave y desde octave pkg install nombre_paquete.tar.gz; donde nombre_paquete es el nombre del paquete de octave que queremos instalar.<br /><br />Y con esto ya tenemos un ambiente de trabajo para hacer procesamiento digital de imágenes en GNU/LinuxCésarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com1tag:blogger.com,1999:blog-12790334.post-26603362762106461862008-05-01T20:53:00.002-05:002008-05-01T21:10:21.924-05:00Instalando GNU/Linux en máquinas con Win Vista (2)Como ya se tiene espacio disponible donde colocar un sistema operativo diferente a Win Vista, el resto resulta muy sencillo (O complicado si tenemos hardware muy nuevo que aún no sea soportado por la distro que queremos instalar).<br /><br />¿Cómo saber que correrá suficientemente bien la distro Linux que he escogido? Bueno, eso se puede verificar de una forma sencilla, si la distro que se ha elegido cuenta con una versión <a href="http://es.wikipedia.org/wiki/CD_aut%C3%B3nomo">live-cd</a>, entonces es buen momento para usarlo en ese modo y ver que hardware reconoce.<br /><br />Las distribuciones más comunes cuentan con live-cd, como Fedora, Ubuntu, OpenSUSE; así como por ejemplo pclinuxos que es relativamente una distribución nueva, con atención a usuarios noveles.<br /><br />En el caso de Ubuntu (así como otros live-cd's), tanto el instalador como el modo "en vivo" se encuentra en el mismo cd. Y en el caso de la versión 8.04 desde el arranque pregunta si se desea probar o instalar (o hacer otras cosas) aunque lo primero que pregunta es el idioma que se desea en las interfaces.<br /><br />Es en este momento conveniente usar la opción de "probar" si no existe la certeza de que GNU/Linux funcionará bien en la PC.<br /><br />Ahora que si ya se sabe que correrá bien y ya se tiene espacio en disco duro, entonces se esconge la opción instalar y solo hay que seguir las instrucciones una tras otra hasta llegar al momento del particionado.<br /><br />Cuando se llegue a este punto hay que indicarle al instalador que use el espacio vacio y continue.<br /><br />Realmente los nuevos instaladores están ya muy trabajados, e instalar una distribución Linux ya resulta realmente sencillo.Césarhttp://www.blogger.com/profile/02285978120189522580noreply@blogger.com2