Excel y .NET, malos amigos (III): ¿Como poner una imagen en un rango de celdas?

Otra nueva guerra con Excel, desde C#. Ahora el problema era introducir una imagen en un rango de celdas. Un verdadero problema, ya que la imagen tenia que ajustarse a ellas aunque se deformara. Además tenía que funcionar en Office 2003 y 2007. ¿Más madera?, no importa soy informático :P.

Pues bien, primer intento, me pongo manos a la obra y a tirar líneas:

// Rango donde se intertará la imagen
Microsoft.Office.Interop.Excel.Range r1;
r1 = (Microsoft.Office.Interop.Excel.Range) objSheet.get_Range("F5", "AB37");
r1.Select(); //Es necesario seleccinar un rango para poder insertar

// Objeto de todas las imagenes del excel
Microsoft.Office.Interop.Excel.Pictures oPictures =
(Microsoft.Office.Interop.Excel.Pictures)objSheet.Pictures(System.Reflection.Missing.Value);

//La ruta de la imagen donde esta la imagen a insertar,
//OJO es necesario indicar bien la ruta, de lo contrario marcará el siguiente error
//"Error en el método Insert de la clase Pictures" y pues eso despista ya que solo es
//la ruta y no la implementacion del método
string pathTEMP_BMP = System.IO.Path.GetTempFileName();
this._datos.im.Save(pathTEMP_BMP, System.Drawing.Imaging.ImageFormat.Bmp);

// Crear un objeto Picture de Office
Microsoft.Office.Interop.Excel.Picture p =
oPictures.Insert(pathTEMP_BMP, System.Reflection.Missing.Value);
// Redimensionar
p.Width = (double) r1.Width;
p.Height = (double) r1.Height;

Bueno, pues un medio “Fail”. Funciona bien en 2003, pero cuando se abre con Excel 2007, la imagen no se ajusta al rango “r1” de celdas. Miro a la pantalla con resignación torera y exclamo mi mítico: “Me cago en tó”.

Vale, no desesperemos, tras bucear un poco por internet, veo este articulo que me da otra buena idea. No usar el objeto “Pictures” de Excel, si no usar el “Shapes”. Vamos a intentarlo:

// Eliminamos apartir de la línea 17 en adelante y incluimos esto
objSheet.Shapes.AddPicture(pathTEMP_BMP, 
               Microsoft.Office.Core.MsoTriState.msoFalse, 
               Microsoft.Office.Core.MsoTriState.msoCTrue,
               float.Parse(r1.Left.ToString()), float.Parse(r1.Top.ToString()), 
               float.Parse(r1.Width.ToString()), float.Parse(r1.Height.ToString())); 

Perfecto, ahora si funciona bien en 2003, y 2007. Pero lo que cuesta hacer la cosas bien :).

Please follow and like us:

Cutre-imagen: Quien montó este ordenador, no tuvo en cuenta un pequeño detalle…

… y fue que quizás, sólo quizás, nos gustaría usar el DVD.

PC muy "bien" montado

PC muy "bien" montado

Y ojo, que es verídico, este ordenador está ahora mismo delante mía y no se muy bien como se han apañado para meter los cables del frontal delante del DVD… FAIL!

Please follow and like us:

Curioso error en VMware Server 2 con las rutas

Me he encontrado con un error muy “curioso” en VMware Server, el servidor gratuito para la virtualización de máquinas. Este software tiene un impresionante (y realmente es impresionante) interfaz web para manejar las maquinas virtuales, y que podemos usar desde cualquier navegador web.

Una de las características que ofrece para la virtualización, es usar una imagen “iso” como unidad de CD, lo que nos facilita mucho poder instalar sistemas operativos (te bajas una “iso”, la usas como CD, y ya puedes instalar sin tener que quemar el CD físicamente). Pero hay que tener en cuenta, la ruta y los caracteres.

