madaleon
Usuario (Argentina)
Biblioredes abre 5.000 cupos extra para aprender programación en linea y gratis Mediante clases virtuales y monitorizadas por expertos en informática, la entidad pretende incentivar a que gente de todas las edades se vincule con los lenguajes más utilizados. Hoy miércoles 15 de noviembre se abrieron 5.000 nuevos cupos para participar en los cursos de programación que ofrece la Dirección de Bibliotecas, Archivos y Museos (DIBAM), mediante BiblioRedes. Se trata de una iniciativa gratuita, de la cual ya han participado más de 40.000 personas. No hay duda que poseer habilidades de programación puede abrir puertas laborales y ser una herramienta útil para fomentar el pensamiento lógico. La industria de las Tecnologías de Información, lo ha dejado en evidencia hace años. Es en este marco, donde se crean los cursos de capacitación en programación de la DIBAM, que se presentan en su cuarta versión. La intención de la entidad es potenciar el acercamiento de más personas a este mundo, a través de plataformas como Scratch, App Inventor de Android, y los lenguajes JavaScript, CSS y PHP. Los participantes podrán pasar de ser usuarios a potenciales creadores web. Además, desde julio se incluirán dos nuevos módulos de Snap y Python que permitirá crear juegos y aplicaciones, entre otros. Esta iniciativa cuenta con tutorías virtuales, en las que especialistas interactúan con los participantes a través de la misma plataforma Moodle. Todos los módulos cuentan con certificación en línea, diplomas que son emitidos por BiblioRedes y el Consorcio Interamericano de Educación a Distancia (CREAD). Cabe mencionar que el 2015, Jóvenes Programadores obtuvo el primer lugar del Premio de Innovación en Educación Científica en la categoría TIC´s entregado por la Fundación Ciencia Joven y la UNESCO, y hasta la fecha han participado más de 40.000 personas de todo Chile. La forma de participar es simple: se debe completar la ficha en el sitio web de Jóvenes Programadores y luego elegir el módulo por el cual comenzar. La plataforma de estudio online (para quienes se inscriban) se habilitará el 23 de noviembre y seguirá disponible hasta fines de enero de 2018; posteriormente se podrán retomar los estudios en marzo junto a los tutores en línea. Inscribirse a los cursos
Instagram nueva funcion de mensajería grupal Presentado en 2013, Instagram Direct permitía hasta ahora compartir archivos con solo una persona o un grupo pequeño. El sistema ya es empleado por más de 85 millones de personas al mes, motivo suficiente como para que la app propiedad de Facebook potencie como nunca antes el servicio. Instagram Direct permitirá mensajes en cadena y la posibilidad de enviar contenido desde el feed como mensaje directo. "Las cadenas de mensaje facilitan estar en contacto con las personas con quienes más hablas. En lugar de crear una conversación nueva cada vez que mandas una foto o video, la cadena seguirá la conversación inicial con las mismas personas, de esta forma tus momentos fluirán con mayor naturalidad", dijo Instagram. La actualización permitirá además nombrar los grupos (al estilo WhatsApp), así como la opción de responder con una selfie y un emoji. Al mismo tiempo, los usuarios verán una flecha al costado del ícono del corazón y la burbuja de conversación. Su función es enviar un mensaje de Instagram Direct a un amigo o grupo de amigos para que ese contenido aparezca como parte de la conversación. El sistema, consideró la empresa, hará más eficiente la manera en que se comparten contenidos. Hasta ahora, la forma de hacerlo era nombrando amigos en los comentarios, tipeando su nombre de usuario precedido por la @. Las nuevas funciones de Instagram no modificarán la privacidad. Las fotos y videos enviados con Direct solo serán visibles para las personas que ya podían verlos, es decir, si se comparte como mensaje directo un contenido de un usuario cuya cuenta es privada, solo las personas que lo siguen podrán verlo. Las novedades se aplicarán en la versión 7.5 de Instagram, disponible en las próximas horas para iOS y Android.

jQtouch es un plugin jQuery para facilitarnos el trabajo de desarrollar sitios que fácilmente se visualicen en dispositivos como el iPhone o iPod Touch. Principalmente lo que hace es plugin es brindar una interface compatible con los dispositivos de la manzanita, desde la navegación clásica por listas, hasta funciones más avanzadas como por ejemplo formularios, o botones del tipo slider. jQtouch cuenta ademas con varios componentes de interacción, desde las ya conocidos por los usuarios de iPhone como algunos bastantes novedosos que basan su visualización en determinados efectos muy característicos de aplicaciones diseñadas utilizando jQuery. Pueden ver al plugin funcionando desde la demostración online . Este fantastico plugin es una creación de David Kaneda y esta actualmente mantenido por Jonathan Stark. Pueden descargar el código fuente y la documentación desde GitHub .

