spanish developers community

Page 1

año 0 ­ núm 3 agosto 2013


Buzon del lector

pestaña. 4. Para personalizar una pestaña con una imagen: Wildfire's iFrames for Page. Es una herramienta muy sencilla y, a diferencia de la anterior, permite también la posibilidad de realizar Fan Gate, esto es, insertar contenido exlusivo para los que son fan.

de los que ya lo han hecho e, incluso, las entradas en la sección de últimas noticias, tan sólo tenemos que configurar los siguientes parámetros: Facebook page ID, width y una serie de parámetros varios. En el primer parámetro tan sólo tendremos que poner la dirección URL de nuestra página web, ¿fácil no?, con sólo copiar y pegar ya lo tenemos hecho.

5. Para organizar un concurso: Easy Promos. Esta es quizás la única herramienta en la que la versión completa es de pago, pero está especialmente indicada para la realización de promos y concursos.

A continuación tendremos que especificar el ancho y alto del cuadro en pixeles. En función del espacio que tengamos disponible en nuestra página web, así introduciremos nuestros valores.

spanishdevcommunity@gmail.co m

6. Para integrar el website de la marca: Cool Tabs. Permte añadir el website de la marca de una manera tan simple como escribir su URL.

o bien, podéis dejar vuestras cuestiones en cualquiera de las redes sociales que tenéis a vuestra disposición:

7. Para reconocer al fan más activo: Fan of the Week. Selecciona automáticamente, cada semana, al fan que más ha interactuado con la página mediante comentarios. El elegido aparece con la foto que figura en su perfil y su nombre junto con un mensaje que anima al resto a participar.

En cuanto a los parámetros que nos solicitan para terminar de configurar, se nos pedirá mediante checkbox si queremos mostrar o no la cabecera de la página web, si queremos o no mostrar las fotografias de los que ya han pulsado like en nuestra página. Con show stream especificaremos si queremos o no que se nos incluya las entradas de nuestra sección "últimas noticias" de nuestra página. Y por último, con "show border" especificaremos si queremos que se muestre o no una línea alrededor del cuadro.

facebook /spanishdeveloperscommunity twitter @spanishdc

8. Para retransmitir un evento en directo: Live Stream. Muy recomendable cuando el objetivo que se plantea es emitir eventos en directo mediante streaming, bien sea a través de una webcam, bien con una cámara.

Por último solo tenemos que pulsar en el botón "get code" que aparece abajo y obtendremos un código que nada más pegaremos en el interior del div de nuestra página web y ¡ya esta!.

9. Para promocionar una banda musical: Herzio. Ofrece a artistas la posibilidad de promocionarse y distribuir música generando ingresos de una forma sencilla. Permite integrar un FanStore para que el músico venda merchandising sin invertir ni un sólo euro. También permite esta aplicación vender entradas para conciertos. Además esta herramienta tiene un caracter totalmente gratuito.

Cómo integrar nuestra página facebook en nuestro blog wordpress.

Para insertar un cuadro "like box" en nuestro blog wordpress tendremos que seguir los sigientes pasos: en este caso tendremos que hechar mano de los numerosos plugin disponibles de forma gratuita en Internet. Vamos a detallar tres de ellos:

10. Para integrar una tienda de f­commerce: Social Buy. Aplicación impulsada por una empresa catalana, esta aplicación brinda una opción de comercio electrónico que incluye un sistema de analíticas con datos demográficos y segmentación de gustos e intereses. Tan sólo es necesario una cuenta de paypal y registrarse en la aplicación. Esta aplicación ofrece dos versiones una gratuita y otra de pago, la primera permite crear una tienda con un máximo de 10 artículos y un máximo de 2000 usuarios sociales.

1. Facebooks comments for wordpress. Este plugin implementa los comentarios de facebook de manera fácil, siguiendo unas instrucciones, y sin necesidad de entrar en facebook para su configuración.

Cualquier consulta la podéis realizar a través de nuestro correo electrónico:

Una seguidora de nuestra página de facebook nos pregunta cómo personalizar las pestañas de su página para agregar nuevos contenidos. En nuestras páginas de facebook se pueden agregar hasta 12 pestañas, aunque dos de ellas ya están asignadas por defecto y ocupan el primer lugar: una de ellas dedicada a las fotografías y la segunda una pequeña estadística a propósito del número de fans y las personas que están hablando de ello. Pero, ¿y qué hay de las 10 restantes?. En respuesta a la pregunta de nuestra seguidora, vamos a indicar una serie de aplicaciones, la mayoría de ellas de carácter gratuito que podrá emplear para personalizar su página de facebook de una forma muy sencilla y sin apenas conocimientos de programación. 1. Para integrar un formulario de contacto: Contact Tab. Es una forma sencilla de incorporar un formulario a nuestra página. Se puede incluir la descripción de la empresa, teléfono, correo electrónico, enlaces, ubicación en un mapa y ¡como no! un formulario preestablecido. 2. Para incorporar pestañas personalizadas: Static HTML for pages. Para usar esta herramienta no son necesarios conocimientos previos de programación, tan sólo basta con copiar el código fuente e ir siguiendo las instrucciones que la herramienta te va sugiriendo. 3. Para incluir un canal de youtube: Youtube for pages. Una herramienta que inserta de forma automática vídeos del canal de YouTube, perimitiendo destacar el último video subido y personalizar la imagen de la

2

Cómo integrar nuestras página de facebook en nuestras páginas web y también en nuestros blog.

Es frecuente encontrar en las páginas web de las empresas y de los blog, especialmente corporativos, un cuadro o una serie de enlaces hacia nuestra página de facebook o de twitter pero, ¿cómo hacerlo de una manera sencilla?. Para empezar, en el caso de una página web, necesitamos un espacio en donde integrarla, para ello, en el momento de diseño recomiendo el uso de div's con sus respectivas propiedades de css. A continuación, en nuestro navegador favorito nos iremos a la dirección URL http://developers.facebook.com/plugins; en ésta página encontraremos las numerosas opciones que facebook nos facilita para integrar distintos tipos de enlaces en nuestro site. En el caso de un "like box" que muestra en nuestra página web un cuadro con la posibilidad de pulsar like en nuestra página, ver algunos

de

Una vez que los descarges y lo subas en la carpeta wp­content/pluging de wordpress se puede escoger el estilo. También tiene una opción de notificación por correo electrónico cada vez que un usuario publique un comentario. 2. Facebook Like box. Esta es la forma más fácil de mostrar la página de fans de Facebook en tu sitio. Se hace a través de la página de configuración del widget de Facebook o, bien, acudir a la página oficial de plugin de wordpress en donde te podrás descargar de forma gratuita un plugin e instalarlo a través del escritorio de tu blog y configurarlo de forma identica a como hemos descrito anteriormente para el caso de tu web. 3. Simple facebook connect. Este es el más completo de los plugin que permite incluso que los lectores de tu blog puedan acceder con su cuenta de Facebook para publicar contenido en tu página o dejar comentarios en tus artículos del blog. Es posible insertar albunes de fotos en tu blog.

© 2013 - www.spanishdeveloperscommunity.es


Cómo realizar operaciones bancarias seguras a través del teléfono móvil. Nuestros smartphones se están convirtiendo en una piedra angular en nuestra vida diaria, de forma que, a través de ellos podemos realizar las más variadas operaciones, desde compra online hasta transacciones bancarias, dejando así de lado el uso de la computadora a la cuál nos veíamos atados para estas operaciones no hace mucho tiempo o, simplemente, personarse en estas entidades de crédito. Sin duda esta es una gran ventaja que nos hace la vida más cómoda, pero, como todo en esta vida, siguen apareciendo inconvenientes sobre todo en el plano de la seguridad. ¿Podemos afirmar categóricamente que no existe ningún riesgo a la hora de realizar cualquier operación bancaria a través del móvil?. Lamentablemente y en mi opinión, la respuesta es un rotundo no. Lamentablemente encontramos diariamente la aparición de malware que puede socavar cuando © 2013 - www.spanishdeveloperscommunity.es

no violar directamente esta seguridad. No obstante, no todo está perdido. Siguiendo unas básicas medidas de seguridad, podemos sortear estos peligros y acercarnos cada día al llamado smartphone banking y realizar todo tipo de operaciones bancarias desde nuestro móvil sin que ello afecte a nuestro bolsillo. Muchas, sino la mayoría, de las entidades bancarias tienen sus propias aplicaciones que nos permiten realizar operaciones rutinarias, desde consultar nuestro saldo hasta realizar transferencias a otras cuentas, entre otras cosas. Normalmente para tener acceso a estas aplicaciones se nos piden datos personales tales como nuestro documento nacional de identidad y una clave telefónica con bastantes garantías de seguridad. Pero

3


¿qué podemos hacer para mejorar estas medidas básicas de seguridad y hacer nuestras comunicaciones casi inviolables?. Seguramente la indolencia en las medidas de seguridad que algunos usuarios deberían tomar conducen directamente al desastre y eso no es culpa màs que del dueño de móvil. Sin embargo, con algunos de los consejos que enumeraremos a continuación, sin duda, mejoraremos mucho nuestras operaciones sin poner en riesgo ni nuestra información privada ni mucho menos nuestro dinero.

Tengamos en cuenta, por ejemplo, que sería conveniente evitar las redes Wifi para realizar este tipo de operaciones. De todos es sabido que podemos operar en Internet a través de nuestra conexión propia que contratamos con nuestra compañía de telefonía, o bien, a través de cualquier red wifi que esté abierta o de la que dispongamos passwd. Para éste tipo de operaciones sería conveniente utilizar la primera opción que, aunque en la mayoría de las ocasiones no naveguen en el ancho de banda prometido por nuestra compañia, al menos nos proveen de mayor seguridad que en el caso de las conexiones wifi ajenas en las que Para conseguir el objetivo de tener un móvil seguro, en general, la seguridad no será tan buena como cabria esperar y en la que deberemos seguir unas pautas básicas para ganar en seguridad: tendríamos que evitar cualquier operación relacionada con nuestro banco. uso de contraseñas. tanto en android como en ios, encontramos la posibilidad de asignar un pin al equipo para que sólamente el En segundo lugar, la seguridad de nuestro smartphone también es usuario legal pueda acceder. Esto es útil en caso de perdida o muy importante. Cierto es que las vulnerabilidades en equipos robo. Sin embargo, hemos de tener cuidado con las contraseñas dotados con iOS no son tan abundantes como las que se puede que ponemos, especialmente que no aludan a nada significativo encontrar en Android ( un punto para el sistema de iPHONE ) en nuestra vida y que cualquier hacker más o menos habilidoso nunca está de más tomar más precauciones de la cuenta. En pudiera encontrar con un poco de investigación. Dejar el móvil Android, por ejemplo, se puede contar con la participación de un desprotegido de contraseña, especialmente en caso de robo, antivirus y, aún cuando existen versiones de un precio bastante supone un riesgo que sólo los más ingenuos están dispuestos a abultado, hay disponible en Google Play disponible muchas correr. opciones de un precio mucho más económico e incluso gratuitas que pueden evitar el concurso de software malintencionado que fundamental cerrar la sesión una vez que terminemos. a más de pueda dañar o incluso inutilizar nuestro equipo. Siempre, sin uno se le ha pasado cerrar la sesión de la aplicación una vez embargo, hay que evitar cualquier aplicación que no esté hubo terminado todas las operaciones en su banco o caja. disponible dentro del espacio ofrecido por Google Play. Cualquier hacker con un poco de habilidad podría romper la seguridad de nuestra conexión wifi, y es fácil hacerlo por Es necesario recordar que siempre podemos seguir una serie de desgracia, y tener acceso libre a nuestra cuenta bancaria. Lo que consejos prácticos a la hora de descargar aplicaciones en nuestro suceda después es cuestión de imaginarselo. móvil de forma segura. Por ejemplo, descargar de fuentes seguras, leer los comentarios de otros usuarios y no otorgar los descargar una aplicación anti­robo. Tanto Android Device permisos que no sean necesarios. En el caso de aplicaciones para Manager como Fin my IP­hone serían aplicaciones válidas. transacciones en el banco, es necesario asegurarse de que sea la Cada aplicación que nos permita borrar todo a remoto de una aplicación oficial. Las claves que usemos para estas aplicaciones forma simple, también en caso de perdida o de robo, es no deben ser iguales que para la que usamos en nuestro cajero o invaluable para nuestra seguridad. en el móvil. Éstos son unos conceptos muy básicos y, precisamente por esto, no debemos olvidarlos ni perderlos de vista nunca. Vamos a tener oportunidad en artículos posteriores de mejorar la seguridad en nuestras transacciones con medidas de seguridad más sofisticadas.

Podéis encontrar más consejos para utilizar aplicaciones bancarias en el blog de bitelia. Seguramente alguna más aunque en este articulo encontraréis las principales que podrán garantizar la seguridad en vuestro teléfono móvil.

A continuación, hablamos sobre la seguridad necesaria a tener en cuenta cuando realizamos transacciones comerciales a través de nuestro dispositivo móvil, más concretamente cuando éstas se refieren a cuestiones relacionadas con entidades bancarias. No obstante, en ocasiones no son suficientes y hay que tener en cuenta otras consideraciones de mayor alcance.

4

© 2013 - www.spanishdeveloperscommunity.es



ÍNDICE

CONTENIDOS PRINCIPALES 01. Editorial 02. Cómo realizar operaciones bancarias seguras a través del teléfono móvil 03. Uso de paquetes RPM en linux 04. Implementar thread en Java 05. La comunicación como código abierto 06. Envio de pings a host remotos 07. Instalar la actualización de ubuntu 13.04 08. Virtualización de sistemas operativos 09. Introducción al lenguaje de programación ruby 11. Gestión de redes sociales 12. La metamorfosis del marketing: social media 13. Riesgos que hay que evitar en el desarrollo freelance de apps

