Tuesday, November 9, 2010

Linux: limpiar la cache de disco (flush disk cache)

Necesito hacer una buena medicion copiando archivos, pero como el kernel cachea los archivos es necesaria una limpieza del cache (flush).

sync; echo 3 > /proc/sys/vm/drop_caches

Y las alternativas son:

To free pagecache:
# echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:
# echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

Saludos !

Comando mount (remount + noatime)

Bueno, Linux hace un rato muy largo que tiene codigo para remontar al vuelo (live) una particion y ponerle otros flags de montaje.
Por ejemplo, si queremos remontar una particion con noatime:

mount -o noatime,remount,rw /dev/hda3

Saludos !

Monday, November 8, 2010

El comando screen de Linux para un mejor uso de la consola

Estoy trabajando en la consola y se me corta la luz o la conexion a internet haciendo X tarea mas importante que la vida misma. Pero gracias a que ejecute screen, la conexion se perdio pero no la consola virtual y su estado previo a la desconexion.

Ejemplo: rsync de maquina a maquina de unos 100 GB, esto va a tardar una buena cantidad de horas, y nos podemos quedar tranquilos de que el comando sigue corriendo en la consola "protegida" por screen.

Screen acepta muchisimos comandos, asi que a continuacion listo los que yo rescate como mas importantes (o mejor dicho, los que me sirven a mi):

Primero, para arrancar screen conviene hacerlo con un nombre de sesion:

screen -S nombresesion

Y segundo, cuando digo C-a (como figura en la documentacion) quiero decir tecla Control+a

Luego los comandos que acepta cuando estamos adentro son los siguientes:

C-a c
crea una ventana nueva

C-d
cierra la ventana actual

C-a S
crea una region horizontal

C-a |
crea una region vertical (funciona desde lenny ya que en etch screen no estaba parcheado con esta funcionalidad)

C-a X
borra una region

C-a tab
mueve entre regiones

C-a "
lista las ventanas disponibles

C-a a
salta entre ventanas

C-a NUMERO
salta a una ventana en particular

C-a A
renombra la current window (para que con C-a " te liste con nombres las windows y uno no se maree)

C-a :resize
en lineas, cuanto queres resizear una region ya sea vertical u horizontal

Y para "salir" de screen, es con C-a d

luego en la terminal original podemos tipear:

screen -list

y nos tira algo como:

root@maquina:/# screen -list
There is a screen on:
4307.pts-0.maquina (11/08/2010 05:25:39 PM) (Detached)
1 Socket in /var/run/screen/S-root.

entonces si se nos corto la luz o la conexion podemos volver al screen con:

screen -r 4307.pts-0.maquina

Por supuesto, para agarrarle la mano hay que jugar un poco pero eso es tarea de cada uno ;-)


Saludos !

Friday, October 1, 2010

Averiguar el valor booleano de "algo" en Javascript

Me acabo de enterar que se puede forzar un valor booleano de la siguiente forma:

!!algo

en vez de hacer cosas como:

algo ? true : false

o

Boolean(algo)

Ademas otra cuestion muy importante es que cuando se declaran las variables en Javascript estas adoptan "undefined" como valor inicial, no null. Y gracias a esto podemos chequear si una variable fue o no utilizada o asignada con algun valor:

var otracosa;
typeof otracosa;

devuelve "undefined"

var otracosa = null;
typeof otracosa;

devuelve "object"

var otracosa = "hola";
typeof otracosa;

devuelve "string"

Wednesday, September 29, 2010

Repositorio para Debian Etch (ya que ahora no hay mas soporte)

Me ocurrio que no pude hacer un dist-upgrade en una maquina en produccion por diversos motivos, y como los repositorios de Debian para Etch fueron removidos no se pueden instalar mas paquetes via internet, entonces hay que cambiar el /etc/apt/sources.list con la siguiente linea para volver a tener disponibles los paquetes de Etch:

deb http://archive.debian.org/debian etch main contrib non-free

Ya que en http://archive.debian.org han mantenido un mirror para gente como yo ;-)

Ademas, las ISO's viejas de Debian pueden conseguirse en:

http://cdimage.debian.org/cdimage/archive/


Saludos !

Friday, August 20, 2010

Expresion regular para URL's de bit.ly (regex)


http:\/\/bit\.ly\/[A-Za-z0-9]{6}

y un preg_replace en PHP para esta regex seria:

$result = preg_replace('%http://bit\.ly/[A-Za-z0-9]{6}%', '', $subject);

Tuesday, July 20, 2010

