viernes, 4 de diciembre de 2009

bash: ejecutar un comando sólo si el anterior fue exitoso

An and list has the form

     command1 && command2

command2 is executed if, and only if, command1 returns an exit status of zero.

ref: Bash Reference Manual

martes, 1 de diciembre de 2009

Cuenta SSH enjaulada: scponly

What is scponly?

scponly is an alternative 'shell' (of sorts) for system administrators who would like to provide access to remote users to both read and write local files without providing any remote execution priviledges. Functionally, it is best described as a wrapper to the tried and true ssh suite of applications.


http://www.amadourias.com/?p=94

jueves, 22 de octubre de 2009

DELETE de múltiples tablas con ORDER BY o LIMIT

Puede especificar múltiples tablas en un comando DELETE para borrar registros de una o más tablas dependiendo de una condición particular en múltiples tablas. Sin embargo, no puede usar ORDER BY o LIMIT en un DELETE de múltiples tablas.

Ref: http://dev.mysql.com/doc/refman/5.0/es/delete.html

sábado, 17 de octubre de 2009

png to ico online converter

ConvertICO is a Free Online Converter - fast (you don't need to register or to install software) and easy to use (you need only 3 clicks to convert the PNG or ICO file) - able to convert PNG to ICO (Windows Vista compatible icons) and ICO to PNG format files.

Ref: http://www.convertico.com/

martes, 8 de septiembre de 2009

Subversion vs. Git

When deciding on the best repository type for your team, there are a number of important factors. Subversion has become the de facto standard in our industry for the past several years, however, there is a new and very powerful version control system: Git.

Git is a distributed version control system, originally developed by Linus Torvalds for Linux kernel development. It has grown over the years to serve as the development platform for many other very large and active open source projects. While Git can be an excellent solution for many teams, it does have a slightly higher learning curve than its Subversion counterpart.

For a detailed explanation of the advantages of Git over Subversion, and vice versa, please see the following from the official Git Wiki: GitSvnComparison.

jueves, 3 de septiembre de 2009

find para mover archivos antiguos

El sgte comando mueve los archivos (no directorios) de la carpeta en donde se encuentra (sin acceder a subdirectorios) accedidos hace más de 10mins a la carpeta "carpeta"

find . -maxdepth 1 -type f -amin +10 -exec mv '{}' carpeta/ \;

miércoles, 2 de septiembre de 2009

Interface Hall of Shame








Ref: http://homepage.mac.com/bradster/iarchitect/shame.htm

How to test an SMTP server using telnet

ref: http://www.anta.net/misc/telnet-troubleshooting/smtp.shtml

telnet: > telnet mx1.example.com smtp
telnet: Trying 192.0.2.2...
telnet: Connected to mx1.example.com.
telnet: Escape character is '^]'.
server: 220 mx1.example.com ESMTP server ready Tue, 20 Jan 2004 22:33:36 +0200
client: HELO client.example.com
server: 250 mx1.example.com
client: MAIL from:
server: 250 Sender Ok
client: RCPT to:
server: 250 Recipient Ok
client: DATA
server: 354 Ok Send data ending with .
client: From: sender@example.com
client: To: recipient@example.com
client: Subject: Test message
client:
client: This is a test message.
client: .
server: 250 Message received: 20040120203404.CCCC18555.mx1.example.com@client.example.com
client: QUIT
server: 221 mx1.example.com ESMTP server closing connection

domingo, 16 de agosto de 2009

Linux - Add a existing user to existing group

Add existing user tony to ftp supplementary/secondary group with usermod command using -a option ~ i.e. add the user to the supplemental group(s). Use only with -G option:
# usermod -a -G ftp tony

Change existing user tony primary group to www:
# usermod -g www tony

sábado, 8 de agosto de 2009

Instalar D-Link DWA-110 en debian lenny

Instalar drivers:
http://wiki.debian.org/WiFi/rt73#Lenny

Instalar wpa_supplicant:
http://wiki.debian.org/WiFi/HowToUse#wpasupplicant

viernes, 7 de agosto de 2009

Instalación de debian 5.02 desde el disco duro teniendo otro debian ya instalado

Obtener desde:
ftp://ftp.debian.org/debian/dists/stable/main/installer-i386/current/images/hd-media/
Los sgtes archivos:
  • boot.img.gz
  • initrd.gz
  • vmlinuz

Obtener desde www.debian.org el "Network install from a minimal CD":
  • debian-502-i386-netinst.iso

En el debian ya instalado:

mkdir /boot/newinstall

copiar en ese directorio los sgtes archivos:
  • boot.img.gz
  • initrd.gz
  • vmlinuz
  • debian-502-i386-netinst.iso

Agregar al final del archivo /boot/grub/menu.lst

title New Debian Install
root (hd0,0)
kernel /boot/newinstall/vmlinuz
initrd /boot/newinstall/initrd.gz

reiniciar y bootear el "New Debian Install"

jueves, 6 de agosto de 2009

Obtención del nombre de la máquina en PHP

Si no resulta $_SERVER['SERVER_NAME'], usar:

php_uname('n');

miércoles, 22 de julio de 2009

Logs tipo Apache NCSA en framework Restlet... y con DailyRollingFileAppender

El servidor web (ej: jetty) del framework Restlet arroja logs de los requests en formato Apache (NCSA) al logging estándar del JDK.

Para capturar esos logs, colocar en el main de la aplicación:


java.util.logging.Handler fh = new NCSAFileHandler();
java.util.logging.Logger.getLogger("").addHandler(fh);


La clase NCSAFileHandler es sencilla, sólo sobreescribe 1 método de su padre Handler:



public class NCSAFileHandler extends Handler {
...
private static Logger log = Logger.getLogger(NCSAFileHandler.class);;
@Override
public void publish(LogRecord logRecord) {
log.info(logRecord.getMessage());
}
}


Al método publish de NCSAFileHandler le llegarán todos los records (record = mensaje con el resumen del roundtrip de un request) de Restlet. Con publish botamos los records a log4j.

Para que el log de NCSAFileHandler quede en un DailyRollingFileAppender de log4j, en el main de la aplicación:


File ncsaLogFile = new File("/tmp/http_ncsa.log");
DailyRollingFileAppender ncsaAppender = new DailyRollingFileAppender();
ncsaAppender.setFile(ncsaLogFile.getAbsolutePath());
ncsaAppender.setName("DailyRollingFileAppenderNCSA");
ncsaAppender.setDatePattern("'.'yyyy-MM-dd");
ncsaAppender.activateOptions();
PatternLayout ncsaLayout = new PatternLayout("[%t] %m%n");
ncsaAppender.setLayout(ncsaLayout);
Logger ncsaLogger = Logger.getLogger(mipackage.ncsa.NCSAFileHandler.class);
ncsaLogger.addAppender(ncsaAppender);

sábado, 4 de julio de 2009

No me hagas pensar - ¿Cómo usamos realmente la web?

No leemos las páginas, las hojeamos
  • Tenemos prisa
  • Sabemos que no hay que leerlo todo
  • Somos buenos para hojear (ej: periódicos)

Satisficing: No tomamos decisiones óptimas, es suficiente
  • Tenemos prisa
  • Errar -> Atrás
  • Adivinar es más divertido
No leemos el manual, nos las arreglamos
  • No nos importa
  • Si funciona, seguimos con ello
  • Ej: docenas de personas escriben las url en la búsqueda de yahoo. "Yahoo es la Internet"...
Ref: No me hagas pensar - Una aproximación a la usabilidad en la Web, Segunda edición. Steve Krug.

viernes, 3 de julio de 2009

No me hagas pensar - Clics evidentes

¿Dónde harías clic para ver detalles de la oferta de compras de 3 a 12 cuotas que aparece en el banner?



Al colocar el ratón, sólo se podía hacer clic en la zona en verde oscuro...

Otro caso de facebook:



Al colocar el ratón encima de "Name", cambia el puntero, ¿A dónde me lleva?, no aparece nada abajo en el status bar del browser, al presionarlo me di cuenta de que lleva al mismo lado que al hacer clic en "change".

Ref: No me hagas pensar - Una aproximación a la usabilidad en la Web, Segunda edición. Steve Krug.

lunes, 29 de junio de 2009

No me hagas pensar - Primera norma de la usabilidad de Krug

"Si algo es complicado de utilizar, simplemente no lo uso demasiado" (esposa del autor)

Facilidad de uso no es:
  • 2 clics de distancia
  • usar el lenguaje del usuario
  • ser coherente
sino:
¡No me hagas pensar!

Usuario sin pensar:
  • Esto es...
  • Y eso es ...
  • Y eso es lo que quiero!

Usuario pensando:
  • ¿Por dónde empiezo?
  • ¿Por qué esto se llama así?
  • ¿Puedo hacer clic en esto?
  • ¿Puedo navegar por aquí o me llevará a otro sitio?
  • ¿Por qué está esto aquí?
  • ¿Estos dos vínculos me llevan al mismo lado?

Haz clic en las sgtes imágenes y evalúa si pensaste o no:





Ref: No me hagas pensar - Una aproximación a la usabilidad en la Web, Segunda edición. Steve Krug.

lunes, 1 de junio de 2009

Tiempo (temperaturas) de Chile en el celular

Para construir una página WAP para revisar el tiempo de Santiago, se puede obtener datos desde la sgte url:

http://www.meteochile.cl/js/reg05m.js

y luego Parsear las sgtes líneas:
temperaturas['Santiago Sector Oriente']='/24|7/18|9/15|6/14|4/16';
pronosticos['Santiago Sector Oriente']='Despejado|Escasa nubosidad|Nublado|Nublado variando a escasa nubosidad|Despejado';
iconos['Santiago Sector Oriente']='sol.gif|parcialalta.gif|cubierto.gif|cubierto.gif|sol.gif';
fechas['Santiago Sector Oriente']='Lunes 01|Martes 02|Miércoles 03|Jueves 04|Viernes 05|Sábado 06|Domingo 07';

Para viña del mar:

http://www.meteochile.cl/js/reg05.js
temperaturas['Viña del Mar/Valparaíso']='/22|12/14|12/14|8/14|5/17';
pronosticos['Viña del Mar/Valparaíso']='Despejado|Nublado y llovizna|Nublado y llovizna|Escasa nubosidad|Despejado';
iconos['Viña del Mar/Valparaíso']='sol.gif|llovizna.gif|llovizna.gif|parcialalta.gif|sol.gif';
fechas['Viña del Mar/Valparaíso']='Lunes 01|Martes 02|Miércoles 03|Jueves 04|Viernes 05|Sábado 06|Domingo 07';


Siempre viene una línea con:

var redaccion= 'Información redactada el día Lunes 01 a las 5:48 hrs'

miércoles, 27 de mayo de 2009

OpenOffice - Readonly Content Cannot Be Changed

Ir a editar el Indice de Contenidos, on the first tab you have an option "protected against manual changes". When you disable it, (save and reopen) the document becomes read/write again.

martes, 26 de mayo de 2009

Cómo iniciar DHCP en arranque, no luego del login

pablo@pablo-desktop:~$ more /etc/network/interfaces
auto lo eth0
iface lo inet loopback
iface eth0 inet dhcp

jueves, 19 de marzo de 2009

mv (rename) de varios archivos

En el sgte ejemplo, el comando rename renombra *.jpg para cambiarles la extensión "jpg" por "jpeg"

rename -n 's/jpg$/jpeg/' *.jpg

ref: https://answers.launchpad.net/ubuntu/+source/nautilus/+question/2309

martes, 17 de marzo de 2009

Los elementos XML no pueden comenzar con números

Definition: A Name is an Nmtoken with a restricted set of initial characters. Disallowed initial characters for Names include digits...

Ref: http://www.w3.org/TR/REC-xml/#NT-NameStartChar

jueves, 12 de marzo de 2009

Si a PHP llegan datos en utf8 de una BD mysql en latin1

Si a PHP llegan datos en utf8 de una BD mysql que en realidad está en latin1, la solución es luego de llamar a mysql_connect, llamar a:

mysql_set_charset("latin1");

De esta manera llegarán al PHP los datos en latin1 (que es como realmente están en BD).

Encoding de vim

Si se tienen archivos encodeados en latin1 y al hacerles "more" en una shell (ej: putty) configurada con latin1 y se ve todo bien, pero vim no hace bien el print de los caracteres con acento en latin1, revisar que exista la sgte configuración en el bash_profile:

$ more .bash_profile
...
export LANG=en_US.iso88591

Con lo último, vim atina a hacer print en latin1 de los caracteres en latin1.

miércoles, 11 de marzo de 2009

ps + grep = pgrep

En vez de escribir el largo comando:

[pablo@mipc ~]$ ps -fea --cols=400| grep tuna

para obtener todos los procesos ejecutándose que tengan en su línea de comandos la palabra "tuna", mejor usar el comando pgrep:

[pablo@mipc~]$ pgrep -fl tuna
31591 /bin/bash /home/pablo/tuna/dist/tuna_startup.sh 8083
31594 java -Djava.library.path=:/home/pablo/tuna/lib tuna.Tuna -p 8083 -profiles /home/pablo/tuna/profiles -web /home/pablo/tuna/web -log /home/pablo/tuna/log

martes, 10 de marzo de 2009

Google Static Maps API

The Google Static Maps API lets you embed a Google Maps image on your webpage without requiring JavaScript or any dynamic page loading. The Google Static Map service creates your map based on URL parameters sent through a standard HTTP request and returns the map as an image you can display on your web page.

staticmaps

martes, 3 de marzo de 2009

cómo insertar datos utf8, encodeados en utf8 en BD usando java

Supuesto: /tmp/test.txt es un archivo con varias "ñ" y letras con tilde, encodeado en utf8.


FileInputStream fis = new FileInputStream("/tmp/test.txt");
byte[] buffer = new byte[10];
fis.read(buffer);
String titulo = new String(buffer,"UTF-8");
titulo = new String(titulo.getBytes("UTF-8"),"ISO-8859-1");


El truco es la última línea (por si uno está en otro caso en que el string proviene de otro lado, no de un archivo).

lunes, 2 de febrero de 2009

Clean Code: Open-Closed Principle

"Classes should be open for extension but closed for modification."

Un programa no debiere estar preparado para ser modificado, sino, para ser extendido, ej: usando subclases o nuevos métodos que usen a los existentes.

De esa manera, nuevas funcionalidades tienen menos riesgo de afectar a funcionalidades antiguas.


Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

jueves, 29 de enero de 2009

Clean Code: Cohesión en clases

Alta cohesión en una clases se ve reflejada en:
  • Bajo número de atributos. Si se usa la estrategia de funciones pequeñas y con pocos argumentos, los atributos subirán en número. Cuando esto pasa es porque la clase se debiera dividir en más clases.
  • Cada método usa muchos (ojalá todos) los atributos de la clase. Utopía: todos los métodos usan cada uno de los atributos de la clase.

Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

miércoles, 28 de enero de 2009

SQL para obtener datetime pasado que sea multiplo de 5

Con este input:

set @a = '2009-01-28 16:57:50';

el sgte sql:

SELECT DATE_SUB(DATE_SUB(@a, INTERVAL (MINUTE(@a) MOD 5) MINUTE), INTERVAL SECOND(@a) SECOND)

produce como resultado:

2009-01-28 16:55:00

martes, 27 de enero de 2009

Clean Code: Single Responsibility Principle

Single Responsibility Principle: a class or module should have one, and only one reason to change.

Los componentes grandes o con varias responsabilidades tienen varias razones para cambiar: cambios en cualquiera de sus responsabilidades.

Si un componente cambia, hay que probarlo entero. Si el componente es grande, eso es costoso.


Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

Clean Code: Class Organization - Java convention

To read a class like a newspaper article:

class Example {
public static constant;
private static variable;
public static instanceVariable;
public publicVariable; //there is seldom good reason for this

public method1(){
...
}

private method2(){
...
}
}


Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

lunes, 26 de enero de 2009

Manejo de strings en java provenientes de BD en utf8

Si en una BD tengo string encodeados en utf8, al obtenerlos en un programa java, el java no les hace un decode de utf8, sino que los trata con el encoding default de la jvm (lo cual es indeterminado). Por lo tanto, cualquier tilde en utf8 si se imprime desde el java, se verá como un garabato.

La solución es obtener los bytes que vienen de BD encodeados en latin1 y luego hacerles un decode explicitando que en realidad están en utf8:

titulo = getTituloFromDB();
titulo = new String(titulo.getBytes("latin1"),"UTF-8"));

