jueves, 25 de noviembre de 2010

Personal preferences using JEdit

These are some personal notes to help me configure JEdit according to my own preferences. JEdit is a very powerful editor; it has many plugins, but many plugins have overlapping functionality; you have to decide how to use it and configure it according to your preferences. It is not like Eclipse where you automatically get everything configured. 

Favorite plugins:

  1. Editor Scheme .- Choose nice colors. I prefer dark backgrounds.
  2. File Browser .- Open new files.
  3. Buffer List .- Show open buffers.
  4. JDiff .- Compare text files.
  5. Whitespace
    • check "remove trailing white spaces"
    • check "tabify/untabify according to soft tabs setting"
  6. Text tools - sorting lines.
  7. Error list - View compile errors.
  8. Console
    The console is mainly used to compile code. Errors in the console are sent to ErrorList.

    cd ${d}  # cd to the directory of the current buffer.
    make all # You can also create adhoc scripts 
             # in the current directory.
      
    If you see '???' characters you may need to change encoding to UTF-8. Go to Plugin Options-> Console -> General -> Character encoding.
  9. CTagsSideKick - C++ Runs on top sidekick to browse the code in the current buffer. Similar to outline in Eclipse.

Global options:

  •   Docking: 
    • Buffer List - left
    • File Browser - left
    • Sidekick - left
    • Error List - down
    • Console - down
  •   Editing: set "tab width", "indent width" and "soft tabs".
  •   Gutter: check "line numbers".
  •   Proxy server.
  •   Text area: For ubuntu  you may need to set "Anti Aliased smooth text: subpixel"

Custom macros:

saveAllAndRunLastCommand.bsh

  • Save all buffers
  • Show console
  • Run last command
jEdit.saveAllBuffers(view, false);
new console.Shell.SwitchAction("System").invoke(view);
console = view.getDockableWindowManager().getDockable("console");
console.show();
console.runLastCommand();

Create shortcuts:

  • Console:System (toggle) CS-c
  • Macro: Toggle header source CS-h
  • Macro: saveAllAndRunLastCommand CS+m
  • ErrorList: Goto next error CS+n
  • ErrorList: Goto previous error CS+p
  • Tags: Follow tag C+CLOSE_BRACKET
  • Tags: Pop position C+t

Favorite shortcuts:

  • Focus Buffer Switcher A+BACKQUOTE
  • Toggle docked areas F12
  • Complete word C+b
  • Open a file C+o
  • Create a new file C+n

    sábado, 20 de noviembre de 2010

    El papel de los algoritmos en la computación

    Mucho del énfasis actual en el desarrollo de software ha sido sobre las herramientas de desarrollo.  Si bien las herramientas son importantes, no debemos descuidar el desarrollo de habilidades del programador. El conocimiento formal sobre algoritmos muchas veces puede hacer la diferencia entre un desarrollador promedio y un desarrollador de primera.

    Informalmente podemos decir que un algoritmo es un procedimiento computacional bien definido que toma una serie de valores como entrada y produce un valor o una serie de valores como salida

    Se dice que un algoritmo es correcto si para cada conjunto de valores de entrada, el algoritmo termina con la salida correcta. Cuando esto ocurre se dice que el algoritmo resuelve el problema de computo que se le ha dado.

    Hay una gran cantidad problemas para los cuales se han creado algoritmos. Ejemplos de algunos algoritmos sofisticados: Análisis del genoma humano, motores de búsqueda, sistemas criptográficos para el comercio electrónico, asignación de recursos escasos en manufactura, etc.

    Los problemas algorítmicos interesantes exiben dos características:
    1. Tienen muchas soluciones candidatas posibles, pero muchas de ellas no resuelven el problema y puede ser complicado encontrar aquella que lo hace.
    2. Tienen aplicaciones a problemas de la vida real. 

    Conjuntamente con los algoritmos esta el estudio de las estructuras de datos. No hay una estructura de datos adecuada para todos los propósitos, por eso es importante entender las limitaciones y ventajas de cada una de ellas. Así mismo hay una gran cantidad de técnicas que se pueden utilizar, es importante tener familiaridad con ellas para poder usarlas al diseñar nuestros propios algoritmos.

    Problemas NP-Complete
    Por lo general buscamos encontrar algoritmos eficientes, sin embargo hay problemas para los cuales no existen soluciones eficientes.  Un tipo de estos problemas son los conocidos como NP-Complete. Por que son estos problemas interesantes? Pues aunque no se les ha encontrado una solución eficiente, tampoco se ha podido probar si existe o no tal solución. La propiedad mas interesante de estos problemas es que si se encuentra una solución eficiente para uno de ellos esa solución sera aplicable para todos ellos. Es importante conocer de estos problemas por que es frecuente encontrarlos en aplicaciones del mundo real. Si puedes mostrar que algún problema es NP-Complete, entonces sabes que el mejor uso de tu tiempo esta en encontrar una buena solución aunque esta no sea la mejor solución.

    Ordenes de Complejidad
    Es posible que dos algoritmos diseñados para resolver el mismo problema tengan diferencias dramáticas en su eficiencia. Estas diferencias pueden ser mucho mas significativas que las diferencias debido al hardware y software. Como un ejemplo, el ordenamiento por inserción(insertion sort), toma un tiempo que es aproximadamente (c1 * n * n ) en donde n es el numero de elementos y c1 es una constante independiente de n. El ordenamiento por mezcla (merge sort), toma un tiempo que aproximadamente ( c2 * n * log(n))  En donde log(n) es el logartimo base 2 de n. En el primer caso el factor es n  y en el segundo caso el factor es log(n).

    Es tal la diferencia que ya no importa que c2 sea mucho mayor que c1. O sea que cuando n crece deja de importar el hardware utilizado o el compilador, el merge sort va a ser mas rápido que el insertion sort. El análisis de algoritmos es una área muy interesante que te da una mejor claridad y entendimiento sobre como lograr algoritmos eficientes. Espero que en el futuro podamos profundizar en el tema.