December 12, 2010

Things I have learned from work... so far

 Back in 2009 I started working on a Swiss software development company called Swissbytes, since then I have learned a lot of things. This is a very short list of the most important ones:
  • You are not the best programmer in the world, deal with it.
  • Always put your name in your source code.
  • Keep track of your work, as well of your source code.
  • Think a little bit before jumping into programming, but do not exagerate.
  • Keep yourself updated, no one likes conformists. 
  • Learn English, that's a must do.
  • A good specification is short and to the point.
  • A software product is never finished, never.
  • Work with standards, that's required if you are working in teams.
  • Write tests for your code (this is something I'm still learning).
  • Simplify your life, there are tools for that: revision control systems, automated build, template engines, static analysis tools.
  • And the most important of all: Enjoy what you are doing, if your work does not make you happy, there's something wrong. That's the best motivational advice I could give you, enjoy your work, enjoy working on group, enjoy working alone, enjoy challenges, be proud of yourself.

    I guess those are the most important for the moment, for sure I will be updating this list. Enjoy.

    December 8, 2010

    Revision control systems - Part 1

    As a software engineering student, many of the subjects of the career includes software development projects. And as every kind of project, they normally have: documentation, source code, configuration files, templates, etc.

    At first being a newbie in software development practices I concluded after a while that I needed some sort of revision control for my projects, because all of them were presented to the teachers incrementally and progressively.

    My first approach was to 'clone' my project and name it with some I meaningful name, something like:
    • bookstore_presentation_1
    Was very common for me, if I read the name in the future is easy to deduce that this 'clone' is a snapshot of my project in the first presentation date.
    But after a while I required to recover a 'clone' of an specific date, the only way to find it was to manually check the modification date of the files... pretty dumb.

    Because of that I defined a naming convention for my snapshot copies, it was something like this:
    • project_presentationNumber_date(YY-MM-dd)_description
    And I was kind of happy with this approach for some time, but after a a year my projects workspace got really nasty:
    • bookstore_pres1_08-02-10_initial
    • bookstore_pres2_08-02-12_basic_func
    • bookstore_pres3_08-03-01_simple_reports
    • bookstore_presFinal_08-03-10_final
    • bookstore_presFinal_08-03-10_improved
    • bookstore_presFinal_08-03-10_not_working
    • bookstore_presFinal_08-03-10_1h_before_presentation
    Nasty, right?

    But somehow I managed all my projects in this way for quite a while. Then I started working with teams; after a week of development it was pretty obvious that my naming convention was not working:
    • bookstore_pres1mine_08-08-05
    • bookstore_pres1jhonny_08-08-05
    • bookstore_pres1oscar_08-08-05
    We had some torture hours trying to merge our project versions, but at the end we did it. To finish that project, we suffered as cargo horses for a complete semester, doing manual merges and dumb overrides.

    The next year I started my thesis work and I didn't want for any reason to be involved with the same problems again (I was working with a fellow developer) and I started searching for a software tool that could help me to keep track of a project. After some minutes I have found CVS, I read all I could find and I got involved in Revision Control theories.



    Then a teacher suggested me Subversion (CVS done right, as he said). I downloaded a copy of SVN red book and learned the basics commands and theory of the system. It took a whole afternoon to setup a local Subversion server and create a proper repository for the project, but I did it. My partner and I started working with an initial project structure and we were progressing really fast, but at the moment of merging our work, we had LOTS of problems and ended up with the decision of setting up a central repository for both of us, as is recommended in SVN book.



    We created a project in Google Code with Subversion and we started working from zero again, and the result? It was a developer heaven, all our changes were being tracked and held in a reliable service. And yes we still had conflicts but Tortoise SVN did all the dirty work for us, we finished the project in 6 months with a dozen of releases (tags) and got our degree with a very good mark.

    SVN taught us how to handle our source code, our documentation files and some other important files (images, scripts). It taught us which files should be tracked and which ones should be omitted. It gave us a tracking discipline, we learned the meaning of keywords like commit, update, revert, log, resolve, etc. 

    Since then all our projects were under SVN and we were pretty happy. But then we started working with some fellows in other cities, 5 in total, and some of them didn't have an internet connection for more that an hour by day.

    We required another approach, SVN was not enough this time, that is why we started working with Distributed Revision Control Systems, which is described in Revision control systems - Part 2.

    November 27, 2010

    Problems installing Rails

    When you are trying to install Rails via Gem, you will have this exception:
    # gem install rails
    ERROR:  While executing gem ... (Errno::ENOENT)
        No such file or directory - lib

    To solve it, the solution is pretty obvious, create 'lib' folder:
     # mkdir /usr/lib/ruby/gems/1.9.1/gems/rails-3.0.3/lib

    Then execute the first command again, and done.

    November 17, 2010

    libgpod with Ipod Nano 5th generation

    I've been having a bad time with my iPod Nano and Slackware Linux lately. A lot of the problems I had don't even need a description, but I give just some keywords : 'HashInfo' , 'SysInfoExtended' , 'Database Sync'.
    's all,
    All of  them were solved by building the last stable release of libgpod with this configuration:
    ./configure -prefix=/usr --libdir=/usr/lib --with-hal-callouts-dir=/usr/libexec/scripts
    That's all, have fun.

    November 14, 2010

    gitconfig4j v0.0.1

    Another weekend project has been released. As a short overview, one of the things I really love about GIT it's the .gitconfig layout:



    I love the simplicity and the clearness of those configuration files, and I wanted something similar for some of my Java projects, but I couldn't find an implementation of it.

    So, I decided to create a very small library for supporting git-config file layout for Java. After a couple days of work, I have something I'm not ashamed of.

    But well, here you go: gitconfig4j project page

    November 6, 2010

    Traducción del libro Slackbasics

    Felizmente anuncio la conclusión de la traducción del libro Slackbasics, Daniel de Kok a español latinoamericano.

    Este es un proyecto que tomó poco mas de un año, enseñándome cosas que solamente un traductor puede enfrentar...

    Para mas información referirse a la página dedicada a este tema:

    October 31, 2010

    October 25, 2010

    Simplified JMX with Apache Commons Modeler

    Since I started working with JMX, I always had a background framework doing the dirty job for me. First it was Spring JMX with all its utilities, it's impossible to describe how pleased I was with it.

    Then I worked in a web application, using JBoss, and again, all was as simple as adding an annotation string to some classes or operations.

    But recently I got involved in a pure-java application without frameworks and without the possibility of integrating one. As I was so pleased with the previous frameworks I used, I didn't want to waste time defining objects, creating and registering them.

    My brain doesn't like to work ... I needed a library.

    After a half hour search, I found a very interesting utility called Apache Commons Modeler, that claims to be the solution to my problem.

    Being myself a huge fan of all Apache Commons solutions, I have no doubt this will solve all my problems.

    To continue...

    September 30, 2010

    FLOSS Weekly favourite episodes

    Since last year I am loyal listener of FLOSS Weekly podcasts, Randall Schwartz and his guests give us hours and hours of very useful information in an interesting way.

    As I am a software developer, I rather prefer some episodes related to certain issues, like frameworks and development tools and not so much with hardware-related issues.

    So, based on that, this is my selection of must listen episodes of this great show (* recommended):

    September 25, 2010

    A thought

    You are not your programming language. You are not the web stack you’ve learned. You are not your text editor you write your code in. You are the all crafting, multilingual developer of the world!.

    September 11, 2010

    SQL Developer - Displaying error

    I've been using Oracle SQL Developer for a few months, and something very annoying happened to me, the application was buggy...


    Add the following lines to the sqldeveloper.conf file (found in the sqldeveloper\bin sub-directory)

    AddVMOption -Duser.language=en
    AddVMOption -Duser.region=US

    August 28, 2010

    Factories, builders and singletons in standalone applications

    When I started development, desktop applications were my only target and source of pain. I spent several
    hours, days, months making things work. When I moved to web-enterprise development, a lot of frameworks save me a lot of time, things like Hibernate, Seam, JMS, Guice.

    But when I tried to go back to desktop applications, things hadn't changed very much, I still needed to do a lot of work. Then I started emulating some of the best features of Enterprise frameworks for desktop application development.

    One common problem I've been facing to, it's related to this components:
    • Factories: Delegate object creation and decouple components.
    • Builders: Construct complex components from different parts.
    • Singletos: Let's face it, in standalone applications are not that bad.
    I've created a so called 'BaseFactory' component with a Guice-like approach to provide some of the previous features, here it is:

    August 22, 2010

    ArchLinux deception

    Last weekend I decided to give ArchLinux a chance, I only read good articles about it and I thought it would be nice to get out of Slackware world.

    I will divide my experiences in a few sections:
    1. Installation
      • This part was really strange for me, it supposed to be easier than Slackware ncurses wizards. It's not, it's even worse. 
      • I don't know if is just me, but I the default installation doesn't have anything, no media support, not extra-fs support, nothing. I don't know why ArchLinux community declares that it's painless than Slackware.
    2. Configuration
      • A good point here, configuration of mirrors and the system in general is pretty straightforward, very simple configuration with a lot of comments.  
    3. Package management
      • Maybe Pacman is its best feature, it's even better(IMHO) than APT.
    4. Usability
      • For me, it's not usable at all, I spent 2 hours to get a minimum XFCE desktop working. And don't make me talk about a work environment, it will take days!. I don't really get the idea of having such a basic environment, I don't want to install everything from scratch. But that's just me, maybe there's some other people who like to waste their time, good for them.
    5. Conclusion
      • In general, it's not better than Ubuntu or Slackware, installation and configuration tasks are not hard, but can be simplified. Meanwhile, I will stay with my Slackware desktop for another year.

    July 29, 2010

    Presentation - Distributed Revision control systems

    Linux - Nvidia driver issues

    Sadly I have to talk about this again, since Slackware 12.2 I've been having problems with
    my Nvidia GeForce 6400 card (I know it's old, shut up). And most of the times a little of
    investigation and configuration would be enough, but not this time.

    • Problem description: User switch action freezes all the system and the only way to restore it is by restarting it.
    • Affected OS: Ubuntu Linux 10.4, Slackware Linux 13.1

    As is not only affecting my Slackware installation, I'm pretty sure that is an issue with the kernel
    module. For safety concerns (my information is important now), I'm forced to uninstall all
    nvidia drivers and return to the legacy VESA drivers.

    Is not as good as it used to, but at least is quite stable.

    May 29, 2010

    Slackware 13.1 - Nvidia driver issue

    I've been installing the latest Slackware stable release on my main machine these days and I have to say, it's great!!!. Most of the problems of Slackware 13 are now solved, it's pretty stable and so far without exceptions!!.


    But I found a problem not related to Slackware, there is a problem with the kernel series 2.6.33.x and Nvidia legacy drivers. In short, once the driver is installed, the 'logout' action freezes the system and the only way to restore it is restarting manually, tough.

    The solution, edit file '/etc/kde/kdm/kdmrc' and set:
    # by default is false
    #TerminateServer=true 
    TerminateServer=true
    

    Solution source: black-screen-after-logout-in-slackware

    May 24, 2010

    Slackware 13.1 released

    Finally, after several modifications and security updates, we have a stable release of our beloved Slackware Linux. Slackware 13.1 has several improvements and changes, you can check it in the ANNOUNCEMENT or the RELEASE NOTES and also in CHANGES_AND_HINT.

    May 20, 2010

    Testing Ubuntu 10.4

    I've been testing the new Ubuntu 10.4 distribution for a couple of weeks, just to see how much changed since last year.

    I have to say that is really good, nice, lightweight, and really easy to use. Is taking the MacOS approach to attract users and I think it will work.

    They are taking the right way for PC users, including very useful applications in a single-CD set. But I'm not a normal PC user, I'm a developer, a curious, stupid, bastard that wants to control everything in the system. Ubuntu doesn't let you do that (at least not in an easy way).

    I have tried and tried many distributions and still can't find something better than Slackware. Not because it's easy to use(it really is), or because it has huge software sources. Is because its simplicity, is a very simple system, and allows you to change, modify, ruin everything without telling you 'gfy!'.


    *Note: Is an old screenshoot, but is still valid.
    If you are a developer, and you would like to learn how a Linux system is, or how to use it, you should give it a try.

    May 11, 2010

    May 7, 2010

    Git svn dcommit, interruption recovery

    As usual, I was doing all my work in my local copy(Git) of a SVN repository, when everything was stable and pretty, I started pushing everything to the central server. But in the middle of the operation the network was shutdown, some of my commits couldn't be pushed and my working tree was a mess!!.

    "Ok" - I said - "I just have to point to HEAD again... which was the commit number?". I couldn't remember the commit number(is not so easy to do, admit it) but that's not necessary, right?, just do a 'git log --all' and you will see your commits. But NOOOOOOOOO, all commits were up to the last SVN dcommit entry!!!.
    e.g.
                                                           * -> 'super commit'
                                                            |
                                                           * -> 'some other commit'
                                                            |
                                                          [*]-> 'where SVN commit crashed'
                                                            |

    "Oh shit, oh dear Lord!!, don't worry, Git tracks content, can't lose my commits" - I said. But nevertheless all options I've tried, my commits seem to be lost.

    After a few minutes reading Git's manual, I found this:
    $> git rev-list --all --pretty=oneline
    
    And.. YES!! all my commits are there, so, to make the long story short:
    $> git checkout awfulCommitNumber
    $> git svn rebase
    $> git svn dcommit
    

    May 4, 2010

    External merge-diff - Git on windows

    To configure and use Git in a Linux environment is quite easy, but if you are working in a Windows system, things get a little bit complicated.

    I use MsysGit which is a great port to win32, and as a merge/diff tool I use WinMerge (I can't stand KDiff); to work with WinMerge as 'difftool' and 'mergetool' you could do this:

    - First, create a wrapper script for our 'difftool', save this file as 'diff-tool.sh' in your $HOME folder:

    #!/bin/sh
    # Change "E:/bin/WinMerge/WinMergeU.exe" with your winmerge path
    "E:/bin/WinMerge/WinMergeU.exe" -e -ub "$1" "$2" | cat
    

    - Now, edit your $HOME/.gitconfig file, you can take as example my current configuration:
    [core] 
    autocrlf = false 
    
    [alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
    
    [user]
    name = Timoteo Ponce
    email = timo.slack@gmail.com
    
    [merge]
    tool = winmerge
    
    [mergetool "winmerge"]
    cmd = "E:/bin/WinMerge/WinMergeU.exe" "$MERGED"
    keepBackup = false
    
    [diff]
    tool = winmerge
    
    [difftool "winmerge"]
    cmd = $HOME/diffmerge-tool.sh "$LOCAL" "$REMOTE"
    

    April 18, 2010

    Which pattern is this?

    I've been working in a component with some singularities, one of them is his incremental behavior. To make it clear: When a feature is almost complete (or completed), some other features arise.

    This is really annoying if you have implemented everything for an specific use (never do this, I've learned in the bad way) if needs to be changed to work with the new stuff.

    One of the things that I needed to do is to create/fill/validate different objects; I started thinking: "This is easy, let's do a mapper for each one of them". So far so good, then another type of object to work with.... shit, create more mappers, modify logic...

    I started thinking "I'm doing this over and over, why am I so stupid?, use interfaces, builders, factories, simplify the problem... moron". I realized that the validation/filling... logic was the same, so the things that are different  needed to be isolated: the mappers (I don't know the real name).

    With a little of work, I did this:
    public interface Initializer<Source,Target>{
         // initializes the Target object using the Source as data provider 
         Target initializeThis(Source source, Target reference);
    }
    
    Then my object creator is:
    public class ObjectCreator<Car> implements Creator{
        public Car prepareObject(){
            Info info= readInfo();
            Initializer init = InitializerFactory.newInitializer(Car.class,Info.class);
            return init.initializeThis(new Car(),info);        
        }
    }
    
    The logic doesn't changes, just use the proper Creator, and that's it. But I don't really know if this is a pattern, or an anti-pattern, or whatever.

    April 14, 2010

    Hace un año

    Hace exactamente un año, sufrí junto a mi hermano un accidente que hubiese sido fatal de no haber contado con las personas indicadas en el momento dado. Sobreviví no gracias a Dios o algun tipo de voluntad divina, fue gracias a mi hermano y a la gente que lo ayudo. Doy gracias a ellos y elijo no recordar a aquellos que nos ignoraron.

    Tambien expreso mi profundo respeto por la familia Chavarria, que perdió a su único hijo en este incidente, ojala esto nos recuerde el valor de la vida.

    April 13, 2010

    Jakarta HttpClient , POST request

    This library contains a set of very handy utilities for HTTP interaction, in this occasion, I'll show you how to create a POST request:

    final String url = "http://localhost:8080/eco/management"
    public void sendRequest(Map<String, String> parameters) throws DigestException,   HttpException, IOException {
            println("Sending request to : " + url);
            HttpClient httpClient = new HttpClient();
            PostMethod method = new PostMethod(url);
    
            for (Entry<String,String> entry : parameters.entrySet()) {
                method.addParameter(entry.getKey(), entry.getValue());
            }
            final int status = httpClient.executeMethod(method);
    
            if (status == HttpStatus.SC_OK) {
                println("Request successfully processed");
                println("Response : " + new String(method.getResponseBody()));
            }
        }
    

    March 23, 2010

    Setting environment variables with perl

    Usually I work with different environments on different projects, this means that sometimes I have to change system variables and references in order to work in a different project. To avoid this repetitive task, I've created a few PERL scripts to make my life easier.

    Changing environment variables

    What I did was to create a script that receives as a parameter a file name, this file contains a set of environment variables to set. To make it even easier, the file has the format:
    KEY
    VALUE
    
    Like this:
    JAVA_HOME 
    /opt/java/jdk1.6.0_12
    JBOSS_HOME
    /opt/java/4.2.3.GA/jboss-as\
    
    Note: I still don't know a lot of PERL.

    Script(file: my_setenv.pl ):
    $filename = $ARGV[0];
    print "Using filename $filename";
    
    open FILE, "$filename" or die $!;
    
    $iterator = 0;
    $current_var = "";
    while (my $line = ) {
    
     if( $iterator == 0 ){
      $current_var = $line;
      $iterator++;
     }else{
      print "Setting ENV -> $current_var = $line";
      $ENV{"$current_var"} = $line;  
      $current_var = "";
      $iterator = 0;
     }
    }
    close(FILE); 
    
    print "Let's show all ENVIRONMENT variables.\n";
    foreach $key (keys(%ENV)) {
        printf("%-10.10s: $ENV{$key}\n", $key);
    }
    
    Usage:
    $> perl my_setenv.pl google_code_env.env
    

    That's all.

    March 18, 2010

    Get metadata from JPA entities

    I needed to extract a column length from a EJB-JPA Entity configured with annotations, this is how I did it:
    import javax.persistence.Column;
    import javax.persistence.Entity;
    
    @Entity
    public class Person {
    
       @Column(length=30)
       private String firstName;
    
       public static void main(String[] args) throws SecurityException,     NoSuchFieldException {
          Object person = new Person();
          println(person.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length());
       }
    }
    

    Solution source

    March 11, 2010

    GIT - Working with a SVN repository

    Git a SCM created by Linus Torvalds and currently mantained by Junio Hamano, is a distributed revision control system very simple and extremely powerful.

    For those people who want to test this system (me included), and comes from a SVN environment, there are some utilities (included with GIT) to interact with SVN repositories.

    In my case, I have a copy of a project fetched from the SVN repository, and for local development I use a branch called 'development'. When the development branch is stable, I merge this branch with the branch 'master', and then commit the changes to the SVN repository.

    - Create and fetch from SVN repository
    git svn init https://localhost/dev/svn/tiergen
    git svn fetch -r HEAD
    
    - Create a 'development' branch and start working with it.
    git branch development
    git checkout development
    
    - After all changes are made in the development branch, let's merge thi with 'master'.
    git checkout master
    git merge development
    
    - Finally, commit everything to the SVN repository.
    git svn rebase # I always do this
    git dcommit
    

    March 1, 2010

    Joda Time - Difference between dates

    In order to calculate a difference between dates, I've found many problems:
    • Leap years.
    • Minute, seconds differences between months and years.
    • Months with different amount of days, etc.
     And I was not going to develop all this, right?. Somebody must have already done this, so, I started searching. The result was Joda-time, a very handy library that is being used in projects like JBoss Seam.

    With this library, my work only was to use it, so, if I wanted to calculate date differences, I just have to:

    February 23, 2010

    Monodevelop, following the river

    Mono is a free implementation of .Net standard for Windows, GNU/Linux and some other platforms. Is compatible with .Net and has called my attention since its creation, I just needed the motivation of Miguel de Icaza to get into this.

    As I'm not a .Net developer, I wanted to learn it using C#, that looks like Java, but I wanted to start with Mono because of the portability feature, applications can run in different environments, and that's a lot. Almost all distributions support or provide Mono packages, and it has beautiful IDE called MonoDevelop, that might not be as complete as Visual Studio, but I really like it.



    I tried with desktop applications, that handle files and some XML processing and I have to say that is really interesting to see an application (binary) run in different environments without extra compilations.

    After many years of work, Ximian team and the community have make it, it works, and it has a very promisory future, I can't wait to see what they will do next.

    Links:

    February 11, 2010

    Slackware 13 and KDE

    There have been many comments around the Slackware community about the decision replacing KDE 3 for the new KDE 4 desktop environment. In my point of view, those comments (some of them very offensive) are justified, KDE 4 seems to be in a beta state, is not as stable as KDE 3 was. The new look has removed many options from its predecessor, and has introduced a widget-based environment to the user experience:


    That's not bad at all, I would say, innovation always have critics, and I think that KDE 4 is the way to go. But I'm not sure if putting it in the 'stable' release of Slackware is correct. Many Slackware users are upset because of this, but let me point why I still love Slackware:
    • Slackware is not only a desktop environment, is a system.
    • If you don't like KDE 4, you can use XFCE or install GNOME.
    • If you really like Slackware, is not because of his desktop, is because of his philosophy.
    • System configuration, services, kernel, etc. Are still the same as in previous releases, if you are a user, you have to know something about these issues.
    The extremely useful KDE3:

    But I have to be honest, I don't really think that KDE 4 is ready for a stable release in Slackware, Slackware is a great system, that's why I use it. It's very stable and simple, you don't have treat with non-standard configuration files or idiotic wizards.

    I really love Slackware, but not all users do the same things with his system. I'm a developer, not a desktop user, but even in those cases Slackware rocks!.

    January 29, 2010

    Interacción con JMS

    Java Messaging Service es un middleware de comunicación a través de mensajes para Java muy utilizado a nivel mundial, con estandares definidos y varios proveedores.

    Actualmente, yo requería utilizar múltiples proveedores de JMS en una aplicacion, entonces para no estar creando implementaciones independientes para cada tipo de proveedor, decidi hacer una interfaz que utilice los estandares JMS y me permita implementar mis clases de forma transparente al proveedor JMS, este es un diagrama de clase de mi diseño:


    Patrones de diseño utilizados:

    January 16, 2010

    DAO - Data Access Object en Java - primera parte

    El patrón de diseño DAO facilita el acceso a fuentes de datos a través de elementos transitorios denominados "transfer objects", estos objectos no son mas que simples clases. Una gran ventaja de este patrón, es de la separación exclusiva de las tareas de acceso de datos, dejando a los demas componentes involucrados hacer su trabajo de forma transparente.

    Pueden revisar una introducción muy completa en: Patrones de diseño.

    El artículo enlazado arriba es muy completo, no pretendo repetir lo que ahi indica, solamente agregar ciertos comentarios y modificaciones a las implementaciones de ejemplo.


    Debido a que los objetos DAO proveen operaciones CRUD comunes, no es necesario escribir las operaciones en las interfaces de cada uno de los DAOs, por ejemplo:



    Seria muy engorroso hacer esto para cada entidad que manipulemos, pero podemos simplificar las cosas de esta forma:



    De esta forma, evitamos repetir la definicion de las operaciones (véa DRY).

    Se puede hacer aún mas, utilizando clases abstractas, pero es algo que preferiría evitar, ... nunca me gustaron las herencias... pero tal vez para la segunda parte, nos vemos.

    January 11, 2010

    Nunca más

    Estaba yo un dia leyendo un libro en mi Slackware Linux 13.0, sin preocuparme por nada en el mundo, escuchando buena música, en un estado de completa relajación.

    Cuando apareció, el teclado parpadeó repentinamente, el mouse no respondía, la música dejó de sonar...

    "Imposible" - dije. El primer cuelgue en mi Slackware Linux desde el 2005, inadmisible.

    Intenté leer el log del sistema, pero cada el ordenador se reiniciaba aleatoriamente. Probe mi sistema Ubuntu (testing), instalado en el mismo disco. Fue aun peor, Ubuntu hasta la fecha no puede arrancar.

    Al final, probe Windows, - ":-(" - todo bien, no hay problemas... esperen, ... pantallazo azul...

    Comprobé la memoria del sistema, sus temperatura, componentes, conectores, ... nada.

    Al final, como último intento, limpie el CMOS con un jumper. Y, maravilla, todo funciona de nuevo, no volvio a ocurrir nada inesperado, - al menos en Linux - Slackware no volvió a fallar.

    Pero aún me pregunto, qué habra sido, pero algo sucedió. A pesar de haber sido un problema de hardware, Slackware cayó, mi mundo cambió, mi alma, del fondo de esa sombra que flota sobre el suelo, no podrá liberarse. ¡Nunca más!