Así, la variable titulo se podrá ver sin garabatos en una consola utf8.

lunes, 19 de enero de 2009

Clean Code: Using Third-Party Code

Hay clases en las librerías hechas por externos que ofrecen muchas funcionalidades.
Si se pasan objetos de ese tipo de clases entre métodos de la aplicación, se corre el riesgo de que en algún lado se usen de manera indebida.

Ej: si en java se usa un Map y ese Map es usado en varios métodos (se retorna o se pasa como argumento), se corre el riesgo de que en alguna parte se le haga un delete o un insert siendo que quizás eso no esté dentro de la lógica diseñada desde un principio.

Mejor: Hacer un wrapper de Map y exponer sólo los métodos que caben dentro del diseño de lo que queremos.

Ej:

public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
...
}



Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

jueves, 15 de enero de 2009

CleanCode: Don't Pass Null

Pasar nulls como argumentos a los métodos provoca que los métodos que se construyen tengan que preocuparse de esos casos. Es un lastre que tendrá que tener todo método que reciba como argumento un objeto.

Mejor acostumbrarse a que si llega un null como argumento, es un error de programación.


Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

CleanCode: Don't Return Null

Evitar retornar nulls en los métodos.
Esto porque requiere que quien lo llama se preocupe de manejar ese caso especial con un if fácilmente olvidable.
Mejor, arrojar una excepción o si no es el caso, retornar algún objeto que permita salir del paso, ej: Collections.emptyList()


Ref:
Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)
Publisher: Prentice Hall PTR; 1 edition (August 11, 2008)
ISBN-10: 0132350882
ISBN-13: 978-0132350884

EXT4 filesystem in Ubuntu 9.04

the EXT4 filesystem was implemented in the upcoming Ubuntu 9.04 Alpha 3 a couple of days ago and it will be available in the Ubuntu Installer, if you choose manual partitioning.

Ref

miércoles, 14 de enero de 2009

Accessing GET-parameters with Restlet

Today, I needed to read HTTP-GET parameters in a restlet, e.g. http://localhost/restlet?someParam=foo, and came up with:
request.getResourceRef().getQueryAsForm().getFirstValue("someParam");

Referencia aqui

How to export environment variables for a java Runtime.exec in Linux

Usar el comando linux "env", luego de él van las variables a exportar y al final el comando que se quiere ejecutar dentro del nuevo environment.

Ej: para ejecutar test.sh con la variable LOG_DIR=/home/pablo/logs:

env LOG_DIR=/home/pablo/logs /home/pablo/test.sh