Si tu ruta o fichero contiene el caracter “[“, el IU de VMware se quedará colgado (al menos en Firefox), pero seguramente hay muchos caracteres que pueden ser incompatibles con este gran software.

Avisados quedamos 🙂

Please follow and like us:

¿Problemas de memoria con WordPress?, no hay problema

Cuando usas WordPress, no es difícil encontrarse con algún odioso error de “Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes)“. Este problema se produce cuando tu PHP trata de usar más memoria de la que tiene asignada por defecto (si no recuerdo mal son 32 Mb), la cual es fácil de sobrepasar si tenemos mas de 10 plugins activos, sobretodo con alguno que consume muchos recursos…
Para conocer si el problema es el uso de la memoria de tu WordPress, hay un plugin recomendado que nos permite saber cuanta memoria consumimos con nuestro blog, y es “TPC! Memory Usage“, el cual recomiendo ya que es muy sencillo y práctico.

Para tratar de solucionar este problema, hay tres métodos a intentar. Primero en la propia configuración de WordPress, añadiendo (ojo, digo añadiendo) al principio del fichero wp-config.php la sentencia:

// Por ejemplo, si no te vale, ve subiendo el valor.
define('WP_MEMORY_LIMIT', '32M');

En este caso se ponen 32 Mb de memoria, pero por ejemplo para este blog tengo que poner 48 Mb y todo va bien, con un consumo medio de 33 Mb. Tampoco te pases poniendo el límite, ya que si estas es un server compartido, seguro que no te dejan subirlo mucho…

Si no te vale con este cambio y te siguen saltando errores con la memoria, es que te tienen limitado el tamaño máximo en la configuración de PHP, y puedes probar cambiando la configuración del PHP desde el fichero .htaccess (solo si el servidor web lo permite claro y usas Apache) del raíz de tu aplicación.

# De nuevo es valor que puedes cambiar
php_value memory_limit 32M

Si tuvieras acceso al fichero php.ini (cosa que dudo salvo que manejes tu el servidor), podrías cambiar la siguiente línea en él:

memory_limit = 16M

Si aún no te lo ha solucionado, te recomiendo que contactes con el administrador de la máquina ya que tienes las manos atadas con este asunto.

Referencias:

Please follow and like us:

Bloquear (o redirigir) Spotify mediante iptables

Spotify

Spotify

Spotify es cojonudo. Si, una revolución. Pero un dolor de cabeza para todos los administradores de redes que ven como poco a poco, Spotify se va comiendo ancho de banda. Y además con su crecimiento nos vemos en la tesitura de que todos los usuarios ya van abandonando el mp3 para ir poco a poco pasándose al streaming, lo que nos hace que nuestros firewall tengan tráfico extra.

No soy el primero que se ha tenido que pelear con el, de hecho ya he visto alguna pregunta para bloquear Spotify en firewalls corporativos.

La solución que proponen la mayoría es bloquear el login del programa, que intentan a una subred en particular como puedes leer en el blog de Fernando Luis aunque con una pequeña mejora respecto a lo que leéis en su blog, traducido a iptables, el comando mágico es:

iptables -I FORWARD -d 78.31.8.0/21 -j DROP

Pero si lo que quieres es dejar a la gente que disfrute de este gran programa, y tienes varias lineas de ADSL y quieres que salga por una linea en concreto, puedes intentar marcar los paquetes mediante marcas, para luego redirigir el trafico marcado. Doy por sentado que tienes algún tipo de script dentro de tu servidor que pone las políticas del firewall en marcha, por lo que no me voy a parar en explicarte como hacer un script que monte todo el tinglado de un enrutamiento en un firewall (como por ejemplo como modificar el fichero /etc/iproute2/rt_tables, que cuento que lo tendrás modificado).
Eso si, os dejo las lineas que os redirigirán todo el tráfico de Spotify por otro ADSL, en este caso ADSL2.

ip rule add fwmark 1 table ADSL2    # ADSL con poco trafico
ip route add default via 192.168.221.1 dev eth1 table ADSL2
iptables -A PREROUTING -t mangle -i eth0 -d 78.31.8.0/21 -j MARK --set-mark 1          # Login Spotify
iptables -A PREROUTING -t mangle -i eth0 -d 195.55.74.0/24 -j MARK --set-mark 1         # Streaming Spotify
Please follow and like us:

Como extender los permisos de Linux: ACLs

