שירים להורדה לסמארטפון
kottik
תרגום גוגל מערבית לעברית
независимый рейтинг брокеров бинарных опционов
קמגרה גל
алиеэкспресс

Tag Archives: tips

svn

Bien podría ser la sigla de Se Viene la Noche, pero no. Justamente evita que la oscuridad se adueñe de nuetro código al programar entre varios sobre un mismo proyecto.

¿ Qué es ?

Subversion (svn) es un sistema de control de versiones. Los sistemas de control de versiones permiten a varios individuos (que pueden estar distribuidos geográficamente) colaborar en un conjunto de archivos (típicamente código fuente).

Instalación del servicio

# aptitude install subversion

Crear un nuevo repositorio

# svnadmin create --fs-type fsfs /srv/svn/svn_proyects/proyect_work

Configurar permisos y dueños

# chown -R www-data:subversion /srv/svn/svn_proyects
# chown -R 770 /srv/svn/svn_proyects

Ususarios,grupos y contraseñas

# useradd zeppelin
# useradd hendrix

# addgroup zeppelin subversion
# addgroup hendrix subversion

# htpasswd -c /etc/apache/dav_svn_proyect_work.passwd zeppelin
escribimos la password


# htpasswd /etc/apache/dav_svn_proyect_work.passwd hendrix
escribimos la password

Asociar usuarios a proyectos
Usamos el módulo de apache dav_svn (debe estar instalado apache2 y habilitado el módulo ) y agregaremos en "/etc/apache2/mods-available/dav_svn.conf" cada proyecto que tengamos:

<>
DAV svn
SVNPath /srv/svn/proyect_work
AuthType Basic
AuthName “Proyect Work”
AuthUserFile /etc/apache2/dav_svn_proyect_work.passwd
Require valid-user
< / location >

Reiniciamos el apache

/etc/init.d/apache2 restart

Con esto ya deberíamos tener andando en www.nuestroservidor.com/proyect_work nuestro respositorio. Para la próxima los comandos útiles desde el lado del cliente.

ubuntu remix to classical desktop

Ni bien instalé el ubuntu remix en mi netbook me pareció atractivo, interesante, novedoso, pero definitivamente incómodo! bien, siempre fui un buen usuario y me acostumbré a usarlo.

ubuntu remix 9.10

Sin embargo, meses después me di cuenta que realmente me era incómodo y que necesitaba volver al escritorio que ya estaba acostumbrado. Después de naufragar un par de horas, y leer unos cuantos foros (cosa incómoda si las hay!) varios forristas mencionaban una simple aplicación (desktop-switcher) que hacía exactamente lo que yo necesitaba, exacto, pretérito del verbo ser: HACÍA en 9.04, lo quitaron del 9.10 por inestable. Así fue como deprimido y cabizbajo, seguí clickeando de mala gana el novedoso escritorio… hasta HOY.

Resulta que para volver al clásico de ubuntu (no al 100%) hay que hacer lo siguiente:

  1. Agregar un applet en el panel con la barra de menúes.
  2. En una consola entrar al gconf-editor:
  3. Bajo Apps/nautilus/preferences, tildar show-desktop
  4. Bajo Apps/nautilus/desktop, tildar los íconos clásicos del escritorio (por ej,computer_icon_visible)
  5. Deshabilitar la aplicación al inicio “Maximus”

Por último, reiniciar. Y así queda lo buscado:

Varios proxies en firefox


Con este agregado (add-ons) del firefox vas a poder seleccionar en cuestión de segundos el proxy por el que querés navegar. En mi caso es muy util porque en mi laburo uso un proxy, en la UTN otro y en mi casa ninguno.

Así que, una vez cargados los proxies con solo un click derecho sobre la barra de estado del firefox seleccionás el proxy -como se ve en la imagen siguiente- y listo!

Ahh, me olvidaba… el add-ons se llama switch proxy

GPG error

Una y mil veces me ha pasado el error del título después de un aptitude update, cada vez que lo sufrí tuve que ir a buscar la solución así que a modo de ayuda memoria acá me lo dejo (la key en azul):

# gpg –keyserver wwwkeys.eu.pgp.net –recv-keys 49A120FD1135D466
# gpg –armor –export 49A120FD1135D466 | sudo apt-key add –

Manipulating PDF documents