Arrancar y parar servicios en Ubuntu 10.04 LTS (y configurarlos en el arranque)

Hace aproximadamente 4 o 5 años que no usaba linux en escritorio, asi que decidi comprarme un disco de 1 TB y probar Ubuntu Server 10.04 LTS.
Para mi sorpresa, los enlaces en /etc/init.d/* ya no funcionaban mas, ya que se decidio cambiar el sistema de arranque a upstart (todavia desconozco bien el funcionamiento).

Todas las utilidades como por ejemplo rcconf y sysv-rc-conf dejaron de funcionar. Ahora existe un nuevo directorio /etc/init/ en donde se almacena informacion de upstart para cada servicio que tengamos en la maquina.

Lo primero que quise hacer es deshabilitar algunos servicios que no usaba, asi que la forma de hacerlo es agregar o modificar la siguiente linea dentro de cada servicio en particular dentro del directorio /etc/init/:

start on runlevel [!0123456]

lo que significa no arrancar en los runlevels 0123456, o sea, no arrancar nunca.

Ademas, la nueva (para mi por lo menos :P) forma de arrancar o parar servicios es con el comando "service":

service mysql stop
service mysql start

o sino tambien con los comandos "stop" y "start"

stop mysql
start mysql

Ire comentando todas las diferencias que vaya encontrando en Ubuntu 10.04 respecto a las distribuciones que utilizaba hace 4 o 5 años (que deben ser unas cuantas).

Saludos

Tuesday, May 18, 2010

Ordenar un array en PHP de acuerdo a un valor de los elementos que queremos ordenar (usort + funciones anonimas)

Retorcido ? bueno, mejor el ejemplo del codigo:

<?php

$array = array(0 => array('id' => 1, 'secs_order' => 82800), 1 => array('id' => 2, 'secs_order' => 64800), 2 => array('id' => 3, 'secs_order' => 19300));

$cmp = function ($a, $b) {

if ($a['secs_order'] == $b['secs_order']) return 0;

return ($a['secs_order'] < $b['secs_order']) ? -1 : 1;

};

echo '<pre>' . print_r($array, TRUE) . '</pre>'; // desordenado

usort($array, $cmp); // notese q aca $cmp es una funcion anonima ...

echo '<pre>' . print_r($array, TRUE) . '</pre>'; // ordenado

?>

Interesante para ordenar arrays de forma "no convencional" con una funcion propia. En este caso se ordeno el $array de menor a mayor de acuerdo al subvalor 'secs_order' de cada elemento del $array.


Saludos !

Thursday, May 6, 2010

Convertir codigo html en entidades html para entradas en blogspot

Simplemente copiar y pegar el codigo en este sitio http://www.simplebits.com/cgi-bin/simplecode.pl y pegarlo en la entrada ...

Saludos !

JQuery, controlar multiples eventos para remover errores en un formulario HTML

Donde #start_date, #end_date, #rec_until son input=text y el codigo html que remueve el remove() es por ejemplo:

<dd><span class="error error_start_date">Invalid start date (format: mm/dd/yyyy)</span></dd>

Ahora, el codigo en si es el siguiente:

$('#start_date, #end_date, #rec_until').bind('click blur select', function() {
$('.error_' + $(this).attr('id')).fadeOut('slow', function () {
$(this).parent().remove();
});
});

Se que no es muy explicativo, pero lo interesante de esto es la funcion bind() que nos permite manejar diferentes eventos con una misma funcion. Lo que hace el codigo es remover con una animacion fadeOut() el dd+span que se agrego al formulario a causa de un error.

Saludos !

Thursday, April 29, 2010

Problema con checkbox, IE6, IE7, IE8 y JQuery

IE no lanza el evento .change() de JQuery en checkboxes (y posiblemente, no lo testie pero dicen que tampoco en radio) en ninguna de sus versiones, como me acabo de enterar despues de renegar bastante y de buscar un poco en google ...

La "solucion" es esta:

if ($.browser.msie) {
$('#elemento').click( function () {
$(this).blur();
$(this).focus();

// hacer algo para IE
});
} else {
$('#elemento').change( function () {
// hacer algo para cualquier otro browser decente
});
}

Gracias IE por hacernos la vida imposible. Gracias.

Wednesday, April 14, 2010

Validar fechas con JQuery o Javascript teniendo en cuenta los años bisiestos

En el HTML para el siguiente codigo Javascript hay que colocar 3 elementos select (o cambiar el selector de JQuery para colocar un input) que tengan la propiedad ID nombrada a detect_month, detect_day y detect_year.
El regex obviamente se puede mejorar (o cambiar), pero lo dejo de esa forma para que se pueda reutilizar checkeando fechas en el formato mm/dd/yyyy. En si, lo importante del codigo es el checkeo de si es o no un año bisiesto.

$(function() {
var regexDateValidator = function (month, day, year) {
return (month + "/" + day + "/" + year).match(/(0[1-9]|1[012])[\- \/.](0[1-9]|[12][0-9]|3[01])[\- \/.]((?:19|20)+\d{2})/);
}

$("select[id*='detect_']").change(function () {
var result, check, month, day, year;
result = regexDateValidator(month = $('#detect_month').val(), day = $('#detect_day').val(), year = $('#detect_year').val());

if ( Boolean(result) ) {
if ( result[2] == 31 && (result[1] == 4 || result[1] == 6 || result[1] == 9 || result[1] == 11) ) {
check = false; // 31 de un mes con 30 dias
} else if (result[2] >= 30 && result[1] == 2) {
check = false; // febrero 30 o 31
} else if ( (result[1] == 2) && (result[2] == 29) && ( !(result[3] % 4 == 0 && (result[3] % 100 != 0 || result[3] % 400 == 0)) ) ) {
check = false; // febrero 29 fuera de un año bisiesto
} else {
check = true;
}
} else {
check = false;
}

if ( check ) {
// hacer algo (fecha valida)
} else {
// hacer algo (fecha invalida)
}
});
});

Ojala le resulte util a alguien ...

Saludos !

Sunday, April 4, 2010

fbinst (particionar pendrive)

Es un muy buen programa para particionar (por ejemplo, pendrives) bajo windows y es free.

http://download.gna.org/grubutil/

Lo unico es que al terminar de ejecutar los comandos hay que desmontar el pendrive y volverlo a introducir (no se como sincronizar el sistema operativo todavia).

fbinst.exe --list
fbinst.exe (hdX) format --force --raw --fat32 --size 3800m
fbinst.exe (hdX) format --force --raw --fat16 --size 1900m

Obviamente, estos son simples ejemplos de uso del programa.

Mas info en: http://www.boot-land.net/forums/index.php?showtopic=7932

Saludos !

Sunday, February 14, 2010

Cambiar el editor por defecto en Debian


update-alternatives --config editor

Saturday, February 13, 2010

Instalar Windows 7 / Vista / XP y Linux desde una unidad USB o pendrive

Investigando un poco me tope con un EXCELENTE proyecto llamado WinSetupFromUSB que permite crearnos un USB booteable con practicamente cualquier cosa que queramos. Efectivamente se pueden hacer pendrives multibooteables con windows 7 / Vista / XP y Linux todo junto.

http://www.msfn.org/board/index.php?showtopic=120444

Estuve un dia entero renegando con ciertas cosas, asi que lo que recomiendo es ir directamente a la carpeta /files/tools y correr los siguientes:

HPUSBFW.EXE = con esto formateamos en FAT32 el pendrive USB, es muy importante ya que no cualquier formato es reconocido por los BIOS. Ante mi asombro, dentro de un formato FAT32 existen varios tipos como USB-FDD, USB-ZIP, USB-HDD single y multiple. Esta utilidad nos deja el pendrive como USB-HDD single.

BOOTICE.EXE = process MBR y PBR. En ambos instalamos GRUB for DOS y copiamos el grldr (bootloader) y bueno, los menu.lst que querramos (igual al grub de linux).

Despues con el programa en si podemos insertarle el setup de cualquier windows que querramos (se que funciona con XP/Vista/7) e incluso diferentes distros de linux desempaquetando las ISO's en el rigido y agregandolas con la opcion "SysLinux bootsector/Linux distribution using SysLinux" luego.

Recalco que hay q saber editar las entradas de grub (menu.lst) para dejar andando toda la ensalada de sistemas operativos, pero yo he podido crear un multibooteable con windows xp y windows 7 + backtrack 4 sin problemas.

Adios compacteras !

configuracion wifi / wireless con backtrack 4


ifconfig wlan0 up
iwconfig wlan0 essid 'miredinalambrica'

en el /etc/wpa_supplicant/wpa_supplicant.conf (si es q usamos WPA-PSK con AES unicamente):

network={
ssid="miredinalambrica"
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
psk="migranpassword"
}

luego levantamos la red asi:

wpa_supplicant -D wext -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

y por ultimo, si usamos dhcp:

dhclient wlan0

Followers

About me

Santa Fe, Argentina
Programador Web, PHP, MySQL, JQuery, Administrador Linux. LAMP, Lighttpd, Nginx.