miércoles, 9 de febrero de 2011

Joomla: Agregando Un Chat

Ya poco a poco le estoy tomando cariño a este reconocido administrador de contenido. Puse a prueba qué tan fácil es instalar un chat en el sitio Joomla que tengo, y la verdad pasó con nota 100.

Primero descargué el plugin (o extensión) jPFChat y lo instalé usando la opción de instalación dentro del menú de extensiones.


Lo único que tenemos que hacer es subir el zip que descargamos.


Una vez instalado es solo cuestión de agregar un nuevo item de menú y elegir la opción de jPFChat nuevecita de paquete.



No requirió la verdad un gran esfuerzo técnico agrgar una opción de chat en el sitio. En todas!



jueves, 3 de febrero de 2011

XCopy: "specify a file name or directory name on the target"

En mi trabajo requerimos respaldar una serie de archivos que como parte del proceso estándar que tiene el cliente, se hace con un archivo .BAT que corre un conjunto de comandos XCOPY. Uno por cada archivo que se respalda. Este comando es bastante útil por el conjunto de opciones que tiene, entre las cuales la que destaca para nuestros propósitos es la que crea las carpetas en el path destino si estas no existen (/s).

XCOPY c:\a\very\long\path\to\myfile.txt d:\back-up\to\another\very\long\path\to\myfile.txt /s /y

El único inconveniente que estabamos teniendo, es que por cada archivo el comando nos pedía una confirmación de sí lo que estabamos copiando era un archivo o una carpeta.

specify a file name or directory name on the target
(F = file, D = directory)?


Algo bastante tedioso, y bastante improbable de que no hubiera manera de indicar que todo lo que copiabamos eran archivos. Mis primeras inmersiones en Google no me arrojaron nada que me ayudara a resolver este asunto. Inclusive intenté atacar el problema usando programación con DOS BATCH para arrojar la tecla 'F' pero tampocó fue de ayuda.

En estos días intenté otra vez buscar algo en Google, y ahora sí encontré algo que me ayudó a entender como hay que usar el comando. En el path del destino no hay que dejar el nombre del archivo, sino solamente el path:

XCOPY c:\a\very\long\path\to\myfile.txt d:\back-up\to\another\very\long\path\to\ /s /y

Parece que cuando el destino termina con alguna extensión, el comando no sabe determinar si es un directorio o un archivo. Así de simple era la solución.

Ordenamiento de colecciones con interface Comparable

Una de las interfaces más útiles en aspectos de ordenar colecciones es la interface Comparable. Al usar esta interface en una clase podemos disponer de la clase de utilidades "Collections" para ordenar de alguna forma deseada, cualquier colección que contenga objetos de ese tipo. En el siguiente ejemplo se utiliza una lista de personas que se ordenan por edad. Para ello solo se implementa el método "compareTo" (preferiblemente usando "generics") en el cual solo se resta la edad de los dos objetos comparados. Después es solo cuestión de invocar el método Collections.sort(Collection<object>).


import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class Person implements Comparable<Person>{

protected String name;
protected int age;

public Person(String name, int age) {
this.name=name;
this.age=age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

/**
* Implementing comparison by age.
*/
public int compareTo(Person o) {
return this.age - o.getAge();
}

@Override
public String toString() {
return this.name + ":" + this.age;
}

public static void main(String[] args) {
List<Person> myFamily = new LinkedList<Person>();
myFamily.add(new Person("Gabriel", 28));
myFamily.add(new Person("Yamai", 51));
myFamily.add(new Person("Blanca", 25));
myFamily.add(new Person("Daniel", 12));
myFamily.add(new Person("Daniela", 27));
myFamily.add(new Person("Lydia", 17));

/*Let's sort the collection.*/
Collections.sort(myFamily);

for(Person familiyMember : myFamily) {
System.out.println(familiyMember);
}
}
}


Salida:

Daniel:12
Lydia:17
Blanca:25
Daniela:27
Gabriel:28
Yamai:51

Así que olvidemonos de hacer ordenamientos de burbuja ;).


miércoles, 2 de febrero de 2011

Código para encontrar carpetas vacías

Dejo a la disposición un código corto para encontrar carpetas vacías usando como entrada un path específico. El programa se adentra en él de manera recursiva y guarda al final los resultados en un archivo TXT.


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.LinkedList;
import java.util.List;

/**
* Class used to scan a given folder recursively to look for all empty folders. *
* @author gsolano
*
*/
public class DirEmptyFolder {

protected List<String> emptyFoldersList; // It will store all the empty folder paths.

public DirEmptyFolder() {
// Initializes the list.
emptyFoldersList = new LinkedList<String>();
}

public void scan(String rootDirPath) {
File sourceDir = new File(rootDirPath);

if(sourceDir.exists() && sourceDir.isDirectory()) {
emptyFoldersList.clear();
/*The real action: scan recursively.*/
scanRecursively(sourceDir);
System.out.println("Found " + emptyFoldersList.size() + " empty folders");

if(emptyFoldersList.size() > 0) {
System.out.println("Saving list...");
writeFilesToDisk("empty_folders_list.txt", emptyFoldersList);
System.out.println("Finished!");
}
} else {
System.out.println("Directory does not exist!");
}
}

/**
* Recursive method to find empty folders.
* @param sourceDir
*/
private void scanRecursively(File sourceDir) {
// List files and directories in the first level.
File[] listOfFiles = sourceDir.listFiles();

if (listOfFiles != null) {
for(int i=0; i < listOfFiles.length; i++) {
if(listOfFiles[i].isDirectory()) { // Only cares about directories.
if(listOfFiles[i].listFiles().length == 0) { // The directory has anything inside?
// Let's store the path and put it on screen.
emptyFoldersList.add(listOfFiles[i].getAbsolutePath());
System.out.println(listOfFiles[i].getAbsolutePath());
}
else {
// It's a directory but is not empty. Let's do the recursive call!
scanRecursively(listOfFiles[i]);
}
}
}
}
}

/**
* Saves the list in disk.
* @param filePath
* @param lines
*/
private void writeFilesToDisk(String filePath, List<String> lines) {
try{
FileWriter fstream = new FileWriter(filePath);
BufferedWriter out = new BufferedWriter(fstream);

for (String line : lines) {
out.write(line + "\n");
}
out.close();
}catch (Exception e){
e.printStackTrace();
}
}

public static void main(String[] args) {
DirEmptyFolder dirEmptyFolder = new DirEmptyFolder();
dirEmptyFolder.scan(args[0]);
}
}



Salida (usando como entrada: "c:\documents and settings\gsolano\My Documents"):
...
c:\documents and settings\gsolano\My Documents\My Meetings
c:\documents and settings\gsolano\My Documents\New Folder
c:\documents and settings\gsolano\My Documents\videos
Found 43 empty folders
Saving list...
Finished!