Herramientas a instalar: pdfjam y pdftk

#aptitude install pdfjam pdftk

Tips:

  • Unir varios archivos pdf en uno único:

$pdftk archivo1.pdf archivo2.pdf archivo3.pdf cat output archivo123.pdf

  • Poner dos hojas por página:

$pdfnup –nup 2×1 aficheflisol.pdf

  • Poner cuatro hojas por página:

$pdfnup –nup 2×2 aficheflisol.pdf

  • Recortar 1 cm a cada borde de la paginas 2-6:

$pdfnup –trim “1cm 1cm 1cm 1cm” –pages 2-6 archivo.pdf

Monitorear UPS desde GNU/Linux

Recientemente compramos una UPS APC CS 500 para el servidor del CENEHA (mi trabajo). Como la mayoría de los fabricantes de hardware el software de monitoreo que incluye en el cd es para window$, y por lo tanto no me sirve para un carajo.

Por suerte el software libre tiene motorcito propio y siempre -o casi siempre- encontrás algún paquete que te sirve para llevar a cabo tu objetivo: monitorear la UPS desde GNU/Linux.

El modelo CS 500 posee un cable para conectar la UPS al servidor, del lado de la PC es un conector USB y en el otro extremo un RJ-45. Una vez realizada la conexión pasamos a instalar el software que dialogará con la batería.

El tema fue bastante más sencillo de lo que creía, simplemente se deben instalar los siguientes paquetes (www.apcupsd.org): apcupsd, apcupsd-cgi y apcupsd-doc:

#aptitude install apcupsd acpupsd-cgi apcupsd-doc

Una vez instalado pasamos a la configuración, en el archivo /etc/apcupsd/apcupsd.conf se deben establecer los parámetros que le indican -entre otras cosas- el tipo de conexión (USB, serial, etc). Este archivo es muy explicativo, así que si no se entiende lo que escribo acá, basta con leer las instrucciones del mismo y no hay manera de pifiar.

Bien, en mi caso tuve que poner modificar los siguientes parámetros:


UPSCABLE usb
UPSTYPE usb
DEVICE

NOTAR que luego de DEVICE se deja en blanco.

Por último, lo que nos queda es ejecutar el script que nos devuelve los parámetros encuestados a la UPS:

#apcaccess

APC : 001,043,1025
DATE : Mon Sep 22 16:49:13 ART 2008
HOSTNAME : ceneha
RELEASE : 3.14.2
VERSION : 3.14.2 (15 September 2007) debian
UPSNAME : ups
CABLE : USB Cable
MODEL : Back-UPS CS 500
UPSMODE : Stand Alone
STARTTIME: Fri Sep 19 14:39:21 ART 2008
STATUS : ONLINE
LINEV : 228.0 Volts
LOADPCT : 23.0 Percent Load Capacity
BCHARGE : 100.0 Percent
TIMELEFT : 28.1 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME : 0 Seconds
OUTPUTV : 230.0 Volts
SENSE : Medium
DWAKE : 000 Seconds
DSHUTD : 000 Seconds
LOTRANS : 180.0 Volts
HITRANS : 266.0 Volts
RETPCT : 000.0 Percent
ITEMP : 29.2 C Internal
ALARMDEL : Always
BATTV : 13.5 Volts
LINEFREQ : 50.0 Hz
LASTXFER : Low line voltage
NUMXFERS : 0
TONBATT : 0 seconds
CUMONBATT: 0 seconds
XOFFBATT : N/A
SELFTEST : NO
STATFLAG : 0x07000008 Status Flag
SERIALNO : 4B0824P03005
BATTDATE : 2008-06-10
NOMOUTV : 230
NOMINV : 230
NOMBATTV : 12.0
FIRMWARE : 808.q8.I USB FW:q8
APCMODEL : Back-UPS CS 500
END APC : Mon Sep 22 16:49:27 ART 2008

Y ahí tenemos toda la data que nos puede llegar a interesar sobre lo que está pasando con nuestra UPS, voltaje de la linea, frecuencia, etc.

Un detalle que acabo de encontrar es un programa cliente que nos muestra gráficamente estos valores, para mi caso no me sirve porque el servidor es interno y no tenemos acceso desde internet, sin embargo a alguien que tenga una pc cliente o un servidor con interfaz gráfica les puede interesar. El programa se llama gapcmon cuya interfaz -que no es un picasso- es muy fácil de manejar e interpretar, aquí les dejo una captura:

