Pages

martes, diciembre 09, 2014

FIND + SED, reemplazo masivo de texto dentro de archivos

Mi ejemplo: Necesito encontrar el texto:
{-$FOLDER-}

y reemplazarlo por el texto :
{-$SWFOLDERROOT-}/

en todos los archivos de extensión .tpl

que se encuentren a partir del directorio en el que estoy posicionado en todas las carpetas contenidas. El comando es el siguiente:
find -type f -name "*.tpl" -exec sed -i 's~{-$FOLDER-}~{-$SWFOLDERROOT-}/~g' '{}' \;

Las aclaraciones del caso:

find -type f -name "*.tpl"  buscar los archivos cuyo nombre sea o contenga *.tpl

- exec por cada resultado anterior ejecutar el comando que sigue.

sed -i (stream editor, editor de flujo seria la traduccion literal, la opción -i (in place) indica que la edición se realice sobre el mismo archivo. Es decir lo reemplaza. si quisieran backupear el original podrían hacer -i.tmp o la versión larga --in-place=.tmp

's~{-$FOLDER-}~{-$SWFOLDERROOT-}/~g'

la expresión va encerrada entre comillas simples.
s (comando sustituir), ~ es un tipo de separador, sed acepta ~ ó / ó | como separadores válidos. a continuación del separador va la expresión a buscar. En este caso {-$FOLDER-}, luego otro separador ~ luego la expresion de reemplazo. En este caso {-$SWFOLDERROOT-}/, luego otro separador ~ y finalmente el comando g (global), que indica que reemplace todas las ocurrencias.

{} El par de corchetes vacios es reemplazado por el nombre de archivo que va a pasar find como parametro de la funcion -exec. El uso correcto de la función debería encerrar las llaves entre comillas simples para evitar que el shell lo interprete como otra cosa.

\; todo lo que sigue a continuacion del primer comando del exec se considera argumentos del comando a excepcion de '{}', hasta que se encuentre un ; para mayor seguridad de que el shell no lo interprete como otra cosa se lo escapa con \, aunque tambien podría encerrarse entre comillas.

Los sitios de los que saqué información:
http://www.brunolinux.com/02-The_Terminal/Find_and%20Replace_with_Sed.html 
http://www.grymoire.com/Unix/Sed.html#uh-62h 
http://www.comoinstalarlinux.com/comandos-linux-find-con-ejemplos-3/

viernes, abril 11, 2014

Linux, comando find, encontrar archivos de un determinado usuario de gran tamaño y obtener un output legible.

Básicamente necesitaba encontrar todos los archivos de un determinado usuario dentro del directorio "home", podían no estar en su home solamente, mayores a 10M. Para ello utilicé el comando "find", rejuntando de varias fuentes llegué a esta hermosa conclusión:
 
sudo find /home -user juancarlosbatman -size +10M -exec ls -lh {} \; 2>/dev/null

vamos por partes:

utiliz el sudo para poder acceder al resto de las carpetas de los otros usuarios. Por supuesto que mi usuario debe pertenecer al grupo sudoers y el root debe tener permiso de listar el resto de estas carpetas, aunque extraño, podría ser que no.

find -> el comando en si.

/home -> La ruta a partir de la cual quiero buscar

-user juancarlosbatman -> el usuario dueño de los archivos a revisar

-size +10M -> Tamaño minimo de los archivos a buscar, tambien podría agregar otro -size -20M, entonces buscaría archivos entre 10 y 20 megabytes.

-exec ls -lh {} \; -> con el resultado ejecutar el comando ls con la opción -lh (-l devuelve una lista mas completa, -h la hace legible para el ser humano, en vez de poner 1024000 escribe 10G), el comando find tiene las opciones -print o -ls, el problema es que -print trae poca info y -ls es igual al comando ls -l, pero no tengo el modificador -h, que lo hace mas facil, por eso es preferible utilizar el exec.

2>/dev/null -> Es posible que el usuario con el que ejecutamos el comando no tenga permisos de lectura en determinadas carpetas, o a determinados archivos, de forma que el comando find comenzara a llenar la pantalla con rutas de archivos y la leyenda "Permission denied", entre los archivos que vaya encontrando. Con esta sentencia, desviamos la salida de errores hacia el dispositivo null, es decir, no molesta.

Espero que les sirva, tanto como a mi.

sábado, enero 04, 2014

CyanogenMod forzar modo 3G ó WCDMA

Tengo un Samsung Galaxy Note II, y hace unos meses le instalé el CyanogenMod. El único problema que he tenido hasta hoy es que no podía forzar el modo 3G, todas las opciones que da son siempre 2g+ algún modo 3g, es decir que si tiene una señal fuerte EDGE, y una 3G o HSDPA mala, va siempre al EDGE, y en algunos casos peores se va a GPRS.
La mala noticia es que no hay una opción de configuracion directa para solucionarlo.
La buena es:
  • Vayan al discador telefónico y escriban:
         *#*#4636#*#*
  • Dentro del menú de configuración que les aparece vayan a:
         Informacion del dispositivo.
  • Se van a encontrar primero información del IMEI, Nro. de teléfono y red, luego un botón para ejecutar un testeo, luego mas información de estado e inmediatamente un menú de selección (Está justo antes de que vuelva a comenzar un juego de botones) que les va a decir algo como GSM Preferred., lo cambian por WCDMA Only y voilá!!. 
Si vuelven a entrar luego van a ver que quedó en WCDMA Preferred, así que asumo que si no tiene 3G de ningún tipo pasará a una red 2G solo.

La solución la encontré en el blog de Rodrigo Zamora Nelson, así que nobleza obliga ahi va el link: http://rodrigo.zamoranelson.cl/?p=1384

lunes, diciembre 30, 2013

Windows XP Error 0x0000007E creando una maquina virtual con VirtualBox

Hice una Máquina Virtual en Virtual Box a partir de una imagen realizada con  Clonezilla. Creé la máquina, puse la imagen de Clonezilla adentro del CD de la máquina virtual y restauré la imagen.
Hasta ahí todo normal. Bootee la máquina virtual y dió una pantalla azul con el error mencionado en el titulo. Como habitualmente ocurre, cuando uno crea una máquina virtual a partir de una existente. 
Bootee nuevamente a prueba de fallos y borré todos los dispositivos de hardware que me permitió Windows para que los redetecte (habitualmente esto funciona.)
Para no hacerlo demasiado largo, diré que sin importar cuanto lo intentase, siempre terminaba booteando con la pantalla azul y reiniciándose inmediatamente. 
Para poder chequear el error sin que la máquina se reinicie:
  1. Botón derecho sobre MiPC y en el menu contextual -> Propiedades
  2. Vayan a Opciones avanzadas -> Inicio y recuperación -> Configuración
  3. Destilden la opción que dice "Reiniciar automáticamentente".

Con eso se quedará en la pantalla azul y podrán comprobar el código de error.

La solución final la encontré en el sitio de soporte de microsoft. Básicamente tiene que ver con que la máquina "real" poseía un procesador Intel, y yo estaba intentando hacerla funcionar sobre un procesador AMD, eso aparentemente no le gusta demasiado al XP.
Dejo el vínculo original para quien lo quiera consultar, no obstante detallo el procedimiento para solucionarlo a continuación.
  1. Reinicien el equipo en modo a prueba de errores.
  2. Hagan clic en Inicio, hagan click en Ejecutar, escriban regedit y, a continuación, hagan click en Aceptar.
  3. Busquen y, a continuación, hagan click en la clave del registro siguiente:
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Intelppm
  4. En el panel derecho, haga clic en la entrada de Inicio ó Start y, a continuación, hagan click en Modificar.
  5. En el cuadro información del valor , escriban 4 (no le den importancia a si es decimal o hexa, en realidad, 4 es 4 en ambas bases numéricas) y, a continuación, hagan click en Aceptar.
  6. Salgan del Editor del registro.
Voilá!!



Artículo original: http://support.microsoft.com/kb/953356

lunes, agosto 26, 2013

Transferir variables o datos entre dos HTML, Obtener parametros pasados por GET en HTML

¿Cómo llamar de un HTML a otro enviando informacion y recibirla del otro lado?.


Generalmente uno envía información entre un html y un PHP, por ejemplo, o al lenguaje de servidor que mas les guste. Pero en este caso necesitaba servir una pagina desde PHP y no utilizar un motor de plantillas para reemplazar valores, Envié entonces un header del tipo
"header ('Location: pp.html?parametro='.$variable)", dentro del html, utilice esta funcion para leer este primer parametro que es el valor que me interesaba y transferirlo a una variable de formulario:

function leerGets() {
  var parameters = location.search.substring(1).split("&");
  var temp = parameters[0].split("=");
  document.getElementById("campo").value = unescape(temp[1]);
}
 
Vamos por partes:
 
location.search.substring(1) 

El objeto location, contiene la dirección escrita en el explorador. La propiedad search del objeto contiene el query string. Es decir que suponiendo que la direccion completa fue: http://pp.htm?parametro=xxx&param2=yyy
location.search devolvería ?parametro=xxx&param2=yyy . Al agregarle el método substring con un "1" como parámetro, cortamos el primer caracter de la cadena, en este caso el "?"
 
var parameters = location.search.substring(1).split("&")

al resultado del query string lo dividimos con la funcion split en un array de pares de valores separados por el caracter "&" y lo asignamos a una variable, en este caso parameters.
 
var temp = parameters[0].split("=");

Ahora tomamos el primer conjunto de parametro=valor (es el que me interesa a mi, aunque bien podríamos haber recorrido todo el query string) y lo volvemos a dividir pero en este caso por el carácter "=".
Es decir. parameters[0] contiene "parametro=xxx" ahora tendre un array "temp" que contendra temp[0] = "parametro" y temp[1] = "xxx".
 
document.getElementById("campo").value = unescape(temp[1]);

asignamos el valor a una variable de formulario con id="campo".
unescape(valor) me permite sacar los caracteres de codificación del query string. si por ejemplo, parámetro hubiese contenido espacios entonces habría llegado con un formato parecido a este parametro=Juan%20Perez.

Listo!. Espero que sirva.

Agregado mas tarde...

Y ya que estamos amplio la función y la convierto en algo mucho mas útil.

 
function leerGets() {
  var gets = {}; temp=[];
  var parameters = location.search.substring(1).split("&");

  parameters.forEach(function(entrada) {
              temp = entrada.split("=");
              gets[temp[0]] = unescape(temp[1]);
  });
  return gets;
}