Las ACLs o “Access Control List” son una forma de extender los permisos de seguridad que podemos asignar a los directorios y archivos de linux. Estos permisos nos permiten una mayor flexibilidad que el rígido sistema que suelen utilizar los sistemas *nix (también conocido como UGO o “User, Group, Other”), y es muy útil cuando nuestro sistema de permisos se complica por la necesidad de incluir muchos permisos diferentes a usuarios y grupos (la utilización de los permisos tradicionales o UGO son muy complejos en estos casos), ya que nos permite ir dando permisos a cada usuario del sistema/dominio de manera independiente.
El sistema de permisos ACL no substituye al sistema UGO, más bien lo extiende, ya que permite añadir muchos permisos extra partiendo de los UGO. De hecho se siguen respetando los permisos tradiciones (UGO) y se integran dentro de ACL, como y a explicaré más adelante.

Estos permisos, ACL, son necesarios cuando compartimos una carpeta a máquinas Windows (mediante Samba por ejemplo), ya que Windows usará estos permisos, y nos permitirá cambiarlos desde la misma pantalla de propiedades, pestaña de seguridad, de Windows, como muestra la imagen siguiente:

Panel de seguridad de Windows

Panel de seguridad de Windows

En este post, repasaré un poco el sistema tradicional de permisos (UGO) ya que el sistema de permisos ACL lo complementa y es necesario tener conocimientos básicos, aunque no voy a profundizar mucho en él, ya que puedes encontrar muchos manuales sobre el tema en internet (Google es tu amigo).

Importante: Conocer los permisos UGO es fundamental para utilizar los permisos ACL, por lo que te ruego encarecidamente que si no tienes algo de “culturilla” sobre el tema, que te leas el artículo entero aunque no trate directamente de ACL.

Soportar ACL en Linux

Primero de todo, para lograr que linux use este sistema hay que añadir a “/etc/fstab” en la entrada de la partición que queremos que use ACL, el parámetro “acl” al montar una partición, como indica la siguiente linea:

# Entry for /dev/sda2 :
UUID=e4f75e2b-56b5-4857-aa57-04629fbab9c8 /datos ext3 noatime,acl 1 2

Nota: Aunque casi todos los kernel de linux ya traen el soporte activado para ACL (la distribución Ubuntu la trae por defecto al menos), si usas una distro muy antigua, quizás tengas que recompilarte el kernel con ciertas opciones activadas, en internet hay varios manuales de como hacerlo.

De UGO a ACL…

Desde cualquier terminal, podremos ejecutar un “ls -l” (que es una herramienta muy potente para cualquier administrador si se sabe usar) para observar los permisos de los archivos de nuestro directorio actual, como mostramos en el siguiente listado que hemos capturado de un sistema linux cualquiera:

drwxr-sr-x 2 news   news   4096 2009-10-08 12:16 news
drwxr-xr-x 2 ntp    ntp    4096 2009-05-13 23:06 ntpstats
-rw-r--r-- 1 root   root      0 2009-07-09 09:44 pycentral.log
drwxr-x--- 3 root   adm    4096 2009-10-09 10:23 samba
-rw-r--r-- 1 root   root 505653 2009-10-08 13:08 scrollkeeper.log
-rw-r----- 1 syslog adm     564 2009-10-09 11:17 syslog
-rw-r----- 1 syslog adm  485104 2009-10-09 09:36 syslog.0
-rw-r--r-- 1 root   root 383188 2009-10-09 09:16 udev
drwxr-xr-x 2 root   root   4096 2008-03-10 16:24 unattended-upgrades
-rw-r----- 1 syslog adm     736 2009-10-09 09:17 user.log
-rw-r----- 1 syslog adm     274 2009-10-08 12:38 user.log.0
-rw-rw-r-- 1 root   utmp  33408 2009-10-09 11:32 wtmp

Para el tema de identificar los permisos, nos interesa mucho la primera columna (empezando por la izquierda) donde se nos muestran los permisos tradicionales basados en usuario/grupo que tiene un archivo/directorio en el sistema linux. Luego la tercera columna nos indica el propietario del usuario, y la cuarta el grupo propietario del archivo/directorio.

Las partes que nos interesan son el primer bloque (como por ejemplo este: drwxr-x—), donde el primer carácter del bloque nos indica que tipo de elemento esta listando:

  • Fichero regular (o “-“)
  • Directorio (o “d”)
  • Archivo de bloques (o “b”) que suele ser típicos en el directorio “dev”
  • Archivo de carácter (o “c”)
  • Cola FIFO (o “f”)
  • Un enlace (o “l”)
  • Un socket (o “s”)