14. Implementar menus en android 15. Creación de contenido 16. Estructura de datos Cola en C 17. Trucos para mejorar nuestra red inhalambrica

Acerca de Spanish

Developers Community es una iniciativa sin ánimo de lucro, dedicada al fomento y difusión del software basado en licencias GPL, Programación de lenguajes de programación, Sistemas Operativos Linux / Android e iOS así como diseño gráfico y redes sociales. Alcanzar nuestro objetivo de una función docente y con la intención de que estos conocimientos puedan aplicarse de una manera práctica en las actividades cotidianas de los estudiantes universitarios, empresarios y autónomos . Spanish developers community se basa en la colaboración desinteresada de profesionales y estudiantes que comparten sus saber­hacer, sus conocimientos teóricos y prácticos con la comunidad informática en Internet. Esta publicación digital se distribuye mensualmente bajo una licencia Creative Commons

Colabora ¿Quieres colaborar con Spanish Developers Community?. Tienes muchas formas de hacerlo:

Envía tu artículo Puedes enviarnos tu artículo a la dirección de correo electrónico:

spanishdevcommunity@gmail.com Colabora en nuestros proyectos Puedes

ayudarnos en los proyectos de canal de youtube, blogs, página web, redes sociales y página web.

responsable del proyecto: Antonio García Prats coordinación y comunicación: Antonio García & Jerobén Guzmán sitio web: www.spanishdeveloperscommunity.es facebook: www.facebook.com/spanishdeveloperscommunity.es twitter: @spanishdc google+: @spanishdc diseño de portada: Antonio García 6

Contactar Puedes contactar conmigo para enviarnos cualquier duda que tengas en el correo electrónico:

antoniogarciaprats@gmail.com

Depósito Legal J 368­2013 © 2013 - www.spanishdeveloperscommunity.es


Editorial

Pues ya estamos llegando al punto final del verano, y con éste llega la 3º edición de esta revista que aunque tenga muy poco tiempo de vida, ya ha tenido que pasar por varios desafíos importantes, desafíos que ha superado con éxito. Es cierto, que aunque estoy desde el principio colaborando con esta comunidad, por motivos de trabajo no he podido estar todo lo que me gustaría. Eso sí, desde el primer día que acepte la invitación de Antonio para participar en ésta, me siento arropada por ellos, una pequeña familia que se conoce de forma virtual pero que conecta a las mil maravillas, para poder transmitir todos los meses parte de sus conocimientos al resto de lectores. Pero esta familia no queda aquí, no tiene un número limitado de personas, al contrario, queremos ser más, crecer y no hacerlo sólo en número sino también en conocimientos. Queremos que está revista sea punto de encuentro de todos los que hablan de programación, redes, marketing… y de los que no conocen estos términos tanto. Pero también punto de unión de profesionales que aprenden y transmiten sus conocimientos gracias a esta comunidad. Para ello y desde estas líneas os invito a que todos los que estéis interesados en participar, os pongáis en contacto con nosotros a través de nuestra web: www.spanishdevelopercommunity.com o las diferentes redes sociales en las que nos encontramos. Podéis encontrar el área de conocimiento del que aún no hemos hablado y escribir todo lo que queráis sobre él, o simplemente elegir un tema y escribir, si se solapa con algún área que otro colaborar este tocando no tengáis problema, dos o más opiniones sobre un mismo tema también es bueno. Y cómo no lo sabemos todo sobre todo, no tengáis miedo en escribir vuestras opiniones y/o comentarios sobre artículos ya lanzados, como he dicho anteriormente, todos aprendemos de todos.

Ángela Escobar

© 2013 - www.spanishdeveloperscommunity.es

7


Linux

Uso de paquetes RPM en linux

Los sistemas basados en Linux se definen, al menos en gran medida, por la colección de programas que ejecutan alrededor del nucleo. Mucha de la actividad cotidiana en este sistema operativo se basa en la instalación y/o modificación de estos paquetes de software. En éste artículo, aprenderemos a manejar una de las dos principales herramientas de administración de paquetes linux: los paquetes RPM. Antes de comenzar, debemos conocer algunos principios básicos de las herramientas de administración de paquetes. Normalmente, un programa puede basarse en otros programas, obien, tener librerías comunes. La base común en la que se cimentarán todo el software será el kernel de linux. esto provee de una especial estabilidad al sistema, pudiendo sustituirse un programa por otro y ahorrando bastante espacio en el sistema, pero, como arma de doble filo, si no se trata con cuidado, también puede provocar que se derrumbe todo el edificio de software.

comprimidos. Una vez que los hemos instalado en nuestro sistema, la mayoría de estos paquetes constan de docenas o cientos de archivos y el sistema de paquetes que los controla todos. Los paquetes, además, incluyen datos adicionales que ayudan en las tareas de los sistemas de administración de paquetes: bases de datos de los archivos instalados. Estos sistemas mantienen una base de datos de archivos instalados, que entre otra información, incluye todos los instalados a través del sistema de paquetes, el nombre del paquete e información adicional variada. dependencias. Es uno de los tipos de información más importantes y consiste en los requisitos mútuos de los paquetes.

sumas de control. El sistema de paquetes mantiene sumas de control e información accesoria diversa sobre los archivos. Esta información se puede utilizar para verificar la validez del Las herramientas que administran éstos paquetes de linux están software instalado. Realmente está pensada para localizar errores concebidas, en principio, para minimizar éste problema haciendo de disco como sobreescrituras accidentales y otros problemas de un seguimiento de los programas instalados y almacenando toda mayor o menor importancia. esta información para que, de este modo, se puedan evitar actualizaciones y desinstalación. Al seguir el rastro de archivos futuros problemas. y dependencias, los sistemas de paquetes permiten que se puedan Un paquete es una información más básica de estos sistemas de actualizar y desinstalar fácilmente, evitando que estas software compuesto por colecciones de archivos que se instalan operaciones puedan generar problemas de desestabilicen el en el ordenador, distribuyendose habitualmente como ficheros sistema.

8

© 2013 - www.spanishdeveloperscommunity.es


creacción de paquetes binarios. Tanto los sistemas de paquetes RPM como los debian proporcionan herramientas para ayudar a crear paquetes binarios a partir del código fuente. Esta función es particularmente útil si ejecuta Linux sobre una CPU peculiar; puede crear el código fuente y crear un paquete binario, incluso aunque los desarrolladores no ofrezcan un soporte específico para su CPU.

número de versión: El segundo componente correspondiente a las letras a.b.c del ejemplo anterior, es el número de versión del paquete. El autor del paquete es quien, generalmente, asigna este número de versión.

número de compilación: Correspondiente a la letra x del ejemplo anterior, es el número de compilación y representa los cambios menores realizados por el responsable que mantiene el Tanto los sistemas de paquetes Debian como RPM proporcionan paquete, no por el autor del programa. Estos cambios suelen ser todas estas funciones, aunque también es verdad que los detalles script de inicio o archivos de configuración modificados .. etc. que atañen a su funcionamiento difieren. Estos sistemas son incompatibles el uno con el otro, en el sentido de que sus arquitectura: El componente final que precede a la extensión es archivos de paquete y sus bases de datos de archivos instalados un código de la arquitectura del paquete. La arquitectura i386 es son diferentes la más común y representa a cualquier archivo compilado para Uso de RPM cualquier CPU x86. El administrados de paquetes más popular es RPM. Está disponible para las más populares distribuciones de linux y Normalmente debería esperarse que cualquier paquete RPM se proporciona todas las herramientas básicas descritas en la instalara y ejecutara en cualquier distribución de tipo RPM que sección anterior sobre conceptos de paquetes como, por ejemplo, empleara un tipo de CPU apropiado. Lamentablemente, de vez una base de datos para identificar los posibles conflictos y la en cuando, pueden surgir problemas de compatibilidad, entre los propiedad de archivos concretos. que se pueden enumerar: Éste administrador de paquetes fue desarrollado por Red Hat para su propia distribución, pero publicó el software bajo GPL, por lo que se permitió que terceros programadores pudieran utilizarlo libremente en sus distribuciones, y fue lo que acabó pasando. RPM es una herramienta independiente de las plataformas y, por regla general, admite cualquier arquitectura de CPU. La convención para nombrar paquetes RPM es la siguiente:

­ Las distribuciones pueden utilizar diferentes versiones de las utilidades RPM. Esto puede impedir que un RPM de una distribución se utilice en otra. ­ Los paquetes RPM diseñados para una distribución pueden tener dependencias que no se satisfacen en otra distribución. Generalmente, este problema se solventa instalando o actualizando el paquete del que se depende pero, en ocasiones, origina problemas debido a que la actualización, a su vez, afecta a otros paquetes.

­ Un paquete RPM puede depender de un paquete con un nombre particular, pero si la distribución que utiliza ha llamado al Cada componente del nombre de archivo posee un significado paquete de manera diferente, se pueden generar objeciones a la específico: hora de instalarlo. nombre-paquete-a.b.c-x.arq.rpm

nombre del paquete: El primer componente es el nombre del paquete. Hay que tener en cuenta que el mismo programa puede recibir diferentes nombres de paquete en función de quién mantenga la distribución. © 2013 - www.spanishdeveloperscommunity.es

­ A pesar de que parezca satisfacerse una dependencia, las distintas distribuciones pueden incluir archivos ligeramente distintos en sus paquetes. Es por esto que un paquete creado para una distribución no funciones de manera correcta en otra distinta.

9


Artículo de portada

El principal programa de utilidades de RPM es conocido como mezclar y combinar demasiado; puede acabar con un revoltijo de rpm. Utilice este programa para instalar o actualizar cualquier paquetes en conflicto dificil de manejar. paquete que tenga o quiera tener en su sistema Linux, siempre desde la consola. El comando rpm posee la siguiente sintaxis: Comparados con los tarball, los RPM ofrecen herramientas de administración de paquetes más sofisticadas. Esto puede ser rpm [operacion] [opciones] nombre -es del paquete importante cuando actualiza o elimina paquetes, y también para verificar la integridad de los paquetes instalados. Por otra parte, Las tablas de la página siguiente muestras las operaciones y aunque los RPM son habituales en el mundo Linux, son menos opciones más habituales. No obstante, debemos ser conscientes comunes en otras plataformas. Por ello, es probable que de que ésta es una herramienta bastante compleja, por lo que éste encuentre tarball de código fuente Unix genérico y es preferible listado sólo comprende las opciones/operaciones más usadas en emplear tarball si escribe un programa que tiene pensado los sistemas Linux; así, si queremos encontrar más opciones distribuir en otras plataformas. deberemos acudir a la página de ayuda oficial que proporciona nuestro sistema En el caso de las distribuciones linux. Allí encontraremos otras que Ubuntu / Mint, éstas sólo admiten habitualmente son más usadas por los paquetes Debian, no obstante, si desarrolladores que por los usuarios. disponemos de algún tipo de paquete rpm también lo podemos A la hora de enumerar los paquetes a instalar en éstas distribuciones. Para instalar podemos instalarlos de uno en llevar a cabo esta operación, primero uno o, por el contrario, podemos tenemos que convertir un paquete proporcionar a este programa una lista rpm en uno Debian. de paquetes separados por espacios en blanco. Esta opción será muy habitual El programa utilizado para ello se y recomendada cuando procesamos a denomina alien. Lo que debemos de desinstalar varios paquetes, con tener siempre claro es que una vez algunas dependencias unos de los terminado el proceso, no siempre otros. tendremos éxito, pues podemos encontrarnos con la desagradable Habrá ocasiones en las que desee extraer datos de los RPM sin sorpresa de que al final no nos funcione, y es algo más corriente instalar el pauete. Un ejemplo de ello puede ser lo apropiado de lo que cabria esperar, debido sin duda a que no encontremos para recuperar el código fuente original de un RPM para archivos con los que se debería de haber creado dependencias. compilar el software sin la ayuda de las herramientas RPMo para obtener las fuentes u otra información que no sea del programa Primero instalaremos el paquete alien, lo cual lo conseguimos para utilizarla en un sistema que no sea RPM. desde la ventana de la consola con la siguiente instrucción: RPM es un sistema de administración de paquetes muy flexible. sudo apt-get install alien dpkg-dev buildEn la mayría de los aspectos, es comparable al administrador de essential debhelper paquetes de Debian, tema que sin duda veremos en otra edición de esta revista, y ofrece muchas más funcionalidades que los Ahora pasamos a convertir los ficheros de tipo RPM a Debian tarball. Cuando se comparan con los paquetes Debian, la usando el siguiente comando ( evidentemente es un comando principal virtud de los RPM es, probablemente, su genérico y deberá sustituir lo que proceda en su caso ): omnipresencia. Los desarrolladores y mantenedores de distribuciones tienen disponibles muchos paquetes de software sudo alien packagename.rpm en forma de RPM. Por último, para instalar el paquete deb en nuestro sistema El hecho de que haya muchas distribuciones basadas en RPM escribiremos el comando siguiente: puede ser una ventaja. Puede que consiga utilizar RPM pensado para una distribución en otra, aunque como indicamos unas sudo dpkg-i packagename. deb líneas más arriba, esto en ocasiones no es nada seguro. De hecho, esta ventaja se puede convertir en inconveniente si intenta

10

© 2013 - www.spanishdeveloperscommunity.es


Operaciones más comunes de RPM Opción ­i

Descripción instala un paquete; el sistema no debe contener otro paquete con el mismo nombre.

­U

instala un nuevo paquete o actualiza uno existente

­F

actualiza un paquete sólo si ya existe una versión anterior

­V

Verifica un paquete; comprueba si sus archivos están presentes y no han cambiado desde la instalación

­e

desinstala un paquete

­b

crea un paquete binario, dados el código fuente y los archivos de configuración; se ha pasado al probrama rpmbuild con la versión 4.2 de RPM

­rebuilddb

vuelve a generar la base de datos de RPM para corregir errores.

Opciones más comunes de RPM Opción

Se utiliza con Descripción

­root dir

Todas

Modifica el sistema de Linux para que tenga un directorio raiz en dir. Esta opción se puede utilizar para mantener diferenciada una instalación de linux de otra.

­­force

­i,­U,­F

Fuerza la instalación de un paquete incluso cuando ello signifique sobreescribir archivos o paquetes existentes.

­h

­i,­U,­F

Muestra una serie de almohadillas (#) para indicar el progreso de la operación.

­v

­i,­U,­F,­e

Especifíca que no se realizarán comprobaciones de dependencia. Instala o elimina el paquete incluso aunque dependa de un paquete o archivo que no está presente o que es requerido por un paquete que no se va a desinstalar.

­­test

­i,­U,­F

Verifica las dependencias, conflictos y otros problemas sin instalar realmente el paquete.

­­prefix ruta

­i,­U,­F

Asigna ruta como directorio de instalación (sólo funciona en algunos paquetes).

­a ó ­­all

­q,­V

Consulta o verifica todos los paquetes.

­F archivo

­q,­V

Consulta o verifica todos los paquetes a los que pertenece el archivo.

­p archivo

­q

Consulta el archivo RPM desinstalado.

­i

­q

Muestra la información del paquete, incluyendo el mantenedor del paquete, una breve descripción, ... etc.

­R

­q

Muestra los paquetes y archivos de los que depende éste.

­i

­q

Muestra los archivos incluidos en el paquete.

© 2013 - www.spanishdeveloperscommunity.es

11


Programación Java

Implementar thread en java Antonio García www.ibidem­network.es

/antgarprats @antgprats

Normalmente no se suelen realizar programas lineales, esto es, que las líneas de código se ejecuten una tras otra. En muchos tipos de programas en los que exista la posibilidad de que diferentes porciones de código se ejecuten de forma paralela. Un ejemplo típico de esto es como funcionan los programas servidores (un server). Éste es un programa que, de forma continua, está esperando recibir la conexión de un cliente. Cuando éste se conecta se establece una comunicación entre ambos y luego de llamemoslo un "dialogo" en el cuál el cliente le explica lo que necesita y el servidor se lo provee y así finaliza la comunicación y el server queda liberado para atender al próximo cliente.

Cada uno de éstos fragmentos se denomina thread ( o "hilo" en español ). Un thread es un proceso que ha sido lanzado desde otro proceso ( el programa ) y que ejecutará una secuencia de acciones concurrentemente a la ejecución del programa que lo lanzó.

como podemos entrar en la cofiguración del router

En Java thread es una clase que extiende a la clase base Thread, de la cuál hereda del método run. Este método es secuencial y es allí donde debemos programar la tarea que queremos que nuestro hilo lleve a cabo.

Para ilustrar esta idea, vamos a ver un ejemplo que hace dos cosas: duerme una cantidad aleatoria de tiempo y, al despertar, Con éste nuevo sistema, la gestión resulta mucho más eficiente, escribe en la pantalla el nombre que recibió como parámetro en la probabilidad de que se forme una gran cola es mucho menor y, el constructor y muestra el tiempo, en segundos, que ha estado en el caso de formarse, el tiempo de espera disminuirá durmiendo. Veamos: considerablemente.

12

© 2013 - www.spanishdeveloperscommunity.es


Listado 1 package es.thread.ejemplo;

public class thread extends Thread { private String nombre; public thread ( String nombre ) { this.nombre = nombre; }

public void run ( ) { try { int x = (int) (Math.rabdom()*5000); Thread.sleep ( x ); System.out.println ("Soy: "+nombre+" ("+x+" )"); } catch ( Exception ex ) { ex.printStackTrace (); } }

public static void main ( String[] args ) { DemoThread t1 = new DemoThread ("Pedro"); DemoThread t2 = new DemoThread ("Antonio"); DemoThread t3 = new DemoThread ("Juan"); t1.start (); t2.start ();

}

t3.start ();

la interface runnable

try {

La clase Thread implementa la clase Runnable de quién hereda el método run. A veces es conveniente no heredar o extender de la clase Thread puesto que con ello se pierde la posibilidad de extender otro objeto. Esta es una de las razones por la que existe ésta interfaz que, como hemos dicho, tan sólo declara un método y que se puede usar fácilmente para crear hilos trabajadores.

for(;;) { System.out.print(word+" "); Thread.sleep(delay); } } catch(InterruptedException e) { return; } }

class RunPingPONG implements Runnable { private String word;

public static void main(String[] args) {

private int delay;

Runnable ping = new RunPingPONG("ping", 40); Runnable PONG = new RunPingPONG("PONG", 50);

RunPingPONG(String whatToSay, int delayTime) {

new Thread(ping).start();

word =whatToSay;

new Thread(PONG).start();

delay=delayTime; }

} } public void run() {

© 2013 - www.spanishdeveloperscommunity.es

13


Existe cuatro constructores para crear hilos usando la interfaz runnable:

}

Crear el servicio con Service() lanza un nuevo hilo que actua sobre una cola para realizar su trabajo con cada tarea que ­ public Thread(Runnable target) así lo usamos en el encuentra ahí. El trabajo por hacer se encuentra en el método ejemplo arriba, se pasa solamente la implementación de la privado realService(). Una nueva tarea se puede añadir a interfaz Runnable. la cola con AddJob(...).

ciclo de vida de un thread

­ public Thread(Runnable target, String name) se pasa Un thread desde que es instanciado y ejecutado, pasa por adicionalmente un nombre para el hilo. ­ public Thread(ThreadGroup group, Runnable target)

construye un hilo dentro de un grupo de hilos. ­ public Thread(ThreadGroup group, Runnable

target,

String

name)

construye un hilo con nombre dentro de un grupo de hilos. La interfaz runnable exige sólamente el método run(), sin embargo, normalmente se implementan más métodos para crear un diferentes estados hasta que finalmente muere. A la transición entre ambos estados, se la denomina ciclo de vida del thread, que servicio completo que éste hilo debe cumplir. podemos identificar los siguientes estados: Aunque no hemos guardado las referencias de los hilos en unas variables, los hilos no caen en las manos del recolector de Cuando definimos e instaciamos un thread decimos que está en memoria: siempre se mantiene una referencia al hilo en su grupo estado "creado". Cuando le invocamos su método start, para automáticamente al estado preparado o ready. Esl paso entre este al cuál pertenece. estado y el estado running lo administra un proc eso del sistema El método run() es público y en muchos casos, implementando operativo: el scheduler, o también puede suceder que el mismo algún tipo de servicio, no se quiere dar permiso a otros ejecutar thread ceda el uso del procesador invocando el método yield. directamente el método run (). Para evitar esto se puede Estando en running ( es decir haciendo el uso del procesador ) el thread puede llegar a ejecutar la última línea de código de su recurrir a la siguiente construcción: método run con lo cual finaliza su tarea y muere pasando al estado muerto o dead. También, estando en running puede class Service { ejecutar una operación de entrada/salida o ejecutar los métodos private Queue requests = new Queue(); wait o sleep. En cualquiera de estos casos, pasará al estado public Service() { bloqueado "blocked" y solo saldrá de ese estado dependiendo de Runnable service = new Runnable() { las siguientes situaciones: public void run() { for(;;) realService((Job)requests.take()); } }; new Thread(service).start(); } public void AddJob(Job job) { requests.add(job); } private void realService(Job job) { // do the real work }

14

­ si entró por que ejecutó el método wait, entonces saldrá cuando otro thread ejecute el método notify o notifyAll. ­ Si entró por que ejecutó el método sleep, entonces saldrá cuando finalice el tiempo que decidió dormir. ­ Si entró porque ejecutó una operación de entrada/salida, entonces saldrá cuando esta haya finalizado. En todos los casos, volverá al estado running para esperar a que se le vuelva a asignar tiempo de procesador.

© 2013 - www.spanishdeveloperscommunity.es


el ejemplo del productor/consumidor

En el método poner, lo primero que hacemos es preguntar por el El ejemplo típico para ilustrar una situación de sincronización de estado del buffer. Si está lleno, entonces no podemos hacer nada threads es el del Productor consumidor cuyo análisis vamos a y mientras esto siga así nos bloqueamos a darle la posibilidad al exponer a continuación. consumidor de que pueda consumir un carácter y asi desagotar el buffer. Cuando desbloqueamos nos encontramos nuevamente Supongamos que en nuestro programa tenemos dos hilos: uno (el dentro del while y si todo sigue igual nos volveremos a productor) produce caracteres y los mete en un array. El otro (el bloquear. Así hasta que la variable lleno sea false. En este consumidor) toma los caracteres del array y los muestra por la momento saldremos del bucle y ejecutaremos las líneas pantalla. posteriores de código en las que, como accedemos a las variables compartidas decimos que constituyen la sección Dado que el array tiene una capacidad finita, este podría llenarse critica. o vaciarse según el productor produzca caracteres más rapido de lo que el consumidor los puede consumir o viceversa. Al final invocamos al método notifyAll para pasar a ready a todos los hilos que están bloqueados. Si el array está lleno, entonces el productor no puede continuar con su producción hasta que el consumidor consuma algún Las clases productor y consumidor extienden de Thread. Ambas carácter. Si el array está vacío, entonces el consumidor no tendrá reciben como parámetro en el constructor una instancia del nada para consumir hasta que el productor produzca algo y lo monitor ( o buffer ). meta en el array. El código del productor, quién produce caracteres consecutivos Obviamente, además no debería suceder que el productor acceda contando a partir del caracter 'A'. La cantidad de caracteres que al array para meter un carácter justo en el mismo momento en el va a producir dependerá del parámetro n que recibe en el que el consumidor accede para consumir. Dado que el array es el constructor. Luego de meter cada carácter en el buffer duerme recurso compartido al cual accederán los hilos debemos una cantidad sleep de milisegundos, valor que también recibe monitorear su acceso a través de un monitor (una clase) con los como parámetro en el constructor. métodos sincronizados: ponercaracter y sacarcaracter. Llamaremos a esta clase Monitor y su El análisis de la clase consumidor es análogo al de la clase código lo planteamos en el cuadro de código en ésta página. productor y cuyo código también plasmamos en este artículo.

Monitor

package es.monitor.ejemplo;

public class Monitor {

private char[] buff = null; private int tope=0; private boolean lleno=false; private boolean vacio=true;

public synchronized void poner ( char c ) throws Exception { while ( lleno ) { wait( ); } buff[++tope]=c; vacio=false;

lleno = tope>=buff.lenght; notifyAll ( ); }

public synchronized char sacar ( ) throw Exception { while ( vacio ) {

© 2013 - www.spanishdeveloperscommunity.es

15


wait (); }

char c=buff[--tope]; lleno=false; vacio=tope<=0;

notifyAll ( );

return c; }

Produtor package es.productor.ejemplo;

public class Productor extends Thread { private Monitor buff; private int n; private int sleep; public Productor ( Monitor b, int n, int s ) { this.buff = b; this.n = n; this.sleep = s; }

public void run ( ) { try { char c; for ( int i=0; i<n; i++ ) { c = (char) ('A'+i); buff.poner(c); System.out.println("Produje: "+c); sleep ( (int) (Math.random()*sleep)); } catch ( Exception ex ) { ex.printStackTrace ( ); throw new RunTimeException(ex); } } }

Consumidor package es.consumidor.ejemplo;

public class Consumidor extends Thread { private Monitor buff;

16

Š 2013 - www.spanishdeveloperscommunity.es


private int n; private int sleep;

public Consumidor ( Monitor b, int n, int s ) { this.buff = b; this.n = n; this.sleep = s; }

public void run ( ) { try { char c; for ( int i=0; i<n; i++ ) { c = buff.sacar ( ); System.out.println("Consumi: "+c); sleep ( (int) (Math.random()*sleep)); } catch ( Exception ex ) { ex.printStackTrace ( ); throw new RunTimeException(ex); } } }

Programa Test Productor y Consumidor package es.prodcons.ejemplo

public class Test {

public static void main ( String[] args ) {

Monitor m = new Monitor ( 3 );

Productor p = new Productor ( m, 6, 2000 );

Consumidor c = new Consumidor ( m, 6, 4000 );

p.start ( ); c.start ( );

}

}

Š 2013 - www.spanishdeveloperscommunity.es

17


Información

La comunicación como código abierto Javier Rodriguez /rodriguezdelbarriojavier @jrdelbarrio

Aunque los escenarios comunicativos tienen un marcado carácter cambiante –y parecieran infinito en su crecimiento exponencial­ la base continúa sustentada en el modelo de Laswell (1948), emisor­mensaje­canal­receptor, si bien cobran mayor relevancia el canal y la respuesta/actividad del receptor.

Si respetamos el código fuente del lenguaje y su función de comunicar efizcamente (reconociendo la herencia recibida), los nuevos caminos que surjan quedarán allanados. Es nuestra responsabilidad, ya que nuestra tarea será el legado que dejemos.

Dicen los expertos, que el canal determina el mensaje, que éste queda determinado desde el momento en que se elige el canal a través del cual será emitido. Si aceptamos esta máxima, resulta inevitable la adaptación a la nueva realidad y a su desarrollo en común por parte de todos los actores. De la misma forma que el crecimiento del lenguaje, su utilización e interpretación de las palabras, se ven afectadas por todos aquellos que hablamos o escribimos, el código de la comunicación queda abierto para su mejora –no siempre­ o al menos para una ajustada interpretación de las nuevas realidades.

18

© 2013 - www.spanishdeveloperscommunity.es



Programación PHP

Envio de pings a host remotos

El comando ping que envía al host de destino un paquete de gratuitamente en http://pear.php.net/package/Net_Ping. Esta datos y revisa la respuesta, es la manera más rápida para clase elige el comando ping apropiado para el sistema operativo encontrar si un host de red es funcional. y lo ejecuta con el host de destino como parámetro. Un objeto de resultado se crea a partir de la respuesta; como el tiempo de El listado que mostramos a continuación, llama directamente al respuesta o la latencia o para ver la salida sin trabajar del comando ping específico des sistema con exec ( ) para revisar el comando con el método getRawData ( ). En el listado 2 podemos estado del host. ver un ejemplo de éste en acción. En el caso del código independiente del sistema operativo, tal vez prefiera usar la clase Net_Ping de PEAR, que se encuentra

Listado 1

Listado 2

<?php

<?php

//hace ping a un host remoto

include "Net/Ping.php";

exec ( ""bin/ping -c 5 host.nombre", $salida ); echo "<pre>". join("\r\n", $salida) . "</pre>";

$ping = Net_Ping::factory ( );

?>

//hace ping a un host remoto $respuesta= $ping->ping ("host.nombre" ); echo "<pre>". join("\r\n", $respuesta>getRawData ( )) . "</pre>"; ?>

20

© 2013 - www.spanishdeveloperscommunity.es


Linux ubuntu

Instalar la actualización de Ubuntu 13.04

A partir de la versión actual de linux 12.10, nos gustaría ­ En Update Manager, haga clic en el botón Comprobar si hay actualizar a la versión 13.04 Raring Ringtail, disponible ya en nuevas actualizaciones. Internet. Para evitar desinstalar nuestro sistema e instalar el ­ Si hay actualizaciones para instalar, usa el botón de instalar nuevo. actualizaciones para instalarlas y pulsa comprobar de nuevo Realmente el proceso de actualización es muy sencillo y bastante después de que se haya completado. seguro, ya que las nuevas versiones de la distribución ubuntu de ­ Aparecerá un mensaje que nos informará de la linux han facilitado considerablemente el disponibilidad de la nueva versión. Hacemos clic proceso. Tan sólo tienes que seguir los en actualizar. siguientes pasos: ­ Ejecuta la aplicación updatemanager-d desde la línea de comandos de la terminal. ­ En update manager haz clic en configuración e introduce la contraseña del administrador para inicar la aplicación Software Sources.

Actualizar Ubuntu (Servidores) 12,10 a 13,04: En una terminal instalamos el "updater manager": sudo apt-get manager-core

install

update-

Lanzamos la herramienta de Actualización:

­ Selecciona las actualizaciones del submenú de la aplicación do-release-upgrade -d Software Sources. Otro método para actualizar 12,10 a 13,04, más duro que el ­ Seleccionamos el "notificarme de una nueva versión de primero en la lista, es modificar el archivo / etc / apt / sources.list para 13,04 y actualizar el sistema, así: Ubuntu". ­ Cerramos la aplicación de sofware de fuentes y volver a Update $ Sudo sed-i 's / quantal / Raring /' / etc / apt / sources.list Manager. $ Sudo apt-get update && apt-get dist-upgrade

© 2013 - www.spanishdeveloperscommunity.es

21


Artículo de portada

Virtualización de sistemas operativos

La virtualización es una tecnología que permite ejecutar varios sistemas operativos simultáneamente en una misma máquina. En un entorno virtualizado, cada sistema operativo tiene la ilusión de residir en una máquina propia, disponible enteramente para él. Para conseguir esto es necesario un programa (denominado virtualizador o hipervisor, según la técnica concreta que se utilice) que se encargue de arbitrar el uso del hardware. Para ello intercepta las operaciones privilegiadas y simula sus efectos sobre un dispositivo virtual, también simulado. Así, cuando un sistema operativo cree que está escribiendo en un disco duro real, en realidad lo hace en un fichero, gestionado por el hipervisor, que simula dicho disco duro. Lo mismo con tarjetas de red, pantallas, teclados, etc. Originalmente, la arquitectura PC no estaba preparada para la virtualización, pues era imposible interceptar algunas operaciones privilegiadas. Esto llevó al desarrollo de dos técnicas que permitían soslayar el problema: la traducción binaria y la paravirtualización. Hoy en día, sin embargo, los dos principales fabricantes de procesadores x86 han incorporado capacidades de virtualización asistidas por hardware, que permiten crear virtualizadores capaces de interceptar todas las posibles operaciones privilegiadas sin necesidad de trucos. Aplicaciones de la virtualización Existen varias aplicaciones para la virtualización que se han extendido y generalizado en los últimos años:

22

­ Agrupación en una sola máquina de varios servidores infrautilizados, de manera que cada servidor seguirá siendo tan seguro como cuando estaba en una máquina separada, pero el sistema será más barato. ­ Alquiler de servidores: gracias a la virtualización, los hosts pueden ofrecer a bajo precio un servidor individual virtualizado a cada usuario, que puede instalar el sistema operativo o servidor web de su elección, así como las versiones concretas que prefiera de éstos, en lugar de estar limitado a las que ofrezca su proveedor. ­ Migración en caliente de servidores: si se desea realizar mantenimiento en un servidor (por ejemplo, cambiar un disco duro, o ampliar la memoria), se pueden pasar todos sus servicios virtualizados a otro equipo de manera temporal, hacer la operación, y restaurarlos. Esta migración es casi instantánea. Mayor seguridad: servicios que inicialmente se ejecutaban en un mismo sistema operativo (por ejemplo, la web pública de la empresa y el correo) pueden pasar a trabajar en máquinas virtuales separadas, pero funcionando todas ellas aún en el mismo hardware físico. En caso de que una de las máquinas virtuales se viese comprometida, el resto seguirán siendo confiables. Alquiler de tiempo de proceso en la nube: gracias a la virtualización ha podido superar los inconvenientes de seguridad que tendrían otros modelos. © 2013 - www.spanishdeveloperscommunity.es


virtualización, ¿qué software debemos usar?

creado por Oracle. VirtualBox puede correr en sistemas virtuales Linux, BSD, Windows y Mac; además podemos instalar Ahora nos centraremos en que empresas trabajan con ese tipo de sistemas operativos de 64 bits y compartir carpetas. software. Vamos a comparar 3 programas de virtualización, los 3 mas grandes del mercado: VMware, VirtualBox y VirtualPC. Tiene soporte para EFI, lo que hace que se pueda correr en sistema Mac, la aplicación es verdaderamente rápida, ligera y 1­ VMware: Es el líder en virtualización a nivel empresa, este ocupa poco espacio en disco. Tenemos también la posibilidad de software va más allá de virtualizar cualquier Sistema Operativo, conectar cualquier tipo de periférico a la maquina virtual y es tiene versiones específicas para centros de proceso de datos bastante compatible con cualquier máquina virtual creada en otro (CPD) . software, también podemos comprimir las máquinas a un formato abierto de virtualización para que ocupen mucho menos VMware tiene productos gratuitos como VMware Player y y podamos migrarla a otro ordenador. productos de pago para entornos de usuario como VMware Workstation. Es una opción a tener en cuenta si quieres jugar con la virtualización en casa, no es recomendable para entornos de VMware Player es la versión gratuita y limitada, trae empresa, dado que no es tan potente como VMware y no nos muchísimas menos funciones que VMware Workstation. proporciona las misma soluciones. Con VMware Player solo podremos ejecutar máquinas virtuales 3­ VirtualPC : es un software de virtualización creado por ya creadas, por esa razón es la solución perfecta para equipos de Connectix y comprado por Microsoft, es el software de usuarios sin conocimientos pero con la necesidad de virtualizar. virtualización mas sencillo , solo permite virtualizar sistemas operativos Windows. Si el sistema operativo es un x64 Con VMware Workstation podremos crear máquinas virtuales, la podremos virtualizar sistemas operativos de 64 bits, pero no se variedad de sistemas operativos es increíble (600 Sistemas podran conectar periféricos, solo cds y capturar imágenes ISO operativos diferentes) desde un Windows, pasando por Mac para la instalación del sistema . hasta toda la variedad de sistemas Linux (Ubuntu, Suse, Fedora, Debian, Oracle, etc,…). Capacidad de virtualizar hasta 2TB de Podremos transferir archivos arrastrando a la maquina virtual y discos virtuales, puede asignar hasta 8 procesadores virtuales por también compartirlos a través de carpetas. maquina u 8 núcleos por máquina, 64Gb de memoria RAM por máquina. También tenemos la posibilidad de conectarnos de Esta recomendado para gente que quiere trastear un poco con forma remota desde otro ordenador u smartphone. Podremos virtualización en Windows, o quiere tener una máquina virtual conectar periféricos directamente a la máquina virtual como solo para navegar por Internet y hacer descargas. pendrives, discos duros, cds, antenas wifi , también tenemos la opción de transferir archivos. VMware integra perfectamente La compatibilidad con maquinas virtuales es bastante limitada, gráficos en 3D, es compatible con gráficos DirectX 9.0c Shader solo admite formatos (.vhd) que son los que crea el propio Model III y OpenGL 2.13D en Sistemas Windows. Las máquinas VirtualPC, también admite formatos de disco virtual (.vmdk). virtuales están cifradas con AES a 256 bits y permiten la autenticación con tarjeta inteligente. Virtual PC es un software gratuito y solo puede ser usado en sistemas Windows. VMware Workstation es compatible con sistemas operativos Windows y Linux, sus máquinas virtuales pueden ser portadas a Debemos usar el software que mas se adapte a nuestras cualquier otro programa de virtualización, también hay una necesidades, si tus necesidades en virtualización son altas, versión de VMware para Mac llamada VMware fusión en la que virtualizar Server o maquinas Linux necesitasVMware. podremos virtualizar sistemas operativos Windows por 49$. Además es altamente compatible con máquinas virtuales creadas Si solo virtualizas para conocer sistemas operativos distintos en otros software de virtualización como VirtualBox o VirtualBox, mientras que si virtualizas solo sistemas operativos VirtualPC. Windows para cualquier función básica utiliza VirtualPC. Puedess comprar VMware por 199$ ; puede resultar bastante Con esto no podemos decir que VirtualBox ni VirtualPC puedan asequible en relación calidad/precio. correr maquinas servidor si no que es mas adecuado correrlo en VMware, por fluidez, potencia y opciones, aunque las demandas 2­ VirtualBox : es un programa gratuito y de codigo abierto

© 2013 - www.spanishdeveloperscommunity.es

23


descargado qy se nos abrirá el Centro de Software para su instalación.

del mercado estan mejorando estos softwares.

instalar una máquina virtual en ubuntu

Como ya hemos dicho, una máquina virtual es un programa que Procedimientos de instalación: añadiendo repositorios. nos permite instalar sistemas operativos dentro de nuestro propio sistema, pudiendo así trabajar con todos teniendo sólo un sistema Creamos un archivo de texto (virtualbox.list) en el directorio instalado realmente. donde se añaden los repositorios de "Otros" (/etc/apt/sources.list.d) con el siguiente comando: En nuestro artículo, nuestro sistema anfitrión será el GNULinux Ubuntu y el invitado será el Windows XP. sudo gedit /etc/apt/sources.list.d/virtualbox.list

La máquina virtual que vamos a utilizar es VirtualBox, que viene ­ Para Ubuntu 13.04: en los repositorios de Ubuntu, pudiendo instalarla desde Synaptic o desde el Centro de Software de Ubuntu, solamente deb http://download.virtualbox.org/virtualbox/debian poniendo en la búsqueda: "virtualbox ose", seleccionamos e contrib instalamos. También debemos de instalar la dependencia "dkms" Pero este programa viene con limitaciones, por lo que recomiendo que lo descarguemos de su página web y añadir sus repositorios, teniendo así siempre lo último para la máquina virtual.

raring

Para Ubuntu 12.10: deb

http://download.virtualbox.org/virtualbox/debian

quantal contrib

Le damos a "guardar" y cerramos el archivo. Ahora añadimos la Lo primero es instalar unas dependencias que necesitamos llave pública en una terminal con el siguiente comando: (probablemente estén ya instaladas) en una terminal con el siguiente comando: wget

sudo

apt-get

install

libqt4-network

libqtcore4

libqtgui4

libaudio2 python2.7 python2.7-minimal

-q

http://download.virtualbox.org/virtualbox/debian/oracle_vbo x.asc -O- | sudo apt-key add -

Actualizamos los repositorios en la terminal con el siguiente Nota: python2.7 y python2.7­minimal, pueden ir actualizándose comando: de versión en un futuro, por lo que si la terminal os responde que no las encuentra, es cuestión de buscar en Sinaptyc con sudo apt-get update "pytthon" la versión actualizada.

Nota: Si nos dice que "las firmas siguientes no son válidas ..." También hay que instalar el paquete "dkms" para garantizar que (The following signatures were invalid: BADSIG...) ejecutamos los módulos del núcleo de acogida VirtualBox (vboxdrv, los siguientes comandos: vboxnetflt y vboxnetadp) se actualizan correctamente si cambia la versión del kernel de Linux, con el siguiente comando: sudo -s -H

sudo apt-get install dkms

apt-get clean rm /var/lib/apt/lists/*

Procedimientos de instalación: con un paquete .deb.

rm /var/lib/apt/lists/partial/*

Vamos a la página oficial:

apt-get update

https://www.virtualbox.org/wiki/Linux_Downloads Seleccionamos la versión de Ubuntu y la arquitectura de nuestro Ubuntu: i386 para 32bits o amd64 para 64bits y descargamos el archivo.deb que necesitamos. Luego damos doble clic sobre el archivo .deb que hemos

24

apt-get clean

exit

Y ya podemos instalar Virtualbox en la terminal con el siguiente comando: sudo apt-get install virtualbox-4.2

Nota: Tenemos que tener en cuenta que la versión virtualbox­4.2 © 2013 - www.spanishdeveloperscommunity.es


puede ir actualizándose (4.3 y ...), por lo que puede que nos dé En la izquierda nos saldrá la selección de configuración: error al no encontrarla. Lo mejor es cerciorarse en su página ­ General: lo dejamos tal y como está. web, donde también podemos ver sus repositorios. Reiniciamos el equipo y para ejecutar la máquina virtual vamos a ­ System: lo dejamos como está (es un resumen de lo que viene ahora). Aplicaciones ­> Herramientas del Sistema ­> Sun VirtualBox.

creación de s.o. y disco duro virtual

­ Display: activamos la aceleración 3d para tener una mejora Una vez instalado vamos a crear, por ejemplo, un Win2 XP gráfica. virtual: Damos a Nuevo para crearlo.

­ Discos duros: lo dejamos tal y como está.

­ CD/CVD­room: Para poder instalar el S.O. desde un cd/dvd y poder utilizar el cd/dvd marcamos "Montar CD/DVD", si queremos grabar marcamos "habilitar passthrough" (crear cd Elegimos el nombre (xp), el sistema operativo (microsoft audio no funciona) y si queremos instalar una imagen de .iso windows) y la versión (windows xp). Siguiente. marcamos "archivo de imagen de iso". Nos saldrá el asistente y le damos a siguiente.

Nos pide la cantidad de memoria ram que será asignad. Lo máximo que le podemos dar es un poco menos de la mitad de la que tengamos en el equipo, ya que no nos dejará darle justo la mitad o más. Si tenemos 2 tarjetas de memorias ram con diferente frecuencia sólo admite la mitad de una de ellas (si son de igual frecuencia es indiferente y admitirá la mitad de la suma de las dos).

­ Disquet: si tuviéramos disquetera y la utilizamos marcamos "Montar Unidad de Disquet" ­ Audio: Os detecta y selecciona los controladores para el audio. Lo dejo como está. ­ Red: Os detecta la red y la configura. Lo dejamos como está.

Le asignamos un disco duro virtual, que ocupará el espacio ­ Puertos seriales: Si tenemos algún hardware conectado a un acorde al tamaño que más tarde le demos en nuestra partición de puerto serie marcamos "habilitar puerto serie". Ubuntu. Seleccionamos "nuevo" ya que no tenemos otro de antes (si lo tuvieramos lo podriamos seleccionar). Siguiente. ­ Directorios compartidos: Es una carpeta que será utilizada por los 2 sistemas a la vez. Por su importancia le hago un apartado al Ahora empezaremos a crear una imagen de nuestro nuevo disco final. duro virtual. Siguiente. ­ USB: marcamos "habilitar controlador usb". Nos dá a elegir el tipo de tamaño del disco duro, yo elegiré tamaño fijo ya que si elegimos de expansión dinámica nos podrá Con los puertos USB podemos tener algunos problemas: llenar nuestro Ubuntu con lo que nos podemos quedar sin disco sin darnos cuenta. Siguente. * A partir de Ubuntu 10.04 (según ubuntu.com) VirtualBox tiene soporte USB y ya no Le ponemos nombre al disco duro (disco xp) y le damos el necesita las instrucciones para versiones anteriores. Y nos tamaño deseado, yo le daré 10gb que es suficiente. Siguiente. advierte de que editar el archivo fstab provocará que el sistema pierda el arranque. Nos hará un resumen de la creación del disco duro y le damos a Terminar. * Para Ubuntu 9.10 y anteriores Antes de instalar vamos a configurar nuestro hardware para Si queremos que VirtualBox reconozca los dispositivos USB poderlo utilizar correctamente, para ello le damos a General conectados al sistema anfitrión (impresora, scanner...) debemos (derecha) en la pestaña de detalles y se nos abrirá una nueva de hacer lo siguiente: ventana:

configuración del hardware

1. Editar el archivo /etc/fstab con el siguiente comando en una terminal:

© 2013 - www.spanishdeveloperscommunity.es

25


sudo gedit /etc/fstab

Bien, ya está todo dispuesto y preparado para instalar el XP, metemos el cd de instalación, abrimos el VirtualBox, 2.En el archivo que se nos abre añadimos en una línea nueva lo seleccionamos la máquina de XP, damos al botón de arriba siguiente: "Iniciar" y comenzará la instalación de Windows como siempre. none /proc/bus/usb usbfs devgid=46,devmode=666 0 0 guardamos los cambios y cerramos el archivo y la terminal El ratón quedará capturado por el sistema XP cuando lo pasemos 3. Importante: con VirtualBox "cerrado" Vamos a Sistema ­ Administración ­ Usuarios y Grupos. Damos a Desbloquear (contraseña). Damos a Gestionar Grupos. Buscamos y seleccionamos en la lista que nos sale "vboxusers". Damos a Propiedades. Marcamos la casilla de los usuarios que van a tener acceso. Aceptamos y cerramos. * Si hemos actualización Ubuntu 9.10 a Ubuntu 10.04 podreis encontraros con el siguiente error al reiniciar: an error occurred while mounting /proc/bus/usb press S to skip mountingor M for manual recovery Podréis comprobar que si pulsáis S arranca el sistema normalmente. Lo que el error te viene a decir es que no se montan los dispositivos USB a la hora de activarlos en Virtualbox. Por lo visto es un bug de Ubuntu 10.04 y la posible solución la encontrareis en: http://www.ubuntu­ es.org/node/133153

instalación del sistema operativo

Bien, ya está todo dispuesto y preparado para instalar el XP, metemos el cd de instalación, abrimos el VirtualBox, seleccionamos la máquina de XP, damos al botón de arriba "Iniciar" y comenzará la instalación de Windows como siempre.

por la ventana, para liberarlo y poder utilizarlo en Ubuntu pulsamos "Ctrl derecho + L". No os preocupeis cuando termine de instalarse XP solucionamos esto: Con el Xp funcionando liberamos el ratón y pulsamos en Dispositivos ­ Instalar Guest Aditions (aplicaciones huesped) y comenzará a descargarse. La aplicación saltará automáticamente, pero por si no es así, la encontraremos en Mi PC en dispositivos extraibles con un icono en forma de cubo azul y le damos doble clic. Se instalará y reiniciamos el XP virtual no el Ubuntu. El ratón no se captura y funcionará mejor todo.

activar la carpeta compartida

1º. Crear la carpeta que vamos a compartir: Creamos una carpeta con el nombre que queramos (yo la llamo: compartida) en nuestra carpeta personal (home). Una vez creada: Hacemos click derecho sobre ella, seleccionamos “Propiedades” y en la pestaña “Compartir”, habilitamos la primera casilla “Compartir esta carpeta” y si es la primera vez nos dirá que el servicio no está instalado, le decimos que sí, introducimos nuestra contraseña (si tiene nivel de superusuario) y lo instalará. Seguidamente, si queremos, habilitamos las otras dos casillas: “Permitir a otras personas escribir en esta carpeta” y “Acceso de invitado (para personas sin cuenta de usuario)“.

El ratón quedará capturado por el sistema XP cuando lo pasemos por la ventana, para liberarlo y poder utilizarlo en Ubuntu pulsamos "Ctrl derecho + L". No os preocupeis cuando termine de instalarse XP solucionamos Finalmente le damos al botón “Crear compartición“. esto: 2º. Preparamos Ubuntu:

Con el Xp funcionando liberamos el ratón y pulsamos en Dispositivos ­ Instalar Guest Aditions (aplicaciones huesped) y Con el Sistema Operativo huesped (xp) apagado. En Virtualbox, comenzará a descargarse. vamos a Configuración ­> Datos Compartidos y damos en el botón verde que tiene un símbolo + a la derecha. La aplicación saltará automáticamente, pero por si no es así, la Buscamos y seleccionamos la carpeta compartida que en mi caso encontraremos en Mi PC en dispositivos extraibles con un icono es /home/compartida, y la casilla de “Read­only” (sólo lectura) la en forma de cubo azul y le damos doble clic. podemos habilitar, si no vamos a escribir en ella desde el sistema operativo huesped (xp), en caso de que sí vayamos a escribir en Se instalará y reiniciamos el XP virtual no el Ubuntu. El ratón no ella, la dejamos deshabilitada. se captura y funcionará mejor todo.

instalación del sistema operativo

26

Le damos a “OK” y Ubuntu queda preparado.

© 2013 - www.spanishdeveloperscommunity.es


3º. Preparamos el Sistema Operativo huesped (XP):

Le ponemos nombre al disco duro (disco xp) y le damos el Para ello abrimos la consola o shell de Xp en Inicio ­ Ejecutar, tamaño deseado, yo le daré 10gb que es suficiente. Siguiente. ponemos cmd y pulsamos Enter. Se nos abrirá la consola y Nos hará un resumen de la creación del disco duro y le damos a ejecutamos el siguiente comando: Terminar. net use X: \\vboxsvr\compartida

Antes de instalar vamos a configurar nuestro hardware para poderlo utilizar correctamente, para ello le damos a General Pulsamos Enter y nos dará un mensaje de confirmación. (derecha) en la pestaña de detalles y se nos abrirá una nueva *Nota: compartida es el nombre que le pusimos a la carpeta ventana: cuando la creamos en Ubuntu y X es el nombre que dará a la el modo fluido ( SeamLess ) carpeta compartida, como unidad de red, de XP en "Mi PC", teniendo cuidado de que no esté ocupada por otro dispositivo El modo fluido hace que nos aparezca la barra de tareas de (puede surgir conflictos). Cuidado que entre : y // hay un espacio Windows Xp en la parte inferior de nuestro escritorio de Ubuntu (encima del panel inferior de Ubuntu. en blanco. Se habrá creado en Mi PC una "unidad de red X", desde donde podemos ver todo lo que metamos en la carpeta "compartida" de Ubuntu y desde ésta podemos ver todo lo que metamos en la "unidad de red" de XP.Una vez instalado vamos a crear, por ejemplo, un Win2 XP virtual: Damos a Nuevo para crearlo.

De esta forma podremos abrir ventanas de Windows junto a ventanas de Ubuntu en el mismo escritorio. Si quieres activar el modo fluido (SeamLess) en VirtualBox basta con pulsar la combinacion de teclas: Control derecho + L

Nos saldrá el asistente y le damos a siguiente. Elegimos el nombre (xp), el sistema operativo (microsoft windows) y la versión (windows xp). Siguiente. Nos pide la cantidad de memoria ram que será asignad. Lo máximo que le podemos dar es un poco menos de la mitad de la que tengamos en el equipo, ya que no nos dejará darle justo la mitad o más. Si tenemos 2 tarjetas de memorias ram con diferente frecuencia sólo admite la mitad de una de ellas (si son de igual frecuencia es indiferente y admitirá la mitad de la suma de las dos). Le asignamos un disco duro virtual, que ocupará el espacio acorde al tamaño que más tarde le demos en nuestra partición de Ubuntu. Seleccionamos "nuevo" ya que no tenemos otro de antes (si lo tuvieramos lo podriamos seleccionar). Siguiente. Ahora empezaremos a crear una imagen de nuestro nuevo disco duro virtual. Siguiente. Nos dá a elegir el tipo de tamaño del disco duro, yo elegiré tamaño fijo ya que si elegimos de expansión dinámica nos podrá llenar nuestro Ubuntu con lo que nos podemos quedar sin disco sin darnos cuenta. Siguente. © 2013 - www.spanishdeveloperscommunity.es

27


Programación RoR

Introducción al lenguaje de programación ruby

Ruby es un lenguaje interpretado orientado a objetos creado por Veamos la sintaxis para crear un método. En este ejemplo se le Yukihiro Matsumoto. Lo creó basándose en otros lenguajes pasa una cadena de texto por parámetro y se devuelve otra como perl y python en referencia sobretodo a la sintaxis y cadena de texto modificada. también en smalltalk por su orientación a objetos. Una de las mejores cualidades de este lenguaje es su sencillez para leerlo.

def mifuncion(texto) cadena = texto + " y adiós." return cadena end

En Ruby, todos los tipos de datos son considerados objetos, incluso lo que otros lenguajes como Java consideran tipos puts mifuncion("Hola") primitivos (enteros, booleanos, NULL, etc). Además, es importante saber que Ruby no necesita definir de qué tipo es una La función puts imprime por pantalla el resultado del método variable antes de inicializarla. llamado. A continuación se muestran ejemplos básicos de programación Para ejecutar el código basta guardar el código en un archivo como la sintaxis de las variables, las estructuras de control y llamado, por ejemplo, hola.rb y desde la línea de comandos algunas particularidades más que utiliza Ruby. ejecutar:

28

© 2013 - www.spanishdeveloperscommunity.es


ruby hola.rb

A veces nos interesará saber si un atributo o variable está definida. Podemos usar la expressión: atributo.nil?

Que devolverá cierto o falso según si está definida o no. En cambio si una variable está seguida de el símbolo !, indica que se modifica el contenido de la variable. Mientras que si no lo lleva devuelve una copia modificada del contenido de la variable. Hay diferentes tipos de variables: Las locales, las globales y las de instancia de un objeto.

Y para acceder a cualquier atributo de un objeto: @coche.color = "verde"

Las estructuras de control que más usaremos son la condicional if y el while. dinero = 40

if dinero < 10 puts "Tienes menos de 10" elsif dinero > 10 puts "Tienes mas de 10" else puts "Tienes 10" end

Una variable local es una variable como la usada en el ejemplo El bucle while se escribe de la siguiente forma: anterior llamada "cadena". Las variables globales son las que se pueden acceder desde cualquier sitio y se escriben con el símbolo $ delante. Las variables para instanciar un objeto se escriben con una arroba @ delante:

total = 10 while total>0 puts total total -= 1 end

@coche = Coche.new

© 2013 - www.spanishdeveloperscommunity.es

29


Redes sociales

Gestión de redes sociales Ángela Escobar www.aticaweb.com

/aticaweb @aticaweb

En este número de la revista vamos a comenzar a gestionar las diferentes redes sociales con las que contamos, para ello vamos a utilizar la aplicación web: Hootsuite.

gestionar hasta 5 cuentas diferentes. Vamos a estar un poco limitados, pero a la hora de trabajar con las redes sociales con esta versión para empezar a manejarnos vamos bien. De todas formas aquí os dejo un enlace dónde podréis encontrar los planes que dispone y sus características:

Hootsuite nos permite gestionar desde un mismo punto cuentas de diferentes redes sociales. Está disponible para web (Internet Explorer 7 u 8, Firefox 3, Safari 4, Chrome 4 y superiores) cómo para los sistemas operativos móviles: iOS y Android; aunque estas versiones no llegan a ofrecer tantas prestaciones como su versión web. Además también tenemos Hootlet que nos permite una vez iniciada sesión en Hootsuite, compartir directamente páginas o comentarios sin tener que entrar directamente a la https://hootsuite.com/plans. aplicación. Dentro de las redes sociales y blogs que Hootsuite nos permite Antes de empezar a entrar en materia de funcionamiento de esta gestionar desde su panel de control, encontramos: Twitter, aplicación hay que decir que tiene varias versiones, una gratuita Facebook, LinkedIn, Google +, Foursquare, Wordpress y Mixi y varias de pago. Nosotros para explicar como funciona vamos a (red social japonesa con más de 30 millones de usuarios). Pero utilizar la versión gratuita, ya que con ella podemos llegar a

30

© 2013 - www.spanishdeveloperscommunity.es


también nos permite instalar aplicaciones con otras redes ­ Programar la publicación de contenido sociales y lectores RSS. Por ejemplo, Blogger, Instagram, ­ Obtener informes estadísticos básicos Youtube, Tumblr, Evernote, etc.

Alguna de las cosas que nos permite hacer Hootsuite desde su ­ Hasta 2 fuentes RSS/Atom versión gratuita son las siguientes: ­ Ilimitado número de Aplicaciones ­ Monitorizar conversaciones, ya sean de nuestra marca o de la Una de las cosas que si nos permiten las versiones de pago y competencia. que para la gratuita no está disponible en ninguna de sus ­ Gestionar mensajes en nuestras 5 redes sociales que Hootsuite formas es la creación de un equipo para la gestión de las redes sociales. Free nos permite

© 2013 - www.spanishdeveloperscommunity.es

31


Bueno una vez sabemos todo esto, lo primero que tenemos que ejemplo, Facebook cuyo límite de caracteres es mucho mayor. hacer es entrar en www.hootsuite.com, registranos y acceder a la aplicación. Una vez escritos los mensajes, también podremos programarlos en este mismo recuadro, simplemente dando en la opción de Una vez dentro lo primero que nos pide la primera vez que calendario elegimos el día y la hora en que queremos que se accedemos es que añadamos al menos una red social para poder publique nuestro mensaje y este queda almacenado para gestionarla y conectarnos a ella. publicarse en el momento que hayamos indicado. Una vez añadidas nuestras redes sociales, nos aparece el “Dashboard”, en este tablero tenemos varias opciones y pantallas, para ello os voy a mostrar la imagen y vamos a ir viendo paso a paso que función lleva a cabo cada una de las partes.

Bueno justo debajo de este recuadro, encontramos las pestañas con las diferentes redes sociales, según la que tengamos seleccionada nos aparecerán unas columnas u otras, estas columnas se pueden elegir de entre varias, en la foto del ejemplo (Dashboard) encontramos 4 columnas que pertenecen a la cuenta de Twitter: Últimas Noticias, Menciones, Tuits Enviados, Mis En la parte superior izquierda encontramos el primer recuadro Tuits, retwitteados. Estas columnas las podemos cambiar por que sirve para escribir el mensaje que queremos publicar en alguna de nuestra listas o por lo mensajes directos, por ejemplo. nuestras redes sociales; el cuadro de al lado es dónde seleccionamos la red social en la que vamos a publicar el Cómo veis solo la versión gratuita de Hootsuite nos da mucho mensaje escrito anteriormente, podemos seleccionar una o juego y ya sólo nos quedaría practicar con esta aplicación para ir varias. Como consejo, os diría que dependiendo de la red social cogiendo manejo y ver si ésta se acomoda a nuestras necesidades en la que vayáis escribir publicar un mensaje u otro, ya que no es y a las redes en las que tenemos cuenta. lo mismo escribir para 140 caracteres (Twitter) que para, por

32

© 2013 - www.spanishdeveloperscommunity.es


Redes sociales

La metamorfosis del marketing: social media Susana Albares wwwmarketingonlinehoy.es

@SusanaAlbares

En caso de que no lo hayas notado, el marketing ha cambiado: se ha transformado en un "mundo nuevo", en un nuevo estado general de las cosas. A los consumidores ya no les gustan los métodos de marketing de difusión anticuados que hemos estado impulsando en la televisión, radio, periódicos y revistas. Los consumidores están reaccionando de manera más positiva a aquellos ámbitos donde pueden estar más involucrados e interactuar. No sólo eso, los consumidores ahora están decidiendo cómo quieren recibir nuestros mensajes de marketing.

que la inmensa mayoría están al día gracias a sus ordenadores ó dispositivos móviles, donde pueden desde estar al momento de las noticias, conectarse a amigos mediante redes sociales, realizar búsquedas de productos o información de su interés, y en realidad todo lo que necesitan. En un mundo donde los consumidores son adictos a estar conectados con todo el mundo en todas partes, nosotros, como dueños de negocios tenemos que hacer ajustes en nuestras estrategias de marketing.

El "Marketing de presión" (marketing de difusión tradicional) está dando paso al "Marketing de Atracción" y esto, requiere Ordenadores, teléfonos inteligentes y tablets se han convertido publicar contenido atractivo y lleno de valor: atraer al usuario en en una dura competencia para los canales de comunicación lugar de presionarle! tradicionales. Los consumidores son mucho más móviles. Llegar a ellos en sus sillones mientras ven sus televisores de pantalla Ahora tenemos que ser más que los vendedores ­ tenemos que grande ya no es la mejor manera de llegar a ellos. La realidad es ser narradores. Las historias nos ayudan a entender el mundo. Y Los consumidores eligen donde quieren recibir sus mensajes.

© 2013 - www.spanishdeveloperscommunity.es

33


se puede pensar en un lugar mejor que los medios sociales para compartir sus historias?

Pues bien, una vez que hemos superado este primer paso, te doy algunos consejos para facilitarte la vida para pensar acerca de algunos tipos de historias que Es cierto que tradicionalmente, cuando nos hemos aventurado a puedes compartir: montar una web como escaparate de nuestra empresa, lo que hemos sabido seguro es que debíamos incluir unas secciones tan Testimonios de los clientes: el trabajo es más fácil si tus clientes claras como: escriben algo de ti, para ti. quienes somos servicios que ofrecemos datos de contacto

Problemas que ha resuelto para sus clientes: Compartir un problema de un cliente y desarrollar como se ha solucionado genera a la vez confianza en que si hay problemas se solucionan y a la vez generan una base de conocimiento para el resto de los usuarios.

Esto, que por supuesto es imprescindible, hace que halla Consejos y trucos: La gente ve consejos y trucos como secretos millones de sitios en internet que permanecen estáticas, sin industriales. actualizaciones, abandonadas....muertas! Noticias del sector: Desarrollar nuestra opinion ó punto de vista Cuando admitimos que debemos ser nosotros los que tenemos sobre noticias del sector nos hace más transparentes, nos permite que atraer al usuario... entonces aparece un obstaculo: que nos conozcan y cuál es la filosofía de nuestro negocio: ¿entonces tengo que actualizar contenidos? ¿tengo que escribir nuestra manera de ver las cosas historias? Bueno, tú eliges... pero si quieres aprovechar los medios que te brinda el nuevo marketing online, redes sociales etc... ¿quieres publicar solo el slogan de tu empresa como un mantra?? Si eso no es lo que quieres...lo siento, pero no te queda otra que ponerte a generar contenidos para atraer a tus clientes potenciales sabiendo dónde se encuentran y eligiendo los contenidos que a ellos les gusta y en los soportes que a ellos les gustan!

34

AH!! pero NUNCA COPIES CONTENIDO DE OTRAS WEBS EN TU WEB: aparte de decir bastante poco sobre tí, google te hará una cruz por "contenido duplicado" y eso a google...no le gusta nada!! Ahora que tienes ideas sobre qué escribir..., ¿qué vas a hacer con tu contenido?, ¿a dónde vas a publicarlo? Blog: Lo sé, lo sé, no tienes tiempo para el blog, pero el Blog te © 2013 - www.spanishdeveloperscommunity.es


permite compartir tus historias en tu propio terreno, en "tu casa" Evita ser pedante: a la gente no le gusta estar oyendo todo el día y permite a tus lectores a participar comentando lo que has lo bueno que eres...enfócate en como ser útil en vez de darte compartido. autobombo. Mensajes de texto: ¿Cómo reaccionas cuando recibes un SMS ó un "guasap" ? la gente va al teléfono como una flecha! Piensa en esto y puedes empezar a construir tu lista de marketing de texto (basado en el permiso, por supuesto). Enviando los enlaces a tus contenidos, nuevos productos / servicios..Pero lo mismo que la gente va al teléfono como una flecha, también puede acabar rechazándote por "pesao": utilizalo con medida, igual que te gustaría que lo utilizaran contigo. El email marketing: Aunque pueda considerarse como "Marketing de presión", si lo usas bien, la gente todavía puede responder y participar en la conversación simplemente pulsando el botón de respuesta. Si has incluido contenido valioso, junto con una irresistible llamada a la acción, si les incitas a responder, y lo hacen, entonces es que has tenido éxito. Para realizar un buen marketing de atracción, cualquiera que sea el medio que elijas para su difusión, ten en cuenta que su narración no debe estar basada en las ventas. La gente quiere personas "al otro lado": que aporten información valiosa, que les diga cómo se pueden solucionar problemas ... sin venderles. Cuando ofreces contenidos de valor, entonces la gente te ve como el experto ... y las ventas llegan: MARKETING DE ATRACCIÓN

Medios de comunicación social: Coje tus historias y publicalas en Facebook, LinkedIn, Twitter, Google+, Pinterest, o incluso Instagram (contar historias a través de imágenes es siempre una combinación ganadora). Publícalas en las redes sociales donde se encuentran tus usuarios, tus clientes potenciales: estudialos. Cada red social tiene sus reglas, su lenguaje...No midas a todas por el mismo rasero, personalízalas, posiblemente los usuarios de cada una sean distintas... Anima a comentar y a compartir tus historias. Incorpora en tus redes sociales enlaces a otras fuentes de información que realmente tengan interés para tus lectores © 2013 - www.spanishdeveloperscommunity.es

35


Aplicaciones móviles

Riesgos que hay que evitar en el desarrollo freelance de apps María Ripoll www.yeeply.com

/marieta_mrm @marieta_rm

Convertirse en trabajador autónomo es una buena opción para evitar el desempleo. Con más de 6 millones de parados en nuestro país, cada vez son más los profesionales cualificados que optan por iniciarse en el trabajo freelance. Este es el caso de los desarrolladores de aplicaciones móviles. ¿Pero a qué se debe la proliferación de profesionales freelance en el ámbito del desarrollo de apps?.

humanos y formación del trabajador, y ofrece un elevado nivel de especialización. Además, son los encargados de disponer de todas las tecnologías necesarias para la creación de la aplicación. Sin embargo, los desarrolladores de aplicaciones móviles no están exentos de los riesgos de ser freelance.

El trabajo freelance requiere organización y disciplina. Tú eres tu propio jefe, por lo que sobre ti recaerá toda la responsabilidad. Hay que tener en cuenta que cada vez son más las empresas no Un mal trabajo o un trato incorrecto hacia tu cliente te afectan relacionadas con el mercado de las tecnologías móviles que directamente. Así mismo, hay otra serie de riesgos con los que quieren tener una aplicación móvil. Al no tener una vinculación deberás lidiar: directa con este mercado, a la mayoría de ellas no les interesa tener en nómina a un desarrollador de aplicaciones. Para estas No hay horario fijo: Tú decides cuándo trabajas y cuándo empresas, el desarrollo de una app y su posterior mantenimiento descasas. Sin embargo, tienes un compromiso de entrega con tus consisten en acciones puntuales, por lo que la relación con los clientes y los plazos hay que cumplirlos sin excepción. Por tanto, desarrolladores también será esporádica. Por tanto, el trabajo es necesario que te organices, que repartas las horas freelance presenta una serie de oportunidades que no se pueden adecuadamente entre todos los proyectos que tengas, así como desaprovechar: reduce costes los costes en gestión de recursos entre el tiempo de trabajo y el tiempo de descanso.

36

© 2013 - www.spanishdeveloperscommunity.es


Inestabilidad laboral: Habrá épocas en las que tendrás grandes cargas de trabajo y otras en las que dediques el tiempo a buscar nuevos proyectos, porque éstos escasean. Está bien que te muevas en todos los ámbitos para buscar nuevos clientes. En este sentido, las redes de freelance –como Yeeply­ te pueden ayudar a encontrar nuevas tareas que llevar a cabo. Además, te ofrecen un buen escenario para darte a conocer a los clientes, permitiéndote tener un espacio con toda tu información profesional: currículum, portfolio, habilidades, formación, etc. Inestabilidad salarial: Esto está íntimamente ligado a la inestabilidad en el ámbito laboral. Cuanto más trabajo tengas más dinero ganarás y al contrario. En este sentido, es recomendable que ahorres lo máximo posible, de esta manera, lograrás sobrevivir en los periodos de ‘vacas flacas’, mientras buscas nuevos proyectos que desarrollar. Gastos fijos: Invertir dinero en tu trabajo es uno de los riesgos de ser freelances más asumidos. Como desarrollador freelance, tienes una serie de gastos fijos al mes: factura de internet y teléfono, desplazamiento, material de oficina, etc. Así mismo, puedes tener algún imprevisto, como las averías que se puedan generar en el vehículo particular que utilices para desplazarte o en alguno de los equipos informáticos que te sirvan para la programación de las aplicaciones. ¿Y si no pagan?: Probablemente, uno de los riesgos de ser

© 2013 - www.spanishdeveloperscommunity.es

freelance más temidos sea el de no recibir la retribución acordada. Antes de comprometerte con un posible cliente, intenta conocer un poco más sobre él, sobre sus anteriores relaciones con trabajadores freelance y sobre su solvencia. Si los datos no son fiables, es mejor que no trabajes para él, sobre todo para no perder tiempo y dedicárselo a proyectos por los que sí que sabes que vas a cobrar. Además, te ahorrarás tener que recurrir a la justicia o a empresas especializadas en la gestión del cobro a morosos. Si el cliente es fiable y aceptas, es pertinente que queden bien claras y recogidas por escrito las condiciones de cobro, sobre todo porque la constancia documental te puede ayudar a la hora de reclamar. Dificultades en la comunicación: Esto sucede cuando te encuentras desarrollando una aplicación para una empresa extranjera, sobre todo por la diferencia horaria y por el elevado coste de las llamadas telefónicas. Quizá este sea uno de los riegos de ser freelance más fáciles de solucionar, ya que puedes establecer con tu cliente un horario fijo de comunicación que os venga bien a los dos, y son muchos los programas gratuitos de videoconferencia (como Skype y Google Hangout) que facilitan esta labor. Como todo, ser freelance tiene sus ventajas y sus inconvenientes. Conocer y asumir los riesgos del trabajo por cuenta propia es fundamental a la hora de trabajar para evitarlos.

37


Android

Implementar menu en Android

En Android podemos encontrar 3 tipos diferentes de menús:

tendremos que modificarlo):

­ Menús Principales. Los más habituales, aparecen en la zona inferior de la pantalla al pulsar el botón ‘menu’ del teléfono.

<menu xmlns:android=

­ Submenús. Son menús secundarios que se pueden mostrar al pulsar sobre una opción de un menú principal.

<item

­ Menús Contextuales. Útiles en muchas ocasiones, aparecen al realizar una pulsación larga sobre algún elemento de la pantalla. En este artículo sobre el tema veremos cómo trabajar con los dos primeros tipos de menús. En el siguiente, comentaremos los menús contextuales y algunos características más avanzadas.

"http://schemas.android.com/apk/res/android" >

android:id="@+id/MnuOpc1" android:title="Opcion1" android:icon="@android:drawable/ic_menu_preferences"> </item>

<item android:id="@+id/MnuOpc2" android:title="Opcion2"

Como casi siempre, vamos a tener dos alternativas a la hora de mostrar un menú en nuestra aplicación Android. La primera de ellas mediante la definición del menú en un fichero XML, y la segunda creando el menú directamente mediante código. En este artículo veremos ambas alternativas.

android:icon="@android:drawable/ic_menu_compass">

Veamos en primer lugar cómo crear un menú a partir de su definición en XML. Los ficheros XML de menú se deben colocar en la carpeta “res\menu” de nuestro proyecto y tendrán una estructura análoga a la del siguiente ejemplo (si hemos creado el proyecto con una versión reciente del plugin de Android para Eclipse es posible que ya tengamos un menú por defecto creado en esta carpeta, por lo que simplemente

android:icon="@android:drawable/ic_menu_agenda">

38

</item>

<item android:id="@+id/MnuOpc3" android:title="Opcion3"

</item> </menu>

Como vemos, la estructura básica de estos ficheros es muy sencilla. Tendremos un elemento principal <menu> que contendrá una serie de elementos <item> que se corresponderán con las distintas opciones a mostrar en el menú. Estos elementos © 2013 - www.spanishdeveloperscommunity.es


evento onCreateOptionsMenu(). Para ello, para añadir cada opción del menú podemos utilizar el método add() sobre el objeto de tipo Menu que nos llega como parámetro del evento. Este método recibe 4 parámetros: ID del grupo asociado a la opción (veremos qué es esto en un próximo artículo, por ahora utilizaremos Menu.NONE), un ID único para la opción (que declararemos como constantes de la clase), el orden de la opción (que no nos interesa por ahora, utilizaremos Menu.NONE) y el texto de la opción. Por otra parte, el icono de cada opción lo estableceremos mediante el método setIcon() pasándole el ID del recurso. Veamos cómo quedaría el código utilizando esta alternativa, que generaría un menú exactamente igual al del ejemplo anterior:

<item> tendrán a su vez varias propiedades básicas, como su ID (android:id), su texto (android:title) o su icono (android:icon). Los iconos utilizados deberán estar por supuesto en las carpetas “res\drawable­…” de nuestro proyecto (al final del artículo os paso unos enlaces donde podéis conseguir algunos iconos de menú Android gratuitos) o bien utilizar alguno de los que ya vienen “de fábrica” con la plataforma Android. En nuestro caso de ejemplo he utilizado esta segunda opción, por lo que haremos referencia a los recursos con el prefijo “@android:drawable/…“. Si quisiéramos utilizar un recurso propio escribiríamos directamente “@drawable/…” seguido del nombre del recurso. Una vez definido el menú en el fichero XML, tendremos que implementar el evento onCreateOptionsMenu() de la actividad que queremos que lo muestre (esto también es posible que lo tengamos ya incluido por defecto en nuestra actividad principal). En este evento deberemos “inflar” el menú de forma parecida a cómo ya hemos hecho otras veces con otro tipo de layouts. Primero obtendremos una referencia al inflater mediante el método getMenuInflater() y posteriormente generaremos la estructura del menú llamando a su método infate() pasándole como parámetro el ID del menu definido en XML, que mi nuestro caso será R.menu.activity_main. Por último devolveremos el valor true para confirmar que debe mostrarse el menú.

private static final int MNU_OPC1 = 1; private static final int MNU_OPC2 = 2; private static final int MNU_OPC3 = 3;

//...

@Override public boolean onCreateOptionsMenu(Menu menu) { //Alternativa 2 menu.add(Menu.NONE, MNU_OPC1, Menu.NONE, "Opcion1")

.setIcon(android.R.drawable.ic_menu_preferences); menu.add(Menu.NONE, MNU_OPC2, Menu.NONE, "Opcion2") .setIcon(android.R.drawable.ic_menu_compass);

@Override

menu.add(Menu.NONE, MNU_OPC3, Menu.NONE, "Opcion3")

public boolean onCreateOptionsMenu(Menu menu) {

.setIcon(android.R.drawable.ic_menu_agenda);

//Alternativa 1

return true;

getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

Y ya hemos terminado, con estos sencillos pasos nuestra aplicación ya debería mostrar sin problemas el menú que hemos construído, aunque todavía nos faltaría implementar la funcionalidad de cada una de las opciones mostradas. Como hemos comentado antes, este mismo menú también lo podríamos crear directamente mediante código, también desde el © 2013 - www.spanishdeveloperscommunity.es

}

Construido el menú, la implementación de cada una de las opciones se incluirá en el evento onOptionsItemSelected() de la actividad que mostrará el menú. Este evento recibe como parámetro el item de menú que ha sido pulsado por el usuario, cuyo ID podemos recuperar con el método getItemId(). Según este ID podremos saber qué opción ha sido pulsada y ejecutar unas acciones u otras. En nuestro caso de ejemplo, lo único que haremos será modificar el texto de una etiqueta (lblMensaje)

39


colocada en la pantalla principal de la aplicación.

<item android:id="@+id/MnuOpc3" android:title="Opcion3" android:icon="@android:drawable/ic_menu_agenda"> <menu>

@Override

<item android:id="@+id/SubMnuOpc1"

public boolean onOptionsItemSelected(MenuItem item) {

android:title="Opcion 3.1" />

switch (item.getItemId()) {

<item android:id="@+id/SubMnuOpc2"

case R.id.MnuOpc1:

android:title="Opcion 3.2" />

lblMensaje.setText("Opcion 1 pulsada!"); </menu>

return true; case R.id.MnuOpc2:

</item>

lblMensaje.setText("Opcion 2 pulsada!");;

</menu>

return true;

Si volvemos a ejecutar ahora el proyecto y pulsamos la opción 3 nos aparecerá el correspondiente submenú con las dos nuevas opciones añadidas. Lo vemos en la siguiente imagen:

case R.id.MnuOpc3: lblMensaje.setText("Opcion 3 pulsada!");; return true; default: return super.onOptionsItemSelected(item); } }

Comprobamos como efectivamente aparecen las dos nuevas opciones en la lista emergente, y que el título de la lista se corresponde con el texto de la opción elegida en el menú principal (“Opcion3“).

Ojo, el código anterior sería válido para el menú creado mediante XML. Si hubiéramos utilizado la implementación por Para conseguir esto mismo mediante código procederíamos de código tendríamos que sustituir las constantes R.id.MnuOpc_ forma similar a la anterior, con la única diferencia de que la opción de menú 3 la añadiremos utilizando el método por nuestras constantes MNU_OPC_. addSubMenu() en vez de add(), y guardando una referencia al Con esto, hemos conseguido ya un menú completamente submenu. Sobre el submenú añadido insertaremos las dos nuevas funcional. Si ejecutamos el proyecto en el emulador opciones utilizando una vez más el método add(). Vemos cómo comprobaremos cómo al pulsar el botón de ‘menu‘ del teléfono quedaría: aparece el menú que hemos definido y que al pulsar cada opción se muestra el mensaje de ejemplo. Pasemos ahora a comentar los submenús. Un submenú no es más que un menú secundario que se muestra al pulsar una opción determinada de un menú principal. Los submenús en Android se muestran en forma de lista emergente, cuyo título contiene el texto de la opción elegida en el menú principal. Como ejemplo, vamos a añadir un submenú a la Opción 3 del ejemplo anterior, al que añadiremos dos nuevas opciones secundarias. Para ello, bastará con insertar en el XML de menú un nuevo elemento <menu> dentro del item correspondiente a la opción 3. De esta forma, el XML quedaría ahora como sigue: <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/MnuOpc1" android:title="Opcion1"

android:icon="@android:drawable/ic_menu_preferences"></item > <item android:id="@+id/MnuOpc2" android:title="Opcion2"

android:icon="@android:drawable/ic_menu_compass"></item>

40

//Alternativa 2 menu.add(Menu.NONE, MNU_OPC1, Menu.NONE, "Opcion1") .setIcon(android.R.drawable.ic_menu_preferences); menu.add(Menu.NONE, MNU_OPC2, Menu.NONE, "Opcion2") .setIcon(android.R.drawable.ic_menu_compass);

SubMenu smnu = menu. addSubMenu(Menu.NONE, MNU_OPC1, Menu.NONE, "Opcion3") .setIcon(android.R.drawable.ic_menu_agenda); smnu.add(Menu.NONE, SMNU_OPC1, Menu.NONE, "Opcion 3.1"); smnu.add(Menu.NONE, SMNU_OPC2, Menu.NONE, "Opcion 3.2");

En cuanto a la implementación de estas opciones de submenú no habría diferencia con todo lo comentado anteriormente ya que también se tratan desde el evento onOptionsItemSelected(), identificándolas por su ID. Por tanto, con esto habríamos terminado de comentar las opciones básicas a la hora de crear menús y submenus en nuestras aplicaciones Android. En el siguiente artículo veremos algunas opciones algo más avanzadas que, aunque menos frecuentes, puede que nos hagan falta para desarrollar determinadas aplicaciones. © 2013 - www.spanishdeveloperscommunity.es


Créditos este proyecto solamente ha sido posible gracias a la colaboración

Staff

desinteresada y al firme compromiso de:

Antonio García

Ing. Técnico & freelance Gerente Ibidem Network

Susana Albares Javier Rodriguez Angela Escobar

Dipl. Estadística e Informática Gerente Atica web

María Ripoll Periodista

Julio Medellin

Comunicador y programador

Sergio Haro

Programador informatico

Responsable del proyecto Antonio García Prats

Coordinadores de comunicacion Antonio García


Tecnología

Creación de contenido Julio Medellín /simus.rex @simusrex

¿De qué forma influye el desarrollo de contenido en la u imágenes en todas sus variantes. Como ya he mencionado en los artículos anteriores, la programación? manipulación de la imagen tiene muchas aplicaciones, desde un El desarrollo u creación de contenido, en cualquier tipo de simple logo –que bien puede ser utilizado en un videojuego– producción audiovisual o multimedia, es de suprema importancia hasta la creación de efectos especiales para cine, todo ello para la programación; de hecho, es precisamente en este primer delimitado siempre por un contenido establecido en diferentes acercamiento –en el contenido– donde las demás operaciones de etapas. Desde una perspectiva, la creación de contenido suele ser, todas las otras áreas encuentran su inicio y asignación específica. precisamente, un aspecto creativo; de hecho es un proceso de Hablando de proyectos completamente definidos, el contenido es creatividad, sobre todo al inicio, donde se plantea una idea y la razón y el porqué de las entrañas –en nuestro caso de después surge y se bosqueja la manera de cómo llegar a programación– del proyecto u producto, incluso de nuestra realizarlo. En general cada área pasa por éste proceso independientemente herramienta o fin mismo. El cómo y el cuándo siempre son resueltos y llevados a cabo por del contenido definitivo, e incluso así, el contenido que pareciera las demás áreas siendo siempre delimitadas por el objetivo inamovible por lo regular siempre termina cambiando, mismo del contenido. A grandes rasgos el desarrollo de modificándose a las posibilidades y capacidades tanto del factor contenido, siendo ya una carrera y área especializada, comprende humano (comprendiendo no solamente el factor físico o mental a todas aquellas disciplinas cuya finalidad sea diseñar, generar de un individuo sino el cultural, geográfico, social y económico) texto, historia o información específica, crear elementos sonoros como del hardware y software. Todo tipo de contenido es

42

© 2013 - www.spanishdeveloperscommunity.es


siempre cambiante y se ve transformado muchas veces por las diferentes demandas limitantes de cada área. Por supuesto, nunca deberían de cambiar de manera radical. Sí es así tendría que analizarse mucho más el proyecto en sus partes básicas y rudimentarias. Hay otra vista que nos da un tono más seco a cerca del contenido

y esta es el sentido objetivo que conlleva, porque de alguna manera lo que realizamos en el proceso que le sigue a la inventiva y la tormenta de ideas es el análisis; y tal cual, examinamos datos, para tratar las ideas y sus posibilidades de la manera más objetiva posible hacia su materialización. En efecto, la creación de contenidos abarca tanto a la idea original, como al desarrollo mismo del proyecto en sus partes técnicas y hasta las estrategias de marketing o service costumer, mismas que siempre darán valor monetario directo a cualquiera que sea nuestro proyecto. En pocas palabras, el contenido no sólo delinea lo que está por hacerse sino que además de controlar cada asunto creativo también es el motor tractor de ingreso, ventas o patrocinios que aterrizan y materializan nuestras ideas. El desarrollo del contenido varía de manera extensa, al respecto y de forma breve podemos decir que tiene 6 puntos de desarrollo básico: 1.­Videjojuegos (con y sin historia): Aquí claramente es el desarrollo de motores lo que nos interesa, aunque también se usa tecnología para el acabado y efecto del juego así como para su soporte en hardware. © 2013 - www.spanishdeveloperscommunity.es

2.­Cine (incluyendo los teasers y trailers): El desarrollo de tecnología para efectos y 3d es prácticamente la cuestión en este punto, sin descartar, claro, el trabajo de la ingeniaría de sonido al igual que en los videojuegos y la televisión. 3.­Medios digitales: Este punto abarca muchas variantes, desde banners, páginas, blogs, redes sociales y todo tipo de publicidad BTL (Below The Line), y sus plataformas para ser administrados. 4.­Televisión (realitys, sitcoms, series, cortinillas, spots): Al igual que en el cine y los videojuegos, los efectos y montajes muchas veces requieren programación, incluido en ellos el aspecto del audio con su edición, generación, ambientación y diseño. 5.­Medios impresos (periódicos, revistas, espectaculares, carteles, etc): Últimamente los periódicos y revistas electrónicas son tan interactivos que su contenido requiere de un tipo de programación mucho más específica y completa, desde luego la interactividad en ellos se ha ido desarrollando debido al contenido. 6.­Marketing: En este rubro se encuentran vinculados todos los anteriores, a su manera, claro está; sin embargo, como mencionaba anteriormente, el service costumer es parte integral de ello, de esta manera el desarrollo de plataformas para llevar a cabo este servicio también requiere de expertise por parte del área de programación. Todo esto haciendo evidente el trabajo que requiere el área de ventas. Estos puntos tienen de manera individual una acción e injerencia directa con la programación, y ésta a su vez posee estructuras específicas para cada caso; pero aunque parezca obvio, muchas veces existen campañas, servicios o productos que no llegan a su público por una falta de estructura definida para cada rubro, estructura que debería venir precisamente desde el inicio del contenido. En lo que toca a la programación es aquella área encargada de hacer funcionar los sistemas o productos mediante la creación del código y tecnología necesarios para que los objetivos sucedan y de esta manera llegar al fin último, fin mismo que corresponde a un contenido específico.

43


Estructuras de datos

Estructura de datos Cola en C

Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir. El tipo cola representa la idea que tenemos de cola en la vida real. La cola para subir al autobús está compuesta de elementos (personas), que dispone de dos extremos comienzo y fin. Por el comienzo se extraerá un elemento cuando haya comprado el billete para su viaje, y si llega una nueva persona con intención de usar el autobús, tendrá que colocarse al final y esperar que todos los elementos situados antes que él abandonen la cola.

44

Listado 1 ­ módulo de cabecera #ifndef COLA_[tip]_TYPO #define COLA_[tip]_TYPO struct c_[tip]_typo { int x; }; typedef struct p_[tip]_typo *p_[tip]; c_[tip] cola_nueva (); int cola_vacia ( c_[tip] c ); void cola_insertar ( c_[tip] *c, struct c_[tip]_typo e ); void cola_elimina ( c_[tip] *c, struct c_[tip]_typo *e ); void cola_destruye ( c_[tip] *c ); c_[tip] cola_copia ( c_[tip] c );

© 2013 - www.spanishdeveloperscommunity.es


Especificación de la estructura de datos Cola Los objetos del tipo Pila almacenan datos c_[tip] -sustituyendo tip por lo cualquier tipo de datos. En este tipo de datos, los elementos serán insertados y borrados en orden F.I.F.O, es decir, primero en entrar, primero en salir. En este documentos se especificará las funciones y procedimientos básicos que nos permitan implementar esta estructura de datos básica en lenguaje C. Se establece una precondición, en la cual, la estructura de datos debe de cumplir unas condiciones puesto que en caso de no hacerlo debería devolver un mensaje de error o simplemente salir de la función o procedimiento sin hacer nada; especifica que variables modifica y/o devuelve; y por último, explica qué devuelve o qué hace la función.

Primitivas c_[tip] cola_nueva (); Postcondición: Devuelve una pila nueva que no contienen ningún elemento.

int c_[tip] cola_vacia ( c_[tip] c ); Postcondición: Devolverá un valor distinto de cero si la cola contiene algún elemento y cero en caso de que tenga alguno.

void cola_insertar ( c_[tip] *c, struct c_[tip]_typo e ); Precondición: Debe de haber memoria para el nuevo elemento. Modifica: *c Postcondición: Añade el elemento e en la pila *c.

void cola_elimina ( c_[tip] *c struct c_[tip]_typo *e ); Precondición: La pila, *c no podrá estar vacía Modifica: *c y *e Postcondición: Devuelve en *e el elemento que se ha sacado de la cola *c y a su vez lo elimina de la cola.

void cola_destruye ( c_[tip] *c ); Modifica:; *c Postcondición: Libera la memoria ocupada por la cola *c y a la salida *c apuntará a NULL.

c_[tip] cola_copia ( c_[tip] c ); Precondición: Debe de existir memoria disponible para el nuevo elemento; Postcondición: Devuelve una cola que es copia de la que se le pasa por argumento.

© 2013 - www.spanishdeveloperscommunity.es

45


Listado 2 #include <stdlib.h> #include <stdio.h> #include "cola[tip].h" struct c_[tip]_ele { struct c_[tip]_typo val; struct c_[tip]_typo *sig; } /* -----------------------------c_[tip] pila_nueva ( ) { return NULL; } /* -----------------------------int cola_vacia { c_[tip] c ) { return ( c==NULL); } /* -----------------------------void cola_destruye ( c_[tip] *c ) { c_[tip] viejo; while ( *c ) { viejo = *c; *c = *c->sig; free ( viejo ); } } /* -----------------------------void cola_insertar ( c_[tip] *c, struct p_[tip]_typo e ) { c_[tip] nuevo, ultimo;

} /* -----------------------------void cola_elimina ( c_[tip] *c, struct p_[tip]_typo *e ) { c_[tip] viejo; if ( pila_vacia ( *p ) ) { fprintf (stderr, "cola_insertar: la pila estĂĄ vacia\n"); exit(1); } viejo = *c; *e = viejo->val; *c = viejo->sig; free ( viejo ); } /* -----------------------------c_[tip] cola_copia ( c_[tip] c ) { c_[tip] b, corr, viejo; b = NULL; if ( c ) { nuevo = (struct c_[tip]_ele * ) malloc ( sizeof ( struct c_[tip]_ele )); if ( !nuevo ) { fprintf (stderr, " cola_copia: no hay memoria\n" ); exit (1 ); } nuevo->val = p->val; b=corr=nuevo; p=p->sig; while ( p ) { nuevo = (struct p_[tip]_ele* ) malloc (sizeof(struct p_[tip]_ele

nuevo=(struct c_[tip]_ele *) malloc(sizeof ( struct c_[tip]_ele )); if ( !nuevo ) { fprintf (stderr, "cola_insertar: no hay memoria\n"); exit(1); } nuevo->val = e; nuevo->sig = NULL; if ( !*c) *c = nuevo; else { for ( ultimo=*c; ultimo->sig; ultimo=ultimo->sig ) { ultimo->sig = nuevo; }

46

)); if ( !nuevo ) { fprintf ( stderr, "cola_copia: no hay memoria\n" ); exit ( 1); nuevo->val = c->val; corr=corr->sig=nuevo; c=c->sig; } corr->sig = NULL; } return ( b ); } Š 2013 - www.spanishdeveloperscommunity.es



Laboratorio práctico

Trucos para mejorar nuestra red inhalambrica

Posición del router La tecnología inalámbrica libera a los usuarios de los cables, además de permitir una cómoda y mayor movilidad, sin la La señal inalámbrica no tiene demasiado alcance, y cualquier necesidad de solamente tener acceso a internet en un pared o grandes objetos pueden causar interferencia. Por ese determinado lugar. motivo, el router inalámbrico debe estar localizado en el centro de la casa para garantizar la mayor cobertura posible. Los usuarios que utilizamos una conexión a Internet del tipo wireless solemos recibir Lo ideal es colocar el router una notificación de parte en una superficie plana del sistema indicándonos lejos de obstrucciones y que el enlace inalámbrico verificar que el canal es deficiente. Esto sucede inalámbrico sea de uso debido a ciertas exclusivo para evitar particularidades de la interferencias. Se debe propia señal wireless, las ubicar el router wireless, cuales, tomando en lejos, en lo posible, de consideración algunos paredes, sobre el nivel del tips podremos mejorar y suelo y lejos de cualquier lograr una completa y objeto metálico que se mejor cobertura en todos interponga entre el mismo y los rincones de nuestra el receptor. casa u oficina. Comprar un repetidor Existen ciertas acciones que pueden mejorar la conectividad inalámbrica en los hogares. Aquí te enumeramos las principales:

48

en una existente.

Un repetidor inalámbrico es una manera fácil de ampliar la señal. Funciona como un router, pero en lugar de crear una señal, éste se basa

© 2013 - www.spanishdeveloperscommunity.es


Un repetidor es fácil de instalar y no requiere de cables o conexiones adicionales. Múltiples repetidores hacen más fácil crear una red en casa o en la oficina con conectividad total. Sustituir la antena por una de alta ganancia. Las antenas que están incluidas en la mayoría de los routers son pequeñas, con capacidades omni direccionales. Esas antenas transmiten una misma señal en distintas direcciones, muy útil si se necesita conexión en toda una casa, pero el alcance es relativamente corto. Una antena direccional puede mejorar el alcance al focalizar la señal en una dirección específica, permitiendo direccionar la señal donde sea necesario. Esas antenas son comúnmente llamadas "high­gain" y el aumento de la señal es medido en decibeles (dB). Este tipo de antenas consiguen enviar la señal inalámbrica hacia una dirección específica, justo al lugar en donde es necesario una conexión de buen rendimiento. Cambiar la placa de red inhalambrica En el caso de que poseas una notebook o netbook, es una buena idea probar de reemplazar la placa de red WiFI por un adaptador de red USB, debido a que último utiliza una antena externa para mejorar el alcance de la señal wifi. Cambiar el canal del router En la página de Setup del router, podemos cambiar el canal, lo que nos permitirá mejorar la fuerza de la señal. Este ajuste generalmente de fábrica viene ajustado en "Automático", pero podemos ir probando hasta encontrar el nivel de señal que mejor se adapte a nuestros requerimientos. Cambiar el router wifi En las últimas instancias lo que podemos probar es actualizar nuestro router a uno que soporte las últimas normas WiFi, con lo que seguramente podremos subsanar estos defectos de recepción. Cabe destacar que la última versión disponible de WiFi es la © 2013 - www.spanishdeveloperscommunity.es

norma N. Actualización del firmware Los fabricadores de routers publican actualizaciones de firmware de manera regular, y actualizarlos puede generar un incremento en el desempeño y permitir el acceso a nuevos recursos. Otra opción para aquellas personas que saben de tecnología es instalar un firmware de terceros. Existen alternativas gratuitas que pueden ser compatibles para la respectiva actualización. ampliar el wifi con una lata de gaseosa Si bien acceder a Internet sin cables ha aumentado en los últimos años, muchas veces la señal Wi­Fi no es lo suficientemente buena y se pueden tener interrupciones y pérdida de velocidad en la conexión. Es por eso que en este artículo te mostramos cómo mejorar la señal que emite tu router Wi­Fi. Para poder aprovechar al máximo la señal Wi­Fi hogareña y poder aumentar la velocidad de conexión existe un truco muy simple y sólo es necesario un trozo de papel aluminio o una lata de bebida sin la base y sin la tapa cortada por la mitad. Si lo que se desea es ampliar la señal Wi­Fi, sólo se debe colocar el trozo de papel de aluminio o la lata cortada entre el módem y la pared, de esta manera se logrará mejorar la señal, ya que, el aluminio es un buen conductor y evitará que se pierda parte de la señal, la cual era absorvida por la pared. Se debe tener cuidado en el momento de colocar el aluminio ya que en caso de estar mal ubicado podría hacer el efecto contrario y haría perder una cantidad importante de señal. Si el router se encuentra en una esquina, lo ideal es colocar el aluminio (papel o lata) entre la esquina de la pared y la antena, para poder provocar que la señal que antes era absorbida por las paredes y ventanas rebote sin perderse, y por ende, aumentándola.

49



Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.