Hola a todos, Una de las preguntas más frecuentes en los foros para principiantes es “¿Cómo iniciarse en programación?” o “¿Qué lenguaje de programación aprender primero?”. En este artículo intentaré responder a estas preguntas, aunque habrán otros que tendrán opiniones diferentes. Para intentar ser objetivo, me he basado en las opiniones sobre este tema de los foros de programación. Para comenzar, no existe un lenguaje de programación para iniciarse en programación, la programación se comienza sobre un papel, haciendo algoritmos. Claro que para ver si los algoritmos funcionan puede ser más cómodo utilizar un lenguaje de programación. En este caso lo único que recomiendo es utilizar un lenguaje simple que no sea orientado a objetos, ni gráfico. Una buena elección puede ser Basic, Pascal, Python y sobretodo la sintaxis de estos últimos será de mayor utilidad más adelante. Pero no deberiamos excluir ningun lenguaje ya que incluso el lenguaje de una calculadora puede ser suficiente para probar algoritmos simples. También, es bueno tener una idea de los tipos de lenguaje, de lo que es un compilador y otras cosas generales. (http://es.kioskea.net/langages/langages.php3). A estas alturas, ya tenemos algunas bases para comenzar a programar…algo más, no hay que programar por programar, hay que tener un objetivo, una idea, la necesidad de crear un programa. Aquí, yo nada puedo hacer por ti, esto está en función de tus gustos, conocimientos,..y ahora debemos tomar las primeras decisiones técnicas: ¿Lenguaje orientado a objetos? ¿Multiplataforma? ¿Con máquina virtual? ¿Interfaz usuario? ¿Acceso a una base de datos? ¿Si es así, cuál? Una vez que hayas respondido a estas interrogantes, el número de lenguajes de programación será más reducido. A continuación vamos a ver los lenguajes de programación que mayormente son recomendados para iniciarse en programación, teniendo en cuenta el punto de vista del aprendizaje. Nota: existe también un medio muy lúdico para descubrir la programación: KPL. KPL significa Kid's Programming Language (la página web: http://phrogram.com/kpl.aspx). Interfaz impecable (colores, sonido, grafismo) y un aprendizaje de la programación orientada a la concepción de juegos. La idea es: aprender divirtiéndose. Si realmente no sabes nada de nada en informática ni programación, éste puede ser la puerta de entrada. Del mismo modo, éste es un medio para que aprendan los niños. Este programa es un freeware y no está limitado a los juegos, y por supuesto, la página es multilenguaje (inglés, portugués, francés y algunas lenguas nórdicas), al igual que el programa. En cuanto al lenguaje, éste utiliza los términos comúnmente empleados en otros lenguajes: Begin, End, Main, False, True, etc. Los lenguajes de programación que podemos utilizar Delphi/Pascal Una buena solución, los compiladores y entornos de desarrollo se encuentra gratuitamente (bajo ciertas condiciones). Podemos comenzar haciendo pequeños programas en el Shell de Pascal y luego podemos pasar (después de haber aprendido la noción de objeto) a cosas más potentes con entornos gráficos gracias a Delphi (y Kylix bajo Linux). El lenguaje es relativamente intuitivo y riguroso, la creación de interfaz gráfica es simple, rápidamente podemos sentirnos a gusto. La portabilidad es mediocre pero existe hacia algunas plataformas (Kylix…) Para aprender Pascal http://www.programacionfacil.com/programacion:manual_pascal Página oficial Delphi (Inglés): http://www.codegear.com/en/products/delphi Java Lenguaje orientado a objetos, muy portable, sintaxis utilizada también para los scripts de Internet (la sintaxis, no el lenguaje…). Existen gran cantidad de entornos de desarrollo gratuitos en la web: no hay más que elegir en función de nuestros gustos, sin embargo, no tiene la facilidad de Delphi en lo que respecta a la interfaz gráfica. Este es un lenguaje de “última generación” que dará una experiencia interesante a los que deseen trabajar en informática. Para aprender Java: http://www.manual-java.com/ "PAGAN MUY BIEN EN EL MERCADO" Python Simple, rápido, crea buenas costumbres de programación, ligero (tanto así que pasar a otro lenguaje después se hace pesado), abierto, gran cantidad de documentación en Internet. Este nos permite rápidamente entrar en acción, ya sea creando scripts potentes (gracias a la programación orientada a objetos) u otras cosas. Es también de “ultima generación” y portable. Funciona con una máquina virtual que puede ser empaquetada gracias a algunas clases disponibles en la web (se encuentran de todo tipo y para todos los fines…) en un exe para distribuir la aplicación de manera simple e independiente. Página oficial de Python (en inglés): http://www.python.org/ Guía de aprendizaje de Python: http://www.programacion.com/tutorial/python/ .Net Es el futuro según Microsoft, hay cosas buenas y malas en esta plataforma pero permite programar aplicaciones gráficas de manera simple, sólo corre en Windows y con algunas adaptaciones en Linux. Yo recomendaría C# que es el lenguaje “nativo” de esta plataforma: su sintaxis muy similar a la de C y Java, no hay punteros, todo se hace en un nivel de abstracción superior a los antiguos lenguajes de Microsoft. Se compara a Java y a Python, excepto que no es libre. Un entorno de desarrollo gratuito y Open source para .Net: http://www.icsharpcode.net/OpenSource/SD/ Smalltalk Para mí el lenguaje orientado a objetos por excelencia. Gratuito, sintaxis simple, impone un rigor sin igual en la programación orientada a objetos. Desgraciadamente no es muy utilizado, es raro encontrar un empleo con éste, pero da una referencia solida, y con cosas como Squeak permiten hacer gran cantidad de cosa con él. Squeak: http://www.squeak.org/ Tutorial Dolphin Smalltalk: http://www.dolphinmap.net/wiki/Documentation Los que podemos utilizar en última instancia C/C++ Estos son buenos lenguajes, pero con una sintaxis complicada que no facilita su aprendizaje. Además el uso de punteros hace que su uso, incluso para los profesionales, sea complicado. La ventaja es que estos lenguajes pueden ser utilizados en diversas plataformas (después de compilación) y que, una vez dominados, hacen que los otros parezcan simples. Estos lenguajes son aún muy utilizados en el mundo profesional. Utilízalo si se deseas hacer de la informática tu profesión. Para aprender C: http://sopa.dis.ulpgc.es/so/cpp/intro_c/ Para aprender C++: http://zator.com/Cpp/E1_2.htm Página de Borland C++: http://www.codegear.com/en/products/cppbuilder PHP Un lenguaje inicialmente previsto para el desarrollo de páginas web dinámicas. Su sintaxis es muy similar a la de C++. PHP es bastante simple de abordar y permite conectarse fácilmente a una base de datos. Para desarrollar páginas web dinámicas, se requiere también un buen conocimiento de Html y eventualmente de Sql si se necesita una base de datos. Permite ver rápidamente el trabajo, poniéndolo en línea, y de este modo tener los comentarios/sugerencias de los internautas. También podemos desarrollar otras aplicaciones que no sean para la web con este lenguaje. Podemos programar de manera procedural u orientada a objetos, a nuestra elección. Es un buen lenguaje pero no necesariamente el mejor para aprender. Es potente y permisivo pero con el riesgo de aprender malas costumbres. Especialmente en lo que respecta a las páginas web, éste no influye para que se programe con propiedad desde el inicio. Si buscas un lenguaje que sea fácil de aprender, que te permita aprender la programación orientada a objetos, y que te deje buenas costumbres de programación, entonces elije mas bien un lenguaje como Python. Para aprender PHP: http://geneura.ugr.es/~maribel/php/ Página oficial: http://www.php.net/ Ada Lenguaje aún utilizado en la programación de sistemas de tiempo real. Es fácil de aprender pero es recomendado sobretodo para los futuros informáticos, si no, no hay mucho interés. Es mejor pasar a Ada solamente con el objetivo del “tiempo real” ya que tiende a desaparecer. Para aprender Ada: http://www.wikilearning.com/curso_gratis/curso_de_ada-introduccion/10578-1 Lo siento, no tengo más enlaces, no dudes en añadirlos si conoces buenos Lisp/Caml/... Los lenguajes funcionales son numerosos, están clasificados en dos grandes familias: los puros (haskell) y los no puros (familia lisp). A la vez la familia de los puros están clasificados en dos: los verdaderamente puros, sin efecto efecto secundario (familia haskell) y la familia ML (Caml,SML,...). La manera de programar es totalmente diferente con relación a los otros lenguajes. La programación funcional es otra manera de ver un programa y eso no impide por ejemplo tener un lenguaje funcional y orientado a objetos (scala por ejemplo) o incluso un lenguaje funcional que asocie imperativo/orientado a objetos/funcional (Ocaml). Conocer uno de estos permite tener buenas bases y permitirá también a las personas más orientadas a las matemáticas pasarse suavemente a la informática. Estos por lo general son utilizados en análisis numérico o en inteligencia artificial (pero es sólo a causa de su origen). Podemos utilizarlos para programar todo lo que se puede programar con otros lenguajes (la comunidad commonlisp es muy activa) http://fr.wikipedia.org/wiki/Common_Lisp http://www.paulgraham.com/onlisp.html http://www.scala-lang.org/index.html Los que no podemos utilizar (x)HTML/CSS Voy a ser breve, escribir una página web o un sitio web en HTML es a la programación lo que beber un vaso de agua es al alcoholismo. Aquí se trata de presentar un documento, no de programar, y no porque se agregan algunos scripts esto cambia gran cosa. Para aprender HTML: http://es.kioskea.net/html/htmlintro.php3 Para aprender DHTML: http://www.programacion.net/html/dinamico/tutorial/principal.htm Perl Seamos claros, este lenguaje aparentemente simple no es en lo absoluto adaptado al aprendizaje de la programación. Su flexibilidad y potencia pueden hacer que adquieras malas costumbres de programación e incluso te pueden desalentar por los errores que se están autorizados a cometer. Es mejor comenzar aprendiendo un lenguaje riguroso, para luego explotar al máximo Perl. Para aprender Perl: http://www.wikilearning.com/... Visual Basic/Basic: D Los profesionales que han trabajado con él lo desaconsejan. Este crea malas costumbres de programación (no es necesaria la declaración de variables, ninguna noción de valor/referencia, tentativa fracasada de programar con objetos,…), y además Microsoft (se trata de un lenguaje propietario) lo ha abandonado para privilegiar a Framework.Net. Para terminar, no existe ninguna versión gratuita, por lo tanto necesariamente hay que pagar. El sólo punto positivo que le reconocería es su lado lúdico y la facilidad de hacer interfaces gráficas para Windows (algo que olvidaba, tampoco es portable…), pero no es el único, si es el que te interesa, más bien inclínate hacia Delphi o .Net. El caso de Basic es más o menos el mismo, existen compiladores gratuitos, pero se trata de un lenguaje obsoleto que no es ni rápido, ni portable, ni orientado a objetos, ni riguroso. Inclínate por Pascal que te permitirá luego evolucionar hacia Delphi. Para aprender Visual Basic: http://www.lopezdearenas.com/informatica/curso-vb.pdf Un consejo, es muy común en el mundo de la programación tener que leer artículos en ingles, por lo que aprenderemos a programar en mejores condiciones si podemos leer en inglés o mejor aun si lo podemos escribir. (para hacer preguntas en los foros especializados…). Bueno, espero que haya sido lo más completo posible. ------------------------------- Puedes encontrar muchos compiladores gratuitos para diferentes lenguajes en esta dirección: http://www.thefreecountry.com/ PD: Iniciarse en programación, es también estar confrontado a una espinosa cuestión: ¿Pero por qué mi programa no corre? Los mensajes de error mostrados (o no) por los entornos de compilación o de ejecución (o el comportamiento de los dos) a veces sumergen al principiante en una confusión total que puede volverse exasperante. Un buen método es dar el código a alguien con experiencia para que lo lea primero, y/o explicar a otra persona el problema. A veces decir en voz alta nuestro razonamiento nos pondrá en la vía correcta. Finalmente la capacidad a programar (bien) va (a menudo) de la par con la de abstraerse de este mundo material en el cual nos encontramos sumergidos. Bienvenido al mundo donde nada es realmente concreto. Si te gusta demasiado la programación, quizás soñaras con ella… Entonces ten en ese momento un papel y un lápiz (el arma de todo informático) en el velador, toma nota de las soluciones que te vienen a la mente y pruébalas por la mañana.
Conmemoración del “Día del programador” Como todos sabemos, hoy es el Día del programador y ¿Por qué hoy?. El número 256 (28) fue el elegido porque es el número de distintas combinaciones que pueden representarse con 8 bits, número muy conocido entre los programadores. Además es la mayor potencia de 2 menor que 365, número de días del año. El día de los programadores es un día festivo oficial en Rusia. La idea fue una propuesta de Valentin Balt, un empleado de una compañía de diseño web(Parallel Technologies). En el año 2002 intentó recoger firmas para presentar la petición formal al Gobierno Ruso para que fuese reconocido este día como el día oficial de los programadores. Éste día es celebrado en muchos países. Existen tradiciones en algunos países donde se incluye jugar a viejos juegos, hacer pequeños programas inútiles, enviar mensajes de texto, enviar e-mails, etc. aunque en ésta nueva era de la informática se espera que se inunden las redes sociales usando hashtags en redes sociales como Twitter, se hable en otras redes sociales profesionales como por ejemplo Linkedin, Xing, etc. En otros países, se acostumbra un tradicional brindis en las empresas del sector. Como nota de humor a este día, hay que indicar las 20 frases más usadas por programadores cuando algo no funciona: 20: “Pues es raro…” 19: “Nunca había pasado antes.” 18: “Pues ayer funcionaba…” 17: “¿Cómo es posible?” 16: “Tiene que ser un problema de tu hardware.” 15: “¿Qué hiciste mal para lograr que fallara?” 14: “Algo debe de estar mal en tus datos.” 13: “¡Si no he tocado ese módulo en meses!” 12: “Debes de estar usando una versión anterior.” 11: “Es sólo una desafortunada coincidencia.” 10: “¡Es que no lo puedo probar todo!” 9: “ESTO, no puede ser la causa de ESO.” 8: “Funciona, pero no lo he probado.” 7: “¡Alguien debe de haber cambiado mi código!” 6: “¿Has comprobado que no haya algún virus en tu sistema?” 5: “Ya sé que no funciona, pero ¿te gusta?” 4: “No puedes utilizar esa versión en tu sistema” 3: “¿Por qué quieres hacer eso?” 2: “¿Y tú dónde estabas cuando se colgó el programa?” Y la respuesta más usada es: 1: “¡EN MI MÁQUINA SÍ FUNCIONA!” Les deseo a todos los programadores un buen y feliz día del programador!
Patron SingletonEl patrón de diseño singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.El patrón singleton se implementa creando en nuestra clase un método que crea una instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con atributos como protegido o privado).La instrumentación del patrón puede ser delicada en programas con múltiples hilos de ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no existe todavía, sólo uno de ellos debe lograr crear el objeto. La solución clásica para este problema es utilizar exclusión mutua en el método de creación de la clase que implementa el patrón.Las situaciones más habituales de aplicación de este patrón son aquellas en las que dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o un archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible para todos los demás objetos de la aplicación.El patrón singleton provee una única instancia global gracias a que:La propia clase es responsable de crear la única instancia.Permite el acceso global a dicha instancia mediante un método de clase.Declara el constructor de clase como privado para que no sea instanciable directamente.Ejemplo aplicado a una clasepublic class Fabrica { public static Fabrica instance; public static Fabrica getInstance() { if (instance == null) { return instance = new Fabrica(); } return instance; } public String getMensaje() { return "Singleton"; }}TestFabrica.javapublic class TestFabrica { public static void main(String[] args) { String mensaje = Fabrica.getInstance().getMensaje(); System.out.println(mensaje); } }PATRONES DE DISEÑO EN APLICACIONES

