Archive for April, 2008

  • Como Migrar al Nuevo Ubuntu 8.04

    0

    Este blog y otros websites corren sobre un Ubuntu 7.10 server, hoy hice el upgrade a la version 8.04 que fue liberada dias atras.Muy simple para hacer el upgrade, solo tenes que usar estos comandos:

     sudo aptitude install update-manager-core

    Despues de instalar el update manager core tenes que correr el upgrade asi:

     sudo do-release-upgrade

    Para considerar, si tenes instalado java ice tea (version 7) esta va a ser removida y reemplazada por openjdk 6.

  • Como escribir un MOD_REWRITE en minutos

    0

    La verdad es que no estoy tratando de reinventar la rueda, solo trato de que mi framework (java) este up to date. Hace un tiempo un ex-coworker me conto sobre el MOD_REWRITE Apache Webserver para tener urls un poco mas elegantes que algo como esto (q?u=w2&a=w3&…). Segun el (experto) son muchos mejores para los spiders que indexan paginas y mas atractivas para los usuarios que las leen.
    Como mi fuerte es Java y no PHP decidi hace mi propia version de MOD_REWRITE. Primero antes de poner una linea de codigo obviamente googlee un poco para ver que habia y me encontre con un snippet escrito por Paul Tuckey aca. Paul hizo un laburo excelente, pero era demasiado para mi aplicacion, yo necesitaba algo mucho mas simple entonces tome los conceptos de su software y los aplique al mio.

    1. Lo primero que pense fue que deberia haber una referencia entre la URL nice looking y la URL real de la pagina con contenido dinamico que queremos mostrar. En mi caso era un Blog software, por lo cual agregue a mi tabla POST un campo nuevo llamado title_url.

    2. Ahora era el turno de algun tipo de Facade entre la URL virtual y la real, para eso utilice un Servlet Filter. Aca el codigo:

    public class PostFilter implements Filter {

    private Map<String, String> cache;
    private Pattern pattern;

    /**
    * Inits the class
    */
    public void init(FilterConfig config) throws ServletException {
    this.cache = new HashMap<String, String>();
    this.pattern = Pattern.compile(“/post/(?!images|myservlet)”);  // the regex string to filter all /post/* requests
    }

    /**
    * Main filter method
    */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    try {
    HttpServletRequest req = (HttpServletRequest) request;
    String uri = req.getRequestURI();
    if (this.match(uri)) {
    String titleUrl = uri.substring(uri.lastIndexOf(‘/’) 1, uri.length());
    String url = null;
    if (cache.containsKey(titleUrl)) {
    url = cache.get(titleUrl);
    } else {
    url = this.createUrlForPost(titleUrl);
    }
    req.getRequestDispatcher(url).forward(request, response);
    return;
    }
    chain.doFilter(request, response);
    } catch (Exception e) {
    e.printStackTrace();
    response.getWriter().write(“ERROR”);
    }
    }

    /**
    * Returns the real url for this post
    * @param titleUrl
    * @return
    * @throws Exception
    */
    private String createUrlForPost(String titleUrl) throws Exception {
    String postId = this.queryPostIdByTitleUrl(titleUrl);
    String url = “../myservlet?key=value&key1=value1&etc,etc&id=” postId;
    this.cache.put(titleUrl, url);
    return url;
    }

    /**
    * Match if the url is part of a post
    * @param uri
    * @return
    */
    private boolean match(String uri) {
    Matcher matcher = pattern.matcher(uri);
    boolean found = false;
    while (matcher.find()) {
    found = true;
    }
    return found;
    }

    /**
    * Inits the class
    */
    private void queryPostIdByTitleUrl(String titleUrl) throws Exception {
    // some code to access to the field of the database
    return postid;
    }

    3. Ahora el siguiente paso es poner el filtro en el web.xml.

    <filter>
    <filter-name>PostFilter</filter-name>
    <filter-class>PostFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>PostFilter</filter-name>
    <url-pattern>/post/*</url-pattern>
    </filter-mapping>

    4. No hay mas que eso. Que lo disfruten :)

  • Convenciones y Best Practices para Java

    0

    Este es un recompilado de Best Practices y Convenciones que trato de aplicar diariamente en el codigo que escribo. Quiza es util para ustedes tambien. Hay que recordar que el codigo trabaja con logica matematica, pero los developers no por eso es importante que el codigo no solo sea legible para vos, sino para todo el grupo que trabaja con vos. Simplemente imaginate tratar de modificar codigo que esta escrito en 1 linea OLPL (one line programming language) o metodos de 1000 lineas, es realmente tedioso.Las convenciones en Java son diferentes de C or C#. Voy a postear varias convenciones que me gusta aplicar, pero para ver todas las convenciones de Java podes ir aca.
    Las convenciones son necesarias para mantener similitud en el codigo y para ser legible por cualquier miembro de tu grupo, incluso vos mismo. Quiza tu grupo quiera hacer sus propias convenciones, pero yo te aconsejo que sigas los lineamientos de Sun ya que si algun dia cambias de empresa y ellos usan las convenciones oficiales, vas a odiarlos ya que tenes que adaptarte a algo nuevo y no tenes control de nada.

    1. Class names

    Basicamente Sun dice que las classes tienen que ser Camel Case empezando la primera letra en mayuscula y siguiendo con minusculas hasta el cambio de palabra donde volves a aplicar una mayuscula.
    Las classes Java usualmente representan cosas abstractas o concretas, lo que significa que si creas una clase que representa un hospital, no la podes llamar Htal!! es un Hospital !.

    Hospital
    Patient
    RequestDispatcher
    StringUtility

    2. Nombres de Variable

    Lucho dia a dia con mis compañeros de trabajo por los nombres de las variables. Parecidos a los nombres de clase, las variables son super importantes ya que son unidades que nos permitiran intuir y entender que hace el programa. La convención Java para las variables es Camel Case tambien pero la primera letra es minuscula.

    Veamos el siguiente codigo.

    double up = myBean.getUnitPrice();
    int q = myBean.getQuantity();
    double t = up * q;
    

    Este caso es muy simple, pero imaginemos que quantity, unit price y total son usados en un metodo de 100 lineas de codigo (horrible pero cierto). Seria feo ver esta linea en medio de todo eso, no muchos entenderian esto…

    int dp = 20; // discount percentage
    if (q &gt; m) {
      t = t * dp / 100;
    }
    

    La verdad que si me toca arreglar o modifcar este metodo me voy a querer matar. Tener que buscar que significa t, q y m es tedioso sumando la perdida de tiempo.
    Hagamos algo asi…

    double unitPrice = myBean.getUnitPrice();
    int quantity = myBean.getQuantity();
    double total = unitPrice * quantity;
    int discountPercentage = 20;
    if (quantity && maxAllowed) {
      total = total * discountPercentage / 100;
    }
    
    3. Condicionales
    
    Tengo un par de ejemplos con esto, algunos tontos otros no tanto.
    3.1. No usar extra codigo
    
    if (latoya.isInsane() ) {
      return this;
    } else {
      return that;
    }
    

    La segunda parte (else) es totalmente una perdida de tiempo tuyo y del procesador ya que no hay posibilidad de ir al ELSE si el primer IF evalua a TRUE. Yo haria algo asi...

    if (latoya.isInsane() ) {
    return this;
    }
    return that;
    

    3.2. Primera condicion encontrada

    if (a &lt; b || b &gt; c) {
    </span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; execute();</span><br><span style="FONT-FAMILY: Courier New">}</span><br></blockquote>Si la primera condicion es valida <span style="FONT-FAMILY: Courier New">(a &lt; b)</span> la segunda nunca va a ser evaluada. Si usas <span style="FONT-FAMILY: Courier New">(a &lt; b | b &gt; c)</span> no importa lo que pase, la segunda condicion si va a ser evaluada. Hay casos donde estos operadores son necestarios, pero la realidad muestra que son los menos. El codigo default deberia ser usando || o &amp;&amp;.<br><br><strong>3. Shorthand</strong><br><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; String a = (y == z) ? "this" : that;</span><br><br>Me encanta este shorthand del IF ELSE, pero algunas veces se suele abusar y ahi empieza el <strong>OLPL </strong>(one line programming language) como esto...<br><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; String a = (y == z) ? (x &gt; m) ? true : a &lt; t : (list.size() &gt; x) ........</span><br><br>Por favor, eviten hacer cosas asi, duelen los ojos solo de mirarlo.<br><strong><br>4. Retorno al inicio</strong><br><br>Un ex jefe mio me odiaba cada vez q yo hacia esto, pero realmente me parece mucho mas claro.<br><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; if (!var.isSomething()) return;</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; String a = this.afunction();</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; more code....</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp; &nbsp;more code....</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp; &nbsp;more code....</span><br><br>El preferia hacer cosas asi, pero yo creo que es menos claro cuales son las condiciones de salida de este statement ya que tenemos que ir al final del codigo para verlo.<br><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; if (var.isSomething()) {</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String a = this.afunction();</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; more code.... &nbsp;</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; } else {</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; }</span><br><br>Bueno, esta es la primera entrega de mis best practices en Java, stay tuned!

  • Cambiar root Password en MySql

    0

    Cambiar la password de root es una tarea esencial para MySql y su administracion. Es importante recordar que el usuario root de mysql y el usuario root del linux/unix son diferentes y no tienen nada que ver uno con el otro.1. comando mysqladmin para cambiar la password de root

    Si nunca seteaste la password de root el server no va a requerirla para conectarse a el. Para setear la password por primera vez usamos el comando mysqladmin de esta manera.

    $ mysqladmin -u root password NEWPASSWORD

    Sin embargo, si queres cambiar una password de root tenes que utilizar el siguiente comando:

    $ mysqladmin -u root -p OLDPASS NEWPASS
    Enter password:

    2. Cambiar la password para otro usuario MySql.

    $ mysqladmin -u USER -p OLDPASS NEWPASS
  • Si Descargas Torrents Leé Este Artículo

    0

    Con el release de Service Pack 2 para Windows XP se introdujo la limitacion intento de conexiones TCP concurrentes. Si no tenes SP2 no te vas a encontrar con este problema. Porque quiero un mayor numero de conexiones TCP outbound (salientes) ? Si sos alguien que descarga torrents esto te va a interesar.

    Originalmente Microsoft libero esta limitacion para evitar que worms se dispersaran por doquier sin control agluno. Con este limite, solo un maximo de 10 intento de conexiones por segundo son permitidas. Si sos usuario de P2P, tus programas intentan hacer multiples conexiones por segundo y de seguro se ven afectadas por esta limitacion.

    Para saber si estas llegando al maximo de conexiones TCP permitidas por tu XP, podes usar el Event Viewer (el cual no pienso explicar donde esta por que si lees este blog y no sabes esto te paso un mejor link para que mires www.mipequeñopony.com).

    Continuemos… Bajo System, mira TCP/IP warnings diciendo que se ha llegado al máximo de conexiones TCP.

    Para cambiar este “defecto” de XP podes descargarte este programa que patchea tu Windows cualquiera fuere el idioma ya que es multilanguage. Primero te aconsejo hacer un backup del file tcpip.sys que se encuentra en %WINDOWS%/system32.

    Ahora si, aca el link para bajar e instalar esta utilidad.

    Obviamente si te explota la maquina es tu responsabilidad por seguir mis sabiondos consejos.

Page 1 of 212»