Para la próxima les prometo un script para obtener esta información y luego graficarla usando cacti.

Caracteres en un archivo binario usando C++

Escribir y leer datos en un archivo binario no presenta demasiadas dificultades. Por ejemplo, para escribir un entero “e” y un float “f” en un archivo binario “bin” hacemos lo siguiente:

int e=10;
float f=12.5;
fstream bin(“archivo.bin”, ios::binary|ios::out);
bin.write((char *)&e, sizeof(int));
bin.write((char *)&f, sizeof(float));
bin.close();

Todo es lindo y prolijo, ahora, qué pasa si tengo una cadena de caracteres al estilo C de 14 caracteres?

Bien, las cadenas de caracteres al estilo C son vectores de bytes, y por lo tanto el identificador de la variable es un puntero a la dirección de memoria del primer caracter. O sea que para escribir este flujo de 14 bytes debemos ir iterando y guardar dato por dato. Vamos a los bifes, supongamos que tenemos una cadena “pianobar”:

char pianobar[14]=”nace una flor”;
fstream bin(“archivo.bin”, ios::binary|ios::out);
for (int i=0;i<14;i++){
bin.write((char *)&pianobar[i], 1)
}

Ahora, vamos a leer esta cadena:

char pianobar[14];
fstream bin(“archivo.bin”, ios::binary|ios::in);
bin.read((char *)&pianobar, 14)

De lo anterior vemos que la escritura se hace caracter por caracter, dejando un espacio de 1 byte por cada uno, luego al momento de leer el dato, se indica la cantidad total de bytes (para el ejemplo 14) y se asigna a la variable.

El único detalle a tener en cuenta es que la longitud de la cadena que hemos definido es de 14, sin embargo posee un máximo de 13 caracteres, ya que el último caracter queda reservado para el siguiente código de finalización “\0”. Otro punto a tener en cuenta es que las cadenas, al igual que los vectores comienzan en la posición 0.

getline luego de cin

Desde no hace mucho estoy intentando aprender C++. Viste que todo el mundo te dice: “Un informático no puedo no saber C++…“, así que como creo que tienen algo de razón encaminé mi vida por el sendero del qué dirán.

C++ tiene muchas diferencias con respecto a otros lenguajes, no es solo aprenderse la nueva sintaxis, sino que existen nuevos conceptos previamente inexistentes para mi. Aparte de esto, a veces me encuentro con pequeños detalles pelotudos que me hacen renegar. Uno de esos detalles “pelotudos” se me dio este fin de semana: Simplemente utilizaba para leer un número entero el cin>>n y líneas más abajo para leer un renglón completo utilizaba un cin.getline().

Todo parecía y compilaba bien, pero al momento de ejecutar mi pequeño programa obtenía comportamientos NO esperados (para mi pobre lógica). Acá un fragmento de código que reproduce el problema:

cout<<"Cantidad de cadenas a ingresar:";
cin>>n;
for (int i=1;i<=n;i++){
cout<<"Cadena: ";
cin.getline(cadena);
}

La salida da lo siguiente:

Cantidad de cadenas a ingresar: 3
Cadena: Cadena:

Como se ve, el programa no esperó para ingresar la primer cadena, sino que siguió con el ingreso de la segunda cadena. ¿Por qué pasa esto?

El tema es que cin>> agrega al flujo de entrada previo al dato a leer un (caracter “\n”) e ignora el último (caracter “\n”). Luego, cuando getline() encuentra en el flujo ingresado previamente el primer “\n” culmina su ejecución -recordemos que el getline() lee hasta encontrar un salto de carro, o sea un “\n”-.


Solución:

Yo la hice simple, uso luego del cin un getline que lea un caracter, de modo que captura el “\n” que tanto jodía antes, quedaría así:


char s[1];
cout<<"Cantidad de cadenas a ingresar:";
cin>>n;
cin.getline(s);

for (int i=1;i<=n;i++){
cout<<"Cadena: ";
cin.getline(cadena);
}

Social Widgets powered by AB-WebLog.com.

Social Widgets powered by AB-WebLog.com.

Social Widgets powered by AB-WebLog.com.