En este ejemplo veremos nuevamente el uso interceptores, como ya hemos mencionado en otros post, Struts2 posee una amplia gama de funciones que permiten hacer mas ágil el desarrollo y que están puestas a disposición de los desarrolladores a través de los interceptores que vienen por default. En esta ocasión veremos un interceptor que nos permite realizar una de las funciones con la que comúnmente nos topamos en el desarrollo de aplicaciones empresariales, se trata de la carga de archivos. El interceptor FileUpload está dado de alta en la pila de interceptores del paquete default que maneja Struts2. org.apache.struts2.interceptor.FileUploadInterceptor Si ya tenemos configurado nuestro proyecto solo es necesario agregar estas librerías: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar Si no recuerdas que otras librerías son requeridas o como configurar tu proyecto para usar Struts2 puedes regresar al primer ejemplo que vimos en este mismo blog sobre como hacerlo: El primer ejemplo de Struts2 Lo primero que haremos es crear un formulario de carga de archivos, el código lo muestro a continuación: <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Carga de archivos con interceptores</title> </head> <body> <h1>Carga de archivos con interceptores</h1> <s:form action="CargaArchivo" method="post" enctype="multipart/form-data"> <s:file name="archivo" label="Carga Archivo"/> <s:submit value="Subir" align="center"/> </s:form> </body> </html> Despues creamos la clase AccionCargaArchivo que se encargará de recibir y manejar el contenido del archivo. package ejemplos.struts2.accion; import com.opensymphony.xwork2.ActionSupport; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public class AccionCargaArchivo extends ActionSupport { private File archivo; private String archivoContentType; private String archivoFileName; private String datos = ""; public String execute() { try{ BufferedReader entrada = new BufferedReader( new FileReader( archivo ) ); if ( archivoContentType.equals("text/plain")){ String aux; while((aux = entrada.readLine()) != null){ datos += aux + "n"; } } }catch(Exception e){ e.printStackTrace(); } return SUCCESS; } public File getArchivo() { return archivo; } public void setArchivo(File archivo) { this.archivo = archivo; } public String getArchivoContentType() { return archivoContentType; } public void setArchivoContentType(String archivoContentType) { this.archivoContentType = archivoContentType; } public String getArchivoFileName() { return archivoFileName; } public void setArchivoFileName(String archivoFileName) { this.archivoFileName = archivoFileName; } public String getDatos() { return datos; } public void setDatos(String datos) { this.datos = datos; } } Del la clase Action anterior observa cuidadosamente las siguientes variables: File nombreDeArchivo; String nombreDeArchivoContentType; String nombreDeArchivoFileName; Como puedes ver la variable de tipo File tiene un nombre arbitrario, sin embargo las otras dos deben cumplir con un formato establecido para que el interceptor pueda encontrarlas y establecer los datos correspondientes al tipo de contenido y al nombre del archivo. archivo - Es el nombre del archivo. archivoContentType - Contiene el tipo de contenido del archivo. archivoFileName - Contiene el nombre del archivo tal como fue almacenado en el servidor. Esto es todo lo que debe hacerse para que el Framework a través del inteceptor tome el archivo y lo relacione con las variables que declaramos en el Action. También haremos la jsp de respuesta, que solo mostrará algunos datos del archivo que se esta subiendo al servidor. El código es el siguiente: <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>El archivo fué recibido con exito!</h1> El tipo del contenido es : <s:property value="archivoContentType"/><br> Nombre del archivo es : <s:property value="archivoFileName"/><br> Nombre del archivo temporal : <s:property value="archivo.name"/><br> Contenido del archivo :<br> <s:textarea name="dat" value="%{datos}" cols="50" /> </body> </html> y por último haremos cambios necesarios en el archivo de configuración de Struts2 para hacer referencia a las clases y jsps que acabamos de crear. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default"> <action name="FormularioCargaArchivo" > <result>/formularioDeCargaDeArchivo.jsp</result> </action> <action name="CargaArchivo" class="ejemplos.struts2.accion.AccionCargaArchivo"> <result>/archivoCargado.jsp</result> <result name="input">/formularioDeCargaDeArchivo.jsp</result> </action> </package> </struts> El código fuente de todos los archivos aqui: AccionCargaArchivo.java struts.xml formularioDeCargaDeArchivo.jsp archivoCargado.jsp web.xml Si corres el ejemplo y mandas llamar al formulario de carga de archivo debe aparecerte algo como lo siguiente: formularioDeCargaDeArchivo.jsp Como puedes ver nos aparece el campo para especificar el archivo que queremos subir. Para este ejemplo solo cargaremos archivos de texto plano y visualizaremos el contenido. Damos click en el boton de Subir y tendremos una respuesta como esta: En esta jsp mostramos el tipo de datos del archivo, el nombre del archivo y el nombre que tendrá temporalmente en el servidor mientras es procesado durante el tiempo que se ejecute nuestra acción. Despues mostramos simplemente el contenido. Listo ya tenemos el ejemplo. Es importante que sepas que el archivo temporal se removera del servidor una vez que el ciclo de llamada a la acción termine.
Patrones de Diseño en aplicaciones Web con Java J2EEComo analistas y programadores vamos desarrollando a diario nuestras habilidades para resolver problemas usuales que se presentan en el desarrollo del software. Por cada problema que se nos presenta pensamos distintas formas de resolverlo, incluyendo soluciones exitosas que ya hemos usado anteriormente en problemas similares. Es así que a mayor experiencia que tengamos, nuestro abanico de posibilidades para resolver un problema crece, pero al final siempre habrá una sola solución que mejor se adapte a nuestra aplicación. Si documentamos esta solución, podemos reutilizarla y compartir esa información que hemos aprendido para resolver de la mejor manera un problema específico.Los patrones del diseño tratan los problemas del diseño que se repiten y que se presentan en situaciones particulares del diseño, con el fin de proponer soluciones a ellas. Por lo tanto, los patrones de diseño son soluciones exitosas a problemas comunes. Existen muchas formas de implementar patrones de diseño. Los detalles de las implementaciones son llamadas estrategias.En este artículo, veremos algunos patrones de diseño para las aplicaciones basadas en J2EE.Breve historia de los patrones de diseñoUn patrón de diseño es una abstracción de una solución en un nivel alto. Los patrones solucionan problemas que existen en muchos niveles de abstracción. Hay patrones que abarcan las distintas etapas del desarrollo; desde el análisis hasta el diseño y desde la arquitectura hasta la implementación.Muchos diseñadores y arquitectos de software han definido el término de patrón de diseño de varias formas que corresponden al ámbito a la cual se aplican los patrones. Luego, se dividió los patrones en diferentes categorías de acuerdo a su uso.Los diseñadores de software extendieron la idea de patrones de diseño al proceso de desarrollo de software. Debido a las características que proporcionaron los lenguajes orientados a objetos (como herencia, abstracción y encapsulamiento) les permitieron relacionar entidades de los lenguajes de programación a entidades del mundo real fácilmente, los diseñadores empezaron a aplicar esas características para crear soluciones comunes y reutilizables para problemas frecuentes que exhibían patrones similares.Fue por los años 1994, que apareció el libro "Design Patterns: Elements of Reusable Object Oriented Sofware" escrito por los ahora famosos Gang of Four (GoF, que en español es la pandilla de los cuatro) formada por Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides. Ellos recopilaron y documentaron 23 patrones de diseño aplicados usualmente por expertos diseñadores de software orientado a objetos. Desde luego que ellos no son los inventores ni los únicos involucrados, pero ese fue luego de la publicación de ese libro que empezó a difundirse con más fuerza la idea de patrones de diseño.El grupo de GoF clasificaron los patrones en 3 grandes categorías basadas en su PROPÓSITO: creacionales, estructurales y de comportamiento. * Creacionales: Patrones creacionales tratan con las formas de crear instancias de objetos. El objetivo de estos patrones es de abstraer el proceso de instanciación y ocultar los detalles de cómo los objetos son creados o inicializados. * Estructurales: Los patrones estructurales describen como las clases y objetos pueden ser combinados para formar grandes estructuras y proporcionar nuevas funcionalidades. Estos objetos adicionados pueden ser incluso objetos simples u objetos compuestos. * Comportamiento: Los patrones de comportamiento nos ayudan a definir la comunicación e iteración entre los objetos de un sistema. El propósito de este patrón es reducir el acoplamiento entre los objetos.En el segundo nivel, ellos clasificaron los patrones en 2 ámbitos: Clases y objetos. Es así que, tenemos 6 tipos de patrones:Creacionales * Creacional de la Clase Los patrones creacionales de Clases usan la herencia como un mecanismo para lograr la instanciación de la Clase. Por ejemplo el método Factoría. * Creacional del objeto Los patrones creacionales de objetos son más escalables y dinámicos comparados de los patrones creacionales de Clases. Por ejemplo la Factoría abstracta y el patrón Singleton.Estructurales * Estructural de la Clase Los patrones estructurales de Clases usan la herencia para proporcionar interfaces más útiles combinando la funcionalidad de múltiples Clases. Por ejemplo el patrón Adaptador (Clase). * Estructural de Objetos Los patrones estructurales de objetos crean objetos complejos agregando objetos individuales para construir grandes estructuras. La composición de l patrón estructural del objeto puede ser cambiado en tiempo de ejecución, el cual nos da flexibilidad adicional sobre los patrones estructurales de Clases. Por ejemplo el Adaptador (Objeto), Facade, Bridge, Composite.Comportamiento * Comportamiento de Clase Los patrones de comportamiento de Clases usan la herencia para distribuir el comportamiento entre Clases. Por ejemplo Interpreter. * Comportamiento de Objeto Los patrones de comportamiento de objetos nos permite analizar los patrones de comunicación entre objetos interconectados, como objetos incluidos en un objeto complejo. Ejemplo Iterator, Observer, Visitor.Patrones J2EECon la aparición del J2EE, todo un nuevo catálogo de patrones de diseño apareció. Desde que J2EE es una arquitectura por si misma que involucra otras arquitecturas, incluyendo servlets, JavaServer Pages, Enterprise JavaBeans, y más, merece su propio conjunto de patrones específicos para diferentes aplicaciones empresariales.De acuerdo al libro "J2EE PATTERNS Best Practices and Design Strategies", existen 5 capas en la arquitectura J2EE: * Cliente * Presentación * Negocios * Integración * RecursoEl libro explica 15 patrones J2EE que están divididos en 3 de las capas: presentación, negocios e integración.Catálogo de patrones J2EECapa de PresentaciónDecorating Filter / Intercepting Filter Un objeto que está entre el cliente y los componentes Web. Este procesa las peticiones y las respuestas.Front Controller/ Front ComponentUn objeto que acepta todos los requerimientos de un cliente y los direcciona a manejadores apropiados. El patrón Front Controller podría dividir la funcionalidad en 2 diferentes objetos: el Front Controller y el Dispatcher. En ese caso, El Front Controller acepta todos los requerimientos de un cliente y realiza la autenticación, y el Dispatcher direcciona los requerimientos a manejadores apropiada.View HelperUn objeto helper que encapsula la lógica de acceso a datos en beneficio de los componentes de la presentación. Por ejemplo, los JavaBeans pueden ser usados como patrón View Helper para las páginas JSP.Composite viewUn objeto vista que está compuesto de otros objetos vista. Por ejemplo, una página JSP que incluye otras páginas JSP y HTML usando la directiva include o el action include es un patrón Composite View.Service To WorkerEs como el patrón de diseño MVC con el Controlador actuando como Front Controller pero con una cosa importante: aquí el Dispatcher (el cual es parte del Front Controller) usa View Helpers a gran escala y ayuda en el manejo de la vista.Dispatcher ViewEs como el patrón de diseño MVC con el controlador actuando como Front Controller pero con un asunto importante: aquí el Dispatcher (el cual es parte del Front Controller) no usa View Helpers y realiza muy poco trabajo en el manejo de la vista. El manejo de la vista es manejado por los mismos componentes de la Vista.Capa de NegociosBusiness DelegateUn objeto que reside en la capa de presentación y en beneficio de los otros componentes de la capa de presentación llama a métodos remotos en los objetos de la capa de negocios.Value Object/ Data Transfer Object/ Replicate ObjectUn objeto serializable para la transferencia de datos sobre lar red.Session Façade/ Session Entity Façade/ Distributed FaçadeEl uso de un bean de sesion como una fachada (facade) para encapsular la complejidad de las interacciones entre los objetos de negocio y participantes en un flujo de trabajo. El Session Façade maneja los objetos de negocio y proporciona un servicio de acceso uniforme a los clientes.Aggregate Entity Un bean entidad que es construido o es agregado a otros beans de entidad.Value Object AssemblerUn objeto que reside en la capa de negocios y crea Value Objets cuando es requerido.Value List Handler/ Page-by-Page Iterator/ Paged ListEs un objeto que maneja la ejecución de consultas SQL, caché y procesamiento del resultado. Usualmente implementado como beans de sesión.Service LocatorConsiste en utilizar un objeto Service Locutor para abstraer toda la utilización JNDI y para ocultar las complejidades de la creación del contexto inicial, de búsqueda de objetos home EJB y recreación de objetos EJB. Varios clientes pueden reutilizar el objeto Service Locutor para reducir la complejidad del código, proporcionando un punto de control.Capa de IntegraciónData Access Object Service ActivatorConsiste en utilizar un objeto de acceso a datos para abstraer y encapsular todos los accesos a la fuente de datos. El DAO maneja la conexión con la fuente de datos para obtener y almacenar datos.Service ActivatorSe utiliza para recibir peticiones y mensajes asíncronos de los clientes. Cuando se recibe un mensaje, el Service Activator localiza e invoca a los métodos de los componentes de negocio necesarios para cumplir la petición de forma asíncrona.EnlaceSUNhttp://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html
Metascan escanea tus archivos online con 31 antivirus diferentes Metascan Online es una interesante al ya conocido Virustotal, un escáner de virus que analiza nuestro archivo con 31 antivirus diferentes, lo cual le da un nivel de seguridad impresionante, y lo mejor de todo es que es totalmente gratuito y no hay que instalar nada. Sólo tienen que subir el archivo que quieran analizar y esperar a que el servidor lo analice, luego les dará el resultado con la lista de motores y si han detectado algo o no. La lista completa de los motores que utiliza Metascan la pueden ver desde aquí.