Como vemos en el primer bloque, después del primer carácter, nos encontramos una serie de caracteres agrupado de tres en tres, es decir 9 caracteres. Estos, básicamente, indican que tipo de permisos tiene asignado ese elemento (sea del tipo que sea) y los hay de 3 tipos:

  • Lectura (o “r”), para poder abrir los ficheros sin modificar.
  • Escritura (o “w”) para poder modificar el fichero.
  • Ejecución (o “x”) para ejecutar un programa o script. Si estamos hablado de un directorio, significa que podremos entrar dentro de el.

Estos permisos se tienen que aplicar a tres posibles escenarios (que equivalen a los tres bloques que hemos hablado antes), y que tienen el siguiente significado:

  • Para el usuario propietario del fichero (normalmente su creador), se identifica con el primer bloque (justo el que esta junto al carácter de tipo de elemento).
  • Para el grupo de usuarios propietario del fichero, se identifica con el segundo bloque. Este grupo no necesariamente tiene que ser a uno al que pertenezca el usuario ya que puede ser cualquier otro.
  • Para el resto de usuarios, que se identifica con el tercer bloque, los tres caracteres de la de derecha.

Es cierto que no solo se pueden aplicar los permisos rwx, ya que se pueden asignar ciertos permisos “especiales”:

  • “Sticky Bit” (o “t”)
  • “Bit Setgid” y “Bit Setuid” (o “s” con permisos de ejecución o “S” sin ella)

Como hemos comentado anteriormente, solo hay 3 posibilidades, permisos al usuario, al grupo del usuario y al resto. Imaginaros que tenemos 50~100 usuarios y los permisos son bastante complejos, tales como que hay varios grupos que tienen que usar cierto recurso o varios usuarios que queremos que sean propietarios de un fichero. Con este sistema de ficheros es bastante complejo de realizar o bien, creando grupos especiales para cada recursos.

Aquí viene ACL al rescate del pobre administrador de sistemas.

Al fin, ACL en nuestro sistema

Con los permisos ACL’s esto cambia, ya que podemos asignar varios permisos a nivel de usuario/grupo a un mismo fichero, lo cual nos permite muchas mas flexibilidad. Pero esto requiere unos cuantos comandos nuevos que no se suelen utilizar, estos comando son:

  • getfacl, el cual nos muestra los permisos que tiene un archivo o fichero.
  • setfacl, nos permite fijar los permisos. Es importante que por defecto nos permite asignar un permiso que no existiera, es decir, no se puede modificar un permiso con este comando.
  • chacl, nos permite modificar permisos.

Por ejemplo vamos a ver los permisos de un directorio, usaremos el comando “getfacl“:

nas001@nas001:~$ getfacl /var
getfacl: Removing leading '/' from absolute path names
# file: var
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

Este comando acepta algún parámetro extra, el cual puedes consultar en su ayuda, pero para este pequeña guía no son especialmente importantes. Solo remarcar el parámetro “-R” que nos permite recorrer recursivamente un directorio para listar los permisos de todos los ficheros y subdirectorios que existan dentro de una carpeta (y normalmente es una burrada de información que te recomiendo que vuelques a un fichero).

Como puedes ver, el comando getfacl tiene una salida diferente a el comando “ls” sobretodo mas descriptivo.

nas001@nas001:~$ sudo getfacl /mnt/raid/Carpeta/
getfacl: Removing leading '/' from absolute path names
# file: mnt/raid/CONTROL
# owner: root
# group: usuarios\040del\040dominio
user::rwx
user:user1:r-x
user:user2:r-x
user:user3:r-x
user:user4:r-x
user:user5:rwx
user:user6:rwx
user:user7:r-x
user:user8:r-x
group:Administracion:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:user1:r-x
default:user:user5:r-x
default:user:user8:r-x
default:group:Administracion:rwx
default:group::---
default:mask::rwx
default:other::---

ACE, default y máscaras

Como se puede ver, esto puede ser es bastante mas complejo. Ya no tenemos la terna usuario/grupo/otros, sino que tenemos una lista de usuarios/grupos y luego el resto de los usuarios. Cada una de las lineas, que se identifica con un permiso se denomina “ACE” o “ACL Entry”. Estas ACE pueden referirse a “usuarios propietarios” o “usuarios nombrados”, siendo estos últimos los que se los nombra directamente en cada ACE, como por ejemplo:

user:user1:r-x # usuario nombrado "user1"
user::rwx # Usuarios propietario

En cualquier listado se puede observar el usuario propietario y  el grupo propietario, que se identifican con ACL mediante los ACE:

# ACE con los propietarios
user::rwx
group::---
other::---

Mientras que otros usuarios/grupos nombrados se pueden identificar mediante, en el siguiente listado, se puede ver los permisos del usuario “user1”, y del grupo “Administracion”:

# Entradas ACE con usuarios nombrados
user:user1:r-x
group:Administracion:rwx

Como podemos ver, cada permiso, viene caracterizado mediante 3 campos separados por “:”, algo tipo: “tipo:usuario:permiso”, donde el tipo pueden ser:

  • “u” o user, el permiso se aplica a un usuario
  • “g” o group, el permiso se aplica a un grupo
  • “o” u other, el permiso se aplica al resto de los usuarios que no aparezcan en ninguna entrada en la lista de permisos ACL.
  • “m” o mask, es una máscara de permiso. Se aplica sobre el permiso asignado a un usuario/grupo nombrado para obtener el permiso efectivo.

Otra peculiaridad a destacar, es el permiso que tiene la etiqueta “default”, como la siguiente:

default:user:user5:r-x

Esta entrada nos indica que todas las carpetas que se creen dentro de la carpeta que tiene este permiso, lo mismo que todos los ficheros que se creen, tendrán como permiso ACL heredado esta entrada, es decir, en este caso, el “user5” tendrá permiso de lectura y ejecución sobre todo lo que se cree dentro de esa carpeta.

Existe una entrada ACE que resulta muy curiosa, y es la entrada “mask“. Este entrada sólo afecta a los ACE nombrados, aquellos que tiene un usuarios o grupo en su entrada como ya explicamos, y que suelen cruzarse con los permisos que tengan los usuarios y grupos para generar permisos efectivos.

user:juan:rw- # el user1 tiene un permiso rw-
mask::r-x # Máscara con permisos r-x
# Permisos efectivos reales de user 1: r--

Modificando quien accede y quien no

Resulta que nos encontramos con dos comandos: chacl y setfacl. En casi todas la guías que leas el uso de chacl es prácticamente nulo, ya que todo el mundo usa setfacl (al parecer setfacl es mas completo, o simplemente gusta más que chacl). ¿Pero no decíamos que setfacl no modificaba los valores de los permisos?. Bueno, realmente si lo hace pero incluyendo un parámetro dentro del comando a ejecutar que nos permitirá tal posibilidad.

setfacl -m u:miuser:rwx /home/miuser/

Con estos comandos acabamos de dar permiso a “miuser” en la carpeta “/home/miuser/” para permiso de lectura, escritura y ejecución (en directorios significa poder listar su contenido). El parámetro “-m” significa modificar, lo que nos permite cambiar las ACL y incluir (o modificar) una ACE con el usuario y los permisos indicados.

setfacl -R -d -m u:miuser:rwx /home/miuser/

Como se había comentado antes en este artículo, existe una ACE que puede tener una etiqueta “default“, con este comando, podemos cambiar dicho permiso por defecto. Para ello, se usa el parámetro “-d“.
Como puedes ver, también se incluye la etiqueta “-R” que indica recursividad, es decir, que estos permisos que aplicarán al directorio y a todo el contenido de ficheros/directorios que albergue. No creo que tenga que avisaros que sepáis lo que hacéis cuando se usa un comando recursivo, ya que como metáis la pata vais a tener que andar limpiando por muchos sitios vuestro estropicio :).

Es muy importante en este comando, el tema de los errores. Al menos para mi, son bastante desconcertantes inicialmente ya que suelen generar errores bastante poco descriptivos del tipo:

nas001@nas001:~$ setfacl -m g:user1:rwx /var/log/messages
setfacl: Option -m: Argumento inválido near character 3

El error no esta en el parámetro “-m” (como parece que indica el error), si no en el usuario que se han incluido en el comando.
Fíjate bien, ya que pone una “g” de grupo delante de un usuario, por lo que nos da error, en el caracter 3, curiosamente donde empieza la palabra “user1“. Esto nos indica que el error esta en la terna de “tipo:id:permisos” que en el comando en sí.
Casi todo los errores son debidos a errores de este tipo. Avisado quedas 🙂

