tag:blogger.com,1999:blog-65295153961628308552024-03-13T00:45:45.141+01:00Apuntes y trucos de programaciónprogramacion informatica trucos apuntes sobre ajax, css, html, java, javascript, linux, oracle, php, regex, servlet, ubuntumugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.comBlogger46125tag:blogger.com,1999:blog-6529515396162830855.post-91379480770231933662023-09-06T13:15:00.001+02:002023-09-07T09:24:49.160+02:00Política de PrivacidadPolítica de Privacidad
Fecha de última actualización: 06/09/2023
Bienvenido/a a nuestro Sitio Web ("nosotros", "nuestro" o "el Sitio Web"). En nuestro del Sitio Web], valoramos y respetamos su privacidad. Esta Política de Privacidad describe cómo recopilamos, utilizamos y protegemos la información personal que usted proporciona a través de nuestro sitio web y servicios relacionados. Al acceder y utilizar nuestro sitio web, usted acepta los términos y condiciones de esta Política de Privacidad.
1. Información que Recopilamos
1.1 Información Personal
Recopilamos información personal que usted nos proporciona voluntariamente cuando interactúa con nuestro sitio web y servicios. Esta información puede incluir su nombre, dirección de correo electrónico, número de teléfono y otra información de contacto. También podemos recopilar información de facturación si realiza compras a través de nuestro sitio web.
1.2 Información de Registro
Cuando visita nuestro sitio web, nuestros servidores registran automáticamente cierta información, como su dirección IP, el tipo de navegador que está utilizando, las páginas que visita en nuestro sitio web y la fecha y hora de su visita.
1.3 Cookies y Tecnologías Similares
Utilizamos cookies y tecnologías similares para recopilar información sobre su navegación y su comportamiento en nuestro sitio web. Las cookies son pequeños archivos de datos que se almacenan en su dispositivo y nos permiten reconocerlo cuando regresa a nuestro sitio web. Puede configurar su navegador para que rechace todas las cookies o para que le avise cuando se envíen cookies. Sin embargo, esto puede afectar su experiencia en nuestro sitio web.
2. Uso de la Información
Utilizamos la información que recopilamos para los siguientes fines:
2.1 Proporcionar y Mejorar Nuestros Servicios
Utilizamos su información para proporcionarle los servicios que solicita a través de nuestro sitio web y para mejorar la calidad de nuestros servicios.
2.2 Comunicación
Podemos utilizar su información de contacto para enviarle comunicaciones relacionadas con el servicio, como confirmaciones de compra, actualizaciones de cuenta y notificaciones importantes.
2.3 Publicidad y Anuncios
Podemos utilizar su información para personalizar los anuncios que se muestran en nuestro sitio web y para medir la efectividad de nuestras campañas publicitarias.
3. Compartir Información
No vendemos ni alquilamos su información personal a terceros. Sin embargo, podemos compartir su información personal en las siguientes circunstancias:
3.1 Proveedores de Servicios
Podemos compartir su información con terceros que prestan servicios en nuestro nombre, como procesadores de pagos y servicios de alojamiento web.
3.2 Cumplimiento de la Ley
Podemos divulgar su información personal si creemos de buena fe que es necesario para cumplir con una obligación legal, proteger nuestros derechos legales o responder a una solicitud legal.
4. Seguridad de la Información
Tomamos medidas razonables para proteger su información personal contra el acceso no autorizado, la divulgación, la alteración o la destrucción. Sin embargo, ningún sistema de seguridad es completamente impenetrable, y no podemos garantizar la seguridad de la información que usted nos proporciona.
5. Cambios en esta Política de Privacidad
Nos reservamos el derecho de actualizar o modificar esta Política de Privacidad en cualquier momento. Cualquier cambio importante se notificará a través de nuestro sitio web o por otros medios apropiados. Le recomendamos que revise periódicamente esta política para estar al tanto de cualquier cambio.
6. Preguntas y Contacto
Si tiene alguna pregunta o inquietud sobre esta Política de Privacidad o sobre cómo manejamos su información personal, puede ponerse en contacto con nosotros a través de [dirección de correo electrónico].
Al utilizar nuestro sitio web, usted acepta los términos y condiciones de esta Política de Privacidad. Si no está de acuerdo con esta política, le recomendamos que no utilice nuestro sitio web ni nuestros servicios.
mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.comtag:blogger.com,1999:blog-6529515396162830855.post-41347141925718925932011-09-23T14:36:00.002+02:002011-09-23T14:39:23.903+02:00Manual google analytics español<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzNx3GOYyH-Lz2EQekFIR2r_6c_DGZugVmZ1TCCR8IN6GANwirUDPmVRT3W6wBFu4PduYpaoVx1jbOU14cWNJNdEY4KQVzLFKc6BAo7OZ7judoDVwWnVsDSF6H1sYtv69wsn77z5k1F_g/s250/MI+LIBRO.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 174px; height: 250px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzNx3GOYyH-Lz2EQekFIR2r_6c_DGZugVmZ1TCCR8IN6GANwirUDPmVRT3W6wBFu4PduYpaoVx1jbOU14cWNJNdEY4KQVzLFKc6BAo7OZ7judoDVwWnVsDSF6H1sYtv69wsn77z5k1F_g/s250/MI+LIBRO.jpg" border="0" alt="" /></a><br />Mi compañero de batallas ha publicado su gran libro:<br /><br /><span style="font-weight:bold;"><a href="http://analisis-web.blogspot.com/2011/07/analitica-web-con-google-analytics-ya.html">Analítica Web con Google Analytics ¡Ya esta aquí!</a></span><br /><br />La visión de Google Analytics por un experto y profesional que además en Sociólogo.<br /><br />Google Analytics parace muy sencillo: si nos limitamos a visitas, contenido, rebote ...<br /><br />Pero realmente dar respuesta al jefe de marketing o al jefe comercial no basta con ello.<br /><br />Ahí entran los usuarios únicos, segmentos avanzados, alertas personalizadas, ...<br /><br />Google analytics genera más de 80 informes no te quedes solo en el panel (dashboard)mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-46876657955506066782010-03-29T17:22:00.004+02:002010-03-29T17:36:58.140+02:00Útil. Unir dos pdfA veces nos encontramos con la necesidad de unir dos documentos pdf.<br />Una windowsera me decía que el PDF Creator lo hacía, yo seguía buscando alguna utilidad del Open Office y al final la solución estaba aún mas cerca. Ghostscript (PostScript and PDF language interpreter and previewer)<br /><br />Ejecutando en consola :<br /><br /><pre style="background-color: #f5deb3; font-size: 90%;"><br />user@host:~$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=union.pdf \<br />> fichero1.pdf fichero2.pdf<br /></pre><br /><br />Para mas información consultar el manual<br /><pre><br />user@host:~$ man gs<br /></pre><br /><br />El truco lo he sacado, cómo no de linuca, http://www.linuca.org/body.phtml?nIdNoticia=343<br /><br /><br />Espero os sirva de ayuda ;-)mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com1tag:blogger.com,1999:blog-6529515396162830855.post-25168346927874854132010-02-14T20:22:00.001+01:002010-02-14T20:22:52.398+01:00Javascript framework: mootools, prototype, jqueryDesde finales de los noventa a la actualidad ha evolucionado la web a pasos agigantados. E incluso han aparecido nombres como web 2.0 , ajax , internet 2 , … pero realmente no representan de por sí ni una tecnología, ni un lenguaje de programación, si no más bien una tendencia, una moda, una exclusividad e incluso no se quien utilizaba el termino 3.0, que a mi me sigue sonando la versiones del software que compilo.<br /> <br />Pero si me voy a quedar con javascript no intrusivo y gracias a los framework cada vez es más sencillo lograrlo.<br />Todavía son muchos los desarrollos web en los que me encuentro un onclick, onload, onchage, onsubmit que son válidos aunque no tendríamos unas capas bien organizadas y por supuesto tendríamos javascript intrusivo.<br /><br />Muchos debates he tenido en los desarrollos sobre mi exceso de validaciones de formularios, si ya has validado en javascript para qué validar en el lado del servidor. Por mucho que me traten de convencer yo valido siempre en el lado del servidor, ya que las palabras de Alexander Hristov nunca se me olvidarán: Siempre se valida en el lado del servidor, en el lado del cliente no sabes si realmente estará habilitado el javascript.<br /><br />Actualmente hasta mi móvil interpreta javascript, no suelo navegar mucho con lynx pero si que suelo hacer muchas peticiones web con curl y con éstos no hay javascript que valga.<br /><br />Con ajax podemos aprovechar la validación del servidor para mostrarle directamente al usuario los errores o campos incompletos, enviando el formulario al servidor sin hacer un submit completo de página y recogiendo el error del response.<br /><br />Pero vamos aún más allá, con javascript no intrusivo, parece que tenemos más trabajo de desarrollo, pero no es cierto, logramos tener separado el html del javascript, ya que con los framework de javascript añadir eventos y peticiones con ajax a cualquier elemento html es la mar de fácil, yo suelo usar mootools, aunque me he comprometido a no hacer técnicas monopolistas y también estoy desarrollando cosas con jquery , las prototype me las dejé por el camino...<br /><br />Volviendo al javascript no intrusivo, primero desarrollo el form como una petición normal, completa de página y me devuelve el resultado , errores o correcto proceso. Una vez que la pantalla hace su funcionalidad completa, a la vieja usanza, le añadimos el javascript, pero no con onclick o onsubmit si no con un addEvent al form html ya sea por id o por selectors , cambio el submit para que sea por ajax y en el lado del servidor, sea servlet, struts, php, Django, … no redirijo a la página, vista, si no tan solo devuelve el mensaje de error u ok del servidor, a veces es mejor enviar una cabecera de error 501 yo prefiero un 400 Bad Request y así en ajax podemos utilizar el response status code, para saber si el servidor ha dado error o ha realizado el proceso correctamente.<br /><br />El usar javascript NO intrusivo va a dejar un html más limpio para SEO, los rastreadores que navegan como el lynx, al tener la funcionalidad válida para petición http como para petición ajax nos convertirá en más versatil el desarrollo en el lado del servidor.<br /><br />Me quedo con las ganas de insistir en el MVC Modelo Vista Controlador y en separar las css y el html, pero me lo guardo para otro POSTmugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-44730368955666816052010-02-06T07:27:00.005+01:002010-02-06T08:06:51.592+01:00Navegadores. Pasate a Firefox o ChromeAprovechando el anterior post sobre Firebug, se me había olvidado mencionar las estadísticas de uso de los navegadores:<br /><br />Aunque el IE tenga la mayor cuota del mercado, la caída estrepitosa es cada vez más inminente.<br /><br />Firefox cada vez sube más y Chrome que por fin lo puedo usar sin wine crossover en linux también avanza considerablemente.<br /><br />Si segmentamos el uso a los fines de semana, Firefox puede llegar a tener tanta cuota como el IE dado que en los hogares, dónde se puede elegir libremente el navegador, la gente se instala Firefox.<br /><br />Pero tenemos la victoria sobre el derecho a elegir, libertad, en la Unión Europea, donde Microsoft deberá dejar a sus usuarios elegir libremente el navegador a utilizar, y cual será la elección de las personas ???<br /><br />Ver las gráficas de <a href="http://marketshare.hitslink.com/browser-market-share.aspx?qprid=0#" target="_blank">hitslink.com</a><br /><br />También están los recientes ataques a Gmail en China, pero realmente han sido ataques a Google, o han sido una vez más las vulnerabilidades del IE de MS.<br /><br />Todavía me encuentro muchas personas navegando con el IE 6, google va a dejar de dar soporte para herramientas como Google Docs, pero con las incompatibilidades de los png y sobre todo de las css, y los pixeles como unidades de medida inexactas ya no podía más.<br /><br />Pero sobre todo se trataba de la seguridad, las personas estaban vendidas, tenías la puerta de su coche abiertas, bajadas las ventanillas, las llaves puestas y la tarjeta de crédito con el pin escrito pegado con un postit, yo por eso voy en bicilceta, "jejejeje"<br /><br />Los demás navegadores, también tienen bugs y vulnerabilidades, pero se van actualizando y corrigiendo, en cambio entre MS y que la gente lo tiene todo pirata, no tienen acceso a los parches, SP, ...<br /><br />UNA RAZÓN MÁS POR LAS QUE PASARSE AL MUNDO LIBRE <a href="http://www.ubuntu.com/GetUbuntu/download">se libre</a><br /><br />Volviendo a los navegadores, hay que tener en cuenta que los smartphones: android, iphone, ... empiezan a aparecer entre los visitantes y cada con sus navegadores, muchos basados en Mozilla (Firefox) por ello la cuota aumentara y el desarrollo web hay que orientarlo para cualquier navegador, por ello cumplir los estandares w3c para html, css son fundamentales<br /><br />También están los netbooks, los mini portátiles, que hacen que la resolución de 800 x 600 px haya que tenerla en cuenta.<br /><br /><i>No pongo apenas referencias, pero googlea un poco y encontrarás artículos y noticias sobre todos estos temas.</i>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-76983726120055328842010-02-06T05:58:00.004+01:002010-02-06T06:19:22.377+01:00FirebugTodavía me encuentro programadores que no conocen esta herramienta, supongo porque solo desarrollan para el IE. Creo que desde hace bastante tiempo ya no es una utopía programar javascript para todos los navegadores, tanto para el FireFox, Chrome, Opera, Safari, ...<br /><br />Los frameworks como mootools, prototype, jQuery, ... nos ayudan y facilitan esta tarea entre otras muchísimas más.<br /><br />Yo siempre desarrollo con Firefox y por supuesto con Firebug, y luego hago test en los demás navegadores.<br /><br />Sobre Firebug lo mejor es instalarlo, es un complemento del Firefox, y ver todas las funcionalidades y herramientas que nos facilita:<br /><br />Consola // para todo y principalmente depurar javascript<br />HTML // inspeccionar elementos y css<br />CSS<br />Script<br />DOM<br />Red // tanto para peticiones AJAX e incluso para Flash (bye, bye, flash...)<br /><br />Los que usamos ubuntu tenemos un problemilla con la última versión de FireFox 3.5 y de Firebug 1.5 , pero tranquilos en <a href="https://bugs.launchpad.net/ubuntu/+source/firefox-3.5/+bug/449744">launchpad.net</a> ya se abrió el debate y como siempre se soluciona, solo hay que usar Firebug 1.4 , tener en cuenta que el 1.5 es una versión alpha.<br /><br />Podéis descargar el Firebug en <a href="http://getfirebug.com/releases/firebug/1.4/">http://getfirebug.com/releases/firebug/1.4/</a>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-49235672373539758442009-09-18T20:58:00.005+02:002009-09-18T21:09:20.885+02:00AJAX con mootools. Envio de formularioCon las <a href="http://www.mootools.net/">mootools</a> es muy fácil usar ajax sin necesidad de manejar el objeto XmlHttpRequest y complicarse con las compatibilidades de los navegadores.<br /><br />Este ejemplo es el envio de un formulario, tan sencillo como <b>formulario.send();</b><br /><br />Ahí va el código:<br /><pre><br /><?xml version="1.0" encoding="UTF-8" ?><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><html xmlns="http://www.w3.org/1999/xhtml"><br /><head><br /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><br /><title>Insert title here</title><br /><script type="text/javascript" src="js/mootools/mootools-1.2.1-core-yc.js"></script><br /><style><br /><br />/* los colores son muy mejorables */<br /><br /> .formulario {<br /> display: block;<br /> border: 0.1em solid green;<br /> background-color: #777070;<br /> color: #ffffff;<br /> font-size: 0.7em;<br /> <br /> }<br /> .formulario label {<br /> display: block;<br /> }<br /> .formulario input {<br /> display: block;<br /> background-color: #efdddd;<br /> color: #f60962;<br /> }<br /> .formulario input[type=submit] {<br /> background-color: #000000;<br /> color: #f60962;<br /> font-weight: bolder;<br /> }<br /> .codigo {<br /> width: 10em;<br /> }<br /> .descripcion {<br /> width: 20em;<br /> }<br /> .cantidad {<br /> width: 5em;<br /> }<br /> .precio {<br /> width: 5em;<br /> }<br /> .dto {<br /> width: 5em;<br /> }<br /> .tax {<br /> width: 5em;<br /> }<br /> .importe {<br /> width: 5em;<br /> }<br /> <br /></style><br /></head><br /><body><br /> <br /> <form action="controller.do" id="formulario" name="formulario" method="post" class="formulario"><br /> <label>Código</label><br /> <input type="text" id="codigo" name="codigo" maxlength="16" class="codigo" /><br /> <label>Decripción</label><br /> <input type="text" id="descripcion" name="descripcion" maxlength="120" class="descripcion" /><br /> <label>Cantidad</label><br /> <input type="text" id="cantidad" name="cantidad" maxlength="9" class="cantidad" /><br /> <label>Precio</label><br /> <input type="text" id="precio" name="precio" maxlength="11" class="precio" /><br /> <label>Dto</label><br /> <input type="text" id="dto" name="dto" maxlength="5" class="dto" /><br /> <label>Tax</label><br /> <input type="text" id="tasa" name="tasa" maxlength="5" class="tax" /><br /> <label>Importe</label><br /> <input type="text" id="importe" name="importe" maxlength="15" class="importe" /><br /> <input type="submit" id="guardar" name="guardar" value="Guardar" title="Guardar"/><br /> </form><br /> <div id="resultado"></div><br /> <script type="text/javascript"><br /> <br /> window.addEvent('domready', function() {<br /> addEventToForm('formulario','resultado');<br /> });<br /> function addEventToForm(_id_form, _id_result) {<br /><br /> $(_id_form).addEvent('submit', function(e) {<br /> //Prevents the default submit event from loading a new page.<br /> e.stop();<br /> <br /> this.set('send', {onComplete: function(response) { <br /> <br /> $(_id_result).set('html', response);<br /> }});<br /> //Send the form.<br /> this.send();<br /> });<br /> }<br /> <br /> </script><br /></body><br /></html><br /></pre><br /><br />El código de controller.do tan solo es...<br /><pre><br /><?php<br /> print_r($_REQUEST);<br />?><br /></pre>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-63647794212552862102009-09-15T14:38:00.010+02:002010-03-29T18:11:58.591+02:00HTML div organizar contenidoComo todavía me encuentro muchas webs y aplicaciones web con <TABLE><TR><TD> <br />continúo con el tema de usar div en lugar de table.<br /><br />Con el siguiente ejemplo podemos organizar una página web o documento html<br />con divs, centrando el contenido y estableciendo un diseño proporcional, <br />que se adaptaría a cualquier resolución de pantalla y dispositivo.<br /><br />No usamos ningún <table> ni <tr> ni <td> ni ..<br /><br /><iframe src="http://www.comoelagua.com/blog-apuntesytrucosdeprogramacion/div_html_organizar_contenido.xhtml"<br /> width="450" height="400" scrolling="auto" frameborder="1" transparency><br /> <p>Ejemplo de página web organizada mediante divs y css</p><br /></iframe><br /><br /><br />Ahora el código html y css<br /><pre><br /><?xml version="1.0" encoding="UTF-8" ?><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><html xmlns="http://www.w3.org/1999/xhtml"><br /><head><br /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><br /><meta http-equiv="Content-Style-Type" content="text/css" /><br /><title>div html</title><br /><!-- <br />/* lo ideal sería tener la hoja de estilos en otro fichero<br /> * pero para el ejemplo lo metemos dentro del documento html<br /> */ <br /><link rel = "stylesheet" type = "text/css" media="screen" href="media/css/all/estilos.css"/><br />--><br /><style type="text/css" media="all"><br /> body {<br /> /* para centrar el contenido */<br /> background-color:#ffffff;<br /> text-align:center;<br /> margin:0 auto;<br /> }<br /> #container {<br /> /* # la almoadilla aplica el estilo a los tag html con ese id */<br /> margin: 0 auto;<br /> text-align:left;<br /> /*width:780px; /* para 800 x 600 */<br /> width: 100%;<br /> }<br /> #cabecera {<br /> background-color: blue; /* mejor definir color notación #333ccc */<br /> color: white;<br /> }<br /> #menu {<br /> background-color: orange;<br /> float: right;<br /> width: 20%;<br /> }<br /> #contenido {<br /> background-color: #eadcdc;<br /> float: left;<br /> width: 75%;<br /> }<br /> #pie {<br /> clear: both;<br /> background-color: #333ccc;<br /> color: #ffffff;<br /> }<br /></style><br /></head><br /><body><br /><div id="container"><br /> <div id="cabecera"><br /> cabecera<br /> </div><br /> <div id="menu"><br /> menu<br /> <ul><br /> <li>item menu</li><br /> <li>item menu</li><br /> <li>item menu</li><br /> <li>item menu</li><br /> <li>item menu</li><br /> <li>item menu</li><br /> <li>item menu</li><br /> <li>item menu</li><br /> </ul><br /> </div><br /> <div id="contenido"><br /> contenido<br /> <h2>La Ñ con utf-8</h2><br /> <p><br /> Podemos usar cualquier caracter de nuestro queridisimo lenguaje<br /> con la codificación UTF-8<br /> Ñ ñ á é í ó ú Á É Í Ó Ú ç Ç<br /> </p><br /> <h2>Titulo dentro del contenido</h2><br /> <p><br /> Texto dentro del contenido, texto dentro del contenido<br /> Ah los diseñadores gráficos usan el siguiente texto como borrador <br /> </p><br /> <h2>Lorem ipsum dolor sit amet</h2><br /> <p><br />Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br /> </p><br /> <br /> </div><br /> <div id="pie"><br /> pie<br /> </div><br /></div><br /></body><br /></html><br /></pre><br />Fundamental es separar el contenido del diseño.<br />Por un lado nuestro contenido organizado con html o mejor con xhtml<br />y por otro lado el diseño.<br /><br />Copia todo el html, guardalo en un fichero html o xhtml y abrelo con un navegador.<br /><br />Todo el contenido dentro del tag <style> debería pasar a un fichero estilos.css<br />pero lo puedes dejar así para hacer pruebas.<br /><br />También <a href="http://www.quirksmode.org/css/display.html#block">ejemplos visuales</a> de divs con distintos css en la propiedad de display <br /><br />Y cómo no la w3c con su guía de referencia rápida de css y xhtml:<br /><a href="http://www.w3c.es/Divulgacion/GuiasReferencia/CSS21/">Guía de Referencia CSS 2.1</a><br /><a href="http://www.w3c.es/Divulgacion/GuiasReferencia/XHTML1/">Guía de Referencia XHTML</a>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com1tag:blogger.com,1999:blog-6529515396162830855.post-86942186725399698682009-09-09T16:43:00.008+02:002009-09-09T17:19:27.861+02:00CSS. HTML. Para todos los dispositivosHace poco se cumplieron 20 años de la web, World Wide Web, y Tim Berners-Lee criticaba los dominios .tel y .mobi. No es de extrañar ya que realmente con el mismo contenido html o xhtml podemos crear estilos para los distintos dispositivos o Media types. Echar un vistazo a las guias de las w3c sobre estos <a href="http://www.w3.org/TR/CSS2/media.html">Media types</a><br /><br />El tema es sencillo, si hemos separado bien el contenido de la apariencia, el html del css.<br /><br />Dentro de <html><head> podemos definir hojas de estilo, css, para cada dispositivo cliente que pueda solicitar una url de nuestra web.<br /><br />Se trata de añadir con el valor del atributo media las diferentes hojas de estilo, css, que hayamos generado, mejor que sea el diseñador gráfico si sabe que existe algo más que flash.<br /><br /><div style="background-color:#F9F9F9; border:1px solid"><br /><pre><br /><!-- para monitores de ordenador, computadora --><br /><link rel = "stylesheet" type = "text/css" media="screen" href="css/screen/general.css"/><br /><br /><!-- para imprimir --><br /><link rel = "stylesheet" type = "text/css" media="print" href="css/print/general.css"/><br /><br /><!-- para pequeñas pantallas, como móviles, pda, ... --><br /><link rel = "stylesheet" type = "text/css" media="handheld" href="css/handheld/general.css"/><br /><br /><!-- incluso para ciegos --><br /><link rel = "stylesheet" type = "text/css" media="braille" href="css/braille/general.css"/><br /><link rel = "stylesheet" type = "text/css" media="embossed" href="css/embossed/general.css"/><br /><br /><!-- sintetizadores de voz --><br /><link rel = "stylesheet" type = "text/css" media="speech" href="css/speech/general.css"/><br /><br /><!-- Para nuestro querido terminal o consola, cuando navegamos con lynx --><br /><link rel = "stylesheet" type = "text/css" media="tty" href="css/tty/general.css"/><br /><br /><br /><!-- Los tipicos pantalla, impresión y teléfono móvil o pda<br /><link rel = "stylesheet" type = "text/css" media="screen" href="css/screen/menu.css"/><br /><link rel = "stylesheet" type = "text/css" media="print" href="css/print/menu.css"/><br /><link rel = "stylesheet" type = "text/css" media="handheld" href="css/handheld/menu.css"/><br /></pre><br /></div><br /><br />No te olvides echar un vistazo a la w3c, hay una <a href="http://www.w3c.es/Divulgacion/GuiasReferencia/CSS21/">guía muy interesante sobre css</a> (en español) que puede resolver muchas dudas y por su puesto los <a href="http://www.w3.org/TR/CSS2/media.html">Media types</a> en inglés.mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-20123367815835121602009-08-28T20:06:00.010+02:002009-09-18T21:08:11.906+02:00Javascript. MooTools.Hay muchos frameworks para javascript, yo he apostado por <a href="http://www.mootools.net/">MooTools</a> , aunque <a href="http://www.prototypejs.org/">Prototype</a> es de los más utlizados.<br /><br />Mootools pesa poco y nos ofrece multitud de objetos y funciones.<br /><br />¿ Todavía sigues escribiendo todo el javascript ?<br />Eso me pasaba a mí pero con los framework he logrado mejorar mi productividad, lograr código en casi cualquier navegador, desde Firefox, Opera, ... incluso en el IExplorer<br /><br />Nos cuesta adaptarnos a un nuevo API, bueno a cualquier cambio por lo general, pero si querías hacer siempre tu 3 x 4 mejor nos deberíamos haber metido en otra profesión que no fuera la informática... ya que esto no para de cambiar y hay que estarse reciclando y actualizando constantemente.<br /><br />La <a href="http://mootools.net/docs/core">documentación</a> está bastante bien, cuando te acostumbras a ella. También hay <a href="http://demos.mootools.net/">demos</a> de la propia MooTools pero googleando encuentras efectos muy chulos hechos por otra gente:<br /><br /><ul><br /><li><a href="http://www.phatfusion.net/index.htm">phatfusion.net</a></li><br /><li><a href="http://speckyboy.com/2008/12/15/best-ever-65-mootools-plugins-and-demos-is-it-better-than-jquery/">speckyboy.com</a></li><br /><li><a href="http://tutorialdog.com/javascript-image-gallery-using-mootools/">tutorialdog.com</a></li><br /></ul><br /><br />Dile adios al document.getElementById(..)<br /><br /><br />Voy preparando otra entrada para desarollo con Javascript no intrusivo usando mootools con los Element y Selecctor...mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-9603581002187766822009-08-04T12:05:00.003+02:002009-08-04T12:19:58.096+02:00Linux. Ubuntu. Network-Manager WirelessEl Network-Manager en gnome está genial para los que no les gusta la consola, ni el ifup eth0, ifdown eth0.<br />Aunque a los que nos ponemos a tocar el /etc/network/interfaces hacemos que el Network-Manager se pierda un poco.<br /><br />También he detectado que el Ubuntu Desktop Edition instala todo bastante bien, pero los que cacharreamos un poco al final usamos la "alternate installer” o el "Ubuntu Server" para cosas como LVM, RAID o cosillas así y al final el Network-Manager se pierde.<br /><br />Para el tema Wireless WIFI , recomiendo echeis un vistazo a la wiki de ubuntu <a href="https://help.ubuntu.com/community/WifiDocs/WirelessTroubleShootingGuide" title="WirelessTroubleShootingGuide">WirelessTroubleShootingGuide</a> en inglés pero hasta yo lo entiendo.<br /><br />Y si habeis instalado Ubuntu desde el "alternate installer” para el tema wireless debeis instalar compat-wireless (linux-backports-modules)<br /><br /><br /><code><br /># For Ubuntu 8.10 Intrepid users:<br />sudo apt-get install linux-backports-modules-intrepid<br /><br /># For Ubuntu 9.04 Jaunty users:<br />sudo apt-get install linux-backports-modules-jaunty<br /></code><br /><br />Ver toda la información en <a href="http://linuxwireless.org/en/users/Download#Building_for_external_kernels">linuxwireless.org</a> también esta la información para cualquier distribución de linux.mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-28870219161120820182009-05-01T21:22:00.011+02:002009-05-04T17:42:46.574+02:00PHP. módulo de un "long". Calcular dígito control de IBAN.Calculando el DC dígito de control de un número de cuenta IBAN me he encontrado un problema con el módulo o resto.<br />Al manejar un número que sobrepasa el integer, "no se exacta la barrera, pero supongamos que a partir de 2147483647 deja de ser nuestro integer de toda la vida", <a href="http://es2.php.net/manual/es/language.types.integer.php">manual PHP. Enteros</a> y al calcular el modulo de 97 de ese número long perdía la precisión y devolvía un resto incorrecto.<br /><br />Hay varias soluciones a esta situación, yo opté por usar <span style="font-weight:bold;">bcmod<span style="font-style:italic;"></span></span> <a href="http://es.php.net/manual/es/function.bcmod.php">function bcmod</a> ya que en PHP hay funciones para casi todo y sino en <a href="http://www.phpclasses.org/">www.phpclasses.org</a> podremos encontrar alguna clase que nos facilite el desarrollo.<br /><br />Supongo que también se debe a la "anarquía" de PHP que no obliga a declarar el tipo de dato de la variable, aunque cada vez empiezo a encontrar más código en el que se hacen casting a las variables.<br /><br />En el mundo java un int es un int, un String es un String y un long es un long y todo el día haciendo casting pero siempre tienes claro que hay en una variable.<br /><br /><pre><br />$foo = (array)$foo;<br />$foo = (b)$foo;<br />$foo = (binary)$foo;<br />$foo = (bool)$foo;<br />$foo = (boolean)$foo;<br />$foo = (double)$foo;<br />$foo = (float)$foo;<br />$foo = (int)$foo;<br />$foo = (integer)$foo;<br />$foo = (object)$foo;<br />$foo = (real)$foo;<br />$foo = (string)$foo;<br /></pre><br /><a href="http://www.electrictoolbox.com/type-casting-php/">type-casting-php</a><br /><br /><br />En esta función que cálcula el dígito de control de un iban, recopilada de <a href="http://www.desarrolloweb.com/articulos/2484.php">www.desarrolloweb.com</a> me encontré con el problema devolviendome mal el resto el operador % y solucionandolo cuando apliqué la función bmod en lugar del operador % de siempre.<br /><br />Al usar % me devolvía mal el resto cuando le pasaba un long 9999999999999999<br /> //$modulo97 = $ibanConDC_ % 97;<br />Al usar bcmod todo a la perfección<br /> $modulo97 = bcmod($ibanConDC_, 97);<br /><br />La función es muy mejorable, pero siempre hay prisas con los proyectos:<br /><pre><br /> /**<br /> * Gernerar el DC, dígito control de IBAN, y devolver en nuevo IBAN con DC<br /> * <br /> * @link http://www.desarrolloweb.com/articulos/2484.php<br /> * @param string $_iban<br /> * @return $iban_<br /> */<br /> function generarDCInToIban( $_iban ) {<br /> <br /> $ibanConDC_ = -1;<br /> <br /> // IBAN sin DC, DC = 00 : BE00999999999999 <br /> // IBAN con DC, DC = 89 : BE89999999999999<br /> <br /> // Mover los cuatro primeros caracteres del número IBAN a la derecha: <br /> $ibanConDC_ = substr($_iban,4)."".substr($_iban,0,4);<br /> <br /> <br /> // Convertir las letras a números según la siguiente tabla:<br /> // A=10 G=16 M=22 S=28 Y=34<br /> // B=11 H=17 N=23 T=29 Z=35<br /> // C=12 I=18 O=24 U=30<br /> // D=13 J=19 P=25 V=31<br /> // E=14 K=20 Q=26 W=32<br /> // F=15 L=21 R=27 X=33<br /> $letras_array = array("A","B","C","D","E","F","G","H","I","J","K","L",<br /> "M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");<br /> $numeros_array = array("10","11","12","13","14","15","16","17","18","19","20","21",<br /> "22","23","24","25","26","27","28","29","30","31","32","33","34","35");<br /> <br /> <br /> $ibanConDC_ = str_replace( $letras_array, $numeros_array, $ibanConDC_);<br /> <br /> <br /> // Aplicar la operación módulo 97 y restar al número 98, el valor obtenido. <br /> // Si el resultado consta de sólo un dígito, insertar un cero a la izquierda.<br /> <br /> //$modulo97 = intval($ibanConDC_) % 97;<br /> //$modulo97 = $ibanConDC_ % 97;<br /> $modulo97 = bcmod($ibanConDC_, 97);<br /> <br /> $dc = 98 - $modulo97;<br /> <br /> // insertar 0 a la izquierda si fuera menor de dos dígitos<br /> $dc = sprintf("%02d",$dc);<br /> <br /> // Sustituimos los dígitos 2 y 4 por el $dc<br /> $ibanConDC_ = substr($_iban,0,2).$dc.substr($_iban,4);<br /> <br /> <br /> return $ibanConDC_;<br /> }<br /> <br /><br /></pre><br /><br />Esta función solo pasa de un IBAN sin DC dígito de control a un IBAN con dígito de control, si buscais directamente de CCC cuenta bancaria a IBAN, el tema se complica ya que cada pais tiene un prefijo de dos caracteres y cada pais tiene un sistema de CCC cuentas bancarias diferente, pero seguro que googleando lo podeis encontrar, <span style="font-weight:bold;">pasarme el código cuando lo localiceis.</span><br /><br />Yo os muestro una forma muy sencilla para los IBAN de cuentas bancarias españolas, (seguro que es mejorable se aceptan sugerencias):<br /><br /><pre><br />/**<br /> * Calcular IBAN<br /> * <br /> * @link https://empresas.bankinter.com/www/es-es/cgi/empresas+fichhtml?nombre=empresas/cmd_exterior/cmd_negocio_internacional/calcula_iban.html<br /> * @param string $_entidad, $_sucursal, $_dc, $_cuenta<br /> * @return $iban_<br /> */<br /> function calcularIban( $_entidad, $_sucursal, $_dc, $_cuenta ) {<br /> <br /> $iban_ = -1;<br /> <br /> // CCC : 01280010120123456789<br /> // IBAN : ES7001280010120123456789<br /> <br /> $codPais = "ES";<br /> $dc = "00"; // No sabemos el dígito de control del IBAN, ponemos 00<br /> <br /> $iban_ = $codPais."".$dc."".$_entidad."".$_sucursal."".$_dc."".$_cuenta;<br /> <br /> return $iban_;<br /> }<br /></pre><br /><br />Con la CCC cuenta bancaria hallamos el IBAN sin DC calcularIban(...)<br />y con el generarDCInToIban(...) podemos obtener el DC de la cuenta IBAN, modificando la función también nos sirve directamente para validar el IBAN.<br /><br />Se aceptan sugerencias y mejoras de las funciones.<br /><br />Si quereis calcular el DC dígito de control de una CCC cuenta bancaría <a href="http://www.bulma.net/">bulma</a> tiene publicada la función en PHP. No os asusteis que también escriben en castellano <a href="http://www.bulma.net/body.phtml?nIdNoticia=1396">Cómo calcular el dígito de control de una cuenta corriente</a><br /><br />Espero que os sirva de ayudamugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com2tag:blogger.com,1999:blog-6529515396162830855.post-78569859407790390112009-03-10T12:33:00.006+01:002009-03-10T13:09:13.379+01:00Linux. Mac AddressEs bastante sencillo saber cual es nuestra Mac Address.<br /><pre><br />user@localhost:~$ ifconfig<br />eth1 Link encap:Ethernet direcciónHW 00:18:e4:17:46:b3 <br /> inet dirección:192.168.1.48 Difusión:192.168.1.255 Máscara:255.255.255.0<br /> dirección inet6: fe80::218:e8ff:fe17:43b3/64 Alcance:Vínculo<br /> ARRIBA DIFUSIÓN CORRIENDO MULTICAST MTU:1500 Métrica:1<br /> RX packets:0 errors:0 dropped:0 overruns:0 frame:0<br /> TX packets:4674 errors:0 dropped:0 overruns:0 carrier:0<br /> colisiones:0 txqueuelen:1000 <br /> RX bytes:0 (0.0 B) TX bytes:284122 (277.4 KB)<br /> Interrupción:19 Dirección base: 0xcc00 <br /><br />lo Link encap:Bucle local <br /> inet dirección:127.0.0.1 Máscara:255.0.0.0<br /> dirección inet6: ::1/128 Alcance:Anfitrión<br /> ARRIBA LOOPBACK CORRIENDO MTU:16436 Métrica:1<br /> RX packets:42737 errors:0 dropped:0 overruns:0 frame:0<br /> TX packets:42737 errors:0 dropped:0 overruns:0 carrier:0<br /> colisiones:0 txqueuelen:0 <br /> RX bytes:2639360 (2.5 MB) TX bytes:2639360 (2.5 MB)<br /></pre><br /><br />Podemos limitar los resultados con grep<br /><pre><br />user@localhost:~$ ifconfig | grep HW<br />eth1 Link encap:Ethernet direcciónHW 00:18:e7:16:45:b3<br /></pre><br /><br />Para conocer las Mac Address de los equipos conectados<br /><pre><br />user@localhost:~$ arp<br />Address HWtype HWaddress Flags Mask Iface<br />192.168.1.10 ether 00:17:31:238:97:20 C eth1<br />192.168.1.3 ether 00:0E:50:42:5B:E4 C eth1<br />192.168.1.22 ether 00:07:E9:D6:8F:1E C eth1<br />192.168.1.23 ether 00:02:B3:19:8A:96 C eth1<br />192.168.1.21 ether 00:18:F3:6B:FB:DF C eth1<br /></pre><br /><br />Para conocer las Mac Adress de todos los equipos de la lan.<br />Suponiendo que la lan sea 192.168.1.0<br /><br />Es necesario tener instalado nmap.<br /><pre><br />user@localhost:~$ sudo apt-get install nmap<br /></pre><br /><br />Ahora ya podemos ejecutar el commando.<br /><pre><br />user@localhost:~$ nmap -sN 192.168.1.0-255<br />Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-03-10 12:58 CET<br />Interesting ports on 192.168.1.3:<br />MAC Address: 00:0E:50:92:5B:E4 (Thomson Telecom Belgium)<br /><br />All 1680 scanned ports on 192.168.1.10 are open|filtered<br />MAC Address: 00:15:31:38:97:20 (Asustek Computer)<br /><br />All 1680 scanned ports on 192.168.1.21 are open|filtered<br />MAC Address: 00:14:F3:8B:FB:DF (Unknown)<br /><br />All 1680 scanned ports on 192.168.1.22 are open|filtered<br />MAC Address: 00:09:E9:D5:8F:1E (Intel)<br /><br />All 1680 scanned ports on 192.168.1.23 are open|filtered<br />MAC Address: 00:04:B3:17:8A:96 (Intel)<br /><br />Nmap finished: 256 IP addresses (6 hosts up) scanned in 25.797 seconds<br /></pre><br /><br />Con grep limitamos los resultados a los que necesitamos:<br /><pre><br />user@localhost:~$ nmap -sN 192.168.1.0-255 | grep MAC<br />MAC Address: 00:0E:50:92:5B:E4 (Thomson Telecom Belgium)<br />MAC Address: 00:12:31:38:97:20 (Asustek Computer)<br />MAC Address: 00:14:F3:8B:FB:DF (Unknown)<br />MAC Address: 00:06:E9:D5:8F:1E (Intel)<br />MAC Address: 00:04:B3:17:8A:96 (Intel)<br /></pre><br /><br />Seguro que se pueden afinar mucho más los comandos y existan otros comandos útiles para este tema, se admiten comentarios.mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com3tag:blogger.com,1999:blog-6529515396162830855.post-78675145460365498472009-03-07T13:11:00.006+01:002009-03-07T13:24:30.601+01:00PHP. JAVA. Sobreescritura de método o funciónHace poco tiempo me di cuenta que llevaba sobreescribiendo los métodos en php sin darme cuenta, aunque lo llevo llamando desde hace años parametros opcionales, pero al final conseguimos lo mismo.<br /><br />No se si con este ejemplo he logrado explicar el tema:<br /><pre><br /><?php<br /><br />public function ladrar( $_ladrido ) {<br /> <br /> //$_ladrido = "guau guau guau";<br /> <br /> print($_ladrido);<br /> <br /> return;<br />}<br /><br />public function ladrar( $_ladrido, $_fuerte=false ) {<br /> <br /> if ($_fuerte==true)<br /> $_ladrido = strtoupper($_ladrido);<br /> <br /> print($_ladrido);<br /> <br /> return;<br />}<br />// Con esta función nos bataría para todo<br />public function ladrar( $_ladrido , $_fuerte=false , $_saltar=false ) {<br /> <br /> if ($_fuerte==true)<br /> $_ladrido = strtoupper($_ladrido);<br /> <br /> if ($_saltar==true)<br /> saltar();<br /> <br /> print($_ladrido);<br /> <br /> return;<br />}<br />?><br /><br />/*** java ***/<br /><br />public void ladrar( String _ladrido ) {<br /> <br /> //String _ladrido = "guau guau guau";<br /> <br /> System.out.print(_ladrido);<br /> <br /> return;<br />}<br /><br />public void ladrar( String _ladrido, boolean _fuerte ) {<br /> <br /> if (_fuerte)<br /> _ladrido = _ladrido.toUpperCase()<br /> <br /> ladrar(_ladrido);<br /> <br /> return;<br />}<br /><br />public void ladrar( String _ladrido, boolean _fuerte, boolean _saltar ) {<br /> <br /> if (_saltar)<br /> saltar();<br /> <br /> ladrar(_ladrido, _fuerte);<br /> <br /> return;<br />}<br /><br />/*** fin java ***/<br /></pre>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-40352538877834949922009-03-07T10:58:00.004+01:002009-03-07T12:16:44.186+01:00PHP. Prepare statement. DaoDesde hace tiempo estoy implementando en PHP las sentencias SQL al estilo java, PreparedStatement, con mysqli. Así evitamos cualquier inyección de código y trabajamos contra la base de datos como les gusta a los Dba, mediante Bind.<br /><br /><a href="http://es.php.net/manual/es/mysqli.prepare.php"></a><br /><br />Esto sería parte de un objeto Dao implementación Mysql, fundamental el bean para trabajar con objetos y dar de una vez el salto a la programación POO.<br /><br /><pre><br /> public function buscarPorTitulo( $_titulo ) {<br /> <br /> $Noticia_ = new Noticia();<br /> $Noticias_array = array();<br /> <br /> $sql = "SELECT ID_NOTICIA, TITULO, FECHA, CSS_STYLE, RUTA_FICHERO_HTML ";<br /> $sql .= "FROM NOTICIAS ";<br /> $sql .= "WHERE TITULO LIKE ? ";<br /> <br /> if ($stmt = $this->mysqli->prepare($sql)) {<br /> <br /> $stmt->bind_param("s", $_titulo); <br /> /*<br /> Character Description<br /> i corresponding variable has type integer<br /> d corresponding variable has type double<br /> s corresponding variable has type string<br /> b corresponding variable is a blob and will be sent in packets<br /> */<br /> $result = $stmt->execute();<br /> if (!$result) {<br /> throw new Exception( "Error al consultar BB.DD" );<br /> }<br /> <br /> <br /> $Noticias_array_ = array();<br /> <br /> $_stmt->bind_result(<br /> $idNoticia,<br /> $titulo,<br /> $fecha,<br /> $css_style,<br /> $rutaFicheroHtml<br /> );<br /> <br /> $i=0;<br /> while ($_stmt->fetch()) {<br /> $Noticia = new Noticia();<br /> $Noticia->setIdNoticia($idNoticia);<br /> $Noticia->setTitulo($titulo);<br /> $Noticia->setFecha($fecha);<br /> $Noticia->setCssStyle($css_style);<br /> $Noticia->setRutaFicheroHtml($rutaFicheroHtml);<br /> $Noticias_array_[$i] = $Noticia;<br /> $i++;<br /> }<br /> <br /> return $Noticias_array_;<br /> <br /> $stmt->close();<br /> <br /> } else {<br /> throw new Exception( "Error al consultar BB.DD" );<br /> }<br /> <br /> return $Noticias_array;<br /> <br /> }<br /></pre><br /><br /><br /><pre><br />public class Noticia {<br /> <br /> private $idNoticia=0;<br /> private $titulo="";<br /> private $fecha="0000-00-00";<br /> private $cssStyle="";<br /> private $rutaFicheroHtml="";<br /> <br /> public function Noticia( ) {<br /> $this->idNoticia=0;<br /> $this->titulo="";<br /> $this->fecha="0000-00-00";<br /> $this->cssStyle="";<br /> $this->rutaFicheroHtml="";<br /> }<br /> <br /> public function setIdNoticia( $_idNoticia ) {<br /> $this->idNoticia=$_idNoticia;<br /> return;<br /> }<br /> <br /> public function getIdNoticia( ) {<br /> return $this->idNoticia;<br /> }<br /> <br /> public function setTitulo( $_titulo ) {<br /> $this->titulo=$_titulo;<br /> return;<br /> }<br /> <br /> public function getTitulo( ) {<br /> return $this->titulo;<br /> }<br /> <br /> public function setFecha( $_fecha ) {<br /> $this->fecha=$_fecha;<br /> return;<br /> }<br /> <br /> public function getFecha( ) {<br /> return $this->fecha;<br /> }<br /> <br /> public function setCssStyle( $_cssStyle ) {<br /> $this->cssStyle=$_cssStyle;<br /> return;<br /> }<br /> <br /> public function getCssStyle( ) {<br /> return $this->cssStyle;<br /> }<br /> <br /> public function setRutaFicheroHtml( $_rutaFicheroHtml ) {<br /> $this->rutaFicheroHtml=$_rutaFicheroHtml;<br /> return;<br /> }<br /> <br /> public function getRutaFicheroHtml( ) {<br /> return $this->rutaFicheroHtml;<br /> }<br /> <br />}<br /></pre>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com1tag:blogger.com,1999:blog-6529515396162830855.post-11301985014263878642008-09-21T11:36:00.008+02:002009-09-03T14:04:54.296+02:00LINUX. buscar ficherosHay varios comandos que desde consola nos ayudan a buscar ficheros:<br /><br />locate busca rápidamente, ya que no va leyendo el disco, sino que mira en un indice que tiene en una base de datos: man locate<br /><br /># Por ejemplo para buscar donde está el server.xml del tomcat<br />[user@locahost ~]$ locate server.xml<br />/usr/local/apache-tomcat-5.5.26/conf/server.xml<br /><br />find es el comando para buscar, este si que va leyendo el disco. CUIDADO que es recursivo, por ello es mejor indicarle la ruta donde empezar a buscar.<br /><br /># Por ejemplo para buscar los java compilados<br />[user@locahost ~]$ find programas/ -name *class<br /><br />Lo mejor es juntar el comando find con el comando grep ó egrep o fgrep<br />y así buscamos dentro del contenido del los ficheros<br /># Buscamos los ficheros con extensión java que tengan el texto jdbc:mysql<br />[user@locahost ~]$ find programas/ -type f -name *.java -print | xargs egrep -i "jdbc:mysql"<br /><br />Un mini-how to sobre comandos para buscar en linux lo teneis en <br /><a href="http://www.espaciolinux.com/tallerlinux-articulo-15.html">espaciolinux.com</a><br /><br />Ahora estoy intentando buscar todos los ficheros que hayan cambiado los últimos 18 días y que se copien al dir backup. A ver cómo consigo que también me cree el directorio de cada fichero ???<br /># Buscar en el dir programas los ficheros que no sean ocultos, ! -name '.*', que hayan sido modificados desde hace 18 días hasta ahora y que los copie al dir backup<br />[user@locahost ~]$ find programas/ ! -name '.*' -type f -mtime -18 -exec cp -p {} backup/ \;<br /><br />Ya he conseguido las opciones del comando para indicar bien el criterio de tiempo o fecha del archivo, revisar el "man find" es fundamental. En cambio el tema de que vaya creando los directorios lo he omitido porque con el comando <b>rsync</b> me actualizaría los directorios y ficheros sin complicarme con tantos parametros "rsync -av origen destino", a ver si tengo tiempo de crear otra entrada sobre "rsync". Bueno a lo que vamos, "find": <br /><pre><br />Numeric arguments can be specified as<br /><br /> +n for greater than n,<br /><br /> -n for less than n,<br /><br /> n for exactly n.<br /><br /> -amin n<br /> File was last accessed n minutes ago.<br /><br /> -anewer file<br /> File was last accessed more recently than file was modified. If<br /> file is a symbolic link and the -H option or the -L option is in<br /> effect, the access time of the file it points to is always used.<br /><br /> -atime n<br /> File was last accessed n*24 hours ago. When find figures out<br /> how many 24-hour periods ago the file was last accessed, any<br /> fractional part is ignored, so to match -atime +1, a file has to<br /> have been accessed at least two days ago.<br /><br /></pre><br /><br />El tema está en si era "-mtime +18" o "-mtime -18".<br /># Modificación anterior a 18 días<br />-mtime +18 <br /><br /># Modificación posterior a 18 dias<br />-mtime -18<br /><br />Busco los ficheros que hayan sido <b>modificados</b> en estos últimos 18 días y los copio.<br /><pre><br />find datos/ -type f -mtime -18 -exec cp -p {} /mnt/dat/backup/ \;<br /></pre><br /><br />Busco los ficheros con fecha de <b>modificación</b> anterior a estos últimos 7 días y los borro.<br /><pre><br />find datos/ -type f -mtime +7 -exec rm -f {} \;<br /></pre><br /><br />Leyendo el manual de find "man find" hay opciones para ficheros accedidos, cambiados, modificados<br /><br />-atime n<br />-ctime n<br />-mtime n<br /><br />Para entender las fechas de los ficheros, ejecutar el comando stat.<br /><pre><br />stat fichero<br /></pre><br /><br /><br />Vuelvo a recordar que el comando <b>find</b> es recursivo, por lo que siempre hay que indicarle la ruta y tener cuidado cono que le ponemos al -exec para evitar sorpresas:<br /><br /><pre><br />SYNOPSIS<br /> find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]<br /></pre>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-55272142285095574272008-07-07T20:54:00.003+02:002008-07-07T20:57:59.595+02:00JAVASCRIPT. trim()Con expresiones regulares es muy fácil hacer un trim con javascript:<br /><br />cadena=cadena.replace(/^[\s]*[\s]$/, "");mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-43611328833222267872008-06-24T13:27:00.000+02:002008-06-24T13:28:04.734+02:00JAVA. Iterator. List, Set, Map// la solución correcta <br />List list = new ArrayList();<br />Set set = new HashSet();<br />Map map = new TreeMap();<br /> <br />// la solución incorrecta<br />ArrayList list = new ArrayList();<br />HashSet set = new HashSet();<br />TreeMap map = new TreeMap();mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-82603370087172184692008-06-24T11:56:00.005+02:002008-06-24T13:33:17.532+02:00JAVA. HttpServletRequest mostrar todos los parametros recibidos.protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {<br /> <br /> // TMP debug<br /> HashMap parametros = (HashMap) req.getParameterMap();<br /> Iterator it = parametros.entrySet().iterator();<br /> while (it.hasNext()) {<br /> Map.Entry entry = (Map.Entry)it.next();<br /> System.out.println(entry.getKey()+"="+entry.getValue());<br /> }<br /> // FIN TMP debug<br />}<br /><br />==================================================<br /><br />for ( Iterator iterator = aMap.entrySet ( ) .iterator ( ) ; iterator.hasNext ( ) ; ) { <br /> Map.Entry entry = ( Map.Entry ) iterator.next ( ) ; <br /> String key = ( String ) entry.getKey ( ) ; <br /> String value = ( String ) entry.getValue ( ) ; <br /> }mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-52698271541319896942008-05-28T16:03:00.002+02:002008-05-28T16:05:26.619+02:00LINUX. Buscar cadena en los ficheros de una ruta dadaCon esta combinación de comandos, gracias a las tuberias de la shell<br />podemos hacer búsquedas desde el bash:<br /><br />find "ruta" -type f | xargs grep "cadena a buscar"<br /><br />find -type f | xargs grep jdbc:oracle:oci<br /><br />find /usr/local/tomcat -type f | xargs grep jdbc:oracle:ocimugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-82678198309001845162008-04-29T15:35:00.003+02:002008-04-29T16:36:26.410+02:00REGEX. Expresiones RegularesUn lugar donde se aglutina información sobre este tema<br /><br /><a href="http://www.regular-expressions.info/">http://www.regular-expressions.info/</a><br /><br />Con las expresiones regulares, podemos validar parametros, campos, reemplazar cadenas, etc ...<br /><br />Simplifican muchas tareas del desarrollo con un simple ereg o un replaceAll.<br /><br /><pre><br />/* PHP */<br />function validarNumeroConDecimales( $_id ) {<br /><br /> // deben ser dígitos, el punto ,la coma y el posible signo<br /> // algún caracter ^ distinto de 0-9.,+-<br /> if (ereg("[^0-9.,+-]+",$_id)) {<br /> return false;<br /> }<br /> <br /> return true;<br />}<br /><br />/* java */<br />public static boolean validarEmail_1( String _email ) {<br /> <br /> // validar email<br /> Pattern p = Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$");<br /> Matcher m = p.matcher(_email);<br /> boolean b = m.matches();<br /> <br /> return b;<br />}<br /> <br />public static boolean validarEmail_2( String _email ) {<br /> <br /> // validar email<br /> boolean b = Pattern.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$", _email);<br /> <br /> return b;<br />}<br /></pre>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com3tag:blogger.com,1999:blog-6529515396162830855.post-76421477307392023422008-04-09T15:46:00.001+02:002008-04-29T16:28:49.714+02:00ORACLE. Información session del usuario<pre><br />-- información usuarios<br /><br />select v.sid, v.serial#, v.username, v.program<br />from user_users u, v$session v<br />where v.user# = u.user_id <br /><br />select *<br />from user_users u, v$session v<br />where v.user# = u.user_id <br /><br />-- session del usuario<br /><br />select userenv('sessionid')<br />from dual; <br /><br />--- información del usuario apartir de la session<br />select *<br />from user_users u, v$session v<br />where v.user# = u.user_id<br />and audsid = userenv('sessionid')<br /><br />select *<br />from user_users u, v$session v<br />where v.user# = u.user_id<br />order by LOGON_TIME DESC <br /><br />select SCHEMANAME, OSUSER, MACHINE, TERMINAL, PROGRAM, MODULE, LOGON_TIME<br />from user_users u, v$session v<br />where v.user# = u.user_id<br />order by LOGON_TIME DESC <br /></pre>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-18581816278288905512008-04-08T15:23:00.003+02:002008-04-08T15:48:06.910+02:00HTML. CSS. input disabled - input readonlyEn IExplorer hay problemas con los input disabled, pero podemos usar los input readonly.<br /><br />Con los input disabled en el IExplorer no coge el del color de la fuente. Lo pone a un color gris claro.<br /><br />Pero con los input readonly si que coge el color de la fuente.<br /><br />Además los input disabled no se envian ni por el POST ni por el GET.<br />En cambio los input readonly si se envían en la petición.<br /><br />En Mozilla FireFox los input disabled si que cogen el estilo del color de la fuente.<br /><br /><input type="text" id="campo_disabled" name="campo_disabled"<br /> size="5" readonly="readonly" value="deshabilitado"/><br /><br /><input type="text" id="campo_readonly" name="campo_readonly"<br /> size="5" disabled="disabled" value="solo lectura"/><br /><br />input {<br /> border: #7f9db9 1px solid;<br /> padding:0 0 0 3px;<br /> font-family:Tahoma,Georgia,serif;<br /> font-weight: lighter;<br /> color:#007EF4;<br />}<br /><br />input [disabled] {<br /> background-color: #D4D0C8; <br />}<br /><br />input [readonly] {<br /> background-color: #D4D0C8; <br />}<br /><br /><a href="http://www.htmlcodetutorial.com/forms/_INPUT_DISABLED.html">http://www.htmlcodetutorial.com</a><br /><br /><a href="http://css.maxdesign.com.au/selectutorial/selectors_attribute.htm"></a>mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com2tag:blogger.com,1999:blog-6529515396162830855.post-80596379898949547382008-04-08T09:58:00.001+02:002008-04-08T10:00:54.893+02:00JAVA. Fecha barras a Date.Esta función pasa de un string con la fecha en barras a un Date.<br /><br />En el ejemplo uso el java.sql.Date pero se podría cambiar por un java.util.Date<br />o incluso modificar la función para que devolviera el Calendar.<br /><br />public java.sql.Date convertirFechaBarrasToDate(String fecha) {<br /> int barra1=fecha.indexOf("/");<br /> int barra2=fecha.indexOf("/",1+barra1);<br /> int date=new Integer(fecha.substring(0,barra1)).intValue();<br /> int month=new Integer(fecha.substring(1+barra1,barra2)).intValue()-1;<br /> int year=new Integer(fecha.substring(1+barra2)).intValue();<br /> java.util.GregorianCalendar calendar=new java.util.GregorianCalendar( year, month, date);<br /> return (new java.sql.Date(calendar.getTimeInMillis()));<br />}<br /><br />Creo que se puede mejorar con expresiones regularesmugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0tag:blogger.com,1999:blog-6529515396162830855.post-85369567984481297992008-04-08T09:44:00.002+02:002008-04-08T09:52:41.583+02:00JAVA. Date a fecha barras. 08/04/2008.Cómo convertir la fecha de un Date a fecha de barras, como 08/04/2008.<br /><br />java.util.Date fecha = new java.util.Date(); <br />java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd/MM/yyyy");<br /><br />String fecha_barras = sdf.format(fecha);<br /><br />System.out.println("Fecha="+fecha_barras);mugedochttp://www.blogger.com/profile/11466652570492005541noreply@blogger.com0