Como hacer un organizador de carton Estamos muy acostumbrados a perder lapices, lapiceras, tijeras y varios útiles, por lo que decidí aprovechar varias cajas que tenia guardadas y hacer un organizador sobre mi mesa de trabajo. Los materiales a utilizar los encontramos en cualquier lado ya que son cajas forradas con papeles de colores o con algún diseño personal. Es un proyecto muy sencillo y prácticamente gratuito, ademas no se ustedes, pero yo disfruto mucho de hacer manualidades con carton reciclado. MATERIALES: - Cajas sin usar - Papel para forrar las cajas - Plasticola blanca - Pincel - Tijeras o navajas - Regla - Marcador o lápiz - Pistola encoladora con barras de pegamento - Madera sin usar o cartón - Clavos pequeños PASOS: 1. Toma las medidas de tu caja y marca con un lápiz las medidas que quieres que tenga. 2. Corta la caja a la medida deseada y corta uno de los lados, dejando solo 3. Los lados que te deben quedar son: la parte inferior, el costado derecho, el costado izquierdo y el frente. Como muestra la imagen. 3. De la misma forma que envuelves un regalo cubre tu caja con algún papel que te guste. Primero corta un papel dejando bastante espacio extra, luego pega el panel frontal de la caja con su parte superior alineada con el borde del papel. Pásala el dedo para alisarla y que quede prolija. Coloca pegamento en los lados de la caja y coloca el papel. 4. Para cubrir la parte inferior de la caja corta el excedente de papel de los lados dejándolo paralelo al fondo de la caja, creando una solapa cuadrada para cubrirlo. Coloca pegamento y pegalo. Corta cualquier exceso de papel que te haya quedado. 5. Para poder pegar la cajita a la madera o cartón deja 1.5 cm extra de papel en cada lado. 6. Repite los pasos para crear todas las cajas que quieras. Ten en mente que puedes usar las esquinas de las cajas para hacer interesantes organizadores con formas triangulares. 7. Cubre el pedazo de madera o cartón con papel, coloca pegamento en toda la superficie, pegalo y alisalo para que quede prolijo. Dobla los excesos en los bordes hacia la parte inferior y pegalos. Esta sera la base de tu organizador sobre la cual colocaras las cajitas. 8. Acomoda las cajas a tu madera o cartón. 9. Usando la pistola encoladora coloca una linea de pegamento en el borde que colocaras contra el cartón. Si el borde es muy fino coloca la mayor cantidad de pegamento que puedas y déjalo secar. 10. Pega todas las cajitas a la madera. 11. Usa plasticola blanca o cualquier otro pegamento para pegar las solapas que dejaste en cada caja a la madera o cartón. 12. Coloca el organizador a tu pared con unos clavitos pequeños y comienza a acomodar todos tus materiales.