Borrando permisos

Tan importante como modificar los permisos, es eliminarlos de la lista de ACL. Si queremos eliminar un usuario, es cierto que podemos simplemente quitarle todos los permisos, pero seguirá apareciendo en la lista de ACL, con su ACE en el listado, lo que nos puede emborronar mucho y darlos listados muy largos y complejos de depurar (y os aseguro que algún día tendréis que mirarlos).

Para realizar una limpieza de permisos o como restaurarlos al defecto, habría que lanzar el siguiente comando (ojo que borra todos los permisos asignados dejando solo los que tenía por defecto):

setfacl -b -k -R directorio

Donde el comando “-b” borra los ACL y el “-k” los ACL por defecto o “defaults”.
Pero si queremos ser más selectivos y solo borrar un permiso en particular, es decir, quitar a un usuario/grupo y que no aparezca en el listado de permisos (pasa a usar los permisos de “other”), tendremos que usar el comando:

setfacl -x u:user1 /var/www

Este comando, eliminaría de los permisos a user1 en el directorio “/var/www”, y este usuario tendría que regirse por los permisos de “other” como ya hemos comentado anteriormente.

Referencias

  • “Using ACLs with Fedora Core 2”, Link.
  • “POSIX Access Control Lists on Linux”, Andreas Grünbacher SuSE Labs, Link.
  • “Uso de Listas de Control de Acceso (ACLs) en Linux”, Ignacio Arenaza Nuño, Proyecto escomposlinux.org, Link.
Please follow and like us:

¿Se equivoca Apple con sus iPod?

iPod Classic

iPod Classic

Hoy, he mirado a mi iPod Classic 6, y me he preguntado si le saco todo le partido posible. Es un trasto caro, es cierto que te da cierto “status” sobre el resto que tiene sus reproductores mp4 del chino, pero sin duda, esto no vale lo que cuesta… y encima, Apple cada poco tiempo te saca una revisión mínima (salvo algún cambio brutal como el iPod Nano, aunque no la última revisión) que precisamente no te anima a comprar más (para que… en 6 meses sacaran algo mejor o el cambio no justifica el comprar uno nuevo, muy parecido y caro).

Lo uso para oír música, ver series (previa conversión a mp4), y oír podcast. Bueno, en eso hay que reconocer que lo hace bien, pero sin duda el punto fuerte es sus 120 gigas de almacenamiento. Perfecto. Además le han metido los juegecitos, que no esta mal, pero que son realmente incómodos de usar salvo que estén muy pensado para usar con una rueda (tipo Arkanoid y poco más).
Me pongo a mirar por sus menus, y me encuentro con Calendario y Agenda… ¿Para que leches vale esto en un reproductor mp3?. ¿Alguien de verdad puede usar esto para algo?. Seamos sinceros, y si no tienes un Mac realmente la utilidad es nula, e incluso en el caso que lo tengas, no le veo mucha utilidad. Casi todo el mundo tiene un movil, y seguramente ese sea el sitio mas indicado para meter tus citas y tus contactos… pero, ¿en un reproductor mp3?.

¿Pero porqué no pensar en mejorar aun mas estos chismes?, ¿por qué Apple sigue en sus trece de no oír al consumidor?. Pero me refiero a cambiar realmente. No sacar la versión 5 del Classic, luego a las 6 meses la 5.5, la 6 poco después, y apenas tener cambios significativos (desde la versión 5 apenas hay cambios). ¿Que puede hacer a una persona cambiar de su iPod Classic 5 al 5.5 aparte de la capacidad?. Muchos de los cambios, son simplemente cambios de firmware o bien cosas que no han metido, porque, sencillamente, no han querido y lo han dejado bastante incompleto.

Creo que la gente grita: ¿Donde esta la radio?… ¿y soportar mas formatos que no sean mp4 para video?, y porque coño no dejar el iTunes de lado (de los peores programas que he tenido que usar por desgracia) y abrir a otros programas o simplemente usarlo como la mayoria de los reproductores, simplemente arrastrando. ¿Y porque, maldita sea, he tenido que tirar 2 iPod Nano que había muerto por su batería?, por dios, permitir cambiarlas sin tener que destrozar el puto iPod. ¿Porqué el iPod nano tiene radio y el resto no?, ¿y si le meten una cámara a este trasto, será tan ridículo como para solo poder grabar video y no dejar sacar fotos como con el Nano?. ¿Quizás quieran que nos pasemos todos a iTouch o iPhone?…

