miércoles, 12 de enero de 2011

¿Software Libre es igual a Software Gratis?

No sé como mucha gente piensa que Software Libre es igual a Software Gratis, no veo en nada coincidencia, primero en las palabras y luego en lo que significa cada una de ellas. Refiriéndome al Software Cerrado y privativo de libertades son los que contienen más errores, eso sí pulen mucho su aspecto visual hacía el usuario haciéndolos más ameno en el trabajo o como le llamamos más productivo, pues basta unos clicks y ya está instalado o funcionando.

Es cierto el Software Libre al día de hoy no es para todos los usuarios, y eso se debe a los tratos o contratos que existen con empresas multinacionales, ellos te definen un sistema operativo preinstalado que tú ya pagaste por él, sin antes preguntarlo. Es decir tu nuevo equipo viene con una licencia adjudicada para su USO, si leiste bien es solo para permitirte USARLO, nunca podrás en primera instancia estudiarlo ni mucho menos adaptarlo a tus necesidades o necesidades de tu entorno. Con el Software Libre sucede TODO LO CONTRARIO ¿Qué raro no crees?

Piensa!!!, ¿A poco crees que tu información esta segura con Software Cerrado y Privativo?, ¿Cómo sabes que tu información no viaja cuando haces una actualización? Y aparte de todo esto tienes que comprar este producto cada vez que ellos sacan a luz un nuevo programa, y que raro descontinúan es que tú ya usas por unos añitos ¿Qué raro no crees? ... Solución usa GNU Linux. Da el primer paso para defender tu libertad y tu información.

viernes, 15 de octubre de 2010

Gentoo vs Arch

En estos momentos estoy probando Arch Linux como plataforma de desarrollo. Yo siempre he sido mas Gentoo User que otra cosa. Pero he decidido darle una oportunidad a Arch como plataforma de desarrollo. Aún no me ha convencido del todo, es cierto que tienes una forma de instalar de manera rápida algunos paquetes que por ejemplo comparado con Gentoo tiendes a esperar un poco. Me ha llamado la atención de que por ejemplo en Arch puedes compilar paquetes y de hecho he notado que los tiene casi en su última versión, esto es algo que me impresionó. Veamos que dice el futuro si Arch es la neta o quizás no lo sea del todo.

domingo, 16 de mayo de 2010

A Simple Web Service Example with Mono

Mi code is this:

GenericWebService.cs

using System;
using System.Web.Services;

namespace GenericWebService
{
[WebService (Description="Our first web service")]
public class GenericWebService : WebService
{
[WebMethod]
public string SayHi()
{
return "Hiii";
}
}
}


Another file GenericWebService.asmx

<%@ WebService Class="GenericWebService.GenericWebService" %>


Compile with:

mcs -r:System,System.Web,System.Web.Services GenericWebService.cs -t:library

Then create a bin directory, put your dll into bin directory and execute over shell:

$ xsp

Open your firefox browser ... is there another browser? Ok

http://localhost:8080/GenericWebService.asmx

See the result :D

jueves, 21 de enero de 2010

Gentoo is Back ...

Of course yes, Gentoo is back. Why? This decision was simple, Fedora 12 or OpenSuSE 11.2 not works for me. Days ago when i was happy with Fedora 12, i installed all updates for Fedora, for surprise mine, Fedora had many packages with dependencies. I mean, there was packages that i could not install. I used this command to resolve my issue:


Like root, i did this

#yum -y update

the output of yum not was funny for me. Many dependencies that i not could solve, i don't had time to resolve this issue. In fact, with Fedora 12, yes 12, i had many issues with cheese (webcam program), there not had 3d video aceleration, xboard crash, mono is not update, monodevelop is not update too, the sound was better than older releases, anyway. Shutdown and reboot whithout problems, hibernation and suspend no troubles. But updates was my decision to make a change to Gentoo system. When you install Fedora 12 x86_64, i had many updates to do, i take a long time to do this :-(. yum use rpmdelta to resolve the time to install any package on the system. Like a user normal this not could be :-|. Ok, Fedora is not for all users. Then i try OpenSuSE 11.2, ohh Qt is installed on my system, Yast, i don't like Yast, mono was there, monodevelop was there updated to the lastest version. But when i installed git, i do not wanted many dependencies, just git. Other issue for me to make a change to Gentoo.

Over Gentoo systems, i can install every package to custom way. This is my way. I need this. A custom kernel, my own tools, my needed packages, my xfce, my own flags to compile all the system. Yes, Gentoo is Back again n_n.

No more zyper, no more yum and issues, just "emerge --sync" and "emerge --update --deep --newuse world", yes this will take a time maybe long time :-D

jueves, 14 de enero de 2010

Ruby Technology

Hace meses conocí a un Ing. en Electrónica, él se dedica a realizar prototipos de su área para que más adelante ponerlos en marcha. Así, se le presentó un problema de programación. El problema es el siguiente ...

Tenía datos en un archivo, del cual su estructura es la que presento

0xca, 0xee, 0xa6, 0xf4, 0x1a, 0x10, 0x17, 0x10
0x1c, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1b, 0x00
...
...
...

EOF

Él deseaba covertir cada dato hexadecimal en forma binaria, pero su vez debía de partir cada 8 datos hexadecimales en 2, es decir 4 datos hexadecimales consecutivos.

Para programarlo hay muchos lenguajes de programación que me ofrecían una solución, queríamos hacerlo en C, pero desgraciadamente no disponíamos de GCC el compilador de C y tampoco disponíamos de Internet para su posterior instalación. Me acordé que disponía de Ruby :-O. Para aquellos que no saben qué es Ruby, pues simplemente es un lenguaje de programación orientado a objetos del cual cada fichero es interpretado para después dar una salida, en fin mucho rollo para eso mejor visiten su sitio sí están interesados en Ruby.

Saque mis manuales de Ruby, y este es el código que resulto después de 2 horas de lectura, investigación, programación y pruebas.

converter.rb
----------------------------------------------------
#!/usr/bin/ruby
require 'enumerator'

hexdata = []
temp = []

while line = gets
temp = line.split(', ')
temp.each { |n| hexdata.push n }
end
temp = nil
array = []
hexdata.each { |n| array.push '%08b' % n }
puts
hexdata = nil
array.each_slice(4) { |element| p element }
array = nil

----------------------------------------------------


Espero y les sirva a muchos. Saludos.

sábado, 15 de agosto de 2009

Mono, C# y Archivos ODS



Tratando de acceder a un archivo en formato xls de Excel con C#, tuve algunos problemas accediendo al contenido de la celda de cada columna de la hoja de cálculo. Así pues empece a investigar otra manera de hacerlo rápido y usando por supuesto C#. Con OpenOffice.org Calc encontré una manera de acceder a ello despues de varias horas probando el acceso al contenido de las celdas. El inconveniente es que no había mucho código para leer y documentarse un poco.

Como estoy aprendiendo el perfil de tester, y usamos el TFS para reportar Bugs o incidencias, y de ahí generamos reportes de los mismos en archivos xls. Quería averiguar la manera de acceder al contenido de las celdas de cada columna para comparar si este bug estaba duplicado o no, o bien, si este bug tenía una relación con otro bug que se le pareciera en su contenido de acuerdo a un porcentaje de parecido.

Usando Fedora 11, Mono 2.x y OOo Calc, lo logré. Aquí el código fuente del archivo bugs.cs:


/*
* Copyright (C) Gerardo Gonzalez Cruz gerardogc2378@gmail.com July 2009.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

using System;
using System.IO;
using Gtk;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace XMLBugs
{
public class Bugs
{
private string currentDescription = string.Empty;
private string nextDescription = string.Empty;
private string currentBugID = string.Empty;
private string nextBugID = string.Empty;
private string currentSteps = string.Empty;
private string nextSteps = string.Empty;
private string error = string.Empty;
private double diff = -1;
private string similarBugs = string.Empty;
private string equalBugs = string.Empty;
private Gtk.TreeStore bugsTreeStore = new Gtk.TreeStore(typeof (string), typeof (string), typeof (string));
private Gtk.TreeIter iterBug;
private Stack<string> stack = new Stack<string>();

public static void Main()
{
new Bugs();
}

public Bugs()
{
readXMLFile();
//saveToFile();
setBinding();
}

private void saveToFile()
{
string fileName = getFileName();
TextWriter twEqualBugs = new StreamWriter("equal" + fileName);
TextWriter twSimilarBugs = new StreamWriter("similar" + fileName);

twEqualBugs.WriteLine(equalBugs);
twSimilarBugs.WriteLine(similarBugs);

twEqualBugs.Close();
twSimilarBugs.Close();
}

private void setBinding()
{
Application.Init();

Gtk.Window window = new Gtk.Window("Bugs");
window.SetSizeRequest(800,600);

Gtk.ScrolledWindow sw = new Gtk.ScrolledWindow();

Gtk.TreeView tree = new Gtk.TreeView();

sw.Add(tree);

window.Add(sw);

Gtk.TreeViewColumn statusColumn = new Gtk.TreeViewColumn();
statusColumn.Title = "Estado";

Gtk.CellRendererText statusCell = new Gtk.CellRendererText();

statusColumn.PackStart(statusCell, true);

Gtk.TreeViewColumn bugIDColumn = new Gtk.TreeViewColumn();
bugIDColumn.Title = "BugID";

Gtk.CellRendererText bugIDCell = new Gtk.CellRendererText();

bugIDColumn.PackStart(bugIDCell, true);

Gtk.TreeViewColumn diffColumn = new Gtk.TreeViewColumn();
diffColumn.Title = "% Similitud";

Gtk.CellRendererText diffCell = new Gtk.CellRendererText();

diffColumn.PackStart(diffCell, true);

tree.AppendColumn(statusColumn);
tree.AppendColumn(bugIDColumn);
tree.AppendColumn(diffColumn);

statusColumn.AddAttribute(statusCell, "text", 0);
bugIDColumn.AddAttribute(bugIDCell, "text", 1);
diffColumn.AddAttribute(diffCell, "text", 2);

statusColumn.SetCellDataFunc(statusCell, new Gtk.TreeCellDataFunc(RenderStatus));

tree.Model = bugsTreeStore;

window.DeleteEvent += new DeleteEventHandler(delete_window);
window.ShowAll();

Application.Run();
}

private void RenderStatus(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
{
if(model.GetValue(iter, 0).ToString() == "Duplicado:")
(cell as Gtk.CellRendererText).Foreground = "red";
else
(cell as Gtk.CellRendererText).Foreground = "black";
}

private static void delete_window(System.Object o, DeleteEventArgs args)
{
Application.Quit();
args.RetVal = true;
}

private void readXMLFile()
{
try
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("content.xml");
XmlNodeList xnlBugs = xDoc.GetElementsByTagName("table:table");
XmlNodeList xnlAllRows = ((XmlElement)xnlBugs[0]).GetElementsByTagName("table:table-row");

for(int currentRow = 1; currentRow < xnlAllRows.Count; currentRow++)
{
XmlNodeList xnlCurrentRow = ((XmlElement)xnlAllRows[currentRow]).GetElementsByTagName("table:table-cell");

for(int currentCol = 0; currentCol < xnlCurrentRow.Count; currentCol++)
{
switch(currentCol)
{
case 0:
{
XmlNodeList xnlColumn = ((XmlElement)xnlCurrentRow[currentCol]).GetElementsByTagName("text:p");

for(int line = 0; line < xnlColumn.Count; line++)
currentBugID = xnlColumn[line].InnerText.ToString();

break;
}
case 1:
{
XmlNodeList xnlColumn = ((XmlElement)xnlCurrentRow[currentCol]).GetElementsByTagName("text:p");

for(int line = 0; line < xnlColumn.Count; line++)
currentDescription += xnlColumn[line].InnerText.ToString();

break;
}
case 2:
{
XmlNodeList xnlColumn = ((XmlElement)xnlCurrentRow[currentCol]).GetElementsByTagName("text:p");

for(int line = 0; line < xnlColumn.Count; line++)
currentSteps += xnlColumn[line].InnerText.ToString();

break;
}
default: break;
}
}

if(currentBugID == string.Empty)
{
currentBugID = string.Empty;
currentDescription = string.Empty;
currentSteps = string.Empty;
continue;
}
else
Console.WriteLine("Processing: {0}", currentBugID);

for(int nextRow = currentRow + 1; nextRow < xnlAllRows.Count; nextRow++)
{
XmlNodeList xnlNextRow = ((XmlElement)xnlAllRows[nextRow]).GetElementsByTagName("table:table-cell");

for(int nextCol = 0; nextCol < xnlNextRow.Count; nextCol++)
{
switch(nextCol)
{
case 0:
{
XmlNodeList xnlColumn = ((XmlElement)xnlNextRow[nextCol]).GetElementsByTagName("text:p");

for(int line = 0; line < xnlColumn.Count; line++)
nextBugID = xnlColumn[line].InnerText.ToString();

break;
}
case 1:
{
XmlNodeList xnlColumn = ((XmlElement)xnlNextRow[nextCol]).GetElementsByTagName("text:p");

for(int line = 0; line < xnlColumn.Count; line++)
nextDescription += xnlColumn[line].InnerText.ToString();

break;
}
case 2:
{
XmlNodeList xnlColumn = ((XmlElement)xnlNextRow[nextCol]).GetElementsByTagName("text:p");

for(int line = 0; line < xnlColumn.Count; line++)
nextSteps += xnlColumn[line].InnerText.ToString();

break;
}
default: break;
}
}

if(nextBugID == string.Empty)
{
nextBugID = string.Empty;
nextDescription = string.Empty;
nextSteps = string.Empty;
continue;
}

if(currentDescription.Equals(nextDescription)
&& currentSteps.Equals(nextSteps))
{
if(!stack.Contains(currentBugID))
{
iterBug = bugsTreeStore.AppendValues(currentBugID, "", "");
stack.Push(currentBugID);
}

equalBugs += currentBugID + " >> " + nextBugID + "\n";
bugsTreeStore.AppendValues(iterBug, "Duplicado:", nextBugID, "100%");
}
else
{
if(isSimilar(currentDescription + " " + currentSteps,
nextDescription + " " + nextSteps))
{
if(!stack.Contains(currentBugID))
{
iterBug = bugsTreeStore.AppendValues(currentBugID, "", "");
stack.Push(currentBugID);
}

similarBugs += currentBugID + " >> " + nextBugID + "\n";
bugsTreeStore.AppendValues(iterBug, "Similar:", nextBugID, diff.ToString() + "%");
}
}

nextBugID = string.Empty;
nextDescription = string.Empty;
nextSteps = string.Empty;
diff = -1;
}

currentBugID = string.Empty;
currentDescription = string.Empty;
currentSteps = string.Empty;
}

xnlAllRows = null;
xnlBugs = null;
xDoc = null;
}
catch(Exception err)
{
this.error = err.Message;
Console.WriteLine(error);
}
}

private bool isSimilar(string A, string B)
{
if(A == string.Empty
|| B == string.Empty)
{
diff = -1;
return false;
}
else
{
string[] words = null;
string finalString = string.Empty;

switch(A.Length > B.Length)
{
case true:
{
words = B.ToLower().Split(' ');
finalString = A.ToLower();

for(int i = 0; i < words.Length; i++)
{
if(words[i] != string.Empty)
finalString = Regex.Replace(finalString, @"\b(" + removeRareCharacter(words[i]) + @")\b", "~");
}

diff = (finalString.Split('~').Length * 100) / A.Split(' ').Length;

words = null;
finalString = string.Empty;
break;
}
case false:
{
words = A.ToLower().Split(' ');
finalString = B.ToLower();

for(int i = 0; i < words.Length; i++)
{
if(words[i] != string.Empty)
finalString = Regex.Replace(finalString, @"\b(" + removeRareCharacter(words[i]) + @")\b", "~");
}

diff = (finalString.Split('~').Length * 100) / B.Split(' ').Length;

words = null;
finalString = string.Empty;
break;
}
}

if(diff >= 85 && diff <= 100)
return true;
else
return false;
}
}

private string removeRareCharacter(string Obj)
{
string _Obj = Obj;
string[] invalidCharaters = {"\"", ".", ";", ",", "{", "}", "[", "]", "\'", "(", ")", "*", ".-", "-"};

for(int i = 0; i < invalidCharaters.Length; i++)
_Obj = _Obj.Replace(invalidCharaters[i], string.Empty);

return _Obj;
}

private string getFileName()
{
return "Bugs_" +
DateTime.Today.ToShortDateString().Replace("/", ".") +
"_" +
System.DateTime.Now.Hour +
"." +
System.DateTime.Now.Minute +
".txt";
}
}
}


Los pasos que he seguido para ello son los siguientes:

1. Obtengo el arhivo XLS.
2. Lo abro con OOo Calc y lo guardo como ODS.
3. Extraigo del mismo fichero ODS un arhivo de nombre content.xml
4. Lo coloco junto al ejecutable que genera Mono y lo ejecuto.
5. Fin.

lunes, 13 de julio de 2009

OpenSuSE 11.1 x86_64 y Azalia Sound Card

He decido poner OpenSuSE 11.1 de 64 Bits en mi máquina, el problema que tuve fue con la tarjeta de sonido, no había sonido uppps, la solución que me encontré fue la siguiente:
En el directorio de modprobe.d ubicado en etc, existe un archivo llamado sound. Lo primero que realice fue una copia de seguridad del mismo copiandolo hacia el directorio de root, luego lo edite y quedo de la siguiente manera:

-----------------------------------------------------------------------------
options snd cards_limit=1
alias snd-card-0 snd-hda-intel
options snd-hda-intel enable=1 model=hp-m4 enable_msi=1 single_cmd=0 power_save_controller=0 power_save=0
-----------------------------------------------------------------------------

El comando lspci me mostró lo siguiente:

ggc:/home/ggc # lspci | grep Audio
00:14.2 Audio device: ATI Technologies Inc SBx00 Azalia (Intel HDA)

Si tienes una tarjeta parecida a la mía puede resultar que con esas líneas tengas sonido, despues de un reinicio de tu máquina o de ejecutar el comando:

# rcalsasound --restart