Apple tiene la “moda” de su parte, pero no creo que esté lo suficientemente consolidada como para hacer lo que le venga en gana (aunque muchos creen que Steve Jobs es un semi-dios) y menos no oír a los usuarios. ¿Para que leches quiere un mp4 un acelerometro?, si es muy “cool“, pero que puñetera utilidad tiene: ninguna, salvo fardar delante de tus amigos.

Desde luego no entiendo para nada a Apple. Y si, hoy menos que ningún día.

Please follow and like us:

Nuevos plugins para WordPress recomendados

No soy muy dado a meter nuevos plugins dentro de WordPress, o a meter a lo loco nuevas cosas, así que suelo meter las cosas después de echarles un vistazo y ver que la gente habla maravillas de ellas (no me vale con que hablen bien, necesito que sea muy bueno).

Después de hacer una pequeña limpia de plugins, actualizar otros pocos, me incluido unos nuevos en mi web, y os detallo cuales:

  • Simple Tags: Simplemente genial. El “autoetiquetar” que implementa nos sacará de muchos apuros, o al menos cuando no sabes que etiqueta poner a un comentario.
  • Subscribe to Comments: Me lo habían pedido y había estado mirando varios plugins, y al parecer este es el mejor para poder subscribirte y recibir un mail cuando haya un comentario nuevo en un post.
  • WP Ajax Edit Comments: Para poder permitir a los usuarios modificar sus post, en los primeros 5 minutos en que se publicó. También nos da muchas opciones para modificar cosas sin tener que ir al panel de administración.
Please follow and like us:

Battlestar Galactica, al fin en casa

Ya he recibido de Amazon mi pedido, donde esta la nueva joya de la corona, una edición “Ultimate Edition” en DVD, de las series completas de Battlestar Galactica.

 

Caja de la edición Ultimate Edition

Caja de la edición Ultimate Edition

Para los que no dominéis el ingles, esta no es tu edición ya que no trae ni subtítulos ni audio en castellano (aunque en Amazon inicialmente indicaba que si los tenia), así que si no entiendes bien este idioma, tendrás que pedir la versión Bluray que tiene subtítulos en castellano.

 

Contenido de la edición

Contenido de la edición

Please follow and like us:

Ocultar elementos “Button” con Javascript

Os adjunto una funcionilla que muestra sólo un botón cuando se seleccionan elementos de un “ListBox“. Cuando solo hay un elemento seleccionado se muestra el botón “btnUNO” y cuando se seleccionan varios “btnVarios“. Esto está hecho con la intención de mostrar diferentes botones con diferentes funcionalidades para cada una de las posibilidades. Al estar hecho con javascript, no hace falta recargar, por lo que se puede hacer casi invisible al usuario.

function ItemsSeleccionados()
	{
            // lb es el listbox que vamos a controlar
	    var lb = document.getElementById("lbZonas");
	    var optLength = lb.options.length;
	    var nselec = 0;

	    if (lb != null)
	    {
	        for(var i=0;i<optLength;i++){
                if(lb.options[i].selected)
                    nselec++;
            }

            // Si solo dejo btnUNO, sino btnVarios
            var btnUNO = document.getElementById("btnSelZona");
            var btnVarios = document.getElementById("btnSelZona2");
            if (nselec > 1)
            {
                btnUNO.style.visibility  = 'hidden'; // No se ve
                btnUNO.style.display = 'none'; // No ocupa espacio
                btnVarios.style.visibility  = 'visible'; // Se ve
                btnVarios.style.display = ''; // Se muestra por defecto
            }
            else
            {
                btnUNO.style.visibility  = 'visible';
                btnUNO.style.display = '';
                btnVarios.style.visibility  = 'hidden';
                btnVarios.style.display = 'none';
            }
	    }
	}

Cómo habréis notado, no hace falta cambiar “visibility” (oculta el control, pero ocupa espacio) en el estilo si se toca el “display” (se elimina de los controles y no ocupa espacio), pero lo he dejado para ver las diferentes cosas que se pueden hacer.

Please follow and like us: