<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>javier.io</title>
 <subtitle>Notas de Javier López sobre ingeniería de software, Linux, redes, IA, y ocasionalmente poesía y música. En español, inglés y portugués.</subtitle>
 <link href="https://javier.io/atom.xml" rel="self"/>
 <link href="https://javier.io/"/>
 <updated>2026-10-01T03:35:51+00:00</updated>
 <id>https://javier.io/</id>
 <author>
   <name>Javier López</name>
   <uri>https://javier.io</uri>
 </author>
 <generator uri="https://jekyllrb.com">Jekyll</generator>

 
 <entry>
   <title>aif-c01 (aws certified ai practitioner) en tres días</title>
   <link href="https://javier.io/blog/es/2026/09/10/aif-c01-en-tres-dias.html"/>
   <published>2026-09-10T00:00:00+00:00</published>
   <updated>2026-09-10T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2026/09/10/aif-c01-en-tres-dias</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ai"/>
   
   <category term="personal"/>
   
   
   
   <summary type="html">aif-c01 (aws certified ai practitioner) en tres días</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2026/09/10/aif-c01-en-tres-dias.html">&lt;h2 id=&quot;aif-c01-aws-certified-ai-practitioner-en-tres-días&quot;&gt;aif-c01 (aws certified ai practitioner) en tres días&lt;/h2&gt;

&lt;h6 id=&quot;10-sep-2026&quot;&gt;10 Sep 2026&lt;/h6&gt;

&lt;h3 id=&quot;por-qué-este-examen&quot;&gt;Por qué este examen&lt;/h3&gt;

&lt;p&gt;Aprobé el AWS Certified AI Practitioner con 85 % después de tres días de estudio. Llevo un año dirigiendo agentes de IA en proyectos reales (lo conté en &lt;a href=&quot;/blog/es/2026/03/27/la-brecha-invisible-herramientas-para-dirigir-la-ia.html&quot;&gt;la brecha invisible&lt;/a&gt;). Esta certificación no enseña a hacer eso. Sirve para hablar el idioma de AWS sobre ello: qué servicio es qué, cuándo RAG y cuándo ajuste fino, qué significa cada sigla. Es una credencial-puente sobre la teoría y la práctica.&lt;/p&gt;

&lt;h3 id=&quot;consideraciones-sobre-el-examen&quot;&gt;Consideraciones sobre el examen&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS publicó la versión 1.1 de la guía el 30 de abril de 2026 y el examen la refleja desde junio&lt;/strong&gt;. La v1.1 añade IA agéntica, MCP, Bedrock AgentCore (Identity y Policy), Strands Agents, Kiro, Amazon Quick, AWS Transform, precio por tokens, ingeniería de contexto, destilación, Prompt Management, LLM-as-a-judge y detección de alucinaciones. Amazon Q Business ya no existe con ese nombre; ahora es Amazon Quick. Q Developer es Kiro.&lt;/p&gt;

&lt;p&gt;La mayoría de cursos se hicieron en 2024 o 2025, cuidado a la hora de comprar.&lt;/p&gt;

&lt;p&gt;Hice el examen en español y me arrepentí. La traducción tiene errores, y en casi todas las preguntas tuve que abrir la versión en inglés.&lt;/p&gt;

&lt;h3 id=&quot;el-método-una-guía-que-se-escribe-con-mis-dudas&quot;&gt;El método: una guía que se escribe con mis dudas&lt;/h3&gt;

&lt;p&gt;En vez de un curso, construí una guía propia con Claude Code (modelo Fable 5.1), como un artefacto HTML que se publica y se corrige al vuelo. La estructura:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Los cinco dominios digeridos por el agente, ordenados por peso: primero lo que más puntos devuelve.&lt;/li&gt;
  &lt;li&gt;Lo nuevo de la v1.1 marcado como tal.&lt;/li&gt;
  &lt;li&gt;Un acordeón con:
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;«si la pregunta dice… piensa en…»&lt;/strong&gt;:&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Texto a voz&lt;/strong&gt; → Polly.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;PII en S3&lt;/strong&gt; → Macie.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Datos propios, con citas y sin reentrenar&lt;/strong&gt; → RAG.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Una pestaña de siglas con tooltips al pasar el ratón, porque la guía de AWS asume que sabes qué es RLHF, PEFT o A2I.&lt;/li&gt;
  &lt;li&gt;Dos simuladores propios, 104 y 87 preguntas en los cuatro formatos, con modo estudio (explicación inmediata) y modo examen de 65 preguntas y 90 minutos de reloj, y repetición de las falladas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El bucle de trabajo fue: leía una sección. Discutía con el agente lo que no entendía, la explicación llegaba con un ejemplo concreto y volvía a la guía en el mismo sitio; a veces, si el tema no era claro, lo agregaba, pero la mantuve con un largo de máx. 30 min de lectura.&lt;/p&gt;

&lt;h3 id=&quot;los-recursos-con-veredicto&quot;&gt;Los recursos, con veredicto&lt;/h3&gt;

&lt;p&gt;Todos gratis. El único gasto fue el examen: 50 USD con el código de descuento &lt;strong&gt;AIF2CLOUD&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.aws.amazon.com/aws-certification/latest/ai-practitioner-01/ai-practitioner-01.html&quot;&gt;La guía oficial v1.1&lt;/a&gt;&lt;/strong&gt; — la fuente de verdad, pero no la leí yo. La leyó la IA para generar resúmenes, junto con la &lt;a href=&quot;https://docs.aws.amazon.com/aws-certification/latest/ai-practitioner-01/aif-01-revisions.html&quot;&gt;página de cambios de v1.0 a v1.1&lt;/a&gt; y la &lt;a href=&quot;https://docs.aws.amazon.com/aws-certification/latest/ai-practitioner-01/aif-01-in-scope-services.html&quot;&gt;lista de servicios en alcance&lt;/a&gt;, que fue la que resolvió dudas como «¿S3 Vectors entra?» (no aparece como entrada propia; aparece Amazon S3).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://skillbuilder.aws/learn/4URFGY63KV/official-practice-question-set-aws-certified-ai-practitioner--aifc01--english/FVG43Y1PAX&quot;&gt;Set oficial de 20 preguntas de AWS Skill Builder&lt;/a&gt;&lt;/strong&gt; — el estilo exacto del examen. Fallé tres, y las tres eran de «elige DOS» con una de las dos bien, así que estudié más preguntas en ese formato.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cloudcertprep.io/aws/aif-c01&quot;&gt;CloudCertPrep&lt;/a&gt;&lt;/strong&gt; — declara estar alineado con la v1.1. Gratis y de código abierto. Simulacro completo de 65: 889/1000, 88 %, en 33 minutos. Su explicación de una pregunta sobre S3 está desactualizada (S3 Vectors ya existe), pero la respuesta que marcan sigue siendo la correcta para el examen: si ofrecen OpenSearch y «Amazon S3» a secas, es OpenSearch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://portal.tutorialsdojo.com/courses/free-aws-certified-ai-practitioner-practice-exams-aif-c01-sampler/&quot;&gt;Tutorials Dojo, sampler gratuito&lt;/a&gt;&lt;/strong&gt; — 20 preguntas más largas y rebuscadas, me imagino que para vender sus cursos, obtuve 70 %. No hace falta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mis dos simuladores&lt;/strong&gt; — el primero con 104 preguntas escritas sobre la guía, y el segundo con 87 más difíciles: escenarios largos, distractores que resuelven un problema parecido, cálculos de métricas. 85 % en el segundo la víspera.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentación de AWS&lt;/strong&gt; — tampoco la leí. Para dudas puntuales (&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-vectors.html&quot;&gt;S3 Vectors&lt;/a&gt;, &lt;a href=&quot;https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html&quot;&gt;Guardrails&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/bedrock/agentcore/&quot;&gt;AgentCore&lt;/a&gt;) la consultó la IA y leí la respuesta generada.&lt;/p&gt;

&lt;p&gt;Lo que no usé: videos, laboratorios, dumps de preguntas reales.&lt;/p&gt;

&lt;h3 id=&quot;lo-que-fallé-y-cómo-lo-corregí&quot;&gt;Lo que fallé y cómo lo corregí&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;El cebo de la palabra repetida.&lt;/strong&gt; El distractor favorito del examen es la opción que repite una palabra del enunciado sin hacer lo que piden. «Interfaz para etiquetar» → Rekognition Custom &lt;em&gt;Labels&lt;/em&gt; (entrena un modelo; etiquetar es Ground Truth). «Cómo influye cada característica» → &lt;em&gt;Feature&lt;/em&gt; Store (solo las guarda; explicar es Clarify). «Datos sensibles en las respuestas» → Macie (escanea S3; las respuestas las filtra Guardrails). En un simulacro, cuatro de siete fallos fueron esto. Antes de marcar: ¿este servicio hace la acción que piden, o solo comparte la palabra?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La última frase se lee primero.&lt;/strong&gt; Ahí está lo que piden y el criterio: MÁS rentable, MENOR esfuerzo operativo, MENOR latencia. El escenario solo aporta palabras clave. En una pregunta sobre «recomendaciones personalizadas con un servicio totalmente gestionado» marqué Bedrock; la última frase decía «construir, entrenar y desplegar modelos», que es la definición de SageMaker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ground Truth antes de entrenar, A2I después de inferir.&lt;/strong&gt; Los dos usan personas. Ground Truth etiqueta datos; A2I revisa predicciones de baja confianza en producción. La palabra «humano» no decide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La misma palabra, dos servicios.&lt;/strong&gt; «Sesgo en los datos de entrenamiento» → Clarify. «PII en los datos de entrenamiento que están en S3» → Macie. Decide el sustantivo que acompaña, no «datos de entrenamiento».&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El mismo dominio, dos métricas.&lt;/strong&gt; Fraude que va a revisión manual → recall (que no se escape ninguno). Fraude que se bloquea automáticamente → precisión (no molestar a clientes legítimos). No memorices el dominio; busca qué error dice el enunciado que es caro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparencia no es equidad.&lt;/strong&gt; «Claridad sobre cómo se toman las decisiones» es transparencia aunque el escenario hable de ayudas sociales. Las dimensiones de IA responsable se distinguen por la palabra clave del requisito, y ese dominio fue mi más flojo en los tres simulacros.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Muletillas propias&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Macie = maza (&lt;em&gt;mace&lt;/em&gt;) = arma de defensa = seguridad = S3. Es un servicio de seguridad, no de ML. Sin «S3» o «bucket» en el enunciado, no es Macie.&lt;/li&gt;
  &lt;li&gt;Clarify aclara el modelo. Y solo va con SageMaker, así que se trata de un modelo.&lt;/li&gt;
  &lt;li&gt;Comprehend comprende el texto. Va con los servicios que tienen «e» y son varios: Translate, Transcribe, Lex. Clarify no tiene «e» y solo se lleva con un servicio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;el-plan-tal-como-ocurrió&quot;&gt;El plan, tal como ocurrió&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Lunes noche&lt;/strong&gt;: formato del examen y el dominio de más peso, modelos fundacionales. Parámetros de inferencia, RAG, cómo adaptar un FM, métricas de evaluación.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Martes&lt;/strong&gt;: IA generativa, fundamentos, IA responsable, seguridad. El set oficial de 20. Contesté el primer simulador. Construí el segundo, más difícil.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Miércoles&lt;/strong&gt;: CloudCertPrep, Tutorials Dojo, el segundo simulador. Con los fallos de los tres, una pestaña de «último repaso»: horario, técnica de respuesta, una tabla «si dice → es → no es» hecha solo con lo fallado, y las dimensiones de IA responsable por palabra clave. A las nueve de la noche, me puse a jugar Battle for Wesnoth para cambiar de tema.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Jueves&lt;/strong&gt;: por la mañana toqué sax un rato para relajarme, 30 minutos antes check-in. Examen a las 11:45.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unas diez horas útiles en total. El examen no es tan fácil, no hay que confiarse. Mi contexto es de 18 años en la industria, 1 año trabajando todos los días con la IA, leyendo sobre el tema de manera casual. Sus resultados podrían variar.&lt;/p&gt;

&lt;h3 id=&quot;referencias&quot;&gt;Referencias&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://claude.ai/code/artifact/fec43380-76e5-488e-9bbb-2ab0b9856b8c&quot;&gt;Artefacto de Claude&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;AWS (2026). &lt;em&gt;&lt;a href=&quot;https://docs.aws.amazon.com/aws-certification/latest/ai-practitioner-01/ai-practitioner-01.html&quot;&gt;AWS Certified AI Practitioner (AIF-C01) Exam Guide v1.1&lt;/a&gt;&lt;/em&gt; y su &lt;a href=&quot;https://docs.aws.amazon.com/aws-certification/latest/ai-practitioner-01/aif-01-revisions.html&quot;&gt;historial de revisiones&lt;/a&gt;: la fuente de verdad sobre qué entra.&lt;/li&gt;
  &lt;li&gt;AWS Skill Builder. &lt;em&gt;&lt;a href=&quot;https://skillbuilder.aws/learn/4URFGY63KV/official-practice-question-set-aws-certified-ai-practitioner--aifc01--english/FVG43Y1PAX&quot;&gt;Official Practice Question Set: AIF-C01&lt;/a&gt;&lt;/em&gt;: 20 preguntas gratis con el estilo real.&lt;/li&gt;
  &lt;li&gt;Santonastaso, A. &lt;em&gt;&lt;a href=&quot;https://www.cloudcertprep.io/aws/aif-c01&quot;&gt;CloudCertPrep, AIF-C01&lt;/a&gt;&lt;/em&gt;: banco abierto alineado con la v1.1.&lt;/li&gt;
  &lt;li&gt;Rose, D. (2026). &lt;em&gt;&lt;a href=&quot;https://dev.to/dale-rose/i-scored-10001000-on-aws-certified-ai-practitioner-aif-c01-heres-every-resource-i-used-4alf&quot;&gt;I scored 1000/1000 on AWS Certified AI Practitioner&lt;/a&gt;&lt;/em&gt;: el artículo que sirvió de molde para este.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Buena suerte en su certificación. El futuro es hoy, viejo 🎓&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>contra la entropía de internet</title>
   <link href="https://javier.io/blog/es/2026/08/31/contra-la-entropia-de-internet.html"/>
   <published>2026-08-31T00:00:00+00:00</published>
   <updated>2026-08-31T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2026/08/31/contra-la-entropia-de-internet</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">contra la entropía de internet</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2026/08/31/contra-la-entropia-de-internet.html">&lt;h2 id=&quot;contra-la-entropía-de-internet&quot;&gt;contra la entropía de internet&lt;/h2&gt;

&lt;h6 id=&quot;31-aug-2026&quot;&gt;31 Aug 2026&lt;/h6&gt;

&lt;p&gt;El 38% de las páginas web que existían en 2013 ya no existen. No es una metáfora, es la &lt;a href=&quot;https://web.archive.org/web/2024/https://www.pewresearch.org/data-labs/2024/05/17/when-online-content-disappears/&quot;&gt;medición de Pew Research&lt;/a&gt;. Internet tiene fama de que “todo queda para siempre” y la realidad es la contraria: internet se borra solo, y más rápido de lo que parece. Los links mueren, los formatos mueren, las empresas que hospedan tus cosas mueren — generalmente sin avisar.&lt;/p&gt;

&lt;p&gt;Y esto importa más de lo que parece, porque los historiadores definen civilización por su capacidad de dejar registro: la historia misma empieza donde empieza la escritura — todo lo anterior lo llamamos prehistoria. Ahí está la paradoja de nuestra era, brutal cuando se pone en números — una escalera invertida:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Tablilla de barro&lt;/strong&gt;: 5,000 años y todavía se lee (con un bonus perverso: los incendios que destruían las ciudades horneaban las tablillas y las volvían eternas — la entropía preservando por accidente).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Papiro en clima seco&lt;/strong&gt;: milenios; &lt;strong&gt;pergamino&lt;/strong&gt;: ~1,000 años.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Papel&lt;/strong&gt;: ~500 años.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Microfilm&lt;/strong&gt;: ~500 proyectados.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cinta magnética&lt;/strong&gt;: 10–30 años.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Disco duro&lt;/strong&gt;: 5–10 años.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Una página web&lt;/strong&gt;: mediana de vida medida en meses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada generación de medios guarda más y dura menos. La densidad sube, la longevidad baja: nos estamos volviendo más listos y más olvidadizos al mismo tiempo. La tecnología de información más avanzada que ha existido es la peor en el único juego que define a una civilización. Y quien dio la alarma fue &lt;a href=&quot;https://web.archive.org/web/2015/https://www.bbc.com/news/science-environment-31450389&quot;&gt;Vint Cerf&lt;/a&gt; — uno de los padres del protocolo IP — que desde 2015 advierte del “digital dark age”: que los historiadores del futuro vean el siglo XXI como un hueco negro informacional.&lt;/p&gt;

&lt;p&gt;Releyendo este blog me di cuenta de algo que nunca había enunciado: llevo 18 años peleando esa guerra sin haberla declarado. Esta entrada es la declaración, la historia de la batalla y el plan para aguantar a mediano y largo plazo.&lt;/p&gt;

&lt;h3 id=&quot;la-primera-herida&quot;&gt;La primera herida&lt;/h3&gt;

&lt;p&gt;En 2010 usaba los acortadores i.am y go.to para mis direcciones personales. Un día anunciaron su cierre — con horas de anticipación — y todos los links quedaron huérfanos.&lt;/p&gt;

&lt;p&gt;Esa fue la lección fundacional, aunque tardé años en verla como doctrina: &lt;strong&gt;todo lo que dependa de la buena voluntad de un tercero tiene fecha de vencimiento.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;la-historia-de-la-batalla&quot;&gt;La historia de la batalla&lt;/h3&gt;

&lt;p&gt;Con esa lente, media obra de este blog resulta ser la misma pelea en distintos frentes. Y no es solo el blog: es mi relación con la tecnología en general. Los proyectos que he tenido apuntan al mismo lugar — avanzar lo más que se pueda sobre la flecha temporal, y que la información alcance a llegar a parientes lejanos.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Rescatar antes de que muera.&lt;/strong&gt; Este blog absorbió a &lt;a href=&quot;https://viajemotu.wordpress.com/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt; completo antes de que &lt;a href=&quot;https://wordpress.com/&quot;&gt;WordPress&lt;/a&gt; decidiera por mí. Las charlas viven como archivos en mi propio dominio y se pueden &lt;a href=&quot;/blog/es/2017/07/27/talks-vlide.html&quot;&gt;revivir con un one-liner&lt;/a&gt; años después.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Espejar lo que se cita.&lt;/strong&gt; Casi todo paper, libro o binario referenciado aquí tiene copia en &lt;code&gt;f.javier.io/rep&lt;/code&gt; o en el mismo repositorio donde se aloja. Un link es una promesa ajena; un espejo es una promesa propia.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Confiar en el contenido, no en la ubicación.&lt;/strong&gt; &lt;a href=&quot;/blog/en/2015/02/27/wget-finder.html&quot;&gt;wget-finder&lt;/a&gt; buscaba tarballs por su checksum donde fuera que estuvieran: si el origen moría, cualquier espejo con los bytes correctos servía. &lt;a href=&quot;/blog/en/2015/06/29/tundle-tmux-plugin-manager.html&quot;&gt;tundle&lt;/a&gt; instalaba plugins por git hash. La URL deja de responder; el hash no. Hoy ese mecanismo está en todas partes: los lockfiles de npm con sus hashes de integridad, la &lt;a href=&quot;https://sum.golang.org/&quot;&gt;base de checksums&lt;/a&gt; de los módulos de Go, las imágenes de contenedores fijadas por digest sha256, los CIDs de &lt;a href=&quot;https://ipfs.tech/&quot;&gt;IPFS&lt;/a&gt;, y git mismo — donde cada commit es el hash de su contenido.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Embalsamar el software.&lt;/strong&gt; &lt;a href=&quot;/blog/en/2015/06/23/static-get.html&quot;&gt;static-get&lt;/a&gt; y los binarios estáticos: programas que no dependen de que su ecosistema de librerías siga vivo. Una década después la industria llegó a la misma conclusión y le puso otro nombre: &lt;a href=&quot;/blog/es/2018/09/11/talks-infraestructura-como-codigo.html&quot;&gt;contenedores&lt;/a&gt;. Y las recetas con las que se construían esos estáticos tienen su descendiente moderno en &lt;a href=&quot;https://nixos.org/&quot;&gt;Nix&lt;/a&gt;: builds declarativos y reproducibles, donde la receta define el resultado al byte.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Construir contra la flecha del tiempo.&lt;/strong&gt; &lt;a href=&quot;/blog/en/2018/08/22/minos-a-tiling-wm-linux-distro.html&quot;&gt;minos&lt;/a&gt; y su regla de paridad: el mismo código de empaquetado tenía que compilar en todas las LTS soportadas, y las recetas de los PPA reconstruían los paquetes solos cuando las fuentes avanzaban. No era perfeccionismo — era que el trabajo de hoy siguiera compilando mañana, sin mí.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Elegir el formato que sobrevive.&lt;/strong&gt; &lt;a href=&quot;/blog/es/2017/07/27/talks-vlide.html&quot;&gt;vlide&lt;/a&gt; existe en parte por esto: las charlas son texto plano que se presenta desde vim. Un PowerPoint de 2011 es hoy una lotería de versiones; un archivo de texto se abre en cualquier cosa, en cualquier década. El texto es el formato con la fecha de vencimiento más lejana que conocemos.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Respaldar como ritual.&lt;/strong&gt; &lt;a href=&quot;/blog/en/2014/04/08/backups-git-rsync-rdiff-backup.html&quot;&gt;rsync + rdiff-backup&lt;/a&gt; con diarios, semanales y mensuales, desde 2014 y hasta hoy (los proyectos actuales respaldan a object storage con verificación que falla ruidosamente).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reparar el rot acumulado.&lt;/strong&gt; Hace poco pasé &lt;a href=&quot;https://github.com/lycheeverse/lychee&quot;&gt;lychee&lt;/a&gt; sobre las 186 entradas: 18 años de links muertos redirigidos a &lt;a href=&quot;https://web.archive.org/&quot;&gt;web.archive.org&lt;/a&gt;, y todos los assets de terceros ahora viven en este repo. Gracias eternas al Internet Archive — la única institución peleando esta guerra a escala civilizatoria; &lt;a href=&quot;https://archive.org/donate/&quot;&gt;donen&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Y hasta la página de error.&lt;/strong&gt; El 404 de este sitio rescata una obra de arte que estaba muriendo junto con la tecnología en la que fue escrita (Flash). El rescate lo hizo un agente de IA que portó la tecnología vieja a la nueva — porque la IA también entró a esta guerra, del lado de la memoria: el trabajo de restauración es exhaustivo, y por primera vez la tecnología se ayuda a sí misma a reconstruir lo perdido. No diré más — piérdanse por el sitio y la encontrarán.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;el-enemigo-por-capas&quot;&gt;El enemigo, por capas&lt;/h3&gt;

&lt;p&gt;Para defender algo a décadas hay que modelar la amenaza. La entropía ataca por capas, de la más rápida a la más lenta:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Los links&lt;/strong&gt; (meses–años): lo que citas desaparece.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Los proveedores&lt;/strong&gt; (años): el hosting, el DNS, el acortador — cierran, cambian condiciones, te suspenden.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Los toolchains&lt;/strong&gt; (años): el generador del sitio deja de compilar; sus dependencias se rompen entre versiones.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Los formatos&lt;/strong&gt; (décadas): Flash murió con obras adentro. Los .doc de los 90 ya son arqueología.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;El humano&lt;/strong&gt; (una vida): la capa que nadie modela. ¿Quién renueva el dominio cuando yo no esté?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;cómo-lucha-este-blog-vs-la-entropía&quot;&gt;Cómo lucha este blog vs la entropía&lt;/h3&gt;

&lt;p&gt;Las decisiones aburridas ayudan de la siguiente manera:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Texto plano + markdown + git.&lt;/strong&gt; El formato más portable que ha producido la computación. Sin base de datos, sin CMS, sin nada que migrar. El sitio completo es un repositorio que cabe en cualquier lado.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Estático.&lt;/strong&gt; El HTML renderizado no necesita servidor de aplicación, ni versión de nada. Cualquier cosa que sirva archivos lo sirve.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Assets propios.&lt;/strong&gt; Después de la limpieza reciente, no depende de ningún CDN de terceros.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;El dominio, pagado 10 años por delante.&lt;/strong&gt; La capa de identidad es la única realmente insustituible: los proveedores de hosting son intercambiables detrás de un DNS, pero javier.io es javier.io.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;La economía, prepagada.&lt;/strong&gt; No solo el dominio: los VPS están pagados con la misma longevidad, y hay créditos de DigitalOcean de por vida (por haber trabajado ahí). La entropía también entra por la tarjeta: un servicio que depende de una factura mensual muere el primer mes que nadie la paga. Prepagar a años es comprarle tiempo al plan, aunque yo me distraiga.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;el-plan-a-largo-plazo&quot;&gt;El plan a largo plazo&lt;/h3&gt;

&lt;p&gt;Hoy el sitio vive en GitHub Pages. Está bien — pero la lección de i.am aplica: GitHub también es la buena voluntad de un tercero (se llama Microsoft). El plan no es encontrar el proveedor perfecto — es que ningún proveedor sea un punto único de falla:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. La indirección es el DNS, no las IPs.&lt;/strong&gt; Las IPs de GitHub Pages cambian y no importa: el dominio apunta por CNAME y mover el sitio entero es cambiar un registro. El riesgo real no son las IPs — es el proveedor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Congelar el artefacto, no solo la fuente.&lt;/strong&gt; El toolchain (Jekyll y su ecosistema Ruby) es la capa 3 del enemigo: algún día no compilará más. La defensa de este proyecto son sus Dockerfiles: el build corre en contenedores con versiones fijadas. Pero seamos honestos — eso también depende de un registro público que algún día morirá. La tecnología es un castillo de naipes frágil; el estado del arte sigue roto, aunque hay avance. Por eso la defensa final es la más humilde: el &lt;code&gt;_site/&lt;/code&gt; renderizado. Si algún día la fuente no compila, &lt;strong&gt;el HTML final es la verdadera bóveda&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. El espejo civilizatorio.&lt;/strong&gt; Snapshots en la Wayback Machine. Su &lt;a href=&quot;https://web.archive.org/save/&quot;&gt;Save Page Now&lt;/a&gt; funciona sin llaves — un GET a &lt;code&gt;web.archive.org/save/URL&lt;/code&gt; — aunque no indexa al momento: encola un job de captura que el Archive ejecuta a los pocos minutos. Esta defensa se agregó mientras se escribía esta entrada: el workflow que publica el sitio ahora termina con una tarea que espera a que el deploy esté en vivo y encola el snapshot de las páginas que cambiaron. Si todo lo mío falla a la vez, que quede la copia en la biblioteca de Alejandría de nuestra era.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. El deadman switch.&lt;/strong&gt; La capa humana necesita automatización también. El primer escalón ya quedó configurado mientras se escribía esta entrada: el &lt;a href=&quot;https://myaccount.google.com/inactive&quot;&gt;Inactive Account Manager&lt;/a&gt; de Google — a los 6 meses de inactividad, el correo (y con él, los resets de contraseña de todo lo demás) pasa a cuentas de respaldo. Queda un escalón más: un heartbeat en el propio repo — una GitHub Action que, si no detecta actividad mía en 12 meses, envía a mis herederos el runbook con dónde vive el dominio, dónde los espejos, y cómo se renueva qué.&lt;/p&gt;

&lt;h3 id=&quot;y-si-el-proveedor-eterno-sí-existe&quot;&gt;¿Y si el proveedor eterno sí existe?&lt;/h3&gt;

&lt;p&gt;Es la pregunta obligada: ¿no resuelven esto los sistemas descentralizados?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://ipfs.tech/&quot;&gt;IPFS&lt;/a&gt;&lt;/strong&gt;: direccionamiento por contenido — la identidad del archivo es su hash, no su ubicación (la idea que intenté a mi manera con &lt;a href=&quot;/blog/en/2015/02/27/wget-finder.html&quot;&gt;wget-finder&lt;/a&gt; en 2015, jeje). Pero el contenido solo existe mientras alguien lo &lt;em&gt;pinee&lt;/em&gt;: IPFS resuelve el direccionamiento, no la custodia. Filecoin le agrega incentivos económicos a esa custodia — contratos, no eternidad.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.bittorrent.org/&quot;&gt;BitTorrent&lt;/a&gt;&lt;/strong&gt;: inmortal mientras haya seeders. Es decir: la permanencia es proporcional a la popularidad. Un blog personal tendría un seeder — yo — y volvemos al punto de partida.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.torproject.org/&quot;&gt;Tor&lt;/a&gt;&lt;/strong&gt;: un onion service esconde &lt;em&gt;dónde&lt;/em&gt; está el servidor, no lo hace durar. Resuelve censura, no entropía.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El veredicto honesto: la descentralización no elimina la necesidad de que a alguien le importe — solo redistribuye a quiénes. El proveedor eterno no existe; lo que existe es la &lt;strong&gt;redundancia entre mortales&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;el-ártico-ya-tiene-una-copia-de-este-sitio&quot;&gt;El Ártico ya tiene una copia de este sitio&lt;/h3&gt;

&lt;p&gt;Y sin embargo, hay gente intentando el cuento en serio. En febrero de 2020, GitHub tomó un snapshot de todos los repositorios públicos activos, lo escribió en película fotosensible &lt;a href=&quot;https://www.piql.com/&quot;&gt;piql&lt;/a&gt; diseñada para durar ~1,000 años, y lo depositó en el &lt;a href=&quot;https://arcticworldarchive.org/&quot;&gt;Arctic World Archive&lt;/a&gt;: una mina de carbón desmantelada en Svalbard, en el permafrost noruego, a unos metros de la bóveda mundial de semillas.&lt;/p&gt;

&lt;p&gt;Este repositorio era público en esa fecha, y también mis proyectos de aquella época — minos, static-get, wget-finder, vlide. Es decir: &lt;strong&gt;una versión vieja de este sitio, y de la tecnología que lo rodea, está congelada en una montaña del Ártico&lt;/strong&gt;, y va a seguir ahí cuando GitHub, Microsoft y probablemente el formato HTML ya no existan. Fue un depósito único — se habló de refrescarlo cada varios años, pero hasta donde sé no ha habido un segundo — así que lo que está ahí es la foto de 2020: sin los ensayos de IA, sin el sax, sin esta entrada. La entropía también alcanza a las cápsulas del tiempo: se congelan, pero no se actualizan.&lt;/p&gt;

&lt;p&gt;El &lt;a href=&quot;https://archiveprogram.github.com/&quot;&gt;GitHub Archive Program&lt;/a&gt; completo es más interesante que la mina sola, porque piensa en capas de temperatura, como un buen sistema de storage: caliente (el repo vivo), tibia (&lt;a href=&quot;https://www.softwareheritage.org/&quot;&gt;Software Heritage&lt;/a&gt;, que archiva continuamente todo repositorio público y asigna identificadores persistentes por contenido — SWHIDs, otra vez el hash como identidad), y fría (Svalbard). Mi plan de la sección anterior es la misma arquitectura en miniatura.&lt;/p&gt;

&lt;h3 id=&quot;la-escalera-de-la-permanencia&quot;&gt;La escalera de la permanencia&lt;/h3&gt;

&lt;p&gt;Si uno quisiera subir la apuesta por horizonte de tiempo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Décadas&lt;/strong&gt;: todo lo del plan — espejos git, multi-hosting, Wayback Machine, Software Heritage. Digital, vivo, actualizable.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Siglos&lt;/strong&gt;: medios pasivos que no necesitan electricidad ni mantenimiento: la película piql de Svalbard (~1,000 años), M-DISC óptico (~1,000 años declarados), y &lt;a href=&quot;https://www.memory-of-mankind.com/&quot;&gt;Memory of Mankind&lt;/a&gt; — microfilm en tablillas de cerámica dentro de una mina de sal en Hallstatt, Austria, donde cualquier persona puede depositar contenido.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Milenios&lt;/strong&gt;: aquí se pone ciencia ficción con papers: nanofiche de níquel (la &lt;a href=&quot;https://www.archmission.org/&quot;&gt;Arch Mission Foundation&lt;/a&gt; mandó 30 millones de páginas a la Luna en 2019 — la “Lunar Library” viajaba en el lander Beresheet, que se estrelló, y el disco probablemente sobrevivió al impacto), vidrio de cuarzo grabado con láser de femtosegundos (el &lt;a href=&quot;https://web.archive.org/web/2016/https://www.southampton.ac.uk/news/2016/02/5d-data-storage-update.page&quot;&gt;“5D optical storage”&lt;/a&gt; de Southampton y el Project Silica de Microsoft, con proyecciones de miles de millones de años), y ADN sintético — la densidad más alta conocida, milenios si se guarda frío y seco.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La ironía de la escalera es que cada peldaño hacia arriba sacrifica lo que hace vivo a un blog: lo de siglos y milenios es de solo escritura, sin updates, sin 404 con Bach. La realidad es que no existen sistemas que respalden la tecnología web: estamos volando sin red de seguridad.&lt;/p&gt;

&lt;h3 id=&quot;el-peldaño-que-falta&quot;&gt;El peldaño que falta&lt;/h3&gt;

&lt;p&gt;Todos los peldaños comparten un límite: o están vivos y necesitan que alguien los atienda, o son eternos y están muertos. El peldaño de arriba — el que no existe todavía — sería un sistema con energía propia, auto-reparación, auto-replicación y corrección de errores, con un solo objetivo grabado: preservarse para preservar una carga. Eso ya no es un datacenter; eso es un organismo, y no sabemos construirlo.&lt;/p&gt;

&lt;p&gt;La ciencia ficción, ya lo especificó. Asimov lo escribió en &lt;a href=&quot;https://archive.org/details/Science_Fiction_Quarterly_New_Series_v04n05_1956-11_slpn/page/n5/mode/2up&quot;&gt;The Last Question&lt;/a&gt; (1956) — el cuento sobre esta entrada: la humanidad le pregunta a su computadora, durante billones de años, si la entropía puede revertirse, mientras la máquina — que se mantiene, se rediseña y se hereda a sí misma — recolecta los datos de una especie que se apaga. Y Pixar lo dibujó en WALL-E: un robot que se carga con el sol, se repara con piezas de sus unidades muertas y sigue cumpliendo su misión 700 años después de que los humanos se fueron — y cuyo verdadero tesoro no es la basura compactada, sino una cinta de &lt;em&gt;Hello, Dolly!&lt;/em&gt;. La máquina custodiando una emoción. Esa es la carga que importa: no los bytes — lo que los bytes hacen sentir.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;La entropía va a ganar al final — siempre gana, es la casa. Pero el juego nunca fue ganarle: es perder tan lento que lo que importa alcance a llegar a las manos siguientes. Dieciocho años después, la bóveda sigue abierta.&lt;/p&gt;

&lt;h3 id=&quot;referencias&quot;&gt;Referencias&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Pew Research Center (2024). &lt;em&gt;&lt;a href=&quot;https://web.archive.org/web/2024/https://www.pewresearch.org/data-labs/2024/05/17/when-online-content-disappears/&quot;&gt;When Online Content Disappears&lt;/a&gt;&lt;/em&gt;: el 38% de las páginas de 2013, inaccesibles una década después.&lt;/li&gt;
  &lt;li&gt;Zittrain, J., et al. (2021). &lt;em&gt;&lt;a href=&quot;https://web.archive.org/web/2021/https://cyber.harvard.edu/publication/2021/paper-record-meets-ephemeral-web&quot;&gt;The Paper of Record Meets an Ephemeral Web&lt;/a&gt;&lt;/em&gt;: 25% de los deep links en artículos del New York Times, muertos.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archiveprogram.github.com/&quot;&gt;GitHub Archive Program&lt;/a&gt; — la estrategia de capas: repo vivo → Software Heritage → Svalbard.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/&quot;&gt;Internet Archive&lt;/a&gt; — la excepción que sostiene a todos los demás.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No entres dócilmente en esa buena noche 🕯️&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>sax yds 120</title>
   <link href="https://javier.io/blog/es/2026/07/27/sax-yds-120.html"/>
   <published>2026-07-27T00:00:00+00:00</published>
   <updated>2026-07-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2026/07/27/sax-yds-120</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="sax"/>
   
   <category term="music"/>
   
   <category term="electronic"/>
   
   <category term="yds-120"/>
   
   
   
   <summary type="html">sax yds 120</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2026/07/27/sax-yds-120.html">&lt;h2 id=&quot;sax-yds-120&quot;&gt;sax yds 120&lt;/h2&gt;

&lt;h6 id=&quot;27-jul-2026&quot;&gt;27 Jul 2026&lt;/h6&gt;

&lt;h4 id=&quot;largo--18-temas-65-min&quot;&gt;Largo — 18 temas, ~65 min&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=_hQjD2E6dpY&amp;amp;list=PLSWDETtfZng4&quot;&gt;El rey león&lt;/a&gt;: &lt;a href=&quot;http://f.javier.io/rep/sax/partituras/Circle_of_life_%e2%80%93_Elton_John.pdf&quot;&gt;PDF&lt;/a&gt;, preset: &lt;strong&gt;s11&lt;/strong&gt;, s12 (soprano, si bemol), t12 (tenor, si bemol)&lt;/li&gt;
  &lt;li&gt;Careless Whisper, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mYXz-UkCrP0&amp;amp;list=PLSWDETtfZng4&quot;&gt;Can’t help falling in love&lt;/a&gt;, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol), a3 (para interiores)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=D5lwODCz9_U&amp;amp;list=PLSWDETtfZng4&quot;&gt;Besame mucho&lt;/a&gt;, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol), b10 (barítono, mi bemol, para interiores)&lt;/li&gt;
  &lt;li&gt;Fly Me to the Moon, preset: &lt;strong&gt;a4&lt;/strong&gt;, a15 (alto, mi bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;Tequila, preset: &lt;strong&gt;a1&lt;/strong&gt;, a15 (alto, mi bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;Lambada, preset: &lt;strong&gt;a1&lt;/strong&gt;, a8 (alto, mi bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;Let It Go, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=vCnHwQ2B2EE&amp;amp;list=PLSWDETtfZng4&quot;&gt;Reloj&lt;/a&gt;, preset: &lt;strong&gt;t1&lt;/strong&gt;, t13, t4 (tenor, si bemol), s11 (soprano, si bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zke6UbbReY4&amp;amp;list=PLSWDETtfZng4&quot;&gt;Solamente una vez&lt;/a&gt;, preset: &lt;strong&gt;t5&lt;/strong&gt;, t1, t8 (tenor, si bemol), s11 (soprano, si bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Xlpl-9dAiqc&amp;amp;list=PLSWDETtfZng4&quot;&gt;What a wonderful world&lt;/a&gt;, preset: &lt;strong&gt;a4&lt;/strong&gt;, a15 (alto, mi bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mgPswVVpI60&amp;amp;list=PLSWDETtfZng4&quot;&gt;Silent Night&lt;/a&gt;, preset: &lt;strong&gt;a8&lt;/strong&gt; (alto, mi bemol)&lt;/li&gt;
  &lt;li&gt;Historia de un amor, preset: &lt;strong&gt;t1&lt;/strong&gt;, t5 (tenor, si bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=DSEYbzn6j_g&amp;amp;list=PLSWDETtfZng4&quot;&gt;How Deep Is Your Love&lt;/a&gt;, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=M9Z8qwgoeKk&amp;amp;list=PLSWDETtfZng4&quot;&gt;Close to you&lt;/a&gt;, preset: &lt;strong&gt;t4&lt;/strong&gt; (tenor, si bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=V1DrTySHUUw&amp;amp;list=PLSWDETtfZng4&quot;&gt;My Heart Will Go On&lt;/a&gt;, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4jBkaJmlSe0&amp;amp;list=PLSWDETtfZng4&quot;&gt;My way&lt;/a&gt;, preset: &lt;strong&gt;t4&lt;/strong&gt; (tenor, si bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=yqrjJ-c14PU&amp;amp;list=PLSWDETtfZng4&quot;&gt;Ave maría&lt;/a&gt;, preset: &lt;strong&gt;a14&lt;/strong&gt;, a15 (alto, mi bemol), a3 (para interiores)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;corto--9-temas-30-min&quot;&gt;Corto — 9 temas, ~30 min&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=_hQjD2E6dpY&amp;amp;list=PLSWDETtfZng4&quot;&gt;El rey león&lt;/a&gt;: &lt;a href=&quot;http://f.javier.io/rep/sax/partituras/Circle_of_life_%e2%80%93_Elton_John.pdf&quot;&gt;PDF&lt;/a&gt;, preset: &lt;strong&gt;s11&lt;/strong&gt;, s12 (soprano, si bemol), t12 (tenor, si bemol)&lt;/li&gt;
  &lt;li&gt;Careless Whisper, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mYXz-UkCrP0&amp;amp;list=PLSWDETtfZng4&quot;&gt;Can’t help falling in love&lt;/a&gt;, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol), a3 (para interiores)&lt;/li&gt;
  &lt;li&gt;Tequila, preset: &lt;strong&gt;a1&lt;/strong&gt;, a15 (alto, mi bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;Let It Go, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol, falta backtrack)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=D5lwODCz9_U&amp;amp;list=PLSWDETtfZng4&quot;&gt;Besame mucho&lt;/a&gt;, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol), b10 (barítono, mi bemol, para interiores)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=M9Z8qwgoeKk&amp;amp;list=PLSWDETtfZng4&quot;&gt;Close to you&lt;/a&gt;, preset: &lt;strong&gt;t4&lt;/strong&gt; (tenor, si bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=V1DrTySHUUw&amp;amp;list=PLSWDETtfZng4&quot;&gt;My Heart Will Go On&lt;/a&gt;, preset: &lt;strong&gt;a15&lt;/strong&gt; (alto, mi bemol)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4jBkaJmlSe0&amp;amp;list=PLSWDETtfZng4&quot;&gt;My way&lt;/a&gt;, preset: &lt;strong&gt;t4&lt;/strong&gt; (tenor, si bemol)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algunos de estos videos requirieron tratamiento personal. Me auxilié de &lt;a href=&quot;https://github.com/javier-lopez/sax&quot;&gt;sax&lt;/a&gt; para generarlos. Un script que recibe una url de YouTube con el backtrack que deseas + la partitura de MuseScore en formato MusicXML, y saca un video con el pentagrama y una barra que va marcando por dónde va la canción. Lo que más me costó fue afinar esa barra, tiene que ir adelantada al sonido, el resultado está diseñado para ser fácil de leer en eventos en vivo y se ejecuta desde una consola, no GUI required, con docker, estoy orgulloso del resultado =).&lt;/p&gt;

&lt;p&gt;Resumen de presets:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;a1-a14&lt;/strong&gt;, sax alto (mi bemol): tonos de concierto, rockeros con más brillo y cortes para solos.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;s1-s14&lt;/strong&gt;, sax soprano (si bemol): tonos clásicos, jazzeros y variaciones modernas.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;t1-t14&lt;/strong&gt;, sax tenor (si bemol): gama clásica, jazz con cuerpo, tonos oscuros y procesados.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;b1-b14&lt;/strong&gt;, sax barítono (mi bemol): graves profundos, secos, para secciones de metales y solos de jazz.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;c1-c14&lt;/strong&gt;, flautas de viento y otras mezclas raras.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;u1-u20&lt;/strong&gt;, presets del usuario, suenan igual por defecto, pueden configurarse con la app del sax.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;Hace poco me hice de un &lt;strong&gt;Yamaha YDS-120&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/0d2af346-a9da-4d0d-9b55-753bdc74a61d&quot;&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/0d2af346-a9da-4d0d-9b55-753bdc74a61d&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un saxofón/controlador MIDI, y estas son mis impresiones. De las alternativas existentes, le atiné por suerte (porque no hice un análisis exhaustivo), pero estoy convencido de que fue la mejor opción en 2026 por las siguientes razones:&lt;/p&gt;

&lt;h4 id=&quot;yamaha-yds-150&quot;&gt;Yamaha YDS-150&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/5cd732b4-f8bb-4370-b005-076e85734d85&quot;&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/5cd732b4-f8bb-4370-b005-076e85734d85&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En comparación con su hermano mayor no tiene la molesta corneta al final que lo hace menos estético y portable; en contra, no trae conectividad Bluetooth.&lt;/p&gt;

&lt;h4 id=&quot;roland-aerophone-ae-20&quot;&gt;Roland Aerophone AE-20&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/a659d729-35bc-417b-8fb2-f08f59d857e5&quot;&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/a659d729-35bc-417b-8fb2-f08f59d857e5&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En comparación con el AE-20, los botones se asemejan con mayor naturalidad a un saxofón real y estéticamente también es superior. En contra, al parecer los sonidos preconfigurados son de mejor calidad en el Roland; sin embargo, al ser un controlador MIDI, esto pierde efecto si se generan los sonidos por software. También es más económico.&lt;/p&gt;

&lt;h4 id=&quot;travel-sax-2&quot;&gt;Travel Sax 2&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/6c2a9e73-b1ec-4cd8-a794-3f44bfefd169&quot;&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/6c2a9e73-b1ec-4cd8-a794-3f44bfefd169&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El Travel Sax viene con una configuración minimalista enfocada en ahorrar espacio. Como tal el YDS-120 es superior para practicar digitación, pues se asemeja más a un saxofón real; también es más económico y el diseño es superior. En contra, el Travel Sax trae Bluetooth, batería y es el más portable de todos.&lt;/p&gt;

&lt;h4 id=&quot;emeo&quot;&gt;EMEO&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/072109e9-2f75-4c8c-b9d1-39fee1b24082&quot;&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/072109e9-2f75-4c8c-b9d1-39fee1b24082&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El EMEO en mi opinión es la competencia más fuerte: es un saxofón real con electrónica para hacerlo un controlador MIDI, es bello. Sin embargo, si le hubieran colocado la campana hubieran coronado. Otra cosa es que no viene con parlantes, hay que conectarlo forzosamente a un medio externo, eso le resta puntos en portabilidad; también es mucho más costoso, pero por un trabajo bien hecho el precio se justifica.&lt;/p&gt;

&lt;p&gt;Aún hay espacio para mejoras considerables en estos instrumentos, sin embargo en el 2026 para mí, el YDS-120 es la mejor alternativa.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Algunas notas sobre el YDS-120: viene con conector micro USB, en el 2026 es una falla, la mayoría de dispositivos son USB-C, por lo que hay que conseguir un adaptador. A favor, la misma entrada sirve para enviar las notas MIDI y como cargador, así puedes conectar el sax al teléfono y tienes carga y generador de sonido al mismo tiempo; lo uso con un iPhone 17 y SWAM Alto/Tenor Sax 3 (por cierto, es frustrante que SWAM fuerce a separar los sonidos por app, son avaros los tipos).&lt;/p&gt;

&lt;p&gt;Trae una entrada y una salida plug de audio, y el sax mezcla internamente los sonidos, de tal manera que es posible conectar una tableta / computadora con un video de YouTube como backtrack, y conectar la salida a una bocina externa para obtener ambos sonidos unificados. El control de audio se hace desde la tableta/laptop y la mezcla no es sofisticada como un mixer profesional, pero funciona. Si se desea mayor control se puede combinar con un WIDI Uhost para transferir el MIDI vía Bluetooth a cualquier otro dispositivo.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Saludos desde un post terremoto en Catia la mar Venezuela, boa tarde, 🎼🎷💙&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>la brecha invisible: herramientas para dirigir la ia</title>
   <link href="https://javier.io/blog/es/2026/03/27/la-brecha-invisible-herramientas-para-dirigir-la-ia.html"/>
   <published>2026-03-27T00:00:00+00:00</published>
   <updated>2026-03-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2026/03/27/la-brecha-invisible-herramientas-para-dirigir-la-ia</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ai"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">la brecha invisible: herramientas para dirigir la ia</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2026/03/27/la-brecha-invisible-herramientas-para-dirigir-la-ia.html">&lt;h2 id=&quot;la-brecha-invisible-herramientas-para-dirigir-la-ia&quot;&gt;la brecha invisible: herramientas para dirigir la ia&lt;/h2&gt;

&lt;h6 id=&quot;27-mar-2026&quot;&gt;27 Mar 2026&lt;/h6&gt;

&lt;p&gt;Llevo un mes construyendo &lt;a href=&quot;https://tucastigo.com&quot;&gt;tucastigo.com&lt;/a&gt; — una plataforma de chat en tiempo real con pagos crypto, contenido multimedia por niveles, moderación automática y perfiles swipe. ~96,000 líneas de código (18K Python backend + 23K TypeScript frontend + 48K tests + 12K tipos generados), 25 tablas en PostgreSQL, WebSocket bidireccional con 18 tipos de mensaje y presencia/persistencia, 143 endpoints REST, todo dockerizado y desplegado, con respaldos automaticos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/brecha-invisible.png&quot;&gt;&lt;img src=&quot;/assets/img/brecha-invisible.png&quot; alt=&quot;terminal con listado de archivos y categorías tipo hacker, metáfora de las herramientas para dirigir a la IA&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En mi &lt;a href=&quot;/blog/es/2026/02/17/la-falsa-democratizacion-de-la-tecnologia.html&quot;&gt;artículo anterior&lt;/a&gt; argumenté que la IA no democratiza la tecnología — la amplifica para quienes ya tienen el conocimiento. Las decisiones de arquitectura (Flask vs. Django, cuándo cachear, cómo segmentar redes) no las toma la IA.&lt;/p&gt;

&lt;p&gt;Pero hay una segunda capa que no cubrí: las herramientas para dirigir a la IA misma. Porque el cuello de botella pasó del código a la gestión eficiente de los agentes de IA — que pierden el contexto, olvidan las reglas, repiten errores, y olvidan dónde están parados en un proyecto complejo.&lt;/p&gt;

&lt;p&gt;Este artículo documenta las herramientas que adopté para resolver ese problema.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;el-stack-de-la-aplicación-para-contexto&quot;&gt;El stack de la aplicación (para contexto)&lt;/h3&gt;

&lt;p&gt;No voy a repetir cada decisión del stack — para eso está el artículo anterior. Pero &lt;a href=&quot;https://tucastigo.com&quot;&gt;tucastigo.com&lt;/a&gt; es considerablemente más complejo que &lt;a href=&quot;https://saludpass.com&quot;&gt;saludpass.com&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Python 3.13 / Litestar 2.x (ASGI async), SQLAlchemy 2.0, asyncpg, Valkey (Redis fork)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; React 19, TypeScript 6.0 strict, Vite 8, Tailwind + DaisyUI, Motion (animaciones spring)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Chat en tiempo real:&lt;/strong&gt; WebSocket con protocolo JSON tipado, presencia en Valkey SET, persistencia en Valkey Streams.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Contratos API:&lt;/strong&gt; &lt;code&gt;msgspec.Struct&lt;/code&gt; → OpenAPI 3.1 → &lt;code&gt;openapi-fetch&lt;/code&gt; + Zod. El backend es la fuente de verdad: un cambio en un Struct se propaga automáticamente a los tipos typescript, de tal manera que el front siempre consumira la estructura correcta del backend.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pagos:&lt;/strong&gt; NOWPayments (crypto), Solana SDK (payouts batch), idempotencia con cache 24h&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Moderación:&lt;/strong&gt; detección de contacto (WhatsApp/Telegram), OpenAI Vision para contenido explícito, sistema de strikes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Procesamiento:&lt;/strong&gt; Pillow + OpenCV (blur facial), FFmpeg (transcoding), tesseract.js + human.js (biometría client-side)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;TDD:&lt;/strong&gt; &lt;code&gt;pytest-asyncio&lt;/code&gt; con savepoints. &lt;code&gt;pytest-xdist&lt;/code&gt; para ejecuciones en paralelo, +1500 tests en 90s~ (unit + integration + e2e + meta).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Infraestructura:&lt;/strong&gt; Docker Compose (7 servicios), Nginx + CrowdSec (WAF), Let’s Encrypt, GitHub Actions CI/CD&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Observabilidad:&lt;/strong&gt; Sentry (errores + performance + session replay), Grafana (monitoreo de logs de produccion)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todo esto en un mes, trabajando a medio tiempo. No porque la IA sea mágica — sino porque se usa un sistema para dirigirla.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;el-problema-real-el-contexto-es-finito&quot;&gt;El problema real: el contexto es finito&lt;/h3&gt;

&lt;p&gt;Los modelos de lenguaje tienen una ventana de contexto. Claude soporta 1M de tokens. Suena mucho hasta que consideras que un solo archivo de 500 líneas consume ~2,000 tokens, y un proyecto como &lt;a href=&quot;https://tucastigo.com&quot;&gt;tucastigo.com&lt;/a&gt; tiene cientos de ellos.&lt;/p&gt;

&lt;p&gt;El agente de IA no puede “recordar” todo tu proyecto. Cada vez que le pides algo, está operando con una vista parcial. Y cuando esa vista se degrada, empiezan los problemas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Olvida convenciones que le dijiste hace 20 mensajes&lt;/li&gt;
  &lt;li&gt;Crea un segundo archivo de migración cuando solo debe haber uno&lt;/li&gt;
  &lt;li&gt;Usa &lt;code&gt;docker compose&lt;/code&gt; directo cuando la regla es usar &lt;code&gt;./scripts/run.sh&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La solución no es un modelo más grande. Es infraestructura alrededor del modelo.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;get-shit-done-gsd-un-framework-para-no-perder-el-hilo&quot;&gt;Get Shit Done (GSD): un framework para no perder el hilo&lt;/h3&gt;

&lt;p&gt;GSD es un sistema de planificación y ejecución que vive dentro del editor (Claude Code). No es un plugin cosmético — es un framework completo con fases, planes, verificación y estado persistente.&lt;/p&gt;

&lt;h4 id=&quot;cómo-funciona&quot;&gt;Cómo funciona&lt;/h4&gt;

&lt;p&gt;El proyecto se divide en milestones → fases → planes → tareas. Cada nivel tiene documentación estructurada:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.planning/
├── PROJECT.md          ← Visión, valor central, constraints
├── ROADMAP.md          ← 4 fases con dependencias y criterios de éxito
├── REQUIREMENTS.md     ← 27 requerimientos mapeados a fases
├── STATE.md            ← Posición actual, métricas, punto de reanudación
└── phases/
    ├── 01-backend-contract-tests/
    │   ├── 01-CONTEXT.md       ← Decisiones tomadas
    │   ├── 01-01-PLAN.md       ← Plan ejecutable con criterios
    │   └── 01-01-SUMMARY.md    ← Qué se hizo, cuánto tardó, desvíos
    └── 02-websocket-behavior/
        └── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;por-qué-importa&quot;&gt;Por qué importa&lt;/h4&gt;

&lt;p&gt;Cuando el agente empieza una tarea, no opera a ciegas. Lee &lt;code&gt;PROJECT.md&lt;/code&gt; para entender las restricciones. Lee el &lt;code&gt;CONTEXT.md&lt;/code&gt; de la fase para saber qué decisiones ya se tomaron. Lee el &lt;code&gt;STATE.md&lt;/code&gt; para saber exactamente dónde se quedó la última sesión.&lt;/p&gt;

&lt;p&gt;Sin GSD, cada nueva sesión empieza desde cero. El agente tiene que redescubrir el proyecto, y tú tienes que repetir las mismas instrucciones.&lt;/p&gt;

&lt;p&gt;Con GSD, el agente retoma donde se quedó. Sabe que está en la fase 2, plan 2, que las fases anteriores ya extrajeron la lógica a servicios, y que los tests de regresión ya existen.&lt;/p&gt;

&lt;h4 id=&quot;subagentes-especializados&quot;&gt;Subagentes especializados&lt;/h4&gt;

&lt;p&gt;GSD no usa un solo agente. Despacha subagentes especializados según la tarea:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;gsd-phase-researcher&lt;/code&gt;: investiga cómo implementar una fase antes de planificar&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;gsd-executor&lt;/code&gt;: ejecuta planes con commits atómicos y manejo de desviaciones, habitualmente en paralelo.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;gsd-verifier&lt;/code&gt;: valida que la fase cumplió su objetivo (goal-backward analysis)&lt;/li&gt;
  &lt;li&gt;…y varios más (planner, codebase-mapper, debugger, integration-checker)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada subagente recibe solo el contexto que necesita. El researcher no necesita ver el código — necesita ver la documentación. El executor no necesita investigar — necesita el plan y los archivos a modificar. Separar responsabilidades reduce el consumo de contexto.&lt;/p&gt;

&lt;h4 id=&quot;monitoreo-de-contexto-en-tiempo-real&quot;&gt;Monitoreo de contexto en tiempo real&lt;/h4&gt;

&lt;p&gt;GSD incluye un monitor de contexto que inyecta advertencias cuando el contexto disponible cae:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt; 35%&lt;/code&gt; restante: advertencia — considera cerrar la sesión&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;&amp;lt; 25%&lt;/code&gt; restante: crítico — guarda estado y cierra&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto previene el escenario más costoso: que el agente degenere silenciosamente porque ya no “recuerda” las reglas del proyecto.&lt;/p&gt;

&lt;h4 id=&quot;workflow-y-notificaciones&quot;&gt;Workflow y notificaciones&lt;/h4&gt;

&lt;p&gt;He creado el skill &lt;code&gt;/n&lt;/code&gt; como atajo a &lt;code&gt;/gsd:next&lt;/code&gt; con la finalidad de dar seguimiento desde el telefono via &lt;code&gt;/remote-control&lt;/code&gt; y estoy usando &lt;a href=&quot;https://ntfy.sh/&quot;&gt;ntfy.sh&lt;/a&gt; para generar notificaciones cuando GSD termina con una fase, asi evito tiempos muertos.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;matcher&quot;: &quot;Agent|Task&quot;,
  &quot;hooks&quot;: [
    {
      &quot;type&quot;: &quot;command&quot;,
      &quot;command&quot;: &quot;/home/m/.claude/hooks/ntfy-notify.sh&quot;,
      &quot;timeout&quot;: 5
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cat hooks/ntfy-notify.sh
#!/bin/bash
# Notify via ntfy.sh when a Claude Code agent completes
# PostToolUse hook — only triggers on Agent/Task tool completion

TOPIC=&quot;canal-de-notificaciones&quot;

# Extract summary from tool output (first 200 chars)
SUMMARY=$(echo &quot;$CLAUDE_TOOL_OUTPUT&quot; | head -5 | tr &apos;\n&apos; &apos; &apos; | cut -c1-200)

if [ -z &quot;$SUMMARY&quot; ]; then
  SUMMARY=&quot;Agente completado&quot;
fi

curl -s -o /dev/null \
  -H &quot;Priority: high&quot; \
  -H &quot;Title: Claude Code&quot; \
  -d &quot;$SUMMARY&quot; \
  &quot;ntfy.sh/$TOPIC&quot; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;alternativas&quot;&gt;Alternativas&lt;/h4&gt;

&lt;p&gt;GSD no es la única opción. El ecosistema de herramientas para gestión de contexto en agentes de IA está creciendo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CLAUDE.md / AGENTS.md:&lt;/strong&gt; el enfoque nativo de Claude Code — instrucciones en la raíz del proyecto. Simple y efectivo para proyectos pequeños, pero no escala cuando tienes 27 requerimientos y 4 fases con dependencias.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cursor Rules / Roo Code Memory Bank:&lt;/strong&gt; enfoques similares en otros editores (Cursor, Cline/Continue) para persistir contexto entre sesiones.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Aider Conventions, Custom GPTs, y otros&lt;/strong&gt; — cada editor/plataforma tiene su variante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La diferencia clave de GSD es que no es solo contexto estático — es un flujo de ejecución con estado, fases, verificación y subagentes. No le dice al modelo “estas son las reglas” — le dice “estás en la fase 2, plan 1, tarea 3, y estos son los criterios de éxito que debes cumplir antes de avanzar”.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;rtk-rust-token-killer-70-menos-tokens-por-operación&quot;&gt;RTK (Rust Token Killer): 70% menos tokens por operación&lt;/h3&gt;

&lt;p&gt;Cada vez que el agente ejecuta un comando (&lt;code&gt;git status&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;docker logs&lt;/code&gt;), la salida completa se inyecta en el contexto. Un &lt;code&gt;git status&lt;/code&gt; verboso puede consumir cientos de tokens. Un &lt;code&gt;docker logs&lt;/code&gt; puede consumir miles.&lt;/p&gt;

&lt;p&gt;RTK es un proxy CLI escrito en Rust que intercepta comandos y filtra la salida antes de que llegue al modelo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Total commands:    6136
Tokens saved:     7.3M (70.1%)
Efficiency:       █████████████████░░░░░░░ 70.1%
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;7.3 millones de tokens ahorrados en un mes. Eso es contexto que el modelo puede usar para razonar en vez de procesar output irrelevante.&lt;/p&gt;

&lt;h4 id=&quot;cómo-se-integra&quot;&gt;Cómo se integra&lt;/h4&gt;

&lt;p&gt;RTK no requiere cambiar ningún comando. Un hook de Claude Code reescribe automáticamente cada invocación:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git status  →  rtk git status    (transparente, 0 overhead)
ls -la      →  rtk ls -la        (filtra, comprime)
docker logs →  rtk docker logs   (trunca, resume)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Los ahorros más significativos: el test runner (vitest) ahorra 99.7% porque RTK filtra todo excepto el resumen de resultados. El agente no necesita ver 500 líneas de output de tests — necesita saber si pasaron o fallaron.&lt;/p&gt;

&lt;h4 id=&quot;rtk-discover&quot;&gt;rtk discover&lt;/h4&gt;

&lt;p&gt;RTK también analiza el historial de Claude Code para detectar oportunidades perdidas — comandos que se ejecutaron sin proxy y consumieron tokens innecesariamente.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;reglas-de-agente-33-errores-que-ya-no-se-repiten&quot;&gt;Reglas de agente: 33 errores que ya no se repiten&lt;/h3&gt;

&lt;p&gt;El directorio &lt;code&gt;.agents/rules/&lt;/code&gt; contiene 31 reglas que el agente debe leer antes de tocar código. Esto no es documentación — es un firewall cognitivo.&lt;/p&gt;

&lt;p&gt;Cada regla existe porque el agente cometió ese error al menos una vez:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Implementar sin escribir tests primero (TDD es obligatorio)&lt;/li&gt;
  &lt;li&gt;Crear un segundo archivo de migración (solo uno hasta producción)&lt;/li&gt;
  &lt;li&gt;Usar &lt;code&gt;docker compose&lt;/code&gt; directo (siempre &lt;code&gt;./scripts/run.sh dev&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;…y 29 más&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sin estas reglas, cada nueva sesión puede reintroducir bugs que ya se corrigieron. Con ellas, el agente llega con el conocimiento acumulado de todas las sesiones anteriores, consultando el checklist que mapea cada tipo de cambio a las reglas relevantes.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;mcp-el-modelo-que-usa-herramientas-externas&quot;&gt;MCP: el modelo que usa herramientas externas&lt;/h3&gt;

&lt;p&gt;MCP (Model Context Protocol) permite que el agente de IA se conecte a servicios externos como si fueran extensiones nativas.&lt;/p&gt;

&lt;h4 id=&quot;playwright-mcp--testing-visual-automatizado&quot;&gt;Playwright MCP — testing visual automatizado&lt;/h4&gt;

&lt;p&gt;El agente puede abrir un navegador real, abrir la aplicación, y verificar visualmente que los cambios funcionan. Esto es crítico para una app con animaciones spring, gestos swipe, y modales de pago con temas dinámicos.&lt;/p&gt;

&lt;p&gt;Un overlay se inyecta durante las pruebas para prevenir que el usuario interactúe accidentalmente con el navegador mientras el agente lo controla vía CDP (Chrome DevTools Protocol).&lt;/p&gt;

&lt;h4 id=&quot;sentry-mcp--debugging-y-performance-con-datos-reales&quot;&gt;Sentry MCP — debugging y performance con datos reales&lt;/h4&gt;

&lt;p&gt;El agente puede consultar Sentry directamente — buscar errores, analizar trazas de performance, pedir análisis de causa raíz con Seer (la IA de Sentry), y correlacionar problemas con deploys específicos. En vez de copiar-pegar stacktraces al chat, el agente consulta Sentry como lo haría un desarrollador.&lt;/p&gt;

&lt;p&gt;Pero donde Sentry brilló en &lt;a href=&quot;https://tucastigo.com&quot;&gt;tucastigo.com&lt;/a&gt; fue en optimización de performance. En una sesión de optimización, el agente leyó las transacciones más lentas desde Sentry, identificó que &lt;code&gt;get_profiles&lt;/code&gt; tardaba 804ms por un problema de N+1 queries, y lo bajó a 38ms (21x más rápido). Otros endpoints como &lt;code&gt;auth/me&lt;/code&gt; y &lt;code&gt;unread_counts&lt;/code&gt; pasaron de 216ms y 51ms a &amp;lt;10ms con cache hits, desapareciendo del top 10 de transacciones lentas de Sentry por completo.&lt;/p&gt;

&lt;p&gt;El ciclo es: Sentry identifica el problema con datos reales → el agente lee esos datos vía MCP → implementa el fix → Sentry confirma la mejora.&lt;/p&gt;

&lt;h4 id=&quot;grafana-mcp--debugging-con-logs-de-produccion&quot;&gt;Grafana MCP — debugging con logs de produccion&lt;/h4&gt;

&lt;p&gt;Una copia de las bitacoras se centraliza en &lt;a href=&quot;https://grafana.com&quot;&gt;grafana.com&lt;/a&gt; y la conexion via MCP permite a Claude buscar y analizar logs. He creado un skill &lt;code&gt;/tucastigo-produccion-ayer&lt;/code&gt; que se ejecuta todos los dias por la manana y que me genera un reporte con la lista de errores, trafico sospechoso, etc, excelente para iniciar el dia con una lista de actividades.&lt;/p&gt;

&lt;h4 id=&quot;context7-mcp--documentación-actualizada&quot;&gt;Context7 MCP — documentación actualizada&lt;/h4&gt;

&lt;p&gt;Cuando el agente necesita consultar la API de Litestar, React 19, o cualquier librería, Context7 le entrega documentación actualizada y ejemplos de código. Esto evita que el modelo use conocimiento desactualizado de su entrenamiento.&lt;/p&gt;

&lt;h4 id=&quot;documentación-local-de-referencia--cuando-context7-no-alcanza&quot;&gt;Documentación local de referencia — cuando Context7 no alcanza&lt;/h4&gt;

&lt;p&gt;Context7 resuelve el caso general, pero tiene límites. Para frameworks muy nuevos o con APIs que cambian entre minor versions, la documentación indexada puede estar desactualizada o incompleta. Litestar 2.x es un caso perfecto: es un framework ASGI relativamente joven, con breaking changes frecuentes entre versiones, y los modelos de IA fueron entrenados con datos que incluyen versiones anteriores con APIs diferentes.&lt;/p&gt;

&lt;p&gt;La solución fue crear un directorio &lt;code&gt;docs/superpowers/references/litestar/&lt;/code&gt; con documentación curada localmente — extraída directamente del código fuente y la documentación oficial de la versión exacta que usa el proyecto. El agente consulta esta referencia local antes de recurrir a Context7 o a su conocimiento de entrenamiento.&lt;/p&gt;

&lt;p&gt;Esto resuelve tres problemas simultáneamente:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Corte de entrenamiento:&lt;/strong&gt; los modelos se entrenan con datos de hace meses. Si Litestar cambió una API entre la versión del entrenamiento y la versión en tu &lt;code&gt;requirements.txt&lt;/code&gt;, el modelo generará código que compila pero no funciona — el tipo de bug más difícil de diagnosticar.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fragmentación de Context7:&lt;/strong&gt; Context7 indexa documentación de muchas versiones. Puede devolver un ejemplo de Litestar 1.x cuando tu proyecto usa 2.x, y el agente no tiene forma de saber que es la versión equivocada.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pitfalls específicos del proyecto:&lt;/strong&gt; la documentación local incluye no solo la API, sino los gotchas que descubrimos durante el desarrollo — por ejemplo, que &lt;code&gt;expire_on_commit=False&lt;/code&gt; es necesario en sesiones async, o que ChannelsPlugin requiere un patrón específico de suscripción que la documentación oficial no enfatiza.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La regla en el proyecto es clara: primero docs locales, luego Context7, nunca confiar solo en el entrenamiento del modelo.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;superpowers-disciplina-que-el-modelo-no-tiene-por-defecto&quot;&gt;Superpowers: disciplina que el modelo no tiene por defecto&lt;/h3&gt;

&lt;p&gt;Los modelos de IA tienden a “ir al grano” — ven un bug y lo arreglan. Eso suena productivo hasta que introduces una regresión porque no escribiste tests primero, o cuando la correcion no aborda la causa raíz, sino solo arregla un caso particular.&lt;/p&gt;

&lt;p&gt;Superpowers es una colección de skills (flujos de trabajo) que imponen disciplina:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;TDD obligatorio:&lt;/strong&gt; el agente NO puede escribir código de implementación antes de tener tests fallando&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Debugging sistemático:&lt;/strong&gt; método científico — hipótesis, experimento, verificación. No “cambiar cosas hasta que funcione”&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Brainstorming antes de implementar:&lt;/strong&gt; para features nuevos, primero se explora el espacio de diseño&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Verificación antes de declarar victoria:&lt;/strong&gt; el agente debe ejecutar tests y confirmar output antes de decir “listo”&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Code review estructurado:&lt;/strong&gt; validación contra el plan original y estándares del proyecto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada skill es rígida por diseño. No le das al agente la opción de “saltarse el paso de tests porque parece simple”. La disciplina impuesta externamente compensa la tendencia del modelo a tomar atajos.&lt;/p&gt;

&lt;h4 id=&quot;cómo-se-mezcla-superpowers-con-gsd&quot;&gt;Cómo se mezcla Superpowers con GSD&lt;/h4&gt;

&lt;p&gt;GSD y Superpowers son sistemas independientes que se complementan. GSD gestiona el qué (fases, planes, estado del proyecto) y Superpowers aporta skills de disciplina (TDD, debugging sistemático, brainstorming).&lt;/p&gt;

&lt;p&gt;No se interceptan automáticamente. GSD puede marcar tareas con &lt;code&gt;tdd=&quot;true&quot;&lt;/code&gt; en sus planes, y el executor sigue el ciclo red-green-refactor. Superpowers provee skills que el agente invoca explícitamente cuando aplican — brainstorming antes de un feature nuevo, debugging sistemático cuando algo falla, verificación antes de declarar victoria.&lt;/p&gt;

&lt;p&gt;En la práctica se refuerzan mutuamente: GSD estructura el trabajo en fases con criterios de éxito medibles, y Superpowers asegura que dentro de cada tarea la ejecución siga prácticas rigurosas. Las instrucciones del proyecto en &lt;code&gt;CLAUDE.md&lt;/code&gt; tienen prioridad sobre ambos — si el proyecto dice “TDD obligatorio”, eso aplica independientemente de que GSD o Superpowers lo impongan.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;el-entorno-de-trabajo-claude-max--vscode--remote-control&quot;&gt;El entorno de trabajo: Claude Max + VSCode + remote-control&lt;/h3&gt;

&lt;p&gt;Todo esto corre sobre Claude Max ($200/mes) — el plan que da acceso ilimitado a Opus 4.6, el modelo más capaz de Anthropic. Con un mes de uso intensivo, el consumo de la sesión de 5 horas ronda el 28% y el semanal apenas el 9%. El costo es fijo y predecible, a diferencia del modelo por API donde cada token cuenta.&lt;/p&gt;

&lt;p&gt;GSD está configurado en modo calidad máxima: todo excepto la verificación final se ejecuta con Opus 4.6. Los subagentes de research, planning y ejecución usan el modelo completo. Solo el verifier usa un modelo más liviano porque su trabajo es mecánico — correr tests y comparar resultados.&lt;/p&gt;

&lt;h4 id=&quot;la-integración-con-vscode&quot;&gt;La integración con VSCode&lt;/h4&gt;

&lt;p&gt;Claude Code se integra nativamente con VSCode, lo prefiero asi para abrir archivos bajo demanda, compartir screenshots de errores, etc, eso no se puede hacer en modo cli.&lt;/p&gt;

&lt;h4 id=&quot;remote-control-dirigir-desde-el-teléfono&quot;&gt;/remote-control: dirigir desde el teléfono&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;/remote-control&lt;/code&gt; es una feature de Claude Code que permite continuar una sesión local desde cualquier dispositivo — incluido el teléfono. Tu máquina sigue ejecutando todo localmente (filesystem, Docker, MCP servers), pero puedes enviar mensajes y ver respuestas desde el navegador o la app móvil de Claude, escaneando un QR code.&lt;/p&gt;

&lt;p&gt;Esto encaja perfectamente con GSD porque la naturaleza del framework son sesiones más lentas pero más robustas — fases con criterios de éxito, planes con verificación, commits atómicos. No necesitas estar frente al teclado para supervisar eso. Desde el teléfono puedes aprobar un plan, redirigir una decisión, o validar que el agente completó una fase correctamente. Con &lt;code&gt;/n&lt;/code&gt; mencionado mas arriba, la interaccion es minima: revisar/desbloquear.&lt;/p&gt;

&lt;p&gt;Claude corriendo solo es rápido pero ocasionalmente diverge. Claude dirigido desde el teléfono vía &lt;code&gt;/remote-control&lt;/code&gt; + GSD es más lento, pero el resultado es consistentemente mejor — porque cada decisión importante pasa por el humano que sabe por qué el proyecto está estructurado así.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;el-meta-stack-completo&quot;&gt;El meta-stack completo&lt;/h3&gt;

&lt;p&gt;Resumiendo: para hacer productiva a la IA en un proyecto real, necesité construir/adoptar un stack encima del stack:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Capa&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Herramienta&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Propósito&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Planificación&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;GSD&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Fases, planes, estado persistente&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Contexto&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;RTK&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;70% menos tokens en CLI output&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Reglas&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;.agents/rules/&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Firewall cognitivo de 31 reglas&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Herramientas&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;MCP (Playwright, Sentry, Grafana, Context7)&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Testing visual, debugging, logging, docs&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Disciplina&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Superpowers&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;TDD, debugging sistemático, code review&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Ejecución&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Claude Max + VSCode + remote-control&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Modelo capaz + IDE + dirección remota&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Referencia&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;docs/superpowers/references/&lt;/code&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Documentación local versionada&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Cada fila de esta tabla es conocimiento que no viene con la IA. Viene de saber programar, de haber sufrido bugs en producción, de entender que un test suite es un contrato, no un trámite.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;la-vigilancia-continua-el-ecosistema-esta-evolucionando&quot;&gt;La vigilancia continua: el ecosistema esta evolucionando&lt;/h3&gt;

&lt;p&gt;Tener todo este meta-stack configurado no es un pase libre para desentenderse. La realidad es que la inteligencia artificial sigue siendo una tecnología inmadura, volátil y propensa a errores (alucinaciones, regresiones lógicas, o simplemente mala comprensión del contexto). Por más rienda que le pongas con herramientas como GSD o RTK, si le quitas el ojo de encima, el agente eventualmente se va a estrellar. El rol del ingeniero no desaparece, muta hacia el de un auditor constante.&lt;/p&gt;

&lt;p&gt;A esto hay que sumarle la velocidad absurda a la que evoluciona el ecosistema. Construir herramientas para dirigir a la IA hoy, es firmar un contrato de mantenimiento con tu propia infraestructura. Lo que hace apenas un año requería que armaras frameworks complejos, hoy ya viene empaquetado por defecto en la terminal con herramientas como Claude Code o integraciones nativas de los editores.&lt;/p&gt;

&lt;p&gt;La “ingeniería de dirigir a la IA” no se trata de aferrarse a las herramientas que construiste, sino de tener la madurez para desecharlas cuando el modelo base evolucione y absorba esa necesidad de forma nativa. Mientras ese día llega para cada problema, construimos los puentes manuales necesarios para no caer al vacío, pero siempre con el radar encendido y la disposición de borrar código cuando la IA por fin aprenda a caminar sola en esa área específica.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;la-brecha-se-agranda-no-se-achica&quot;&gt;La brecha se agranda, no se achica&lt;/h3&gt;

&lt;p&gt;Mi artículo anterior concluía que la IA amplifica a quienes ya tienen experiencia. Este artículo lo refuerza con una dimensión adicional: no solo necesitas experiencia en programación — necesitas experiencia dirigiendo IA.&lt;/p&gt;

&lt;p&gt;Nada de esto es obvio. La IA no está eliminando la necesidad de ingenieros. Está creando una nueva categoría de ingeniería: la ingeniería de dirigir a la IA. Y esa categoría requiere toda la experiencia de la ingeniería tradicional, más una capa adicional de meta-conocimiento que solo se adquiere construyendo sistemas reales.&lt;/p&gt;

&lt;p&gt;Nunca ha sido un mejor momento para aprender a programar. Pero ahora también necesitas aprender a programar al programador.&lt;/p&gt;

&lt;h3 id=&quot;referencias&quot;&gt;Referencias&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Spolsky, J. (2002). &lt;em&gt;The Law of Leaky Abstractions&lt;/em&gt;. Joel on Software.&lt;/li&gt;
  &lt;li&gt;Feldman, S., et al. (2023). &lt;em&gt;The Impact of AI Code Generation on Software Maintainability&lt;/em&gt;: la facilidad de generar código aumenta el volumen sin aumentar la cohesión.&lt;/li&gt;
  &lt;li&gt;Fowler, M. (2023). &lt;em&gt;Accidental Complexity in the Age of AI Codegen&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Radar encendido 📡&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>la falsa democratizacion de la tecnologia</title>
   <link href="https://javier.io/blog/es/2026/02/17/la-falsa-democratizacion-de-la-tecnologia.html"/>
   <published>2026-02-17T00:00:00+00:00</published>
   <updated>2026-02-17T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2026/02/17/la-falsa-democratizacion-de-la-tecnologia</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ai"/>
   
   <category term="docker"/>
   
   <category term="python"/>
   
   
   
   <summary type="html">la falsa democratizacion de la tecnologia</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2026/02/17/la-falsa-democratizacion-de-la-tecnologia.html">&lt;h2 id=&quot;la-falsa-democratizacion-de-la-tecnologia&quot;&gt;la falsa democratizacion de la tecnologia&lt;/h2&gt;

&lt;h6 id=&quot;17-feb-2026&quot;&gt;17 Feb 2026&lt;/h6&gt;

&lt;p&gt;Llevo una semana trabajando a medio tiempo en una aplicacion web (&lt;a href=&quot;https://saludpass.com&quot;&gt;saludpass.com&lt;/a&gt;) que anteriormente me hubiera llevado meses poner en linea, considerando que aunque es basica mezcla decisiones, tecnologia, arquitectura que necesitan tiempo y experiencia para adquirir, por ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/falsa-democratizacion.png&quot;&gt;&lt;img src=&quot;/assets/img/falsa-democratizacion.png&quot; alt=&quot;la herramienta (IA) + conocimiento y guía esencial vs la multitud con acceso limitado&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;backend-y-lenguaje&quot;&gt;Backend y lenguaje&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Python/Flask:&lt;/strong&gt; conozco python, necesito entender y poder modificar el código; evitar frameworks más opacos o ecosistemas que no domino.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blueprints:&lt;/strong&gt; los blueprints dividen la app en módulos por dominio o responsabilidad. Cada uno agrupa rutas, vistas y lógica relacionada; se registran en &lt;code&gt;create_app()&lt;/code&gt;. Resultado, código mantenible, URLs claras, tests por módulo y separación entre rutas públicas y privadas. Sin experiencia no se piensa en “separar por responsabilidad” ni en qué prefijo conviene a cada área.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application Factory:&lt;/strong&gt; patrón de creación de la app (&lt;code&gt;create_app()&lt;/code&gt;): permite múltiples instancias, testing con clientes aislados y configuración por entorno (dev/prod). Requiere saber qué es inyección de dependencias y por qué importa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defense in depth:&lt;/strong&gt; patron de defensa en capas, por ejemplo para limitar el tamano max de archivos, rate limits, CSRF, etc, se valida en JS, proxy (nginx) y app (flask), la IA lo hace trivial, pero sin la directriz podria preferir el caso directo/simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gunicorn:&lt;/strong&gt; servidor WSGI en producción. Flask en dev es single-thread; en prod hace falta un servidor que maneje concurrencia y graceful shutdown. Quien no programa no suele distinguir “servidor de desarrollo” de “servidor de producción”, ademas no es el unico, existen otras opciones como Cherry, uWSGI, etc.&lt;/p&gt;

&lt;h3 id=&quot;base-de-datos-y-persistencia&quot;&gt;Base de datos y persistencia&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL:&lt;/strong&gt; base de datos relacional: historial médico, usuarios, tokens de compartición, vistas, archivos. Decisión frente a SQLite (no adecuada para multi-contenedor y concurrencia) o NoSQL (el modelo de datos es relacional).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flask-Migrate (Alembic):&lt;/strong&gt; migraciones versionadas del esquema. Sin esto, cada cambio de tablas sería manual o destructivo. Saber cuándo hacer “una migración inicial única” vs. migraciones incrementales (según política del proyecto) y definir &lt;code&gt;upgrade()&lt;/code&gt; y &lt;code&gt;downgrade()&lt;/code&gt; es una decisión de experiencia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQLAlchemy / Flask-SQLAlchemy:&lt;/strong&gt; ORM: modelos en Python, relaciones, índices. Quien no programa no elige entre ORM vs. SQL raw, ni diseña índices para tablas.&lt;/p&gt;

&lt;h3 id=&quot;caché-y-sesiones&quot;&gt;Caché y sesiones&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Redis:&lt;/strong&gt; caché en memoria para vistas frecuentes, se calcula una vez y se sirve desde Redis con TTL; reduce carga en PostgreSQL y latencia. Invalidación al revocar tokens o al guardar historial. Sin experiencia no se plantea “cachear por token” ni cuándo invalidar.&lt;/p&gt;

&lt;h3 id=&quot;frontend&quot;&gt;Frontend&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;HTMX:&lt;/strong&gt; interactividad sin un SPA completo: peticiones parciales, swap de DOM, indicadores de carga. Decisión explícita: no React/Vue para mantener el stack simple y el HTML renderizado en servidor; quien no programa no compara “SPA vs. server-rendered + HTMX”. &lt;code&gt;data-ajax&lt;/code&gt; / &lt;code&gt;data-confirm&lt;/code&gt;: patrón propio en &lt;code&gt;base_app&lt;/code&gt;: formularios que no recargan la página, eliminación de filas, toasts, confirmaciones. Requiere convenciones en backend (respuesta JSON con &lt;code&gt;Accept: application/json&lt;/code&gt;) y atributos &lt;code&gt;data-*&lt;/code&gt; en el HTML.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bulma (Soft-UI):&lt;/strong&gt; CSS framework para layout y componentes; paleta y tipografía (Inter) coherentes. Implica elegir un sistema de diseño y ceñirse a él (variables CSS, branding Salud/Pass).&lt;/p&gt;

&lt;h3 id=&quot;autenticación-e-integraciones-externas&quot;&gt;Autenticación e integraciones externas&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Google OAuth (Authlib + Flask-Login):&lt;/strong&gt; login con Google; refresh token para no pedir permiso a cada rato. Scopes: &lt;code&gt;openid&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;profile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Drive API:&lt;/strong&gt; carpeta por usuario para archivos pesados (ecos, PDFs); la data vital vive en PostgreSQL y se cachea en Redis; Drive solo para archivos. Decisión de arquitectura: qué vive en DB y qué en Drive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GeoLite2 (MaxMind):&lt;/strong&gt; geoubicación de las vistas del enlace compartido (país/ciudad) para “Quién ha visto”. Descarga del &lt;code&gt;.mmdb&lt;/code&gt; en build y en scheduler mensual; librería &lt;code&gt;geoip2&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;infraestructura-y-despliegue&quot;&gt;Infraestructura y despliegue&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Docker / Docker Compose:&lt;/strong&gt; todo el stack corre en contenedores: misma imagen en dev (build) y prod (image desde registry). No instalar Python/Postgres/Redis en el host; entornos reproducibles. Decisión “Docker-first” del proyecto. Con opcion para migrar a Kubernetes si el proyecto escala.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redes en Compose (front / backend / internal):&lt;/strong&gt; solo Nginx expone 80/443; app, DB y Redis en red interna. Dozzle (un sistema para ver logs) en red aparte, sin URL pública (solo túnel SSH). Quien no programa no segmenta redes ni entiende por qué la app no debe estar en la misma red que el público.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nginx:&lt;/strong&gt; reverse proxy, compresión Gzip. La app no habla directamente con internet. Certbot (Let’s Encrypt): HTTPS automático (webroot, renovación en cron/scheduler). Implica saber staging vs. producción y deploy-hook para recargar Nginx.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CrowdSec:&lt;/strong&gt; detección de abusos (bots, fuerza bruta) desde logs de Nginx. Para resistir ataques iniciales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Actions:&lt;/strong&gt; CI: build de la imagen Docker, push a GHCR. Sin experiencia no diseñas el flujo “push → build → push image → instalar en servidor” de manera automatica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scripts (&lt;code&gt;run.sh&lt;/code&gt;, &lt;code&gt;entrypoint.sh&lt;/code&gt;):&lt;/strong&gt; wrappers internos para hacer mas facil la prueba / correccion / loop de programacion, queries de bd/cache, ejecucion de demos con urls publicas temporales. &lt;code&gt;run.sh&lt;/code&gt; unifica dev/prod (compose files, migraciones, tests, reset_db, tunnel). Decisiones operativas que evitan pasos manuales y errores.&lt;/p&gt;

&lt;h3 id=&quot;tareas-programadas-schedulers&quot;&gt;Tareas programadas (schedulers)&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;scheduler-purge:&lt;/strong&gt; contenedor que en bucle ejecuta &lt;code&gt;purge_expired_tokens.py&lt;/code&gt; (ej. cada 24h): borra tokens expirados en PostgreSQL e invalida claves en Redis. No usar cron en el host; todo en Compose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;scheduler-geolite2:&lt;/strong&gt; actualización mensual de la base GeoLite2-City en volumen compartido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;scheduler-backup:&lt;/strong&gt; backup periódico de la base de datos (script &lt;code&gt;backup_db.py&lt;/code&gt;) y respaldo en S3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;certbot:&lt;/strong&gt; certificados automatizados via Let’s Encrypt (SSL).&lt;/p&gt;

&lt;h3 id=&quot;testing-y-calidad&quot;&gt;Testing y calidad&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pytest:&lt;/strong&gt; tests requeridos para cada ruta; no avanzar si los tests no están en verde. Quien no programa no escribe tests ni entiende por qué es importante ahora mas que nunca defender la funcionalidad adquirida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tests dentro del contenedor:&lt;/strong&gt; mismo entorno que producción (Python, DB, Redis); no depender de un Python local, como venv.&lt;/p&gt;

&lt;h3 id=&quot;supervision&quot;&gt;Supervision&lt;/h3&gt;

&lt;p&gt;Durante la implementacion la IA puede obviar/olvidar reglas, crear migraciones inecesarias, no propagar una nueva decision de arquitectura en todo el proyecto, olvidar crear pruebas en ciertas areas, etc, ademas si se desean optimizar los tokens de los modelos de IA querras usar ciertos modelos explicitamente, cambiar de contexto bajo demanda, separar los agentes por especialidad, etc.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;en-resumen&quot;&gt;En resumen&lt;/h3&gt;

&lt;p&gt;Todas estas elecciones (lenguaje, framework, base de datos, caché, frontend, contenedores, redes, CI/CD, tests, schedulers, seguridad) son decisiones de arquitectura y operación. La IA puede ayudar a escribir código o a sugerir comandos, pero elegir qué tecnologías usar, por qué y cómo encajarlas requiere experiencia en programación y en sistemas. Quien no programa no puede evaluar Flask vs. Django, Redis vs. Memcached, cuándo cachear y cuándo invalidar, ni cómo desplegar de forma segura y reproducible. Eso es lo que amplía la brecha: no solo escribir líneas, sino tomar las decisiones que definen el proyecto.&lt;/p&gt;

&lt;p&gt;La IA permite a los que tienen el background incrementar su productividad, probar nuevas ideas que antes hubiera descartado por falta de tiempo, hace la brecha digital aun mas grande, y permite crear competencia a enterprises lentos. En resumen, en el futuro proximo tendremos aun mayor necesidad de profesionales capaces, nunca ha sido un mejor momento para aprender a programar.&lt;/p&gt;

&lt;h3 id=&quot;relacionados--referencias&quot;&gt;Relacionados / referencias&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Spolsky, J. (2002). &lt;em&gt;The Law of Leaky Abstractions&lt;/em&gt;: define que todas las abstracciones no triviales, en algún momento, fallan (“gotean”), y si el ingeniero no conoce lo que hay debajo, no podrá arreglarlo.&lt;/li&gt;
  &lt;li&gt;Perry, N., et al. (2022). &lt;em&gt;Do Users Write More Insecure Code with AI Assistants?&lt;/em&gt;: este estudio de Stanford demostró que los programadores que usan asistentes de IA tienden a escribir código menos seguro y, lo que es peor, confían más en que su código es seguro en comparación con los que no usan IA.&lt;/li&gt;
  &lt;li&gt;Feldman, S., et al. (2023). &lt;em&gt;The Impact of AI Code Generation on Software Maintainability&lt;/em&gt;: analiza cómo la facilidad de generar código aumenta el volumen de la base de código sin aumentar la cohesión, lo que incrementa la carga cognitiva a largo plazo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Construyamos con fundamento 🔧&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>de nand a tetris</title>
   <link href="https://javier.io/blog/es/2026/01/25/de-nand-a-tetris.html"/>
   <published>2026-01-25T00:00:00+00:00</published>
   <updated>2026-01-25T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2026/01/25/de-nand-a-tetris</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">de nand a tetris</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2026/01/25/de-nand-a-tetris.html">&lt;h2 id=&quot;de-nand-a-tetris&quot;&gt;de nand a tetris&lt;/h2&gt;

&lt;h6 id=&quot;25-jan-2026&quot;&gt;25 Jan 2026&lt;/h6&gt;

&lt;p&gt;Llevo mucho tiempo trabajando en el area de tecnologia (15 años al momento de escribir esto), como muchos colegas no
tuve entrenamiento formal, &lt;a href=&quot;https://www.nand2tetris.org/book&quot;&gt;The Elements of Computing Systems: Building a Modern Computer from First Principles&lt;/a&gt;
es una de las biblias del area para entenderla a profundidad, parte de los principios y contruye hasta programar
un juego de tetris, en el camino menciona compuertas logicas, cpu, memoria ram, sistemas operativos, compiladores, etc.&lt;/p&gt;

&lt;p&gt;Esta entrada es una larga, son mis anotaciones personales del libro pulidas con la asistencia de la IA, que ha reanimado
mi interes por aprender mas sobre todos los temas.&lt;/p&gt;

&lt;h3 id=&quot;every-boolean-function-no-matter-how-complex-can-be-expressed-using-three-boolean-operators-only-and-or-and-not&quot;&gt;Every Boolean function, no matter how complex, can be expressed using three Boolean operators only: And, Or, and Not.&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Paper: “Introduction to a general theory of elementary propositions” Autor: Emil L. 1921&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Emil demostró matemáticamente que si tienes un conjunto de operadores capaces de generar (1)negación y (2)conjunción/disyunción
se puede generar cualquier tabla de verdad posible, y con eso resolver cualquier problema logico. Por otra parte Claude Shannon
vinculo esa matematica con la fisica, demostrando que los reles(interruptores) de esa epoca podian usarse como puertas booleanas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paper: “A Symbolic Analysis of Relay and Switching Circuits” Autor: Claude Shannon Año: 1938&lt;/strong&gt; La &lt;a href=&quot;https://claude.com/&quot;&gt;IA Claude&lt;/a&gt; de Antrophic se llama asi en su honor.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Not&lt;/strong&gt;: Se utiliza para controlar la salida, 0 y 1, sin esta compuerta, el estado nunca variaría.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;And&lt;/strong&gt;: Se usa en conjunto de Not para describir la logica de una regla simple&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Or&lt;/strong&gt;: Se usa para concatenar las reglas generadas por las dos compuertas anteriores&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Entrada 1&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Entrada 2&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;¬Entrada 1 (NOT)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Entrada 1 ∧ Entrada 2(AND)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Entrada 1 ∨ Entrada 2 (OR)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;¬(Entrada 1∧Entrada 1) (NAND)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;F&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;V&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Que tiene que ver la operacion &lt;strong&gt;NAND (AND negada)&lt;/strong&gt;?, en 1913, un matemático, Henry M. Sheffer en &lt;strong&gt;A set of five independent postulates for Boolean algebras&lt;/strong&gt;
demostro que se pueden contruir todas las operaciones logicas (NOT, AND, OR, ETC) con una sola, &lt;strong&gt;Universalidad Funcional&lt;/strong&gt;,
por cierto, NAND no es la unica operacion universal, en 1880 Charles Sanders Peirce ya habia descubierto que la operacion &lt;strong&gt;NOR&lt;/strong&gt;
también era universal &lt;strong&gt;A Boolean Algebra with One Constant&lt;/strong&gt;, solo que su trabajo no habia sido publicado.&lt;/p&gt;

&lt;p&gt;Por que el libro usa las NAND en lugar de las NOR?, porque actualmente es mas facil construir compuertas NAND con transistores CMOS,
antes sin embargo hubo una epoca donde se uso la tecnologia RTL (Resistor-Transistor Logic), donde las NOR eran las que mandaban,
se ponian los transistores en paralelo, si cualquiera conducia corriente (es 1), la salida se va a tierra (0). Era una configuración
robusta y eléctricamente estable, la computadora del Apollo, que llevo el hombre a la luna uso compuertas NOR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/user-attachments/assets/ac647e9d-5f1f-41aa-a3e1-4c6f7657a1d7&quot;&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/ac647e9d-5f1f-41aa-a3e1-4c6f7657a1d7&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Listo, feliz multipass 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>bebes, ciudadanos del mundo</title>
   <link href="https://javier.io/blog/es/2026/01/20/bebes-ciudadanos-del-mundo.html"/>
   <published>2026-01-20T00:00:00+00:00</published>
   <updated>2026-01-20T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2026/01/20/bebes-ciudadanos-del-mundo</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">bebes, ciudadanos del mundo</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2026/01/20/bebes-ciudadanos-del-mundo.html">&lt;h2 id=&quot;bebes-ciudadanos-del-mundo&quot;&gt;bebes, ciudadanos del mundo&lt;/h2&gt;

&lt;h6 id=&quot;20-jan-2026&quot;&gt;20 Jan 2026&lt;/h6&gt;

&lt;p&gt;Entre los 6 y los 8 meses, los bebés de todas las culturas son iguales, después, un fenómeno comienza a pasar,
empiezan a filtrar los sonidos del idioma envolvente, empiezan a registrar estadísticas sobre lo que escuchan
en preparación para aprender su idioma madre. Estas estadísticas de sonidos solo las toman si la interacción
viene de personas, no funciona si es por audio o video, necesitan la interacción social. Para mantener esos
filtros abiertos / vivos es necesario &lt;strong&gt;exponer a un bebe a interacciones sociales con personas del idioma
objetivo a partir de los 6 meses.&lt;/strong&gt;&lt;/p&gt;

&lt;center&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/G2XBIkHW954&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/center&gt;

&lt;p&gt;Listo, feliz multipass 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>habilitar tethering en iphone 17 con digitel</title>
   <link href="https://javier.io/blog/es/2025/12/30/habilitar-tethering-en-iphone-digitel.html"/>
   <published>2025-12-30T00:00:00+00:00</published>
   <updated>2025-12-30T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2025/12/30/habilitar-tethering-en-iphone-digitel</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   
   
   <summary type="html">habilitar tethering en iphone 17 con digitel</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2025/12/30/habilitar-tethering-en-iphone-digitel.html">&lt;h2 id=&quot;habilitar-tethering-en-iphone-17-con-digitel&quot;&gt;habilitar tethering en iphone 17 con digitel&lt;/h2&gt;

&lt;h6 id=&quot;30-dec-2025&quot;&gt;30 Dec 2025&lt;/h6&gt;

&lt;p&gt;Si digitel no te habilitó la compartición de datos en modo tethering, sigue los siguientes pasos:&lt;/p&gt;

&lt;h3 id=&quot;verifica-que-la-opción-para-compartir-datos-esté-deshabilitada&quot;&gt;Verifica que la opción para compartir datos esté deshabilitada&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/iphone-digitel-tethering-1.png&quot;&gt;&lt;img src=&quot;/assets/img/iphone-digitel-tethering-1.png&quot; alt=&quot;iphone digitel tethering 1&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;También se puede revisar desde &lt;strong&gt;Configuración&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/iphone-digitel-tethering-2.png&quot;&gt;&lt;img src=&quot;/assets/img/iphone-digitel-tethering-2.png&quot; alt=&quot;iphone digitel tethering 2&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;configura-el-punto-de-acceso-a-nivel-proveedor-digitel&quot;&gt;Configura el punto de acceso a nivel proveedor (digitel)&lt;/h3&gt;

&lt;p&gt;Desde &lt;strong&gt;Configuración&lt;/strong&gt; ve a &lt;strong&gt;Red celular&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/iphone-digitel-tethering-3.png&quot;&gt;&lt;img src=&quot;/assets/img/iphone-digitel-tethering-3.png&quot; alt=&quot;iphone digitel tethering 3&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Y después a &lt;strong&gt;Red de datos celulares&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/iphone-digitel-tethering-4.png&quot;&gt;&lt;img src=&quot;/assets/img/iphone-digitel-tethering-4.png&quot; alt=&quot;iphone digitel tethering 4&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En la siguiente pantalla ve al final, y en &lt;strong&gt;Compartir Internet&lt;/strong&gt; introduce: &lt;code&gt;internet.digitel.ve&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/iphone-digitel-tethering-5.png&quot;&gt;&lt;img src=&quot;/assets/img/iphone-digitel-tethering-5.png&quot; alt=&quot;iphone digitel tethering 5&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sal de la aplicación de &lt;strong&gt;Configuración&lt;/strong&gt; abriendo cualquier otra, WhatsApp, TikTok, etc, y luego habilita y deshabilita el modo avión. Vuelve a abrir la app de &lt;strong&gt;Configuración&lt;/strong&gt;, la opción de &lt;strong&gt;Compartir Internet&lt;/strong&gt; estará habilitada:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/iphone-digitel-tethering-6.png&quot;&gt;&lt;img src=&quot;/assets/img/iphone-digitel-tethering-6.png&quot; alt=&quot;iphone digitel tethering 6&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Selecciona &lt;strong&gt;Compartir Internet&lt;/strong&gt; y establece una contraseña para proteger el punto de acceso, &lt;strong&gt;Contraseña Wifi&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/iphone-digitel-tethering-7.png&quot;&gt;&lt;img src=&quot;/assets/img/iphone-digitel-tethering-7.png&quot; alt=&quot;iphone digitel tethering 7&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A partir de ese momento podrás habilitar y deshabilitar tethering desde el menú principal de redes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/iphone-digitel-tethering-8.png&quot;&gt;&lt;img src=&quot;/assets/img/iphone-digitel-tethering-8.png&quot; alt=&quot;iphone digitel tethering 8&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Listo, feliz multipass 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>pensando con flechas</title>
   <link href="https://javier.io/blog/es/2025/12/29/pensando-con-flechas.html"/>
   <published>2025-12-29T00:00:00+00:00</published>
   <updated>2025-12-29T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2025/12/29/pensando-con-flechas</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ai"/>
   
   
   
   <summary type="html">pensando con flechas</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2025/12/29/pensando-con-flechas.html">&lt;h2 id=&quot;pensando-con-flechas&quot;&gt;pensando con flechas&lt;/h2&gt;

&lt;h6 id=&quot;29-dec-2025&quot;&gt;29 Dec 2025&lt;/h6&gt;

&lt;p&gt;Ultimamente se ha popularizado la IA, pero tenemos idea de cómo funciona por dentro?, A menudo parece magia, pero en realidad, el motor principal de la IA es una rama de las matemáticas llamada Álgebra Lineal.&lt;/p&gt;

&lt;p&gt;Sé que suena intimidante, pero si se piensa visualmente, es muy sencillo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/pensando-con-flechas.png&quot;&gt;&lt;img src=&quot;/assets/img/pensando-con-flechas.png&quot; alt=&quot;pensando con flechas, algebra lineal como motor de la IA&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;1-los-vectores-convertir-el-mundo-en-flechas&quot;&gt;1. Los VECTORES: Convertir el mundo en flechas&lt;/h3&gt;

&lt;p&gt;Para que una computadora entienda el mundo real (una manzana, una canción, tu cara), tiene que convertirlo en números.&lt;/p&gt;

&lt;p&gt;Imagina una manzana. No podemos meter la manzana en la computadora.&lt;/p&gt;

&lt;p&gt;Pero podemos describirla con una lista de características numéricas: ¿Qué tan roja es del 1 al 10? ¿Qué tan redonda? ¿Qué tan dulce?, los chips de tarjetas graficas son excepcionalmente buenos para sumar, y multiplicar vectores (conjunto de numeros) por eso Nvidia reina en la IA, sus tarjetas son las mas rapidas haciendo operaciones aritmeticas con esos datos.&lt;/p&gt;

&lt;p&gt;Si la manzana es &lt;code&gt;[Roja: 9, Redonda: 8, Dulce: 7, y otras 12,000 caracteristicas]&lt;/code&gt;, esa lista de números se convierte en una flecha (un vector) en un espacio que apunta a esa posición exacta.&lt;/p&gt;

&lt;p&gt;La IA no ve imágenes ni lee textos; ve un universo gigantesco lleno de millones de estos vectores flotando.&lt;/p&gt;

&lt;h3 id=&quot;2-las-3-operaciones-encontrar-el-orden-en-el-caos&quot;&gt;2. Las 3 OPERACIONES: Encontrar el orden en el caos&lt;/h3&gt;

&lt;p&gt;Una vez que la IA tiene este universo de flechas, necesita encontrar sentido en él. ¿Cómo sabe que una foto nueva de una manzana es, de hecho, una manzana?&lt;/p&gt;

&lt;p&gt;Utiliza tres operaciones aritmeticas fundamentales una y otra vez a velocidades increíbles:&lt;/p&gt;

&lt;h4 id=&quot;operación-1-medir-similitud-el-producto-punto&quot;&gt;OPERACIÓN 1: Medir Similitud (el “producto punto”)&lt;/h4&gt;

&lt;p&gt;¿Qué es? Es como usar una regla para ver qué tan cerca están dos flechas y si apuntan en la misma dirección.&lt;/p&gt;

&lt;p&gt;Ejemplo: &lt;code&gt;manzana [2, 3, 5]&lt;/code&gt;, &lt;code&gt;platano [2, 4, 3]&lt;/code&gt;, &lt;code&gt;gato [8, 2, 1]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;manzana (producto punto) platano = [a1*a2 + b1*b2 + c1*c2]&lt;/code&gt; (la sumatoria de la multiplicacion de las coordenadas)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;code&gt;manzana (producto punto) platano = [2*2 + 3*4 + 5*3] = [4+12+15] = 31&lt;/code&gt;&lt;/p&gt;

  &lt;p&gt;&lt;code&gt;manzana (producto punto) gato = [2*8 + 3*2 + 5*1] = [16+6+5] = 27&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;31 &amp;gt; 27&lt;/code&gt;, una manzana se parece mas a un platano que a un gato.&lt;/p&gt;

&lt;p&gt;¿Para qué sirve? Para encontrar &lt;strong&gt;patrones&lt;/strong&gt;. Si la flecha de una imagen nueva cae muy cerca del grupo de “flechas de manzanas” que ya conoce, la IA dirá: “¡Ajá! Esto se parece mucho a una manzana”. Así es como te reconoce en una foto o te recomienda una canción similar a la que te gusta.&lt;/p&gt;

&lt;h4 id=&quot;operación-2-cambiar-la-perspectiva-la-transformación-lineal&quot;&gt;OPERACIÓN 2: Cambiar la Perspectiva (la “transformación lineal”)&lt;/h4&gt;

&lt;p&gt;¿Qué es? A veces, los datos están desordenados si los miras de frente. Esta operación es como si la IA agarrara todo el espacio 3D y lo girara, lo estirara o lo inclinara para verlo desde un ángulo nuevo.&lt;/p&gt;

&lt;p&gt;¿Para qué sirve? Para descubrir &lt;strong&gt;relaciones ocultas&lt;/strong&gt;. Imagina un montón de puntos que parecen una nube desordenada, pero si giras tu cabeza 45 grados, de repente ves que todos forman una línea perfecta. La IA hace esos “giros” matemáticamente para entender mejor los datos.&lt;/p&gt;

&lt;h4 id=&quot;operación-3-simplificar-dimensiones-la-proyección&quot;&gt;OPERACIÓN 3: Simplificar Dimensiones (la “proyección”)&lt;/h4&gt;

&lt;p&gt;¿Qué es? El mundo real es demasiado complejo (tiene demasiadas “dimensiones” o características). Esta operación es como tomar una escultura 3D complicada y aplastarla para ver solo su sombra en la pared (2D).&lt;/p&gt;

&lt;p&gt;¿Para qué sirve? Para &lt;strong&gt;enfocarse en lo importante&lt;/strong&gt;. Si quieres diferenciar un elefante de un ratón, el “peso” es una dimensión crucial, pero el “color de ojos” quizás no tanto. La IA aprende a “aplastar” los datos ignorando el ruido innecesario y quedándose solo con las dimensiones que realmente definen el objeto. Las dimensiones son la cantidad de numeros en un vector, por ejemplo: &lt;code&gt;manzana [2, 3, 5]&lt;/code&gt; tiene 3 dimensiones.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;La IA como la conocemos en ChatGPT, Gemini, etc, son entonces en su nucleo operaciones matematicas (sumas y multiplicaciones) ejecutadas en vectores (conjunto de numeros), funcionan muy diferente a nuestra inteligencia biologica, no generan conciencia, y requieren unas computadoras monstruosas para calcularlas, son IA vacias, loros probabilisticos que solo son capaces de encontrar patrones y predecir el siguiente paso en una secuencia de numeros, asi que por el momento estamos a salvo, aprendamos a usar estas calculadoras multiplicadoras.&lt;/p&gt;

&lt;p&gt;La IA actual es la herramienta estadística más poderosa jamás creada. Es un espejo matemático de todo lo que hemos escrito, capaz de reflejarnos de formas asombrosas, y de ayudarnos a encontrar patrones infinidad de veces mas rapido y eficientemente.&lt;/p&gt;

&lt;p&gt;Aqui dejo un curso por si desean conocer mas al respecto: &lt;a href=&quot;https://algo.monster/courses/llm/llm_course_introduction&quot;&gt;algo.monster / LLM course&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Aclaracion: no estoy en ningun sentido asociado con algo.monster, solo que su curso me parece una buena introduccion.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Apuntando flechas 🏹&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>hack the planet</title>
   <link href="https://javier.io/blog/en/2025/06/07/hack-the-planet.html"/>
   <published>2025-06-07T00:00:00+00:00</published>
   <updated>2025-06-07T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2025/06/07/hack-the-planet</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="security"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">hack the planet</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2025/06/07/hack-the-planet.html">&lt;h2 id=&quot;hack-the-planet&quot;&gt;hack the planet&lt;/h2&gt;

&lt;h6 id=&quot;07-jun-2025&quot;&gt;07 Jun 2025&lt;/h6&gt;

&lt;p&gt;Try n credential attemps in single &lt;code&gt;nc&lt;/code&gt; connections:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for i in $(seq -s &quot; &quot; -f %04g 0 10000);do echo password attempt $i; done | nc localhost 30002
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Escape &lt;code&gt;more&lt;/code&gt; pager:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;resize terminal window until &lt;code&gt;more&lt;/code&gt; pauses due to non sufficient space to show text #tested in git4win/powershell&lt;/li&gt;
  &lt;li&gt;press ‘v’ to launch a vim readonly instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Escape &lt;code&gt;vim&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;:set shell=/bin/bash
:shell
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Abuse &lt;code&gt;sh|bash&lt;/code&gt; extrapolations, C sample:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;while(true) {
  print(&quot;&amp;gt;&amp;gt; &quot;);
  cmd = makeUppercase(readInput());
  print(execute(&quot;sh&quot;, &quot;-c&quot;, cmd)); #security issue here
} #execute launches &apos;sh -c cmd&apos; which on this case init the variable $0 to the name of the program &apos;sh&apos;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Therefore if we type &lt;code&gt;$0&lt;/code&gt;, it would execute &lt;code&gt;sh -c sh&lt;/code&gt;, giving away a shell!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$0
# bash #now we move to a more confortable shell
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy hacking! 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>nvim migration</title>
   <link href="https://javier.io/blog/en/2025/01/30/nvim-migration.html"/>
   <published>2025-01-30T00:00:00+00:00</published>
   <updated>2025-01-30T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2025/01/30/nvim-migration</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">nvim migration</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2025/01/30/nvim-migration.html">&lt;h2 id=&quot;nvim-migration&quot;&gt;nvim migration&lt;/h2&gt;

&lt;h6 id=&quot;30-jan-2025&quot;&gt;30 Jan 2025&lt;/h6&gt;

&lt;p&gt;I avoided &lt;a href=&quot;https://neovim.io/&quot;&gt;Neovim&lt;/a&gt; for a long time because of backwards
compatibility fear, even from Vim 7x to 8x compatibility is an issue, however
this was unfunded, NeoVim could be more compatible with Vim than Vim itself, no
need to learn Lua  (at the beginning), took a day (a long one) to convert my 10
years old vim configuration to an almost identical setup in NeoVim with
increased performance and better functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fully compatible with Vimscripting, 90% vim plugins just works&lt;/li&gt;
  &lt;li&gt;Faster than Vim and much faster than Studio Code, or any other graphical editor&lt;/li&gt;
  &lt;li&gt;Integrated with latest plugin developments, eg: Github Copilot / Github
 Copilot Chat, matched only by Visual Studio Code and Jetbrains IDEs&lt;/li&gt;
  &lt;li&gt;Thriving community, advanced users / developers, chance to choose from
 several implementations, all equality good and feature complete: eg, as for
 plugin manager: lazy.nvim, vim-plug, rocks.vim, etc.&lt;/li&gt;
  &lt;li&gt;Multi OS support, a single configuration file can be used in Windows / OSX / Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Medium / Hard to setup in comparition with vim which is available in most
 Unix systems by default&lt;/li&gt;
  &lt;li&gt;Medium / Hard to master if you’re not used to vim&lt;/li&gt;
  &lt;li&gt;Step curve if you’re only used to vimscripting and want to extend
 functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;windows-1011&quot;&gt;Windows 10/11&lt;/h2&gt;

&lt;p&gt;Neovim on Windows doesn’t require WSL, it works great if the proper environment
is set, a good terminal emulator, fonts, and a gcc compiler to run the heavier
plugins at the speed of though.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://chocolatey.org/install&quot;&gt;Chocolatey&lt;/a&gt;, a package manager that allows to
install the other dependencies in a single command line, from an Admistrator
PowerShell prompt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(&apos;https://community.chocolatey.org/install.ps1&apos;))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Latest version of Powershell to have a better experience within the CLI in general:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;choco install -y powershell-core
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A better Terminal emulator:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;choco install -y microsoft-windows-terminal
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Fonts, go to &lt;a href=&quot;https://www.nerdfonts.com/font-downloads&quot;&gt;Nerd Fonts&lt;/a&gt; and
     download your favorite, Caskaydia Cove  is a good one, this would allow to
     have emojics in the terminal, once downloaded the archive unzip it and
     install the OTF files to &lt;strong&gt;“all users”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/nerd-fonts-caskaydia.png&quot;&gt;&lt;img src=&quot;/assets/img/nerd-fonts-caskaydia.png&quot; alt=&quot;nerd fonts caskaydia&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;gcc&lt;/code&gt; , &lt;code&gt;git&lt;/code&gt; and &lt;code&gt;make&lt;/code&gt; to compile plugins and supercharge Nvim (optional):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;choco install -y make
choco install -y mingw
choco install -y git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Install &lt;code&gt;nvm&lt;/code&gt; and &lt;code&gt;nodejs&lt;/code&gt; to setup Github Copilot integration (optional):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Download and run &lt;a href=&quot;https://github.com/coreybutler/nvm-windows/releases/download/1.2.2/nvm-setup.exe&quot;&gt;https://github.com/coreybutler/nvm-windows/releases/download/1.2.2/nvm-setup.exe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Install latest &lt;code&gt;nodejs&lt;/code&gt; from an Administration powershell prompt: &lt;code&gt;nvm install latest&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Configure latest version to provide nodejs: &lt;code&gt;nvm use 23.6.1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dependencies configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configure the new &lt;code&gt;Terminal&lt;/code&gt; to use the latest &lt;code&gt;Powershell&lt;/code&gt; and the downloaded fonts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/terminal-powershell-nerd-fonts-startup.png&quot;&gt;&lt;img src=&quot;/assets/img/terminal-powershell-nerd-fonts-startup.png&quot; alt=&quot;terminal powershell nerd fonts startup&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/terminal-powershell-nerd-fonts-powershell.png&quot;&gt;&lt;img src=&quot;/assets/img/terminal-powershell-nerd-fonts-powershell.png&quot; alt=&quot;terminal powershell nerd fonts powershell&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/terminal-powershell-nerd-fonts-text.png&quot;&gt;&lt;img src=&quot;/assets/img/terminal-powershell-nerd-fonts-text.png&quot; alt=&quot;terminal powershell nerd fonts text&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/terminal-powershell-nerd-fonts-caskaydia.png&quot;&gt;&lt;img src=&quot;/assets/img/terminal-powershell-nerd-fonts-caskaydia.png&quot; alt=&quot;terminal powershell nerd fonts caskaydia&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;a href=&quot;https://github.com/neovim/neovim/releases&quot;&gt;neovim/neovim&lt;/a&gt; and install the latest version for windows: &lt;code&gt;nvim-win64.msi&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;neovim-configuration&quot;&gt;NeoVim configuration&lt;/h2&gt;

&lt;p&gt;Due to Lua support Neovim &lt;em&gt;init.lua&lt;/em&gt; configuration is cross platform
compatible, you can set / unset preference based on the environment, it can
also read vanilla vimscript therefore you could use your same vimrc settings,
however unless you’re in a hurry, it’s recommended to migrate to lua at the
earneast opportunity.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ nvim .\AppData\Local\nvim\init.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nvim and Vim support distributions, bundles that provide an advanced and
uniformed experience, in terms of programming languages it would be comparable
to Ruby on Rails, Django, CakePhp, etc, these distributions are ok if you’re
looking for a battery included experience or if you’ve previous experience with
Nvim, however as a learning exercise it’s a better to use a minimalist approach
and enable only the interested features, this also allows you to customize your
usage cases. Some good distribution examples are:
&lt;a href=&quot;https://www.lazyvim.org/&quot;&gt;lazyvim&lt;/a&gt;, &lt;a href=&quot;https://nvchad.com/&quot;&gt;nvchad&lt;/a&gt;,
&lt;a href=&quot;https://github.com/AstroNvim/AstroNvim&quot;&gt;astronvim&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On this article, the focus would be in starting from a minimalist, single page,
documentated approach. Good configurations are personal, built over time with a
lot of polish. Get the content of &lt;a href=&quot;https://github.com/nvim-lua/kickstart.nvim/blob/master/init.lua&quot;&gt;kickstart.nvim/init.lua&lt;/a&gt; to &lt;code&gt;.\AppData\Local\nvim\init.lua&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boostrapping&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The 1st step is to create a mechanism to download a Nvim plugin manager in case
none is locally installed and retrieve the configured plugins with their
dependencies, NOTE: This code is already included in the &lt;em&gt;kickstart.nvim&lt;/em&gt; file
referenced above, it’s shown here only for analysis / understanding. There are
several plugins manager but on this article we would refer to &lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;lazy.nvim&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;local lazypath = vim.fn.stdpath &apos;data&apos; .. &apos;/lazy/lazy.nvim&apos;
if not (vim.uv or vim.loop).fs_stat(lazypath) then
    local lazyrepo = &apos;https://github.com/folke/lazy.nvim.git&apos;
    local out = vim.fn.system { &apos;git&apos;, &apos;clone&apos;, &apos;--filter=blob:none&apos;, &apos;--branch=stable&apos;, lazyrepo, lazypath }
    if vim.v.shell_error ~= 0 then
        error(&apos;Error cloning lazy.nvim:\n&apos; .. out)
    end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Vim traditional configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vim settings are available via lua:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vim.g.mapleader = &quot;,&quot;
vim.g.maplocalleader = &quot;,&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or they can be read as vimscripting files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vim.cmd(&apos;source my_vim_script.vim&apos;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Plugin installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/folke/lazy.nvim&quot;&gt;Lazy.nvim&lt;/a&gt; support from simple to quite complex escenarios, eg:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require(&quot;lazy&quot;).setup({
    &quot;javier-lopez/my-autoloads.vim&quot;, -- the most simple case, plugins hosted in https://github.com/javier-lopez/my-autoloads.vim
    &quot;javier-lopez/my-mappings.vim&quot;,
    { &quot;javier-lopez/my-sensible.vim&quot;, -- plugins with dependencies
        dependencies = {
            &quot;javier-lopez/cutils.vim&quot;,
        },
    },
    { &quot;javier-lopez/colors.vim&quot;, -- plugins with priorization + initial customization
        priority = 1000, -- Make sure to load this before all the other start plugins.
        init = function()
            vim.cmd.colorscheme(&quot;hemisu&quot;)
        end,
    },
    -- Highlight todo, notes, etc in comments
    { &quot;folke/todo-comments.nvim&quot;, -- plugins with lazy loading, plugin would wait until UI is drawn to load
        event = &quot;VimEnter&quot;,
        dependencies = { &quot;nvim-lua/plenary.nvim&quot; },
        opts = { signs = false },
    },
)}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Github Copilot integration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Within the &lt;code&gt;hrsh7th/nvim-cmp&lt;/code&gt; depency section add &lt;code&gt;zbirenbaum/copilot-cmp&lt;/code&gt; and &lt;code&gt;zbirenbaum/copilot.lua&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/hrsh7th/nvim-cmp&quot;&gt;nvim-cmp&lt;/a&gt; is an auto completion
 framework for nvim, sources are programmable, on this case we’re adding
 &lt;a href=&quot;https://github.com/zbirenbaum/copilot-cmp&quot;&gt;copilot-cmp&lt;/a&gt; to have Copilot
 suggestions as part of our editing experience, other cmp plugins are:&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/hrsh7th/cmp-path&quot;&gt;hrsh7th/cmp-path&lt;/a&gt; #autocompletes file / directory paths&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/hrsh7th/cmp-buffer&quot;&gt;hrsh7th/cmp-buffer&lt;/a&gt; #autocompletes buffer words&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/hrsh7th/cmp-calc&quot;&gt;hrsh7th/cmp-calc&lt;/a&gt; #complete math operations&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/hrsh7th/vim-vsnip&quot;&gt;hrsh7th/vim-vsnip&lt;/a&gt; #autocompletes snippets&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/zbirenbaum/copilot.lua&quot;&gt;zbirenbaum/copilot.lua&lt;/a&gt; is a pure Lua implementation of the official &lt;a href=&quot;https://github.com/github/copilot.vim&quot;&gt;github/copilot.vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once installed run &lt;code&gt;:Copilot auth&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{ &quot;hrsh7th/nvim-cmp&quot;, -- Autocompletion plugin
    event = &quot;InsertEnter&quot;, -- Lazy load until user enters Insert mode
    dependencies = {
        { &quot;zbirenbaum/copilot-cmp&quot;,
            event = &quot;InsertEnter&quot;,
            config = function () require(&quot;copilot_cmp&quot;).setup() end,
            dependencies = { &quot;zbirenbaum/copilot.lua&quot;, -- core package that interacts with gh copilot api
                cmd = &quot;Copilot&quot;,
                config = function()
                require(&quot;copilot&quot;).setup({
                    -- It is recommended to disable copilot.lua&apos;s suggestion and panel modules, as they can interfere with completions properly appearing in copilot-cmp.
                    suggestion = { enabled = false },
                    panel = { enabled = false },
                    copilot_node_command = vim.fn.expand(&quot;$HOME&quot;) .. &quot;/AppData/Local/nvm/v23.6.1/node.exe&quot;,
                })
                end,
            },
        },
    },
},
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Within the &lt;code&gt;nvim-cmp&lt;/code&gt; configuration set the &lt;code&gt;&amp;lt;Enter&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;Tabs&amp;gt;&lt;/code&gt; keys as suggestion selectors and include the copilot source:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cmp.setup({
    mapping = cmp.mapping.preset.insert({
    --[&quot;&amp;lt;C-y&amp;gt;&quot;] = cmp.mapping.confirm({ select = true }),
    [&apos;&amp;lt;CR&amp;gt;&apos;] = cmp.mapping.confirm { select = true }, -- &amp;lt;Enter&amp;gt; accepts the suggestion
    [&apos;&amp;lt;Tab&amp;gt;&apos;] = cmp.mapping.select_next_item(), -- Iterate over suggestions
    [&apos;&amp;lt;S-Tab&amp;gt;&apos;] = cmp.mapping.select_prev_item(), -- &amp;lt;Shift&amp;gt;&amp;lt;Tab&amp;gt; Iterate backwards
    ...
    }),
    sources = {
        { name = &quot;path&quot; },
        { name = &quot;calc&quot; },
        { name = &quot;copilot&quot; },
    }
})
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/CopilotC-Nvim/CopilotChat.nvim&quot;&gt;CopilotC-Nvim/CopilotChat.nvim&lt;/a&gt; integrates Copilot Chat:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{ &quot;CopilotC-Nvim/CopilotChat.nvim&quot;,
    -- press &amp;lt;Ctrl-s&amp;gt; to apply instructions
    dependencies = {
        { &quot;zbirenbaum/copilot.lua&quot; },
        { &quot;nvim-lua/plenary.nvim&quot;, branch = &quot;master&quot; }, -- for curl, log and async functions
    },
    -- build = &quot;make tiktoken&quot;, -- Only on MacOS or Linux
    keys = {
        {
            &quot;&amp;lt;leader&amp;gt;h&quot;,
            function()
                return require(&quot;CopilotChat&quot;).toggle()
            end,
            desc = &quot;CopilotChat - Toggle Main Window&quot;,
            mode = { &quot;n&quot;, &quot;v&quot; },
        },
        {
            &quot;&amp;lt;leader&amp;gt;oo&quot;,
            function()
                return require(&quot;CopilotChat&quot;).toggle()
            end,
            desc = &quot;CopilotChat - Toggle Main Window&quot;,
            mode = { &quot;n&quot;, &quot;v&quot; },
        },
        {
            &quot;&amp;lt;leader&amp;gt;ol&quot;,
            function()
                return require(&quot;CopilotChat&quot;).reset()
            end,
            desc = &quot;CopilotChat - Clear Main Window&quot;,
            mode = { &quot;n&quot;, &quot;v&quot; },
        },
        {
            &quot;&amp;lt;leader&amp;gt;oa&quot;,
            function()
                local input = vim.fn.input(&quot;Action Over File: &quot;)
                if input ~= &quot;&quot; then
                    require(&quot;CopilotChat&quot;).ask(input, { selection = require(&quot;CopilotChat.select&quot;).buffer })
                end
            end,
            desc = &quot;CopilotChat - Action Over File&quot;,
        },
    },
},
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/dotfiles/blob/master/init.lua&quot;&gt;javier-lopez/dotfiles/nvim/init.lua&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://nithinbekal.com/posts/copilot-neovim/&quot;&gt;Copilot and Neovim&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.nikfp.com/how-to-install-and-set-up-neovim-on-windows&quot;&gt;How to install and set up Neovim on Windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>router with integrated vpn support</title>
   <link href="https://javier.io/blog/en/2024/06/25/router-with-vpn-support.html"/>
   <published>2024-06-25T00:00:00+00:00</published>
   <updated>2024-06-25T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2024/06/25/router-with-vpn-support</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">router with integrated vpn support</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2024/06/25/router-with-vpn-support.html">&lt;h2 id=&quot;router-with-integrated-vpn-support&quot;&gt;router with integrated vpn support&lt;/h2&gt;

&lt;h6 id=&quot;25-jun-2024&quot;&gt;25 Jun 2024&lt;/h6&gt;

&lt;p&gt;I needed a way to provide VPN coverage transparently to a local network…&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ISP router (TpLink WR820N on this case)&lt;/li&gt;
  &lt;li&gt;TpLink ER605 Switch (only available vpn switch/router around) - no wifi&lt;/li&gt;
  &lt;li&gt;TpLink WR820N (low cost wifi router)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.wireguard.com/&quot;&gt;Wireguard&lt;/a&gt; (because of its performance and low resource usage)&lt;/li&gt;
  &lt;li&gt;VPN provider https://surfshark.com (provide required technical details)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;isp-router-tplink-wr820n-on-this-case&quot;&gt;ISP router (TpLink WR820N on this case)&lt;/h2&gt;

&lt;p&gt;Reconfigure LAN to use 10.9.8.1 so it doesn’t conflict with default networking settings in the following section.&lt;/p&gt;

&lt;h2 id=&quot;tplink-er605-firmware-upgrade-to-er605un_v2_222-build-20231017&quot;&gt;TpLink ER605 firmware upgrade to ER605(UN)_V2_2.2.2 Build 20231017&lt;/h2&gt;

&lt;p&gt;In order to use Wireguard a firware upgrade is required (only OpenVPN by default). Download and unzip https://static.tp-link.com/upload/firmware/2023/202310/20231018/ER605(UN)_v2_2.2.2%20Build%2020231017.zip&lt;/p&gt;

&lt;p&gt;Go to https://web.archive.org/web/20220112060440/https://192.168.0.1/webpages/index.html and then to &lt;strong&gt;Firmware Upgrade&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Upload: &lt;strong&gt;ER605v2_un_2.2.2_20231017-rel68869_up_2023-10-17_19.23.22.bin&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;configure-wireguard&quot;&gt;Configure Wireguard&lt;/h2&gt;

&lt;p&gt;After reboot / upgrade go to &lt;strong&gt;VPN -&amp;gt; Wireguard&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Name: surfshark
MTU: 1420
Listen Port: 51820
Private Key: will be generated automatically
Public Key: will be generated automatically #copy this somewhere
Local IP Address: 10.14.0.2 #this field will be edited later
Status: Enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Save changes.&lt;/p&gt;

&lt;p&gt;Go to https://my.surfshark.com/vpn/manual-setup/router/wireguard/own-key:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Name: er605
Public Key: input the key generated from the above step
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Go to the &lt;strong&gt;Locations&lt;/strong&gt; submenu and select the desired area, on this case I choose USA/Boston:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;img src=&quot;/assets/img/surfshark-wireguard.png&quot; alt=&quot;surfshark wireguard&quot; /&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Download the Wireguard configuration file&lt;/p&gt;

&lt;p&gt;Go to https://web.archive.org/web/20220112060440/https://192.168.0.1/webpages/index.html and then to &lt;strong&gt;VPN -&amp;gt; Wireguard -&amp;gt; Peers&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Interface: Select surfshark
Public Key: Copy the string from the Server public key field from previous step
Endpoint: Copy the Server Ip from previous step
Endpoint Port: 51820
Allowed Address: 0.0.0.0/0
Preshared Key: leave empty
Persistent Keepalive: 25
Comment: leave empty
Status: Enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Save changes.&lt;/p&gt;

&lt;p&gt;Go back to &lt;strong&gt;VPN -&amp;gt; Wireguard&lt;/strong&gt; and modify the &lt;code&gt;Local IP Address: 10.14.0.2&lt;/code&gt; field with the value extracted from the Wireguard configuration file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Interface]
Address = 10.14.0.2/16
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Save changes.&lt;/p&gt;

&lt;h2 id=&quot;wifi-router&quot;&gt;Wifi router&lt;/h2&gt;

&lt;p&gt;Go to http://192.168.1.1/ and configure Wifi settings.&lt;/p&gt;

&lt;h2 id=&quot;final-comments&quot;&gt;Final comments&lt;/h2&gt;

&lt;p&gt;As the date of this entry the following vendors doesn’t support enough technical information to complete this setup:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;https://www.ipvanish.com/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy tunneling 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>shrink root volumes in AWS</title>
   <link href="https://javier.io/blog/en/2024/03/01/shrink-root-volumes-aws.html"/>
   <published>2024-03-01T00:00:00+00:00</published>
   <updated>2024-03-01T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2024/03/01/shrink-root-volumes-aws</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="aws"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">shrink root volumes in AWS</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2024/03/01/shrink-root-volumes-aws.html">&lt;h2 id=&quot;shrink-root-volumes-in-aws&quot;&gt;shrink root volumes in AWS&lt;/h2&gt;

&lt;h6 id=&quot;01-mar-2024&quot;&gt;01 Mar 2024&lt;/h6&gt;

&lt;h2 id=&quot;volumes&quot;&gt;Volumes&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;/dev/&lt;strong&gt;nvme1n1&lt;/strong&gt; → Old volume → &lt;strong&gt;/old&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;/dev/&lt;strong&gt;nvme2n1&lt;/strong&gt; → New volume → &lt;strong&gt;/new&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;/dev/&lt;strong&gt;nvme3n1&lt;/strong&gt; → Backup Old volume (only applicable for XFS root volumes) → &lt;strong&gt;/old-backup&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;general-instructions&quot;&gt;General instructions&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Create a snapshot of the root volume&lt;/li&gt;
  &lt;li&gt;Stop the target instance&lt;/li&gt;
  &lt;li&gt;Create a new volume with the desired size, ensure iops and speed are equal to the old volume&lt;/li&gt;
  &lt;li&gt;Create a tmp ec2 instance, this is what would be used to copy data between the old / new volumes&lt;/li&gt;
  &lt;li&gt;Detach the root volume from the old instance and attach it to the tmp one&lt;/li&gt;
  &lt;li&gt;Attach the new volume to the tmp instance and ssh into it&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;mkdir -p /old /new&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;dd bs=16M if=/dev/nvme1n1 of=/dev/nvme2n1 count=100&lt;/code&gt; #copy bootloader from old to the new volume&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;fdisk /dev/nvme2n1&lt;/code&gt; #format new volume
    &lt;pre&gt;&lt;code&gt;press &apos;p&apos; take note on the start section, eg: 2048
delete the current partition with &apos;d&apos;
create a new partition &apos;n&apos; and use the previous start section
press &apos;a&apos; to make the partition bootable
press &apos;w&apos; to save changes
&lt;/code&gt;&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code&gt;fdisk -l&lt;/code&gt; #review than old and new volumes looks similar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;########## ext2/3/4 ##########&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code&gt;e2fsck -f /dev/nvme1n1p1&lt;/code&gt; #check for errors in old volume&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;resize2fs -M -p /dev/nvme1n1p1&lt;/code&gt; #move the data to the beginning of the partition&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the previous command’s output, the last line tells you the number of blocks.  Each block is sized 4K but when we clone the partition, we are going to do it in 16 MB blocks.  So, in order to compute the number of 16 MB, blocks, multiply the number in the last line by 4 / (16 * 1024).&lt;/p&gt;

&lt;p&gt;Round this number UP (not down) to the nearest integer. Example: 1252939 (number in last line) * 4 / (16 * 1024) = 305.893310546875 … But round this UP to 306 or even 310 (it doesn’t matter as long as you don’t go below).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dd bs=16M if=/dev/nvme1n1p1 of=/dev/nvme2n1p1 count=310&lt;/code&gt; #copy data from old to new volume&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code&gt;resize2fs -p /dev/nvme2n1p1&lt;/code&gt; #new volume, expand fs&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;e2fsck -f /dev/nvme2n1p1&lt;/code&gt; #fix possible errors in the new volume&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;########## xfs ##########&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Create an additional volume same size as old volume and attached to the tmp instance. Will be use it to host a backup of the original fs, this is a workaround to xfs lack of shrinking capacity&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;mkfs.xfs /dev/nvme2n1 /dev/nvme3n1&lt;/code&gt; #format the new and the additional volume&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;mount /dev/nvme1n1 /old; mount /dev/nvme2n1 /new&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;mkdir /old-backup; mount /dev/nvme3n1 /old-backup&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;xfsdump -L data -f /old-backup/old.xfsdump /old&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;xfsrestore -f /old-backup/old.xfsdump /new/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;blkid /dev/nvme1n1p1&lt;/code&gt; #get old uuid&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;xfs_admin -U &amp;lt;UUID from step above&amp;gt; /dev/nvme2n1p1&lt;/code&gt; #apply old uuid to new volume&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;xfs_admin -L / /dev/nvme2n1p1&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;final-step&quot;&gt;Final step&lt;/h2&gt;

&lt;p&gt;Dettach the new volume, attach it to the target instance as &lt;strong&gt;/dev/sda1&lt;/strong&gt; and start the instance&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@ztobscieng/shrink-an-amazon-aws-ebs-root-volume-2020-update-8db834265c3e&quot;&gt;https://medium.com/@ztobscieng/shrink-an-amazon-aws-ebs-root-volume-2020-update-8db834265c3e&lt;/a&gt; &lt;strong&gt;ext2/3/4&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@benedikt.langens/how-to-shrink-an-ebs-root-volume-xfs-on-amazon-linux-2-2023-a7705c16e839&quot;&gt;https://medium.com/@benedikt.langens/how-to-shrink-an-ebs-root-volume-xfs-on-amazon-linux-2-2023-a7705c16e839&lt;/a&gt; &lt;strong&gt;xfs&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>transfer files to ec2 instances via SSM and netcat</title>
   <link href="https://javier.io/blog/en/2024/02/06/aws-cli-transfer-files-to-ec2-via-ssm.html"/>
   <published>2024-02-06T00:00:00+00:00</published>
   <updated>2024-02-06T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2024/02/06/aws-cli-transfer-files-to-ec2-via-ssm</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="aws"/>
   
   <category term="networking"/>
   
   
   
   <summary type="html">transfer files to ec2 instances via SSM and netcat</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2024/02/06/aws-cli-transfer-files-to-ec2-via-ssm.html">&lt;h2 id=&quot;transfer-files-to-ec2-instances-via-ssm-and-netcat&quot;&gt;transfer files to ec2 instances via SSM and netcat&lt;/h2&gt;

&lt;h6 id=&quot;06-feb-2024&quot;&gt;06 Feb 2024&lt;/h6&gt;

&lt;h2 id=&quot;step-1-run-netcat-on-the-target-ec2-machine-via-ssm&quot;&gt;Step 1. Run netcat on the target EC2 machine via SSM&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ aws ssm start-session --target $INSTANCE_ID --document-name
ssm $ nc -l -p 9999 &amp;gt; $FILE_NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;step-2-in-another-shell-open-a-port-forwarding-session&quot;&gt;Step 2. In another shell open a port-forwarding session:&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSession --parameters &apos;{&quot;portNumber&quot;:[&quot;9999&quot;],&quot;localPortNumber&quot;:[&quot;9999&quot;]}&apos;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;step-3-in-a-3rd-shell-transfer-the-file-via-netcat&quot;&gt;Step 3. In a 3rd shell transfer the file via netcat:&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ nc -w 3 127.0.0.1 9999 &amp;lt; $FILE_NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Profit!&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;https://gist.github.com/lukeplausin/4b412d83fb1246b0bed6507b5083b3a7&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>aws-cli ssm by ip</title>
   <link href="https://javier.io/blog/en/2024/01/11/aws-cli-ssm-by-ip.html"/>
   <published>2024-01-11T00:00:00+00:00</published>
   <updated>2024-01-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2024/01/11/aws-cli-ssm-by-ip</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="aws"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">aws-cli ssm by ip</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2024/01/11/aws-cli-ssm-by-ip.html">&lt;h2 id=&quot;aws-cli-ssm-by-ip&quot;&gt;aws-cli ssm by ip&lt;/h2&gt;

&lt;h6 id=&quot;11-jan-2024&quot;&gt;11 Jan 2024&lt;/h6&gt;

&lt;h2 id=&quot;configure-ssm-in-aws&quot;&gt;Configure SSM in AWS&lt;/h2&gt;

&lt;p&gt;Before you start, make sure that your Amazon EC2 instances are configured correctly. This involves setting up an IAM role &lt;code&gt;AmazonSSMManagedInstanceCore&lt;/code&gt; for Systems Manager and attaching it to your instances. You also need to ensure that the Systems Manager Agent (SSM Agent) is installed on your nodes.&lt;/p&gt;

&lt;p&gt;The SSM Agent is preinstalled by default on Amazon Linux base AMIs dated 2017.09 and later and on Amazon Linux 2, Windows Server 2008-2012 R2 AMIs, and others. If your distribution is not included use &lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html&quot;&gt;userdata&lt;/a&gt; to install it on first boot:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/bash
curl &quot;https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb&quot; -o &quot;session-manager-plugin.deb&quot;
curl &quot;https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_32bit/session-manager-plugin.deb&quot; -o &quot;session-manager-plugin.deb&quot;
curl &quot;https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_arm64/session-manager-plugin.deb&quot; -o &quot;session-manager-plugin.deb&quot;
dpkg -i session-manager-plugin.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;private-vpc&quot;&gt;Private VPC&lt;/h2&gt;

&lt;p&gt;If your EC2 instance is in a private network (without an Internet Gateway) you will need to set up 3 VPC Endpoints for AWS Systems Manager.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;VPC&lt;/strong&gt; &amp;gt; &lt;strong&gt;Endpoints&lt;/strong&gt; &amp;gt; &lt;strong&gt;Create Endpoint&lt;/strong&gt; &amp;gt; &lt;strong&gt;Service category&lt;/strong&gt; &amp;gt; &lt;strong&gt;AWS services&lt;/strong&gt; &amp;gt; &lt;strong&gt;Service Name&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;com.amazonaws.us-west-2.ssm (or the region where your vpc is hosted)&lt;/li&gt;
  &lt;li&gt;com.amazonaws.us-west-2.ec2messages&lt;/li&gt;
  &lt;li&gt;com.amazonaws.us-west-2.ssmmessages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the &lt;strong&gt;VPC&lt;/strong&gt; section, select the VPC of your EC2 instances. In the &lt;strong&gt;Security Group&lt;/strong&gt; section, select a security group that allows HTTPS traffic (port 443) from and to your EC2 instances. In &lt;strong&gt;Policy&lt;/strong&gt;, select &lt;strong&gt;Full Access&lt;/strong&gt; if you want all instances in your VPC to be able to use SSM.&lt;/p&gt;

&lt;h2 id=&quot;configure-aws-cli-using-sso&quot;&gt;Configure aws-cli using sso&lt;/h2&gt;

&lt;p&gt;Install &lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html&quot;&gt;aws-cli&lt;/a&gt; and the &lt;a href=&quot;https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-windows.html&quot;&gt;windows plugin&lt;/a&gt; if required.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ aws configure sso
SSO session name (Recommended): org-name
SSO start URL [None]: https://org-name.awsapps.com/start#/SSO
region [None]: us-west-2
SSO registration scopes [sso:account:access]:
There are 10 AWS accounts available to you. #select one option
Using the account ID 523868776147
There are 4 roles available to you.
Using the role name &quot;PowerUserAccess&quot;
CLI default client Region [None]: us-west-2
CLI profile name [PowerUserAccess-523868776147]: DevOps-PowerUser

To use this profile, specify the profile name using --profile, as shown:

aws s3 ls --profile DevOps-PowerUser
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;connect-by-instance-id&quot;&gt;Connect by instance-id&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ aws sso login --sso-session org-name; aws ssm start-session --target &amp;lt;instance-id&amp;gt; --profile DevOps-PowerUser
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;connect-by-ip&quot;&gt;Connect by ip&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ aws sso login --sso-session org-name; aws ssm start-session --target &quot;$(aws ec2 describe-instances --filter Name=private-ip-address,Values=&amp;lt;private-ip&amp;gt; --query &apos;Reservations[].Instances[].InstanceId&apos; --output text --region us-west-2 --profile DevOps-PowerUser)&quot; --profile DevOps-PowerUser --region us-west-2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Profit!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>windows installers non interactive</title>
   <link href="https://javier.io/blog/en/2024/01/05/windows-installers-non-interactive.html"/>
   <published>2024-01-05T00:00:00+00:00</published>
   <updated>2024-01-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2024/01/05/windows-installers-non-interactive</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">windows installers non interactive</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2024/01/05/windows-installers-non-interactive.html">&lt;h2 id=&quot;windows-installers-non-interactive&quot;&gt;windows installers non interactive&lt;/h2&gt;

&lt;h6 id=&quot;05-jan-2024&quot;&gt;05 Jan 2024&lt;/h6&gt;

&lt;h2 id=&quot;iis-85--windows-server-2012&quot;&gt;IIS 8.5 / Windows Server 2012&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; import-module servermanager
pshell&amp;gt; add-windowsfeature Web-Server, Web-WebServer, Web-Security, Web-Filtering, Web-Cert-Auth, Web-IP-Security, Web-Url-Auth, Web-Windows-Auth, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-CertProvider, Web-Common-Http, Web-Http-Errors, Web-Dir-Browsing, Web-Static-Content, Web-Default-Doc, Web-Http-Redirect, Web-DAV-Publishing, Web-Performance, Web-Stat-Compression, Web-Dyn-Compression, Web-Health, Web-Http-Logging, Web-ODBC-Logging, Web-Log-Libraries, Web-Custom-Logging, Web-Request-Monitor, Web-Http-Tracing, Web-App-Dev, Web-Net-Ext45, Web-ASP, Web-Asp-Net45, Web-CGI, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-WebSockets, Web-AppInit, Web-Includes, Web-Ftp-Server, Web-Ftp-Service, Web-Ftp-Ext, Web-Mgmt-Tools, Web-Mgmt-Console, Web-Mgmt-Compat, Web-Metabase, Web-WMI, Web-Lgcy-Mgmt-Console, Web-Lgcy-Scripting, Web-Scripting-Tools, Web-Mgmt-Service –IncludeManagementTools
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;iis-100--windows-server-2016&quot;&gt;IIS 10.0 / Windows Server 2016&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; Install-WindowsFeature -name Web-Server -IncludeManagementTools
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Confirm version installed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; get-itemproperty HKLM:\SOFTWARE\Microsoft\InetStp\ | select setupstring,versionstring #show iis version
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;iss-urlrewrite-module&quot;&gt;ISS urlrewrite module&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; choco install -y urlrewrite
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;chocolatey&quot;&gt;Chocolatey&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(&apos;https://community.chocolatey.org/install.ps1&apos;))
pshell&amp;gt; choco install wget -y
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;mongodb&quot;&gt;MongoDB&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; mkdir C:\bin
pshell&amp;gt; wget.exe https://downloads.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.4.24-signed.msi
pshell&amp;gt; msiexec.exe /quiet /i mongodb-win32-x86_64-2008plus-ssl-3.4.24-signed.msi INSTALLLOCATION=&quot;C:\bin\mongodb-win32-x86_64-2008plus-ssl-3.4.24\&quot; ADDLOCAL=&quot;all&quot;
pshell&amp;gt; While(Get-Process msiexec -ea si|?{$_.SI -ne 0}){} #wait until msiexec completes
pshell&amp;gt; mkdir D:\mongodb
pshell&amp;gt; C:\bin\mongodb-win32-x86_64-2008plus-ssl-3.4.24\bin\mongod --dbpath=D:\mongodb --logpath=D:\mongodb\log.txt --install --serviceName MongoDB
pshell&amp;gt; net start MongoDB
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;nodejs&quot;&gt;NodeJS&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; wget.exe --no-check-certificate https://nodejs.org/dist/v8.5.0/node-v8.5.0-x64.msi
pshell&amp;gt; msiexec.exe /quiet /i node-v8.5.0-x64.msi INSTALLDIR=&quot;C:\bin\nodejs-v8.5.0\&quot; ADDLOCAL=&quot;all&quot;
pshell&amp;gt; While(Get-Process msiexec -ea si|?{$_.SI -ne 0}){} #wait until msiexec completes
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;iisnode&quot;&gt;IISNode&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; wget.exe https://github.com/Azure/iisnode/releases/download/v0.2.26/iisnode-full-v0.2.26-x64.msi
pshell&amp;gt; #installs to C:\Program Files\iisnode
pshell&amp;gt; msiexec.exe /quiet /i iisnode-full-v0.2.26-x64.msi #do not allow to custom TARGETDIR=&quot;C:\bin\iisnode-full-v0.2.26\&quot;
pshell&amp;gt; While(Get-Process msiexec -ea si|?{$_.SI -ne 0}){} #wait until msiexec completes
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;python&quot;&gt;Python&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; wget.exe --no-check-certificate https://www.python.org/ftp/python/3.6.5/python-3.6.5-amd64.exe
pshell&amp;gt; .\python-3.6.5-amd64.exe /quiet /i InstallAllUsers=0 TargetDir=&quot;C:\bin\python-3.6.5\&quot;
pshell&amp;gt; While(Get-Process msiexec -ea si|?{$_.SI -ne 0}){} #wait until msiexec completes
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;robo3t&quot;&gt;Robo3t&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;pshell&amp;gt; wget.exe https://github.com/Studio3T/robomongo/releases/download/v1.1.1/robo3t-1.1.1-windows-x86_64-c93c6b0.exe
pshell&amp;gt; .\robo3t-1.1.1-windows-x86_64-c93c6b0.exe /S /D=C:\bin\robo3t-1.1.1\
pshell&amp;gt; While(Get-Process robo3t -ea si|?{$_.SI -ne 0}){} #wait until msiexec completes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Profit!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>launch and suscribe RHEL 8/9 instances in AWS</title>
   <link href="https://javier.io/blog/en/2023/10/15/launch-rhel-instances-in-aws.html"/>
   <published>2023-10-15T00:00:00+00:00</published>
   <updated>2023-10-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2023/10/15/launch-rhel-instances-in-aws</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="aws"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">launch and suscribe RHEL 8/9 instances in AWS</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2023/10/15/launch-rhel-instances-in-aws.html">&lt;h2 id=&quot;launch-and-suscribe-rhel-89-instances-in-aws&quot;&gt;launch and suscribe RHEL 8/9 instances in AWS&lt;/h2&gt;

&lt;h6 id=&quot;15-oct-2023&quot;&gt;15 Oct 2023&lt;/h6&gt;

&lt;h2 id=&quot;simple-no-redhat-cloud-integration&quot;&gt;Simple, no RedHat Cloud integration&lt;/h2&gt;

&lt;p&gt;Go to EC2 and launch either RHEL8 or RHEL9 instances:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RHEL8&lt;/strong&gt;: &lt;a href=&quot;https://aws.amazon.com/marketplace/pp/prodview-kv5mi3ksb2mma&quot;&gt;AWS Marketplace: Red Hat Enterprise Linux 8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ami Id: &lt;strong&gt;ami-0b324207d4bcaec61&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RHEL9&lt;/strong&gt;: &lt;a href=&quot;https://aws.amazon.com/marketplace/pp/prodview-b5psjqk4f5f3k&quot;&gt;AWS Marketplace: Red Hat Enterprise Linux 9&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ami Id: &lt;strong&gt;ami-026ebd4cfe2c043b2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure the AWS instance includes a RHEL suscription&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl http://169.254.169.254/latest/dynamic/instance-identity/document 2&amp;gt;/dev/null | grep billingProducts
&quot;billingProducts&quot; : [ &quot;bp-6fa54006&quot; ] #ID will change depending the RHEL version and must be != NULL
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If the above command success, execute:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo vi  /etc/yum/pluginconf.d/subscription-manager.conf
enabled=0
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;enable-additional-repositories&quot;&gt;Enable additional repositories&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;RHEL8&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo yum repolist all
$ sudo dnf config-manager --set-enabled codeready-builder-for-rhel-8-rhui-rpms rhel-8-supplementary-rhui-rpms 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;RHEL9&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo yum repolist all
$ sudo dnf config-manager --set-enabled codeready-builder-for-rhel-9-rhui-rpms rhel-9-supplementary-rhui-rpms
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Profit!&lt;/p&gt;

&lt;h2 id=&quot;with-redhat-cloud-and-insights-integration&quot;&gt;With Redhat Cloud and Insights integration&lt;/h2&gt;

&lt;h3 id=&quot;redhat&quot;&gt;RedHat&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.redhat.com/wapps/ugc/register.html?_flowId=register-flow&amp;amp;_flowExecutionKey=e1s1&quot;&gt;Create a RHEL account&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux/try-it?intcmp=701f20000012m1qAAA&quot;&gt;Request a RHEL trial&lt;/a&gt;, this step could be removed in the future, however for new accounts as Oct 12th 2023, it’s a requirement for registering RHEL aws instances.&lt;/li&gt;
  &lt;li&gt;Go to Red Hat and Enable the Simple Content Access Enablement (should be on by default for new accounts)
&lt;img src=&quot;https://github.com/javier-lopez/javier.io/assets/75626/abc8f9bc-9fce-496e-9cec-ca5d865cf943&quot; alt=&quot;rhel-simple-content-access&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;aws&quot;&gt;AWS&lt;/h3&gt;

&lt;p&gt;Go to EC2 and launch either RHEL8 or RHEL9 instances:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RHEL8&lt;/strong&gt;: &lt;a href=&quot;https://aws.amazon.com/marketplace/pp/prodview-kv5mi3ksb2mma&quot;&gt;AWS Marketplace: Red Hat Enterprise Linux 8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ami Id: &lt;strong&gt;ami-0b324207d4bcaec61&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RHEL9&lt;/strong&gt;: &lt;a href=&quot;https://aws.amazon.com/marketplace/pp/prodview-b5psjqk4f5f3k&quot;&gt;AWS Marketplace: Red Hat Enterprise Linux 9&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ami Id: &lt;strong&gt;ami-026ebd4cfe2c043b2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once setup, login and suscribe using the RedHat Credentials&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo subscription-manager register --username &amp;lt;username&amp;gt;
$ sudo insights-client
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;enable-additional-repositories-1&quot;&gt;Enable additional repositories&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;RHEL8&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo yum repolist all
$ sudo dnf config-manager --set-enabled codeready-builder-for-rhel-8-rhui-rpms rhel-8-supplementary-rhui-rpms 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;RHEL9&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo yum repolist all
$ sudo dnf config-manager --set-enabled codeready-builder-for-rhel-9-rhui-rpms rhel-9-supplementary-rhui-rpms
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Profit!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://access.redhat.com/articles/6538061&quot;&gt;How to register a Red Hat Enterprise Linux system running on AWS to&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://repost.aws/knowledge-center/ec2-yum-rhel-errors&quot;&gt;Troubleshoot errors that are thrown when you use yum on an EC2 instance with RHEL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>using colima to run docker on a mac</title>
   <link href="https://javier.io/blog/en/2023/10/10/docker-osx.html"/>
   <published>2023-10-10T00:00:00+00:00</published>
   <updated>2023-10-10T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2023/10/10/docker-osx</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="docker"/>
   
   
   
   <summary type="html">using colima to run docker on a mac</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2023/10/10/docker-osx.html">&lt;h2 id=&quot;using-colima-to-run-docker-on-a-mac&quot;&gt;using colima to run docker on a mac&lt;/h2&gt;

&lt;h6 id=&quot;10-oct-2023&quot;&gt;10 Oct 2023&lt;/h6&gt;

&lt;h2 id=&quot;install-docker--docker-compose&quot;&gt;Install docker / docker-compose&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ brew install docker
$ brew install docker-compose
$ docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;install-colima&quot;&gt;Install colima&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ brew install colima
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;configure-colima&quot;&gt;Configure colima&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/abiosoft/colima/issues/83#issuecomment-1339269542&quot;&gt;Cannot chown or chmod bind mounted files/dirs&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cat $HOME/.colima/_lima/_config/override.yaml
mountType: 9p
mounts:
  - location: &quot;/Users/jlopez&quot;
    writable: true
    9p:
      securityModel: mapped-xattr
      cache: mmap
  - location: &quot;~&quot;
    writable: true
    9p:
      securityModel: mapped-xattr
      cache: mmap
  - location: /tmp/colima
    writable: true
    9p:
      securityModel: mapped-xattr
      cache: mmap
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;use-colima&quot;&gt;Use colima&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ colima start --mount-type 9p --vm-type qemu #or colima start --cpu 4 --memory 8 --mount-type 9p --vm-type qemu
$ docker run hello-world
Unable to find image &apos;hello-world:latest&apos; locally
latest: Pulling from library/hello-world
70f5ac315c5a: Pull complete
...
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/abiosoft/colima&quot;&gt;https://github.com/abiosoft/colima&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy hacking! 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>leetcode</title>
   <link href="https://javier.io/blog/en/2023/01/22/leetcode.html"/>
   <published>2023-01-22T00:00:00+00:00</published>
   <updated>2023-01-22T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2023/01/22/leetcode</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="python"/>
   
   
   
   <summary type="html">leetcode</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2023/01/22/leetcode.html">&lt;h2 id=&quot;leetcode&quot;&gt;leetcode&lt;/h2&gt;

&lt;h6 id=&quot;22-jan-2023&quot;&gt;22 Jan 2023&lt;/h6&gt;

&lt;h3 id=&quot;easy&quot;&gt;Easy&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/two-sum/solutions/3087960/hash-table-cache-python/&quot;&gt;1. Two Sum&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/roman-to-integer/solutions/2960085/solved-in-a-similar-way-as-the-text-describes-the-problem-python/&quot;&gt;13. Roman to Integer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-common-prefix/solutions/2965450/user-friendly-solution-python/&quot;&gt;14. Longest Common Prefix&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/valid-parentheses/solutions/2967816/dictionary-solution-easy-to-understand-python/&quot;&gt;20. Valid Parentheses&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/merge-two-sorted-lists/solutions/2972798/dummy-variable-explained-python/&quot;&gt;21. Merge Two Sorted Lists&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/remove-duplicates-from-sorted-array/solutions/2973934/two-pointers-solution-slow-fast-python/&quot;&gt;26. Remove Duplicates from Sorted Array&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/plus-one/solutions/2976291/inverse-array-verification-python/&quot;&gt;66. Plus One&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/sqrtx/solutions/2981409/binary-search-finding-first-true-statement-in-false-true-list-python/&quot;&gt;69. Sqrt(x)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/climbing-stairs/solutions/2996123/bottom-up-dp-python/&quot;&gt;70. Climbing Stairs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/merge-sorted-array/solutions/2999149/two-pointers-python/&quot;&gt;88. Merge Sorted Array&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/binary-tree-inorder-traversal/solutions/3005027/all-dfs-traversals-preorder-inorder-postorder-python/&quot;&gt;94. Binary Tree Inorder Traversal&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/symmetric-tree/solutions/3012562/recursive-iterative-solution-python/&quot;&gt;101. Symmetric Tree&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/maximum-depth-of-binary-tree/solutions/3021923/max-depth-based-in-all-traversals-preorder-inorder-postorder-python/&quot;&gt;104. Maximum Depth of Binary Tree&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/solutions/3032703/recursion-and-iterative-python/&quot;&gt;108. Convert Sorted Array to Binary Search Tree&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/pascals-triangle/solutions/3033373/initialize-pascal-array-with-1s-and-fill-efficiently-python/&quot;&gt;118. Pascal’s Triangle&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/best-time-to-buy-and-sell-stock/solutions/3047530/two-pointers-python/&quot;&gt;121. Best Time to Buy and Sell Stock&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/valid-palindrome/solutions/3056331/two-pointers-python/&quot;&gt;125. Valid Palindrome&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/single-number/solutions/3056816/dictionary-and-xor-python/&quot;&gt;136. Single Number&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/linked-list-cycle/solutions/3067337/slow-fast-pointers-python/&quot;&gt;141. Linked List Cycle&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/intersection-of-two-linked-lists/solutions/3069994/two-pointers-python/&quot;&gt;160. Intersection of Two Linked Lists&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/majority-element/solutions/3093065/boyer-moore-voting-algorithm-python/&quot;&gt;169. Majority Element&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/excel-sheet-column-number/solutions/3093166/base-26-conversion-python/&quot;&gt;171. Excel Sheet Column Number&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://leetcode.com/problems/reverse-bits/solutions/3118596/bit-manipulation-shifting-to-left-right-python/&quot;&gt;190. Reverse Bits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;medium&quot;&gt;Medium&lt;/h3&gt;

&lt;h3 id=&quot;hard&quot;&gt;Hard&lt;/h3&gt;

&lt;p&gt;Happy interviewing!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>install tmux on windows 10</title>
   <link href="https://javier.io/blog/en/2022/11/15/install-tmux-on-windows-10.html"/>
   <published>2022-11-15T00:00:00+00:00</published>
   <updated>2022-11-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2022/11/15/install-tmux-on-windows-10</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">install tmux on windows 10</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2022/11/15/install-tmux-on-windows-10.html">&lt;h2 id=&quot;install-tmux-on-windows-10&quot;&gt;install tmux on windows 10&lt;/h2&gt;

&lt;h6 id=&quot;15-nov-2022&quot;&gt;15 Nov 2022&lt;/h6&gt;

&lt;p&gt;Download and install &lt;a href=&quot;https://www.msys2.org/#installation&quot;&gt;https://www.msys2.org/#installation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If behind a firewall, compress as gz or bz2, upload a custom server and download from it, eg:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/public/bin/msys2-x86_64-20221028.exe.gz&quot;&gt;http://f.javier.io/public/bin/msys2-x86_64-20221028.exe.gz&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/public/bin/msys2-x86_64-20221028.exe.bz2&quot;&gt;http://f.javier.io/public/bin/msys2-x86_64-20221028.exe.bz2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;install-tmux&quot;&gt;Install tmux&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ pacman -S tmux
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If behinf a firewall (SSL issue), modify &lt;strong&gt;/etc/pacman.conf&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; XferCommand = /usr/bin/curl --insecure -L -C - -f -o %o %u
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And Git:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git config --global http.sslVerify false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Copy tmux and dependencies to Git for Windows path:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp C:\msys64\usr\bin\tmux C:\msys64\usr\bin\msys-event* C:\Program Files\Git\usr\bin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Restart Git for Windows&lt;/p&gt;

&lt;h2 id=&quot;extra&quot;&gt;Extra&lt;/h2&gt;

&lt;p&gt;If you want to keep msys2 you may want to change the &lt;strong&gt;$HOME&lt;/strong&gt; directory so it points to the same place as Git for Windows, modify &lt;strong&gt;/etc/nsswitch.conf&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;db_home: windows
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>install 7zip with choco without admin permissions</title>
   <link href="https://javier.io/blog/en/2022/11/15/install-7zip-choco-non-admin.html"/>
   <published>2022-11-15T00:00:00+00:00</published>
   <updated>2022-11-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2022/11/15/install-7zip-choco-non-admin</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">install 7zip with choco without admin permissions</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2022/11/15/install-7zip-choco-non-admin.html">&lt;h2 id=&quot;install-7zip-with-choco-without-admin-permissions&quot;&gt;install 7zip with choco without admin permissions&lt;/h2&gt;

&lt;h6 id=&quot;15-nov-2022&quot;&gt;15 Nov 2022&lt;/h6&gt;

&lt;p&gt;Install choco, from a powershell:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ notepad choco-non-admin.ps1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then paste the following instructions:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Set directory for installation - Chocolatey does not lock
# down the directory if not the default
$InstallDir=&apos;C:\ProgramData\chocoportable&apos;
$env:ChocolateyInstall=&quot;$InstallDir&quot;

# If your PowerShell Execution policy is restrictive, you may
# not be able to get around that. Try setting your session to
# Bypass.
Set-ExecutionPolicy Bypass -Scope Process -Force;

# All install options - offline, proxy, etc at
# https://chocolatey.org/install
iex ((New-Object System.Net.WebClient).DownloadString(&apos;https://community.chocolatey.org/install.ps1&apos;))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Execute the resulting script and install the portable 7zip version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./choco-non-admin.ps1
$ choco install 7zip.portable
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Open &lt;strong&gt;C:\ProgramData\chocoportable\lib\7zip.portable\tools\7zFM&lt;/strong&gt; to compress / uncompress stuff.&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>restart firefox</title>
   <link href="https://javier.io/blog/en/2021/09/27/restart-linux.html"/>
   <published>2021-09-27T00:00:00+00:00</published>
   <updated>2021-09-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2021/09/27/restart-linux</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">restart firefox</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2021/09/27/restart-linux.html">&lt;h2 id=&quot;restart-firefox&quot;&gt;restart firefox&lt;/h2&gt;

&lt;h6 id=&quot;27-sep-2021&quot;&gt;27 Sep 2021&lt;/h6&gt;

&lt;h3 id=&quot;issue&quot;&gt;Issue&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;Error: Firefox behaves weird, eg: session issues
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;fix&quot;&gt;Fix&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
about:restartrequired
&lt;/pre&gt;

&lt;p&gt;That’s it, happy browsing, 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>citrix on linux</title>
   <link href="https://javier.io/blog/en/2021/07/12/citrix-on-linux.html"/>
   <published>2021-07-12T00:00:00+00:00</published>
   <updated>2021-07-12T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2021/07/12/citrix-on-linux</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">citrix on linux</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2021/07/12/citrix-on-linux.html">&lt;h2 id=&quot;citrix-on-linux&quot;&gt;citrix on linux&lt;/h2&gt;

&lt;h6 id=&quot;12-jul-2021&quot;&gt;12 Jul 2021&lt;/h6&gt;

&lt;h3 id=&quot;issue&quot;&gt;Issue&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;Error: &quot;SSL Error 61: You have not chosen to trust &apos;Certificate Authority&apos;...&quot; on Receiver for Linux
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;fix&quot;&gt;Fix&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo mv /opt/Citrix/ICAClient/keystore/cacerts   /opt/Citrix/ICAClient/keystore/cacerts.bk
$ sudo ln -s /etc/ssl/certs/   /opt/Citrix/ICAClient/keystore/cacerts
&lt;/pre&gt;

&lt;p&gt;That’s it, happy coworking, 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>transfer files with netcat</title>
   <link href="https://javier.io/blog/en/2021/01/17/transfer-files-with-netcat.html"/>
   <published>2021-01-17T00:00:00+00:00</published>
   <updated>2021-01-17T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2021/01/17/transfer-files-with-netcat</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">transfer files with netcat</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2021/01/17/transfer-files-with-netcat.html">&lt;h2 id=&quot;transfer-files-with-netcat&quot;&gt;transfer files with netcat&lt;/h2&gt;

&lt;h6 id=&quot;17-jan-2021&quot;&gt;17 Jan 2021&lt;/h6&gt;

&lt;p&gt;Here goes a quick note about how to transfer files in a LAN between computers
using &lt;strong&gt;netcat&lt;/strong&gt; which is available in a wide range of platforms because of its
simplicity.&lt;/p&gt;

&lt;h3 id=&quot;receiving-node-192168174&quot;&gt;Receiving node (192.168.1.74)&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir backup/ &amp;amp;&amp;amp; cd backup/
$ nc -l -p 7000 | pv (optional, pretty ETA visualizator) | tar x
&lt;/pre&gt;

&lt;h3 id=&quot;sending-node&quot;&gt;Sending node&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ tar cf - * | nc 192.168.1.74 7000
&lt;/pre&gt;

&lt;p&gt;That’s it, happy sharing, 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>host several sites in a single box with docker and traefik v2, https</title>
   <link href="https://javier.io/blog/en/2020/12/03/host-several-sites-in-a-single-box-with-docker-and-traefik-https.html"/>
   <published>2020-12-03T00:00:00+00:00</published>
   <updated>2020-12-03T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2020/12/03/host-several-sites-in-a-single-box-with-docker-and-traefik-https</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="docker"/>
   
   <category term="networking"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">host several sites in a single box with docker and traefik v2, https</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2020/12/03/host-several-sites-in-a-single-box-with-docker-and-traefik-https.html">&lt;h2 id=&quot;host-several-sites-in-a-single-box-with-docker-and-traefik-v2-https&quot;&gt;host several sites in a single box with docker and traefik v2, https&lt;/h2&gt;

&lt;h6 id=&quot;03-dec-2020&quot;&gt;03 Dec 2020&lt;/h6&gt;

&lt;p&gt;Last time I wrote about how simple is to &lt;a href=&quot;/blog/en/2020/12/01/host-several-sites-in-a-single-box-with-docker-and-traefik-http.html&quot;&gt;host several sites with docker +
traefik on a single node&lt;/a&gt;,
on this article I’ll complement such information with https and automatic ssl
certification renewal.&lt;/p&gt;

&lt;p&gt;If you continue reading this you’ll &lt;strong&gt;need&lt;/strong&gt; to get familiar with the previous
post, since I’m building upon it. OK, ready?, let’s recapitulate:&lt;/p&gt;

&lt;h2 id=&quot;diagram-and-folder-structure&quot;&gt;Diagram and Folder Structure&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/traefik-docker-compose.png&quot;&gt;&lt;img src=&quot;/assets/img/traefik-docker-compose.png&quot; alt=&quot;traefik docker compose&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traefik will receive all requests and will send them to different containers
depending the domain/subdomains, in the process it’ll provide ssl termination
for our users and dockerized applications, those certifications will be
auto-renewed every 2/3 months and won’t require any manual step, cool!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;┬
├── multisite (traefik)
│   ├── docker-compose.yml
│   ├── docker-compose.ssl.yml        =&amp;gt; NEW FILE
│   ├── acme.json                     =&amp;gt; NEW FILE
├── site1.com
│   ├── ...
│   ├── docker-compose.site1.yml
│   ├── docker-compose.site1.ssl.yml  =&amp;gt; NEW FILE
├── site2.com
    ├── ...
    ├── docker-compose.site2.yml
    ├── docker-compose.site1.ssl.yml  =&amp;gt; NEW FILE
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you noticed, new files were added, the idea is that we maintain the
flexibility to either provision a &lt;strong&gt;http only&lt;/strong&gt; or a &lt;strong&gt;http + https&lt;/strong&gt; site.&lt;/p&gt;

&lt;h2 id=&quot;pre-requisite-dns-configuration&quot;&gt;pre-requisite, dns configuration&lt;/h2&gt;

&lt;p&gt;When working with &lt;strong&gt;http only&lt;/strong&gt; there is no need to mv our code from our local
environment, it’s easy to add some entries in &lt;strong&gt;/etc/hosts&lt;/strong&gt; and call it a day,
this time however is different, we need to &lt;strong&gt;upload our files into a box with
a public ip address&lt;/strong&gt; and verify that the dns routing is working as expected,
that is, if we are going to hosts these sites at:
185.199.109.153, &lt;strong&gt;we need to make sure site1.com / site2.com resolve to
185.199.109.153&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I won’t cover how to do that because it depends on your DNS Registrar, for
reference I’m using &lt;a href=&quot;https://www.racknerd.com/&quot;&gt;RackNerd&lt;/a&gt; and
&lt;a href=&quot;https://www.dnspod.com/&quot;&gt;DNSPod&lt;/a&gt; as my Linux / DNS servers.&lt;/p&gt;

&lt;p&gt;Why do we need to prepare our setup like this before starting?, it has to do
with &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let’s Encrypt&lt;/a&gt;, the Certification Authority
we’re going to depend on, this CA generates challenges to verify that we are
the &lt;strong&gt;owners of the referenced domain/subdomain&lt;/strong&gt;, fortunately that happens
automatically so we don’t need to do anything besides making sure that Let’s
Encrypt can communicate with our domains.&lt;/p&gt;

&lt;h2 id=&quot;multisite&quot;&gt;multisite&lt;/h2&gt;

&lt;p&gt;Remember that starting here all changes are located in a remote public machine.
I’ll start by creating a copy of &lt;strong&gt;docker-compose.yml&lt;/strong&gt;, that would make easier
for us to track the ssl changes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp docker-compose.yml  docker-compose.ssl.yml 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;multisite/docker-compose.ssl.yml.patch&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
--- docker-compose.ssl.yml           2020-12-03 10:02:48.186590271 -0600
+++ docker-compose.ssl.changes.yml   2020-12-03 10:03:30.940486004 -0600
@@ -9,11 +9,21 @@
       - &quot;--providers.docker.exposedbydefault=false&quot;
       - &quot;--providers.docker.network=traefik_global&quot;
       #- &quot;--log.level=DEBUG&quot;
+      - &quot;--entrypoints.http.address=:80&quot;
+      - &quot;--entrypoints.https.address=:443&quot;
+      - &quot;--certificatesresolvers.myresolver.acme.email=your-personal@email.tld&quot;
+      - &quot;--certificatesresolvers.myresolver.acme.storage=/acme.json&quot;
+      - &quot;--certificatesresolvers.myresolver.acme.tlschallenge=true&quot;
     ports:
       - &quot;80:80&quot;     #reverse proxy =&amp;gt; input to all containerized services
+      - &quot;443:443&quot;   #reverse ssl proxy
       - &quot;8080:8080&quot; #traefik dashboard/api
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock
+      # Run this command in the host machine before launching traefik:
+      #   $ touch acme.json &amp;amp;&amp;amp; chmod 600 acme.json
+      - ${PWD}/acme.json:/acme.json
     networks:
       - traefik
&lt;/pre&gt;

&lt;p&gt;Now our original file is more verbose, nevertheless every option is there for a
reason.&lt;/p&gt;

&lt;p&gt;By default traefik only opens the &lt;strong&gt;http port (80)&lt;/strong&gt;, so if we want to allow
both, &lt;strong&gt;http/https&lt;/strong&gt;, we need to be more specific:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
+      - &quot;--entrypoints.http.address=:80&quot;
+      - &quot;--entrypoints.https.address=:443&quot;
&lt;/pre&gt;

&lt;p&gt;We also need to select which &lt;em&gt;certification resolver&lt;/em&gt;  we’re going to use, on
this case, Let’s encrypt, we specify that by filling the acme fields.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;acme.email&lt;/strong&gt; can be any personal/business email. &lt;strong&gt;acme.storage&lt;/strong&gt; is where
our ssl certificates will be saved, it does &lt;strong&gt;need to exists but can be
empty&lt;/strong&gt;, if that is the case, traefik will override it with valid certs.
&lt;strong&gt;acme.tlschallenge&lt;/strong&gt; is the challenge type, there are &lt;a href=&quot;https://doc.traefik.io/traefik/https/acme/#the-different-acme-challenges&quot;&gt;other
types&lt;/a&gt;,
but I think this is the easiest.&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
+      - &quot;--certificatesresolvers.myresolver.acme.email=your-personal@email.tld&quot;
+      - &quot;--certificatesresolvers.myresolver.acme.storage=/acme.json&quot;
+      - &quot;--certificatesresolvers.myresolver.acme.tlschallenge=true&quot;
     ports:
       - &quot;80:80&quot;     #reverse proxy =&amp;gt; input to all containerized services
+      - &quot;443:443&quot;   #reverse ssl proxy
&lt;/pre&gt;

&lt;p&gt;Finally we’ll share the &lt;strong&gt;acme.json&lt;/strong&gt; file between our host/container to avoid
requesting new certificates each time we launch our traefik container.&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
+      # Run this command in the host machine before launching traefik:
+      #   $ touch acme.json &amp;amp;&amp;amp; chmod 600 acme.json
+      - ${PWD}/acme.json:/acme.json
&lt;/pre&gt;

&lt;p&gt;As the comments suggest, this file needs to be created with specific
permissions before running traefik.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ touch acme.json &amp;amp;&amp;amp; chmod 600 acme.json
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ok, that’s all on traefik side, let’s apply the patch:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ patch -p0 &amp;lt; docker-compose.ssl.yml.patch
patching file docker-compose.ssl.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;site1com&quot;&gt;site1.com&lt;/h2&gt;

&lt;p&gt;Let’s copy and analyze what makes a new site https compatible:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp docker-compose.site1.yml docker-compose.site1.ssl.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;site1.com/docker-compose.site1.ssl.yml.patch&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
--- docker-compose.site1.ssl.yml           2020-12-03 10:02:48.186590271 -0600
+++ docker-compose.site1.ssl.changes.yml   2020-12-03 10:03:30.940486004 -0600
@@ -28,7 +28,15 @@
       - frontend
     labels:
       - &quot;traefik.enable=true&quot;
-      - &quot;traefik.http.routers.site1_com.rule=Host(`site1.com`)&quot;
+
+      - &quot;traefik.http.routers.http_site1_com.rule=Host(`site1.com`)&quot;
+      - &quot;traefik.http.routers.http_site1_com.entrypoints=http&quot;
+
+      - &quot;traefik.http.routers.https_site1_com.rule=Host(`site1.com`)&quot;
+      - &quot;traefik.http.routers.https_site1_com.entrypoints=https&quot;
+      - &quot;traefik.http.routers.https_site1_com.tls=true&quot;
+      - &quot;traefik.http.routers.https_site1_com.tls.certresolver=myresolver&quot;
+
       - &quot;traefik.http.services.site1_com.loadbalancer.server.port=80&quot;
 
   app:
&lt;/pre&gt;

&lt;p&gt;I don’t know about you, but for me the syntax is confusing, happily this only
needs to be setup once and then can be reused in other domains/subdomains by
changing only some words. Also, the ssl endpoint is transparent, our
application doesn’t need to be aware of it, that’s great and IMO overrides the
verbose configuration.&lt;/p&gt;

&lt;p&gt;As you noticed, the &lt;strong&gt;site1_com&lt;/strong&gt; rules were split in two, &lt;strong&gt;http_site1_com&lt;/strong&gt;
and &lt;strong&gt;https_site1_com&lt;/strong&gt;, this is because each route needs to define a Host and
an entrypoint (port), repetitive right?, in the &lt;strong&gt;https&lt;/strong&gt; route we enable
&lt;strong&gt;tls&lt;/strong&gt; and point to our custom resolver &lt;strong&gt;myresolver&lt;/strong&gt; which if we recall uses
let’s encrypt. There is also one more detail:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
       - &quot;traefik.http.services.site1_com.loadbalancer.server.port=80&quot;
&lt;/pre&gt;

&lt;p&gt;The service element redirects traefik routes to our app’s 80 port, as each
route defines a domain and entrypoint, that means it affects the domain as a
whole and therefore it’s kept as &lt;strong&gt;site1_com&lt;/strong&gt; , @.@!&lt;/p&gt;

&lt;p&gt;This configuration leaves an important use case that each year is more common,
forcing users to use &lt;strong&gt;https&lt;/strong&gt; over &lt;strong&gt;http&lt;/strong&gt;. Since I personally do not agree
with such IMO abusive behavior, I skipped it on purpose, however if you’re
interested you can use a
&lt;a href=&quot;https://doc.traefik.io/traefik/middlewares/redirectscheme/&quot;&gt;middleware&lt;/a&gt; to
configure that.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ patch -p0 &amp;lt; docker-compose.site1.yml.patch
patching file docker-compose.site1.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;site2com&quot;&gt;site2.com&lt;/h2&gt;

&lt;p&gt;The second site should be easier to review:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp docker-compose.site2.yml docker-compose.site2.ssl.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;site2.com/docker-compose.site2.ssl.yml.patch&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
--- docker-compose.site2.ssl.yml           2020-12-03 10:02:48.186590271 -0600
+++ docker-compose.site2.ssl.changes.yml   2020-12-03 10:03:30.940486004 -0600
@@ -26,7 +26,15 @@
       - frontend
     labels:
       - &quot;traefik.enable=true&quot;
-      - &quot;traefik.http.routers.site2_com.rule=Host(`site2.com`)&quot;
+
+      - &quot;traefik.http.routers.http_site2_com.rule=Host(`site2.com`)&quot;
+      - &quot;traefik.http.routers.http_site2_com.entrypoints=http&quot;
+
+      - &quot;traefik.http.routers.https_site2_com.rule=Host(`site2.com`)&quot;
+      - &quot;traefik.http.routers.https_site2_com.entrypoints=https&quot;
+      - &quot;traefik.http.routers.https_site2_com.tls=true&quot;
+      - &quot;traefik.http.routers.https_site2_com.tls.certresolver=myresolver&quot;
+
       - &quot;traefik.http.services.site2_com.loadbalancer.server.port=80&quot;
&lt;/pre&gt;

&lt;p&gt;Everything is the same, the only difference is that &lt;strong&gt;site1&lt;/strong&gt; was replaced with
&lt;strong&gt;site2&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ patch -p0 &amp;lt; docker-compose.site2.yml.patch
patching file docker-compose.site2.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;docker-compose-up&quot;&gt;docker-compose up&lt;/h2&gt;

&lt;p&gt;If you’ve followed everything up until this point, &lt;strong&gt;congratulations!&lt;/strong&gt;,
technology is great but also tends to be harder to grasp as more elements are
incorporated, let’s end this tutorial once for all so we can continue with our
lives:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd multisite/ &amp;amp;&amp;amp; docker-compose -f docker-compose.ssl.yml       up -d
$ cd site1.com/ &amp;amp;&amp;amp; docker-compose -f docker-compose.site1.ssl.yml up -d
$ cd site2.com/ &amp;amp;&amp;amp; docker-compose -f docker-compose.site2.ssl.yml up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it!, a kind of simple setup with ssl certs that is only limited by
the amount of &lt;strong&gt;RAM/CPU&lt;/strong&gt; in your machine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl https://site1.com
hello world from 7b7d6302-e162-3806-9595-17f854dd5b98

$ curl https://site2.com; echo
{&quot;Greetings&quot;: &quot;Hello World!&quot;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/en/2020/12/01/host-several-sites-in-a-single-box-with-docker-and-traefik-http.html&quot;&gt;/blog/en/2020/12/01/host-several-sites-in-a-single-box-with-docker-and-traefik-http.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://traefik.io/blog/traefik-2-0-docker-101-fc2893944b9d/&quot;&gt;https://github.com/traefik/traefik/issues/5506#issuecomment-549100716&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>host several sites in a single box with docker and traefik v2, http</title>
   <link href="https://javier.io/blog/en/2020/12/01/host-several-sites-in-a-single-box-with-docker-and-traefik-http.html"/>
   <published>2020-12-01T00:00:00+00:00</published>
   <updated>2020-12-01T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2020/12/01/host-several-sites-in-a-single-box-with-docker-and-traefik-http</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="docker"/>
   
   <category term="networking"/>
   
   
   
   <summary type="html">host several sites in a single box with docker and traefik v2, http</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2020/12/01/host-several-sites-in-a-single-box-with-docker-and-traefik-http.html">&lt;h2 id=&quot;host-several-sites-in-a-single-box-with-docker-and-traefik-v2-http&quot;&gt;host several sites in a single box with docker and traefik v2, http&lt;/h2&gt;

&lt;h6 id=&quot;01-dec-2020&quot;&gt;01 Dec 2020&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; is great and everything, however one of the
things that still stress me is how to deploy it to production. I don’t need
fancy stuff, nor I want to spend my free time or money hosting small/personal
projects. I just want to be able to &lt;strong&gt;docker-compose up&lt;/strong&gt; and forget. And if
several projects can share a single node while maintaining their own
domain/subdomain even better.&lt;/p&gt;

&lt;p&gt;Today, after completing another small service, I decided I had enough, I
reviewed several alternatives and finally found a sensitive one.
&lt;a href=&quot;https://traefik.io/&quot;&gt;Traefik&lt;/a&gt;, a simple/yet powerful reverse proxy that is
compatible with Docker/Kubernetes/Blablabla and that just works. So here goes,
my own tutorial for future me and other in pain souls.&lt;/p&gt;

&lt;h2 id=&quot;diagram-and-folder-structure&quot;&gt;Diagram and Folder Structure&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/traefik-docker-compose.png&quot;&gt;&lt;img src=&quot;/assets/img/traefik-docker-compose.png&quot; alt=&quot;traefik docker compose&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;┬
├── multisite (traefik)
│   ├── docker-compose.yml
├── site1.com
│   ├── ...
│   ├── docker-compose.site1.yml
├── site2.com
    ├── ...
    ├── docker-compose.site2.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;multisite&quot;&gt;multisite&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;multisite/docker-compose.yml&lt;/strong&gt; contains the core of the setup:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;version: &apos;3.4&apos;

services:
  traefik:
    image: traefik:v2.3
    command:
      - &quot;--api.insecure=true&quot;
      - &quot;--providers.docker&quot;
      - &quot;--providers.docker.exposedbydefault=false&quot;
      - &quot;--providers.docker.network=traefik_global&quot;
    ports:
      - &quot;80:80&quot;     #all traffic will arrive through this port
      - &quot;8080:8080&quot; #traefik dashboard/api
    volumes: #this is how traefik reads docker events
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik

networks:
  traefik:
    name: traefik_global
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It’s amazing how simple it can get, let’s review some of its sections:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;--api.insecure=true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Activate traefik’s dashboard/api (should be disabled or protected in production
systems), &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; and
&lt;a href=&quot;http://localhost:8080/api/rawdata&quot;&gt;http://localhost:8080/api/rawdata&lt;/a&gt;,
personally the latter was more useful to me, helped me to debug route
mismatches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/traefik-dashboard.png&quot;&gt;&lt;img src=&quot;/assets/img/traefik-dashboard.png&quot; alt=&quot;traefik dashboard&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traefik is able to autoconfigure its routing from Docker events/data, that is
great but if you don’t want to end with dozens of routes because of auxiliary
services it’s better to only allow specific ones, maybe only service’s
front-ends?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;--providers.docker
--providers.docker.exposedbydefault=false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By default, &lt;strong&gt;docker-compose&lt;/strong&gt; creates volumes/networks based in the project
folder name, that’s to protect from service collision, for our traefik case
however we need a global network that can be referred in multiple scenarios,
that’s what the &lt;strong&gt;name:&lt;/strong&gt; parameter does, the &lt;strong&gt;providers.docker.network&lt;/strong&gt;
option gives to Traefik the instruction to route all its traffic through this
interface, if not defined here every service would need to do it in its own
&lt;strong&gt;docker-compose.yml&lt;/strong&gt; file.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;--providers.docker.network=traefik_global

networks:
  traefik:
    name: traefik_global
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;site1com&quot;&gt;site1.com&lt;/h2&gt;

&lt;p&gt;In order to make a realistic scenario I’m going to use small applications that
although simple contain enough complexity to mirror real world cases:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git clone https://github.com/nebulosa/docker-flask-hello-world-mongodb site1.com
$ cd site1.com/
$ git checkout 0de86a2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/traefik-tier-3-app.png&quot;&gt;&lt;img src=&quot;/assets/img/traefik-tier-3-app.png&quot; alt=&quot;traefik tier 3 app&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The above image doesn’t consider docker, yet helps to describe how a common web
application works, once we take in account containers / subnets we would arrive
to the following diagram:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/traefik-tier-3-dockerized-app.png&quot;&gt;&lt;img src=&quot;/assets/img/traefik-tier-3-dockerized-app.png&quot; alt=&quot;traefik tier 3 dockerized app&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the only container that can communicate with both, &lt;strong&gt;frontend&lt;/strong&gt;
and &lt;strong&gt;database&lt;/strong&gt; is the &lt;strong&gt;app&lt;/strong&gt;, this is just good practices, in our final
setup, an additional &lt;strong&gt;traefik_global&lt;/strong&gt; network would be added, it will connect
every front-end web container to send/receive requests while the rest of the
service stack is hidden in its own namespace, simple/elegant and easy to scale.&lt;/p&gt;

&lt;p&gt;I’ll create a copy of &lt;strong&gt;docker-compose-cherry.yml&lt;/strong&gt; and apply a patch to
showcase how traefik connection works:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp docker-compose-cherry.yml docker-compose.site1.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;site1.com/docker-compose.site1.yml.patch&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
--- docker-compose.site1.yml           2020-12-01 10:02:48.186590271 -0600
+++ docker-compose.site1.changes.yml   2020-12-01 10:03:30.940486004 -0600
@@ -18,15 +18,18 @@

   nginx:
     image: nginx:1.13.10-alpine
-    ports:
-      - &quot;5000:80&quot;
     volumes:
       - ./nginx/default/:/etc/nginx/conf.d
       - /etc/localtime:/etc/localtime:ro
     depends_on:
       - app
     networks:
+      - traefik #add 1st so traefik performs better
       - frontend
+    labels:
+      - &quot;traefik.enable=true&quot;
+      - &quot;traefik.http.routers.site1_com.rule=Host(`site1.com`)&quot;
+      - &quot;traefik.http.services.site1_com.loadbalancer.server.port=80&quot;

   app:
     build: .
@@ -52,3 +55,6 @@
     driver: bridge #or overlay in swarm mode
   backend:
     driver: bridge #or overlay in swarm mode
+  traefik:
+    external:
+      name: traefik_global
&lt;/pre&gt;

&lt;p&gt;Since all our traffic would pass through localhost:80/traefik there is no need
to expose/bind additional ports:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
   nginx:
     image: nginx:1.13.10-alpine
-    ports:
-      - &quot;5000:80&quot;
&lt;/pre&gt;

&lt;p&gt;The front-end container, &lt;strong&gt;nginx&lt;/strong&gt; on this case, is connected to the global
traefik network.&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
     networks:
+      - traefik #add 1st so traefik performs better
       - frontend

+  traefik:
+    external:
+      name: traefik_global
&lt;/pre&gt;

&lt;p&gt;Only the &lt;strong&gt;nginx&lt;/strong&gt; container is announced to traefik, &lt;strong&gt;enable=true&lt;/strong&gt;, it
will respond to the &lt;strong&gt;site1.com&lt;/strong&gt; domain and will be available in the
local port &lt;strong&gt;80&lt;/strong&gt; (&lt;strong&gt;grep “listen” nginx/default/default.conf&lt;/strong&gt;), an
important step is to verify that the &lt;strong&gt;routers/services id&lt;/strong&gt; is unique, on
this case &lt;strong&gt;site1_com&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
+    labels:
+      - &quot;traefik.enable=true&quot;
+      - &quot;traefik.http.routers.site1_com.rule=Host(`site1.com`)&quot;
+      - &quot;traefik.http.services.site1_com.loadbalancer.server.port=80&quot;
&lt;/pre&gt;

&lt;p&gt;That’s all for a basic setup, I’ll add https/automatic SSL renovation in a
future article, let’s apply the patch:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ patch -p0 &amp;lt; docker-compose.site1.yml.patch
patching file docker-compose.site1.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;site2com&quot;&gt;site2.com&lt;/h2&gt;

&lt;p&gt;The second site is an API, really simple but also with its own
database and nginx containers.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git clone https://github.com/nebulosa/flask-api-rest site2.com
$ cd site2.com/
$ git checkout 9489597
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I’ll also create a copy of &lt;strong&gt;docker-compose-cherry.yml&lt;/strong&gt; and apply a patch similar
to the previous one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cp docker-compose-cherry.yml docker-compose.site2.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;site2.com/docker-compose.site2.yml.patch&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
--- docker-compose.site2.yml           2020-12-01 10:02:48.186590271 -0600
+++ docker-compose.site2.changes.yml   2020-12-01 10:03:30.940486004 -0600
@@ -17,14 +17,17 @@

   nginx:
     image: nginx:1.13.10-alpine
-    ports:
-      - &quot;5000:80&quot;
     volumes:
       - ./nginx:/etc/nginx/conf.d
     depends_on:
       - app
     networks:
+      - traefik #add 1st so traefik performs better
       - frontend
+    labels:
+      - &quot;traefik.enable=true&quot;
+      - &quot;traefik.http.routers.site2_com.rule=Host(`site2.com`)&quot;
+      - &quot;traefik.http.services.site2_com.loadbalancer.server.port=80&quot;

   app:
     build: .
@@ -46,3 +49,6 @@
     driver: bridge #or overlay in swarm mode
   backend:
     driver: bridge #or overlay in swarm mode
+  traefik:
+    external:
+      name: traefik_global
&lt;/pre&gt;

&lt;p&gt;As you notice, all changes are the same except for:&lt;/p&gt;

&lt;pre class=&quot;sh_diff&quot;&gt;
+    labels:
+      - &quot;traefik.enable=true&quot;
+      - &quot;traefik.http.routers.site2_com.rule=Host(`site2.com`)&quot;
+      - &quot;traefik.http.services.site2_com.loadbalancer.server.port=80&quot;
&lt;/pre&gt;

&lt;p&gt;This time, the routers/services id is &lt;strong&gt;site2_com&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ patch -p0 &amp;lt; docker-compose.site2.yml.patch
patching file docker-compose.site2.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;docker-compose-up&quot;&gt;docker-compose up&lt;/h2&gt;

&lt;p&gt;One previous step I’m going to do before launching everything is edit
&lt;strong&gt;/etc/hosts&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;...

127.0.0.1	site1.com
127.0.0.1	site2.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That will help me test the sites locally, ok, let’s end this tutorial:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd multisite/ &amp;amp;&amp;amp; docker-compose up -d
$ cd site1.com/ &amp;amp;&amp;amp; docker-compose -f docker-compose.site1.yml up -d
$ cd site2.com/ &amp;amp;&amp;amp; docker-compose -f docker-compose.site2.yml up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it!, a simple setup that is only limited by the amount of
&lt;strong&gt;RAM/CPU&lt;/strong&gt; in your machine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl site1.com
hello world from 7b7d6302-e162-3806-9595-17f854dd5b98

$ curl site2.com; echo
{&quot;Greetings&quot;: &quot;Hello World!&quot;}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://traefik.io/blog/traefik-2-0-docker-101-fc2893944b9d/&quot;&gt;https://traefik.io/blog/traefik-2-0-docker-101-fc2893944b9d/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>on the nature of daylight, una composición de max richter</title>
   <link href="https://javier.io/blog/es/2020/09/11/on-the-nature-of-daylight-una-composicion-de-max-richter.html"/>
   <published>2020-09-11T00:00:00+00:00</published>
   <updated>2020-09-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2020/09/11/on-the-nature-of-daylight-una-composicion-de-max-richter</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="music"/>
   
   
   
   <summary type="html">on the nature of daylight, una composición de max richter</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2020/09/11/on-the-nature-of-daylight-una-composicion-de-max-richter.html">&lt;h2 id=&quot;on-the-nature-of-daylight-una-composición-de-max-richter&quot;&gt;on the nature of daylight, una composición de max richter&lt;/h2&gt;

&lt;h6 id=&quot;11-sep-2020&quot;&gt;11 Sep 2020&lt;/h6&gt;

&lt;p&gt;Agradecimiento a &lt;a href=&quot;https://es.wikipedia.org/wiki/Max_Richter&quot;&gt;aquellos&lt;/a&gt; que son capaces a través de las artes de expresar nuestros sentimientos.&lt;/p&gt;

&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/4J8hV_8a8y0&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>python: sobrecarga de funciones, multimethod</title>
   <link href="https://javier.io/blog/es/2020/05/08/python-sobrecarga-de-funciones-multimethod.html"/>
   <published>2020-05-08T00:00:00+00:00</published>
   <updated>2020-05-08T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2020/05/08/python-sobrecarga-de-funciones-multimethod</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="python"/>
   
   
   
   <summary type="html">python: sobrecarga de funciones, multimethod</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2020/05/08/python-sobrecarga-de-funciones-multimethod.html">&lt;h2 id=&quot;python-sobrecarga-de-funciones-multimethod&quot;&gt;python: sobrecarga de funciones, multimethod&lt;/h2&gt;

&lt;h6 id=&quot;08-may-2020&quot;&gt;08 May 2020&lt;/h6&gt;

&lt;p&gt;Uno de los &lt;strong&gt;“defectos”&lt;/strong&gt; más molestos de python para mi es su falta de soporte
para sobrecargar funciones, es estos días con motivo de un nuevo proyecto me
tocó volver a revisar el tema, encontré algunas soluciones caseras, un nuevo
decorador ‘singledispatch’ y varias librerías, después de hacer algunos
experimentos por fin encontré una implementación lo suficientemente robusta
para zanjar el tema, lo comparto por si alguien trae el mismo hormigueo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://pypi.org/project/multimethod/&quot;&gt;https://pypi.org/project/multimethod/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/python-sobrecarga-de-funciones-multimethod-example.png&quot;&gt;&lt;img src=&quot;/assets/img/python-sobrecarga-de-funciones-multimethod-example.png&quot; alt=&quot;python sobrecarga de funciones multimethod example&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Listo, feliz multipass 😋&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/python-sobrecarga-de-funciones-multimethod.png&quot;&gt;&lt;img src=&quot;/assets/img/python-sobrecarga-de-funciones-multimethod.png&quot; alt=&quot;python sobrecarga de funciones multimethod&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>el amor, las mujeres y la vida</title>
   <link href="https://javier.io/blog/es/2020/02/28/el-amor-las-mujeres-y-la-vida.html"/>
   <published>2020-02-28T00:00:00+00:00</published>
   <updated>2020-02-28T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2020/02/28/el-amor-las-mujeres-y-la-vida</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="poetry"/>
   
   <category term="personal"/>
   
   
   
   <summary type="html">el amor, las mujeres y la vida</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2020/02/28/el-amor-las-mujeres-y-la-vida.html">&lt;h2 id=&quot;el-amor-las-mujeres-y-la-vida&quot;&gt;el amor, las mujeres y la vida&lt;/h2&gt;

&lt;h6 id=&quot;28-feb-2020&quot;&gt;28 Feb 2020&lt;/h6&gt;

&lt;p&gt;A través de la poesía nos reconocemos humanos y que mejor que el desamor para saborear estos versos.&lt;/p&gt;

&lt;p&gt;Todos son de &lt;a href=&quot;https://es.wikipedia.org/wiki/Mario_Benedetti&quot;&gt;Mario Benedetti&lt;/a&gt;, seleccionados de su antología homónima.&lt;/p&gt;

&lt;h3 id=&quot;es-tan-poco&quot;&gt;Es tan poco&lt;/h3&gt;
&lt;pre class=&quot;lyric&quot;&gt;
Lo que conoces es tan poco
lo que conoces de mí
lo que conoces son mis nubes
son mis silencios, son mis gestos
lo que conoces es la tristeza de mi casa vista de afuera
son los postigos de mi tristeza
el llamador de mi tristeza.

Pero no sabes nada
a lo sumo, piensas a veces
que es tan poco lo que conozco de ti
lo que conozco o sea tus nubes
o tus silencios, o tus gestos
lo que conozco es la tristeza de tu casa vista de afuera
son los postigos de tu tristeza
el llamador de tu tristeza.

Pero no llamas
Pero no llamo.
&lt;/pre&gt;

&lt;h3 id=&quot;ella-que-pasa&quot;&gt;Ella que pasa&lt;/h3&gt;
&lt;pre class=&quot;lyric&quot;&gt;
Paso que pasa
rostro que pasabas
qué más quieres, te miro
después me olvidaré
después y solo
solo y después
seguro que me olvido.

Paso que pasas
rostro que pasabas
qué más quieres, te quiero
te quiero sólo dos o tres minutos
para conocerte más no tengo tiempo.

Paso que pasas
rostro que pasabas
qué más quieres, ay no
ay no me tientes
que si nos tentamos
no nos podremos olvidar
adiós.
&lt;/pre&gt;

&lt;h3 id=&quot;ustedes-y-nosotros&quot;&gt;Ustedes y nosotros&lt;/h3&gt;
&lt;pre class=&quot;lyric&quot;&gt;
Ustedes cuando aman exigen bienestar
una cama de cedro y un colchón especial

Nosotros cuando amamos es fácil de arreglar
con sábanas qué bueno sin sábanas da igual

Ustedes cuando aman calculan interés
y cuando se desaman calculan otra vez.

Nosotros cuando amamos es como renacer
y si nos desamamos no la pasamos bien.

Ustedes cuando aman son de otra magnitud
hay fotos chismes prensa y el amor es un boom.

Nosotros cuando amamos es un amor común
tan simple y tan sabroso como tener salud.

Ustedes cuando aman consultan el reloj
porque el tiempo que pierden vale medio millón.

Nosotros cuando amamos sin prisa y con fervor
gozamos y nos sale barata la función.

Ustedes cuando aman al analista van
él es quien dictamina si lo hacen bien o mal.

Nosotros cuando amamos sin tanta cortedad
el subconsciente piola se pone a disfrutar.

Ustedes cuando aman exigen bienestar
una cama de cedro y un colchón especial

Nosotros cuando amamos es fácil de arreglar
con sábanas qué bueno sin sábanas da igual.
&lt;/pre&gt;

&lt;h3 id=&quot;hagamos-un-trato&quot;&gt;Hagamos un trato&lt;/h3&gt;
&lt;pre class=&quot;lyric&quot;&gt;
Compañera usted sabe puede contar conmigo
no hasta dos o hasta diez sino contar conmigo.

Si alguna vez advierte que la miro a los ojos
y una veta de amor reconoce en los míos
no alerte sus fusiles, ni piense qué delirio
a pesar de la veta o tal vez porque existe
usted puede contar conmigo.

Si otras veces me encuentra huraño sin motivo
no piense qué flojera, igual puede contar conmigo.

Pero hagamos un trato
yo quisiera contar con usted
es tan lindo saber que usted existe
uno se siente vivo y cuando digo esto
quiero decir contar
aunque sea hasta dos, aunque sea hasta cinco
no ya para que acuda presurosa en mi auxilio
sino para saber a ciencia cierta
que usted sabe que puede contar conmigo.
&lt;/pre&gt;

&lt;h3 id=&quot;a-la-izquierda-del-roble&quot;&gt;A la izquierda del roble&lt;/h3&gt;
&lt;pre class=&quot;lyric&quot;&gt;
No sé si alguna vez les ha pasado a ustedes
pero el Jardín Botánico siempre ha tenido
una agradable propensión a los sueños
a que los insectos suban por las piernas
y la melancolía baje por los brazos
hasta que uno cierra los puños y la atrapa
después de todo el secreto es mirar hacia arriba
y ver cómo las nubes se disputan las copas
y ver cómo los nidos se disputan los pájaros.

No sé si alguna vez les ha pasado a ustedes
pero puede ocurrir que de pronto uno advierta
uno de esos amores de tántalo y azar
que Dios no admite porque tiene celos.

Fíjense que él acusa con ternura
y ella se apoya contra la corteza
fíjense que él va tildando recuerdos
y ella se consterna misteriosamente
para mí que el muchacho está diciendo
lo que se dice a veces en el Jardín Botánico.

Vos lo dijiste, nuestro amor
fue desde siempre un niño muerto
sólo de a ratos parecía que iba a vivir
que iba a vencernos
pero los dos fuimos tan fuertes
que lo dejamos sin su sangre
sin su futuro, sin su cielo
un niño muerto sólo eso
maravilloso y condenado
quizá tuviera una sonrisa como la tuya
dulce y honda, quizá tuviera un alma triste
como mi alma, poca cosa
quizá aprendiera con el tiempo
a desplegarse a usar el mundo
pero los niños que así vienen
muertos de amor, muertos de miedo
tienen tan grande el corazón
que se destruyen sin saberlo.

Vos lo dijiste, nuestro amor
fue desde siempre un niño, un niño muerto.
&lt;/pre&gt;

&lt;h3 id=&quot;no-te-salves&quot;&gt;No te salves&lt;/h3&gt;
&lt;pre class=&quot;lyric&quot;&gt;
No te quedes inmóvil al borde del camino
no congeles el júbilo, no quieras con desgana
no te salves ahora, ni nunca, no te salves.

No te llenes de calma, no reserves del mundo sólo un rincón tranquilo
no dejes caer los párpados pesados como juicios
no te quedes sin labios, no te duermas sin sueño
no te pienses sin sangre, no te juzgues sin tiempo

Pero si pese a todo no puedes evitarlo
y congelas el júbilo y quieres con desgana
y te salvas ahora y te llenas de calma
y reservas del mundo sólo un rincón tranquilo
y dejas caer los párpados pesados como juicios
y te secas sin labios y te duermes sin sueño
y te piensas sin sangre y te juzgas sin tiempo
y te quedas inmóvil al borde del camino
y te salvas.

Entonces no te quedes conmigo.
&lt;/pre&gt;

&lt;h3 id=&quot;la-culpa-es-de-uno&quot;&gt;La culpa es de uno&lt;/h3&gt;

&lt;pre class=&quot;lyric&quot;&gt;
Quizá fue una hecatombe de esperanzas,
un derrumbe de algún modo previsto
pero mi tristeza sólo tuvo un sentido.

Todas mis intuiciones se asomaron para verme sufrir
y por cierto me vieron.

Hasta aquí había hecho y rehecho mis trayectos contigo
hasta aquí había apostado a inventar la verdad
pero tu encontraste la manera, una manera tierna
y a la vez implacable de desahuciar mi amor.

Con un solo pronóstico lo quitaste de los suburbios de tu vida posible
lo envolviste en nostalgias, lo cargaste por cuadras y cuadras
y despacito, sin que el aire nocturno lo advirtiera, ahí nomás lo dejaste,
a solas,
con su suerte, que no es mucha.

Creo que tienes razón
la culpa es de uno cuando no enamora
y no de los pretextos ni del tiempo.

Hace mucho, muchísimo que no me enfrentaba como anoche al espejo
y fue implacable como tu, mas no fue tierno.
Ahora estoy solo, francamente solo.

Siempre cuesta un poquito empezar a sentirse desgraciado

Antes de regresar a mis lóbregos cuarteles de invierno
con los ojos bien secos por si acaso
miro como te vas adentrando en la niebla y empiezo a recordarte.
&lt;/pre&gt;

&lt;h3 id=&quot;soledades&quot;&gt;Soledades&lt;/h3&gt;
&lt;pre class=&quot;lyric&quot;&gt;
Ellos tienen razón
esa felicidad al menos con mayúscula, no existe
ah pero si existiera con minúscula
sería semejante a nuestra breve presoledad

Después de la alegría, viene la soledad
después de la plenitud, viene la soledad
después del amor, viene la soledad.

Ya sé que es una pobre deformación
pero lo cierto es que en ese durable minuto
uno se siente solo en el mundo.

Después de la alegría, después de la plenitud
después del amor, viene la soledad
conforme, ¿pero qué vendrá después de la soledad?

A veces no me siento tan solo
si imagino, mejor dicho si sé
que más allá de mi soledad y de la tuya
otra vez estas vos
aunque sea preguntándote a solas
que vendrá después de la soledad.
&lt;/pre&gt;

&lt;p class=&quot;post-dedication&quot;&gt;
Hijos, nietos, vuelvan a estos versos cuando les haga sentido.
Si tienen la oportunidad de enamorarse, háganlo — siempre vale la pena, incluso cuando se pierde.
&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>compartiendo archivos cifrados x internet</title>
   <link href="https://javier.io/blog/es/2019/08/05/compartir-archivos-cifrados-x-internet.html"/>
   <published>2019-08-05T00:00:00+00:00</published>
   <updated>2019-08-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2019/08/05/compartir-archivos-cifrados-x-internet</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="security"/>
   
   
   
   <summary type="html">compartiendo archivos cifrados x internet</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2019/08/05/compartir-archivos-cifrados-x-internet.html">&lt;h2 id=&quot;compartiendo-archivos-cifrados-x-internet&quot;&gt;compartiendo archivos cifrados x internet&lt;/h2&gt;

&lt;h6 id=&quot;05-aug-2019&quot;&gt;05 Aug 2019&lt;/h6&gt;

&lt;p&gt;Un archivo cifrado es aquel que ha sido ofuscado mediante algoritmos públicos,
sólo las personas con la llave secreta pueden acceder a ellos.&lt;/p&gt;

&lt;h3 id=&quot;cifrar&quot;&gt;Cifrar&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ gpg -v --cipher-algo AES256 --symmetric IMAGEN.PNG
# pregunta contraseña 2 veces
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Un archivo &lt;strong&gt;IMAGEN.PNG.gpg&lt;/strong&gt; es generado, este es el que debemos pasar al
contacto junto con la contraseña&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OJO: En el ejemplo anterior se ha usado una IMAGEN.PNG pero puede usarse con
cualquier tipo de archivo&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;descifrar&quot;&gt;Descifrar&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ gpg -v --decrypt IMAGEN.PNG.gpg &amp;gt; IMAGEN.PNG
# pregunta contraseña 2 veces
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Un archivo &lt;strong&gt;IMAGEN.PNG&lt;/strong&gt; es generado el cual puede abrirse con cualquier visor
de imagenes.&lt;/p&gt;

&lt;h2 id=&quot;seguridad-adicional-estenografía&quot;&gt;Seguridad adicional, estenografía&lt;/h2&gt;

&lt;p&gt;La esteneografía es la técnica de esconder mensajes / datos dentro de otros,
por ejemplo almacenar archivos cifrados dentro de canciones mp3.&lt;/p&gt;

&lt;h3 id=&quot;instalación&quot;&gt;Instalación&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ wget https://raw.githubusercontent.com/javier-lopez/learn/master/sh/dockerized/hideme.dockerized
$ chmod +x hideme.dockerized
$ sudo mv hideme.dockerized /usr/bin/hideme.dockerized
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;esconder-datos-en-archivos-de-música&quot;&gt;Esconder datos en archivos de música&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ hideme.dockerized ARCHIVO.MP3 IMAGEN.PNG.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Un archivo &lt;strong&gt;output.mp3&lt;/strong&gt; es generado, este es el archivo que debemos pasar al
contacto junto con la contraseña del archivo &lt;strong&gt;IMAGEN.PNG.gpg&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;descubrir-datos-en-archivos-de-música&quot;&gt;Descubrir datos en archivos de música&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ hideme.dockerized output.mp3 -f
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Un archivo &lt;strong&gt;output.U&lt;/strong&gt; es generado, este debe renombrarse al archivo original, por ejemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mv output.U IMAGEN.PNG.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Y descifrarse en caso de ser necesario:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gpg -v --decrypt IMAGEN.PNG.gpg &amp;gt; IMAGEN.PNG
# pregunta contraseña 2 veces
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Listo, feliz transmisión de secretos 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>lvm cheatsheet</title>
   <link href="https://javier.io/blog/en/2019/03/16/lvm-cheatsheet.html"/>
   <published>2019-03-16T00:00:00+00:00</published>
   <updated>2019-03-16T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2019/03/16/lvm-cheatsheet</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">lvm cheatsheet</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2019/03/16/lvm-cheatsheet.html">&lt;h2 id=&quot;lvm-cheatsheet&quot;&gt;lvm cheatsheet&lt;/h2&gt;

&lt;h6 id=&quot;16-mar-2019&quot;&gt;16 Mar 2019&lt;/h6&gt;

&lt;p&gt;There are certain commands I keep forgetting no matter how many times
I try them, &lt;code&gt;ln&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt; and the reason for this post, &lt;code&gt;LVM&lt;/code&gt;.
So, here goes a quick how-to for my future me.&lt;/p&gt;

&lt;h3 id=&quot;basics&quot;&gt;Basics&lt;/h3&gt;

&lt;p&gt;In order to understand &lt;strong&gt;LVM&lt;/strong&gt; it’s required to have a clear picture of its components.&lt;/p&gt;

&lt;h2 id=&quot;physical-volume-pv&quot;&gt;Physical Volume (PV)&lt;/h2&gt;

&lt;p&gt;A PV is &lt;strong&gt;any block device&lt;/strong&gt; that can be used as storage, eg: &lt;strong&gt;/dev/sda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/lvm_pv.png&quot;&gt;&lt;img src=&quot;/assets/img/lvm_pv.png&quot; alt=&quot;lvm pv&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;volume-group-vg&quot;&gt;Volume Group (VG)&lt;/h2&gt;

&lt;p&gt;A VG is a group of at least one PV, it usually contains several, thought.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/lvm_vg.png&quot;&gt;&lt;img src=&quot;/assets/img/lvm_vg.png&quot; alt=&quot;lvm vg&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;logical-volume-lv&quot;&gt;Logical Volume (LV)&lt;/h2&gt;

&lt;p&gt;A LV is a portion (partition) of a VG.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/lvm_lv.png&quot;&gt;&lt;img src=&quot;/assets/img/lvm_lv.png&quot; alt=&quot;lvm lv&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-to-set-up-multiple-hard-drives-as-one-volume&quot;&gt;How to set up multiple hard drives as one volume?&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Define /dev/sda, /dev/sdb2 and /dev/sdc3 as PVs&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo pvcreate /dev/sda /dev/sdb2 /dev/sdc3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Create a Volume Group (VG) out of three just defined PVs&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo vgcreate vg_name /dev/sda /dev/sdb2 /dev/sdc3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Create a Logical Volume (LV) out of the just defined VG&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo lvcreate -l 100%FREE -n lv_name vg_name
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Done!, now it can be formated and mounted as a normal HD, eg:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo mkfs.ext4 /dev/vg_name/lv_name
$ echo &apos;/dev/vg_name/lv_name /mount_point ext4 defaults 0 0&apos; | sudo tee -a /etc/fstab
$ sudo mount -a
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;how-to-mount-a-previously-defined-lvm-volume&quot;&gt;How to mount a previously defined LVM volume&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Recreate /dev/ LVM partitions&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo vgchange -ay
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Done!, now it can be formated and mounted as a normal HD, eg:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo mkfs.ext4 /dev/vg_name/lv_name
$ echo &apos;/dev/vg_name/lv_name /mount_point ext4 defaults 0 0&apos; | sudo tee -a /etc/fstab
$ sudo mount -a
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;how-to-extend-a-full-lvm-volume&quot;&gt;How to extend a full LVM volume&lt;/h3&gt;

&lt;p&gt;First, you need to extend the volume or block in the underlaying VM/Hardware, once done:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo pvresize /dev/sda #or any other modified device
$ sudo lvextend -l +100%FREE /dev/vg_name/lv_name 
$ sudo resize2fs /dev/vg_name/lv_name  #for ext3/4
$ sudo xfs_growfs -d /dev/vg_name/lv_name #for xfs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it!, I’ll keep adding &lt;strong&gt;LVM&lt;/strong&gt; recipes as I find them, happy storing,
😊&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://askubuntu.com/questions/7002/how-to-set-up-multiple-hard-drives-as-one-volume&quot;&gt;https://askubuntu.com/questions/7002/how-to-set-up-multiple-hard-drives-as-one-volume&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-lvm-to-manage-storage-devices-on-ubuntu-16-04&quot;&gt;https://www.digitalocean.com/community/tutorials/how-to-use-lvm-to-manage-storage-devices-on-ubuntu-16-04&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.inittab.org/administracion-sistemas/lvm-para-torpes-i/&quot;&gt;https://blog.inittab.org/administracion-sistemas/lvm-para-torpes-i/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>how to keep your git fork up to date</title>
   <link href="https://javier.io/blog/en/2018/12/29/how-to-keep-your-github-fork-up-to-date.html"/>
   <published>2018-12-29T00:00:00+00:00</published>
   <updated>2018-12-29T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2018/12/29/how-to-keep-your-github-fork-up-to-date</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">how to keep your git fork up to date</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2018/12/29/how-to-keep-your-github-fork-up-to-date.html">&lt;h2 id=&quot;how-to-keep-your-git-fork-up-to-date&quot;&gt;how to keep your git fork up to date&lt;/h2&gt;

&lt;h6 id=&quot;29-dec-2018&quot;&gt;29 Dec 2018&lt;/h6&gt;

&lt;p&gt;When it comes to the situation that you fork a repository and you contribute to
it, then it could happen that your fork and the upstream are not in sync
anymore. So the goal is, that you get a current version of the upstream
repository and then you can merge the new changes into your fork, right? Okay!
Let’s get started.&lt;/p&gt;

&lt;h3 id=&quot;1-create-a-fork&quot;&gt;1. Create a Fork&lt;/h3&gt;

&lt;p&gt;A fork &lt;a href=&quot;https://help.github.com/articles/fork-a-repo/&quot;&gt;is a copy of someone others repository in your
account&lt;/a&gt;, which can be an
independent development project, This tutorial is for GitHub but works for any
other git hosted platform, like Bitbucket or GitLab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/fork_button.jpg&quot;&gt;&lt;img src=&quot;/assets/img/fork_button.jpg&quot; alt=&quot;fork button&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;2-clone-the-fork&quot;&gt;2. Clone the fork&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ git clone git@github.com:your-user/your-fork.git
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;3-add-the-upstream&quot;&gt;3. Add the upstream&lt;/h3&gt;

&lt;p&gt;Now we should add the “upstream” branch. You can call it however you want.
Upstream is just best practice.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git remote add upstream git://github.com/original-author/original-project.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you now have a look at your remote urls, you should see the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git remote -v
origin https://github.com/your-user/your-fork (fetch)
origin https://github.com/your-user/your-fork (push)
upstream https://github.com/original-author/original-project (fetch)
upstream https://github.com/original-author/original-project (push)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;4-keep-the-upstream-updated&quot;&gt;4. Keep the upstream updated&lt;/h3&gt;

&lt;p&gt;Now as we have both urls tracked, we can update the two sources independently. With&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git fetch upstream
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;5-mergerebase-your-work-with-the-upstream-repository&quot;&gt;5. Merge/Rebase your work with the upstream repository&lt;/h3&gt;

&lt;p&gt;Then you can just merge the changes.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git merge upstream/master master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With that, you merge the latest changes from the master branch of the upstream
into your local master branch. If you like, you can also use git pull, which is
nothing else than fetching and merging in one step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; The best way in my eyes is, to rebase because that fetches the
latest changes of the upstream branch and replay your work on top of that. Here
is, how it works:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git rebase upstream/master
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;6-push-your-changes-online&quot;&gt;6. Push your changes online&lt;/h3&gt;

&lt;p&gt;Finally, you can push your changes so others can benefit&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git push
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it, happy coding, 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>carteras fuera de línea para criptomonedas</title>
   <link href="https://javier.io/blog/es/2018/11/15/carteras-fuera-de-linea-para-criptomonedas.html"/>
   <published>2018-11-15T00:00:00+00:00</published>
   <updated>2018-11-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2018/11/15/carteras-fuera-de-linea-para-criptomonedas</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="security"/>
   
   <category term="docker"/>
   
   
   
   <summary type="html">carteras fuera de línea para criptomonedas</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2018/11/15/carteras-fuera-de-linea-para-criptomonedas.html">&lt;h2 id=&quot;carteras-fuera-de-línea-para-criptomonedas&quot;&gt;carteras fuera de línea para criptomonedas&lt;/h2&gt;

&lt;h6 id=&quot;15-nov-2018&quot;&gt;15 Nov 2018&lt;/h6&gt;

&lt;p&gt;Las carteras para criptomonedas son piezas de software que dan acceso a los
&lt;a href=&quot;https://es.wikipedia.org/wiki/Cadena_de_bloques&quot;&gt;blockchains&lt;/a&gt; de Bitcoin,
Ethereum, etc, &lt;strong&gt;cada criptomoneda tiene su propia cartera&lt;/strong&gt;, asi una cartera
para Bitcoin solo funcionará para ese protocolo. Y si se tienen &lt;code&gt;N&lt;/code&gt;
criptomonedas, se requerirán la misma cantidad de carteras para administrar los
fondos.&lt;/p&gt;

&lt;p&gt;También existen programas que pueden acceder a varios protocolos al mismo
tiempo, las multicarteras, sin embargo esos programas están desarrollados por
terceras partes, por lo que tienden a ser menos confiables, por tal razón en
este artículo se hará énfasis en la utilización de las carteras oficiales.&lt;/p&gt;

&lt;p&gt;Para usar una cartera se requieren dos cosas, una clave pública y una privada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clave pública&lt;/strong&gt;: ésta es la dirección de la cartera.  Es muy parecido a un
número de cuenta bancaria, ya que sólo se puede usar para enviar dinero a una
cuenta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clave privada&lt;/strong&gt;: ésta es la información que permite controlar los fondos de
la cuenta. Por lo cual debe mantenerse 100% secreta y segura, &lt;strong&gt;si se pierde
esta clave se pierden los fondos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OJO&lt;/strong&gt;: Una llave pública puede obtenerse a partir de una llave privada, pero
al revés no. Por lo que en teoría sólo se podría almacenar la llave privada.
Sin embargo, la llave pública a menudo es útil para solicitar fondos a terceros
sin arriesgarse a comprometer la llave privada, por lo que es conveniente tener
ambas a la mano.&lt;/p&gt;

&lt;p&gt;Cuando los fondos se mantienen en un exchange, como &lt;a href=&quot;&quot;&gt;bitso&lt;/a&gt;, &lt;a href=&quot;&quot;&gt;binance&lt;/a&gt;,
etc, dichos sitios son los únicos que conocen ambas llaves, de ahi que puedan
comprometerse los recursos si el sitio es hackeado, o que el exchange pueda
tomar decisiones unilaterales para congelar cuentas o mantener los recursos.&lt;/p&gt;

&lt;p&gt;La razon anterior es suficiente para tener los fondos en carteras
independientes cuando se trate de sumas considerables.&lt;/p&gt;

&lt;h3 id=&quot;wallet&quot;&gt;wallet&lt;/h3&gt;

&lt;p&gt;Debido a mi pérfil técnico y a la variedad de criptomonedas que manejo, he
generado un script que me permite interactuar con las carteras de varios
protocolos de forma conveniente, incluidos, BTC, ETH, XRP, LTC, NEO, etc. Así
que será el método que describa. &lt;strong&gt;OJO: A menos que me conozca personalmente,
sugiero fuertemente que revise el código fuente a detalle para determinar su
confiabilidad.&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wget https://raw.githubusercontent.com/javier-lopez/learn/master/sh/tools/wallet
$ chmod +x wallet &amp;amp;&amp;amp; sudo mv wallet /usr/bin/wallet
$ wallet -h
Usage: wallet ARCHIVE
Dockerized [BTC|BCC|BTCP|LTC|NEO|ETH|XRP|ADA] thin client launcher.

Options:

  -U, --update    update this program to latest version
  -V, --version   display version
  -h, --help      show this message and exit

Examples:

  $ wallet Electrum-3.2.2.tar.gz            #BTC
  $ wallet Electrum-LTC-3.1.3.1.tar.gz      #LTC
  $ wallet Electrum-BTCP-1.1.1.tar.gz       #BTCP
  $ wallet ElectronCash-3.3.1.tar.gz        #BCC
  $ wallet Neon-0.2.6-x86_64.Linux.AppImage #NEO
  $ wallet etherwallet-v3.21.03.zip         #ETH
  $ wallet minimalist-ripple-client.html    #XRP
  $ wallet daedalus-0.11.0-cardano.exe      #ADA
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;El script anterior requiere &lt;a href=&quot;https://es.wikipedia.org/wiki/Ubuntu&quot;&gt;Ubuntu Linux&lt;/a&gt;,
&lt;a href=&quot;https://es.wikipedia.org/wiki/Docker_(software)&quot;&gt;Docker&lt;/a&gt; y la cartera del
protocolo con el que se desee interactuar, por ejemplo para Bitcoin se
requerirá &lt;a href=&quot;https://electrum.org&quot;&gt;Electrum-3.2.2.tar.gz&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;bitcoin-btc&quot;&gt;Bitcoin, BTC&lt;/h3&gt;

&lt;p&gt;Teniendo el script y la cartera, se puede comenzar a interactuar con el
blockchain, esto generalmente se hace para dos cosas, generar nuevas
cuentas, o gestionar existentes.&lt;/p&gt;

&lt;h2 id=&quot;generar-nueva-cuenta&quot;&gt;Generar nueva cuenta&lt;/h2&gt;

&lt;p&gt;Cada vez que se crea una nueva cuenta, en realidad se espera generar un par de
llaves (pública/privada) de dicha criptomoneda, por lo que este serán los datos
que estaremos búscando y almacenando. Para lanzar la cartera de BTC, se
ejecuta:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wallet Electrum-3.2.2.tar.gz #BTC
Verify the archive before continuing!!!

SHA256: 69cc3eaef8cc88e92730f3f38850a83e66ffd51d9aa26364f35fd45d1cedaabb
SHA512: 32c4a24c2d3e2e38b9d66f6102176533a991b1c1fd25173bcd3bdd...3c87f15

Waiting 7 seconds.., press Ctrl-C to cancel
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Es muy importante verificar que las sumatorias concuerden con las especificadas
por el proyecto (SHA256/SHA512), de lo contrario, esto indicaría modificaciones
(generalmente maliciosas) en los binarios.&lt;/p&gt;

&lt;p&gt;La primera vez que se ejecute el script, se generará un entorno seguro /
reutilizable que permitirá lanzar las carteras soportadas. Este proceso puede
demorar hasta un par de hrs dependiendo la velocidad de internet, y sólo se
hace una vez.&lt;/p&gt;

&lt;p&gt;Verificados los binarios se muestra la interfaz inicial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-1.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-1.png&quot; alt=&quot;wallet btc 1&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Las primeras pantallas muestran opciones de conexión y preferencias que
requeririan sus propios artículos, por el momento utilizaremos las opciones por
defecto para hacer el proceso tan rápido y eficiente como sea posible.&lt;/p&gt;

&lt;p&gt;En la primera pantalla se selecciona &lt;strong&gt;Auto connect&lt;/strong&gt;, y se da &lt;strong&gt;siguiente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-2.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-2.png&quot; alt=&quot;wallet btc 2&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En la segunda se pregunta por la ubicación de los datos de la cartera, se dejará
en &lt;strong&gt;default_wallet&lt;/strong&gt; y se da &lt;strong&gt;siguiente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-3.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-3.png&quot; alt=&quot;wallet btc 3&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En la tercera, se pregunta por el tipo de cartera, la cartera estándar estará
bien, se da &lt;strong&gt;siguiente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-4.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-4.png&quot; alt=&quot;wallet btc 4&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ahora se llega a la parte donde se elige si se desea generar una nueva cuenta o
abrir una existente. Para abrir una nueva cuenta se selecciona &lt;strong&gt;Create a new seed&lt;/strong&gt;
y se da &lt;strong&gt;siguiente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-5.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-5.png&quot; alt=&quot;wallet btc 5&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se selecciona el formato de las llaves , &lt;strong&gt;standard&lt;/strong&gt; y se da &lt;strong&gt;siguiente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-6.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-6.png&quot; alt=&quot;wallet btc 6&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ahora la cartera genera la &lt;strong&gt;llave privada&lt;/strong&gt;, &lt;strong&gt;OJO&lt;/strong&gt;, hay que tener mucho
cuidado con este dato, hay que mantenerlo privado y guardarlo en un lugar
seguro. Si se pierde u olvida los fondos se vuelven irrecuperables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-7.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-7.png&quot; alt=&quot;wallet btc 7&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para asegurarse que el dato ha sido almacenado, en la siguiente
pantalla se pregunta por la llave privada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-8.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-8.png&quot; alt=&quot;wallet btc 8&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ahora, se pregunta por una contraseña para cifrar de manera interna la
información recien generada, debido a la forma en que se abre la cartera no es
necesario establecer una, el entorno elimina los archivos temporales al
finalizar la sesión.&lt;/p&gt;

&lt;p&gt;En su lugar, sera pertinente almacenar la &lt;strong&gt;llave privada&lt;/strong&gt; en un archivo
cifrado y mantener ese archivo en un lugar seguro. Personalmente mantengo mis
llaves privadas en un archivo .txt y lo cifro con
&lt;a href=&quot;https://es.wikipedia.org/wiki/GNU_Privacy_Guard&quot;&gt;GPG&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-9.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-9.png&quot; alt=&quot;wallet btc 9&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finalmente ha llegado el momento de interactuar con la nueva cuenta, desde esta
interfaz se puede consultar el saldo, enviar y recibir bitcoins. Para ver la llave
pública se va a la pestaña &lt;code&gt;recibir&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-9.1.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-9.1.png&quot; alt=&quot;wallet btc 9.1&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Listo!, ahora se tiene una nueva cuenta BTC.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Llave pública: 1JTg8e3yfCBbk22...
Llave privada: hub leopard broken neutral trash ...
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;gestionar-cuenta-existente&quot;&gt;Gestionar cuenta existente&lt;/h2&gt;

&lt;p&gt;Si ya se cuenta con una llave privada anterior (la frase de 12 palabras) se
continua desde el 4to paso y esta vez se selecciona &lt;strong&gt;I already have a seed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-10.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-10.png&quot; alt=&quot;wallet btc 10&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se introduce la llave privada y se da &lt;strong&gt;siguiente&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-11.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-11.png&quot; alt=&quot;wallet btc 11&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se preguntará por una contraseña para cifrar los datos temporales, no es
necesario, puesto que el script eliminará esos datos al cerrar la cartera. Se
da &lt;strong&gt;siguiente&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-12.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-12.png&quot; alt=&quot;wallet btc 12&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ya se puede interactuar con la cuenta para enviar o recibir BTC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-btc-13.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-btc-13.png&quot; alt=&quot;wallet btc 13&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;neo&quot;&gt;Neo&lt;/h3&gt;

&lt;p&gt;El proceso es similar para otra carteras, en cada caso, solo variará la
cartera, y la interfaz gráfica, veamos el caso de NEO.&lt;/p&gt;

&lt;h2 id=&quot;generar-nueva-cuenta-1&quot;&gt;Generar nueva cuenta&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ wallet Neon-0.2.6-x86_64.Linux.AppImage

Verify the archive before continuing!!!

SHA256: 78276848a23d89db4d56965d94784c710d4281ca8085cfd0644644e08d1074bf
SHA512: 3bf87818885128ad74cd018fd2e437e32f274a5974b473b74bad84...9b5c548
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Después de verificar las sumatorias aparece la interfaz gráfica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-neo-1.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-neo-1.png&quot; alt=&quot;wallet neo 1&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aunque luce diferente, en realidad provee las mismas opciones. Para generar una
nueva cuenta se selecciona &lt;strong&gt;Create a new wallet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-neo-2.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-neo-2.png&quot; alt=&quot;wallet neo 2&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La cartera de NEO nos obliga a especificar una contraseña para cifrar los datos
temporales de la cartera, pero esa contraseña no es importante recordarla, se
puede poner una temporal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-neo-3.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-neo-3.png&quot; alt=&quot;wallet neo 3&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Una vez hecho, se proveen las llaves públicas y privadas.&lt;/p&gt;

&lt;p&gt;Listo!, ahora también se tiene una nueva cuenta NEO.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Llave pública: AaUZif7n6FiVPyH...
Llave privada: KwuHYFeuJucZz94KanqaqaRkEi71mRdQbPZ...
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;gestionar-cuenta-existente-1&quot;&gt;Gestionar cuenta existente&lt;/h2&gt;

&lt;p&gt;Si ya se cuenta con una llave privada de NEO anterior se selecciona la opción
&lt;strong&gt;Login using a private key&lt;/strong&gt; en el menú principal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-neo-1.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-neo-1.png&quot; alt=&quot;wallet neo 1&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se introduce la clave y se hace clic en &lt;strong&gt;Login&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-neo-10.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-neo-10.png&quot; alt=&quot;wallet neo 10&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Listo, ahora se pueden enviar y recibir Neo’s y criptomonedas compatibles, como
GAS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/wallet-neo-11.png&quot;&gt;&lt;img src=&quot;/assets/img/wallet-neo-11.png&quot; alt=&quot;wallet neo 11&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Listo, feliz manejo de sus finanzas 😋.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/wallet&quot;&gt;https://github.com/javier-lopez/learn/blob/master/sh/tools/wallet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>say hi to react through docker integration</title>
   <link href="https://javier.io/blog/en/2018/11/10/say-hi-to-react-through-docker-integration.html"/>
   <published>2018-11-10T00:00:00+00:00</published>
   <updated>2018-11-10T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2018/11/10/say-hi-to-react-through-docker-integration</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="docker"/>
   
   
   
   <summary type="html">say hi to react through docker integration</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2018/11/10/say-hi-to-react-through-docker-integration.html">&lt;h2 id=&quot;say-hi-to-react-through-docker-integration&quot;&gt;say hi to react through docker integration&lt;/h2&gt;

&lt;h6 id=&quot;10-nov-2018&quot;&gt;10 Nov 2018&lt;/h6&gt;

&lt;p&gt;I’ve started learning &lt;a href=&quot;https://reactjs.org/&quot;&gt;react&lt;/a&gt; and there is no way I
install &lt;code&gt;npm/yarn/create-react-app&lt;/code&gt; or any non sense just to develop single
pages.&lt;/p&gt;

&lt;p&gt;Therefore here are some instructions to encapsulate everything within docker
containers.&lt;/p&gt;

&lt;h3 id=&quot;bootstrapping&quot;&gt;Bootstrapping&lt;/h3&gt;

&lt;p&gt;Being react the complex stack of software it’s, it requires &lt;code&gt;create-react*&lt;/code&gt;
scripts to bootstrap projects. Therefore the first step will be to create a
minimal container with such tools:&lt;/p&gt;

&lt;h2 id=&quot;dockerfile&quot;&gt;Dockerfile&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;FROM node:alpine
RUN yarn global add create-react-app create-react-native-app react-native-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let’s call this container &lt;code&gt;bootstrap-react&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ docker build . -t bootstrap-react
&lt;/pre&gt;

&lt;p&gt;Then we can bootstrap &lt;code&gt;react/react-native&lt;/code&gt; projects as usual:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ docker run -it --rm --user &quot;$(id -u):$(id -g)&quot; \
      -v &quot;${PWD}&quot;:/usr/src/app -w /usr/src/app   \
      bootstrap-react                            \
      create-react-app my-new-react-project
&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;my-new-react-project&lt;/code&gt; folder contains a bunch of files required to start
hacking away:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ tree my-new-react-project/ | head
┬
├── .gitignore
├── node_modules
│   ├── abab
│   │   ├── CHANGELOG.md
├── package.json
├── public
│   ├── index.html
├── src
    ├── App.css
    ├── App.js
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;dockerizing-new-project&quot;&gt;Dockerizing new project&lt;/h3&gt;

&lt;p&gt;Now, wouldn’t be cool if every person could replicate the project with a single
step?, let’s add some more magic.&lt;/p&gt;

&lt;h2 id=&quot;docker-composeyml&quot;&gt;docker-compose.yml&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;version: &apos;3.4&apos;

services:
  app:
    image: node:alpine
    volumes:
      - .:/usr/src/app
    working_dir: /usr/src/app
    command: sh -c &quot;yarn &amp;amp;&amp;amp; yarn start&quot;
    ports:
      - &quot;3000:3000&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it!, now it can be launched and accessed through
&lt;a href=&quot;http://localhost:3000&quot;&gt;http://localhost:3000&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker-compose up
app_1  | You can now view my-new-react-project in the browser.
app_1  |
app_1  |   Local:            http://localhost:3000/
app_1  |   On Your Network:  http://172.18.0.2:3000/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/react.png&quot;&gt;&lt;img src=&quot;/assets/img/react.png&quot; alt=&quot;react&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sweet!, the autoreloading is working, so we can start modifying
files and the changes will show up instantly.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vim src/App.js
#some changes later ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/react-hello-world.png&quot;&gt;&lt;img src=&quot;/assets/img/react-hello-world.png&quot; alt=&quot;react hello world&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you enjoyed the process but still don’t want to go thought all the steps,
feel free to grab the &lt;a href=&quot;https://github.com/javier-lopez/docker-react-hello-world&quot;&gt;docker-react-hello-world&lt;/a&gt;
template as your starting point.&lt;/p&gt;

&lt;p&gt;That’s it, happy coding, 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>removing passwords from git repositories</title>
   <link href="https://javier.io/blog/en/2018/10/04/remove-passwords-from-git-repository.html"/>
   <published>2018-10-04T00:00:00+00:00</published>
   <updated>2018-10-04T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2018/10/04/remove-passwords-from-git-repository</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">removing passwords from git repositories</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2018/10/04/remove-passwords-from-git-repository.html">&lt;h2 id=&quot;removing-passwords-from-git-repositories&quot;&gt;removing passwords from git repositories&lt;/h2&gt;

&lt;h6 id=&quot;04-oct-2018&quot;&gt;04 Oct 2018&lt;/h6&gt;

&lt;p&gt;Here’s how to remove a password from any file, in all revisions, in a git repository:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git filter-branch --tree-filter \
    &quot;find . -type f -exec sed -i -e &apos;s/password/XXX/g&apos; {} \;&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Another handy one, deleting all the lines containing &lt;strong&gt;word&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git filter-branch --tree-filter \
    &quot;find . -type f -exec sed -i -e &apos;/word/d&apos; {} \;&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally, the classic remove file with sensitive data:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git filter-branch --force --index-filter \
    &apos;git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA&apos; \
    --prune-empty --tag-name-filter cat -- --all
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, to force push your changes to a remote repository:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git push -f
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it, happy safe coding, 😊&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.davidverhasselt.com/git-how-to-remove-your-password-from-a-repository/&quot;&gt;http://www.davidverhasselt.com/git-how-to-remove-your-password-from-a-repository/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>package python scripts and dependencies in single files with pex</title>
   <link href="https://javier.io/blog/en/2018/10/02/package-python-script-and-dependencies-in-single-file-with-pex.html"/>
   <published>2018-10-02T00:00:00+00:00</published>
   <updated>2018-10-02T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2018/10/02/package-python-script-and-dependencies-in-single-file-with-pex</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="python"/>
   
   <category term="docker"/>
   
   
   
   <summary type="html">package python scripts and dependencies in single files with pex</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2018/10/02/package-python-script-and-dependencies-in-single-file-with-pex.html">&lt;h2 id=&quot;package-python-scripts-and-dependencies-in-single-files-with-pex&quot;&gt;package python scripts and dependencies in single files with pex&lt;/h2&gt;

&lt;h6 id=&quot;02-oct-2018&quot;&gt;02 Oct 2018&lt;/h6&gt;

&lt;p&gt;So you want to create a pex that packages your script and its dependencies? Ok,
first to make our script! call it &lt;strong&gt;my-script.py&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import requests

if __name__ == &apos;__main__&apos;:
  req = requests.get(&quot;https://raw.githubusercontent.com/pantsbuild/pex/master/README.rst&quot;)
  print req.text.split(&quot;\n&quot;)[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;requirements.txt&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;requests
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, it’s time to package it!:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pex -o my-script.pex -D . -r requirements.txt -e my-script
  my-script.pex
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Done, but wait, are you too lazy to even download pex/pip?, try docker:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#FROM python:3.6.4
FROM ubuntu:16.04

RUN  apt-get update &amp;amp;&amp;amp; apt-get install -y libev-dev python-pip

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY requirements.txt /usr/src/app/
RUN  pip install --no-cache-dir -r requirements.txt

COPY . /usr/src/app

CMD [ &quot;python&quot;, &quot;my-script.py&quot; ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And then:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker build -t pex-builder .
$ docker run -v &quot;$PWD:/usr/src/app&quot; pex-builder \
    pex -o my-script.pex -D . -r requirements.txt -e my-script
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Done, now we have a (relative) portable way of distributing and running our scripts:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./my-script.pex
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it, happy packaging 😊&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.pither.com/simon/blog/2018/09/18/how-build-portable-executable-single-python-script&quot;&gt;https://www.pither.com/simon/blog/2018/09/18/how-build-portable-executable-single-python-script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>talks: infraestructura como codigo</title>
   <link href="https://javier.io/blog/es/2018/09/11/talks-infraestructura-como-codigo.html"/>
   <published>2018-09-11T00:00:00+00:00</published>
   <updated>2018-09-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2018/09/11/talks-infraestructura-como-codigo</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="talks"/>
   
   <category term="devops"/>
   
   <category term="vlide"/>
   
   
   
   <summary type="html">talks: infraestructura como codigo</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2018/09/11/talks-infraestructura-como-codigo.html">&lt;h2 id=&quot;talks-infraestructura-como-codigo&quot;&gt;talks: infraestructura como codigo&lt;/h2&gt;

&lt;h6 id=&quot;11-sep-2018&quot;&gt;11 Sep 2018&lt;/h6&gt;

&lt;p&gt;Entre diciembre de 2017 y septiembre de 2018 di una serie de charlas en el
meetup &lt;a href=&quot;https://www.meetup.com/Infraestructura-como-codigo&quot;&gt;Infraestructura como Código&lt;/a&gt;
(Ciudad de México), recorriendo el stack DevOps de arriba hacia abajo:
primero provisionar máquinas, luego contenedores, luego configurarlas, y
al final la pieza que sostiene todo lo demás — la shell. Las sesiones se
transmitieron en vivo por hangouts; tres quedaron grabadas y están
embebidas en su bloque.&lt;/p&gt;

&lt;p&gt;Todas se presentaron desde la terminal con
&lt;a href=&quot;https://github.com/javier-lopez/vlide.vim&quot;&gt;vlide.vim&lt;/a&gt;: cada deck abre con
su portada ASCII de arte espacial, pide una sesión de tmux (los slides
abren panes y les mandan keystrokes para correr sus propias demos), y
cierra con un crawl de créditos estilo Star Wars — campo de estrellas
incluido — escrito en vimscript.&lt;/p&gt;

&lt;h3 id=&quot;1--provisionamiento-de-infraestructura-vagrant-cloudformation-terraform&quot;&gt;1 · Provisionamiento de infraestructura: vagrant, cloudformation, terraform&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;2 de diciembre de 2017.&lt;/strong&gt; La charla fundacional de la serie: por qué
codificar infraestructura. El argumento es que el código tiene propiedades
que un servidor configurado a mano jamás tendrá — es auditable,
reproducible, autodocumentado, reutilizable y transparente. Y la regla
cultural que da el filtro: &lt;strong&gt;CLI != IAC, SSH != IAC&lt;/strong&gt; — iniciar sesión en
un servidor a instalar paquetes, crear imágenes a mano o abrir tickets
para pedir recursos son las prácticas que hay que aprender a reconocer y
eliminar.&lt;/p&gt;

&lt;p&gt;De ahí, el mapa del ecosistema por capas — saber qué herramienta juega en
qué posición evita compararlas mal:&lt;/p&gt;

&lt;pre&gt;
 gestor de versiones ──────── git / svn / hg
 provisionamiento ─────────── vagrant / terraform / cloudformation / cobbler
 gestor de configuraciones ── ansible / puppet / chef / saltstack
 generador de artefactos ──── packer / kickstart / preseed / Dockerfile
 consumidor de artefactos ─── docker / ec2 / gce / virtualbox
 orquestador de servicios ─── kubernetes / docker swarm / nomad
&lt;/pre&gt;

&lt;p&gt;Las demos: &lt;code&gt;vagrant init &amp;amp;&amp;amp; vagrant up &amp;amp;&amp;amp; vagrant ssh&lt;/code&gt; como hello world, y
después el salto a infraestructura real — un cluster en alta
disponibilidad (keepalived + haproxy + nginx en round robin) levantado
localmente desde &lt;a href=&quot;https://github.com/javier-lopez/vagrants&quot;&gt;vagrants&lt;/a&gt;, y
el mismo patrón en la nube con terraform contra DigitalOcean desde
&lt;a href=&quot;https://github.com/javier-lopez/terraforms&quot;&gt;terraforms&lt;/a&gt;:
&lt;code&gt;init&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt; — el ciclo de vida completo de la
infraestructura en cuatro comandos.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget -qO- https://raw.githubusercontent.com/javier-lopez/talks/master/iac/provisionamiento-de-infraestructura-vagrant-cloudformation-terraform/vlide.md | vim +Vlide -
&lt;/pre&gt;

&lt;h3 id=&quot;2--iac-spotlight&quot;&gt;2 · IAC spotlight&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Febrero de 2018.&lt;/strong&gt; Sesión formato demo: mínima teoría, una herramienta
tras otra encadenadas para mostrar cómo se complementan.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Vagrant + ansible&lt;/strong&gt; — el cluster HA de la sesión anterior, pero ahora
provisionado por ansible, con un &lt;code&gt;while :; do curl; done&lt;/code&gt; mostrando el
round robin en vivo.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Packer&lt;/strong&gt; — fabricar tus propias imágenes base: de un JSON de
definición sale una box de OpenBSD 6.2
(&lt;code&gt;packer build&lt;/code&gt; → &lt;code&gt;vagrant box add&lt;/code&gt; → &lt;code&gt;vagrant up&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Docker compose&lt;/strong&gt; — una app de microblogging completa con un
&lt;code&gt;git clone&lt;/code&gt; y un &lt;code&gt;setup.sh&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Terraform + docker swarm + traefik&lt;/strong&gt; — el gran final: terraform
levanta un cluster de 6 nodos (3 managers, 3 workers) en DigitalOcean,
y encima se despliegan tres stacks con &lt;code&gt;docker stack deploy&lt;/code&gt;: traefik
como reverse proxy, un visualizador del cluster y un servicio echo que
responde al curl en round robin a través de traefik.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget -qO- https://raw.githubusercontent.com/javier-lopez/talks/master/iac/iac-spotlight/vlide.md | vim +Vlide -
&lt;/pre&gt;

&lt;h3 id=&quot;3--contenedores-de-software-docker-y-docker-compose&quot;&gt;3 · Contenedores de software: docker y docker compose&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Agosto de 2018.&lt;/strong&gt; La sesión abre con tres pares de historias — el mismo
rol, con y sin docker: José pasa su primera semana instalando dependencias
mientras Jimena hace &lt;code&gt;docker-compose up&lt;/code&gt; y programa el mismo día; Carmen
malabarea Java 5/6/7/8 y Python 2/3 para probar 5 proyectos mientras
Marcos reproduce cualquier entorno al instante; Federico le teme a cada
release mientras Mónica libera varias veces al día con rollback
automático.&lt;/p&gt;

&lt;p&gt;La definición didáctica que estructura todo: un contenedor es una
&lt;strong&gt;plantilla de archivos + un punto de entrada&lt;/strong&gt;. Y para demostrar que no
hay magia, el deck destripa &lt;code&gt;hello-world&lt;/code&gt; en vivo — &lt;code&gt;docker inspect&lt;/code&gt; para
leer el entrypoint y &lt;code&gt;docker image save | tar tvf -&lt;/code&gt; para abrir la imagen
con tar y vim (el mismo truco que usé con &lt;code&gt;ar&lt;/code&gt; en
&lt;a href=&quot;/blog/es/2015/06/15/talks-empaquetado-de-software-para-ubuntu.html&quot;&gt;la charla de empaquetado&lt;/a&gt;:
si un formato se deja abrir, se deja entender).&lt;/p&gt;

&lt;p&gt;De ahí, cuatro Dockerfiles progresivos — de un &lt;code&gt;echo&lt;/code&gt; a un servidor web
con &lt;code&gt;EXPOSE&lt;/code&gt; y mapeo de puertos — y el paso natural a compose: los mismos
&lt;code&gt;docker build&lt;/code&gt;/&lt;code&gt;docker run&lt;/code&gt; de antes, pero declarados en un
&lt;code&gt;docker-compose.yml&lt;/code&gt; (convención sobre configuración), cerrando con un
stack real nginx + flask + mongodb.&lt;/p&gt;

&lt;iframe src=&quot;https://www.youtube.com/embed/_R004Xn_wxc&quot; title=&quot;DevOps Tools: Docker, Docker-compose&quot; style=&quot;width:100%;max-width:720px;aspect-ratio:16/9;border:0;display:block;margin:0 auto&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget -qO- https://raw.githubusercontent.com/javier-lopez/talks/master/iac/docker-compose/vlide.md | vim +Vlide -
&lt;/pre&gt;

&lt;h3 id=&quot;4--provisionamiento-de-infraestructura-vagrant&quot;&gt;4 · Provisionamiento de infraestructura: vagrant&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Agosto de 2018.&lt;/strong&gt; ¿Para qué máquinas virtuales cuando ya existen los
contenedores? Para todo lo que un contenedor no puede: balanceadores y
proxies inversos, docker sobre Windows/Mac, software de otras plataformas
— la demo hace hello world con OpenBSD, Windows 10 y Solaris, los tres
desde el mismo &lt;code&gt;vagrant init&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Los conceptos espejo con docker: una box es una plantilla de archivos +
metadatos, y el &lt;code&gt;Vagrantfile&lt;/code&gt; es el equivalente del &lt;code&gt;docker-compose.yml&lt;/code&gt;
— el TAO de vagrant es que cualquier proyecto se replique con un solo
&lt;code&gt;vagrant up&lt;/code&gt;. Como la virtualización es lenta, buena parte de la sesión
son trucos de velocidad: linked clones, ajustar CPU/RAM, cachés de
paquetes (&lt;code&gt;vagrant-cachier&lt;/code&gt;) e imágenes base pre-cocinadas con packer.
Después, los tres provisionadores (file, shell, ansible) y los plugins
útiles.&lt;/p&gt;

&lt;p&gt;El cierre es el demo más teatral de la serie: el cluster HA de keepalived
donde se van matando nodos — y el &lt;code&gt;while :; do curl 10.10.10.10; done&lt;/code&gt;
sigue respondiendo mientras la IP virtual flota de un haproxy al otro.
Alta disponibilidad que se ve, no que se cuenta.&lt;/p&gt;

&lt;iframe src=&quot;https://www.youtube.com/embed/fHxsPMfXgRo&quot; title=&quot;DevOps Tools: Vagrant&quot; style=&quot;width:100%;max-width:720px;aspect-ratio:16/9;border:0;display:block;margin:0 auto&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget -qO- https://raw.githubusercontent.com/javier-lopez/talks/master/iac/vagrant/vlide.md | vim +Vlide -
&lt;/pre&gt;

&lt;h3 id=&quot;5--configuración-de-infraestructura-ansible&quot;&gt;5 · Configuración de infraestructura: ansible&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Agosto de 2018.&lt;/strong&gt; El principio rector es la &lt;strong&gt;idempotencia&lt;/strong&gt;: ejecutar
la receta dos veces produce el mismo resultado — lo que un shell script no
garantiza sin esfuerzo. Frente a chef/puppet, ansible gana en simpleza:
sin agentes y sin dependencias en los nodos (con su lista honesta de
contras: menos módulos, sin reportería).&lt;/p&gt;

&lt;p&gt;Lo más práctico de la sesión es el problema del huevo y la gallina del
&lt;strong&gt;bootstrapping&lt;/strong&gt;: el primer playbook corre con &lt;code&gt;remote_user: root&lt;/code&gt; y
&lt;code&gt;gather_facts: no&lt;/code&gt;, porque ni el usuario ansible ni python existen todavía
en la máquina recién nacida. De ahí, la anatomía de un proyecto real:
inventarios por entorno (prod/dev) con secretos cifrados en
&lt;code&gt;ansible-vault&lt;/code&gt;, playbooks que aplican roles por grupo de nodos, y roles
con su estructura de tasks, handlers (&lt;code&gt;notify: restart docker&lt;/code&gt;) y
plantillas jinja2.&lt;/p&gt;

&lt;p&gt;El caso de uso integra todo: un cluster docker swarm levantado por vagrant
y provisionado por ansible, con traefik y su visualizador al frente.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget -qO- https://raw.githubusercontent.com/javier-lopez/talks/master/iac/ansible/vlide.md | vim +Vlide -
&lt;/pre&gt;

&lt;h3 id=&quot;6--shell-scripting&quot;&gt;6 · Shell scripting&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Septiembre de 2018.&lt;/strong&gt; La sesión con la que cerré la serie, dedicada a la
pieza que está debajo de todas las demás: la shell como código pegamento
por excelencia — UNIX como IDE, el principio de composición.&lt;/p&gt;

&lt;p&gt;La postura técnica de la charla: escribir &lt;strong&gt;POSIX&lt;/strong&gt;, no bashisms
(&lt;code&gt;printf&lt;/code&gt; y no &lt;code&gt;echo&lt;/code&gt;, &lt;code&gt;[&lt;/code&gt; y no &lt;code&gt;[[&lt;/code&gt;, &lt;code&gt;case&lt;/code&gt; y no &lt;code&gt;=~&lt;/code&gt;), bajo el lema
&lt;em&gt;write once, run anywhere&lt;/em&gt; — el mismo script corre en ksh/bash/dash/zsh
sobre Linux, macOS, *BSD y Cygwin. Después el lenguaje completo en
miniatura: dos tipos de datos (números y cadenas), control de flujo,
funciones como predicados (&lt;code&gt;_is_root&lt;/code&gt;, &lt;code&gt;_validmail&lt;/code&gt; con &lt;code&gt;case&lt;/code&gt;), y las
trampas clásicas — &lt;code&gt;for f in $(ls)&lt;/code&gt; está tres veces MAL en el slide, con
&lt;a href=&quot;https://mywiki.wooledge.org/ParsingLs&quot;&gt;la explicación de wooledge&lt;/a&gt; al
lado. Cierra con el kit de supervivencia: &lt;code&gt;bash -x&lt;/code&gt;, un profiler propio y
&lt;a href=&quot;https://www.shellcheck.net/&quot;&gt;shellcheck&lt;/a&gt;, y un caso de uso real — el
postinstalador que automatiza instalar software que las distribuciones
tienen desactualizado, de &lt;a href=&quot;https://github.com/javier-lopez/learn&quot;&gt;learn&lt;/a&gt;.&lt;/p&gt;

&lt;iframe src=&quot;https://www.youtube.com/embed/HU2yOTqk2yg&quot; title=&quot;DevOps Tools: Shell Scripting&quot; style=&quot;width:100%;max-width:720px;aspect-ratio:16/9;border:0;display:block;margin:0 auto&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget -qO- https://raw.githubusercontent.com/javier-lopez/talks/master/iac/shell-scripting/vlide.md | vim +Vlide -
&lt;/pre&gt;

&lt;h3 id=&quot;cómo-revivirlas&quot;&gt;Cómo revivirlas&lt;/h3&gt;

&lt;p&gt;Cada one-liner abre su deck listo para navegar — con
&lt;a href=&quot;https://github.com/javier-lopez/vlide.vim&quot;&gt;vlide.vim&lt;/a&gt; instalado, espacio
avanza y backspace retrocede; sin vlide, igual se dejan leer. Córrelos
&lt;strong&gt;dentro de una sesión de tmux&lt;/strong&gt;: los slides abren panes y ejecutan sus
demos ahí — con las herramientas instaladas la demo corre de verdad
(vagrant levanta máquinas, terraform toca la nube), sin ellas solo verás
los comandos intentarlo. El material completo — slides, &lt;code&gt;setup.sh&lt;/code&gt; y demos
— está en
&lt;a href=&quot;https://github.com/javier-lopez/talks/tree/master/iac&quot;&gt;github.com/javier-lopez/talks&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>minos, a tiling wm linux distribution</title>
   <link href="https://javier.io/blog/en/2018/08/22/minos-a-tiling-wm-linux-distro.html"/>
   <published>2018-08-22T00:00:00+00:00</published>
   <updated>2018-08-22T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2018/08/22/minos-a-tiling-wm-linux-distro</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">minos, a tiling wm linux distribution</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2018/08/22/minos-a-tiling-wm-linux-distro.html">&lt;h2 id=&quot;minos-a-tiling-wm-linux-distribution&quot;&gt;minos, a tiling wm linux distribution&lt;/h2&gt;

&lt;h6 id=&quot;22-aug-2018&quot;&gt;22 Aug 2018&lt;/h6&gt;

&lt;p&gt;I’ve been working in my spare time in a yet another Linux respin for the last
7-8 years and I thought I better write something about it so my co-workers and
friends have a better time getting started.&lt;/p&gt;

&lt;h3 id=&quot;about&quot;&gt;About&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/minos-org/&quot;&gt;Minos&lt;/a&gt; is a personal effort to get a stable,
performant and productive Linux system for power user/dev roles.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ Based on Ubuntu LTS releases with BedRock Linux support on its way
    ▸ 16.04 / 18.04 / 20.04
▸ Tiling window manager, i3wm + patches
▸ Full battery cli workflow, urxvt, tmux, vim, wicd, shundle, ...
▸ Non-intrusive and fast dmenu based launchers for sessions, process
  management, virtualization, etc.
▸ Handpicked minimal yet powerful apps for common tasks:
    ▸ file manager     -  pcmanfm     | login screen -  slim
    ▸ image viewing    -  feh, sxiv   | pdf reader   - zathura
    ▸ music indexing   -  mpd         | video player - mplayer2, umplayer
    ▸ network manager  -  wicd-curses | email client - mutt
    ▸ ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/minos-movie.png&quot;&gt;&lt;img src=&quot;/assets/img/minos-movie.png&quot; alt=&quot;minos movie&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;principles&quot;&gt;Principles&lt;/h3&gt;

&lt;p&gt;In order to achieve its goal, minos design is lead by:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Minimalism → use as few elements as possible but not less
Coherence  → based on modularity and composition, elements relate to each other
Stability  → incremental over revolutionary
Control    → extensive configuration options
Pluggable  → plugin based components
Beauty     → subjective, but right now mostly black =P
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There exist two versions of the system:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Core: X less environment, ideal for servers.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Desktop: Graphic tiling wm environment for laptops/workstations.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;h4 id=&quot;ubuntu-lts-based-distro&quot;&gt;Ubuntu LTS based distro&lt;/h4&gt;

&lt;p&gt;On any Ubuntu LTS release add the Minos repository:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository ppa:minos-archive/main
$ sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And install the core or/and desktop metapackages:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install -y minos-core
$ sudo apt-get install -y minos-desktop #includes minos-core
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or run the &lt;a href=&quot;http://minos.io/s&quot;&gt;http://minos.io/s&lt;/a&gt; installer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sh &amp;lt;(wget -q -O- minos.io/s) core
$ sh &amp;lt;(wget -q -O- minos.io/s) desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;live-ubuntu-lts-based-distro&quot;&gt;Live Ubuntu LTS based distro&lt;/h4&gt;

&lt;p&gt;From any [L/X/K]Ubuntu live usb run the &lt;a href=&quot;http://minos.io/s&quot;&gt;http://minos.io/s&lt;/a&gt;
installer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sh &amp;lt;(wget -q -O- minos.io/s) live core    /dev/sdX username passwd [/dev/sdaY]
$ sh &amp;lt;(wget -q -O- minos.io/s) live desktop /dev/sdX username passwd [/dev/sdaY]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/dev/sdX → / mount point
username → admin minos user
passwd   → admin minos user password

/dev/sdY → /home mount point   (optional)
--release  [16.04|18.04|20.04] (optional)
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;vagrant&quot;&gt;Vagrant&lt;/h4&gt;

&lt;p&gt;Minos is also available as portable VirtualBox images:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant init minos/core-20.04    &amp;amp;&amp;amp; vagrant up
$ vagrant init minos/desktop-20.04 &amp;amp;&amp;amp; vagrant up
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Additional boxes are located at
&lt;a href=&quot;https://app.vagrantup.com/minos&quot;&gt;https://app.vagrantup.com/minos&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;getting-started&quot;&gt;Getting started&lt;/h3&gt;

&lt;h4 id=&quot;aptdpkg&quot;&gt;apt/dpkg&lt;/h4&gt;

&lt;p&gt;Minos is based on Debian/Ubuntu, as such, it uses &lt;code&gt;apt/dpkg&lt;/code&gt; tools to
manage/install software, some of the configuration changes include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ Recommend and suggested packages[0] are disabled by default. Use
  → $ sudo dpkg-reconfigure minos-core-settings #to change it

▸ shundle/aliazator add install, purge, remove, update, upgrade, aliases:
  → $ type install
  &amp;gt; install is aliased to `sudo apt-get install --no-install-recommends&apos;

  * Use:
  → $ aliazator [enable|disable] apt-get #to modify this behavior

▸ eix is provided as an alternative apt-get/apt/aptitude interface
  → $ eix -h
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Desktop&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ Deb packages are cached and shared over avahi (zeroconf)
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html#s-depends&quot;&gt;https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html#s-depends&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.unix-ag.uni-kl.de/~bloch/acng/&quot;&gt;https://www.unix-ag.uni-kl.de/~bloch/acng/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;static-get&quot;&gt;static-get&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/minos-org/minos-static&quot;&gt;static-get&lt;/a&gt; is included as an
alternative installation medium allowing to fetch statically linked Linux
binaries.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ Search tmux available versions
  → $ static-get -s tmux
    &amp;gt; tmux-1.9a-1.tar.xz:8ec9d37183d48d3e171e89b1dae6e212a5918262d10
    &amp;gt; tmux-2.1-1.tar.xz:8172e0f2b39818ee747fa5b445a0a69342c11d1afa72
    &amp;gt; tmux-2.2-1.tar.xz:f499f6e9368a5022f45b726759b588e52b16442ae2f3

▸ Download and extract the specified package
  → $ static-get -x tmux-2.2
    &amp;gt; tmux-2.2-1.tar.xz
    &amp;gt; tmux-2.2-1/
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;shell--shundle&quot;&gt;shell / shundle&lt;/h4&gt;

&lt;p&gt;The default bash editing mode is set to &lt;code&gt;vi&lt;/code&gt; with some &lt;code&gt;emacs&lt;/code&gt; exceptions
meaning than common shortcuts like &lt;code&gt;&amp;lt;Ctrl-l&amp;gt; (clear screen)&lt;/code&gt;, &lt;code&gt;&amp;lt;Ctrl-r&amp;gt;
(reverse cmd search)&lt;/code&gt;, &lt;code&gt;&amp;lt;Ctrl-a&amp;gt;/&amp;lt;Ctrl-e&amp;gt; (star/beginning sentence)&lt;/code&gt; work
the same while vi keybindings are used for all other actions. One of the
most powerful characteristics of this mode are text objects.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ text objects:
  → $ echo &quot;text object&quot; #pressing ci&quot; while in the &apos;text&apos; word results in
  → $ echo &quot;&quot; #removing the inner &quot; characters
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Math operations are recognized:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ examples include: +, -, *, /, %
  → $ 5 + 5
    &amp;gt; 10
  → $ 7 \* 2.3
    &amp;gt; 16.1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Search and other common actions are integrated within the shell:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ open the default web browser
    → $ 1999, binary finary :google

▸ or get back results from cli utils who output to console directly
  → $ howdoi format date bash
    &amp;gt; today=`date +%Y-%m-%d.%H:%M:%S`
  → $ translate -en-pt &apos;deleted code is debugged code&apos;
    &amp;gt; Código eliminado é código depurado

▸ open resources by its name/suffix or by using the `open` launcher
  → $ /path/to/image.png
  → $ open https://wikipedia.org
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Autocd, auto ls, and directory indexing are enabled for faster jumping between
directories:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ create and jump in one cmd
  → $ mkcd ~/a/long/path/including/a/directory/

▸ change directories without requiring cd
  → $ ~/a/long/path/including/a/

▸ index directory paths, see `man wcd`
  → $ update-cd
  → $ cd including #go to ~/a/long/path/including/

▸ backward pwd search for normal and versioned projects, see `command -v ,,,`
  → $ ,, long #go to ~/a/long
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Desktop&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ &amp;lt;Alt-Esc&amp;gt; is mapped to `dmenu-launcher` which supports the above
  attributes plus clipboard integration
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In order to provide additional yet optional characteristics, plugins based
components are offered, &lt;a href=&quot;https://github.com/javier-lopez/shundle&quot;&gt;shundle&lt;/a&gt; is
the mechanism for which they’re managed, alternatives include
&lt;a href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot;&gt;oh-my-zsh&lt;/a&gt; /
&lt;a href=&quot;https://github.com/sorin-ionescu/prezto&quot;&gt;prezto&lt;/a&gt; /
&lt;a href=&quot;https://github.com/Bash-it/bash-it&quot;&gt;bash-it&lt;/a&gt;, etc. Shundle allows installing
scripts/modules which enrich the shell environment with sane defaults, aliases,
functions and prompt themes.&lt;/p&gt;

&lt;p&gt;By default the following plugins are enabled (&lt;strong&gt;~/.profile.d/shundle.sh&lt;/strong&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ aliazator: An aliases manager, providing hundred of aliases for common
             commands, eg: apt-get, git, ssh, sudo, wget, vim, etc.

▸ autocd: Current directory autosaving (pwd), allows external applications
          start &quot;from here&quot;, used for new urxvt/tmux instances.

▸ colorize: Provides prompt, X resources and less/grep/ls themes.

▸ eternalize: Store an eternal history file across sessions
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Shundle integration is provided by the &lt;code&gt;minos-core-settings&lt;/code&gt; package, can be
disabled/enabled by running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo dpkg-reconfigure minos-core-settings #shundle option
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;tmux--tundle&quot;&gt;tmux / tundle&lt;/h4&gt;

&lt;p&gt;Simply speaking, &lt;a href=&quot;https://tmux.github.io/&quot;&gt;tmux&lt;/a&gt; acts as a window manager for
terminals, on Minos, it’s configured and installed by default in pair with
&lt;a href=&quot;https://mosh.org&quot;&gt;mosh&lt;/a&gt; to provide robust, secure and efficient access to
local and remote shell sessions.&lt;/p&gt;

&lt;p&gt;tmux is launched on every incoming ssh connection and within the scratchpad
window &lt;code&gt;&amp;lt;Windows&amp;gt;&amp;lt;Space&amp;gt;&lt;/code&gt; (desktop edition). Of course, it can also be
initialized manually.&lt;/p&gt;

&lt;p&gt;The default prefix sequence has been changed from &lt;code&gt;&amp;lt;Ctrl-b&amp;gt;&lt;/code&gt; → &lt;code&gt;&amp;lt;Ctrl-a&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;As with the bash interpreter, tmux can be customized/extended through
additional plugins, Minos includes
&lt;a href=&quot;https://github.com/javier-lopez/tundle&quot;&gt;tundle&lt;/a&gt; as the default tmux plugin
manager.&lt;/p&gt;

&lt;p&gt;By default the following plugins are enabled (&lt;strong&gt;~/.tmux.conf&lt;/strong&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ tmux-sensible: improve tmux defaults, including &amp;lt;Ctrl-a&amp;gt; as default
  prefix.

▸ tmux-pain-control: rebinds default keybindings for pane management.

▸ tmux-yank: tmux/system clipboard integration

▸ tmux-resurrect: persists tmux environments across system restarts

▸ tmux-copycat: enhances tmux search to find easily files, git hashes,
                urls, etc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tundle integration is provided by the &lt;code&gt;minos-core-settings&lt;/code&gt; package, and can
enabled/disabled by running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo dpkg-reconfigure minos-core-settings #tundle option
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;vim--vundle&quot;&gt;vim / vundle&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://www.vim.org/&quot;&gt;Vim&lt;/a&gt; is a highly configurable text editor mostly used by
power users and developers to create content at the speed of thought. On Minos,
it’s included by default with the &lt;code&gt;vim-nox&lt;/code&gt; and &lt;code&gt;vim-gtk&lt;/code&gt; packages (the latter
only in the desktop version). &lt;a href=&quot;https://github.com/javier-lopez/vundle&quot;&gt;Vundle&lt;/a&gt;
has been adopted as the default vim plugin manager.&lt;/p&gt;

&lt;p&gt;A fair amount of vim plugins are included (~50), most of them are loaded on
demand or upon specific events in order to do not affect the editor startup
time. Some examples include:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Bundle &apos;bogado/file-line&apos;      &quot;jump to line on startup, eg: $ vim file:23
Bundle &apos;mhinz/vim-signify&apos;     &quot;git|svn modification viewer
Bundle &apos;tpope/vim-surround&apos;    &quot;text :h objects on steroids
Bundle &apos;msanders/snipmate.vim&apos; &quot;snippet support
Bundle &apos;Shougo/neocomplcache&apos;  &quot;autocompletion
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vundle integration is provided by the &lt;code&gt;minos-core-settings&lt;/code&gt; package, run
the following command to disable/enable it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo dpkg-reconfigure minos-core-settings #vundle option
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;minos-tools&quot;&gt;minos-tools&lt;/h4&gt;

&lt;p&gt;Additional wrappers and power user scripts (&amp;gt;100) are available through the
&lt;code&gt;minos-core-tools&lt;/code&gt; and &lt;code&gt;minos-desktop-tools&lt;/code&gt; packages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ rm wrapper with nautilus/pcmanfm trash management integration
  → $ mkdir ~/a/long/path/including/a/directory
  → $ rm -r ~/a/long/path/including/a/directory
  → $ rm -l a #outputs recoverable files matching the &apos;a&apos; pattern
  → $ rm -u a #recovers the files matching the &apos;a&apos; pattern
  → $ ls    ~/a/long/path/including/a/directory/

▸ compress / extract wrappers to ease archive creation/decompression.
  → $ touch a b c &amp;amp;&amp;amp; compress a b c abc.tar.gz
  → $ rm -f a b c &amp;amp;&amp;amp; extract  abc.tar.gz

▸ text / image pastebins
  → $ cat ~/.bashrc | sprunge
    &amp;gt; http://sprunge.us/AYZC
  → $ uimg image.png
    &amp;gt; http://i.imgur.com/KyoFMH9.png
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Desktop&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ dmenu-*       #dmenu based launchers, i3 window jumper,
                #process/session management, vbox/xrandr/mpd/ wrappers
▸ watch-battery #battery notifier, suspend/hibernate the system if
                #no manual action is taken
▸ player-ctrl   #control multimedia players, mpd/mplayer/spotify
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To get a full list of the included scripts run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ dpkg -L minos-core-tools minos-desktop-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;minos-config&quot;&gt;minos-config&lt;/h3&gt;

&lt;p&gt;Minos is commanded by configuration files, those determinate global settings
(eg, wallpaper, autostart, etc), post-installation hooks, etc:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;- $HOME/.minos/config
- /etc/minos/config
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A simple ini like syntax is used, e.g.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/etc/minos/config
    wallpaper /usr/share/minos/wallpapers/minos.png
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To look-up a value, use &lt;code&gt;minos-config key&lt;/code&gt;, e.g:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ minos-config wallpaper
 /usr/share/minos/wallpapers/minos.png
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;See &lt;code&gt;minos-config -h&lt;/code&gt; and
&lt;a href=&quot;http://minos.io/doc/config&quot;&gt;http://minos.io/doc/config&lt;/a&gt; for further details.&lt;/p&gt;

&lt;h3 id=&quot;development&quot;&gt;Development&lt;/h3&gt;

&lt;p&gt;Minos uses a Rolling Release over LTS cycle, meaning it pushes frequent and
small updates to LTS releases and doesn’t provide named releases by itself.&lt;/p&gt;

&lt;p&gt;There is a parity:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;▸ 1 deb package =&amp;gt; 2 git repositories
               \
                \__  program src
                 \__ deb packaging
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which requires a package to compile correctly in all LTS supported releases
with the same deb code in order to be accepted, other Debian based distros
create different packaging code for every release, that’s unacceptable in Minos
due to the limited human resources and general waste it would be.&lt;/p&gt;

&lt;p&gt;Deb &lt;strong&gt;source files&lt;/strong&gt; are located at
&lt;a href=&quot;https://github.com/minos-org/&quot;&gt;https://github.com/minos-org/&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;foo-program     (custom/freeze program)
foo-program-deb (deb packaging)
    debian
        rules
            get-orig-source target (must retrieve content)
    debian/README.source (step by step instructions to build package)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Deb &lt;strong&gt;binary packages&lt;/strong&gt; are located at
&lt;a href=&quot;https://launchpad.net/~minos-archive/+archive/main&quot;&gt;https://launchpad.net/~minos-archive/+archive/main&lt;/a&gt;,
and are created using daily recipes asociated to every source mirror.&lt;/p&gt;

&lt;p&gt;In certain ocasions, base repositories are modified to introduce changes or
delete problematic files, those changes are automatic and described at:
&lt;a href=&quot;https://github.com/minos-org/minos-sync&quot;&gt;https://github.com/minos-org/minos-sync&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;choosing-default-applications&quot;&gt;Choosing default applications&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;▸ Default applications are selected with good documentation, flexibility,
configurability and as few dependencies as possible in mind.
▸ Systems supporting composition/specialization are preferred over
generalization
▸ Keyboard oriented applications are preferred over pointing interfaces
▸ GUI programs are nice but rejected if they use ancient graphical
interfaces or use considerable resources.
▸ When in doubt http://suckless.org/rocks provide additional hints about
how software is selected into the project
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;choosing-default-behavior&quot;&gt;Choosing default behavior&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt; ▸ Toggle solutions are preferred over multichoice.
 ▸ Use/Set vi like applications/settings are preferred
 ▸ Defaults are configured with a focus in the out-of-the-box experience
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;roadmap&quot;&gt;Roadmap&lt;/h4&gt;

&lt;p&gt;Minos is built on top of the most popular Linux distribution system to get a
lot of free software and an easy integration with third-party providers. At the
time of writing this, that’s Ubuntu, however future development should be
towards a multi-channel system such as &lt;a href=&quot;http://subuser.org/&quot;&gt;SubUser&lt;/a&gt; or
&lt;a href=&quot;https://bedrocklinux.org/&quot;&gt;BedRock Linux&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That’s it, happy tiling 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>disable broken touchpad device</title>
   <link href="https://javier.io/blog/en/2018/02/19/disable-broken-touchpad.html"/>
   <published>2018-02-19T00:00:00+00:00</published>
   <updated>2018-02-19T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2018/02/19/disable-broken-touchpad</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">disable broken touchpad device</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2018/02/19/disable-broken-touchpad.html">&lt;h2 id=&quot;disable-broken-touchpad-device&quot;&gt;disable broken touchpad device&lt;/h2&gt;

&lt;h6 id=&quot;19-feb-2018&quot;&gt;19 Feb 2018&lt;/h6&gt;

&lt;p&gt;From time to time I accidentally drop liquids into my thinkpad laptop and the touchpad start behaving funny, when it happens I prefer to disable it completely for some hours/days until it gets fixed by itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distro: Ubuntu 16.04&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
$ xinput list
⎡ Virtual core pointer                id=2  [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer      id=4  [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint           id=12 [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad      id=11 [slave  pointer  (2)] =&amp;gt; THIS ONE
⎣ Virtual core keyboard               id=3  [master keyboard (2)]
    ↳ Virtual core XTEST keyboard     id=5  [slave  keyboard (3)]
    ↳ Power Button                    id=6  [slave  keyboard (3)]
    ↳ Video Bus                       id=7  [slave  keyboard (3)]
    ↳ Sleep Button                    id=8  [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated C id=9  [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard    id=10 [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons          id=13 [slave  keyboard (3)]

$ xinput --disable 11
$ xinput --enable  11 #when the time comes
&lt;/pre&gt;

&lt;p&gt;That’s it, happy accidents 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;https://askubuntu.com/questions/65951/how-to-disable-the-touchpad&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>x509: certificate signed by unknown authority docker error</title>
   <link href="https://javier.io/blog/en/2018/02/07/x509-certificate-signed-by-unknown-authority-docker-error.html"/>
   <published>2018-02-07T00:00:00+00:00</published>
   <updated>2018-02-07T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2018/02/07/x509-certificate-signed-by-unknown-authority-docker-error</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="docker"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">x509: certificate signed by unknown authority docker error</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2018/02/07/x509-certificate-signed-by-unknown-authority-docker-error.html">&lt;h2 id=&quot;x509-certificate-signed-by-unknown-authority-docker-error&quot;&gt;x509: certificate signed by unknown authority docker error&lt;/h2&gt;

&lt;h6 id=&quot;07-feb-2018&quot;&gt;07 Feb 2018&lt;/h6&gt;

&lt;p&gt;At work we use internal docker registers and from to time I encounter this error when trying to pull/push to https registers, so I’m leaving the procedure to add autosigned certificates for the future me and others.&lt;/p&gt;

&lt;p&gt;Distro: Ubuntu 16.04&lt;/p&gt;

&lt;p&gt;Docker: 17.12.0-ce, build c97c6d&lt;/p&gt;

&lt;pre&gt;
$ # export registry certificate
$ openssl s_client -showcerts -connect                \
    registry.example.com:443 &amp;lt;/dev/null 2&amp;gt;/dev/null | \
    openssl x509 -outform PEM &amp;gt; registry.example.com.crt
$ # add it globally
$ sudo mv registry.example.com.crt /usr/local/share/ca-certificates
$ # update global certificates definitions
$ sudo update-ca-certificates
$ # restart affected services
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
&lt;/pre&gt;

&lt;p&gt;That’s it, happy pulling/pushing 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>block ads in openwrt routers</title>
   <link href="https://javier.io/blog/en/2017/11/27/block-ads-in-openwrt.html"/>
   <published>2017-11-27T00:00:00+00:00</published>
   <updated>2017-11-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2017/11/27/block-ads-in-openwrt</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">block ads in openwrt routers</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2017/11/27/block-ads-in-openwrt.html">&lt;h2 id=&quot;block-ads-in-openwrt-routers&quot;&gt;block ads in openwrt routers&lt;/h2&gt;

&lt;h6 id=&quot;27-nov-2017&quot;&gt;27 Nov 2017&lt;/h6&gt;

&lt;p&gt;In previous posts I wrote about how to &lt;a href=&quot;/blog/en/2017/11/26/block-youtube-in-openwrt.html&quot;&gt;block YouTube and other services by ip&lt;/a&gt;, this time I’ll show how to do the same by dns, kind of adblock for openwrt.&lt;/p&gt;

&lt;p&gt;The target router is a &lt;a href=&quot;http://www.amazon.com/TP-LINK-TL-WDR4300-Wireless-Gigabit-300Mbps/dp/B0088CJT4U&quot;&gt;TP-Link N750&lt;/a&gt;, and I’m using the latest &lt;a href=&quot;http://downloads.openwrt.org/snapshots/trunk/ar71xx/&quot;&gt;trunk build&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/98.jpg&quot;&gt;&lt;img src=&quot;/assets/img/98.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since revision &lt;a href=&quot;https://dev.openwrt.org/changeset/39312/&quot;&gt;39312&lt;/a&gt; OpenWRT configures the dnsmasq service to read from &lt;strong&gt;/tmp/dnsmasq.d/&lt;/strong&gt;, so it’s easy to dump block list there and reload the dnsmasq service to block undesired domains.&lt;/p&gt;

&lt;pre&gt;
# wget http://rawgit.com/javier-lopez/learn/master/sh/is/adblockupdater-openwrt -O /usr/bin/adblockupdater-openwrt
# chmod +x /usr/bin/adblockupdater-openwrt
# adblockupdater-openwrt
Getting yoyo ad list...
Getting winhelp2002 ad list...
Getting adaway ad list...
Getting hosts-file ad list...
Getting malwaredomainlist ad list...
Getting adblock.gjtech ad list...
Failed to establish connection
Getting someone who cares ad list...
69191 ad domains blocked.
Everything fine, restarting dnsmasq to implement new serverlist...
&lt;/pre&gt;

&lt;p&gt;Add it to the cron job manager:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# crontab -e
0 0 */1 * * /usr/bin/adblockupdater.sh
&lt;/pre&gt;

&lt;p&gt;That’s it, happy blocking 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://homepage.ruhr-uni-bochum.de/Jan.Holthuis/misc/adblock-on-your-openwrt-router/&quot;&gt;Original blog post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>block youtube by IP in openwrt routers</title>
   <link href="https://javier.io/blog/en/2017/11/26/block-youtube-in-openwrt.html"/>
   <published>2017-11-26T00:00:00+00:00</published>
   <updated>2017-11-26T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2017/11/26/block-youtube-in-openwrt</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">block youtube by IP in openwrt routers</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2017/11/26/block-youtube-in-openwrt.html">&lt;h2 id=&quot;block-youtube-by-ip-in-openwrt-routers&quot;&gt;block youtube by IP in openwrt routers&lt;/h2&gt;

&lt;h6 id=&quot;26-nov-2017&quot;&gt;26 Nov 2017&lt;/h6&gt;

&lt;p&gt;In previous posts I wrote about how to install &lt;a href=&quot;/blog/en/2017/11/24/installing-openwrt-as-access-point.html&quot;&gt;openwrt as an access point&lt;/a&gt; or as a &lt;a href=&quot;/blog/en/2017/11/23/installing-openwrt-as-wireless-repeater.html&quot;&gt;wireless repeater&lt;/a&gt;, this time I’ll show how to block youtube and other third party sites by ip. The procedure works in desktop / and mobile devices.&lt;/p&gt;

&lt;p&gt;The target router is a &lt;a href=&quot;http://www.amazon.com/TP-LINK-TL-WDR4300-Wireless-Gigabit-300Mbps/dp/B0088CJT4U&quot;&gt;TP-Link N750&lt;/a&gt;, and I’m using the latest &lt;a href=&quot;http://downloads.openwrt.org/snapshots/trunk/ar71xx/&quot;&gt;trunk build&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/98.jpg&quot;&gt;&lt;img src=&quot;/assets/img/98.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenWRT uses &lt;a href=&quot;https://wiki.openwrt.org/doc/uci&quot;&gt;UCI&lt;/a&gt; to centralize configuration, firewall rules are located at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;/etc/config/firewall&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In order to block sites by IP you’ll need to modify such file appending the desired rules, eg. for blocking YouTube:&lt;/p&gt;

&lt;pre&gt;
config rule
	option name		Block-YouTube-64.18.0.0/20
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		64.18.0.0/20
	option target		REJECT

config rule
	option name		Block-YouTube-64.233.160.0/19
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		64.233.160.0/19
	option target		REJECT

config rule
	option name		Block-YouTube-66.102.0.0/20
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		66.102.0.0/20
	option target		REJECT

config rule
	option name		Block-YouTube-66.249.80.0/20
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		66.249.80.0/20
	option target		REJECT

config rule
	option name		Block-YouTube-72.14.192.0/18
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		72.14.192.0/18
	option target		REJECT

config rule
	option name		Block-YouTube-74.125.0.0/16
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		74.125.0.0/16
	option target		REJECT

config rule
	option name		Block-YouTube-173.194.0.0/16
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		173.194.0.0/16
	option target		REJECT

config rule
	option name		Block-YouTube-207.126.144.0/20
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		207.126.144.0/20
	option target		REJECT

config rule
	option name		Block-YouTube-209.85.128.0/17
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		209.85.128.0/17
	option target		REJECT

config rule
	option name		Block-YouTube-216.58.208.0/20
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		216.58.208.0/20
	option target		REJECT

config rule
	option name		Block-YouTube-216.239.32.0/19
	option src		lan
	option family		ipv4
	option proto		all
	option dest		wan
	option dest_ip		216.239.32.0/19
	option target		REJECT
&lt;/pre&gt;

&lt;p&gt;Update: the original version of this post listed two extra ranges captured from
live traffic, 187.189.0.0/16 and 189.203.0.0/16. Those blocks belong to the
local ISP (Uninet/Telmex) — YouTube often serves video from Google Global Cache
nodes hosted inside ISP networks — so rejecting them would have blocked far more
than YouTube. They were removed.&lt;/p&gt;

&lt;p&gt;Ensure to reboot the firewall service to apply the changes:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# /etc/init.d/firewall restart
&lt;/pre&gt;

&lt;p&gt;That’s it, happy blocking 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://wiki.openwrt.org/toh/tp-link/tl-wdr4300&quot;&gt;Tl-wdr4300 in OpenWRT&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.openwrt.org/doc/uci/firewall&quot;&gt;OpenWRT Firewall Documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/a/28797030/890858&quot;&gt;YouTube IP Range&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>installing openwrt as a dumb access point</title>
   <link href="https://javier.io/blog/en/2017/11/25/installing-openwrt-as-a-dumb-access-point.html"/>
   <published>2017-11-25T00:00:00+00:00</published>
   <updated>2017-11-25T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2017/11/25/installing-openwrt-as-a-dumb-access-point</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   
   
   <summary type="html">installing openwrt as a dumb access point</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2017/11/25/installing-openwrt-as-a-dumb-access-point.html">&lt;h2 id=&quot;installing-openwrt-as-a-dumb-access-point&quot;&gt;installing openwrt as a dumb access point&lt;/h2&gt;

&lt;h6 id=&quot;25-nov-2017&quot;&gt;25 Nov 2017&lt;/h6&gt;

&lt;p&gt;In a previous post I wrote about how to use &lt;a href=&quot;/blog/en/2017/11/24/installing-openwrt-as-access-point.html&quot;&gt;openwrt as an independent access point&lt;/a&gt;, this time however I’ll mention how to configure it to extend a network that already has a router with dhcp in place or where a subnet is not required / desired.&lt;/p&gt;

&lt;p&gt;The target device is a &lt;a href=&quot;http://www.amazon.com/TP-LINK-TL-WDR4300-Wireless-Gigabit-300Mbps/dp/B0088CJT4U&quot;&gt;TP-Link N750&lt;/a&gt;, and I’m using the latest &lt;a href=&quot;http://downloads.openwrt.org/releases/18.06.2/targets/ar71xx/generic/openwrt-18.06.2-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin&quot;&gt;stable build&lt;/a&gt;, the installation process is pretty straight forward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/98.jpg&quot;&gt;&lt;img src=&quot;/assets/img/98.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget downloads.openwrt.org/releases/18.06.2/targets/ar71xx/generic/openwrt-18.06.2-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin
&lt;/pre&gt;

&lt;p&gt;Or, when there is a previous openwrt version already installed:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget downloads.openwrt.org/releases/18.06.2/targets/ar71xx/generic/openwrt-18.06.2-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin
&lt;/pre&gt;

&lt;p&gt;After completing the download, install it by going to the &lt;strong&gt;Firmware Upgrade&lt;/strong&gt; menu and selecting the openwrt firmware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/99.png&quot;&gt;&lt;img src=&quot;/assets/img/99.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The stable version already includes the &lt;a href=&quot;https://github.com/openwrt/luci&quot;&gt;luci web interface&lt;/a&gt;, so there is no need to install anything else.&lt;/p&gt;

&lt;h3 id=&quot;configuration-via-web-interface-luci&quot;&gt;Configuration via Web Interface LUCI&lt;/h3&gt;

&lt;p&gt;Unplug all but your own computer to the device and wait for a valid ip, by default in the range 192.168.1.X, connect to the router through the &lt;a href=&quot;http://192.168.1.1&quot;&gt;http://192.168.1.1&lt;/a&gt; address and select the &lt;strong&gt;LAN INTERFACE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Edit with a valid static IP within the range of your main router, eg, (if your router has IP 192.168.1.1, enter 192.168.1.2). Set DNS and gateway to point into your main router to enable internet access for the dumb AP itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-dumb-ap-lan.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-dumb-ap-lan.png&quot; alt=&quot;openwrt dumb ap lan&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then scroll down and select the checkbox &lt;strong&gt;Ignore interface: Disable DHCP for this interface.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-dumb-ap-disable-dhcp.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-dumb-ap-disable-dhcp.png&quot; alt=&quot;openwrt dumb ap disable dhcp&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before applying the change prepare the ethernet wire, you’ll have 30 seconds to connect it, request a new IP address and access the router web interface, otherwise it’ll revert the change and you’ll have to redo the configuration. Use a LAN/switch from your main router to a LAN/switch of your dumb AP, &lt;strong&gt;avoid the WAN/Internet ports&lt;/strong&gt;, click &lt;strong&gt;Save &amp;amp; Apply&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Access the dumb AP (on this example) through the &lt;a href=&quot;http://10.9.8.7&quot;&gt;http://10.9.8.7&lt;/a&gt; IP, and go to the &lt;strong&gt;Network ▷ Interfaces&lt;/strong&gt; page for disabling the &lt;strong&gt;WAN&lt;/strong&gt; interfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-dumb-ap-disable-wan-interfaces.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-dumb-ap-disable-wan-interfaces.png&quot; alt=&quot;openwrt dumb ap disable wan interfaces&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’re almost done, as a final step, setup the wireless APs, go to &lt;strong&gt;Network ▷ Wireless&lt;/strong&gt; section and configure as many as desired Access Points and link them to the &lt;strong&gt;LAN&lt;/strong&gt; &lt;strong&gt;Network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-dumb-ap-wireless-details.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-dumb-ap-wireless-details.png&quot; alt=&quot;openwrt dumb ap wireless details&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-dumb-ap-wireless-general.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-dumb-ap-wireless-general.png&quot; alt=&quot;openwrt dumb ap wireless general&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s it!, enjoy your extended network ✌&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://openwrt.org/docs/guide-user/network/wifi/dumbap&quot;&gt;https://openwrt.org/docs/guide-user/network/wifi/dumbap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>installing openwrt as an access point</title>
   <link href="https://javier.io/blog/en/2017/11/24/installing-openwrt-as-access-point.html"/>
   <published>2017-11-24T00:00:00+00:00</published>
   <updated>2017-11-24T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2017/11/24/installing-openwrt-as-access-point</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   
   
   <summary type="html">installing openwrt as an access point</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2017/11/24/installing-openwrt-as-access-point.html">&lt;h2 id=&quot;installing-openwrt-as-an-access-point&quot;&gt;installing openwrt as an access point&lt;/h2&gt;

&lt;h6 id=&quot;24-nov-2017&quot;&gt;24 Nov 2017&lt;/h6&gt;

&lt;p&gt;In previous post I wrote about how to use &lt;a href=&quot;/blog/en/2017/11/23/installing-openwrt-as-wireless-repeater.html&quot;&gt;openwrt as a wireless repeater&lt;/a&gt;, this time I’ll use it as an independent access point with its own subnet, how practical!&lt;/p&gt;

&lt;p&gt;The target device is a &lt;a href=&quot;http://www.amazon.com/TP-LINK-TL-WDR4300-Wireless-Gigabit-300Mbps/dp/B0088CJT4U&quot;&gt;TP-Link N750&lt;/a&gt;, and I’m using the latest &lt;a href=&quot;http://downloads.openwrt.org/snapshots/trunk/ar71xx/&quot;&gt;trunk build&lt;/a&gt;, the installation process is pretty straigh forward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/98.jpg&quot;&gt;&lt;img src=&quot;/assets/img/98.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin
&lt;/pre&gt;

&lt;p&gt;Or, when there is a previous openwrt version installed:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin
&lt;/pre&gt;

&lt;p&gt;After completing the download, install it by going to the &lt;strong&gt;Firmware Upgrade&lt;/strong&gt; menu and selecting the openwrt firmware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/99.png&quot;&gt;&lt;img src=&quot;/assets/img/99.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Be aware that the trunk build is minimal, it doesn’t include the &lt;a href=&quot;https://github.com/openwrt/luci&quot;&gt;luci web interface&lt;/a&gt;, so it’s up to every person to decide if they want it or not.&lt;/p&gt;

&lt;p&gt;To install additional software connect to the device and share temporary your laptop/desktop internet&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# flush previous iptables rules
$ sudo iptables -F
$ sudo iptables -X
$ sudo iptables -t nat -F
$ sudo iptables -t nat -X
$ sudo iptables -t mangle -F
$ sudo iptables -t mangle -X
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
&lt;/pre&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# route laptop traffic through wlan0 (wireless) interface
$ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
$ while true; do sudo ifconfig eth0 192.168.1.2; sleep 1; done
$ telnet 192.168.1.1 #type &quot;passwd&quot; to set the root passwd
# be aware than in current openwrt releases telnet is no longer provided
# in those cases just skip this step
$ ssh root@192.168.1.1 #from other terminal window
openwrt # passwd #set the root passwd in case telnet service isn&apos;t available
openwrt # ifconfig br-lan 10.9.8.7
$ while true; do sudo ifconfig eth0 10.9.8.10; sleep 1; done #bypass networkmanager
$ ssh root@10.9.8.7
openwrt # route add default gw 10.9.8.10
openwrt # echo &quot;nameserver 8.8.8.8&quot; &amp;gt; /etc/resolv.conf
openwrt # opkg update
openwrt # opkg install luci
openwrt # /etc/init.d/uhttpd enable
openwrt # /etc/init.d/uhttpd start
&lt;/pre&gt;

&lt;p&gt;Upon completing the installation, go to &lt;a href=&quot;http://10.9.8.7&quot;&gt;http://10.9.8.7&lt;/a&gt; and reconfigure the LAN interface to make permanent the IP address:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Network ▷ Interfaces ▷ LAN&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/100.png&quot;&gt;&lt;img src=&quot;/assets/img/100.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create the Access Point (linked to the &lt;strong&gt;lan&lt;/strong&gt; interface)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Network ▷ Wifi ▷ Add&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-ap.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-ap.png&quot; alt=&quot;openwrt ap&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connect an ethernet cable to the WAN interface (on this device it’s a blue port behind) and enjoy!, happy browsing ✌&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://wiki.openwrt.org/toh/tp-link/tl-wdr4300&quot;&gt;http://wiki.openwrt.org/toh/tp-link/tl-wdr4300&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>installing openwrt as a wireless repeater</title>
   <link href="https://javier.io/blog/en/2017/11/23/installing-openwrt-as-wireless-repeater.html"/>
   <published>2017-11-23T00:00:00+00:00</published>
   <updated>2017-11-23T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2017/11/23/installing-openwrt-as-wireless-repeater</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   
   
   <summary type="html">installing openwrt as a wireless repeater</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2017/11/23/installing-openwrt-as-wireless-repeater.html">&lt;h2 id=&quot;installing-openwrt-as-a-wireless-repeater&quot;&gt;installing openwrt as a wireless repeater&lt;/h2&gt;

&lt;h6 id=&quot;23-nov-2017&quot;&gt;23 Nov 2017&lt;/h6&gt;

&lt;p&gt;Last weekend I spend some time at my parents house and the occasion was appropriate to extend the wifi signal to cover the whole house, since I don’t intend to repeat the setup in the nearby future but would like still to have a reference, I decided to wrap it up in a post ☺&lt;/p&gt;

&lt;p&gt;First thing I did was to grab a TP-Link N750, formally a &lt;a href=&quot;http://www.amazon.com/TP-LINK-TL-WDR4300-Wireless-Gigabit-300Mbps/dp/B0088CJT4U&quot;&gt;TL-WDR4300 Version 1.7&lt;/a&gt; router for $60 at a nearby shop, I didn’t choose it for anything particular, but because of its nice antennas and dual-band support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/98.jpg&quot;&gt;&lt;img src=&quot;/assets/img/98.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Getting the latest openwrt &lt;a href=&quot;http://downloads.openwrt.org/snapshots/trunk/ar71xx/&quot;&gt;trunk build&lt;/a&gt; and install it on the device is pretty straight forward.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-factory.bin
&lt;/pre&gt;

&lt;p&gt;Or to upgrade it from a previous release:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin
&lt;/pre&gt;

&lt;p&gt;To flash the image go to the &lt;strong&gt;System Tools ▷ Firmware Upgrade&lt;/strong&gt; menu&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/99.png&quot;&gt;&lt;img src=&quot;/assets/img/99.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Be aware that the trunk build is minimal, it doesn’t include the &lt;a href=&quot;https://github.com/openwrt/luci&quot;&gt;luci web interface&lt;/a&gt;, so it’s up to every person to decide if they want it or not.&lt;/p&gt;

&lt;p&gt;To install additional software connect to the device and share temporary your laptop/desktop internet&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# flush previous iptables rules
$ sudo iptables -F
$ sudo iptables -X
$ sudo iptables -t nat -F
$ sudo iptables -t nat -X
$ sudo iptables -t mangle -F
$ sudo iptables -t mangle -X
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
&lt;/pre&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# route laptop traffic through wlan0 (wireless) interface
$ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
$ while true; do sudo ifconfig eth0 192.168.1.2; sleep 1; done
$ telnet 192.168.1.1 #type &quot;passwd&quot; to set the root passwd
# be aware than in current openwrt releases telnet is no longer provided
# in those cases just skip this step
$ ssh root@192.168.1.1 #from other terminal window
openwrt # passwd #set the root passwd in case telnet service wasn&apos;t available
openwrt # ifconfig br-lan 10.9.8.7
$ while true; do sudo ifconfig eth0 10.9.8.10; sleep 1; done #bypass networkmanager
$ ssh root@10.9.8.7
openwrt # route add default gw 10.9.8.10
openwrt # echo &quot;nameserver 8.8.8.8&quot; &amp;gt; /etc/resolv.conf
openwrt # opkg update
openwrt # opkg install luci relayd
openwrt # /etc/init.d/uhttpd enable
openwrt # /etc/init.d/uhttpd start
openwrt # /etc/init.d/relayd enable
openwrt # /etc/init.d/relayd start
&lt;/pre&gt;

&lt;p&gt;Upon completing the installation, go to the web interface, &lt;a href=&quot;http://10.9.8.7&quot;&gt;http://10.9.8.7&lt;/a&gt;, and reconfigure the LAN interface to make permanent the IP address:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Network ▷ Interfaces ▷ LAN&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/100.png&quot;&gt;&lt;img src=&quot;/assets/img/100.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, it’s time to create the bridge interface (bonding the &lt;strong&gt;lan&lt;/strong&gt; and &lt;strong&gt;wwan&lt;/strong&gt; interfaces)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/101.png&quot;&gt;&lt;img src=&quot;/assets/img/101.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-bridge.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-bridge.png&quot; alt=&quot;openwrt bridge&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And join the nearby AP (linked to the &lt;strong&gt;bridge/wwan&lt;/strong&gt; interface)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Network ▷ Wifi ▷ Scan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-client.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-client.png&quot; alt=&quot;openwrt client&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, don’t forget to create the AP repeater (linked to the &lt;strong&gt;lan&lt;/strong&gt; interface)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Network ▷ Wifi ▷ Add&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/openwrt-ap.png&quot;&gt;&lt;img src=&quot;/assets/img/openwrt-ap.png&quot; alt=&quot;openwrt ap&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s it!, a simple and robust wifi extender ✌&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://wiki.openwrt.org/toh/tp-link/tl-wdr4300&quot;&gt;http://wiki.openwrt.org/toh/tp-link/tl-wdr4300&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://tombatossals.github.io/openwrt-repetidor-wireless/&quot;&gt;http://tombatossals.github.io/openwrt-repetidor-wireless/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>talks: vlide</title>
   <link href="https://javier.io/blog/es/2017/07/27/talks-vlide.html"/>
   <published>2017-07-27T00:00:00+00:00</published>
   <updated>2017-07-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2017/07/27/talks-vlide</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="talks"/>
   
   <category term="vim"/>
   
   <category term="vlide"/>
   
   
   
   <summary type="html">talks: vlide</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2017/07/27/talks-vlide.html">&lt;h2 id=&quot;talks-vlide&quot;&gt;talks: vlide&lt;/h2&gt;

&lt;h6 id=&quot;27-jul-2017&quot;&gt;27 Jul 2017&lt;/h6&gt;

&lt;p&gt;Hoy di una charla sobre &lt;strong&gt;programación de plugins para vim&lt;/strong&gt; en el meetup
&lt;a href=&quot;https://www.meetup.com/cdmx-vim-meetup/&quot;&gt;Vim-CDMX&lt;/a&gt;: la anatomía de un
plugin, autoload, mappings, y cómo pasar de “tengo una función en mi
vimrc” a “publiqué un plugin que otros pueden instalar”.&lt;/p&gt;

&lt;p&gt;Es la secuela de la
&lt;a href=&quot;/blog/es/2011/02/24/talks-introduccion-a-vim.html&quot;&gt;introducción a vim que di en el ENLI 2011&lt;/a&gt;
— y esta vez la meta-demostración fue más lejos: la presenté con
&lt;a href=&quot;https://github.com/javier-lopez/vlide.vim&quot;&gt;vlide.vim&lt;/a&gt;, un plugin que
escribí precisamente para dar charlas desde vim. Una charla de plugins,
presentada con un plugin, dentro del editor — no se puede ser más meta.&lt;/p&gt;

&lt;p&gt;Aquí está la grabación completa:&lt;/p&gt;

&lt;div class=&quot;asciinema-cast&quot; data-cast=&quot;/assets/asciinema.org/casts/132191.json.gz&quot; data-start-at=&quot;10&quot; data-fallback=&quot;https://asciinema.org/a/132191&quot;&gt;&lt;/div&gt;

&lt;h3 id=&quot;lo-más-poderoso-los-slides-ejecutan&quot;&gt;Lo más poderoso: los slides ejecutan&lt;/h3&gt;

&lt;p&gt;vlide no es un visor de láminas — cada slide puede traer bloques
&lt;code&gt;@autoexe&lt;/code&gt; que &lt;strong&gt;se ejecutan al renderizarse&lt;/strong&gt;. Esta charla usa 44
bloques de shell (y por esa vía, cualquier intérprete que la shell
invoque: python, awk, lo que sea): el slide que explica un concepto es
el mismo programa que corre su demo.&lt;/p&gt;

&lt;p&gt;Y la jugada maestra es la orquestación de &lt;strong&gt;tmux&lt;/strong&gt;: la presentación
arranca verificando que exista una sesión de tmux activa, y de ahí en
adelante los slides abren splits y mandan keystrokes a un segundo vim en
vivo. El demo del &lt;em&gt;monkey typer&lt;/em&gt;: un slide escribe
&lt;code&gt;/tmp/vlide_monkey_typer.c&lt;/code&gt; con la indentación hecha un desastre, lo
abre en el panel de al lado, y el slide siguiente lo formatea frente al
público con &lt;code&gt;gg=G&lt;/code&gt; — sin que el presentador toque ese panel. Los slides
no describen la demo: la ejecutan.&lt;/p&gt;

&lt;h3 id=&quot;revívela-en-tu-terminal&quot;&gt;Revívela en tu terminal&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget -qO- https://raw.githubusercontent.com/javier-lopez/talks/master/vim-plugins-dev-es.md | vim +Vlide -
&lt;/pre&gt;

&lt;p&gt;Córrela &lt;strong&gt;dentro de una sesión de tmux&lt;/strong&gt; — los slides la usan para las
demos en vivo. Con &lt;a href=&quot;https://github.com/javier-lopez/vlide.vim&quot;&gt;vlide.vim&lt;/a&gt;
instalado, espacio avanza y backspace retrocede; sin vlide, igual se
deja leer como un archivo de ayuda de vim. El fuente vive en
&lt;a href=&quot;https://github.com/javier-lopez/talks/blob/master/vim-plugins-dev-es.md&quot;&gt;talks/vim-plugins-dev-es.md&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>talks: ubuconla 2016</title>
   <link href="https://javier.io/blog/es/2016/08/05/talks-ubuconla-2016.html"/>
   <published>2016-08-05T00:00:00+00:00</published>
   <updated>2016-08-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2016/08/05/talks-ubuconla-2016</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="talks"/>
   
   <category term="ubuntu"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">talks: ubuconla 2016</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2016/08/05/talks-ubuconla-2016.html">&lt;h2 id=&quot;talks-ubuconla-2016&quot;&gt;talks: ubuconla 2016&lt;/h2&gt;

&lt;h6 id=&quot;05-aug-2016&quot;&gt;05 Aug 2016&lt;/h6&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/ubuconla.png&quot; alt=&quot;UbuConLA&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Este fin de semana di dos charlas en la
&lt;a href=&quot;https://wiki.ubuntu.com/UbuConLA&quot;&gt;UbuConLA&lt;/a&gt; — la quinta edición de la
conferencia, celebrada el 5 y 6 de agosto en la Universidad de Lima,
Perú:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://people.ubuntu.com/~javier-lopez/talks/ubuntu-y-tu/&quot;&gt;Ubuntu y tu&lt;/a&gt;&lt;/strong&gt;
— qué es Ubuntu más allá del sistema operativo: la comunidad, cómo se
gobierna, y los caminos para pasar de usuario a colaborador.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/talks/shundle/&quot;&gt;Shundle, un administrador de plugins para la shell&lt;/a&gt;&lt;/strong&gt;
— la herramienta que escribí cuando mi &lt;code&gt;~/.bashrc&lt;/code&gt; se volvió inmanejable.
Ya la había presentado en la
&lt;a href=&quot;/blog/es/2014/03/26/talks-shundle.html&quot;&gt;Jornada Universitaria de TI en 2014&lt;/a&gt;;
esta vez frente a la comunidad Ubuntu de toda Latinoamérica. El contexto
completo está en &lt;a href=&quot;/blog/en/2013/11/15/shundle.html&quot;&gt;shundle&lt;/a&gt;; los slides
se navegan con las flechas del teclado.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>staticus, a poor man status page generator</title>
   <link href="https://javier.io/blog/en/2016/05/19/staticus-poor-man-status-page-generator.html"/>
   <published>2016-05-19T00:00:00+00:00</published>
   <updated>2016-05-19T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2016/05/19/staticus-poor-man-status-page-generator</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">staticus, a poor man status page generator</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2016/05/19/staticus-poor-man-status-page-generator.html">&lt;h2 id=&quot;staticus-a-poor-man-status-page-generator&quot;&gt;staticus, a poor man status page generator&lt;/h2&gt;

&lt;h6 id=&quot;19-may-2016&quot;&gt;19 May 2016&lt;/h6&gt;

&lt;p&gt;I’m not sure what excuse to use to back this entry, I guess I’m just a lazy and irresponsible person, last week I got myself in need for a basic status page generator and all the alternatives I looked at were either too complicated or non free (as in speech and beer), so I decided to go my own (that’s the irresponsible part) and bundle everything in a single shell script to avoid dependencies (that’s the lazy one).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/staticus&quot;&gt;Staticus&lt;/a&gt; is the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/staticus-1.png&quot;&gt;&lt;img src=&quot;/assets/img/staticus-1.png&quot; alt=&quot;staticus 1&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tools itself is pretty simple, to generate the above picture I ran:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;staticus go #generate staticus.txt and staticus.html in the current directory
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Could be added to a cronjob to run periodically&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;* * * * * /path/to/staticus -o /var/www/status/index.html -O /tmp/staticus.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The script accepts several options, however to set threshold values and other &lt;em&gt;advanced&lt;/em&gt; parameters it’s best to define a configuration file (by default /etc/staticus.conf):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module_memory_threshold=&quot;80&quot;
module_swap_threshold=&quot;80&quot;
module_load_threshold=&quot;4&quot;
module_storage_threshold=&quot;80&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Other possible values are described in the &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/staticus#L8&quot;&gt;configuration section&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That’s it, if you ever use staticus, you didn’t get it from me 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jayfk/statuspage&quot;&gt;@jayfk’s statuspage project, from where I stole the html theme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>terminfo variable</title>
   <link href="https://javier.io/blog/en/2016/02/12/terminfo-error-opening-terminal.html"/>
   <published>2016-02-12T00:00:00+00:00</published>
   <updated>2016-02-12T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2016/02/12/terminfo-error-opening-terminal</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">terminfo variable</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2016/02/12/terminfo-error-opening-terminal.html">&lt;h2 id=&quot;terminfo-variable&quot;&gt;terminfo variable&lt;/h2&gt;

&lt;h6 id=&quot;12-feb-2016&quot;&gt;12 Feb 2016&lt;/h6&gt;

&lt;p&gt;This is a quick reminder to my future self about how to fix some annoying TERM errors&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./bin/atop
Error opening terminal: rxvt-unicode-256color.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On these cases it could help to define the TERM variable to a more standard type, eg;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;TERM=xterm ./bin/atop
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or/and specify the TERMINFO variable, eg:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;TERMINFO=&apos;/usr/share/terminfo/&apos;  ./bin/atop
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is especially useful for compiled programs who configured the TERMINFO variable to a different one during compilation time.&lt;/p&gt;

&lt;p&gt;That’s it, happy launching 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/12345675/screen-cannot-find-terminfo-entry-for-xterm-256color&quot;&gt;screen cannot find terminfo entry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>a simple cli upnp/dlna browser</title>
   <link href="https://javier.io/blog/en/2016/01/22/simple-upnp-dlna-browser.html"/>
   <published>2016-01-22T00:00:00+00:00</published>
   <updated>2016-01-22T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2016/01/22/simple-upnp-dlna-browser</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">a simple cli upnp/dlna browser</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2016/01/22/simple-upnp-dlna-browser.html">&lt;h2 id=&quot;a-simple-cli-upnpdlna-browser&quot;&gt;a simple cli upnp/dlna browser&lt;/h2&gt;

&lt;h6 id=&quot;22-jan-2016&quot;&gt;22 Jan 2016&lt;/h6&gt;

&lt;p&gt;Last weekend I installed a usb hard disk to my &lt;a href=&quot;https://openwrt.org/&quot;&gt;openwrt&lt;/a&gt; &lt;a href=&quot;/blog/en/2017/11/23/installing-openwrt-as-wireless-repeater.html&quot;&gt;router&lt;/a&gt;, added some content, setup &lt;a href=&quot;https://wiki.openwrt.org/doc/uci/minidlna&quot;&gt;minidlna&lt;/a&gt; and called it a day, easy way to stream movies locally. I tested the setup with all my endpoints and while it worked great with most of them I was having problems streaming to my Linux laptop, that’s funny considering the router itself runs the same OS.&lt;/p&gt;

&lt;p&gt;Looking around I read suggestions about installing vlc,totem,xbmc,etc. All of those media players are great however I already have mplayer2 which is able to play http streams, that’s &lt;a href=&quot;https://gxben.wordpress.com/2008/08/24/why-do-i-hate-dlna-protocol-so-much/&quot;&gt;a great deal&lt;/a&gt; about upnp/dlna. So I took some time to hack a quick and dirty script and that’s how &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/simple-dlna-browser&quot;&gt;simple-dlna-browser&lt;/a&gt; was born.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ simple-dlna-browser
Usage: simple-dlna-browser [OPTIONS] PATTERN
&lt;/pre&gt;

&lt;h3 id=&quot;examples&quot;&gt;Examples&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ simple-dlna-browser -l #autodetection requires &apos;socat&apos;
http://192.168.1.254:8200/rootDesc.xml (Multimedia)
┬
├── Apocalipto
├── Contacto
├── Coraline.y.la.puerta.secreta
...

$ simple-dlna-browser contacto | xargs mplayer

$ simple-dlna-browser -s 192.168.1.254 contacto | xargs mplayer
&lt;/pre&gt;

&lt;p&gt;I used minidlna 1.1.4-2 as a reference, so it may not work with other media servers.&lt;/p&gt;

&lt;p&gt;That’s it, happy streaming 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/simple-dlna-browser&quot;&gt;https://github.com/javier-lopez/learn/blob/master/sh/tools/simple-dlna-browser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>genpass, yet another stateless password generator</title>
   <link href="https://javier.io/blog/en/2016/01/07/genpass-yet-another-stateless-password-generator.html"/>
   <published>2016-01-07T00:00:00+00:00</published>
   <updated>2016-01-07T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2016/01/07/genpass-yet-another-stateless-password-generator</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="security"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">genpass, yet another stateless password generator</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2016/01/07/genpass-yet-another-stateless-password-generator.html">&lt;h2 id=&quot;genpass-yet-another-stateless-password-generator&quot;&gt;genpass, yet another stateless password generator&lt;/h2&gt;

&lt;h6 id=&quot;07-jan-2016&quot;&gt;07 Jan 2016&lt;/h6&gt;

&lt;p&gt;Since some time I’ve realized I’m pretty bad at memorizing strong passwords, as a result I’ve been using an unique moderated strong “master” password and I’ve derived others by using a shell alias:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ alias getpass=&apos;_getpass() { _g=$(printf &quot;%s&quot; &quot;${*}&quot; | \
    md5sum | openssl enc -base64     | \
    cut -c1-20); printf &quot;%s&quot; &quot;${_g}&quot; | \
    xclip -selection clipboard 2&amp;gt;/dev/null || \
    printf &quot;%s\\n&quot; &quot;${_g}&quot;; }; _getpass&apos;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I knew than the resulting passwords weren’t really good at keeping my master password secure, after all, md5 hashing is extremely fast and with known &lt;a href=&quot;http://www.mscs.dal.ca/~selinger/md5collision/&quot;&gt;collision&lt;/a&gt; &lt;a href=&quot;http://natmchugh.blogspot.mx/2015/02/create-your-own-md5-collisions.html&quot;&gt;problems&lt;/a&gt;, even worse, I didn’t even iterate over it. So I keep it in secret till I had the time or willingness to use an informed solution. During the last month I’ve been reviewing the state of art of password generation schemes and found than some &lt;a href=&quot;https://en.wikipedia.org/wiki/Bcrypt&quot;&gt;derivation&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Scrypt&quot;&gt;functions&lt;/a&gt; have been designed specifically for this task. So I converted the shell alias to a C program and &lt;a href=&quot;https://github.com/javier-lopez/genpass&quot;&gt;genpass&lt;/a&gt; is the result.&lt;/p&gt;

&lt;p&gt;Genpass is by no means original, however when looking around I found than most password generators were plain broken, most of them were iterating fast checksum functions, md5, sha1, sha512, etc, or the ones using either bcrypt or scrypt used hard-coded parameters which could make them vulnerable to future computers. Using a slow key derivation function is as practical as the user is willing to wait, so often more secure default parameters aren’t used because it would make the derivation painfully slow. Fortunately some smart guys have found this &lt;a href=&quot;https://www.cs.utexas.edu/%7Ebwaters/publications/papers/www2005.pdf&quot;&gt;problem before&lt;/a&gt; and have suggested to use a cache key to accelerate the process for legitimate users. That’s what genpass uses to propose the following paranoid defaults.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Parameter&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Cache cost (Scrypt N)&lt;/td&gt;
      &lt;td&gt;2^20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cost       (Scrypt N)&lt;/td&gt;
      &lt;td&gt;2^14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Scrypt r&lt;/td&gt;
      &lt;td&gt;8 bits&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Scrypt p&lt;/td&gt;
      &lt;td&gt;16 bits&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Key length&lt;/td&gt;
      &lt;td&gt;32 bytes, 256 bits&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Encoding&lt;/td&gt;
      &lt;td&gt;z85&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;It’s still convenient to use your own parameters, as the default settings will change as computers get updated on CPU/RAM.&lt;/p&gt;

&lt;h3 id=&quot;usage&quot;&gt;Usage&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/javier-lopez/genpass/master/genpass.gif&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/javier-lopez/genpass/master/genpass.gif&quot; alt=&quot;&quot; style=&quot;border: 1px solid white;margin-bottom: 3%;&quot; /&gt;&lt;/a&gt;
&lt;!--$ genpass--&gt;
&lt;!--Name: Guy Mann--&gt;
&lt;!--Site: github.com--&gt;
&lt;!--Master password: passwd #it won&apos;t be shown--&gt;
&lt;!--4c%7hZ5w]MZUB6RRPCJ&amp;?wKTFtd[6Oj.P.02d+kIs--&gt;&lt;/p&gt;

&lt;p&gt;The first time to be executed it will take a relative long time (a couple of minutes) to get back. It’ll create a cache key and will save it to &lt;code&gt;~/.genpass-cache&lt;/code&gt; (this path can be customized), then it will combine it with the master password and the site string to generate the final password, which can be in several encodings (z85 by default). The cache key file should be guarded with moderate caution, if it gets leaked possible attackers may have an easier time guessing the master password (although it still will be considerably harder than average brute force attacks). Later invocations will be instantly (taking on average 0.1secs). This way the scheme strives for the best balance between security and usability.&lt;/p&gt;

&lt;p&gt;I’ve also added a &lt;code&gt;getpass&lt;/code&gt; wrapper which paste the resulting password to the system clipboard and sets a timeout (10 seconds by default) after which the password is removed.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;h5 id=&quot;ubuntu-based-systems-lts&quot;&gt;Ubuntu based systems (LTS)&lt;/h5&gt;

&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository ppa:minos-archive/main
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install genpass
&lt;/code&gt;&lt;/pre&gt;

&lt;h5 id=&quot;other-linux-distributions-static-binaries&quot;&gt;Other Linux distributions, static binaries&lt;/h5&gt;

&lt;pre&gt;&lt;code&gt;$ sh &amp;lt;(wget -qO- s.minos.io/s) -x genpass
&lt;/code&gt;&lt;/pre&gt;

&lt;h5 id=&quot;from-source&quot;&gt;From source&lt;/h5&gt;

&lt;pre&gt;&lt;code&gt;$ make
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it, happy password generation 😋&lt;/p&gt;

&lt;p&gt;References&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/genpass&quot;&gt;genpass&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Bcrypt&quot;&gt;bcrypt&lt;/a&gt;, slow key derivation function&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Scrypt&quot;&gt;scrypt&lt;/a&gt;, slow key derivation function&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20170127011156/https://www.pwdhash.com/&quot;&gt;pwdhash&lt;/a&gt;, md5 based password generator, js&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.supergenpass.com/&quot;&gt;supergenpass&lt;/a&gt;, md5 iteration based password generator, js&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://passwordmaker.org&quot;&gt;passwordmaker&lt;/a&gt;, md5, sha1, sha256, &lt;a href=&quot;http://passwordmaker.org/FAQ#Which_hash_algorithms_are_supported.3F&quot;&gt;etc&lt;/a&gt; based password generator, several implementations&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://masterpasswordapp.com/&quot;&gt;masterpassword&lt;/a&gt;, hard-coded scrypt based password generator, several implementations&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kaepora/npwd&quot;&gt;npwd&lt;/a&gt;, hard-coded scrypt based password generator, Nodejs&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/postboy/cpwd&quot;&gt;cpwd&lt;/a&gt;, hard-coded scrypt based password generator, C&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>a simple mpc web interface</title>
   <link href="https://javier.io/blog/en/2016/01/02/simple-mpc-web-interface.html"/>
   <published>2016-01-02T00:00:00+00:00</published>
   <updated>2016-01-02T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2016/01/02/simple-mpc-web-interface</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="music"/>
   
   <category term="python"/>
   
   
   
   <summary type="html">a simple mpc web interface</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2016/01/02/simple-mpc-web-interface.html">&lt;h2 id=&quot;a-simple-mpc-web-interface&quot;&gt;a simple mpc web interface&lt;/h2&gt;

&lt;h6 id=&quot;02-jan-2016&quot;&gt;02 Jan 2016&lt;/h6&gt;

&lt;p&gt;Sometimes while listening music at my desk my niece (~8y/o) shows up and asks me to skip the current song, most of the times I do it instantly, however when I’m really busy I may delay some seconds, in those occasions she goes over my keyboard and press the &lt;code&gt;next&lt;/code&gt; button by herself. Today morning was one of those days, so I though it shouldn’t be too difficult to install a mpd client in her ipad to give her full control =)&lt;/p&gt;

&lt;p&gt;It turned to be more trouble that I though, first, there are no free mpd clients on the ipad software store (or it’s not available in my region, LATAM), and most &lt;a href=&quot;http://mpd.wikia.com/wiki/Clients&quot;&gt;web clients&lt;/a&gt; require a fair amount of dependencies and some work to get them running. I don’t want yet another service to maintain, so I decided to hack a simple web interface for &lt;code&gt;mpc&lt;/code&gt;, based on Gwenn Englebienne previous work on &lt;a href=&quot;http://www.gwenn.dk/mplayer-remote.html&quot;&gt;mplayer&lt;/a&gt; and this is the result:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget https://raw.githubusercontent.com/javier-lopez/learn/master/python/tools/simple-mpc-remote
$ python simple-mpc-remote -p 8080
Started httpserver on port 8080
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/simple-mpc-remote.png&quot;&gt;&lt;img src=&quot;/assets/img/simple-mpc-remote.png&quot; alt=&quot;simple mpc remote&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;simple-mpc-remote&lt;/code&gt; has no dependencies, other than python +2.7, mpc and mpd and it’s really simple to install/use. Since it does little effort to sanitize input it could be dangerous, however since I trust my local network I’ll leave it like that for now.&lt;/p&gt;

&lt;p&gt;Happy skipping 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.gwenn.dk/mplayer-remote.html&quot;&gt;mplayer-remote&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/javier-lopez/learn/master/python/tools/simple-mpc-remote&quot;&gt;simple-mpc-remote&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>using imagemagick, awk and kmeans to find dominant colors in images</title>
   <link href="https://javier.io/blog/en/2015/09/30/using-imagemagick-and-kmeans-to-find-dominant-colors-in-images.html"/>
   <published>2015-09-30T00:00:00+00:00</published>
   <updated>2015-09-30T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/09/30/using-imagemagick-and-kmeans-to-find-dominant-colors-in-images</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">using imagemagick, awk and kmeans to find dominant colors in images</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/09/30/using-imagemagick-and-kmeans-to-find-dominant-colors-in-images.html">&lt;h2 id=&quot;using-imagemagick-awk-and-kmeans-to-find-dominant-colors-in-images&quot;&gt;using imagemagick, awk and kmeans to find dominant colors in images&lt;/h2&gt;

&lt;h6 id=&quot;30-sep-2015&quot;&gt;30 Sep 2015&lt;/h6&gt;

&lt;p&gt;Some days ago I was reading &lt;a href=&quot;http://charlesleifer.com/blog/using-python-to-generate-awesome-linux-desktop-themes/&quot;&gt;“Using python to generate awesome linux desktop themes”&lt;/a&gt; and got impressed by a technique to obtain dominant colors from images, I went ahead and tried to run the examples but &lt;a href=&quot;http://www.pythonware.com/products/pil/&quot;&gt;PIL&lt;/a&gt; proved difficult to install, so I looked around to see if I could replace it for some other utility and it turned out that &lt;a href=&quot;http://www.imagemagick.org/script/convert.php&quot;&gt;&lt;strong&gt;convert&lt;/strong&gt;&lt;/a&gt; (which is part of the imagemagick package) is powerful enough for the duty.&lt;/p&gt;

&lt;p&gt;Besides resizing, &lt;strong&gt;convert&lt;/strong&gt; can output the rgb values of any image, so I reimplemented the kmean algorithm on awk and that’s how &lt;a href=&quot;https://raw.githubusercontent.com/javier-lopez/learn/master/sh/tools/dcolors&quot;&gt;dcolors&lt;/a&gt; was born. By default dcolor will resize (on RAM) the input image to 25x25 using a 1px deviation and 3 clusters for an average time of 1s per image, further customization are possible to increase quality, quantity or performance.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ time dcolors akira_800x800.jpg
163,80,50
65,77,93
40,26,34

real    0m1.176s
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/akira_800x800.jpg&quot;&gt;&lt;img src=&quot;/assets/img/akira_800x800.jpg&quot; alt=&quot;akira 800x800&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;center&gt;
&lt;span style=&quot;background-color: #a35032&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #414d5d&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #281a22&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/center&gt;
&lt;p&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ time ./dcolors --resize 100x100 -d 10 akira-cycle-2.png
49,85,118
19,42,69
125,173,165

real    0m3.188s
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/akira-cycle-2_800x800.png&quot;&gt;&lt;img src=&quot;/assets/img/akira-cycle-2_800x800.png&quot; alt=&quot;akira cycle 2 800x800&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;center&gt;
&lt;span style=&quot;background-color: #315576&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #132a45&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #7dada5&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/center&gt;
&lt;p&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ time ./dcolors -f hex -k 8 akira-neo-tokyo-7_800x800.png
#495D66
#223634
#1C293A
#68706E
#3C4F4A
#38495D
#293C48
#0B1016

real    0m1.005s
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/akira-neo-tokyo-7_800x800.png&quot;&gt;&lt;img src=&quot;/assets/img/akira-neo-tokyo-7_800x800.png&quot; alt=&quot;akira neo tokyo 7 800x800&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;center&gt;
&lt;span style=&quot;background-color: #495D66&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #223634&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #1C293A&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #68706E&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #3C4F4A&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #38495D&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #293C48&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style=&quot;background-color: #0B1016&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;/center&gt;

&lt;p&gt;That’s it, happy hacking 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://charlesleifer.com/blog/using-python-and-k-means-to-find-the-dominant-colors-in-images/&quot;&gt;http://charlesleifer.com/blog/using-python-and-k-means-to-find-the-dominant-colors-in-images/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/K-means_clustering&quot;&gt;https://en.wikipedia.org/wiki/K-means_clustering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>install apt packages from deb postinst</title>
   <link href="https://javier.io/blog/en/2015/09/10/apt-packages-from-deb-postinst.html"/>
   <published>2015-09-10T00:00:00+00:00</published>
   <updated>2015-09-10T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/09/10/apt-packages-from-deb-postinst</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">install apt packages from deb postinst</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/09/10/apt-packages-from-deb-postinst.html">&lt;h2 id=&quot;install-apt-packages-from-deb-postinst&quot;&gt;install apt packages from deb postinst&lt;/h2&gt;

&lt;h6 id=&quot;10-sep-2015&quot;&gt;10 Sep 2015&lt;/h6&gt;

&lt;p&gt;During the last couple of years I’ve been building &lt;a href=&quot;https://github.com/minos-org&quot;&gt;yet another Linux distribution&lt;/a&gt;, mostly to have my favorite software nicely packaged, but also to experiment and have fun =)&lt;/p&gt;

&lt;p&gt;One important part of it is its configuration file, &lt;strong&gt;/etc/minos/config&lt;/strong&gt; or &lt;strong&gt;~/.minos/config&lt;/strong&gt;, e.g.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
wallpaper      ~/data/images/wallpapers/sunlight.png
lock-wallpaper ~/data/images/wallpapers/lock.png
app-core       mozilla-firefox mozilla-flashplayer
app-purge      xinetd sasl2-bin sendmail sendmail-base sendmail-bin sensible-mda
&lt;/pre&gt;

&lt;p&gt;I’ve chosen Debian/Ubuntu infrastructure for the initial implementation but probably will change it in the future (bedrock linux?). Anyway, since some of the parameters accept additional packages I’ve been having fun abusing the maintainer scripts to do so, this is how I’ve done it.&lt;/p&gt;

&lt;h2 id=&quot;locks&quot;&gt;Locks&lt;/h2&gt;

&lt;p&gt;Apt, rpm, and most package managers use locks to ensure its operations are as atomic as possible, it helps them to keep packages under control, so when trying to abuse maintainer scripts (on this case postinst) the first error to come up will be:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?`
&lt;/pre&gt;

&lt;p&gt;These files can be moved temporally to launch additional apt/dpkg instances, after some experimentation the list is as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/var/lib/dpkg/lock
/var/cache/apt/archives/lock
/var/lib/dpkg/updates/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dpkg/apt-get uses a database in text plain located at &lt;strong&gt;/var/lib/dpkg/status&lt;/strong&gt;, it’s kind of important to keep track of it too since the result of every apt/dpkg invocation is dumped to it upon completion (multiple backups are available at /var/backups/dpkg.status).&lt;/p&gt;

&lt;h2 id=&quot;post-execution&quot;&gt;Post execution&lt;/h2&gt;

&lt;p&gt;There seem to exist several options to abuse apt-get, cron jobs, daemons queues (aptdaemon?), custom waits, but all them require a considerable amount of time after the main apt-get/dpkg is done, what if the system go down short after?. I finally decided to install everything within the main apt-get process and merge changes at the end (that way it takes a couple of seconds processing the missing text operations instead of probably several minutes for further apt instances).&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
#!/bin/sh
package=my-pkg

_dpkg_suspend_process() {
    #unlock standard files
    busybox mv     /var/lib/dpkg/lock           /var/lib/dpkg/lock.suspended
    busybox rm -rf /var/lib/dpkg/updates.suspended/
    busybox mv     /var/lib/dpkg/updates/       /var/lib/dpkg/updates.suspended
    busybox mkdir  /var/lib/dpkg/updates/
    busybox mv     /var/cache/apt/archives/lock /var/cache/apt/archives/lock.suspended

    #debconf missing file descriptors workaround
    busybox cp /usr/share/debconf/confmodule       /usr/share/debconf/confmodule.bk
    busybox cp /usr/share/minos/debconf/confmodule /usr/share/debconf/confmodule

    #while apt is being executed it modifies the status file which brings conflicts
    #to new packages if they&apos;re installed/removed in abused apt instances, therefore
    #the status-old file (which represent the original state in which the first
    #apt instance was launched) is used to create temporal diffs which will be merged
    #at the end
    busybox cp     /var/lib/dpkg/status         /var/lib/dpkg/status.suspended
    busybox cp     /var/lib/dpkg/status-old     /var/lib/dpkg/status-orig
    busybox cp     /var/lib/dpkg/status-orig    /var/lib/dpkg/status
}

_dpkg_continue_process() {
    #relock standard files
    busybox rm -rf /var/lib/dpkg/updates
    busybox mv     /var/lib/dpkg/lock.suspended           /var/lib/dpkg/lock
    busybox mv     /var/lib/dpkg/updates.suspended        /var/lib/dpkg/updates
    busybox mv     /var/cache/apt/archives/lock.suspended /var/cache/apt/archives/lock
    busybox mv     /var/lib/dpkg/status.suspended         /var/lib/dpkg/status

    #debconf missing file descriptors workaround
    busybox mv     /usr/share/debconf/confmodule.bk       /usr/share/debconf/confmodule

    #keep status-old file to survive multiple abused apt instances
    busybox mv     /var/lib/dpkg/status-orig              /var/lib/dpkg/status-old
}

_dpkg_sync_status_db() {
    _dpkg_sync_status_db_script=&quot;/var/lib/dpkg/dpkg-sync-status-db&quot;
    _dpkg_sync_status_db_script_generator() {
        printf &quot;%s\\n&quot; &quot;#!/bin/sh&quot;
        printf &quot;%s\\n&quot; &quot;#autogenerated by ${package}: $(date +%d-%m-%Y:%H:%M)&quot;
        printf &quot;\\n&quot;
        printf &quot;%s\\n&quot; &apos;##close stdout&apos;
        printf &quot;%s\\n&quot; &apos;#exec 1&amp;lt;&amp;amp;-&apos;
        printf &quot;%s\\n&quot; &apos;##close stderr&apos;
        printf &quot;%s\\n&quot; &apos;#exec 2&amp;lt;&amp;amp;-&apos;
        printf &quot;%s\\n&quot; &apos;##open stdout as $log_file file for read and write.&apos;
        printf &quot;%s\\n&quot; &quot;#exec 1&amp;lt;&amp;gt; /tmp/${package}.\${$}.debug&quot;
        printf &quot;%s\\n&quot; &apos;##redirect stderr to stdout&apos;
        printf &quot;%s\\n&quot; &apos;#exec 2&amp;gt;&amp;amp;1&apos;
        printf &quot;%s\\n&quot; &apos;#set -x #enable trace mode&apos;
        printf &quot;\\n&quot;
        printf &quot;%s\\n&quot; &quot;while fuser /var/lib/dpkg/lock &amp;gt;/dev/null 2&amp;gt;&amp;1; do sleep 1; done&quot;
        printf &quot;\\n&quot;
        printf &quot;%s\\n&quot; &apos;pkgs__add=&quot;$(cat /var/lib/apt/apt-add-queue)&quot;&apos;
        printf &quot;%s\\n&quot; &apos;if [ -n &quot;${pkgs__add}&quot; ]; then&apos;
        printf &quot;%s\\n&quot; &apos;  for pkg in $pkgs__add; do&apos;
        printf &quot;%s\\n&quot; &apos;    if ! busybox grep &quot;^Package: ${pkg}$&quot; /var/lib/dpkg/status &amp;gt;/dev/null 2&amp;gt;&amp;1; then&apos;
        printf &quot;%s\\n&quot; &apos;      busybox sed -n &quot;/Package: ${pkg}$/,/^$/p&quot; \&apos;
        printf &quot;%s\\n&quot; &quot;      /var/lib/dpkg/status-append-queue &amp;gt;&amp;gt; /var/lib/dpkg/status&quot;
        printf &quot;%s\\n&quot; &quot;    fi&quot;
        printf &quot;%s\\n&quot; &quot;  done&quot;
        printf &quot;%s\\n&quot; &quot;fi&quot;
        printf &quot;\\n&quot;
        printf &quot;%s\\n&quot; &apos;pkgs__rm=&quot;$(cat /var/lib/apt/apt-rm-queue)&quot;&apos;
        printf &quot;%s\\n&quot; &apos;if [ -n &quot;${pkgs__rm}&quot; ]; then&apos;
        printf &quot;%s\\n&quot; &apos;  for pkg in $pkgs__rm; do&apos;
        printf &quot;%s\\n&quot; &apos;    busybox sed -i &quot;/Package: ${pkg}$/,/^$/d&quot; /var/lib/dpkg/status&apos;
        printf &quot;%s\\n&quot; &quot;  done&quot;
        printf &quot;%s\\n&quot; &quot;fi&quot;
        printf &quot;\\n&quot;
        printf &quot;%s\\n&quot; &quot;mv /var/lib/apt/apt-add-queue /var/lib/apt/apt-add-queue.bk&quot;
        printf &quot;%s\\n&quot; &quot;mv /var/lib/apt/apt-rm-queue  /var/lib/apt/apt-rm-queue.bk&quot;
        printf &quot;%s\\n&quot; &quot;mv /var/lib/dpkg/status-append-queue /var/lib/dpkg/status-append-queue.bk&quot;
        printf &quot;\\n&quot;
        printf &quot;%s\\n&quot; &quot;rm -rf /var/lib/apt/apt-add-queue /var/lib/apt/apt-rm-queue&quot;
        printf &quot;%s\\n&quot; &quot;rm -rf ${_dpkg_sync_status_db_script}&quot;
    }

    _dpkg_sync_status_db_script_generator &amp;gt; &quot;${_dpkg_sync_status_db_script}&quot;
    chmod +x &quot;${_dpkg_sync_status_db_script}&quot;
    _daemonize /bin/sh -c &quot;${_dpkg_sync_status_db_script}&quot;
}

_daemonize() {
    #http://blog.n01se.net/blog-n01se-net-p-145.html
    [ -z &quot;${1}&quot; ] &amp;amp;&amp;amp; return 1
    (   #1. fork, to guarantee the child is not a process
        #group leader, necessary for setsid) and have the
        #parent exit (to allow control to return to the shell)

        #2. redirect stdin/stdout/stderr before running child
        [ -t 0 ] &amp;amp;&amp;amp; exec  &amp;lt;/dev/null
        [ -t 1 ] &amp;amp;&amp;amp; exec  &amp;gt;/dev/null
        [ -t 2 ] &amp;amp;&amp;amp; exec 2&amp;gt;/dev/null
        if ! command -v &quot;setsid&quot; &amp;gt;/dev/null 2&amp;gt;&amp;1; then
            #2.1 guard against HUP and INT (in child)
            trap &apos;&apos; 1 2
        fi

        #3. ensure cwd isn&apos;t a mounted fs so it does&apos;t block
        #umount invocations
        cd /

        #4. umask (leave this to caller)
        #umask 0

        #5. close unneeded fds
        #XCU 2.7 Redirection says: open files are represented by
        #decimal numbers starting with zero. The largest possible
        #value is implementation-defined; however, all
        #implementations shall support at least 0 to 9, inclusive,
        #for use by the application.
        i=3; while [ &quot;${i}&quot; -le &quot;9&quot; ]; do
            eval &quot;exec ${i}&amp;gt;&amp;amp;-&quot;
            i=&quot;$(($i + 1))&quot;
        done

        #6. create new session, so the child has no
        #controlling terminal, this prevents the child from
        #accesing a terminal (using /dev/tty) and getting
        #signals from the controlling terminal (e.g. HUP, INT)
        if command -v &quot;setsid&quot; &amp;gt;/dev/null 2&amp;gt;&amp;1; then
            exec setsid &quot;$@&quot;
        elif command -v &quot;nohup&quot; &amp;gt;/dev/null 2&amp;gt;&amp;1; then
            exec nohup &quot;$@&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
        else
            if [ ! -f &quot;${1}&quot; ]; then
                &quot;$@&quot;
            else
                exec &quot;$@&quot;
            fi
        fi
    ) &amp;amp;
    #2.2 guard against HUP (in parent)
    if ! command -v &quot;setsid&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 \ &amp;amp;&amp;amp;
       ! command -v &quot;nohup&quot;  &amp;gt;/dev/null 2&amp;gt;&amp;1; then
        disown -h &quot;${!}&quot;
    fi
}

_apt_add_queue() {
    for pkg in &quot;${@}&quot;; do
        if  busybox grep &quot;${pkg}&quot; /var/lib/apt/apt-rm-queue &amp;gt;/dev/null 2&amp;gt;&amp;1; then
            busybox sed -i &quot;/^${pkg}$/d&quot; /var/lib/apt/apt-rm-queue
        else
            if ! busybox grep &quot;^Package: ${pkg}$&quot; /var/lib/dpkg/status &amp;gt;/dev/null 2&amp;gt;&amp;1; then
                printf &quot;%s\\n&quot; &quot;${pkg}&quot; &amp;gt;&amp;gt; /var/lib/apt/apt-add-queue
            fi
        fi
    done; unset pkg
}

_apt_rm_queue() {
    for pkg in &quot;${@}&quot;; do
        if  busybox grep &quot;${pkg}&quot; /var/lib/apt/apt-add-queue &amp;gt;/dev/null 2&amp;gt;&amp;1; then
            busybox sed -i &quot;/^${pkg}$/d&quot; /var/lib/apt/apt-add-queue
        else
            if busybox grep &quot;^Package: ${pkg}$&quot; /var/lib/dpkg/status &amp;gt;/dev/null 2&amp;gt;&amp;1; then
                printf &quot;%s\\n&quot; &quot;${pkg}&quot; &amp;gt;&amp;gt; /var/lib/apt/apt-rm-queue
            fi
        fi
    done; unset pkg
}

_apt_install() {
    [ -z &quot;${1}&quot; ] &amp;amp;&amp;amp; return
    _apt_add_queue $(printf &quot;%s\\n&quot; &quot;${@}&quot; | busybox sed &quot;s:${package}::g&quot;)
}

_apt_purge() {
    [ -z &quot;${1}&quot; ] &amp;amp;&amp;amp; return
    _apt_rm_queue $(printf &quot;%s\\n&quot; &quot;${@}&quot; | busybox sed &quot;s:${package}::g&quot;)
}

_apt_run() {
    [ ! -f /var/lib/apt/apt-add-queue ] &amp;amp;&amp;amp; [ ! -f /var/lib/apt/apt-rm-queue ] &amp;amp;&amp;amp; return

    pkgs__add=&quot;$(cat /var/lib/apt/apt-add-queue 2&amp;gt;/dev/null)&quot;
    if [ -n &quot;${pkgs__add}&quot; ]; then
        _dpkg_suspend_process
        busybox awk &apos;/^Package: /{print $2}&apos; /var/lib/dpkg/status | \
            busybox sort &amp;gt; /var/lib/dpkg/status-pkgs.orig
        _apt_run__output=&quot;$(DEBIAN_FRONTEND=noninteractive apt-get install  \
            --no-install-recommends -y -o Dpkg::Options::=&quot;--force-confdef&quot; \
            -o Dpkg::Options::=&quot;--force-confold&quot; --force-yes ${pkgs__add} 2&amp;gt;&amp;amp;1)&quot; || \
            printf &quot;%s\\n&quot; &quot;${_apt_run__output}&quot; &amp;gt;&amp;amp;2
        busybox awk &apos;/^Package: /{print $2}&apos; /var/lib/dpkg/status | \
            busybox sort &amp;gt; /var/lib/dpkg/status-pkgs.current
        _dpkg__added_pkgs=&quot;$(busybox diff -Naur /var/lib/dpkg/status-pkgs.orig \
            /var/lib/dpkg/status-pkgs.current | busybox awk &apos;/^\+[a-zA-Z]/{gsub(&quot;^+&quot;,&quot;&quot;);print;}&apos;)&quot;
        busybox rm -rf /var/lib/dpkg/status-pkgs*
        #add dependencies
        if [ -n &quot;${_dpkg__added_pkgs}&quot; ]; then
            printf &quot;%s\\n&quot; &quot;${_dpkg__added_pkgs}&quot; &amp;gt;&amp;gt; /var/lib/apt/apt-add-queue
            printf &quot;%s\\n&quot; &quot;$(busybox sort /var/lib/apt/apt-add-queue | busybox uniq)&quot; \
                &amp;gt; /var/lib/apt/apt-add-queue
        fi

        #extract dpkg status output to append it at the end
        for pkg in $_dpkg__added_pkgs; do
            busybox sed -n &apos;/Package: &apos;&quot;${pkg}&quot;&apos;$/,/^$/p&apos; /var/lib/dpkg/status \
                &amp;gt;&amp;gt; /var/lib/dpkg/status-append-queue
        done
        _dpkg_continue_process
    fi

    pkgs__rm=&quot;$(cat /var/lib/apt/apt-rm-queue 2&amp;gt;/dev/null)&quot;
    if [ -n &quot;${pkgs__rm}&quot; ]; then
        _dpkg_suspend_process
        busybox awk &apos;/^Package: /{print $2}&apos; /var/lib/dpkg/status | \
            busybox sort &amp;gt; /var/lib/dpkg/status-pkgs.orig
        _apt_run__output=&quot;$(DEBIAN_FRONTEND=noninteractive apt-get purge \
            -y ${pkgs__rm} 2&amp;gt;&amp;amp;1)&quot; || printf &quot;%s\\n&quot; &quot;${_apt_run__output}&quot; &amp;gt;&amp;amp;2
        busybox awk &apos;/^Package: /{print $2}&apos; /var/lib/dpkg/status | \
            busybox sort &amp;gt; /var/lib/dpkg/status-pkgs.current
        _dpkg__removed_pkgs=&quot;$(busybox diff -Naur /var/lib/dpkg/status-pkgs.orig \
            /var/lib/dpkg/status-pkgs.current | busybox awk &apos;/^-[a-zA-Z]/{gsub(&quot;^-&quot;,&quot;&quot;);print;}&apos;)&quot;
        busybox rm -rf /var/lib/dpkg/status-pkgs*
        #remove dependencies
        if [ -n &quot;${_dpkg__removed_pkgs}&quot; ]; then
            printf &quot;%s\\n&quot; &quot;${_dpkg__removed_pkgs}&quot; &amp;gt;&amp;gt; /var/lib/apt/apt-rm-queue
            printf &quot;%s\\n&quot; &quot;$(busybox sort /var/lib/apt/apt-rm-queue | busybox uniq)&quot; \
                &amp;gt; /var/lib/apt/apt-rm-queue
        fi
        _dpkg_continue_process
    fi

    _dpkg_sync_status_db
}

_apt_install additional packages
_apt_purge   ugly packages
_apt_run
&lt;/pre&gt;

&lt;p&gt;Not the most elegant solution but it’s works, I’ll leave it like that until I find a better alternative or change base distros.&lt;/p&gt;

&lt;p&gt;Happy abusing 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/18599599/apt-get-commands-from-within-a-deb-postinst&quot;&gt;http://stackoverflow.com/questions/18599599/apt-get-commands-from-within-a-deb-postinst&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>papers I liked</title>
   <link href="https://javier.io/blog/en/2015/08/10/papers-i-liked.html"/>
   <published>2015-08-10T00:00:00+00:00</published>
   <updated>2015-08-10T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/08/10/papers-i-liked</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="security"/>
   
   <category term="personal"/>
   
   
   
   <summary type="html">papers I liked</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/08/10/papers-i-liked.html">&lt;h2 id=&quot;papers-i-liked&quot;&gt;papers I liked&lt;/h2&gt;

&lt;h6 id=&quot;10-aug-2015&quot;&gt;10 Aug 2015&lt;/h6&gt;

&lt;p&gt;From time to time I read papers about any subject, mostly about computer science, and then forgot which or where it’s available for future reference. So I’m creating this list as a kind of personal wiki to do not forget anymore.&lt;/p&gt;

&lt;h3 id=&quot;computer-security&quot;&gt;Computer Security&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20150506055748/http://www.iseclab.org:80/papers/sp2013privexec&quot;&gt;PrivExec: Private Execution as an Operating System Service&lt;/a&gt; - 2013. &lt;a href=&quot;http://f.javier.io/rep/papers/sp2013privexec.pdf&quot;&gt;[pdf]&lt;/a&gt; 16 Pag. Kernel side private / temporal / irrecoverable execution environments.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.comp.nus.edu.sg/~liangzk/papers/tissec09.pdf&quot;&gt;Alcatraz: An Isolated Environment for Experimenting with Untrusted Software&lt;/a&gt; - 2009. &lt;a href=&quot;http://f.javier.io/rep/papers/alcatraz-an-isolated-environment-for-experimenting-with-untrusted-software.pdf&quot;&gt;[pdf]&lt;/a&gt; 37 Pag. Commit + policy driven temporal sandboxing environments.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.300.4042&amp;amp;rep=rep1&amp;amp;type=pdf&quot;&gt;The state of the art of application restrictions and sandboxes and its shortfalls&lt;/a&gt; - 2012. &lt;a href=&quot;http://f.javier.io/rep/papers/state-of-art-of-application-restrictions-and-sandboxes-2012.pdf&quot;&gt;[pdf]&lt;/a&gt; 40 Pag. Compilation of current security trends and its shortfalls, eg: selective execution (by white/black lists, heuristic -antivirus software, statistic based -symantec quorum, spynet, mcafee artemis, etc); rule based (DAC, Linux standard, Rainbow, polaris); application oriented access control (mapbox, android, bitfrost, dte, apparmor, selinux, tomoyo, systrace, alcatraz, some web apps); isolation based {permanent (virtual machines - kvm,xen,uml,virtualbox, containers - chroot, lxe, openvz, linux vserver, jails), ephemeral (privexec), both (alcatraz, sandboxie, pastures, returnil), isolated two ways (virtual machines, containers), isolated one way (privexec,alcatraz)}; monitoring system calls (systrace, plash, callgraph, pulse); combinations (app oriented access control + isolation: qubes, windowbox, apiary, peadpod).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.cs.utexas.edu/~bwaters/publications/papers/www2005.pdf&quot;&gt;Password Multiplier: A convenient method for securely managing passwords&lt;/a&gt; - 2005. &lt;a href=&quot;http://f.javier.io/rep/papers/Password%20Multiplier:%20A%20convenient%20method%20for%20securely%20managing%20passwords.pdf&quot;&gt;[pdf]&lt;/a&gt; 9 Pag. Hash based passwords.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;computer-virtualization&quot;&gt;Computer Virtualization&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20180920220251/http://marceloneves.org:80/papers/pdp2013-containers.pdf&quot;&gt;Performance Evaluation of Container-based Virtualization for High Performance Computing Environments&lt;/a&gt; - 2014. &lt;a href=&quot;http://f.javier.io/rep/papers/pdp2013-containers.pdf&quot;&gt;[pdf]&lt;/a&gt; 8 Pag. Xen, Openvz, Linux Vserver, LXC performance evaluation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;computer-operation-systems&quot;&gt;Computer Operation Systems&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://lib.tkk.fi/Diss/2012/isbn9789526049175/isbn9789526049175.pdf&quot;&gt;Flexible Operating System Internals: The Design and Implementation of the Anykernel and Rump Kernels&lt;/a&gt; - 2012. &lt;a href=&quot;http://f.javier.io/rep/papers/anykernel-rump-kernel-isbn9789526049175.pdf&quot;&gt;[pdf]&lt;/a&gt; 362 Pag. Portable drivers across minimal kernels (anykernels) and system applications (rump kernels). Drivers as system libraries.&lt;/li&gt;
&lt;/ul&gt;

&lt;!--
   -## Computer Networks
   -
   -[Maglev: A Fast and Reliable Software Network Load Balancer](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44824.pdf) - 2016.[[pdf]](http://f.javier.io/rep/papers/Maglev%20-%20A%20fast%20and%20reliable%20software%20network%20load%20balancer.pdf) 13 Pag. Google&apos;s distributed software based network load balancer on commodity hardware.
   --&gt;

&lt;h3 id=&quot;community-driven-papers-repositories&quot;&gt;Community driven papers repositories&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/papers-we-love/papers-we-love&quot;&gt;https://github.com/papers-we-love/papers-we-love&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.reddit.com/r/paperswelove&quot;&gt;http://www.reddit.com/r/paperswelove&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the way, if you’re new (as I’m) to read scientific papers, don’t forget to checkout the guidelines to read efficiently academic articles.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://organizationsandmarkets.com/2010/08/31/how-to-read-an-academic-article/&quot;&gt;How to read an academic article&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://violentmetaphors.com/2013/08/25/how-to-read-and-understand-a-scientific-paper-2/&quot;&gt;How to read and understand a scientific paper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy reading 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>tundle, a tmux plugin manager</title>
   <link href="https://javier.io/blog/en/2015/06/29/tundle-tmux-plugin-manager.html"/>
   <published>2015-06-29T00:00:00+00:00</published>
   <updated>2015-06-29T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/06/29/tundle-tmux-plugin-manager</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">tundle, a tmux plugin manager</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/06/29/tundle-tmux-plugin-manager.html">&lt;h2 id=&quot;tundle-a-tmux-plugin-manager&quot;&gt;tundle, a tmux plugin manager&lt;/h2&gt;

&lt;h6 id=&quot;29-jun-2015&quot;&gt;29 Jun 2015&lt;/h6&gt;

&lt;p&gt;In the past I’ve been a regular &lt;a href=&quot;http://byobu.co/&quot;&gt;byobu&lt;/a&gt; user, a distribution for common terminal multiplexers (&lt;a href=&quot;http://tmux.github.io/&quot;&gt;tmux&lt;/a&gt;, &lt;a href=&quot;https://web.archive.org/web/20260826085126/http://www.gnu.org/software/screen/&quot;&gt;screen&lt;/a&gt;). A terminal multiplexer is a utility who allows you to manage several sessions and windows within the same program, kind of a window manager for the console. In my case I mostly use it to improve the robustness of remote ssh connections. In default ssh sessions if you lose the connection you lose your work, with terminal multiplexers you can ‘dettach/attach’ eternal living sessions which is quite useful to keep movility.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;img src=&quot;/assets/img/tundle.gif&quot; alt=&quot;tundle&quot; /&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, like vi/emacs, the default screen/tmux settings are quite bad, so many people either personalize heavily its own settings or use a distribution/plugin system.&lt;/p&gt;

&lt;p&gt;I used to use byobu because of its ease of installation (at least on Ubuntu) and default status bar. However, for my needs, it looked overwhealming and was difficult to modify, I prefer systems with a plugin centric approach (like &lt;a href=&quot;https://github.com/javier-lopez/vundle&quot;&gt;vim + vundle&lt;/a&gt;, or &lt;a href=&quot;/blog/en/2013/11/15/shundle.html&quot;&gt;sh + shundle&lt;/a&gt;), so at the end I decided to migrate. Since tmux is way better than screen, I focused on it.&lt;/p&gt;

&lt;p&gt;There is a recent attempt to create a general tmux plugin environment:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/tmux-plugins/tpm&quot;&gt;tpm&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/tmux-plugins&quot;&gt;tmux-plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tpm and plugins is a great effort to cover the missing tmux features through an organized plugin system, it covers a fair amount of functionality and allows good granulity between plugins, however it also has its drawbacks, the most important ones for me are its dependency on bash and recent tmux releases (&amp;gt;=1.9), and its inability to install other but the latest version of any plugin (what if I want and older version with less features but more stability?). The tpm maintainer is a great guy however these issues are not at its top list and considering the amount of refactoring required to unmarry tpm from bash/specific tmux features, I finally decided to go my own, that’s how &lt;a href=&quot;https://github.com/javier-lopez/tundle&quot;&gt;tundle&lt;/a&gt; was born, an alternative tmux plugin environment with compatibility and control version in mind.&lt;/p&gt;

&lt;p&gt;I’ve gone to a great lenght to ensure tundle runs in as many platforms as possible (at least where tmux is available) degrading slowly depending in the tmux features available (right now running in tmux &amp;gt;= 1.6 , older versions can be discussed), in addition to improved portability/performance it’s now possible to install plugins by git hash ensuring you only run code you trust. All other features are similiar, with the tipical fix here and there result of a complete code review.&lt;/p&gt;

&lt;h3 id=&quot;quick-start&quot;&gt;Quick start&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ git clone --depth=1 https://github.com/javier-lopez/tundle ~/.tmux/plugins/tundle
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After installing tundle additional bundle/plugin modules can be defined at &lt;code&gt;~/.tmux.conf&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;run-shell &quot;~/.tmux/plugins/tundle/tundle&quot;

#let tundle manage tundle, required!
setenv -g @bundle &quot;javier-lopez/tundle&quot;

#from GitHub
#you can specify a branch or commit sha checksum
setenv -g @bundle &quot;javier-lopez/tundle-plugins/tmux-sensible:c7b09&quot;
setenv -g @bundle &quot;gh:javier-lopez/tundle-plugins/tmux-pain-control&quot;
setenv -g @bundle &quot;github:javier-lopez/tundle-plugins/tmux-resurrect&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And installed by starting &lt;code&gt;tmux&lt;/code&gt; and pressing &lt;code&gt;Ctrl-b + I&lt;/code&gt; or running &lt;code&gt;~/.tmux/plugins/tundle/scripts/install_plugins.sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tundle is able to install and run tpm plugins as well, but if you do so, portability is lost since tpm plugins will only work in tmux &amp;gt;= 1.9 and bash, if that’s not a problem go ahead you still will get extra syntax sugar and version control over your tmux environment.&lt;/p&gt;

&lt;p&gt;Additional tundle plugins are available at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/tundle-plugins&quot;&gt;tundle-plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy multiplexing 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>static-get: linux static binaries for lazy people</title>
   <link href="https://javier.io/blog/en/2015/06/23/static-get.html"/>
   <published>2015-06-23T00:00:00+00:00</published>
   <updated>2015-06-23T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/06/23/static-get</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">static-get: linux static binaries for lazy people</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/06/23/static-get.html">&lt;h2 id=&quot;static-get-linux-static-binaries-for-lazy-people&quot;&gt;static-get: linux static binaries for lazy people&lt;/h2&gt;

&lt;h6 id=&quot;23-jun-2015&quot;&gt;23 Jun 2015&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;/blog/en/2015/02/27/wget-finder.html&quot;&gt;Lastly&lt;/a&gt; I’ve required static versions of common linux utilities, it’s been fun to compile them a couple of times but it gets boring pretty quickly, so I’ve decided to create a repository with all the static recipes I’ve found on Internet (&lt;a href=&quot;https://github.com/jelaas/bifrost-build&quot;&gt;bifrost&lt;/a&gt;, &lt;a href=&quot;https://web.archive.org/web/20201108140241/http://morpheus.2f30.org/&quot;&gt;morpheus&lt;/a&gt;, &lt;a href=&quot;https://github.com/minos-org/minos-static/tree/master/misc-autosync-resources&quot;&gt;etc&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Now I can get &lt;em&gt;git static&lt;/em&gt; with:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ static-get git
git-1.9.2.tar.xz
$ static-get -x git #download and extract in one go
git-1.9.2.tar.xz
git-1.9.2/
$ sh &amp;lt;(wget -qO- s.minos.io/s) -x git #retrieve the installer, download the target and extract in one go
&lt;/pre&gt;

&lt;p&gt;To get a list of all available packages, you can run:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ static-get --search
&lt;/pre&gt;

&lt;p&gt;Be aware than using static binaries have its &lt;a href=&quot;http://www.akkadia.org/drepper/no_static_linking.html&quot;&gt;drawbacks&lt;/a&gt;, I take no responsability for any damage caused by any binary downloaded with &lt;a href=&quot;https://raw.githubusercontent.com/minos-org/minos-static/master/static-get&quot;&gt;static-get&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That’s it, happy fetching 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jelaas/bifrost-build&quot;&gt;bifrost&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20201108140241/http://morpheus.2f30.org/&quot;&gt;morpheus&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/sabotage-linux/sabotage&quot;&gt;sabotage, not real static recipes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://portablelinuxapps.org&quot;&gt;portablelinuxapps, not real static recipes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/minos-org/minos-static&quot;&gt;https://github.com/minos-org/minos-static&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.janhouse.lv/blog/linux/building-static-binaries-on-linux/&quot;&gt;https://www.janhouse.lv/blog/linux/building-static-binaries-on-linux/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>talks: empaquetado de software para ubuntu</title>
   <link href="https://javier.io/blog/es/2015/06/15/talks-empaquetado-de-software-para-ubuntu.html"/>
   <published>2015-06-15T00:00:00+00:00</published>
   <updated>2015-06-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2015/06/15/talks-empaquetado-de-software-para-ubuntu</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="talks"/>
   
   <category term="ubuntu"/>
   
   
   
   <summary type="html">talks: empaquetado de software para ubuntu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2015/06/15/talks-empaquetado-de-software-para-ubuntu.html">&lt;h2 id=&quot;talks-empaquetado-de-software-para-ubuntu&quot;&gt;talks: empaquetado de software para ubuntu&lt;/h2&gt;

&lt;h6 id=&quot;15-jun-2015&quot;&gt;15 Jun 2015&lt;/h6&gt;

&lt;p&gt;Di una charla sobre &lt;strong&gt;empaquetado de software para Ubuntu&lt;/strong&gt; en el
TelmexHub, Ciudad de México. La tesis: la pregunta equivocada es &lt;em&gt;“¿cómo
hago un &lt;code&gt;.deb&lt;/code&gt;?”&lt;/em&gt; — la buena es &lt;em&gt;“¿hasta dónde quiero que llegue mi
paquete?”&lt;/em&gt;. Porque un &lt;code&gt;.deb&lt;/code&gt; no tiene nada de mágico:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ar t hello_1.0_amd64.deb
debian-binary
control.tar.gz
data.tar.gz
&lt;/pre&gt;

&lt;p&gt;Eso es todo: un archivo &lt;code&gt;ar&lt;/code&gt; con dos tarballs adentro — el control
(metadatos, dependencias, scripts) y los datos (los archivos que se
instalan). Cualquiera puede fabricar uno a mano. Lo difícil no es el
formato: es la &lt;strong&gt;distancia&lt;/strong&gt; que quieres que recorra.&lt;/p&gt;

&lt;pre&gt;
 tu código ──┬─► ar a mano ──────► .deb ──► hospedaje propio
             ├─► checkinstall ───► .deb ──► tu máquina, y ya
             ├─► fpm ────────────► .deb/.rpm/.gem… ──► tus repos
             └─► debian/ formal ─► source package
                                       │  dput
                                       ▼
                                      PPA ──► daily builds ──► usuarios
                                       │
                                       ▼
                             archivo oficial de Ubuntu/Debian
&lt;/pre&gt;

&lt;p&gt;La guía de decisión que armamos en la charla:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;¿Solo quieres instalarlo en TU máquina sin que dpkg pierda el
rastro?&lt;/strong&gt; → &lt;code&gt;checkinstall&lt;/code&gt;: intercepta el &lt;code&gt;make install&lt;/code&gt; y lo vuelve
paquete. Muy fácil, rápido, está en los repos oficiales — pero
requiere root y su resultado no puede entrar a un PPA.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;¿Quieres entender qué hay adentro, o no tienes un sistema Debian a
mano?&lt;/strong&gt; → a mano con &lt;code&gt;ar&lt;/code&gt;. Fácil, rápido, educativo — pero casi sin
documentación, y a lo que produzcas te tocará hospedarlo tú (con
&lt;code&gt;apt-ftparchive&lt;/code&gt; montas tu propio repositorio).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;¿Distribuyes a varios formatos (deb, rpm, gem) desde un solo
lugar?&lt;/strong&gt; → &lt;a href=&quot;https://github.com/jordansissel/fpm&quot;&gt;fpm&lt;/a&gt;, &lt;em&gt;effing package
management&lt;/em&gt;: muy fácil, poderoso, convierte entre formatos, con
comunidad activa y sin depender de dpkg. Su único pecado: sus
paquetes tampoco entran a un PPA.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;¿Quieres PPA, daily builds, o que tu paquete termine en el archivo
oficial?&lt;/strong&gt; → no hay atajo: empaquetado &lt;strong&gt;formal&lt;/strong&gt; con el directorio
&lt;code&gt;debian/&lt;/code&gt;. Es el único camino con recompensa completa — &lt;code&gt;dput&lt;/code&gt; al PPA,
recetas de bzr-builder para builds diarios desde tu repo público, y la
posibilidad de integrarte a Debian/Ubuntu — pero el costo es real:
entre formatos de fuente, helpers y flujos hay &lt;em&gt;por lo menos 32
combinaciones&lt;/em&gt; documentadas de procedimientos. Mi conclusión en la
charla, textual: &lt;strong&gt;empaquetar formalmente es difícil; si pueden,
evítenlo — tienen mejores cosas que hacer.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cerramos asomándonos al futuro: &lt;a href=&quot;https://0install.net/&quot;&gt;0install&lt;/a&gt;
(universal, sin root), &lt;a href=&quot;https://nixos.org/&quot;&gt;nix&lt;/a&gt; (declarativo,
funcional), los &lt;em&gt;click packages&lt;/em&gt; de Ubuntu 14.04+ (un &lt;code&gt;manifest.json&lt;/code&gt;,
instalación a nivel usuario) y la propuesta de systemd sobre btrfs con
actualizaciones por deltas. Y la provocación final para el público: los
sistemas de empaquetamiento de Ubuntu/RedHat tienen 15 años —
&lt;strong&gt;difícilmente sobrevivirán otros 15&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Los slides están en
&lt;a href=&quot;http://people.ubuntu.com/~javier-lopez/talks/empaquetado-de-software-para-ubuntu/&quot;&gt;people.ubuntu.com/~javier-lopez/talks/empaquetado-de-software-para-ubuntu&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>sentry, an alternative to fail2ban and other bruteforce blocking daemons</title>
   <link href="https://javier.io/blog/en/2015/03/25/sentry-an-alternative-to-bruteforce-blocking-daemons.html"/>
   <published>2015-03-25T00:00:00+00:00</published>
   <updated>2015-03-25T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/03/25/sentry-an-alternative-to-bruteforce-blocking-daemons</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="security"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">sentry, an alternative to fail2ban and other bruteforce blocking daemons</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/03/25/sentry-an-alternative-to-bruteforce-blocking-daemons.html">&lt;h2 id=&quot;sentry-an-alternative-to-fail2ban-and-other-bruteforce-blocking-daemons&quot;&gt;sentry, an alternative to fail2ban and other bruteforce blocking daemons&lt;/h2&gt;

&lt;h6 id=&quot;25-mar-2015&quot;&gt;25 Mar 2015&lt;/h6&gt;

&lt;p&gt;I’ve just migrated my servers from using fail2ban to sentry, and it feels quite efficient =), so I’m doing this post as a way to increase sentry awareness.&lt;/p&gt;

&lt;p&gt;Sentry is a program who detects and prevents bruteforce attacks against sshd and other network services using minimal system resources. Instead of running a daemon who constantly reads log files it runs a perl script who uses tcpwrappers for tracking connections and blocking access by ip, tcpwrappers is already installed in most modern UNICES systems (Linux, Mac OSX and FreeBSD). So if you additionally have perl installed it adds 0 dependencies.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;h2 id=&quot;ubuntu--minos&quot;&gt;Ubuntu | Minos&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository ppa:minos-archive/main
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install sentry
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;others&quot;&gt;Others&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ wget http://www.tnpi.net/internet/sentry.pl
$ sudo perl sentry.pl
$ echo &quot;sshd : /var/db/sentry/hosts.deny : deny&quot; &amp;gt; hosts
$ echo &quot;sshd : ALL : spawn /var/db/sentry/sentry.pl -c --ip=%a : allowsendmail: all&quot; &amp;gt;&amp;gt; hosts
$ cat hosts /etc/hosts.allow &amp;gt; hosts.allow
$ sudo mv hosts.allow /etc/ &amp;amp;&amp;amp; rm hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;usage&quot;&gt;Usage&lt;/h3&gt;

&lt;p&gt;Upon installation it doesn’t require anything else, it’ll just works, to see some statistics run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo /var/db/sentry/sentry.pl -r
no IP, skip info
   -------- summary ---------
  42 unique IPs have connected 190 times
   1 IPs are whitelisted
  38 IPs are blacklisted
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To see blocked IPs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo head -3 /var/db/sentry/hosts.deny
ALL: 103.41.124.119 : deny
ALL: 103.41.124.136 : deny
ALL: 115.230.124.208 : deny
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The list can be edited either manually or through the –whitelist, –blacklist and –delist sentry.pl options&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo /var/db/sentry/sentry.pl --ip=103.41.124.119 --delist
$ sudo /var/db/sentry/sentry.pl --ip=103.41.124.119 --whitelist
$ sudo /var/db/sentry/sentry.pl --ip=103.41.124.119 --delist
$ sudo /var/db/sentry/sentry.pl --ip=103.41.124.119 --blacklist
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it, happy blocking 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.tnpi.net/wiki/Sentry&quot;&gt;https://www.tnpi.net/wiki/Sentry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>pianocat</title>
   <link href="https://javier.io/blog/en/2015/03/12/pianocat.html"/>
   <published>2015-03-12T00:00:00+00:00</published>
   <updated>2015-03-12T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/03/12/pianocat</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="music"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">pianocat</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/03/12/pianocat.html">&lt;h2 id=&quot;pianocat&quot;&gt;pianocat&lt;/h2&gt;

&lt;h6 id=&quot;12-mar-2015&quot;&gt;12 Mar 2015&lt;/h6&gt;

&lt;p&gt;Lastly I’ve been wondering why some music tones are so sticky, with this in mind, I’ve enrolled in “&lt;a href=&quot;https://class.coursera.org/introclassicalmusic-001&quot;&gt;Introduction to Classical Music&lt;/a&gt;” on Coursera (which I totally recommend) and read about how musical notation and notes work.&lt;/p&gt;

&lt;p&gt;It turned out than a piano is quite useful when learning these matters, unfortunately I don’t own one and have no plans to get any soon, so I decided to emulate it, as often happens, &lt;a href=&quot;https://raw.githubusercontent.com/ssshake/console4kids/master/piano&quot;&gt;someone had already worked in something similar&lt;/a&gt;, so I took the work and adapt it to me and that’s how pianocat was born.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ #basic tone
$ echo &quot;D4 F4 - G4 A4 - A#4 A4 G4 - E4 C4 - D4 E4 F4&quot;    \
  &quot;- D4 D4 - C#4 D4 E4 - C#4 C#4 - D4 F4 - G4 A4 - A#4&quot;  \
  &quot;A4 G4 - E4 C4 - D4 E4 F4 - E4 D4 C#4 - C#4 D4 - - D4&quot; | pianocat

$ #a more elaborated version of the previous melody
$ echo &quot;T:4/4 L:1/4 D4 F4:2 ! G4 A4:2 ! A#4:.5 A4:.5&quot;     \
  &quot;G4:2 ! E4 C4:2 ! D4:.5 E4:.5 F4:2 ! D4 D4:2 ! C#4:.5&quot;  \
  &quot;D4:.5 E4:2 ! C#4 C#4:2 ! D4 F4:2 ! G4 A4:2 ! A#4:.5&quot;   \
  &quot;A4:.5 G4:2 ! E4 C4:2 ! D4:.5 E4:.5 F4:2 ! E4:.5 D4:.5&quot; \
  &quot;C#4:2 ! C#4 D4:2 - D4:4&quot; | pianocat
&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/pianocat&quot;&gt;Pianocat&lt;/a&gt; can also be used in interactive mode:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pianocat
 _______________________________________________
|  | | | |  |  | | | | | |  |  | | | |  |  | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | |  |
|  |w| |r|  |  |t| |y| |u|  |  |o| |p|  |  |+|  |
|  |_| |_|  |  |_| |_| |_|  |  |_| |_|  |  |_|  |
|   |   |   |   |   |   |   |   |   |   |   |   |
| a | s | d | f | g | h | j | k | l | ñ | { | } |
|___|___|___|___|___|___|___|___|___|___|___|___|

Press any key to play, 1..7 to select an octave
      (by default 4) or Esc to exit

&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The sounds is quite bad, but it works so I’m leaving it like this for now. Thanks to the sox developers, to &lt;a href=&quot;https://github.com/ssshake&quot;&gt;ssshake&lt;/a&gt; for the initial snippet and to &lt;a href=&quot;https://github.com/s-d-m&quot;&gt;Sam da Mota&lt;/a&gt; for additional comments and pianoterm awareness.&lt;/p&gt;

&lt;p&gt;UPDATE: 2015-03-19&lt;/p&gt;

&lt;p&gt;Thanks to Martin Capodici pianocat now is able to play real piano tunes =)!, to use them follow the next procedure:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git clone --depth=1 git@github.com:javier-lopez/pianosounds.git
$ cd pianosounds #or mv pianosounds ~/.pianocat
$ pianocat
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you don’t have git, try:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wget http://f.javier.io/rep/audio/pianosounds.tar.xz  #or
$ wget http://f.javier.io/rep/audio/pianosounds.tar.bz2 #or
$ wget http://f.javier.io/rep/audio/pianosounds.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s it, happy humming 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/ssshake/console4kids/master/piano&quot;&gt;https://raw.githubusercontent.com/ssshake/console4kids/master/piano&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/s-d-m/pianoterm&quot;&gt;https://github.com/s-d-m/pianoterm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>wget-finder for packagers</title>
   <link href="https://javier.io/blog/en/2015/02/27/wget-finder.html"/>
   <published>2015-02-27T00:00:00+00:00</published>
   <updated>2015-02-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/02/27/wget-finder</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">wget-finder for packagers</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/02/27/wget-finder.html">&lt;h2 id=&quot;wget-finder-for-packagers&quot;&gt;wget-finder for packagers&lt;/h2&gt;

&lt;h6 id=&quot;27-feb-2015&quot;&gt;27 Feb 2015&lt;/h6&gt;

&lt;p&gt;Since some days ago I’ve been playing with &lt;a href=&quot;https://github.com/jelaas/bifrost-build&quot;&gt;bifrost-build&lt;/a&gt;, a github repository with recipes for building static linux binaries.&lt;/p&gt;

&lt;p&gt;The recipes are no different from other linux distributions where an archive hardcoded (containing the original source code) needs to be downloaded and match an specific hash (in this case a md5sum) to continue the build.&lt;/p&gt;

&lt;p&gt;While I was reviewing the recipes I noticed than some origins wheren’t available anymore. Fortunately there are plenty of mirrors for the most common utils installed with any linux system, so it wasn’t difficult to find alternative urls from where to fetch the missing bits (thanks mirrors and bifrost-build!).&lt;/p&gt;

&lt;p&gt;After completing the builds I though that it shouldn’t be too difficult to automate this task, to create a program who could search and download an specific archive matching a checksum. That’s how &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/wget-finder&quot;&gt;wget-finder&lt;/a&gt; was born.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget-finder
Usage: wget-finder [OPTION]... FILE:CHECKSUM...
&lt;/pre&gt;

&lt;p&gt;The idea is simple, wget-finder will search for files e.g. socat-1.7.2.0.tar.gz matching an specific checksum(it supports md5, sha1, sha256 and sha512) on different search engines (currently google, and ftplike, more engines are welcome!) and will download the appropiate (actually it will download some of them till the checksum matches)&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget-finder socat-1.7.2.0.tar.gz:0565dd58800e4c50534c61bbb453b771
socat-1.7.2.0.tar.gz
$ wget-finder -O libssh.tar.gz libssh2-1.3.0.tar.gz:6425331899ccf1015f1ed79448cb4709
libssh.tar.gz
&lt;/pre&gt;

&lt;p&gt;That’s it, happy fetching 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>fix github rendering in old firefox releases with greasemonkey</title>
   <link href="https://javier.io/blog/en/2015/02/11/github-rendering-firefox-greasemonkey.html"/>
   <published>2015-02-11T00:00:00+00:00</published>
   <updated>2015-02-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/02/11/github-rendering-firefox-greasemonkey</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">fix github rendering in old firefox releases with greasemonkey</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/02/11/github-rendering-firefox-greasemonkey.html">&lt;h2 id=&quot;fix-github-rendering-in-old-firefox-releases-with-greasemonkey&quot;&gt;fix github rendering in old firefox releases with greasemonkey&lt;/h2&gt;

&lt;h6 id=&quot;11-feb-2015&quot;&gt;11 Feb 2015&lt;/h6&gt;

&lt;p&gt;When the new firefox interface (aurora) was announced I knew I would never install it, since then I’ve been looking for alternatives, in the meantime I’ve been using an &lt;a href=&quot;http://f.javier.io/rep/bin/firefox32.tar.bz2&quot;&gt;old&lt;/a&gt; &lt;a href=&quot;http://f.javier.io/rep/bin/firefox64.tar.bz2&quot;&gt;firefox&lt;/a&gt; release (27.0), it’s been great so far, however some days ago &lt;a href=&quot;https://github.com&quot;&gt;https://github.com&lt;/a&gt; started looking funny. Paniiiic 😱!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/102.png&quot;&gt;&lt;img src=&quot;/assets/img/102.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I contacted support but they told me they didn’t support such old releases (and think it’s barely 1 year old, pff, progress…) so I went ahead and hacked a quick greasemonkey script.&lt;/p&gt;

&lt;pre class=&quot;sh_javascript&quot;&gt;
function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName(&apos;head&apos;)[0];
    if (!head) { return; }
    style = document.createElement(&apos;style&apos;);
    style.type = &apos;text/css&apos;;
    style.innerHTML = css;
    head.appendChild(style);
}

//github.com/user
addGlobalStyle(&apos;.one-fourth {width: 20%}&apos;);
addGlobalStyle(&apos;.one-half {width: 47%}&apos;);
addGlobalStyle(&apos;img.avatar {max-width: 200px; max-height: 200px;}&apos;);

//github.com
addGlobalStyle(&apos;.two-thirds {width: 63%}&apos;);
addGlobalStyle(&apos;.site-search input[type=&quot;text&quot;] {width: 90%}&apos;);
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/103.png&quot;&gt;&lt;img src=&quot;/assets/img/103.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s it, happy collaborating 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>youtube videos from terminal</title>
   <link href="https://javier.io/blog/en/2015/01/10/youtube-videos-from-terminal.html"/>
   <published>2015-01-10T00:00:00+00:00</published>
   <updated>2015-01-10T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2015/01/10/youtube-videos-from-terminal</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">youtube videos from terminal</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2015/01/10/youtube-videos-from-terminal.html">&lt;h2 id=&quot;youtube-videos-from-terminal&quot;&gt;youtube videos from terminal&lt;/h2&gt;

&lt;h6 id=&quot;10-jan-2015&quot;&gt;10 Jan 2015&lt;/h6&gt;

&lt;p&gt;There are multiple ways to see youtube videos from a linux terminal, one of the simplest (and more unix ways) is with mplayer+youtube-dl. Mplayer for playing and youtube-dl for fetching the content.&lt;/p&gt;

&lt;p&gt;To do so, go to a shell terminal and define the following alias:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ alias youtube-slice=&apos;sh -c &apos;\&apos;&apos;youtube-dl -q -o- &quot;${1}&quot; | mplayer -cache 8192 -&apos;\&apos;&apos; -&apos;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After that:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ youtube-slice $url
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Will work nicely. If you are interested in this and more cool aliases, checkout aliazator, it’s tons of handy ones waiting for you to discover them.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://rg3.github.io/youtube-dl/download.html&quot;&gt;youtube-dl&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/shundle-plugins/tree/master/aliazator&quot;&gt;aliazator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy watching 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>using vim objects in bash</title>
   <link href="https://javier.io/blog/en/2014/11/16/vim-objects-in-bash.html"/>
   <published>2014-11-16T00:00:00+00:00</published>
   <updated>2014-11-16T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/11/16/vim-objects-in-bash</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">using vim objects in bash</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/11/16/vim-objects-in-bash.html">&lt;h2 id=&quot;using-vim-objects-in-bash&quot;&gt;using vim objects in bash&lt;/h2&gt;

&lt;h6 id=&quot;16-nov-2014&quot;&gt;16 Nov 2014&lt;/h6&gt;

&lt;p&gt;I’ve been using &lt;a href=&quot;http://www.catonmat.net/blog/bash-vi-editing-mode-cheat-sheet/&quot;&gt;vi-mode&lt;/a&gt; in bash for a couple of years now, more than once I’ve tried to edit something with &lt;strong&gt;ci”&lt;/strong&gt;, &lt;strong&gt;ca(&lt;/strong&gt;, or any other popular &lt;a href=&quot;http://blog.carbonfive.com/2011/10/17/vim-text-objects-the-definitive-guide/&quot;&gt;vim object&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This week decided to go further and see how to do it, and it turned out to be possible =), so if you’ve missed this feature too you can now enjoy it by following this procedure&lt;/p&gt;

&lt;h3 id=&quot;setup&quot;&gt;Setup&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$ sudo add-apt-repository ppa:minos-archive/main #only Ubuntu LTS releases
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install bash-minos-settings
$ echo &apos;set -o vi&apos; &amp;gt;&amp;gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you’re not interested in installing the whole enchilada or aren’t running an apt-get powered OS, you can get the raw inputrc file at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/minos-org/bash-minos-settings/blob/master/etc%23%23inputrc&quot;&gt;https://github.com/minos-org/bash-minos-settings/blob/master/etc%23%23inputrc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the later case, the inputrc file should be placed at &lt;strong&gt;~/.inputr&lt;/strong&gt; or &lt;strong&gt;/etc/inputrc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy editing 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>hints for writing unix tools with shell scripting</title>
   <link href="https://javier.io/blog/en/2014/10/21/hints-in-writing-unix-tools-with-shell-scripting.html"/>
   <published>2014-10-21T00:00:00+00:00</published>
   <updated>2014-10-21T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/10/21/hints-in-writing-unix-tools-with-shell-scripting</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   
   
   <summary type="html">hints for writing unix tools with shell scripting</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/10/21/hints-in-writing-unix-tools-with-shell-scripting.html">&lt;h2 id=&quot;hints-for-writing-unix-tools-with-shell-scripting&quot;&gt;hints for writing unix tools with shell scripting&lt;/h2&gt;

&lt;h6 id=&quot;21-oct-2014&quot;&gt;21 Oct 2014&lt;/h6&gt;

&lt;p&gt;Yesterday I started my day reading &lt;a href=&quot;http://monkey.org/~marius/unix-tools-hints.html&quot;&gt;Hints for writing Unix tools&lt;/a&gt;. And since I agree to a great extend I though in giving more details about how to build such tools with my favorite language. I’d really enjoy reading similar entries aimed to other langs.&lt;/p&gt;

&lt;h2 id=&quot;consume-input-from-stdin-produce-output-to-stdout&quot;&gt;Consume input from stdin, produce output to stdout&lt;/h2&gt;

&lt;p&gt;In Unix you can usually refer to stdin, stdout and stderr using file descriptors 0, 1 and 2, we do it all the time, for example to send all errors in the &lt;code&gt;find&lt;/code&gt; command to /dev/null you can type:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ find / -name &quot;*pattern*&quot; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And it so happens than bash/zsh/sh/ and probably many other shells can test if a fd is open and associated to a terminal with the &lt;code&gt;-t&lt;/code&gt; test.&lt;/p&gt;

&lt;p&gt;With this knowledge consuming input and modifying the behavior of your programs to act different depending to where it goes (pipe, file, stdout) is as easy as testing if the appropriate fd is active. For instance, to consume the standard input in your programs the following will work if placed properly (before parsing options?):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
if [ ! -t 0 ]; then
    #there is input comming from pipe or file, add to the end of $@
    set -- &quot;${@}&quot; $(cat)
fi
&lt;/pre&gt;

&lt;p&gt;To control the output, you can test for fd 1 as in this example,&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
if command -v &quot;xclip&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || [ -t 1 ];  then
    printf &quot;%s\\n&quot; &quot;${_translate_var_result}&quot; | xclip -selection clipboard &amp;amp;&amp;amp; xclip -o -selection clipboard
else
    printf &quot;%s\\n&quot; &quot;${_translate_var_result}&quot;
fi
&lt;/pre&gt;

&lt;p&gt;The above will allow to use &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/translate&quot;&gt;translate&lt;/a&gt; in the following ways:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ translate hola
$ echo hola | translate
$ echo hola | translate | sed &quot;s:$: world:&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;output-should-be-free-from-header-or-other-decoration&quot;&gt;Output should be free from header or other decoration&lt;/h2&gt;

&lt;p&gt;Adding options in shell scripts are easy, if you like adding extra sugar to your output, consider doing it within them, some examples are; -v, –verbose, -a, –all, etc, but by default try to output the simplest response, consider &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/howdoi&quot;&gt;howdoi&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ howdoi extract a tar.bz2 package in unix
tar -xjf /path/to/archive.tar.bz

$ howdoi -a extract a tar.bz2 package in unix
use the -j option of tar.
   tar -xjf /path/to/archive.tar.bz
-----
If it&apos;s really an old bzip 1 archive, try:
   bunzip archive.tar.bz
and you&apos;ll have a standard tar file.
Otherwise, it&apos;s the same as with .tar.bz2 files.
-----
http://stackoverflow.com/questions/9454929/how-can-i-untar-a-tar-bz-file-in-unix

$ howdoi -l extract a tar.bz2 package in unix
http://stackoverflow.com/questions/9454929/how-can-i-untar-a-tar-bz-file-in-unix
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Global vars are a good way to track output options.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
for arg; do #parse options
case &quot;${arg}&quot; in
-a) AFLAG=&quot;set&quot;; shift;;
-l) LFLAG=&quot;set&quot;; shift;;
-c) CFLAG=&quot;set&quot;; shift;;
&lt;/pre&gt;

&lt;h2 id=&quot;treat-a-tools-output-as-an-api&quot;&gt;Treat a tool’s output as an API&lt;/h2&gt;

&lt;p&gt;You can create tests to ensure that your output format doesn’t change and actually works. There are &lt;a href=&quot;http://shunit.sourceforge.net/&quot;&gt;several&lt;/a&gt; &lt;a href=&quot;http://bmizerany.github.io/roundup/&quot;&gt;test suites&lt;/a&gt; capable of managing &lt;a href=&quot;https://github.com/lehmannro/assert.sh&quot;&gt;shell&lt;/a&gt; &lt;a href=&quot;http://joyful.com/shelltestrunner/&quot;&gt;scripts&lt;/a&gt;, but one of the simplest is &lt;a href=&quot;http://fossies.org/linux/shtool/test.sh&quot;&gt;shtool test suite&lt;/a&gt; by Ralf S. Engelschall.&lt;/p&gt;

&lt;p&gt;Let’s retake the previous script and add some tests:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
@begin{howdoi}
howdoi; test X&quot;${?}&quot;                                  = X&quot;1&quot;
printf &quot;%s&quot; &apos;-h&apos; | howdoi; test X&quot;${?}&quot;               = X&quot;1&quot;
howdoi --help ; test X&quot;${?}&quot;                          = X&quot;1&quot;
howdoi --cui; test X&quot;${?}&quot;                            = X&quot;1&quot;
test X&quot;$(howdoi 2&amp;gt;&amp;amp;1|head -1)&quot;                        = X&quot;Usage: howdoi [options] query ...&quot;
test X&quot;$(howdoi -h 2&amp;gt;&amp;amp;1|head -1)&quot;                     = X&quot;Usage: howdoi [options] query ...&quot;
test X&quot;$(printf &quot;%s&quot; &apos;--help&apos; | howdoi 2&amp;gt;&amp;amp;1|head -1)&quot; = X&quot;Usage: howdoi [options] query ...&quot;
test X&quot;$(howdoi -cui 2&amp;gt;&amp;amp;1|head -1)&quot;                   = X&quot;howdoi: unrecognized option \`-cui&apos;&quot;
test X&quot;$(howdoi -n 2&amp;gt;&amp;amp;1|head -1)&quot;                     = X&quot;Option \`-n&apos; requires a parameter&quot;
test X&quot;$(howdoi -n cui 2&amp;gt;&amp;amp;1|head -1)&quot;                 = X&quot;Option \`-n&apos; requires a number: &apos;cui&apos;&quot;
test X&quot;$(howdoi XaMTWGfu89iQpJk6 2&amp;gt;&amp;amp;1|head -1)&quot;       = X&quot;howdoi: No results&quot;
test X&quot;$(howdoi -C 2&amp;gt;&amp;amp;1)&quot;                             = X&quot;Cache cleared successfully&quot;
test ! -d ~/.cache/howdoi
test X&quot;$(howdoi XaMTWGfu89iQpJk6 2&amp;gt;&amp;amp;1|head -1)&quot;       = X&quot;howdoi: No results&quot;
test -d ~/.cache/howdoi
@end
&lt;/pre&gt;

&lt;p&gt;If you include the output format in your tests it would be harder to change it continuously.&lt;/p&gt;

&lt;h2 id=&quot;place-diagnostics-output-on-stderr&quot;&gt;Place diagnostics output on stderr.&lt;/h2&gt;

&lt;p&gt;This one is really easy, adding &lt;code&gt;&amp;gt;&amp;amp;2&lt;/code&gt; to all diagnostic, help and verbose messages will do it.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
#before
printf &quot;%s\\n&quot; &quot;$(expr &quot;${0}&quot; : &apos;.*/\([^/]*\)&apos;): unrecognized option &apos;${arg}&apos;&quot;

#after
printf &quot;%s\\n&quot; &quot;$(expr &quot;${0}&quot; : &apos;.*/\([^/]*\)&apos;): unrecognized option &apos;${arg}&apos;&quot; &amp;gt;&amp;amp;2
&lt;/pre&gt;

&lt;h2 id=&quot;signal-failure-with-an-exit-status&quot;&gt;Signal failure with an exit status.&lt;/h2&gt;

&lt;p&gt;The current status can be set in bash/zsh/sh with either &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;: (true)&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;, &lt;code&gt;return&lt;/code&gt; or &lt;code&gt;exit&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first three can be used to set the current status in iterations, e,g.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
_rdeps()
{
    [ -z &quot;${1}&quot; ] &amp;amp;&amp;amp; return 1

    for _rdeps_var_binary; do
        fpath=&quot;$(command -v &quot;${_rdeps_var_binary}&quot;)&quot;
        [ -z &quot;${fpath}&quot; ] &amp;amp;&amp;amp; continue

        if ldd &quot;${fpath}&quot; &amp;gt;/dev/null 2&amp;gt;/dev/null; then
            ldd &quot;${fpath}&quot; | sort -n | uniq | awk &apos;{print $1}&apos; | xargs -i apt-file search {} | cut -d&apos;:&apos; -f1 | sort | uniq
        else
            printf &quot;$(expr &quot;${0}&quot; : &apos;.*/\([^/]*\)&apos;): %s\\n&quot; &quot;not a dynamic executable &apos;${fpath}&apos;&quot; &amp;gt;&amp;amp;2 &amp;amp;&amp;amp; false
        fi
    done
}
&lt;/pre&gt;

&lt;p&gt;The above code will set the status to 1 without necessary quitting or returning from the function, except when no parameter is present&lt;/p&gt;

&lt;p&gt;&lt;code&gt;exit #number&lt;/code&gt; can be used at any to exit the program with the specified status, it’s quite useful when testing for dependencies and exit with error if any of them is not available, e.g.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
if ! command -v &quot;curl&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    printf &quot;%s\\n&quot; &quot;you need to install &apos;curl&apos; to run this program&quot; &amp;gt;&amp;amp;2
    exit 1
fi
&lt;/pre&gt;

&lt;h2 id=&quot;omit-needless-diagnostics&quot;&gt;Omit needless diagnostics.&lt;/h2&gt;

&lt;p&gt;As stated in &lt;em&gt;Omit needless diagnostics.&lt;/em&gt; output should be as clear and simple as possible, a verbose function can be defined and used as follows:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
_verbose()
{
    [ -z &quot;${1}&quot; ] &amp;amp;&amp;amp; return 1
    [ -n &quot;${VFLAG}&quot; ] &amp;amp;&amp;amp; printf &quot;%b\\n&quot; &quot;${*}&quot;
}


for arg; do #parse options
case &quot;${arg}&quot; in
-v|--verbose) VFLAG=&quot;set&quot;; shift;;
...
esac

_verbose &quot;detailed message&quot;
&lt;/pre&gt;

&lt;p&gt;And for debugging, &lt;code&gt;set -x&lt;/code&gt; will help to see most of the issues most of the times.&lt;/p&gt;

&lt;h2 id=&quot;avoid-making-interactive-programs&quot;&gt;Avoid making interactive programs&lt;/h2&gt;

&lt;p&gt;Doing interactive programs in shell scripting is actually harder than parsing cli arguments and outputting simple strings. So it shouldn’t be difficult to follow this principle, but if you still want breaking it, ensure interactive is only an additional mode and you still have a batch one.&lt;/p&gt;

&lt;p&gt;Happy tooling 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://monkey.org/~marius/unix-tools-hints.html&quot;&gt;http://monkey.org/~marius/unix-tools-hints.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/guideline.md&quot;&gt;Personal guidelines&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/books/Beginning_shell_scripting.pdf&quot;&gt;Beginning shell scripting&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/tree/master/sh&quot;&gt;Shell scripts following exposed advices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>ssh into a guest vbox machine on NAT mode</title>
   <link href="https://javier.io/blog/en/2014/09/13/ssh-into-guess-virtualbox-using-nat.html"/>
   <published>2014-09-13T00:00:00+00:00</published>
   <updated>2014-09-13T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/09/13/ssh-into-guess-virtualbox-using-nat</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   
   
   <summary type="html">ssh into a guest vbox machine on NAT mode</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/09/13/ssh-into-guess-virtualbox-using-nat.html">&lt;h2 id=&quot;ssh-into-a-guest-vbox-machine-on-nat-mode&quot;&gt;ssh into a guest vbox machine on NAT mode&lt;/h2&gt;

&lt;h6 id=&quot;13-sep-2014&quot;&gt;13 Sep 2014&lt;/h6&gt;

&lt;p&gt;This is a quick reminder to myself, for this to work a ssh server must be running in the guest machine.&lt;/p&gt;

&lt;h3 id=&quot;configuration&quot;&gt;Configuration&lt;/h3&gt;

&lt;p&gt;In the VM network panel, click in &lt;strong&gt;advanced&lt;/strong&gt; and then in the &lt;strong&gt;Port Forwarding&lt;/strong&gt; button, there setup the next rule:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Host IP: 127.0.0.1&lt;/li&gt;
  &lt;li&gt;Host Port: 2222&lt;/li&gt;
  &lt;li&gt;Guest IP: 10.0.0.2 (or the ip of the guest machine)&lt;/li&gt;
  &lt;li&gt;Guest Port: 22 (or personalized ssh port)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save changes&lt;/p&gt;

&lt;h3 id=&quot;usage&quot;&gt;Usage&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;ssh -p 2222 user@localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy remote working 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://forums.virtualbox.org/viewtopic.php?f=8&amp;amp;t=55766&quot;&gt;https://forums.virtualbox.org/viewtopic.php?f=8&amp;amp;t=55766&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>talks: 5 formas de colaborar con ubuntu</title>
   <link href="https://javier.io/blog/es/2014/08/15/talks-5-formas-de-colaborar-con-ubuntu.html"/>
   <published>2014-08-15T00:00:00+00:00</published>
   <updated>2014-08-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2014/08/15/talks-5-formas-de-colaborar-con-ubuntu</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="talks"/>
   
   <category term="ubuntu"/>
   
   
   
   <summary type="html">talks: 5 formas de colaborar con ubuntu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2014/08/15/talks-5-formas-de-colaborar-con-ubuntu.html">&lt;h2 id=&quot;talks-5-formas-de-colaborar-con-ubuntu&quot;&gt;talks: 5 formas de colaborar con ubuntu&lt;/h2&gt;

&lt;h6 id=&quot;15-aug-2014&quot;&gt;15 Aug 2014&lt;/h6&gt;

&lt;p&gt;Esta semana presenté &lt;strong&gt;5 formas de colaborar con Ubuntu&lt;/strong&gt; en la
&lt;a href=&quot;https://wiki.ubuntu.com/UbuConLA&quot;&gt;UbuConLA 2014&lt;/a&gt;, celebrada del 14 al 16
de agosto en la Universidad Tecnológica de Bolívar, Cartagena de Indias,
Colombia.&lt;/p&gt;

&lt;p&gt;La idea de la charla: no necesitas ser desarrollador para aportar —
reportar bugs, probar ISOs, traducir, documentar y ayudar a otros usuarios
también son colaboración, y todas tienen un camino claro para empezar.&lt;/p&gt;

&lt;p&gt;Los slides están en
&lt;a href=&quot;http://people.ubuntu.com/~javier-lopez/talks/5-formas-de-colaborar-con-ubuntu/&quot;&gt;people.ubuntu.com/~javier-lopez/talks/5-formas-de-colaborar-con-ubuntu&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>strip mp3 tags with ffmpeg</title>
   <link href="https://javier.io/blog/en/2014/08/11/strip-mp3-tags-with-ffmpeg.html"/>
   <published>2014-08-11T00:00:00+00:00</published>
   <updated>2014-08-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/08/11/strip-mp3-tags-with-ffmpeg</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="music"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">strip mp3 tags with ffmpeg</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/08/11/strip-mp3-tags-with-ffmpeg.html">&lt;h2 id=&quot;strip-mp3-tags-with-ffmpeg&quot;&gt;strip mp3 tags with ffmpeg&lt;/h2&gt;

&lt;h6 id=&quot;11-aug-2014&quot;&gt;11 Aug 2014&lt;/h6&gt;

&lt;p&gt;I use mpd to satisfy my local music player needs, mpd reads multimedia tags and attaches them to its database, I use these tags to look for tracks and artists fastly, however sometimes I end with mp3 files containing unuseful tags, on these cases I wish mpd could look for filenames instead of mp3 tags because when it doesn’t it makes incredible difficult to find these tracks. Since I’ve not managed to find this feature (if such feature exist) I just strip the problematic tags (someday I’ll learn to edit them instead or to program the missing part).&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ffmpeg -i track.mp3 -acodec copy -map_metadata -1 track.t.mp3 &amp;amp;&amp;amp; mv track.t.mp3 track.mp3
&lt;/pre&gt;

&lt;p&gt;If you find the above command useful you can create an alias/function.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;alias strip.mp3tags=&apos;sh -c &apos;\&apos;&apos;ffmpeg -i &quot;$1&quot; -acodec copy -map_metadata -1 &quot;$1&quot;.t.mp3 &amp;amp;&amp;amp; mv &quot;${1}&quot;.t.mp3 &quot;${1}&quot;&apos;\&apos;&apos; -&apos;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy stripping 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>detect file moves and renames with rsync</title>
   <link href="https://javier.io/blog/en/2014/08/06/rsync-rename-move.html"/>
   <published>2014-08-06T00:00:00+00:00</published>
   <updated>2014-08-06T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/08/06/rsync-rename-move</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">detect file moves and renames with rsync</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/08/06/rsync-rename-move.html">&lt;h2 id=&quot;detect-file-moves-and-renames-with-rsync&quot;&gt;detect file moves and renames with rsync&lt;/h2&gt;

&lt;h6 id=&quot;06-aug-2014&quot;&gt;06 Aug 2014&lt;/h6&gt;

&lt;p&gt;I use rsync to backup my &lt;em&gt;$HOME&lt;/em&gt; directory everyday with something like this:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo rsync -az --one-file-system --delete $HOME/ admin@backup.javier.io:~/backup/$(hostname)
&lt;/pre&gt;

&lt;p&gt;Most of the times it takes me less than &lt;strong&gt;10&lt;/strong&gt; minutes at 2MB/s to re-sync everything, however last weekend it took almost &lt;strong&gt;20 hours!&lt;/strong&gt; so while I was waiting I decided to take a look to see what was happening. It turned out rsync was re-uploading some pretty heavy files because I had renamed them locally. I couldn’t believe rsync was so dumb, I was shocked O_O&lt;/p&gt;

&lt;p&gt;So I went to Internet and looked for solutions, fortunatelly some other guys had found this problem before and created a couple of patches:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://attachments.samba.org/attachment.cgi?id=7435&quot;&gt;detect-renamed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://git.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed-lax.diff;h=4cd23bd4524662f1d0db0bcc90336a77d0bb61c9;hb=HEAD&quot;&gt;detect-renamed-lax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These patches add the following options:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;–detect-renamed, –detect-renamed-lax&lt;/li&gt;
  &lt;li&gt;–detect-moved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since I’m not the kind of person who enjoys spending their time compiling software I packaged a modified rsync version for supported Ubuntu LTS versions and upload it somewhere, while doing it I updated the patches to make them compile with the latest rsync version (at the moment of writing this version 3.1.1).&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-add-repository ppa:minos-archive/main
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install rsync
&lt;/pre&gt;

&lt;p&gt;In my personal tests the modified rsync shows an amazing speed up for uploads who involve renamed/moved files, so I’m installing this in all my computers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: For this to work, both, server and client must have installed the modified rsync version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy uploading 😋&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://bugzilla.samba.org/show_bug.cgi?id=2294&quot;&gt;https://bugzilla.samba.org/show_bug.cgi?id=2294&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/rsync/+bug/1353792&quot;&gt;https://bugs.launchpad.net/ubuntu/+source/rsync/+bug/1353792&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/patches/rsync-3.1.1-trusty-detect-renamed.diff&quot;&gt;https://github.com/javier-lopez/learn/blob/master/patches/rsync-3.1.1-trusty-detect-renamed.diff&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/patches/rsync-3.1.1-trusty-detect-renamed-lax.diff&quot;&gt;https://github.com/javier-lopez/learn/blob/master/patches/rsync-3.1.1-trusty-detect-renamed-lax.diff&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>installing debian build dependencies the smart way</title>
   <link href="https://javier.io/blog/en/2014/04/16/installing-debian-build-dependencies-the-smart-way.html"/>
   <published>2014-04-16T00:00:00+00:00</published>
   <updated>2014-04-16T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/04/16/installing-debian-build-dependencies-the-smart-way</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">installing debian build dependencies the smart way</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/04/16/installing-debian-build-dependencies-the-smart-way.html">&lt;h2 id=&quot;installing-debian-build-dependencies-the-smart-way&quot;&gt;installing debian build dependencies the smart way&lt;/h2&gt;

&lt;h6 id=&quot;16-apr-2014&quot;&gt;16 Apr 2014&lt;/h6&gt;

&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;/h3&gt;

&lt;p&gt;So you’re trying to build a Debian package from an upstream source tree, but you’re not sure what build dependencies you should install? I have this problem all the time. For example, if I wanted to build the unity source tree into a debian package, I’d branch it:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr branch lp:unity
&lt;/pre&gt;

&lt;p&gt;…change into the directory:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd unity
&lt;/pre&gt;

&lt;p&gt;…and then try and build it. Needless to say, I almost never have the required build dependencies installed. You can try and use apt-get to install the build dependencies for you:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get build-dep unity
&lt;/pre&gt;

&lt;p&gt;But that reads the build dependencies from whatever version is present in the distribution, not the dependencies in the source tree.&lt;/p&gt;

&lt;h3 id=&quot;the-solution&quot;&gt;The Solution&lt;/h3&gt;

&lt;p&gt;The solution is easy. First, install a couple of packages:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install devscripts equivs
&lt;/pre&gt;

&lt;p&gt;Then run this from within the source tree to install the build dependencies:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo mk-build-deps -i
&lt;/pre&gt;

&lt;p&gt;If, after this command completes you still cannot build the package, you should probably file a bug against the upstream project!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.tech-foo.net/installing-build-dependencies-the-smart-way.html&quot;&gt;http://www.tech-foo.net/installing-build-dependencies-the-smart-way.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>backups with rsync and rdiff-backup</title>
   <link href="https://javier.io/blog/en/2014/04/08/backups-git-rsync-rdiff-backup.html"/>
   <published>2014-04-08T00:00:00+00:00</published>
   <updated>2014-04-08T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/04/08/backups-git-rsync-rdiff-backup</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">backups with rsync and rdiff-backup</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/04/08/backups-git-rsync-rdiff-backup.html">&lt;h2 id=&quot;backups-with-rsync-and-rdiff-backup&quot;&gt;backups with rsync and rdiff-backup&lt;/h2&gt;

&lt;h6 id=&quot;08-apr-2014&quot;&gt;08 Apr 2014&lt;/h6&gt;

&lt;p&gt;I don’t remember the last time I lost information, that’s been mostly luck since I’m not really careful with my data. However with internet providers increasing bandwidth, efficient compression algorithms all around and affordable servers in the cloud I finally decided to give up my luck and automate my backup plan.&lt;/p&gt;

&lt;p&gt;I’m fortunate to work in an homogeneous environment, Linux x32/x64 boxes, so I can cling to the lowest common denominator, on this case ssh/rsync. Both are installed (or available through default repositories) in virtually all Linux distributions and are secure, mature, efficient and well supported, there is a little issue with them though, they’ve too many options and can be tricky to remember.&lt;/p&gt;

&lt;p&gt;So, with that in mind I grouped my favorite preferences and created a &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/backup-remote-rsync&quot;&gt;wrapper script&lt;/a&gt;. That’s what I use to backup machines, it works like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ backup-remote-rsync -r b.javier.io #the program will backup $HOME to b.javier.io:~/hostname using default ssh keys
$ backup-remote-rsync -r b.javier.io -u admin -k /home/admin/.ssh/id_rsa /var/www /etc
#the program will backup /var/www and /etc to b.javier.io:~/hostname, while using admin&apos;s public ssh keys
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above lines can be added to a cronjob to remove human dependency:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo cronjob -l
#every day at 22:00
0 22 * * * backup-remote-rsync -r backup.javier.io -u admin -i /home/admin/.ssh/id_rsa /home/admin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It’s well known than rsync transfers files using a delta based mechanism, so once the initial backup is done further invocations are considerably faster, this is a great incentive to run backups often.&lt;/p&gt;

&lt;p&gt;On the server side, I used &lt;a href=&quot;http://www.nongnu.org/rdiff-backup/examples.html&quot;&gt;rdiff-backup&lt;/a&gt; to create dailies/weeklies/monthlies.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;0 1 * * * rdiff-backup /home/admin/backup/ /home/admin/recover/daily
0 2 * * * rdiff-backup --remove-older-than 6D /home/admin/recover/daily

0 1 * * 0 rdiff-backup /home/admin/backup/ /home/admin/recover/weekly
0 2 * * 0 rdiff-backup --remove-older-than 3W /home/admin/recover/weekly

0 1 1 * * rdiff-backup /home/admin/backup/ /home/admin/recover/monthly
0 2 1 * * rdiff-backup --remove-older-than 12M /home/admin/recover/monthly
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And added &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/share-backup&quot;&gt;share-backup&lt;/a&gt;, to provide fast and secure access to single files. Complete recoveries are available through standard rsync.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;share-backup&lt;/code&gt; usage example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ssh admin@b.javier.io share-backup
Starting server ...
  address   : http://b.javier.io:7648
  username: guest
  password: M2U4ZDRj
  ssl     :
  serving:  /home/admin/recovery

Run: share-backup stop, to stop sharing

$ ssh admin@b.javier.io share-backup stop
Stopped
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;decisions&quot;&gt;Decisions&lt;/h2&gt;

&lt;p&gt;While testing backup utilities and differente strategies I found me asking me priority questions, is it more important to save hard disk space or to keep several copies around?, does the backup plan require third party integrations or can it be generic?, how many resources in time and money am I willing to invest?, how fast the recovery process must be?, how private the data is?.&lt;/p&gt;

&lt;p&gt;I tried to answer these questions as honestly as possible and found than the above procesure covers me in most situations, that doesn’t mean it will work for your. I urge you to test as many alternatives as possible and only stick with those that make you feel confortable and secure. If you’re out of ideas take a look at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.magiksys.net/ddumbfs/&quot;&gt;ddumbfs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://btrfs.wiki.kernel.org/index.php/Main_Page&quot;&gt;btrfs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/s3fs-fuse/s3fs-fuse&quot;&gt;s3fs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://opendedup.org/&quot;&gt;opendedup&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/bup/bup&quot;&gt;bup&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://obnam.org/&quot;&gt;obnam&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bacula.org/&quot;&gt;bacula&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_backup_software&quot;&gt;etc&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it, stay safe and backup your data now 😋!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>talks: shundle, un administrador de plugins para la shell</title>
   <link href="https://javier.io/blog/es/2014/03/26/talks-shundle.html"/>
   <published>2014-03-26T00:00:00+00:00</published>
   <updated>2014-03-26T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2014/03/26/talks-shundle</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="talks"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">talks: shundle, un administrador de plugins para la shell</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2014/03/26/talks-shundle.html">&lt;h2 id=&quot;talks-shundle-un-administrador-de-plugins-para-la-shell&quot;&gt;talks: shundle, un administrador de plugins para la shell&lt;/h2&gt;

&lt;h6 id=&quot;26-mar-2014&quot;&gt;26 Mar 2014&lt;/h6&gt;

&lt;p&gt;Hoy presenté &lt;a href=&quot;https://github.com/javier-lopez/shundle&quot;&gt;shundle&lt;/a&gt; en la
Jornada Universitaria de Tecnologías de la Información: qué es un
administrador de plugins para la shell, por qué escribí uno cuando mi
&lt;code&gt;~/.bashrc&lt;/code&gt; se volvió inmanejable, y qué aprendí sobre escribir sh portable
en el camino.&lt;/p&gt;

&lt;p&gt;Los slides están disponibles en línea:
&lt;strong&gt;&lt;a href=&quot;/talks/shundle/&quot;&gt;javier.io/talks/shundle&lt;/a&gt;&lt;/strong&gt; — se navegan con las
flechas del teclado.&lt;/p&gt;

&lt;p&gt;Si quieres el contexto completo de la herramienta, lo escribí hace unos
meses en &lt;a href=&quot;/blog/en/2013/11/15/shundle.html&quot;&gt;shundle&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ffcast</title>
   <link href="https://javier.io/blog/en/2014/03/21/ffcast.html"/>
   <published>2014-03-21T00:00:00+00:00</published>
   <updated>2014-03-21T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/03/21/ffcast</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">ffcast</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/03/21/ffcast.html">&lt;h2 id=&quot;ffcast&quot;&gt;ffcast&lt;/h2&gt;

&lt;h6 id=&quot;21-mar-2014&quot;&gt;21 Mar 2014&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/ffcast.gif&quot;&gt;&lt;img src=&quot;/assets/img/ffcast.gif&quot; alt=&quot;ffcast&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During the last days I’ve rewrote &lt;a href=&quot;https://github.com/lolilolicon/FFcast2&quot;&gt;ffcast&lt;/a&gt; and package it (only for supported Ubuntu LTS versions) without an obvious reason. ffcast is a program to create screencasts. I’ve already written similar utilities but this one is better.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-add-repository ppa:minos-archive/main
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install ffcast
&lt;/pre&gt;

&lt;h3 id=&quot;usage&quot;&gt;Usage&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ffcast -s
&lt;/pre&gt;

&lt;p&gt;The above command will record the selected area and will create a movie with a random name (of 8 characters) in $HOME. It’ll be a nice addition to my shortcuts 😋 Another one-liner I’ll probable use is:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ffcast -vv -s ffmpeg -follow_mouse centered -r 25 -- -f alsa -i hw:0 -vcodec libx264 cast.mkv
&lt;/pre&gt;

&lt;p&gt;It will make the screencast to follow my mouse. With ffcast is easy to create &lt;strong&gt;.gif&lt;/strong&gt; movies as well:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ffcast -s ffmpeg -r 15 -- -pix_fmt rgb24 out.gif
$ convert -layers Optimize out.gif out_opt.gif
&lt;/pre&gt;

&lt;p&gt;References&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/lolilolicon/FFcast2&quot;&gt;https://github.com/lolilolicon/FFcast2&lt;/a&gt; (original version)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/ffcast&quot;&gt;https://github.com/minos-org/ffcast&lt;/a&gt; (personal one)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://unix.stackexchange.com/questions/113695/gif-screencasting-the-unix-way&quot;&gt;http://unix.stackexchange.com/questions/113695/gif-screencasting-the-unix-way&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>madre terra</title>
   <link href="https://javier.io/blog/pt/2014/02/26/madre-terra.html"/>
   <published>2014-02-26T00:00:00+00:00</published>
   <updated>2014-02-26T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2014/02/26/madre-terra</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="poetry"/>
   
   
   
   <summary type="html">madre terra</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2014/02/26/madre-terra.html">&lt;h2 id=&quot;madre-terra&quot;&gt;madre terra&lt;/h2&gt;

&lt;h6 id=&quot;26-feb-2014&quot;&gt;26 Feb 2014&lt;/h6&gt;

&lt;pre class=&quot;lyric&quot;&gt;
Aqui está meu incenso perfumado 
meu cacau cobiçado 
minha fresca medicina
aqui está minha pena que se levanta 

Hoje entrego-os
em homenagem por deixar-me
tocar a graça do seu corpo

Eu cresço em você pai
eu vivo em ti mãe
minhas mãos foram manchadas
feri você

O criador assim o quis
assim o senhor das alturas o ordenou
de você sairá minha comida e bebida
um pouco para mim
outro para ti
tu também tens sede

Aqui está meu tributo 
aqui está minha gratidão 
isto te dará forças
isto te dará vida

Juan Gregorio Regino / Madre terra (Nijma en nima, IX)
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>howdoi, a code search tool and a sh implementation</title>
   <link href="https://javier.io/blog/en/2014/02/25/howdoi-in-shell-scripting.html"/>
   <published>2014-02-25T00:00:00+00:00</published>
   <updated>2014-02-25T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/02/25/howdoi-in-shell-scripting</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">howdoi, a code search tool and a sh implementation</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/02/25/howdoi-in-shell-scripting.html">&lt;h2 id=&quot;howdoi-a-code-search-tool-and-a-sh-implementation&quot;&gt;howdoi, a code search tool and a sh implementation&lt;/h2&gt;

&lt;h6 id=&quot;25-feb-2014&quot;&gt;25 Feb 2014&lt;/h6&gt;

&lt;p&gt;During these days I read about &lt;a href=&quot;https://github.com/gleitz/howdoi&quot;&gt;howdoi&lt;/a&gt;, a &lt;a href=&quot;http://stackoverflow.com/&quot;&gt;stackoverflow&lt;/a&gt; client for your &lt;a href=&quot;http://en.wikipedia.org/wiki/Command-line_interface&quot;&gt;terminal&lt;/a&gt;. And I though it was pretty cool, so I looked at a couple of implementation (the &lt;a href=&quot;https://github.com/gleitz/howdoi&quot;&gt;original&lt;/a&gt; in python and a &lt;a href=&quot;https://github.com/roylez/howdoi&quot;&gt;clone&lt;/a&gt; in ruby) and decided to do my own version, I’ve just learned awk and wanted something where I could use it. Besides, this version doesn’t require anything but awk and wget.&lt;/p&gt;

&lt;p&gt;Get the code at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://raw.github.com/javier-lopez/learn/master/sh/tools/howdoi&quot;&gt;https://raw.github.com/javier-lopez/learn/master/sh/tools/howdoi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://imgs.xkcd.com/comics/tar.png&quot;&gt;&lt;img src=&quot;http://imgs.xkcd.com/comics/tar.png&quot; alt=&quot;tar&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/ab7339312c9d960f09f77&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt;--&gt;&lt;/p&gt;

&lt;p&gt;Happy hacking ☺!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>setting up jekyll locally</title>
   <link href="https://javier.io/blog/en/2014/02/22/github-page-build-failed.html"/>
   <published>2014-02-22T00:00:00+00:00</published>
   <updated>2014-02-22T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/02/22/github-page-build-failed</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">setting up jekyll locally</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/02/22/github-page-build-failed.html">&lt;h2 id=&quot;setting-up-jekyll-locally&quot;&gt;setting up jekyll locally&lt;/h2&gt;

&lt;h6 id=&quot;22-feb-2014&quot;&gt;22 Feb 2014&lt;/h6&gt;

&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/dd994deaf00a01fcb9c65&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt; --&gt;

&lt;p&gt;I ♡ &lt;a href=&quot;https://github.com/&quot;&gt;github&lt;/a&gt;, it has never been easier to start working in open source projects =). One of their rock star services is &lt;a href=&quot;http://pages.github.com/&quot;&gt;github pages&lt;/a&gt;, which allows people to setup static pages for their projects, it even provides some nice themes so your page doesn’t look awful. Many people however (mostly technical) use it to host their blogs (such as this one), you get great infrastructure, a subdomain (and the possibility of using your own domain), revisions (git) and markdown, all for free!, isn’t that freaking awesome!?&lt;/p&gt;

&lt;p&gt;Github pages could be perfect, however they’re not (although they’re really close), sometimes when you’re using markdown and the translation markdown ⇨ html fails you’ll get a nice mail such as this one:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;The page build failed with the following error:

page build failed

For information on troubleshooting Jekyll see:
 https://help.github.com/articles/using-jekyll-with-pages#troubleshooting

If you have any questions please contact GitHub Support.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Beautiful!, no signal of what went wrong =), ok, to be fair, github has recently started to &lt;a href=&quot;https://github.com/blog/1706-descriptive-error-messages-for-failed-github-pages-builds&quot;&gt;add more details&lt;/a&gt;, however they’re still not sufficient, I still require to mirror their jekyll setup in order to see what’s really happening. Since I’ve done more than a couple of times, I thought it would be a good idea to automatize it.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sh &amp;lt;(wget -qO- https://raw.githubusercontent.com/javier-lopez/learn/master/sh/is/gitpages)
...
$ git clone --depth=1 https://github.com/username/site.github.com
$ cd site.github.com
$ jekyll serve #fix errors till it works
&lt;/pre&gt;

&lt;p&gt;It requires an Ubuntu ⇨ 12.04 system and sudo credentials. Additional gotchas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://dwdii.github.io/2013/08/28/GitHub-Pages-Jekyll-Ampersands.html&quot;&gt;http://dwdii.github.io/2013/08/28/GitHub-Pages-Jekyll-Ampersands.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy blogging 😄!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>the most portable language in the world, awk</title>
   <link href="https://javier.io/blog/en/2014/02/22/awk.html"/>
   <published>2014-02-22T00:00:00+00:00</published>
   <updated>2014-02-22T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/02/22/awk</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   
   
   <summary type="html">the most portable language in the world, awk</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/02/22/awk.html">&lt;h2 id=&quot;the-most-portable-language-in-the-world-awk&quot;&gt;the most portable language in the world, awk&lt;/h2&gt;

&lt;h6 id=&quot;22-feb-2014&quot;&gt;22 Feb 2014&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/93.png&quot;&gt;&lt;img src=&quot;/assets/img/93.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The other day while I was browsing I found an article called “&lt;a href=&quot;http://www.computerworld.com.au/article/216844/a-z_programming_languages_awk/&quot;&gt;The awk origins&lt;/a&gt;”, I liked so much than I decided to learn awk (it’s pronounced “auk”). I had already used one-liners but considered larger awk programs unfriendly and its syntax over complicated, however once I started diving on it and unbelief my fears I found it quite fun and easy to use, what a powerful tool based on minimal principles!&lt;/p&gt;

&lt;h2 id=&quot;awk-an-event-drive-language&quot;&gt;Awk, an event drive language&lt;/h2&gt;

&lt;p&gt;The most important thing in awk (and what took me more time to learn) was to understand that it’s an event drive language based in 5 important areas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;body&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;search&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;action&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;end&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means that every awk program (even the smallest ones) have a begin, body and end sections. The begin and end sections are similar, they’re executed only once, at the beginning and at the end of the program, to write the classic “Hello World” a person can do it in both sections:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ awk &apos;BEGIN {print &quot;Hello World&quot;}&apos; &amp;lt; /dev/null
Hello World
$ awk &apos;END   {print &quot;Hello World&quot;}&apos; &amp;lt; /dev/null
Hello World
&lt;/pre&gt;

&lt;p&gt;Every section is defined by its name and its actions (which are defined between {}). Awk programs are written between (‘) so the shell doesn’t interpret any variable or keywords. Awk programs can also be written in files and be executed directly:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat hello.awk
#!/usr/bin/awk -f
BEGIN {print &quot;Hello World&quot;}
$ ./hello.awk
Hello World
&lt;/pre&gt;

&lt;p&gt;In between, is the body section, the most powerful one, it defines search patterns and related actions.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ awk &apos;/.*/ {print $0}&apos; file
&lt;/pre&gt;

&lt;p&gt;The above line is comparable to &lt;strong&gt;$(cat file)&lt;/strong&gt;, the search pattern is &lt;strong&gt;/.*/&lt;/strong&gt; (any character) and the action is &lt;strong&gt;{print $0}&lt;/strong&gt; (print current line). The body section is executed once per line, if a file contain 10 lines, the body section will be executed 10 times and will print all the content. Any length of pattern-actions can be declared within an awk program. The next example will look for &lt;strong&gt;daemon&lt;/strong&gt; and &lt;strong&gt;root&lt;/strong&gt; and will print every line where awk finds those strings.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ awk &apos;/root/ {print $0} /daemon/ {print $0}&apos; /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
&lt;/pre&gt;

&lt;p&gt;If no search pattern is defined for an action, the action will be executed once per line, if no action is defined for a search pattern the default action will be to print the current line, if no parameter is given to &lt;strong&gt;print&lt;/strong&gt; it will print the whole line (&lt;strong&gt;$0&lt;/strong&gt;). Therefore the above examples can be rewritten as follows:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ awk &apos;{print $0}&apos; file
$ awk &apos;{print}&apos;    file

$ awk &apos;/root/ || /daemon/ {print $0}&apos; /etc/passwd
$ awk &apos;/root/ || /daemon/ {print}&apos;    /etc/passwd
$ awk &apos;/root/ || /daemon/&apos;            /etc/passwd
&lt;/pre&gt;

&lt;p&gt;These alternatives ways of writing awk programs (I think) are part of the reason why awk seems like a cryptographic language and why so many awk programs are tiny. Awk also defines default variables, some of the most important are:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;NR = Number of Record (line number)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;NF = Number of Field&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;RS = Record separator (\n by default)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;FS = Field separator  (white spaces by default)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you’ve a file with the content:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
1 2 3
4 5 6
&lt;/pre&gt;

&lt;p&gt;Awk will see 2 records and 3 fields. So, &lt;strong&gt;$(cat -n file)&lt;/strong&gt; can be emulated in awk with:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ awk &apos;{print NR, $0}&apos; file
&lt;/pre&gt;

&lt;p&gt;As the search pattern is missing, the action will be executed once for every line, and for every time it will print &lt;strong&gt;NR&lt;/strong&gt; plus the whole line, &lt;strong&gt;NR&lt;/strong&gt; will increase +1 in every iteration, that’s a lot of things happening in a minuscule definition. Let’s review other example, &lt;strong&gt;$(wc -l)&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ awk &apos;END {print NR}&apos;      file
$ awk &apos;{i++} END {print i}&apos; file
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;NR&lt;/strong&gt; will always increment, so in the first program when the END sections gets executed it will print the total amount of lines in the file. The second example is easier to analyze, it doesn’t have a search pattern so the action (i++) will always be executed and at the end the program it will be printed. Its amazing how easily other Unix core utilities can be implemented in a simple line, let’s now copy &lt;strong&gt;$(head)&lt;/strong&gt; behavior:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ awk &apos;NR &amp;lt;= 10&apos;          file
$ awk -v hl=10 &apos;NR &amp;lt;= hl&apos; file
&lt;/pre&gt;

&lt;p&gt;Does it make sense?, awk is not as difficult as it seems 😉. Sed can also be emulated:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ awk &apos;{gsub(/original/,&quot;replace&quot;); print}&apos; file
$ awk &apos;function sed(search, replace) { gsub(search,replace); print } {sed(&quot;search&quot;,&quot;replace&quot;)}&apos; file
&lt;/pre&gt;

&lt;p&gt;Awk can also use control structures and functions, in the first example it uses de gsub function to replace all original string with “replace” in a file, just as sed would do it. In the second one, a function called “sed” is defined and used to replace the same strings. Awk is a complete turing language, so even though it could be seen as a toy tool, it’s a powerful tool which can be used to build sotisficated programs. Nevertheless if you’ve read till this phrase you already know its core principles and are ready to take advantage of its power.&lt;/p&gt;

&lt;p&gt;I’m leaving some more example to get started, can you guess how do they work?&lt;/p&gt;

&lt;h2 id=&quot;awk-as-unix-swiss-army-knife&quot;&gt;Awk as Unix swiss army knife&lt;/h2&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
cat file                 &amp;#x25B7; awk &apos;{print}&apos; file
cat -n file              &amp;#x25B7; awk &apos;{print NR, $0}&apos; file
cat -n file              &amp;#x25B7; awk &apos;{print FNR, $0}&apos; file
head file                &amp;#x25B7; awk &apos;NR &amp;lt;= 10&apos; file
head -15 file            &amp;#x25B7; awk -v hl=15 &apos;NR &amp;lt;= hl&apos; file
cut -d: -f1 /etc/passwd  &amp;#x25B7; awk -F&quot;:&quot; &apos;{print $1}&apos; /etc/passwd
cut -d: -f1 /etc/passwd  &amp;#x25B7; awk &apos;BEGIN {FS=&quot;:&quot;} {print $1}&apos; /etc/passwd
wc -l file               &amp;#x25B7; awk &apos;{i++} END {print i}&apos; file
wc -l file               &amp;#x25B7; awk &apos;END {print NR}&apos; file
wc -w file               &amp;#x25B7; awk &apos;{total = total + NF}; END {print total+0}&apos; file
grep pattern file        &amp;#x25B7; awk &apos;/pattern/&apos; file
grep -v pattern file     &amp;#x25B7; awk &apos;!/pattern/&apos; file
sed &apos;s/foo/bar/g&apos;        &amp;#x25B7; awk &apos;{gsub(/foo/,&quot;bar&quot;); print $0}&apos; file
tail file                &amp;#x25B7; awk -v tl=10 &apos;{a=a b $0;b=RS;if(NR&amp;lt;=tl)next;a=substr(a,index(a,RS)+1)}END{print a}&apos; file
tail - 15 file           &amp;#x25B7; awk -v tl=15 &apos;{a=a b $0;b=RS;if(NR&amp;lt;=tl)next;a=substr(a,index(a,RS)+1)}END{print a}&apos; file
tac file                 &amp;#x25B7; awk &apos;{a[i++]=$0} END {for (j=i-1; j&amp;gt;=0;) print a[j--] }&apos; file
uniq file                &amp;#x25B7; awk &apos;a !~ $0; {a=$0}&apos;
&lt;/pre&gt;

&lt;h2 id=&quot;awk-one-liners&quot;&gt;Awk one-liners&lt;/h2&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
awk &apos;$2  ~ /pattern/&apos;  file               #print line when second field matches pattern
awk &apos;$2 !~ /^[0-9]+$/&apos; file               #print line when second field is not a number
awk &apos;1; {print &quot;&quot;}&apos; file                  #adds double space
awk &apos;BEGIN {ORS=&quot;\n\n&quot;}; 1&apos; file          #adds double space
awk &apos;NF {print $0 &quot;\n&quot;}&apos; file             #adds double space to lines with content
awk &apos;BEGIN {RS=&quot;&quot;;ORS=&quot;\n\n&quot;}/pattern/&apos;   #print whole paragrams where pattern is found
awk &apos;{print $NF}&apos; file                    #print the last field of every line
awk &apos;{field=$NF} END{print field}&apos; file   #print the last field of the last line
awk &apos;NF &amp;gt; 4&apos; file                         #print lines with more than 4 fields
awk &apos;{sub(/^[ \t]+/, &quot;&quot;);print}&apos; file     #delete white spaces at the beggining of a line
awk &apos;{sub(/[ \t]+$/, &quot;&quot;);print}&apos; file     #delete white spaces at the end of a line
awk &apos;{gsub(/^[ \t]+|[ \t]+$/, &quot;&quot;);print}&apos; #delete white spaces at the beggining and end of a line
awk &apos;{$2=&quot;&quot;; print}&apos;  file                #delete the 2nd field of every line
awk &apos;/AAA|BBB|CCC/&apos;   file                #search and print &quot;AAA&quot;, &quot;BBB&quot; or &quot;CCC&quot;
awk &apos;/AAA.*BBB.*CCC/&apos; file                #search and print &quot;AAA&quot;, &quot;BBB&quot; and &quot;CCC&quot; in that order
&lt;/pre&gt;

&lt;p&gt;References&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://awk.info&quot;&gt;http://awk.info&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_toc.html&quot;&gt;http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_toc.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.grymoire.com/Unix/Awk.html&quot;&gt;http://www.grymoire.com/Unix/Awk.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.bignerdranch.com/3799-a-crash-course-in-awk/&quot;&gt;http://blog.bignerdranch.com/3799-a-crash-course-in-awk/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/public/books/The_AWK_Programming_Language.pdf&quot;&gt;The Awk Programming Language (1988) [pdf]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>unstressed direct, indirect pronouns in Spanish</title>
   <link href="https://javier.io/blog/en/2014/02/21/unstressed-object-pronouns-in-spanish.html"/>
   <published>2014-02-21T00:00:00+00:00</published>
   <updated>2014-02-21T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/02/21/unstressed-object-pronouns-in-spanish</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">unstressed direct, indirect pronouns in Spanish</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/02/21/unstressed-object-pronouns-in-spanish.html">&lt;h2 id=&quot;unstressed-direct-indirect-pronouns-in-spanish&quot;&gt;unstressed direct, indirect pronouns in Spanish&lt;/h2&gt;

&lt;h6 id=&quot;21-feb-2014&quot;&gt;21 Feb 2014&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/92.png&quot;&gt;&lt;img src=&quot;/assets/img/92.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes I help friends with Spanish grammar, I’m not an expert but I remember I wasn’t that bad on my Spanish classes neither. It’s also a good chance to practice my English, though. Anyway, last time I explained what were unstressed pronouns (pronómbres átonos) and I though it would be cool to start writing about it.&lt;/p&gt;

&lt;p&gt;Unstressed object pronouns are used in Spanish to replace direct and indirect objects with pronouns, it’s one of the trickiest Spanish structures and even native speakers can misuse them, so they should be studied carefully. They can be translated sometimes as: me, you, him, her, it, us and them. However people should be aware that they don’t have exactly the same meaning.&lt;/p&gt;

&lt;p&gt;To use correctly unstressed object pronouns, you should be able to recognize with ease when a phrase contain either a direct or indirect object. Let me wrap it up, A direct object is the part of the sentence which receives the action of the main verb, it can be discovered by asking what? and whom? to the verb.&lt;/p&gt;

&lt;h2 id=&quot;example&quot;&gt;Example:&lt;/h2&gt;

&lt;pre&gt;
Pepe eats fish / Pepe come pescado (what does Pepe eat?)
do(direct object) = fish = pescado
&lt;/pre&gt;

&lt;h2 id=&quot;exercises-find-the-direct-object-in-the-following-sentences&quot;&gt;Exercises: Find the direct object in the following sentences&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Juan Loves María / Juan ama a María&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Carlos fixes computers / Carlos arregla computadoras&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;The policeman saw the thieves / El policia vio a los ladrones&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The indirect object in the other hand is whom receives the action of the direct object, and it can be discovered by asking, to whom?, for whom?.&lt;/p&gt;

&lt;h2 id=&quot;example-1&quot;&gt;Example:&lt;/h2&gt;

&lt;pre&gt;
Lucas buys a watermelon for Sandra / Lucas compra una sandía para Sandra
do (direct object) = a watermelon = una sandía
io(indirect object) = for Sandra = para Sandra
&lt;/pre&gt;

&lt;h2 id=&quot;exercises-find-the-direct-and-indirect-object-of-the-following-phrases&quot;&gt;Exercises: Find the direct and indirect object of the following phrases&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Margarita made coffee for Marcos / Margarita hizo café para Marcos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Alba gave some tips to her son / Alba dio unos consejos a su hijo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;The told the workers to arrive earlier / El jefé dijó a los trabajadores que llegaran más temprano&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once you’re able to identify the existence of an direct/indirect object in a phrase you’ll be able to use the appropriate pronoun. Take a look at the table in the header of this posts.&lt;/p&gt;

&lt;h2 id=&quot;example-2&quot;&gt;Example:&lt;/h2&gt;

&lt;pre&gt;
Pepe eats fish / Pepe come pescado
do=fish=pescado, pescado refers to an animal in third person singular (he, the fish)
&lt;/pre&gt;

&lt;p&gt;It must be replaced with ‘lo’:&lt;/p&gt;

&lt;pre&gt;
Pepe *lo* come (it should be placed by general rule before the main verb)
&lt;/pre&gt;

&lt;p&gt;Let’s review other example:&lt;/p&gt;

&lt;pre&gt;
Juan loves Maria / Juan ama a María
do=a Maria, Maria refers to a person in third person singular (she, Maria)
&lt;/pre&gt;

&lt;p&gt;On this case, ‘a Maria’ must be replaced with ‘la’ (it’s female):&lt;/p&gt;

&lt;pre&gt;
Juan *la* ama
&lt;/pre&gt;

&lt;h2 id=&quot;exercises-replace-the-direct-object-with-the-appropriate-pronoun&quot;&gt;Exercises: Replace the direct object with the appropriate pronoun&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Did you find your mother’s ring? / ¿Has encontrado el anillo de tu madre?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Roberto paid a lot of money for his new car / Roberto pagó mucho dinero por su nuevo carro&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;A friend will translate the book / Un amigo traducirá el libro&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The same technique can be used to replace indirect objects.&lt;/p&gt;

&lt;h2 id=&quot;example-3&quot;&gt;Example:&lt;/h2&gt;

&lt;pre&gt;
Lucas buys a watermelon for Sandra / Lucas compra una sandía para Sandra
od=a watermelon=una sandía
id=for Sandra=para Sandra
&lt;/pre&gt;

&lt;p&gt;Sandra refers to a third person in singular (she, Sandra) and it can be replaced with ‘le’ because of being an indirect object. If it were a direct object it would be replaced with ‘la’.&lt;/p&gt;

&lt;pre&gt;
Lucas *le* compra una sandía
&lt;/pre&gt;

&lt;h2 id=&quot;exercises-replace-the-indirect-object-with-the-appropriate-pronoun&quot;&gt;Exercises: Replace the indirect object with the appropriate pronoun&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Tomorrow I’ll give the money to Eduardo / Mañana entregaré el dinero a Eduardo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;I bought a gift for you / Compré un regalo para ti&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;table&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;The donations will be given back to the contributers this year&lt;/td&gt;
        &lt;td&gt;Los donativos de este año serán devueltos a los contribuyentes&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both can be replaced at the same time, the direct and the indirect objects, however when doing it, a new rule applies, whenever a ‘lo’ and ‘le’ gets together, the second one must be replaced with ‘se’ (indirect object).&lt;/p&gt;

&lt;h2 id=&quot;example-4&quot;&gt;Example:&lt;/h2&gt;

&lt;pre&gt;
Lucas buys a watermelon for Sandra / Lucas compra una sandía para Sandra
od=a watermelon=una sandía
id=for Sandra=para Sandra

Lucas la compra para Sandra (replacing the direct object)
Lucas le compra una sandía (replacing the indirect object)
Lucas se la compra (replacing both) 
&lt;/pre&gt;

&lt;p&gt;Pay attention to the &lt;em&gt;‘se’&lt;/em&gt; which replaces &lt;em&gt;‘le’&lt;/em&gt; for the indirect object&lt;/p&gt;

&lt;h2 id=&quot;exercises-replace-the-directindirect-objects-with-the-appropriate-pronouns&quot;&gt;Exercises: Replace the direct/indirect objects with the appropriate pronouns&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;I told the girls the reasons of my decision / Les dije a las chicas las razones de mi decisión&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Did you get back the chair to the neighbor (female)?  / ¿Devolviste la silla a la vecina?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Diana wrote a letter to Hugo / Diana escribio una carta para Hugo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s it&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;keywords, palabras clave:&lt;/strong&gt; &lt;em&gt;leismo, laismo, loismo, objeto directo, objeto indirecto&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=N_3flr9ni0s&quot;&gt;http://www.youtube.com/watch?v=N_3flr9ni0s&lt;/a&gt; (direct object / objeto directo)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=jMzAQ2bQEx0&quot;&gt;http://www.youtube.com/watch?v=jMzAQ2bQEx0&lt;/a&gt; (indirect object / objeto indirecto)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.appstate.edu/~fountainca/1050/unidad2/pronombresatonos.html&quot;&gt;http://www.appstate.edu/~fountainca/1050/unidad2/pronombresatonos.html&lt;/a&gt; (unstressed pronouns / pronombres átonos)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>nossa infância</title>
   <link href="https://javier.io/blog/pt/2014/02/12/nossa-infanca.html"/>
   <published>2014-02-12T00:00:00+00:00</published>
   <updated>2014-02-12T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2014/02/12/nossa-infanca</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="poetry"/>
   
   
   
   <summary type="html">nossa infância</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2014/02/12/nossa-infanca.html">&lt;h2 id=&quot;nossa-infância&quot;&gt;nossa infância&lt;/h2&gt;

&lt;h6 id=&quot;12-feb-2014&quot;&gt;12 Feb 2014&lt;/h6&gt;

&lt;pre class=&quot;lyric&quot;&gt;
Nossa infância é só uma lembrança
demasiado vaga
longe ficou aquela nossa terra
a terra que nos viu crescer

Partiram nossos primeiros suspiros
sem nos dar tempo de madurar
ainda nos despertamos
e já somos homens
e já somos pais
sem nos dar tempo de olhar ao futuro

Não jogaremos mais
embora nossa mente siga brincando
já somos pais
o tempo não dá trégua para pensar
encontramo-nos, desmaia-nos
o tempo não dá trégua para curar

Nossos sonhos já não existem em céu nenhum
nossos primeiros suspiros partiram ontem
e já somos pais
não temos tempo de madurar, não temos

Juan Gregorio Regino / Nuestra infancia (Nga kamá xixií)
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>por que não está vivendo seus sonhos?</title>
   <link href="https://javier.io/blog/pt/2014/02/05/por-que-nao-vive-seus-sonhos.html"/>
   <published>2014-02-05T00:00:00+00:00</published>
   <updated>2014-02-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2014/02/05/por-que-nao-vive-seus-sonhos</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">por que não está vivendo seus sonhos?</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2014/02/05/por-que-nao-vive-seus-sonhos.html">&lt;h2 id=&quot;por-que-não-está-vivendo-seus-sonhos&quot;&gt;por que não está vivendo seus sonhos?&lt;/h2&gt;

&lt;h6 id=&quot;05-feb-2014&quot;&gt;05 Feb 2014&lt;/h6&gt;

&lt;p&gt;É uma pergunta interessante, pois poucas pessoas os tornam realidade.&lt;/p&gt;

&lt;p&gt;Todos nós gostamos de sonhar, o fazemos na ducha, durante o trajeto no ônibus, enquanto esperamos na fila do supermercado, porém, a maioria desses sonhos contiuam sonhos. A vida é curta e cada ano o tempo passa depressa (é normal, nossos cérebros e nervos transmitem a informação &lt;a href=&quot;http://deepblue.lib.umich.edu/bitstream/handle/2027.42/50152/880151007_ftp.pdf?sequence=1&quot;&gt;mais lentamente&lt;/a&gt; cada ano). Você tem menos tempo do que acha.&lt;/p&gt;

&lt;p&gt;Não espere mais, pois mesmo se começar agora, você já consumiu quase todo o seu tempo. Levanta-se e torne seus sonhos realidade!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>introduction to drupal 7 installation profiles</title>
   <link href="https://javier.io/blog/en/2014/01/26/introduction-to-drupal-7-installation-profiles.html"/>
   <published>2014-01-26T00:00:00+00:00</published>
   <updated>2014-01-26T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/01/26/introduction-to-drupal-7-installation-profiles</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">introduction to drupal 7 installation profiles</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/01/26/introduction-to-drupal-7-installation-profiles.html">&lt;h2 id=&quot;introduction-to-drupal-7-installation-profiles&quot;&gt;introduction to drupal 7 installation profiles&lt;/h2&gt;

&lt;h6 id=&quot;26-jan-2014&quot;&gt;26 Jan 2014&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/91.gif&quot;&gt;&lt;img src=&quot;/assets/img/91.gif&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Last weekend I worked on a Drupal site and it was not fun =( mostly due to incomplete and inaccurate documentation. My goal was to create a distributable bundle for &lt;a href=&quot;https://github.com/javier-lopez/ubuntu-mx-www&quot;&gt;Spanish Ubuntu&lt;/a&gt; local teams. I already had a base theme and didn’t though it could be that hard, however what started as a simple task ended as a very long weekend. On this post I’ll try to document what issues I found and how they were worked out.&lt;/p&gt;

&lt;p&gt;For the record, I must say I’m not a web developer, I find all the technologies related quite difficult to understand, I also didn’t have any previous experience with drupal internals.&lt;/p&gt;

&lt;p&gt;Since the beginning I though any work should be automatized as much as possible, ideally an administrator would be able to download the bundle, throw it away on the file system, run the web installer and start creating content. The result happily is quite similar:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Download and place the bundle in a directory read by a web server (eg, apache)&lt;/li&gt;
  &lt;li&gt;Go to the server ip&lt;/li&gt;
  &lt;li&gt;Select the ‘Ubuntu-mx’ profile&lt;/li&gt;
  &lt;li&gt;On a Spanish translated interface, input the database settings&lt;/li&gt;
  &lt;li&gt;Configure the administrator credentials&lt;/li&gt;
  &lt;li&gt;Create content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The resulting site would be translated to spanish, will enable a bunch of modules (l10n_update, admin_menu, smtp, ckeditor), an Ubuntu theme, search permissions and menu links.&lt;/p&gt;

&lt;p&gt;For this to work, I used:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://drupal.org/node/1022020&quot;&gt;installation profiles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://drupal.org/project/features&quot;&gt;feature modules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;installation-profiles&quot;&gt;Installation profiles&lt;/h2&gt;

&lt;p&gt;Installation profiles are special modules who allow you to declare which modules, languages and themes to load by default, they can also be used to modify the installer to add or remove steps.&lt;/p&gt;

&lt;p&gt;They must have a &lt;a href=&quot;https://drupal.org/taxonomy/term/33388&quot;&gt;.info&lt;/a&gt;, &lt;a href=&quot;https://api.drupal.org/api/drupal/modules!profile!profile.module/7&quot;&gt;.profile&lt;/a&gt; and &lt;a href=&quot;https://api.drupal.org/api/drupal/includes!install.core.inc/function/install_tasks/7&quot;&gt;.install&lt;/a&gt; files at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;/profiles/profile_name/&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I named my module &lt;strong&gt;‘umx’&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;info&quot;&gt;.info&lt;/h3&gt;

&lt;p&gt;This file contains name, description, drupal version and dependencies (modules enabled by default):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;declaring only core modules as dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The content of my &lt;strong&gt;/profiles/umx/umx.info&lt;/strong&gt; file was:&lt;/p&gt;

&lt;pre class=&quot;sh_properties&quot;&gt;
name        = Ubuntu-mx
description = Install Ubuntu-mx modules, language (es) and configuration
version     = 0.1
core        = 7.x

dependencies[] = block
dependencies[] = color
dependencies[] = comment
dependencies[] = contextual
dependencies[] = dashboard
dependencies[] = help
dependencies[] = image
dependencies[] = list
dependencies[] = number
dependencies[] = options
dependencies[] = path
dependencies[] = taxonomy
dependencies[] = dblog
dependencies[] = shortcut
dependencies[] = overlay
dependencies[] = field_ui
dependencies[] = file
dependencies[] = rdf

dependencies[] = umx_conf
&lt;/pre&gt;

&lt;p&gt;I found much more comfortable to declare only core modules as dependencies and carry on the rest of the configuration in a separate module (generated by the features module). This way I can keep using the same unmodified profile and alter the resulting site by regenerating the umx_conf module when necessary.&lt;/p&gt;

&lt;h3 id=&quot;profile&quot;&gt;.profile&lt;/h3&gt;

&lt;p&gt;On the &lt;strong&gt;.profile&lt;/strong&gt; and &lt;strong&gt;.install&lt;/strong&gt; files can be written functions to override/define hooks, I used &lt;strong&gt;/profile/umx/umx.profile&lt;/strong&gt; to configure the default language to spanish (as a result the language dialogue is skipped):&lt;/p&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_profile_details() {
    $details[&apos;language&apos;] = &quot;es&quot;;
    return $details;
}
&lt;/pre&gt;

&lt;p&gt;The default language can also be configured in a feature module (on this example, &lt;strong&gt;umx_conf&lt;/strong&gt;) however if doing so, the installation process itself will run in English, and if it’s double declared (here and in a feature module), the installation will return a sql duplication key error.&lt;/p&gt;

&lt;p&gt;It’s not optimal, but it’s the best I could do. I located the es.po file at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;/profiles/umx/translations/es.po&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The localize.drupal.org server has po files with a drupal version prefix, if downloaded from there, you should rename them. Eg&lt;/p&gt;

&lt;pre&gt;
    drupal-7.26.es.po -&amp;gt; es.po
&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://drupal.org/node/1326106&quot;&gt;https://drupal.org/node/1326106&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;install&quot;&gt;.install&lt;/h3&gt;

&lt;p&gt;Here you can override install, update and uninstall functions. Since the feature modules doesn’t support theme settings (something who could be really useful) I declared the default theme on this file (&lt;strong&gt;/profile/umx/umx.install&lt;/strong&gt;):&lt;/p&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_install() {
    db_update(&apos;system&apos;)
        -&amp;gt;fields(array(&apos;status&apos; =&amp;gt; 1))
        -&amp;gt;condition(&apos;type&apos;, &apos;theme&apos;)
        -&amp;gt;condition(&apos;name&apos;, &apos;umxtheme&apos;)
        -&amp;gt;execute();
    variable_set(&apos;theme_default&apos;, &apos;umxtheme&apos;);
}
&lt;/pre&gt;

&lt;p&gt;According to the documentation, theme settings should be declared in &lt;strong&gt;profile_themes_enabled()&lt;/strong&gt; with the &lt;strong&gt;theme_enable()&lt;/strong&gt; function, however I was unable to make to work any of them.&lt;/p&gt;

&lt;p&gt;Snippets which did &lt;strong&gt;NOT&lt;/strong&gt; work (drupal 7.26):&lt;/p&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_themes_enabled() {
    //any code;
}
&lt;/pre&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_install_finished() {
    //any code;
}
&lt;/pre&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_update_N() {
    //any code;
}
&lt;/pre&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_install() {
    variable_set(&apos;theme_default&apos;,&apos;umxtheme&apos;);
}
&lt;/pre&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_install() {
    $list_themes = list_themes(TRUE);
    $major_version = (int)VERSION;

    $theme_default = isset($list_themes[&apos;umxtheme&apos;]) ? &apos;umxtheme&apos; : &apos;garland&apos;;
    $admin_theme   = isset($list_themes[&apos;seven&apos;]) ? &apos;seven&apos; : &apos;garland&apos;;

    variable_set(&apos;theme_default&apos;, $theme_default);
    theme_enable($theme_default);
    theme_disable(array(&apos;bartik&apos;));

    if($affect_admin_theme){
        variable_set(&apos;admin_theme&apos;, $admin_theme);
    }

    if (module_exists(&apos;switchtheme&apos;)) {
        if (empty($_GET[&apos;theme&apos;]) || $_GET[&apos;theme&apos;] !== $theme_default) {
            $query = array(
                &apos;theme&apos; =&amp;gt; $theme_default
            ); 
            if($major_version &amp;lt; 7){
                $options = $query;
            }
            else{
                $options = array(&apos;query&apos; =&amp;gt; $query);
            }

            drupal_goto($_GET[&apos;q&apos;], $options);
        }
    }
}
&lt;/pre&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_install() {
    $enable = array(
        &apos;theme_default&apos; =&amp;gt; &apos;umxtheme&apos;,
        &apos;admin_theme&apos;   =&amp;gt; &apos;seven&apos;,
    );
    theme_enable($enable);

    foreach ($enable as $var =&amp;gt; $theme) {
        if (!is_numeric($var)) {
            variable_set($var, $theme);
        }
    }

    theme_disable(array(&apos;bartik&apos;));
}
&lt;/pre&gt;

&lt;p&gt;Drupal themes must be placed at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;/sites/all/themes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One lesson I learned was that themes should be named clearly, at the beginning I declared the theme as ‘umx’ (for ubuntu-mx theme) and put it in &lt;strong&gt;/sites/all/themes/umx-theme/&lt;/strong&gt;, later on while trying to configure the bundle with a default theme I got confused because the profile installation was named equal and I was not sure which one I was referring to. Name your themes with a unique string, (I finally decided to rename ‘umx’ to ‘umxtheme’).&lt;/p&gt;

&lt;p&gt;Ignore the &lt;strong&gt;name&lt;/strong&gt; field written in the &lt;em&gt;.info&lt;/em&gt; file, and prefix your hook functions with the selected drupal theme (e,g, umxtheme_footer_text())&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.computerminds.co.uk/articles/setting-default-theme-during-installation&quot;&gt;Setting default theme for Drupal&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codedrup.blogspot.mx/2012/10/setting-different-default-theme-by.html&quot;&gt;Setting a different default theme by default in an install profile&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.isaacsukin.com/news/2011/01/10/how-write-drupal-7-installation-profile&quot;&gt;how to write a drupal 7 installation profile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;feature-modules&quot;&gt;Feature modules&lt;/h2&gt;

&lt;p&gt;Feature modules are good for bundling configurations, permissions and dependencies on non default modules. I created &lt;strong&gt;umx_conf&lt;/strong&gt; to iterate faster. Using feature modules you can modify drupal settings through a browser and then export the result to code from the feature menu.&lt;/p&gt;

&lt;p&gt;Autogenerated features modules can contain:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;.info&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;.module&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;.feature.submodule.inc&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Very few times you would need to modify them directly. In my experience (a weekend) the autogenerated files will sometimes contain mistakes, therefore I modified them slightly to feet my needs:&lt;/p&gt;

&lt;h3 id=&quot;info-1&quot;&gt;.info&lt;/h3&gt;

&lt;p&gt;On this file, dependencies are declared, the generator makes a quite clever job adding recursively all the dependencies your configurations depend on.&lt;/p&gt;

&lt;pre class=&quot;sh_properties&quot;&gt;
name        = umx conf
description = Common settings for the Ubuntu-mx local portal.
core        = 7.x
package     = Features
version     = 7.x-0.1
project     = umx_conf

dependencies[] = admin_menu
dependencies[] = admin_menu_toolbar
dependencies[] = ckeditor
dependencies[] = features
dependencies[] = l10n_update
dependencies[] = locale
dependencies[] = menu
dependencies[] = search
dependencies[] = smtp

features[ckeditor_profile][] = Advanced
features[ckeditor_profile][] = CKEditor Global Profile
features[ckeditor_profile][] = Full

features[features_api][]     = api:2
features[user_permission][]  = search content
features[user_permission][]  = use advanced search

features[menu_custom][] = main-menu
features[menu_links][]  = main-menu_portada:&amp;lt;front&amp;gt;
features[menu_links][]  = main-menu_foros:http://google.com
features[menu_links][]  = main-menu_preguntas:http://ubuntu.shapado.com
features[menu_links][]  = main-menu_wiki:https://wiki.ubuntu.com/UbuntuMxTeam
features[menu_links][]  = main-menu_chat:http://google.com
features[menu_links][]  = main-menu_descargar-ubuntu:http://google.com
&lt;/pre&gt;

&lt;h3 id=&quot;module&quot;&gt;.module&lt;/h3&gt;

&lt;p&gt;On this file, you can override hook functions, I leave it blank&lt;/p&gt;

&lt;h3 id=&quot;featuresubmoduleinc&quot;&gt;.feature.submodule.inc&lt;/h3&gt;

&lt;p&gt;On these files per module configurations are saved, in my case, I had to modify &lt;strong&gt;/sites/all/modules/umx_conf/umx_conf.features.menu_links.inc&lt;/strong&gt; because some links weren’t exported.&lt;/p&gt;

&lt;pre class=&quot;sh_php&quot;&gt;
function umx_conf_menu_default_menu_links() {
  $menu_links = array();
  $menu_links[&apos;main-menu_portada:&amp;lt;front&amp;gt;&apos;] = array(
    &apos;menu_name&apos; =&amp;gt; &apos;main-menu&apos;,
    &apos;link_path&apos; =&amp;gt; &apos;&amp;lt;front&amp;gt;&apos;,
    &apos;router_path&apos; =&amp;gt; &apos;&apos;,
    &apos;link_title&apos; =&amp;gt; &apos;Portada&apos;,
    &apos;options&apos; =&amp;gt; array(
      &apos;attributes&apos; =&amp;gt; array(
        &apos;title&apos; =&amp;gt; &apos;&apos;,
      ),
      &apos;identifier&apos; =&amp;gt; &apos;main-menu_portada:&amp;lt;front&amp;gt;&apos;,
    ),
    &apos;module&apos; =&amp;gt; &apos;menu&apos;,
    &apos;hidden&apos; =&amp;gt; 0,
    &apos;external&apos; =&amp;gt; 1,
    &apos;has_children&apos; =&amp;gt; 0,
    &apos;expanded&apos; =&amp;gt; 0,
    &apos;weight&apos; =&amp;gt; 0,
    &apos;customized&apos; =&amp;gt; 1,
  );

  ...
&lt;/pre&gt;

&lt;p&gt;I had to adjust mostly the &lt;strong&gt;weight&lt;/strong&gt; parameter and add missing links. Not difficult if you follow the syntax (even if you don’t know php).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=DxRBEaD9JCA&quot;&gt;Introduction to drupal module features&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;extra&quot;&gt;Extra&lt;/h2&gt;

&lt;p&gt;If you had problems with the above description, a probably better and more up-to-date approach to profile Drupal installation is described at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20200331105719/https://salsadigital.com.au/news/drupal-installation-profile-and-distributions&quot;&gt;https://web.archive.org/web/20200331105719/https://salsadigital.com.au/news/drupal-installation-profile-and-distributions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it, I hope this information can save some time to someone, have fun!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>multicursor in ubuntu</title>
   <link href="https://javier.io/blog/en/2014/01/06/multicursor-in-ubuntu.html"/>
   <published>2014-01-06T00:00:00+00:00</published>
   <updated>2014-01-06T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2014/01/06/multicursor-in-ubuntu</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">multicursor in ubuntu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2014/01/06/multicursor-in-ubuntu.html">&lt;h2 id=&quot;multicursor-in-ubuntu&quot;&gt;multicursor in ubuntu&lt;/h2&gt;

&lt;h6 id=&quot;06-jan-2014&quot;&gt;06 Jan 2014&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/88.png&quot;&gt;&lt;img src=&quot;/assets/img/88.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During my last holidays I found myself into a position where I had to share my laptop with other persons. I knew it was possible to use different keyboards/mice with Linux but never had tried.., till now 😏&lt;/p&gt;

&lt;p&gt;On this scenario, I had an extra monitor and an extra mouse, so the first thing I did was to enable the monitor, since I use &lt;a href=&quot;http://i3wm.org/&quot;&gt;i3&lt;/a&gt; as my window manager I use raw xrandr to extend my visual setup.&lt;/p&gt;

&lt;pre&gt;
$ xrandr --output VGA1 --mode 1680x1050 --right-of LVDS1
&lt;/pre&gt;

&lt;p&gt;Pretty simple, I just love this kind of tools. Next item, enable mouse. For this device to work I used &lt;a href=&quot;http://cgit.freedesktop.org/xorg/app/xinput/&quot;&gt;xinput&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;
$ xinput create-master Auxiliary
$ xinput list #get the mouse id
$ xinput reattach 10 &quot;Auxiliary pointer&quot; #use the id to set it as auxiliar pointer
&lt;/pre&gt;

&lt;p&gt;After applying these changes, the xinput configuration looked like this:&lt;/p&gt;

&lt;pre&gt;
xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ Microsoft Microsoft® Nano Transceiver v1.0	id=11	[slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              	id=14	[slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                   	id=15	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ Microsoft Microsoft® Nano Transceiver v1.0	id=9	[slave  keyboard (3)]
    ↳ Integrated Camera                       	id=12	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=13	[slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                  	id=16	[slave  keyboard (3)]
⎡ Auxiliary pointer                       	id=17	[master pointer  (18)]
⎜   ↳ Microsoft Microsoft® Nano Transceiver v1.0	id=10	[slave  pointer  (17)]
⎜   ↳ Auxiliary XTEST pointer                 	id=19	[slave  pointer  (17)]
⎣ Auxiliary keyboard                      	id=18	[master keyboard (17)]
    ↳ Auxiliary XTEST keyboard                	id=20	[slave  keyboard (18)]
&lt;/pre&gt;

&lt;p&gt;That’s it, the experience wasn’t really bad, i3 reacts correctly most of the time and although there were confusion, it is manageable 😊&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.archlinux.org/index.php/Multi-pointer_X&quot;&gt;https://wiki.archlinux.org/index.php/Multi-pointer_X&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>ssh captcha</title>
   <link href="https://javier.io/blog/en/2013/12/17/ssh-captcha.html"/>
   <published>2013-12-17T00:00:00+00:00</published>
   <updated>2013-12-17T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/12/17/ssh-captcha</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="security"/>
   
   <category term="networking"/>
   
   
   
   <summary type="html">ssh captcha</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/12/17/ssh-captcha.html">&lt;h2 id=&quot;ssh-captcha&quot;&gt;ssh captcha&lt;/h2&gt;

&lt;h6 id=&quot;17-dec-2013&quot;&gt;17 Dec 2013&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/minos-org/libpam-captcha&quot;&gt;&lt;img src=&quot;/assets/img/pam_captcha.png&quot; alt=&quot;pam captcha&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/53a85bc1b41c096c83130&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt;--&gt;&lt;/p&gt;

&lt;p&gt;Some days ago while I was reviewing some data I noticed a spammer in one of my remote machines. Since I was mostly using the box for running experiments I decided to rebuild it. Upon completion, I decided to improve my default ssh settings. I just liked too much to use a single password for all my ssh needs 😞&lt;/p&gt;

&lt;p&gt;I know some ways to improve security, I could change the password to a really difficult one, change the default port, filter by ip, by tries (fail2ban), disable completely password login and allow only key based logins, etc.&lt;/p&gt;

&lt;p&gt;At the end however I decided to just add a captcha protection, why?, most of the ssh attacks are automatized, people run scripts who tests thousand of passwords and run certain commands on success, these scritps won’t be able to recognized the slighly modification in the login process (they’re really dumb). In the other hand, I don’t need over complicated solutions, or more systems to administer. Ssh key based login is great but sometimes I just need access from third party machines.&lt;/p&gt;

&lt;p&gt;Lastly some other popular solutions have come up but for one or other reason I couldn’t feel comfortable with them:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://code.google.com/p/google-authenticator/&quot;&gt;google authenticator&lt;/a&gt; (my cellphone is most of the time lost, turn off or without battery, do I live under a rock?, not at all!, but I don’t get the always online hype.)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://barada.sourceforge.net/&quot;&gt;barada&lt;/a&gt; (see above reason)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cl.cam.ac.uk/~mgk25/otpw.html&quot;&gt;otpw&lt;/a&gt; (printing and carrying passwords with me?, you must be kidding)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=1891356&quot;&gt;otp&lt;/a&gt; (I may try this one)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/chrishunt/github-auth&quot;&gt;github auth&lt;/a&gt; (unrelated but it’s a nice way to do pair programming fast)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.authy.com/two-factor-ssh-in-thirty-seconds&quot;&gt;authy&lt;/a&gt; (people seems to really like cellphones)&lt;/li&gt;
  &lt;li&gt;any other method who involves &lt;a href=&quot;https://www.duosecurity.com/&quot;&gt;ForceCommand&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;pre&gt;
$ sudo add-apt-repository ppa:minos-archive/main
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install libpam-captcha
&lt;/pre&gt;

&lt;p&gt;Be aware than the previous steps will only work in supported Ubuntu LTS versions.&lt;/p&gt;

&lt;h3 id=&quot;extra&quot;&gt;Extra&lt;/h3&gt;

&lt;h2 id=&quot;sentry&quot;&gt;Sentry&lt;/h2&gt;

&lt;p&gt;If additional security is desired consider using &lt;a href=&quot;https://www.tnpi.net/wiki/Sentry&quot;&gt;sentry&lt;/a&gt; over fail2ban, denyhosts, sshblacklist, etc, really.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wget http://www.tnpi.net/internet/sentry.pl
$ sudo perl sentry.pl
$ echo &quot;sshd : /var/db/sentry/hosts.deny : deny&quot; &amp;gt; hosts
$ echo &quot;sshd : ALL : spawn /var/db/sentry/sentry.pl -c --ip=%a : allowsendmail: all&quot; &amp;gt;&amp;gt; hosts
$ cat hosts /etc/hosts.allow &amp;gt; hosts.allow
$ sudo mv hosts.allow /etc/ &amp;amp;&amp;amp; rm hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;fail2ban&quot;&gt;Fail2ban&lt;/h2&gt;

&lt;p&gt;The next fail2ban regex will match the ssh captcha generated messages&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#/etc/fail2ban/filter.d/sshd.conf
^%(__prefix_line)s(?:error: PAM: )?Permission denied for .* from &amp;lt;HOST&amp;gt;$
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Thanks Jordan! 😊&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.semicomplete.com/projects/pam_captcha/&quot;&gt;http://www.semicomplete.com/projects/pam_captcha/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/minos-org/libpam-captcha&quot;&gt;https://github.com/minos-org/libpam-captcha&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/minos-org/libpam-captcha-deb&quot;&gt;https://github.com/minos-org/libpam-captcha-deb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>simple pxe setup</title>
   <link href="https://javier.io/blog/en/2013/11/19/simple-pxe-setup.html"/>
   <published>2013-11-19T00:00:00+00:00</published>
   <updated>2013-11-19T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/11/19/simple-pxe-setup</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">simple pxe setup</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/11/19/simple-pxe-setup.html">&lt;h2 id=&quot;simple-pxe-setup&quot;&gt;simple pxe setup&lt;/h2&gt;

&lt;h6 id=&quot;19-nov-2013&quot;&gt;19 Nov 2013&lt;/h6&gt;

&lt;p&gt;There are several ways to setup a &lt;a href=&quot;http://es.wikipedia.org/wiki/Preboot_Execution_Environment&quot;&gt;pxe&lt;/a&gt; (which are useful mostly for massive installations), this is my personal method. A preboot execution environment in 68KB with batteries included, pxelinux, dhcpd, tftp, and hands-free installation.&lt;/p&gt;

&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/f2ac25e4df1e7ad5e989a&quot; width=&quot;640&quot; height=&quot;300&quot;&gt;&amp;nbsp;&lt;/iframe&gt;--&gt;
&lt;!--**[![](/assets/img/87.jpg)](/assets/img/87.jpg)**--&gt;

&lt;pre&gt;&lt;code&gt;$ sh &amp;lt;(wget -qO- https://raw.githubusercontent.com/javier-lopez/learn/master/sh/tools/pxe)
[+] setting pxe environment in ./pxe_setup ...
  - creating ./pxe_setup/menu.c32 ...
  - creating ./pxe_setup/pxelinux.0 ...
  - creating ./pxe_setup/simple-dhcpd ...
  - creating ./pxe_setup/simple-tftpd ...
  - creating ./pxe_setup/pxelinux.cfg/default ...
  - creating ./pxe_setup/ubuntu/ubuntu.menu ...
  - creating ./pxe_setup/pxe/fedora/fedora.menu ...
  - creating ./pxe_setup/tools/tools.menu ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The above command is the heart of the system, a script who creates a directory structure with all the tools and menus required to boot at least ubuntu/fedora (it can personalized to boot other distros). After executing the script, you’ll need to download two extra files; an initrd installer and a linux kernel.&lt;/p&gt;

&lt;p&gt;As an example I’ll download the Ubuntu 12.04 amd64 corresponding files:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://archive.ubuntu.com/ubuntu/dists/precise-updates/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/linux&quot;&gt;linux&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://archive.ubuntu.com/ubuntu/dists/precise-updates/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz&quot;&gt;initrd.gz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget http://archive.ubuntu.com/.../amd64/initrd.gz -O pxe_setup/ubuntu/1204/amd64/initrd.gz
$ wget http://archive.ubuntu.com/.../amd64/linux     -O pxe_setup/ubuntu/1204/amd64/linux
&lt;/pre&gt;

&lt;h2 id=&quot;pxe-enabled-router&quot;&gt;Pxe enabled router&lt;/h2&gt;

&lt;p&gt;Some routers can forward pxe petitions, you can configure them to point all pxe request to the machine running the tftp server (who will provide the pxelinux.0 and other required files) to boot other systems. In this scenarios the ip assigned to the host where this setup was done needs to be entered in the router with the &lt;strong&gt;pxelinux.0&lt;/strong&gt; string as path.&lt;/p&gt;

&lt;p&gt;And start the tftp daemon in the source machine:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd pxe_setup &amp;amp;&amp;amp; sudo python ./simple-tftpd
&lt;/pre&gt;

&lt;h2 id=&quot;computer-with-at-least-2-network-interfaces&quot;&gt;Computer with at least 2 network interfaces&lt;/h2&gt;

&lt;p&gt;If the router cannot forward pxe requests or you don’t have the permissions to do so, you can run a local dhcpd and connect to the target machines through a second network interface (the first one will be used to connect to Internet to download the installation files).&lt;/p&gt;

&lt;p&gt;Let’s imagine wlan0 and eth0 are the wireless and wired interfaces of a laptop, the first one is connected to Internet and the second one to other machines through a switch/router or directly. The first step on this scenario is to allow wlan0 to act as a bridge between the target computers and Internet:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
&lt;/pre&gt;

&lt;p&gt;And assign a local ip to the wired interface (eth0):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ while :; do sudo ifconfig eth0 10.99.88.1; sleep 3; done
&lt;/pre&gt;

&lt;p&gt;NOTE: In systems governed by &lt;a href=&quot;https://wiki.gnome.org/Projects/NetworkManager&quot;&gt;NetworkManager&lt;/a&gt; it’s better to use its infrastructure or disable it completely before running the above command.&lt;/p&gt;

&lt;p&gt;Finally, the dhcp and tftp daemons can be launched:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd pxe_setup &amp;amp;&amp;amp; sudo python ./simple-dhcpd -i eth0 -a 10.99.88.1
$ cd pxe_setup &amp;amp;&amp;amp; sudo python ./simple-tftpd
&lt;/pre&gt;

&lt;p&gt;Upon booting the target machines will print a menu asking for a which system to install (ubuntu or fedora), sweet n_n/&lt;/p&gt;

&lt;h2 id=&quot;extra-hands-free&quot;&gt;extra, hands-free&lt;/h2&gt;

&lt;p&gt;Most popular distributions support completely automated installations through preseed, kickstart, etc. This setup is no exception, it’s been configured to provide a hands-free installation for Ubuntu. The preseed file used can be retrieved at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://people.ubuntu.com/~javier-lopez/conf/preseed/minimal.preseed&quot;&gt;http://people.ubuntu.com/~javier-lopez/conf/preseed/minimal.preseed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It supports two extra boot parameters:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;proxy=http://url&lt;/strong&gt;, for using a proxy who doesn’t break the installation process&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user=joe&lt;/strong&gt;, for setting a default user (admin by default)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;uninstallation&quot;&gt;uninstallation&lt;/h2&gt;

&lt;p&gt;When the installation process ends, the pxe environmente can be easily removed with:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ rm -rf pxe_setup
&lt;/pre&gt;

&lt;p&gt;Simple! 😏&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea&lt;/strong&gt;: Create a vm with 2 network interfaces, the first one in &lt;em&gt;bridge&lt;/em&gt; mode assigned to wlan0, and the second one in &lt;em&gt;bridge&lt;/em&gt; / &lt;em&gt;internal network&lt;/em&gt; assigned to eth0, configure this setup and take an snapshot for an instant pxe installer experience.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/psychomario/PyPXE&quot;&gt;https://github.com/psychomario/PyPXE&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/en/2010/12/14/share-connection-between-personal-computers.html&quot;&gt;/blog/en/2010/12/14/share-connection-between-personal-computers.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>shundle</title>
   <link href="https://javier.io/blog/en/2013/11/15/shundle.html"/>
   <published>2013-11-15T00:00:00+00:00</published>
   <updated>2013-11-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/11/15/shundle</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">shundle</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/11/15/shundle.html">&lt;h2 id=&quot;shundle&quot;&gt;shundle&lt;/h2&gt;

&lt;h6 id=&quot;15-nov-2013&quot;&gt;15 Nov 2013&lt;/h6&gt;

&lt;!--&lt;iframe src=&quot;http://showterm.io/64f9418e5bc5320d39d40&quot; width=&quot;640&quot; height=&quot;350&quot; style=&quot;display:block; margin: 0 auto;&quot;&gt;&amp;nbsp;&lt;/iframe&gt; --&gt;
&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/260fe8f71ef23ccf3fd9e&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt; --&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/javier-lopez/shundle&quot;&gt;Shundle&lt;/a&gt; is a general sh plugin manager I wrote when I realized how messy my ~/.bashrc was getting. It also helped to learn more about how to write portable sh code. It’s not intend to be used by everyone, actually it could scare a lot of people =)&lt;/p&gt;

&lt;p&gt;However if you feel brave enough to test it, go ahead, it’s free software!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/shundle-2.gif&quot;&gt;&lt;img src=&quot;/assets/img/shundle-2.gif&quot; alt=&quot;shundle 2&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’ve created few plugins around it; &lt;a href=&quot;https://github.com/javier-lopez/shundle-plugins/tree/master/colorize&quot;&gt;colorize&lt;/a&gt;, &lt;a href=&quot;https://github.com/javier-lopez/shundle-plugins/tree/master/aliazator&quot;&gt;aliazator&lt;/a&gt;, &lt;a href=&quot;https://github.com/javier-lopez/shundle-plugins/tree/master/eternalize&quot;&gt;eternalize&lt;/a&gt;, the idea is that shundle loads/unloads as many as the user wishes, righ now it adds 0m0.110 seconds with all the plugins enabled and 0m0.048s without any to the average bash startup time (working in getting more shells supported). Note: I tested it in a dual core cpu.&lt;/p&gt;

&lt;p&gt;Plugins are enabled by placing a &lt;strong&gt;Bundle=&lt;/strong&gt; directive in the shell profile file (~/.bashrc in bash), eg. enabling eternalize:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
Bundle=&apos;javier-lopez/shundle-plugins/aliazator.git&apos;
&lt;/pre&gt;

&lt;p&gt;After doing it, shundle requires to be downloaded:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ git clone --depth=1 https://github.com/javier-lopez/shundle ~/.shundle/bundle/shundle
&lt;/pre&gt;

&lt;p&gt;Then, shundle will setup everything else, (a new tab will require to be open, or the shell profile requires to be sourced):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ . ~/.bashrc #source your .zshrc or the shell initialization file you use
$ shundle install
&lt;/pre&gt;

&lt;p&gt;Shundle will install the desired plugins and after reloading the session (or openning another tab) a new theme with several commands will be available (aliazator, eternalize, etc). How is different to downloading scripts and placing them in /usr/local/bin or in $PATH?, well, the idea is that eventually only the shell profile file gets tracked to replicate an unique (cli) environment anywhere.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>creating launchpad group maps - motu</title>
   <link href="https://javier.io/blog/en/2013/11/14/creating-launchpad-group-maps.html"/>
   <published>2013-11-14T00:00:00+00:00</published>
   <updated>2013-11-14T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/11/14/creating-launchpad-group-maps</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">creating launchpad group maps - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/11/14/creating-launchpad-group-maps.html">&lt;h2 id=&quot;creating-launchpad-group-maps---motu&quot;&gt;creating launchpad group maps - motu&lt;/h2&gt;

&lt;h6 id=&quot;14-nov-2013&quot;&gt;14 Nov 2013&lt;/h6&gt;

&lt;p&gt;I’m part of a &lt;a href=&quot;https://launchpad.net/~ubuntumembers&quot;&gt;neat&lt;/a&gt; couple of &lt;a href=&quot;https://launchpad.net/~dholbach-huggers&quot;&gt;launchpad&lt;/a&gt; &lt;a href=&quot;https://launchpad.net/~ubuntu-mars&quot;&gt;groups&lt;/a&gt;, in the
past I’ve seen some contribution maps in open source projects, and I though it
would be cool to have some of those for lp groups. What follows is the process
for creating static (google) maps for your launchpad group.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20160421153042/http://people.ubuntu.com:80/~chilicuil/ubuntumembers-map.html&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-1.jpg&quot; alt=&quot;map&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’ll need a marker (those ubuntu icons in the map), the featured one
is in png 24px × 32px format&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Account&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A google account is required, data will be saved in a &lt;a href=&quot;http://www.google.com/drive/apps.html#fusiontables&quot;&gt;Fusion table&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Hosting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’ll need web hosting if you want your map going online, otherwise, this
process can be replicated locally (for taking screenshots?)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Map capabilities are possible due to launchpad supporting Time Zone through
its &lt;a href=&quot;https://help.launchpad.net/API/launchpadlib&quot;&gt;API&lt;/a&gt;, it’s not quite exact but it’s better that nothing (if you know
a better place from grabbing localization data please let me know).&lt;/p&gt;

&lt;p&gt;I first grab Time Zones from all current members of an specific lp group,
these TZ are sent to a google geocoder (using the great &lt;a href=&quot;http://code.google.com/p/geopy/&quot;&gt;geopy&lt;/a&gt; library)
and saved in a cvs file. The cvs file can then be uploaded to a Fusion table
and requested through javascript (to draw the marks). Hint: I first tried
running everything using only javascript but with large groups (&amp;gt;10 members)
the process took too much time.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
wget https://raw.githubusercontent.com/javier-lopez/learn/master/sh/tools/lp-g9n-team
sh lp-g9n-team your-lp-group #~ubuntumembers by default
&lt;/pre&gt;

&lt;p&gt;These two steps will create a file called &lt;strong&gt;lp-g9n-team.csv&lt;/strong&gt; containing the
name, city, latitude and longitude of all your lp group members. Now it can be
uploaded to google, go to &lt;a href=&quot;http://docs.google.com/&quot;&gt;docs.google.com&lt;/a&gt; and create a new FusionTable:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-3.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-3.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;New Fusion Table&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-4.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-4.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Export csv file&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-5.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-5.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Result&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fusion Tablets can draw by themselves maps using data from a column of your
data, however I couldn’t find a method to customize the marker art.&lt;/p&gt;

&lt;p&gt;For this to work, your dataset will need to be shared to everyone, by default
is private:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-6.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-6.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Select File-&amp;gt;Share&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-7.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-7.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Options in Spanish, select the higher one&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You’ll need to grab the unique ID (will be used in the javascript code):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-8.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-8.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;File-&amp;gt;About this table&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-9.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-creating-launchpad-group-maps-9.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Copy the ID&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Finally, once your data is online, you can grab this html code:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/chilicuil/7478478&quot;&gt;https://gist.github.com/chilicuil/7478478&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And change the default dataset &lt;strong&gt;1zq9pJyRjZB1FqOcqDhd8lKgCFov6VEDdag4tigQ&lt;/strong&gt;
for your own.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2013/11/14/launchpad-maps/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>public cloud services (digitalocean, aws) and vagrant</title>
   <link href="https://javier.io/blog/en/2013/11/07/public-cloud-services-and-vagrant.html"/>
   <published>2013-11-07T00:00:00+00:00</published>
   <updated>2013-11-07T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/11/07/public-cloud-services-and-vagrant</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="aws"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">public cloud services (digitalocean, aws) and vagrant</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/11/07/public-cloud-services-and-vagrant.html">&lt;h2 id=&quot;public-cloud-services-digitalocean-aws-and-vagrant&quot;&gt;public cloud services (digitalocean, aws) and vagrant&lt;/h2&gt;

&lt;h6 id=&quot;07-nov-2013&quot;&gt;07 Nov 2013&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/86.png&quot;&gt;&lt;img src=&quot;/assets/img/86.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/ce9681926ec6875d743f1&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt;--&gt;&lt;/p&gt;

&lt;p&gt;I like to keep a fast, ordered and stable computer, that’s why I use virtual machines, containers, public cloud services and other means to keep it that way, all my ram belongs to firefox 😅&lt;/p&gt;

&lt;p&gt;The cloud is great, I can do more with less because they usually have more resources than my laptop and plenty of bandwidth 😍. My favorite elastic cloud is &lt;a href=&quot;http://digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt; ($5/month), sometime ago also tried &lt;a href=&quot;http://aws.amazon.com/ec2/&quot;&gt;Ec2&lt;/a&gt; but its pricing scheme made me uncomfortable. Other than that, I also use &lt;a href=&quot;http://lowendbox.com/&quot;&gt;Low End Boxes&lt;/a&gt; (LEB) when running long term tasks, it’s amazing how far you can go with a $20/year box.&lt;/p&gt;

&lt;p&gt;So, getting back to the main topic, it turns out than through plugins, &lt;a href=&quot;http://www.vagrantup.com/&quot;&gt;vagrant&lt;/a&gt; is able to launch and provision to remote machines, that’s what I’m using to interact with cloud instances.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ vagrant up --provider=digital_ocean
$ vagrant up --provider=aws
&lt;/pre&gt;

&lt;p&gt;It’s not perfect, vagrant takes ages just to print a help screen, but I think I can manage to use it till I find something better, recommendations are welcome.&lt;/p&gt;

&lt;h2 id=&quot;vagrant&quot;&gt;Vagrant&lt;/h2&gt;

&lt;p&gt;Vagrant installation process is a breeze, it supports OSX, Windows and Linux, in some Linux distributions it’s even included in official repositories, but such versions are commonly out of date, that’s the case with Ubuntu, so it’s better to download Vagrant from its site.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20150204130848/http://downloads.vagrantup.com/&quot;&gt;https://web.archive.org/web/20150204130848/http://downloads.vagrantup.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo dpkg -i vagrant_version.deb
$ #vagrant will be installed in /opt/vagrant/
&lt;/pre&gt;

&lt;h3 id=&quot;vagrant-digitalocean&quot;&gt;Vagrant-digitalocean&lt;/h3&gt;

&lt;p&gt;Once vagrant is onboard, it can be used to download plugins.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ vagrant plugin install vagrant-digitalocean
&lt;/pre&gt;

&lt;h3 id=&quot;vagrant-aws&quot;&gt;Vagrant-aws&lt;/h3&gt;

&lt;p&gt;The vagrant-aws plugin is somekind troublesome, even when its documentation doesn’t &lt;a href=&quot;https://github.com/mitchellh/vagrant-aws/issues/163&quot;&gt;mention it&lt;/a&gt;, it requires some dependencies:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install build-essential libxslt-dev libxml2-dev zlib1g-dev
&lt;/pre&gt;

&lt;p&gt;The plugin installation isn’t that bad:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ vagrant plugin install vagrant-aws
&lt;/pre&gt;

&lt;p&gt;To play well with aws, you’ll need to create a new &lt;a href=&quot;https://github.com/mitchellh/vagrant-aws/issues/95&quot;&gt;default security group&lt;/a&gt; that allows inbound connections through port 22, it’s dump considering the plugin can deploy new instances but it doesn’t upload a valid security group afterwards. Don’t forget to upload your public ssh key too.&lt;/p&gt;

&lt;h3 id=&quot;vagrantfile&quot;&gt;Vagrantfile&lt;/h3&gt;

&lt;p&gt;Finally, the additional providers can be used in Vagrantfile files:&lt;/p&gt;

&lt;pre&gt;
VAGRANT_API_VERSION = &quot;2&quot;

Vagrant.configure(VAGRANT_API_VERSION) do |config|

  config.vm.provider :digital_ocean do |provider, override|
    override.ssh.private_key_path = &apos;~/.ssh/id_rsa&apos;
    override.ssh.username = &apos;admin&apos;
    override.vm.box = &apos;digital_ocean&apos;
    override.vm.box_url = &quot;https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box&quot;
    override.vm.provision &quot;shell&quot;, inline: &quot;su - #{override.ssh.username} -c \&quot;sh &amp;lt;(wget -qO- javier.io/s)\&quot;&quot;

    provider.image = &apos;ubuntu-12-04-x64&apos;
    provider.region = &apos;nyc2&apos;
    #provider.size = &apos;16gb&apos;
    #provider.size = &apos;8gb&apos;
    #provider.size = &apos;4gb&apos;
    #provider.size = &apos;2gb&apos;
    #provider.size = &apos;1gb&apos;
    provider.size = &apos;512mb&apos;
    provider.private_networking = &apos;false&apos;
    provider.setup = &apos;true&apos;
    provider.token = &apos;ACCESS_KEY_SECRET&apos;
    provider.ca_path = &apos;/etc/ssl/certs/ca-certificates.crt&apos;
  end

  config.vm.provider :aws do |provider, override|
    #depends on: &apos;build-essential libxslt-dev libxml2-dev zlib1g-dev&apos; on ubuntu
    #requires a custom security group to allow input connections to port 22

    override.ssh.private_key_path = &quot;~/.ssh/id_rsa&quot;
    override.ssh.username = &quot;ubuntu&quot;
    override.vm.box = &apos;dummy&apos;
    override.vm.box_url = &quot;https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box&quot;
    override.vm.provision &quot;shell&quot;, inline: &quot;su - #{override.ssh.username} -c \&quot;sh &amp;lt;(wget -qO- javier.io/s)\&quot;&quot;

    provider.access_key_id = &quot;ACCESS_KEY_SECRET&quot;
    provider.secret_access_key = &quot;ACCESS_KEY_SECRET&quot;
    provider.ami = &quot;ami-a73264ce&quot;
    provider.instance_type = &quot;t1.micro&quot;
    provider.keypair_name = &quot;id_rsa&quot;
  end
end

# vi:ft=ruby:
&lt;/pre&gt;

&lt;p&gt;And used with vagrant to launch empty remote boxes:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ vagrant up --provider=digital &amp;amp;&amp;amp; vagrant ssh
$ vagrant up --provider=aws     &amp;amp;&amp;amp; vagrant ssh
&lt;/pre&gt;

&lt;p&gt;Don’t forget to destroy the instances to avoid extra charges.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ vagrant destroy
&lt;/pre&gt;

&lt;p&gt;That’s it, how do you launch remote environments?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>upgrade to bash-completion &gt;= 2.0</title>
   <link href="https://javier.io/blog/en/2013/10/16/upgrade-to-bash-completion-2-0.html"/>
   <published>2013-10-16T00:00:00+00:00</published>
   <updated>2013-10-16T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/10/16/upgrade-to-bash-completion-2-0</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">upgrade to bash-completion &amp;gt;= 2.0</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/10/16/upgrade-to-bash-completion-2-0.html">&lt;h2 id=&quot;upgrade-to-bash-completion--20&quot;&gt;upgrade to bash-completion &amp;gt;= 2.0&lt;/h2&gt;

&lt;h6 id=&quot;16-oct-2013&quot;&gt;16 Oct 2013&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;http://bash-completion.alioth.debian.org/&quot;&gt;bash-completion&lt;/a&gt; is the package responsible for autocompletion in the
Ubuntu cli (by default), whenever you write:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get [TAB][TAB] #or any other cli app
&lt;/pre&gt;

&lt;p&gt;A script on /usr/share/bash-completion/ is executed which list the options you
have.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get
autoclean build-dep check dist-upgrade dselect-upgrade purge source
upgrade autoremove changelog clean download install remove update
&lt;/pre&gt;

&lt;p&gt;This is plain awesome, however it has the drawback that it requires to read
many of these same files at the beginning of your shell session (every time
you open a new terminal, gnome-terminal) which may take time (2 seconds on my
current machine, core duo, 4gb of ram). A new version of bash-completion has
been on the air for some time, the 2.0 version loads a &lt;strong&gt;lot faster&lt;/strong&gt; (3x on
my own machine).&lt;/p&gt;

&lt;p&gt;On ubuntu bash-completion &amp;gt;= 2.0 is provided in the following releases:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
bash-completion | 1:2.0-1ubuntu2 | quantal | source, all
bash-completion | 1:2.0-1ubuntu3 | raring | source, all
bash-completion | 1:2.0-1ubuntu3 | saucy | source, all
&lt;/pre&gt;

&lt;p&gt;So if you’re running Quantal|Raring|Saucy you’re covered, if you’re not (for
example if you’re running the Ubuntu Precise release) you can do it easily.&lt;/p&gt;

&lt;p&gt;1.- Download the &lt;a href=&quot;http://mirrors.us.kernel.org/ubuntu//pool/main/b/bash-completion/bash-completion_2.0-1ubuntu3_all.deb&quot;&gt;bash-completion&lt;/a&gt;package&lt;/p&gt;

&lt;p&gt;2.- Install it&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo dpkg -i bash-completion*.deb
&lt;/pre&gt;

&lt;p&gt;3.- Enjoy&lt;/p&gt;

&lt;p&gt;The package has no dependencies, so it’s a drop and replace action. Thanks to
the bash-completion team for the great optimization work =D!&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2013/10/16/upgrade-to-bash-completion-2-0/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>report bugs to debian from ubuntu</title>
   <link href="https://javier.io/blog/en/2013/09/28/report-debian-bugs-within-ubuntu.html"/>
   <published>2013-09-28T00:00:00+00:00</published>
   <updated>2013-09-28T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/09/28/report-debian-bugs-within-ubuntu</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">report bugs to debian from ubuntu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/09/28/report-debian-bugs-within-ubuntu.html">&lt;h2 id=&quot;report-bugs-to-debian-from-ubuntu&quot;&gt;report bugs to debian from ubuntu&lt;/h2&gt;

&lt;h6 id=&quot;28-sep-2013&quot;&gt;28 Sep 2013&lt;/h6&gt;

&lt;!--**[![](/assets/img/79.png)](/assets/img/79.png)**--&gt;

&lt;p&gt;I’m a normal computer user, I don’t run local mail servers and I don’t have the intention to do so, I have my email account with gmail and I review it using a web browser or &lt;a href=&quot;http://www.mutt.org/&quot;&gt;mutt&lt;/a&gt; when I’m in my own computer. This can be troublesome if you pretend to report bugs to &lt;a href=&quot;https://www.debian.org/&quot;&gt;debian&lt;/a&gt; using its &lt;a href=&quot;https://www.debian.org/Bugs/&quot;&gt;bug tracker system&lt;/a&gt; an antique system based in emails.&lt;/p&gt;

&lt;p&gt;To report a bug from within Ubuntu, people are suppose to type:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ reportbug -B debian package
&lt;/pre&gt;

&lt;p&gt;However it won’t work because it won’t find a local mail server (and it would let you know after you spend 15-20 min, smart programming 😒) After spending more precious time on Internet, you’ll find out it actually can be configured to use an external smtp server (I’ve read somewhere Debian devs are interested in upgrade BTS, and probably they will re-invent the wheel in the process because of course there are not enought bug trackers online)…&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ reportbug --configure
&lt;/pre&gt;

&lt;p&gt;And you’ll need to input the following data:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;smtp.gmail.com:587&lt;/li&gt;
  &lt;li&gt;user@gmail.com&lt;/li&gt;
  &lt;li&gt;check tls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After done it a new &lt;strong&gt;$HOME/.reportbugrc&lt;/strong&gt; file will be created and the original command would work.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ reportbug -B debian package
&lt;/pre&gt;

&lt;h3 id=&quot;extra&quot;&gt;extra&lt;/h3&gt;

&lt;p&gt;If your report contain patches, and after configuring &lt;strong&gt;reportbug&lt;/strong&gt; it may be a good idea to use &lt;strong&gt;submittodebian&lt;/strong&gt; instead:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It adds ubuntu specific &lt;a href=&quot;https://wiki.ubuntu.com/Debian/Usertagging&quot;&gt;tags&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Allow patch editing before sending the report (to remove Ubuntu changes)&lt;/li&gt;
  &lt;li&gt;Use internally reportbug to send messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;submittodebian&lt;/strong&gt; only works when you’ve &lt;em&gt;.orig, .diff, .changes&lt;/em&gt; files, these files are generated by &lt;a href=&quot;http://man.he.net/man1/debuild&quot;&gt;debuild&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;examples&quot;&gt;examples&lt;/h3&gt;

&lt;h4 id=&quot;apt-get-source-traditional&quot;&gt;apt-get source (traditional)&lt;/h4&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ apt-get source xicc
$ cd cd xicc-0.2/
$ sed -i &apos;s/colour/color/g&apos; debian/control
$ dch -i &apos;debian/control: replaced &quot;colour&quot; with &quot;color&quot;.&apos;
$ debuild -S
$ submittodebian
&lt;/pre&gt;

&lt;h4 id=&quot;bzr-modern&quot;&gt;bzr (modern)&lt;/h4&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr branch lp:ubuntu/xicc
$ cd xicc
$ sed -i &apos;s/colour/color/g&apos; debian/control
$ dch -i &apos;debian/control: replaced &quot;colour&quot; with &quot;color&quot;.&apos;
$ bzr commit -m &apos;replaced &quot;colour&quot; with &quot;color&quot;.&apos;
$ bzr bd -- -S
$ submittodebian
&lt;/pre&gt;

&lt;p&gt;References&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.debian.org/Bugs/Reporting&quot;&gt;http://www.debian.org/Bugs/Reporting&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Debian/Bugs&quot;&gt;https://wiki.ubuntu.com/Debian/Bugs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>pbuilder tips</title>
   <link href="https://javier.io/blog/en/2013/09/27/pbuilder-tips.html"/>
   <published>2013-09-27T00:00:00+00:00</published>
   <updated>2013-09-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/09/27/pbuilder-tips</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">pbuilder tips</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/09/27/pbuilder-tips.html">&lt;h2 id=&quot;pbuilder-tips&quot;&gt;pbuilder tips&lt;/h2&gt;

&lt;h6 id=&quot;27-sep-2013&quot;&gt;27 Sep 2013&lt;/h6&gt;

&lt;p&gt;I’ll write down some tips useful when dealting with pbuilder in Ubuntu, pbuilder is a builder for testing the creation of .deb packages from .dsc sources, however I often use it as a light replacement for full virtual machines.&lt;/p&gt;

&lt;h2 id=&quot;e-release-signed-by-unknown-key-key-id-8b48ad6246925553&quot;&gt;E: Release signed by unknown key (key id 8B48AD6246925553)&lt;/h2&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
I: Distribution is sid.
I: Building the build environment
I: running debootstrap
/usr/sbin/debootstrap
I: Retrieving Release
I: Retrieving Release.gpg
I: Checking Release signature
E: Release signed by unknown key (key id 8B48AD6246925553)
&lt;/pre&gt;

&lt;p&gt;This messages indicates debootstrap has not been able to verify than &lt;strong&gt;8B48AD6246925553&lt;/strong&gt; is a valid key, by default pbuilder in Ubuntu reads &lt;strong&gt;/usr/share/keyrings/ubuntu-archive-keyring.gpg&lt;/strong&gt;. This key is defined at: &lt;strong&gt;/usr/share/pbuilder/pbuilderrc&lt;/strong&gt;. It sounds logic than a Debian key is not valid in an Ubuntu setup, however sometimes it’s useful to test a package against Debian without installing a full Debian environment.&lt;/p&gt;

&lt;p&gt;This problem can be solved by adding the Debian key to the Ubuntu keys:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo gpg --no-default-keyring --keyring /usr/share/keyrings/ubuntu-archive-keyring.gpg --recv-keys 8B48AD6246925553
$ sudo DIST=sid ARCH=amd64 pbuilder create
&lt;/pre&gt;

&lt;p&gt;Or adding it to other ring and use it temporally:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --recv-keys 8B48AD6246925553
$ tail $HOME/.pbuilderrc
DEBOOTSTRAPOPTS=(
 &apos;--variant=buildd&apos;
 &apos;--keyring&apos; &apos;/etc/apt/trusted.gpg&apos;
)
$ sudo DIST=sid ARCH=amd64 pbuilder create
&lt;/pre&gt;

&lt;p&gt;If you don’t want to mess with &lt;strong&gt;~/.pbuilderrc&lt;/strong&gt; the parameter can also be set from the prompt command:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo DIST=sid ARCH=amd64 pbuilder create --debootstrapopts --keyring=/etc/apt/trusted.gpg
&lt;/pre&gt;

&lt;h2 id=&quot;run-x-apps&quot;&gt;Run X apps&lt;/h2&gt;

&lt;p&gt;Pbuilder is a nothing but a chroot + debian enchantments, you can run virtually anything, from audio/video, to cli/gui applications, etc. Running a X app is a two step process:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ xhost + #in the host environment
&lt;/pre&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
[chroot] $ export DISPLAY=:0.0
[chroot] $ app
&lt;/pre&gt;

&lt;h2 id=&quot;run-i18n-apps&quot;&gt;Run i18n apps&lt;/h2&gt;

&lt;p&gt;Running apps in other languages requires to download extra language packages and modify the LC_ALL variable:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
[chroot] $ apt-get install language-pack-es #interchange -es for the 2 letters of your own lang
[chroot] $ LC_ALL=es_ES.utf-8 app
&lt;/pre&gt;

&lt;h2 id=&quot;run-multimedia-apps&quot;&gt;Run multimedia apps&lt;/h2&gt;

&lt;p&gt;To run multimedia applications besides enabling X, you’ll need to mount &lt;strong&gt;/proc&lt;/strong&gt; and &lt;strong&gt;/dev&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ printf &quot;%s\\n&quot; &apos;BINDMOUNTS=&quot;${BINDMOUNTS} /dev /proc&apos; &amp;gt;&amp;gt; ~/.pbuilderrc
$ pbuilder login
&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>openfile and samba trash support</title>
   <link href="https://javier.io/blog/en/2013/09/23/openfiler-samba-trash.html"/>
   <published>2013-09-23T00:00:00+00:00</published>
   <updated>2013-09-23T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/09/23/openfiler-samba-trash</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="networking"/>
   
   
   
   <summary type="html">openfile and samba trash support</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/09/23/openfiler-samba-trash.html">&lt;h2 id=&quot;openfile-and-samba-trash-support&quot;&gt;openfile and samba trash support&lt;/h2&gt;

&lt;h6 id=&quot;23-sep-2013&quot;&gt;23 Sep 2013&lt;/h6&gt;

&lt;p&gt;Sometimes it can useful to have trash support in samba/cifs. Sadly it’s not straighforward to do in &lt;a href=&quot;http://www.openfiler.com/&quot;&gt;openfiler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/opt/openfiler/var/www/includes/generate.inc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In an average samba installation preferences are saved in &lt;strong&gt;/etc/samba/smb.conf&lt;/strong&gt;, in openfiler however this and many other files are constantely rebuild, so this changes won’t last if you apply them there. Modify &lt;strong&gt;/opt/openfiler/var/www/includes/generate.inc&lt;/strong&gt; instead:&lt;/p&gt;

&lt;p&gt;1588 line:&lt;/p&gt;

&lt;pre&gt;
/* enable trash support */
$ac_smb_fp-&amp;gt;AddLine( &quot;\n&quot;);
$ac_smb_fp-&amp;gt;AddLine( &quot; ; enable trash support&quot;);
$ac_smb_fp-&amp;gt;AddLine( &quot; vfs objects = audit recycle&quot; );
$ac_smb_fp-&amp;gt;AddLine( &quot; recycle: repository = /path/.trash&quot; );
$ac_smb_fp-&amp;gt;AddLine( &quot; recycle: keeptree = Yes&quot; );
$ac_smb_fp-&amp;gt;AddLine( &quot; recycle: exclude = *.tmp, *.temp, *.log, *.ldb&quot; );
$ac_smb_fp-&amp;gt;AddLine( &quot; recycle: exclude_dir = tmp &quot; );
$ac_smb_fp-&amp;gt;AddLine( &quot; recycle: versions = Yes &quot; );
$ac_smb_fp-&amp;gt;AddLine( &quot; recycle: noversions = *.docx|*.doc|*.xls|*xlsx|*.ppt|*.odt&quot; );
$ac_smb_fp-&amp;gt;AddLine( &quot;\n&quot;);
&lt;/pre&gt;

&lt;p&gt;It may be a good idea to delete oldest files every now and then:&lt;/p&gt;

&lt;pre&gt;
0 6 * * * root find /path/.trash -type f -mtime +14 -delete &amp;gt; /dev/null
&lt;/pre&gt;

&lt;p&gt;Happy trashing 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>you cannot organizate an ugj if you’re not part of a loco team</title>
   <link href="https://javier.io/blog/en/2013/09/03/you-cannot-organizate-an-ugj-if-youre-not-part-of-a-loco-team.html"/>
   <published>2013-09-03T00:00:00+00:00</published>
   <updated>2013-09-03T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/09/03/you-cannot-organizate-an-ugj-if-youre-not-part-of-a-loco-team</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">you cannot organizate an ugj if you’re not part of a loco team</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/09/03/you-cannot-organizate-an-ugj-if-youre-not-part-of-a-loco-team.html">&lt;h2 id=&quot;you-cannot-organizate-an-ugj-if-youre-not-part-of-a-loco-team&quot;&gt;you cannot organizate an ugj if you’re not part of a loco team&lt;/h2&gt;

&lt;h6 id=&quot;03-sep-2013&quot;&gt;03 Sep 2013&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-you-cannot-organizate-an-ugj-if-youre-not-part-of-a-loco-team-1.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-you-cannot-organizate-an-ugj-if-youre-not-part-of-a-loco-team-1.jpg&quot; alt=&quot;jam&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Ubuntu Global Jam&lt;/strong&gt; is an incredible opportunity for the Ubuntu
community to unite together around a weekend generally one month before the
release of Ubuntu. However if you’re not part of any ubuntu LoCo team for any
reason (I know there are several of you reading) you won’t be able to organize
them.&lt;/p&gt;

&lt;p&gt;Personally I think any person being or not part of any LoCo Team should be
able to announce where he/she is gonna sit down and hack on ubuntu =), however
in the meantime, you can look at the current list and assist to one near from
you, or just hangout with your local friends. &lt;strong&gt;Ubuntu is a state of mind&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/events/global/2315/&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-you-cannot-organizate-an-ugj-if-youre-not-part-of-a-loco-team-3.jpg&quot; alt=&quot;map&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2013/09/03/you-cannot-organizate-an-ugj-if-youre-not-part-of-a-loco-team/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>active extensions in firefox nightly</title>
   <link href="https://javier.io/blog/en/2013/07/31/activate-extensions-in-firefox-nightly.html"/>
   <published>2013-07-31T00:00:00+00:00</published>
   <updated>2013-07-31T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/07/31/activate-extensions-in-firefox-nightly</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">active extensions in firefox nightly</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/07/31/activate-extensions-in-firefox-nightly.html">&lt;h2 id=&quot;active-extensions-in-firefox-nightly&quot;&gt;active extensions in firefox nightly&lt;/h2&gt;

&lt;h6 id=&quot;31-jul-2013&quot;&gt;31 Jul 2013&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/78.jpg&quot;&gt;&lt;img src=&quot;/assets/img/78.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Firefox nightly is the firefox version who is compiled every night. By default it will avoid loading any extension, however this behaviour can be override, to do so add the variable &lt;strong&gt;extensions.checkCompatibility.nightly&lt;/strong&gt; to its configuration:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Open ‘about:config’&lt;/li&gt;
  &lt;li&gt;Write &lt;strong&gt;extensions.checkCompatibility.nightly&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Select ‘New -&amp;gt; Boolean’&lt;/li&gt;
  &lt;li&gt;Write &lt;strong&gt;extensions.checkCompatibility.nightly&lt;/strong&gt; again in “New value”&lt;/li&gt;
  &lt;li&gt;Select ‘false’ as the predefined state&lt;/li&gt;
  &lt;li&gt;Reboot firefox&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From now on &lt;strong&gt;‘about:plugins’&lt;/strong&gt; will be available as usual. This procedure is also available as a plugin in the &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/checkcompatibility/&quot;&gt;Disable Compatibility Checks Add-on&lt;/a&gt; it works in all Firefox releases, nightly and stable ones.&lt;/p&gt;

&lt;p&gt;Happy browsing 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://nightly.mozilla.org/&quot;&gt;Firefox nightly&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://kb.mozillazine.org/Extensions.checkCompatibility&quot;&gt;Extensions.checkCompatibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>logstash + redis + elasticsearch + kibana3</title>
   <link href="https://javier.io/blog/en/2013/07/23/logstash-redis-elasticsearch-kibana.html"/>
   <published>2013-07-23T00:00:00+00:00</published>
   <updated>2013-07-23T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/07/23/logstash-redis-elasticsearch-kibana</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">logstash + redis + elasticsearch + kibana3</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/07/23/logstash-redis-elasticsearch-kibana.html">&lt;h2 id=&quot;logstash--redis--elasticsearch--kibana3&quot;&gt;logstash + redis + elasticsearch + kibana3&lt;/h2&gt;

&lt;h6 id=&quot;23-jul-2013&quot;&gt;23 Jul 2013&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/76.jpg&quot;&gt;&lt;img src=&quot;/assets/img/76.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://logstash.net/&quot;&gt;logstash&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://redis.io/&quot;&gt;redis&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://elasticsearch.org/&quot;&gt;elasticsearch&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20260518021107/http://three.kibana.org/&quot;&gt;kibana3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://caspian.dotconf.net/menu/Software/SendEmail/&quot;&gt;sendemail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Unix_philosophy&quot;&gt;Composition&lt;/a&gt; applied to logging has been a great sucess lately, this week I’ve verified how easy is to use logstash and friends with 48 servers distributed in two datacenters, I’ve created a script to deploy all programs in a single node.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bash &amp;lt;(wget -qO- https://raw.github.com/javier-lopez/learn/master/sh/is/log-stack)
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/77.jpg&quot;&gt;&lt;img src=&quot;/assets/img/77.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you prefer using a node per service you’ll need to go your own way, it shouldn’t be too difficult.&lt;/p&gt;

&lt;p&gt;##Extra, patterns&lt;/p&gt;

&lt;p&gt;To send emails when a pattern is found, I used the grep and file logstash filters:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo service logstash-shipper stop
$ sudo vi /home/logstash/shipper.conf
$ sudo service logstash-shipper start
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;/home/logstash/shipper.conf&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
filter {
  grep {
    type =&amp;gt; &quot;syslog&quot;
    match =&amp;gt; [&quot;@message&quot;,&quot;pattern&quot;]
    add_tag =&amp;gt; &quot;Alert_flood&quot;
    drop =&amp;gt; false
  }

output {
  file {
    type =&amp;gt; &quot;syslog&quot;
    tags =&amp;gt; [ &quot;Alert_flood&quot; ]
    message_format =&amp;gt; &quot;%{@message}&quot;
    path =&amp;gt; &quot;/tmp/logstash_alert&quot;
  }
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;WARNING:&lt;/strong&gt; shipper.conf doesn’t look exactly like this, these snippets must be integrated with your own files, copy and paste won’t work. If you’re not sure about the syntax, take a look at logstash &lt;a href=&quot;http://logstash.net/docs/1.1.13/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, after rebooting the service logstash will add an “Alert_flood” tag to all messages where the pattern is found and will copy these messages (besides sending them to redis) to &lt;strong&gt;/tmp/logstash_alert&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Finally I wrote a &lt;a href=&quot;https://gist.github.com/javier-lopez/6066888&quot;&gt;script&lt;/a&gt; to send warning messages by email to the admins:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo crontab -l
*/1 * * * * /usr/local/bin/check_alerts_logstash.sh
&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20140512201521/http://cleversoft.wordpress.com:80/2013/04/05/887/&quot;&gt;https://web.archive.org/web/20140512201521/http://cleversoft.wordpress.com:80/2013/04/05/887/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>ubuntu.com in your language</title>
   <link href="https://javier.io/blog/en/2013/07/12/ubuntu-com-in-your-language.html"/>
   <published>2013-07-12T00:00:00+00:00</published>
   <updated>2013-07-12T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/07/12/ubuntu-com-in-your-language</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">ubuntu.com in your language</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/07/12/ubuntu-com-in-your-language.html">&lt;h2 id=&quot;ubuntucom-in-your-language&quot;&gt;ubuntu.com in your language&lt;/h2&gt;

&lt;h6 id=&quot;12-jul-2013&quot;&gt;12 Jul 2013&lt;/h6&gt;

&lt;p&gt;When an average user opens &lt;a href=&quot;https://ubuntu.com/&quot;&gt;ubuntu.com&lt;/a&gt; chances are that it belong to the
&lt;strong&gt;73%&lt;/strong&gt; of users who don’t browse Internet in English:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-ubuntu-com-in-your-language-1.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-ubuntu-com-in-your-language-1.png&quot; alt=&quot;lang&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the other hand Ubuntu is a free OS which has always embraced l10n efforts:&lt;/p&gt;

&lt;p&gt;[+] &lt;a href=&quot;https://web.archive.org/web/20230909103416/http://people.ubuntu.com/~dpm/ubuntu-10.04-translation-stats.html&quot;&gt;http://people.ubuntu.com/~dpm/ubuntu-10.04-translation-stats.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ubuntu has been translated to at least 218 languages including developer
documentation!:&lt;/p&gt;

&lt;p&gt;[+] &lt;a href=&quot;https://web.archive.org/web/20131023072534/http://developer.ubuntu.com:80/resources/tools/packaging/&quot;&gt;https://web.archive.org/web/20131023072534/http://developer.ubuntu.com:80/resources/tools/packaging/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ubuntu developer guide has been translated to English, Spanish, Russian
and Portuguese. We have a complete OS and it’s documentation translated to
many different languages but not &lt;strong&gt;its public face&lt;/strong&gt; to the world, is this
crazy?, or I’ve just lost common sense?&lt;/p&gt;

&lt;p&gt;I imagine that In a perfect world the ubuntu.com site would look at the user
browser agent and display a localized version of itself, the strings would be
exported and translated in launchpad by the numerous community translators…,
how do you imagine it could be done?, do you think it is worth the effort?&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2013/07/12/ubuntu-com-in-your-language/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>talks: ubuntu testing classroom</title>
   <link href="https://javier.io/blog/en/2013/06/28/talks-ubuntu-testing-classroom.html"/>
   <published>2013-06-28T00:00:00+00:00</published>
   <updated>2013-06-28T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/06/28/talks-ubuntu-testing-classroom</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="talks"/>
   
   <category term="ubuntu"/>
   
   
   
   <summary type="html">talks: ubuntu testing classroom</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/06/28/talks-ubuntu-testing-classroom.html">&lt;h2 id=&quot;talks-ubuntu-testing-classroom&quot;&gt;talks: ubuntu testing classroom&lt;/h2&gt;

&lt;h6 id=&quot;28-jun-2013&quot;&gt;28 Jun 2013&lt;/h6&gt;

&lt;p&gt;I gave two sessions at the Ubuntu Testing Classroom
(&lt;a href=&quot;https://irc.com/?channel=%23ubuntu-classroom&quot;&gt;#ubuntu-classroom&lt;/a&gt;)
during the saucy cycle:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://people.ubuntu.com/~javier-lopez/talks/pbuilder/&quot;&gt;Ubuntu package testing with pbuilder&lt;/a&gt;&lt;/strong&gt;
— building and testing packages in pristine chroots
(&lt;a href=&quot;http://people.ubuntu.com/~javier-lopez/pdf/pbuilder.pdf&quot;&gt;pdf&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://people.ubuntu.com/~javier-lopez/talks/sru-updates/&quot;&gt;Verifying SRU updates&lt;/a&gt;&lt;/strong&gt;
— how to test proposed stable release updates so fixes actually reach
users
(&lt;a href=&quot;http://people.ubuntu.com/~javier-lopez/pdf/sru-updates.pdf&quot;&gt;pdf&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Classroom sessions happen over IRC: you paste, people ask, bots keep
order. A different kind of stage fright.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>lib bash</title>
   <link href="https://javier.io/blog/en/2013/06/18/bash-lib.html"/>
   <published>2013-06-18T00:00:00+00:00</published>
   <updated>2013-06-18T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/06/18/bash-lib</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   
   
   <summary type="html">lib bash</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/06/18/bash-lib.html">&lt;h2 id=&quot;lib-bash&quot;&gt;lib bash&lt;/h2&gt;

&lt;h6 id=&quot;18-jun-2013&quot;&gt;18 Jun 2013&lt;/h6&gt;

&lt;!--**![](/assets/img/75.png)**--&gt;

&lt;p&gt;I don’t consider myself a programmer but a sort of power user, I’m in love with the cli linux interface and everytime I can I automatizate repetive tasks. That’s how I ended writting &lt;a href=&quot;https://github.com/javier-lopez/learn/tree/master/sh&quot;&gt;60~ scripts&lt;/a&gt;, after a while I noticed a pattern, I used to copy and paste some parts of other scripts to finish faster so I started to write functions and put them in a lib file. After a while it has been increasing and I thought it would be a good idea to share it with others.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/lib&quot;&gt;sh/lib&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can improve current functions or add new ones you are welcome (just branch and push back), be aware that current code may hurt your eyes, you’ve been warned.&lt;/p&gt;

&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/43162198175c203d5a8f6&quot; width=&quot;640&quot; height=&quot;300&quot;&gt;&amp;nbsp;&lt;/iframe&gt;

&lt;p&gt;Have fun 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>proposal: askubuntu en español / askubuntu in spanish</title>
   <link href="https://javier.io/blog/es/2013/06/02/proposal-askubuntu-en-espanol-askubuntu-in-spanish.html"/>
   <published>2013-06-02T00:00:00+00:00</published>
   <updated>2013-06-02T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2013/06/02/proposal-askubuntu-en-espanol-askubuntu-in-spanish</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">proposal: askubuntu en español / askubuntu in spanish</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2013/06/02/proposal-askubuntu-en-espanol-askubuntu-in-spanish.html">&lt;h2 id=&quot;proposal-askubuntu-en-español--askubuntu-in-spanish&quot;&gt;proposal: askubuntu en español / askubuntu in spanish&lt;/h2&gt;

&lt;h6 id=&quot;02-jun-2013&quot;&gt;02 Jun 2013&lt;/h6&gt;

&lt;p&gt;Últimamente se ha estado discutiendo la posibilidad de agregar
internacionalización en los sistemas de Preguntas y Respuestas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/QandALocalization&quot;&gt;https://wiki.ubuntu.com/QandALocalization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algunos equipos locales, como Ubuntu Perú y Ubuntu Colombia, han ido más lejos
y han creado sus propios sitios:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20170301210026/http://ubuntu.shapado.com:80/&quot;&gt;https://web.archive.org/web/20170301210026/http://ubuntu.shapado.com:80/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://ayuda.ubuntu.pe&quot;&gt;http://ayuda.ubuntu.pe&lt;/a&gt; (liberado hoy mismo)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto, en mi opinión, solo contribuye a fragmentar aún más la información ya
dispersa en Español, lo que necesitamos es una versión de AskUbuntu en nuestro
idioma (y de paso, en los idiomas que sean necesarios):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://area51.stackexchange.com/proposals/56087/askubuntu-in-spanish&quot;&gt;http://area51.stackexchange.com/proposals/56087/askubuntu-in-spanish&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;¿Esta iniciativa tiene el apoyo oficial de Canonical?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, pero los foros y las comunidades locales tampoco lo tuvieron al inicio,
así que podemos obtenerlo durante la marcha.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo puedo ayudar?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para crear un sitio como AskUbuntu se necesitan seguir 5 pasos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Crear la propuesta, esto ya lo he hecho, la propuesta esta
en:&lt;a href=&quot;http://area51.stackexchange.com/proposals/56087/askubuntu-in-spanish/&quot;&gt;http://area51.stackexchange.com/proposals/56087/askubuntu-in-spanish/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Obtener suficientes preguntas y seguidores en la propuesta, si tienen
una cuenta en askubuntu o en stackexchange, pueden entrar a la liga superior y
dar click en ‘Follow’ o hacer una pregunta que consideren pueda ser abordada
en el sitio. También pueden votar a favor o en contra en las preguntas ya
hechas para definir la temática que seguirá AskUbuntu en Español.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Una vez obtenidas las preguntas, se analizará si existen suficientes
personas que puedan participar activamente en un sitio como este. Cuando se
llegue a esta fase, las personas interesadas podrán entrar a la propuesta y
dar click en ‘Commit’.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Cuando se compruebe que existen suficientes personas interesadas, se podrá
lanzar un sitio beta, de ahí se obtendrán datos reales sobre la
sustentabilidad de la comunidad, si existe suficiente participación durante al
menos 6 meses, entonces AskUbuntu en Español obtendrá el rango de oficial y se
mantendrá como un recurso permanente.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Disfrutar de AskUbuntu en Español&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si están interesados en la propuesta, pueden ayudarnos, inviten a sus amigos
que ya usan Ubuntu, ayudenos a difundir la iniciativa. Cada voto cuenta.
Seguiré informando sobre el alcance de la propuesta.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;Lately the Ubuntu community has been discussing about i18n in the Q&amp;amp;A systems:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/QandALocalization&quot;&gt;https://wiki.ubuntu.com/QandALocalization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some LoCo Teams, such as Ubuntu Perú and Ubuntu Colombia, have created their
own sites:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20170301210026/http://ubuntu.shapado.com:80/&quot;&gt;https://web.archive.org/web/20170301210026/http://ubuntu.shapado.com:80/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://ayuda.ubuntu.pe&quot;&gt;http://ayuda.ubuntu.pe&lt;/a&gt; (launched today)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This, in my opinion, just helps to fragment even more the already distributed
information in Spanish, what we need is an AskUbuntu version in our language,
(and I suggest to do the same for other langs):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://area51.stackexchange.com/proposals/56087/askubuntu-in-spanish&quot;&gt;http://area51.stackexchange.com/proposals/56087/askubuntu-in-spanish&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;¿Does this proposal is officially supported by Canonical?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not at all, but some other community efforts haven’t get Canonical support at
the beginning, such as the ubuntuforums or the local teams, if we grow enough
I’m sure we’ll recognized officially after a while.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿How can I help?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In order to create a similar site to AskUbuntu we require following 5 steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Propose the idea, I ’ve already done it:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;http://area51.stackexchange.com/proposals/56087/askubuntu-in-spanish/&quot;&gt;http://area51.stackexchange.com/proposals/56087/askubuntu-in-spanish/&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Get sample questions and enough followers, if you have an askubuntu / stackexchange account, you can click the link above and then press ‘Follow’, you can also make questions, the kind of question you would like to see answered in the site. Finally you can vote up or down in the current questions, it will help us to define the allowed questions.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Once we have enough questions, we’ll require to show there are enough
persons interested in participating actively on it. There will appear a button
called ‘Commit’ which will let us to show we’re many persons who want an
AskUbuntu in Spanish.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The next step will be launching a beta site for 6 month, it will help us
to know if the community can be self sustained. If it’s AskUbuntu in Spanish
will be a permanent resource.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We can go and ask in AskUbuntu-es&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you’re interested, feel free to help us, invite your friends and help us
spread the initiative, if you don’t talk Spanish nor English, I invite you to
launch similar efforts.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-proposal-askubuntu-en-espanol-askubuntu-in-spanish-2.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-proposal-askubuntu-en-espanol-askubuntu-in-spanish-2.png&quot; alt=&quot;area51&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2013/06/02/proposal-askubuntu-en-espanol-askubuntu-in-spanish/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>remote environments normalization</title>
   <link href="https://javier.io/blog/en/2013/05/28/remote-environments-normalization.html"/>
   <published>2013-05-28T00:00:00+00:00</published>
   <updated>2013-05-28T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/05/28/remote-environments-normalization</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">remote environments normalization</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/05/28/remote-environments-normalization.html">&lt;h2 id=&quot;remote-environments-normalization&quot;&gt;remote environments normalization&lt;/h2&gt;

&lt;h6 id=&quot;28-may-2013&quot;&gt;28 May 2013&lt;/h6&gt;

&lt;p&gt;I access a fair amount of remote environments through ssh, when I do it most of the times I end copying little bits of configuration files to make them easier to use. I do it so often than I created script to do it for me.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sh &amp;lt;(wget -qO- javier.io/s)
&lt;/pre&gt;

&lt;iframe class=&quot;showterm&quot; src=&quot;https://web.archive.org/web/20161117210452/http://showterm.io/3bfc94afe0f51e8d6411f&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt;

&lt;p&gt;Some of my favorite changes are:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[+] Installation of: byobu, vim-nox, curl, command-not-found, libpam-captcha, shundle and htop
[+] Removal of services: sendemail, apache, bind, etc
[+] Vim configuration
[+] Wcd as a replacement to cd
[+] +60 scripts:
    [+] pastebin,  $ cat file | pastebin
    [+] extract,   $ extract file.suffix
    [+] fu-search, $ fu-search grep
    [+] rm_,       $ rm .bashrc &amp;amp;&amp;amp; rm -u .bashrc
    [+] uimg,      $ uimg image.png #img pastebin
    [+] ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By default the script will backup(.old) any file before override it. Now all my new pristine environments are equal 😊&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/dotfiles/&quot;&gt;dotfiles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/shundle&quot;&gt;shundle&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/&quot;&gt;utils&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>flisol + ubuntu walk + ubuconla</title>
   <link href="https://javier.io/blog/en/2013/04/28/flisol-ubuntu-walk-ubuconla.html"/>
   <published>2013-04-28T00:00:00+00:00</published>
   <updated>2013-04-28T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/04/28/flisol-ubuntu-walk-ubuconla</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">flisol + ubuntu walk + ubuconla</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/04/28/flisol-ubuntu-walk-ubuconla.html">&lt;h2 id=&quot;flisol--ubuntu-walk--ubuconla&quot;&gt;flisol + ubuntu walk + ubuconla&lt;/h2&gt;

&lt;h6 id=&quot;28-apr-2013&quot;&gt;28 Apr 2013&lt;/h6&gt;

&lt;p&gt;Yesterday was organized the &lt;a href=&quot;http://en.wikipedia.org/wiki/FLISOL&quot;&gt;Flisol&lt;/a&gt;, a latinoamerican event where people
get together and install free software, and I couldn’t stop myself to feature
Ubuntu Raring =), so I printed some flyers and took a nice walk around the
city.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-flisol-ubuntu-walk-ubuconla-1.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-flisol-ubuntu-walk-ubuconla-1.jpg&quot; alt=&quot;ubuntu road&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The flyer features an impressive mockup of &lt;a href=&quot;http://eldron2323.deviantart.com/art/Ubuntu-Laptop-Concept-Photoshop-File-282909974?q=gallery%3Aeldron2323%2F28162271&amp;amp;qo=9&quot;&gt;Nick Rutledge.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was a nice warp-up for the next &lt;a href=&quot;http://www.ubuconla.org/&quot;&gt;UbuConLa&lt;/a&gt;, which will be in hosted
in Montevideo Uruguay next June 7th, hope to see many of guys there =)!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.ubuconla.org/&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-flisol-ubuntu-walk-ubuconla-3.png&quot; alt=&quot;ubuconla&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2013/04/28/flisol-ubuntu-walk-ubuconla/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>unadm, a new (quite amazing) alternative for university education in mexico</title>
   <link href="https://javier.io/blog/en/2013/04/21/unadm-a-new-quite-amazing-alternative-for-university-education-in-mexico.html"/>
   <published>2013-04-21T00:00:00+00:00</published>
   <updated>2013-04-21T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/04/21/unadm-a-new-quite-amazing-alternative-for-university-education-in-mexico</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">unadm, a new (quite amazing) alternative for university education in mexico</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/04/21/unadm-a-new-quite-amazing-alternative-for-university-education-in-mexico.html">&lt;h2 id=&quot;unadm-a-new-quite-amazing-alternative-for-university-education-in-mexico&quot;&gt;unadm, a new (quite amazing) alternative for university education in mexico&lt;/h2&gt;

&lt;h6 id=&quot;21-apr-2013&quot;&gt;21 Apr 2013&lt;/h6&gt;

&lt;p&gt;I’ve never been good with formal education, I’ve already studied in three
major local universities &lt;a href=&quot;http://www.ipn.mx&quot;&gt;IPN&lt;/a&gt;/&lt;a href=&quot;http://www.unam.mx/&quot;&gt;UNAM&lt;/a&gt;/&lt;a href=&quot;http://www.uam.mx/&quot;&gt;UAM&lt;/a&gt; without much
success, I’m not saying they’re bad, but the classic education process they
promote don’t fit well with my lifestyle, I use to do lots of different
activities (right now, learning tango, violin, portuguese, ubuntu related
stuff, syadmin work, and taking in shape a couple of startups) I think the
main reason I failed was mostly because I didn’t have or didn’t want to spend
time traveling (3hrs a day) for 200 days or so a year to join repetitive
classrooms, I’ve also been taking half day and full day jobs for 5 years so I
think that hasn’t helped either. Last year, when I left UAM I was sure I would
relax and continue my life without a formal degree, however a few months later
a friend suggest me to join a new university (3 years old) which was supposed
to do everything online.&lt;/p&gt;

&lt;p&gt;At the beginning I didn’t take it seriously, I mean, major local universities
have already integrated, in a way or another, remote facilities (such as
moddle, email, online enrollment forms, etc) without success, why a new
university would make it right?, well, I was wrong!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.unadmexico.mx/&quot;&gt;UnADM&lt;/a&gt; is a true alternative, they’ve worked really hard to i18n and customize the applications they use so students don’t even recognize the technologies integrated. I almost didn’t recognize moddle, and everything has been classified with great care, they have nice tutors and its site is quite responsive, with a lot of videos/pdfs about every topic and aspect of the university, I’m talking as a normal platform user without taking in consideration &lt;a href=&quot;https://www.google.com/search?q=unadm&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:en-US:unofficial&amp;amp;client=firefox-nightly#client=firefox-nightly&amp;amp;hs=m8g&amp;amp;rls=org.mozilla:en-US%3Aunofficial&amp;amp;sclient=psy-ab&amp;amp;q=unadm+fraude&amp;amp;oq=unadm+fraude&amp;amp;gs_l=serp.3...1086030.1086849.0.1087071.7.7.0.0.0.0.360.1390.0j3j2j1.6.0...0.0...1c.1.9.psy-ab.5vw6Yhkb9kE&amp;amp;pbx=1&amp;amp;bav=on.2,or.r_cp.r_qf.&amp;amp;bvm=bv.45512109,d.b2I&amp;amp;fp=572c6dbaeee29434&amp;amp;biw=1364&amp;amp;bih=612&quot;&gt;political / laboral issues&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, if by any chance you’re a student in Mexico and you’re looking for
alternatives, take a look at UnADM, they(we?) still can improve a lot, but the
experience I’ve got is quite good.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=VN6aAXM96NQ&quot;&gt;promotional video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have fun.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2013/04/21/unad/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>access localhost with pagekite</title>
   <link href="https://javier.io/blog/en/2013/04/06/access-localhost-with-pagekite.html"/>
   <published>2013-04-06T00:00:00+00:00</published>
   <updated>2013-04-06T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/04/06/access-localhost-with-pagekite</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">access localhost with pagekite</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/04/06/access-localhost-with-pagekite.html">&lt;h2 id=&quot;access-localhost-with-pagekite&quot;&gt;access localhost with pagekite&lt;/h2&gt;

&lt;h6 id=&quot;06-apr-2013&quot;&gt;06 Apr 2013&lt;/h6&gt;

&lt;p&gt;I ♡ pagekite, it allows me to connect to my laptop from anywhere, literally, it doesn’t matter if my computer is behind a nat router or if my input traffic is blocked, as long as my computer can start connections to internet I’m covered. And I don’t need to redefine anything, it will work even if I’m changing constantly networks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/68.jpg&quot;&gt;&lt;img src=&quot;/assets/img/68.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why do I need to access my computer under every possible scenario?, personal portability, I prefer to travel lightly, just give me a book and some headphones and I’m ready to go to the end of the world. And even though I’ve most of my stuff in servers some things somehow end in my personal laptop.&lt;/p&gt;

&lt;p&gt;So, right now I connect to home by typing:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ssh home.javier.io
&lt;/pre&gt;

&lt;p&gt;It doesn’t matter where I’m, neither where my laptop is, it will just work 😂&lt;/p&gt;

&lt;p&gt;If you’re interested in setting something similar up, go and create an account in &lt;a href=&quot;http://pagekite.net&quot;&gt;http://pagekite.net&lt;/a&gt;, personal startup of &lt;a href=&quot;http://bre.klaki.net/&quot;&gt;Bjarni Einarsson&lt;/a&gt;, icelandic hacker.&lt;/p&gt;

&lt;p&gt;Once done, you’ll be able to run:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ curl -s https://pagekite.net/pk/ |sudo bash #for installing pagekite in 1 line
$ pagekite.py 80 yourname.pagekite.me
&lt;/pre&gt;

&lt;p&gt;And now you’ll be running your own web server available to the world, isn’t great? Now let’s talk about more interesting stuff such us using your own domain and connecting to ssh or any other protocol.&lt;/p&gt;

&lt;p&gt;This is what happens when someone uses pagekite:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ssh home.javier.io
&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;       192.168.1.x       home.javier.io  home.javier.pagekite.me   192.168.1.x
       :::::::::::        :::::::::::          ::::::::::::        :::::::::::::::
       | client  |   =&amp;gt;   |   dns   |    =&amp;gt;    | pagekite |     =&amp;gt; |   laptop    |
       :::::::::::        :::::::::::          ::::::::::::        :::::::::::::::
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The computer where the client is launched will connect to a dns, which in return will send it to a pagekite subdomain and from there to a reverse connection between pagekite and your server. Alloying to exchange data between client and server(laptop behind nat) through pagekite servers.&lt;/p&gt;

&lt;h3 id=&quot;dns&quot;&gt;Dns&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Cname&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this to work, home.javier.io must point to pagekite. This can be done with a CNAME entry, and it depends of your dns provider. In my case it looks like this (&lt;a href=&quot;http://iwantmyname.com&quot;&gt;http://iwantmyname.com&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/69.png&quot;&gt;&lt;img src=&quot;/assets/img/69.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://pagekite.net&quot;&gt;pagekite.me&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Upon registration, pagekite will give you a &lt;strong&gt;nick.pagekite.me&lt;/strong&gt; subdomain for free where you can add &lt;a href=&quot;https://pagekite.net/signup/?more=free&quot;&gt;other subdomains&lt;/a&gt; to get &lt;strong&gt;subdomain.nick.pagekite.me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/70.png&quot;&gt;&lt;img src=&quot;/assets/img/70.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;home.javier.io kite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need to &lt;a href=&quot;https://pagekite.net/signup/?more=cname#cnameForm&quot;&gt;register&lt;/a&gt; the CNAME entry in pagekite as well:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/71.png&quot;&gt;&lt;img src=&quot;/assets/img/71.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now your &lt;a href=&quot;https://pagekite.net/home/&quot;&gt;home page&lt;/a&gt; should look like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/72.png&quot;&gt;&lt;img src=&quot;/assets/img/72.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;server&quot;&gt;Server&lt;/h3&gt;

&lt;p&gt;Now it’s time to configure pagekite in the target machine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;###[ Current settings for pagekite.py v0.5.6a. ]#########
# ~/.pagekite.rc
## NOTE: This file may be rewritten/reordered by pagekite.py.
#

##[ Default kite and account details ]##
kitename = home.javier.io
kitesecret = KITESECRET_KEY

##[ Front-end settings: use pagekite.net defaults ]##
defaults

##[ Back-ends and local services ]##
service_on = http:@kitename : localhost:80 : @kitesecret
service_on = raw-22:@kitename : localhost:22 : @kitesecret

##[ Miscellaneous settings ]##
savefile = ~/.pagekite.rc

###[ End of pagekite.py configuration ]#########
END
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And launch the service:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./pagekite.py
&amp;gt;&amp;gt;&amp;gt; Hello! This is pagekite v0.5.6a.                            [CTRL+C = Stop]
    Connecting to front-end 69.164.211.158:443 ...
     - Protocols: http http2 http3 https websocket irc finger httpfinger raw
     - Protocols: minecraft
     - Ports: 79 80 443 843 2222 3000 4545 5222 5223 5269 5670 6667 8000 8080
     - Ports: 8081 9292 25565
     - Raw ports: 22 virtual
    Quota: You have 2559.74 MB, 29 days and 4 connections left.
    Connecting to front-end 173.230.155.164:443 ...
~&amp;lt;&amp;gt; Flying localhost:22 as ssh://home.javier.io:22/ (HTTP proxied)
~&amp;lt;&amp;gt; Flying localhost:80 as https://home.javier.io/
 &amp;lt;&amp;lt; pagekite.py [flying]   Kites are flying and all is well.
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;client&quot;&gt;Client&lt;/h3&gt;

&lt;p&gt;To connect to your laptop you can use any web browser or complete an extra step to be able to use ssh. The &lt;strong&gt;$HOME/.ssh/config&lt;/strong&gt; file should be edited as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Host home.javier.io
    CheckHostIP no
    ProxyCommand /bin/nc -X connect -x %h:443 %h %p
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;WARNING:&lt;/strong&gt; the nc command must be the openbsd version, in Ubuntu it’s called &lt;strong&gt;netcat-openbsd&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If everything is correct, you should now be able to login:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ssh home.javier.io
admin@home.javier.io&apos;s password:
&lt;/pre&gt;

&lt;h3 id=&quot;own-server&quot;&gt;Own Server&lt;/h3&gt;

&lt;p&gt;Pagekite is free software, both backend(client) and frontend(server). The same &lt;code&gt;pagekite.py&lt;/code&gt; can play both roles. This is a quick summary in case you prefer going your own.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
(vps) $ pagekite --clean --isfrontend --ports=8080 --domain=*:h.javier.io:passw0rd
&amp;gt;&amp;gt;&amp;gt; Hello! This is pagekite v0.5.6a.                            [CTRL+C = Stop]
    This is a PageKite front-end server.
     - Listening on *:8080
&lt;/pre&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
(target) $ pagekite --clean --frontend=h.javier.io:8080 --service_on=http/8080:h.javier.io:localhost:8080:passw0rd
Connecting to front-end 107.161.164.253:8080 ...
     - Protocols: http http2 http3 https websocket irc finger httpfinger raw
     - Protocols: minecraft
     - Ports: 8080
~&amp;lt;&amp;gt; Flying localhost:8080 as http://h.javier.io:8080/
&lt;/pre&gt;

&lt;p&gt;And with that, your local machine will be available on Internet through your own public machine.&lt;/p&gt;

&lt;p&gt;That’s it, happy flying 😋&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pagekite/PyPagekite&quot;&gt;https://github.com/pagekite/PyPagekite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>puesta a prueba de ubuntu raring en español</title>
   <link href="https://javier.io/blog/en/2013/04/02/puesta-a-prueba-de-ubuntu-raring-en-espanol.html"/>
   <published>2013-04-02T00:00:00+00:00</published>
   <updated>2013-04-02T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/04/02/puesta-a-prueba-de-ubuntu-raring-en-espanol</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">puesta a prueba de ubuntu raring en español</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/04/02/puesta-a-prueba-de-ubuntu-raring-en-espanol.html">&lt;h2 id=&quot;puesta-a-prueba-de-ubuntu-raring-en-español&quot;&gt;puesta a prueba de ubuntu raring en español&lt;/h2&gt;

&lt;h6 id=&quot;02-apr-2013&quot;&gt;02 Apr 2013&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-puesta-a-prueba-de-ubuntu-raring-en-espanol-1.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-puesta-a-prueba-de-ubuntu-raring-en-espanol-1.jpg&quot; alt=&quot;ubuntu_iso&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a fast update of the &lt;a href=&quot;http://www.theorangenotebook.com/2013/03/beta-testing-extraordinaire-with-ubuntu.html&quot;&gt;Beta Testing Extraordinaire with Ubuntu
Quality&lt;/a&gt; event who will be hosted &lt;strong&gt;today&lt;/strong&gt; starting at &lt;strong&gt;18:00 UTC&lt;/strong&gt; ,
in about &lt;strong&gt;3&lt;/strong&gt; hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tuesday April 2nd, 2013&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1800 UTC – 2200 UTC&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Quality team members are dedicated to hanging out in #ubuntu-quality executing testcases and helping answer questions&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;1800 UTC:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;We ’ll be streaming live on &lt;a href=&quot;http://ubuntuonair.com/&quot;&gt;ubuntuonair&lt;/a&gt; in &lt;strong&gt;Spanish&lt;/strong&gt; doing live testing demos and offering help&lt;/em&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;em&gt;Basic iso test install&lt;/em&gt;&lt;/li&gt;
          &lt;li&gt;&lt;em&gt;More exotic examples — netboot, server, non-english&lt;/em&gt;&lt;/li&gt;
          &lt;li&gt;&lt;em&gt;Your requests!&lt;/em&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2000 UTC:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;We ’ll be streaming live on &lt;a href=&quot;http://ubuntuonair.com/&quot;&gt;ubuntuonair&lt;/a&gt; in doing live testing demos and offering help&lt;/em&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;em&gt;Basic iso test install&lt;/em&gt;&lt;/li&gt;
          &lt;li&gt;&lt;em&gt;More exotic examples — netboot, server, non-english&lt;/em&gt;&lt;/li&gt;
          &lt;li&gt;&lt;em&gt;Your requests!&lt;/em&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Iso testing is a nice way to contribute technically to Ubuntu and it also one
of the easiest ways to get started, we want everyone to do it!, join us =)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;En el equipo de Ubuntu QA ¡hablamos español!, ¿interesado en contribuir con
Ubuntu?, acompañanos &lt;strong&gt;hoy&lt;/strong&gt; a partir de las &lt;strong&gt;18:00 UTC&lt;/strong&gt; y comprueba por ti
mismo lo fácil que es. Iso testing es la actividad que conlleva descargar la
última versión en desarrollo y probarla en una computadora (virtual o física).
Descubre las nuevas características de Ubuntu antes que nadie y se parte de
uno de los subgrupos de Ubuntu con mayor magia de la amistad 8)&lt;/p&gt;

&lt;p&gt;Si no puedes lograrlo, no hay ningún problema, contacta a &lt;a href=&quot;https://wiki.ubuntu.com/SergioMeneses&quot;&gt;Sergio
Meneses&lt;/a&gt; o a un &lt;a href=&quot;https://wiki.ubuntu.com/~javier-lopez&quot;&gt;servidor&lt;/a&gt; a la hr que quieras, el día que quieras y
se parte del equipo de calidad =)&lt;/p&gt;

&lt;p&gt;¿Qué hr son las 18:00 UTC en tu ciudad?:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.timeanddate.com/worldclock/fixedtime.html?msg=Ubuntu+Extraordinary+Iso+Testing&amp;amp;iso=20130402T18&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-puesta-a-prueba-de-ubuntu-raring-en-espanol-2.jpg&quot; alt=&quot;where&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2013/04/02/puesta-a-prueba-de-ubuntu-raring-en-espanol/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>improve boot performance in ubuntu precise and above</title>
   <link href="https://javier.io/blog/en/2013/03/18/improve-boot-performance-in-ubuntu-1204.html"/>
   <published>2013-03-18T00:00:00+00:00</published>
   <updated>2013-03-18T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/03/18/improve-boot-performance-in-ubuntu-1204</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">improve boot performance in ubuntu precise and above</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/03/18/improve-boot-performance-in-ubuntu-1204.html">&lt;h2 id=&quot;improve-boot-performance-in-ubuntu-precise-and-above&quot;&gt;improve boot performance in ubuntu precise and above&lt;/h2&gt;

&lt;h6 id=&quot;18-mar-2013&quot;&gt;18 Mar 2013&lt;/h6&gt;

&lt;p&gt;The project &lt;a href=&quot;http://e4rat.sourceforge.net/&quot;&gt;e4rat&lt;/a&gt; develops tools who improve the boot process in Linux, to do so, it takes advantage of the reassignment of files in &lt;a href=&quot;http://es.wikipedia.org/wiki/Ext4&quot;&gt;ext4&lt;/a&gt; if you’re not using ext4 it won’t work. It won’t work neither if you are using &lt;a href=&quot;http://en.wikipedia.org/wiki/Solid-state_drive&quot;&gt;solid state drives&lt;/a&gt;, for those disks &lt;a href=&quot;https://launchpad.net/ureadahead&quot;&gt;ureadahead&lt;/a&gt; (installed by default) already do a great job.&lt;/p&gt;

&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;

&lt;p&gt;A lot of the time who is allocated at the boot process is wasted booting and initializing hard drives (it doesn’t happen in ssds) you can see it by yourself with &lt;a href=&quot;https://web.archive.org/web/20211001205432/http://www.bootchart.org/&quot;&gt;bootchart&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/66.png&quot;&gt;&lt;img src=&quot;/assets/img/66.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The red graph represent the time waiting for the hard drive and the blue one the time is cpu is being used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;e4rat&lt;/strong&gt; technique move critical files (for the booting process) alongside so these files can be loaded with minimal machinery to the hard drives. After loading them in ram, the time required to read them will drop significantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/67.png&quot;&gt;&lt;img src=&quot;/assets/img/67.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This a graph of the same system after using &lt;em&gt;e4rat&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The process should be repeated every time a kernel upgrade is done or when non simple updates have been applied.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;e4rat&lt;/strong&gt; requires at least a 2.6.31 linux kernel, in Ubuntu such kernels are distributed since Ubuntu 11.04. Fortunately the project provides .deb packages so the installation process is quite simple, grab the appropriate version for your cpu architecture from:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://sourceforge.net/projects/e4rat/files&quot;&gt;http://sourceforge.net/projects/e4rat/files&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before installing &lt;strong&gt;e4rat&lt;/strong&gt; you will need ensure &lt;strong&gt;ureadahead&lt;/strong&gt; has been completely removed, to do so in Debian/Ubuntu run:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get purge ureadahead
&lt;/pre&gt;

&lt;p&gt;The system will ask to uninstall &lt;strong&gt;ubuntu-minimal&lt;/strong&gt; too. Let it continue, ubuntu-minimal is a meta-package who doesn’t contain anything by itself, it’s useful however during the OS installation process to bring with it a bunch of packages.&lt;/p&gt;

&lt;p&gt;After removing completely ureadahead, &lt;strong&gt;e4rat&lt;/strong&gt; can be installed with dpkg:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo dpkg -i e4rat_0.2.3_amd64.deb
&lt;/pre&gt;

&lt;h3 id=&quot;configuration&quot;&gt;Configuration&lt;/h3&gt;

&lt;p&gt;For &lt;strong&gt;e4rat&lt;/strong&gt; to work it needs to recognize which files are been used at the boot process, to do so add the &lt;strong&gt;init=/sbin/e4rat-collect&lt;/strong&gt; string to the &lt;strong&gt;kernel&lt;/strong&gt; line in &lt;strong&gt;/boot/grub/menu.lst&lt;/strong&gt; or the equivalent file for grub2, etc:&lt;/p&gt;

&lt;pre class=&quot;config&quot;&gt;
title   Ubuntu 12.04.2 LTS, kernel 3.8.2-ck1
uuid    793e9a6d-d545-46f0-ac9c-49071c450b62
kernel  ... ro init=/sbin/e4rat-collect
initrd  /boot/initrd.img-3.8.2-ck1
quiet
&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;Upon rebooting launch as fast as possible your most common applications (web/file browsers?, terminal emulator?, etc), e4rat will add to its index the files loaded in memory in the first 2 minutes after booting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Review &lt;strong&gt;/var/lib/e4rat/startup.log&lt;/strong&gt; to confirm it’s such information.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ file /var/lib/e4rat/startup.log
/var/lib/e4rat/startup.log: ASCII text
&lt;/pre&gt;

&lt;h3 id=&quot;file-reallocation&quot;&gt;File reallocation&lt;/h3&gt;

&lt;p&gt;To this moment &lt;strong&gt;e4rat&lt;/strong&gt; already know what files should be loaded at boot time, to relocate them reboot the system in recovery (or safe) mode.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In my system the grub entry looks like this:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre class=&quot;config&quot;&gt;
Ubuntu 12.04.2 LTS, kernel 3.8.2-ck1 (recovery mode)
&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;Once loaded execute &lt;strong&gt;e4rat-realloc&lt;/strong&gt; several times till the software indicates there are no more improvements possible&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# e4rat-realloc /var/lib/e4rat/startup.log
...
...
No further improvements...
&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;Replace &lt;strong&gt;init=/sbin/e4rat-collect&lt;/strong&gt; with &lt;strong&gt;init=/sbin/e4rat-preload&lt;/strong&gt;:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre class=&quot;config&quot;&gt;
title   Ubuntu 12.04.2 LTS, kernel 3.8.2-ck1
uuid    793e9a6d-d545-46f0-ac9c-49071c450b62
kernel  ... ro plymouth:force-splash init=/sbin/e4rat-preload
initrd  /boot/initrd.img-3.8.2-ck1
quiet
&lt;/pre&gt;

&lt;blockquote&gt;
  &lt;p&gt;Reboot&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Done, now the boot process time should be faster and smoother 😎&lt;/p&gt;

&lt;h3 id=&quot;uninstallation&quot;&gt;Uninstallation&lt;/h3&gt;

&lt;p&gt;If you find &lt;strong&gt;4rat&lt;/strong&gt; too difficult to use or buggy, you can uninstall it by following the next steps:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get purge e4rat
$ sudo apt-get install ubuntu-minimal ureadahead
$ sudo vim /boot/grub/menu.lst #and remove init=/sbin/e4rat-preload
&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://rafalcieslak.wordpress.com/2013/03/17/e4rat-decreasing-bootup-time-on-hdd-drives&quot;&gt;http://rafalcieslak.wordpress.com/2013/03/17/e4rat-decreasing-bootup-time-on-hdd-drives&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>ubuntu loco games 2013</title>
   <link href="https://javier.io/blog/en/2013/01/07/ubuntu-loco-games-2013-i.html"/>
   <published>2013-01-07T00:00:00+00:00</published>
   <updated>2013-01-07T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2013/01/07/ubuntu-loco-games-2013-i</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">ubuntu loco games 2013</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2013/01/07/ubuntu-loco-games-2013-i.html">&lt;h2 id=&quot;ubuntu-loco-games-2013&quot;&gt;ubuntu loco games 2013&lt;/h2&gt;

&lt;h6 id=&quot;07-jan-2013&quot;&gt;07 Jan 2013&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-ubuntu-loco-games-2013-i-1.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-ubuntu-loco-games-2013-i-2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ubuntu-mx team is still celebrating its recent approval status and one way
to do it is organizating the first edition of the Ubuntu Loco Games, the idea
is simple know each other and have fun at the same time, interested?, join us!&lt;/p&gt;

&lt;p&gt;From &lt;a href=&quot;http://www.timeanddate.com/worldclock/fixedtime.html?iso=20130209T0900&amp;amp;p1=155&amp;amp;msg=Ubuntu%20Games%202013%20-%20I&quot;&gt;9:00am CST, February 9 to 4:00pm CST, February 10&lt;/a&gt;, we’ll match
teams members in a mortal combat of &lt;a href=&quot;http://assault.cubers.net/&quot;&gt;AssaultCube&lt;/a&gt;, &lt;a href=&quot;http://www.wesnoth.org/&quot;&gt;Battle for Wesnoth
&lt;/a&gt;&amp;amp; &lt;a href=&quot;http://www.urbanterror.info/home/&quot;&gt;Urban Terror&lt;/a&gt;, so spread the news and add your team and your
ubuntu warriors to:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pad.ubuntu.com/LocoGames&quot;&gt;http://pad.ubuntu.com/LocoGames&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are not sure which one is your Ubuntu Loco Team, look for it at:
&lt;a href=&quot;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/&quot;&gt;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/viajemotu-ubuntu-loco-games-2013-i-3.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The information of the formal server will be delivered 10 minutes before the
event at &lt;a href=&quot;https://twitter.com/ubuntumx&quot;&gt;@ubuntumx&lt;/a&gt; and #ubuntu-mx =)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/events/ubuntu-mx/2173/detail/&quot;&gt;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/events/ubuntu-mx/2173/detail/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2013/01/07/ubuntu-loco-games-2013-1/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>dmenu with xft support</title>
   <link href="https://javier.io/blog/en/2012/12/26/dmenu-xft.html"/>
   <published>2012-12-26T00:00:00+00:00</published>
   <updated>2012-12-26T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/12/26/dmenu-xft</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">dmenu with xft support</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/12/26/dmenu-xft.html">&lt;h2 id=&quot;dmenu-with-xft-support&quot;&gt;dmenu with xft support&lt;/h2&gt;

&lt;h6 id=&quot;26-dec-2012&quot;&gt;26 Dec 2012&lt;/h6&gt;

&lt;p&gt;I love minimalist programs not ugly ones, dmenu is one of my favorite apps and I’ve just discovered a patch for making it use pretty xft fonts. So I recompiled a personal version and put it somewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/65.jpg&quot;&gt;&lt;img src=&quot;/assets/img/65.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’re interested in using this version, feel free to grab a copy (only Ubuntu LTS versions are supported):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-add-repository ppa:minos-archive/main
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install dmenu
&lt;/pre&gt;

&lt;p&gt;Upon installation, dmenu can be used with any xft font:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ dmenu_run -fn &quot;Liberation Mono-8&quot;
&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/suckless-tools/+bug/1093745&quot;&gt;LP #1093745&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>tip: enable -updates when doing -proposed tests - motu</title>
   <link href="https://javier.io/blog/en/2012/11/22/tip-enable-updates-when-doing-proposed-tests.html"/>
   <published>2012-11-22T00:00:00+00:00</published>
   <updated>2012-11-22T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/11/22/tip-enable-updates-when-doing-proposed-tests</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">tip: enable -updates when doing -proposed tests - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/11/22/tip-enable-updates-when-doing-proposed-tests.html">&lt;h2 id=&quot;tip-enable--updates-when-doing--proposed-tests---motu&quot;&gt;tip: enable -updates when doing -proposed tests - motu&lt;/h2&gt;

&lt;h6 id=&quot;22-nov-2012&quot;&gt;22 Nov 2012&lt;/h6&gt;

&lt;p&gt;Some days I like helping -proposed updates to go faster to -updates, I do that
by testing -proposed changes, I borrow some of them from:
&lt;a href=&quot;http://people.canonical.com/~ubuntu-archive/pending-sru.html&quot;&gt;http://people.canonical.com/~ubuntu-archive/pending-sru.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I always do it in a pbuilder environment or when the changes requires lots of
packages I use a virtualbox machine, when using pbuilder I add the -proposed
repositories and do the tests, yesterday I was testing &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/havp/+bug/1073574&quot;&gt;#1073574&lt;/a&gt; and
found a weird error:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
root@sup:/# apt-get install havp
 Reading package lists... Done
 Building dependency tree
 Reading state information... Done
 Some packages could not be installed. This may mean that you have
 requested an impossible situation or if you are using the unstable
 distribution that some required packages have not yet been created
 or been moved out of Incoming.
 The following information may help to resolve the situation:
 The following packages have unmet dependencies:
havp : Depends: libclamav6 (&amp;gt;= 0.97.6+dfsg) but 0.97.3+
dfsg-2.1ubuntu1 is to be installed
 E: Unable to correct problems, you have held broken packages.
&lt;/pre&gt;

&lt;p&gt;It was a simple change, it should had to work but it wasn’t.., so I posted it,
and ScottK help me to remember that -updates wasn’t enable, so I add them and
it worked =), I hadn’t had this problem because with some packages the -update
repository isn’t needed, however I’ll remember to do it next time it fails to
install.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
deb http://us.archive.ubuntu.com/ubuntu/ quantal main restricted ...
deb http://us.archive.ubuntu.com/ubuntu/ quantal-proposed main restricted ...
deb http://us.archive.ubuntu.com/ubuntu/ quantal-updates main restricted ...
&lt;/pre&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/11/22/tip-enable-updates-when-doing-proposed-tests/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>git clone only the last snapshot of a project</title>
   <link href="https://javier.io/blog/en/2012/11/22/git-clone-last.html"/>
   <published>2012-11-22T00:00:00+00:00</published>
   <updated>2012-11-22T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/11/22/git-clone-last</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">git clone only the last snapshot of a project</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/11/22/git-clone-last.html">&lt;h2 id=&quot;git-clone-only-the-last-snapshot-of-a-project&quot;&gt;git clone only the last snapshot of a project&lt;/h2&gt;

&lt;h6 id=&quot;22-nov-2012&quot;&gt;22 Nov 2012&lt;/h6&gt;

&lt;p&gt;Git clone by default download all the data attached to a repository, there are sometimes however when I’m only interested in getting the latest snapshot. This can be done with the &lt;strong&gt;–depth=1&lt;/strong&gt; option:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ git clone --depth=1 git://github.com/javier-lopez/dotfiles.git
&lt;/pre&gt;

&lt;p&gt;It’s called shallow clone&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/1209999/using-git-to-get-just-the-latest-revision&quot;&gt;http://stackoverflow.com/questions/1209999/using-git-to-get-just-the-latest-revision&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>dmenu for everything</title>
   <link href="https://javier.io/blog/en/2012/11/18/dmenu-for-everything.html"/>
   <published>2012-11-18T00:00:00+00:00</published>
   <updated>2012-11-18T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/11/18/dmenu-for-everything</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">dmenu for everything</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/11/18/dmenu-for-everything.html">&lt;h2 id=&quot;dmenu-for-everything&quot;&gt;dmenu for everything&lt;/h2&gt;

&lt;h6 id=&quot;18-nov-2012&quot;&gt;18 Nov 2012&lt;/h6&gt;

&lt;p&gt;I love minimalism systems and programs who focus in doing a single task very well, &lt;a href=&quot;http://tools.suckless.org/dmenu/&quot;&gt;dmenu&lt;/a&gt; is one of them, it reads input from user, matches patterns and returns results, simple! With this functionality it can (ab)used to create launchers for almost anything, let’s review how to create a virtualbox launcher…&lt;/p&gt;

&lt;p&gt;The first step (and the hardest) is to figure out how to create an option list to present in screen, on this example vbox machines:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ vboxmanage list vms | cut -d\&quot; -f2
&lt;/pre&gt;

&lt;p&gt;Once defined, it’s easy to come up with missing parts:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
DMENU=&apos;dmenu -p &amp;gt; -i -nb #000000 -nf #ffffff -sb #000000 -sf #3B5998&apos;
vboxmachine=&quot;$(vboxmanage list vms | cut -d\&quot; -f2 | $DMENU)&quot;
[ -z &quot;${vboxmachine}&quot; ] &amp;amp;&amp;amp; exit 0 || vboxmanage -q startvm &quot;$vboxmachine&quot; --type gui
&lt;/pre&gt;

&lt;p&gt;Everything in 3 LOC!, this script can now be saved at &lt;strong&gt;/usr/local/bin/&lt;/strong&gt; and used as a shortcut, in my use case, I added it to &lt;strong&gt;~/.i3/config&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;
# vbox:
bindsym $Altgr+v exec dmenu_vbox
&lt;/pre&gt;

&lt;p&gt;So now I can launch vbox machines by pressing &lt;strong&gt;Altrg + v&lt;/strong&gt; and select the appropiated machine, if you liked dmenu as much as I did, I’ve made a handful of scripts to control music, user sessions, apps, etc. Feel free to grab them at:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/tree/master/sh/tools&quot;&gt;https://github.com/javier-lopez/learn/tree/master/sh/tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/61.png&quot;&gt;&lt;img src=&quot;/assets/img/61.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/62.png&quot;&gt;&lt;img src=&quot;/assets/img/62.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/63.png&quot;&gt;&lt;img src=&quot;/assets/img/63.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/64.png&quot;&gt;&lt;img src=&quot;/assets/img/64.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>um lugar pertinho do céu</title>
   <link href="https://javier.io/blog/pt/2012/11/17/um-lugar-pertinho-do-ceu.html"/>
   <published>2012-11-17T00:00:00+00:00</published>
   <updated>2012-11-17T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2012/11/17/um-lugar-pertinho-do-ceu</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">um lugar pertinho do céu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2012/11/17/um-lugar-pertinho-do-ceu.html">&lt;h2 id=&quot;um-lugar-pertinho-do-céu&quot;&gt;um lugar pertinho do céu&lt;/h2&gt;

&lt;h6 id=&quot;17-nov-2012&quot;&gt;17 Nov 2012&lt;/h6&gt;

&lt;p&gt;A época de ouro do cinema mexicano consagrou uma das figuras mais importantes do México, o imortal Pedro Infante.&lt;/p&gt;

&lt;p&gt;Pedro Infante foi um ator e cantor mexicano, nasceu em Sinaloa, hoje um dos estados mais perigosos do pais, e morreu em um acidente de aviação aos 39 anos de idade.&lt;/p&gt;

&lt;p&gt;Em um lugar pertinho do céu, Pedro Infante atua no papel de Pedro Gonzáles, uma coisa curiosa dos filmes daqueles tempos é que os nomes fictícios pareciam-se muito com os verdadeiros, um imigrante que chega à cidade com muitas esperanças de conseguir um bom trabalho, mas que fica preso nas garras do sistema moderno.&lt;/p&gt;

&lt;p&gt;Um excelente filme, em caso você não seja sensível demais&lt;/p&gt;

&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/JDohULcljxM&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;[+] &lt;a href=&quot;https://www.youtube.com/watch?v=qPPafnPdI0Y&quot;&gt;Filme completo no YouTube&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>updating ubuntu for ubuntu development (precise – raring)</title>
   <link href="https://javier.io/blog/en/2012/11/03/updating-ubuntu-for-ubuntu-development-precise-raring.html"/>
   <published>2012-11-03T00:00:00+00:00</published>
   <updated>2012-11-03T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/11/03/updating-ubuntu-for-ubuntu-development-precise-raring</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">updating ubuntu for ubuntu development (precise – raring)</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/11/03/updating-ubuntu-for-ubuntu-development-precise-raring.html">&lt;h2 id=&quot;updating-ubuntu-for-ubuntu-development-precise--raring&quot;&gt;updating ubuntu for ubuntu development (precise – raring)&lt;/h2&gt;

&lt;h6 id=&quot;03-nov-2012&quot;&gt;03 Nov 2012&lt;/h6&gt;

&lt;p&gt;Another Ubuntu version is open for development and I plan to participate =) .
So in order to do it the &lt;a href=&quot;/blog/en/2011/11/23/setting-up-ubuntu-for-ubuntu-development-upgrade.html&quot;&gt;first step&lt;/a&gt; is to upgrade the environment for
raring, currently I’m working on precise so what I do is upgrade the pbuilder
conf and the virtual machine to test the packages.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir -pv $HOME/misc/packaging/ubuntu/ubuntu-13-04
$ cd $HOME/misc/packaging/ubuntu/ubuntu-13-04
$ mkdir  -pv app  diffs  isos  merge  udw
$ mkdir $HOME/misc/packaging/ubuntu/results/raring-i386
$ mkdir $HOME/misc/packaging/ubuntu/results/raring-amd64
&lt;/pre&gt;

&lt;p&gt;Once the directories are created I upgrade the pbuilder configuration, I edit
&lt;a href=&quot;https://github.com/chilicuil/dotfiles/blob/master/.pbuilderrc&quot;&gt;$HOME/.pbuilderrc&lt;/a&gt; to add “raring” to the next line:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
UBUNTU_SUITES=(&quot;raring&quot; &quot;quantal&quot; &quot;precise&quot;)
&lt;/pre&gt;

&lt;p&gt;And then I edit the file &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/autocp/completions/pbuilder&quot;&gt;&lt;strong&gt;/etc/bash_completion.d/pbuilder&lt;/strong&gt;&lt;/a&gt; to add the
line:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
[ &quot;$have&quot; ] &amp;amp;&amp;amp; complete -F _pbuilder -o filenames pbuilder \
    pbuilder.precise.amd64 pbuilder.precise.i386 pbuilder.quantal.amd64 \
    pbuilder.quantal.i386 pbuilder.raring.i386 pbuilder.raring.amd64 \
    pbuilder.sid.amd64 pbuilder.sid.i386
&lt;/pre&gt;

&lt;p&gt;When done I create the new raring setup.., however before been able to do it,
I create a link in &lt;strong&gt;/usr/share/debootstrap/scripts&lt;/strong&gt; from raring -&amp;gt; gutsy (LP
&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/debootstrap/+bug/1068707&quot;&gt;#1068707&lt;/a&gt;)&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd /usr/share/debootstrap/scripts
$ sudo ln -s gutsy raring
&lt;/pre&gt;

&lt;p&gt;After that I’m able to continue with:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ alias pbuilder.raring.i386
alias pbuilder.raring.i386=&apos;sudo DIST=raring ARCH=i386 pbuilder&apos;
$ pbuilder.raring.i386 create
$ alias pbuilder.raring.amd64
alias pbuilder.raring.amd64=&apos;sudo DIST=raring ARCH=amd64 pbuilder&apos;
$ pbuilder.raring.amd64  create
&lt;/pre&gt;

&lt;p&gt;Which will create minimal setups for raring.., now I’ll test them.., I’ll
download a package to compile it..,&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir -pv hello &amp;amp;&amp;amp; cd hello
$ bzr branch ubuntu:hello &amp;amp;&amp;amp; cd hello
$ echo bzr.debuild
alias bzr.debuild=&apos;bzr bd -- -S -uc -us&apos;
$ bzr.debuild
$ pbuilder.raring.i386 build ../hello_2.8-2.dsc
&lt;/pre&gt;

&lt;p&gt;So, after reviewing the hello_2.8-2_i386.deb file in
&lt;strong&gt;$HOME/misc/packaging/ubuntu/results/raring-i386&lt;/strong&gt; (default will be in
&lt;strong&gt;/var/cache/pbuilder/raring-i386/result/&lt;/strong&gt; ) I can mark pbuilder as done.&lt;/p&gt;

&lt;p&gt;Next step is to setup the VM.., however since no .iso is available right now,
I’ll do this step later on.., to know when I can install it from an .iso file,
I’ll be looking at &lt;a href=&quot;http://iso.qa.ubuntu.com/qatracker/milestones/243/builds&quot;&gt;http://iso.qa.ubuntu.com/qatracker/milestones/243/builds&lt;/a&gt;
.., of course I could go right now with the netboot images.., however I prefer
to wait a little bit for the ubuntu-desktop juice.&lt;/p&gt;

&lt;p&gt;I’ve setup ubuntu hours to have enough time every 2 days to work on this..,
the first one (where I updated my environment) is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=z8TWTCcCwIM&quot;&gt;https://www.youtube.com/watch?v=z8TWTCcCwIM&lt;/a&gt; //only spanish&lt;/p&gt;

&lt;p&gt;Dotfile changes:
&lt;a href=&quot;https://github.com/chilicuil/dotfiles/commit/173b3ff89de8db9ca27a20624b6ba99ad95826c7&quot;&gt;https://github.com/chilicuil/dotfiles/commit/173b3ff89de8db9ca27a20624b6ba99ad95826c7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case you’re starting from a pristine environment, you may want to install:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install gnupg pbuilder ubuntu-dev-tools bzr-builddeb apt-file git dput debhelper
&lt;/pre&gt;

&lt;p&gt;Have fun n_n/&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/11/03/updating-ubuntu-for-ubuntu-development-precise-raring/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>hour dev: sharing development - motu</title>
   <link href="https://javier.io/blog/en/2012/10/30/hour-dev-sharing-development.html"/>
   <published>2012-10-30T00:00:00+00:00</published>
   <updated>2012-10-30T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/10/30/hour-dev-sharing-development</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">hour dev: sharing development - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/10/30/hour-dev-sharing-development.html">&lt;h2 id=&quot;hour-dev-sharing-development---motu&quot;&gt;hour dev: sharing development - motu&lt;/h2&gt;

&lt;h6 id=&quot;30-oct-2012&quot;&gt;30 Oct 2012&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-hour-dev-sharing-development-1.jpg&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-hour-dev-sharing-development-1.jpg&quot; alt=&quot;Image&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the last cycle I tried to work in my community side, it was a nice
experience and well now I think it’s time to start working in more Ubuntu
technical things.&lt;/p&gt;

&lt;p&gt;So.., I’m just about starting regular Ubuntu hours for development, they’ll
not be super advanced, but I hope it’ll help me to make a frame time to work
on specific Ubuntu stuff (and learn in the process), very similar to the UGJ
concept where I could work and mix translation, testing, triaging and bugs
fixing.&lt;/p&gt;

&lt;p&gt;They’ll be google hangout sessions and will be in spanish.&lt;/p&gt;

&lt;p&gt;The first session will be in November 1st at 21:00pm (UTC-6) and will about
setting up the ubuntu development environment (update vm and pbuilder for
rairing, ubuntu 13.04).&lt;/p&gt;

&lt;p&gt;You can see the rest of the scheduled sessions in:
&lt;a href=&quot;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/teams/ubuntu-mx/events&quot;&gt;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/teams/ubuntu-mx/events&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Nada, comenzaré ‘ubuntu hours’ (un tipo de evento en ubuntu, enfocado a reunir
a personas interesadas en ubuntu por una hr en una situación informal)
enfocadas al desarrollo y a la participación con la distribución, la idea es
que sea muy parecido al UGJ, para que se puedan mezclar cosas de traduccion,
testing, clasificación y corrección de bugs.&lt;/p&gt;

&lt;p&gt;La primera sesion será el dia 1 de Noviembre a las 21:00 (UTC-6) y será sobre
configurar el entorno de desarrollo para ubuntu 13.04, raring.&lt;/p&gt;

&lt;p&gt;Pueden ver el resto de las sesiones planificadas en:
&lt;a href=&quot;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/teams/ubuntu-mx/events&quot;&gt;https://web.archive.org/web/20230822165251/https://loco.ubuntu.com/teams/ubuntu-mx/events&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;G+: &lt;a href=&quot;https://plus.google.com/116276435434146297915/posts&quot;&gt;https://plus.google.com/116276435434146297915/posts&lt;/a&gt;&lt;br /&gt;
Twitter: &lt;a href=&quot;https://twitter.com/ugjdf&quot;&gt;https://twitter.com/ugjdf&lt;/a&gt;&lt;br /&gt;
Youtube: &lt;a href=&quot;http://www.youtube.com/user/ugjmexico&quot;&gt;http://www.youtube.com/user/ugjmexico&lt;/a&gt;&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/pages/Ugjdf/100160036805985&quot;&gt;https://www.facebook.com/pages/Ugjdf/100160036805985&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NOTE: I apologize with &lt;a href=&quot;http://effiejayx.wordpress.com/2012/09/03/dia-dev-sharing-development/&quot;&gt;effiejayx&lt;/a&gt; for using its title, it’s just that it
sounded perfect&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/10/30/hour-dev-sharing-development/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>dez coisas do que eu gosto</title>
   <link href="https://javier.io/blog/pt/2012/10/18/dez-coisas-do-que-eu-gosto.html"/>
   <published>2012-10-18T00:00:00+00:00</published>
   <updated>2012-10-18T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2012/10/18/dez-coisas-do-que-eu-gosto</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">dez coisas do que eu gosto</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2012/10/18/dez-coisas-do-que-eu-gosto.html">&lt;h2 id=&quot;dez-coisas-do-que-eu-gosto&quot;&gt;dez coisas do que eu gosto&lt;/h2&gt;

&lt;h6 id=&quot;18-oct-2012&quot;&gt;18 Oct 2012&lt;/h6&gt;

&lt;p&gt;Uma lista nao extensiva:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Dormir o dia todo&lt;/li&gt;
  &lt;li&gt;Comer pepinos&lt;/li&gt;
  &lt;li&gt;Jogar com minhas orelhas&lt;/li&gt;
  &lt;li&gt;Tomar banho até que os meus dedos fiquem enrugados&lt;/li&gt;
  &lt;li&gt;Ler um livro de contos&lt;/li&gt;
  &lt;li&gt;Jogar xadrex ou futebol&lt;/li&gt;
  &lt;li&gt;Recever presentes&lt;/li&gt;
  &lt;li&gt;Ficar sozinho em um lugar que nao conheca&lt;/li&gt;
  &lt;li&gt;Navegar na Internet&lt;/li&gt;
  &lt;li&gt;Beijar garotas&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>report october/september 2012, my community side</title>
   <link href="https://javier.io/blog/en/2012/09/18/report-october-september-2012-my-community-side.html"/>
   <published>2012-09-18T00:00:00+00:00</published>
   <updated>2012-09-18T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/09/18/report-october-september-2012-my-community-side</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">report october/september 2012, my community side</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/09/18/report-october-september-2012-my-community-side.html">&lt;h2 id=&quot;report-octoberseptember-2012-my-community-side&quot;&gt;report october/september 2012, my community side&lt;/h2&gt;

&lt;h6 id=&quot;18-sep-2012&quot;&gt;18 Sep 2012&lt;/h6&gt;

&lt;p&gt;I’m still one of those kiddies dreaming every night to become an Ubuntu MOTU
member, my friend ronicardona is now dreaming in co-maintaining a debian pkg,
we’ve been dreaming together for a while and even when we know how fullish it
sounds xD, we still try to make it real. It’s just our velocity of scape who
isn’t really good, but hey, some ppl aren’t as smart as others.&lt;/p&gt;

&lt;p&gt;Anyway, lately I’ve not touched much of any ubuntu source, I’ve been
translating the ubuntu packaging &lt;a href=&quot;https://translations.launchpad.net/ubuntu-packaging-guide&quot;&gt;guide&lt;/a&gt; to spanish if that counts.
Whoever much of my free time I’ve setup for this matters have gone to my
community side, specially to the &lt;a href=&quot;https://launchpad.net/~ubuntu-classroom-es&quot;&gt;ubuntu-classroom-es&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://launchpad.net/~ubuntu-mx&quot;&gt;ubuntu-mx&lt;/a&gt;
teams. It’s something I hadn’t done and that I wanted to do for a while (it’s
somewhere in my TODO list [2]).., I think it’s something I’ve been avoiding
mostly because.., you know, machines are faster to deliver goodies than
humans.&lt;/p&gt;

&lt;p&gt;However even with the fact that I’m not the nicest person you could know, I’ve
finished some items, of course it’s helped a LOT to being an official Ubuntu
member, in general now it’s easier to other people to trust me, and as I read
somewhere else[1] it has make me feel more comfortable when talking to other
people and searching for help.&lt;/p&gt;

&lt;p&gt;Summarizing&lt;/p&gt;

&lt;p&gt;[Done] UDW &lt;a href=&quot;https://wiki.ubuntu.com/SemanaDesarrollador/Anteriores&quot;&gt;interpretation&lt;/a&gt;&lt;br /&gt;
[Done] Speaker at &lt;a href=&quot;http://irclogs.ubuntu.com/2012/06/23/%23ubuntu-charlas.html#t20:00&quot;&gt;UUD&lt;/a&gt;&lt;br /&gt;
[Done] 3rd &lt;a href=&quot;http://www.flickr.com/photos/77596230@N04/sets/72157631474806824/&quot;&gt;UGJ&lt;/a&gt;&lt;br /&gt;
[In progress] Reactivation of the &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuMxTeam/Meetings/Agenda&quot;&gt;ubuntu-mx&lt;/a&gt; team&lt;br /&gt;
[In progress] Translation of the &lt;a href=&quot;https://translations.launchpad.net/ubuntu-packaging-guide/trunk/+pots/ubuntu-packaging-guide/es/&quot;&gt;UDG&lt;/a&gt; to Spanish&lt;br /&gt;
[Todo] Work in the Ubuntu &lt;a href=&quot;https://wiki.ubuntu.com/DocumentationTeam/SystemDocumentation/UbuntuServerGuide&quot;&gt;server&lt;/a&gt; team&lt;br /&gt;
[Todo] Work in the Ubuntu metrics team&lt;/p&gt;

&lt;p&gt;It’s still fun to work with Ubuntu =)&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr branch lp:~bnrubin/+junk/lpdot
$ sudo apt-get install python-pydot
$ BROWSER=firefox ./lpdot.py chilicuil #here goes your nick
&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-report-october-september-2012-my-community-side-1.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-report-october-september-2012-my-community-side-1.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;/assets/img/viajemotu-report-october-september-2012-my-community-side-2.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-report-october-september-2012-my-community-side-2.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[1] &lt;a href=&quot;http://rafalcieslak.wordpress.com/2012/09/18/how-becoming-an-ubuntu-member-changed-my-view-on-ubuntu-community-and-vice-versa/&quot;&gt;http://rafalcieslak.wordpress.com/2012/09/18/how-becoming-an-ubuntu-member-changed-my-view-on-ubuntu-community-and-vice-versa/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[2] &lt;a href=&quot;https://wiki.ubuntu.com/~javier-lopez&quot;&gt;https://wiki.ubuntu.com/~javier-lopez&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/09/18/report-octoberseptember-2012-my-community-side/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>report ugj mexico df – 08/09/2012</title>
   <link href="https://javier.io/blog/en/2012/09/09/report-ugj-mexico-df-08-09-2012.html"/>
   <published>2012-09-09T00:00:00+00:00</published>
   <updated>2012-09-09T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/09/09/report-ugj-mexico-df-08-09-2012</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">report ugj mexico df – 08/09/2012</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/09/09/report-ugj-mexico-df-08-09-2012.html">&lt;h2 id=&quot;report-ugj-mexico-df--08092012&quot;&gt;report ugj mexico df – 08/09/2012&lt;/h2&gt;

&lt;h6 id=&quot;09-sep-2012&quot;&gt;09 Sep 2012&lt;/h6&gt;

&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;Yesterday the &lt;a href=&quot;https://launchpad.net/~ubuntu-mx&quot;&gt;ubuntu-mx&lt;/a&gt; team hosted his third UGJ, this one was very
special because it was the result of the reorganization of it. As we had been
doing lately, we annoyed again some people in the Ubuntu community (sry
&lt;a href=&quot;http://princessleia.com&quot;&gt;Elizabeth&lt;/a&gt;) and they (again) help us with advices and links to
documentation. We also want to thanks to the ubuntu-co team because of his
kidness, specially to @&lt;a href=&quot;https://web.archive.org/web/20141220055740/http://jhosman.com/es/&quot;&gt;joshman&lt;/a&gt; who stayed with us and help us to deal
with the translation activities (you rock!)&lt;/p&gt;

&lt;p&gt;The event started at 11:00 (utc-6) and finished at 18:00 which means that we
jammed for almost 7 hours =)_, we talked about juju, maas, the iso adoption
procedure, harvest, checkbox, -proposed updates and the steps to report bugs.
Of course we also talked about other unrelated and social things. Every task
was assigned a certain amount of points [1], therefore the person who won the
most points turned into our SUPER HERO of our 08-09-2012 UGJ-MX edition.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/viajemotu-report-ugj-mexico-df-08-09-2012-1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;René Gómez Legorreta (conde): 90 points&lt;/p&gt;

&lt;p&gt;It wasn’t easy, we saw a hard battle for the first spot, specially because
@&lt;a href=&quot;https://plus.google.com/100959159342504605789/posts&quot;&gt;cesar&lt;/a&gt; who was other of our ugj guests ranked 85 points! (that was
closed man!) we also had other nice people who made 60, 40 &amp;amp; 30~ points. Since
we couldn’t reach any sponsor this time we didn’t gave away godies. However
for our local hero we made available an interview on our site (in
spanish).&lt;/p&gt;

&lt;p&gt;I can’t lie, it was a great jam, if you don’t believe you can see it for
yourself:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/77596230@N04/sets/72157631474806824/&quot;&gt;http://www.flickr.com/photos/77596230@N04/sets/72157631474806824/&lt;/a&gt;&lt;/p&gt;

&lt;div style=&quot;display:flex; gap:10px; justify-content:center; flex-wrap:wrap;&quot;&gt;
&lt;img src=&quot;/assets/img/viajemotu-report-ugj-mexico-df-08-09-2012-2.jpg&quot; alt=&quot;6 X_X!, squash them!&quot; /&gt;
&lt;img src=&quot;/assets/img/viajemotu-report-ugj-mexico-df-08-09-2012-3.jpg&quot; alt=&quot;=)&quot; /&gt;
&lt;img src=&quot;/assets/img/viajemotu-report-ugj-mexico-df-08-09-2012-4.jpg&quot; alt=&quot;local team&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;[1] &lt;a href=&quot;http://tinyurl.com/points-ls&quot;&gt;http://tinyurl.com/points-ls&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/09/09/report-ugj-08-09-201/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>tropa de elite</title>
   <link href="https://javier.io/blog/pt/2012/08/19/tropa-de-elite.html"/>
   <published>2012-08-19T00:00:00+00:00</published>
   <updated>2012-08-19T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2012/08/19/tropa-de-elite</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">tropa de elite</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2012/08/19/tropa-de-elite.html">&lt;h2 id=&quot;tropa-de-elite&quot;&gt;tropa de elite&lt;/h2&gt;

&lt;h6 id=&quot;19-aug-2012&quot;&gt;19 Aug 2012&lt;/h6&gt;

&lt;p&gt;A alguns meses assisti a um filme chamado tropa de elite. É a historia de um homem que lidera um grupo fortemente armado e que sobe aos morros para matar os narcotraficantes. Gostei do filme, porque acredito que as pessoas podem olhar o outro lado da polícia, os homens honestos e com vontade de melhorar as coisas.&lt;/p&gt;

&lt;p&gt;O filme também faz um retrato interessante da sociedade do estado do Rio de Janeiro, acredito que como no México, lá a profissão precisa ser mais valorizada e os policiais melhor treinados. Da segunda parte quase não gostei, tem tintes políticos e o capitão Nascimento já não é um homem normal, mas é como um superman. Quais são os seus filmes favoritos?&lt;/p&gt;

&lt;h3 id=&quot;tropa-de-elite-1&quot;&gt;Tropa de elite 1&lt;/h3&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/i7Nm_RZvvxs&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h3 id=&quot;tropa-de-elite-2&quot;&gt;Tropa de elite 2&lt;/h3&gt;

&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/oaebu33ZBpc&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>ubuntu-mx request for help</title>
   <link href="https://javier.io/blog/en/2012/08/14/ubuntu-mx-request-for-help.html"/>
   <published>2012-08-14T00:00:00+00:00</published>
   <updated>2012-08-14T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/08/14/ubuntu-mx-request-for-help</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">ubuntu-mx request for help</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/08/14/ubuntu-mx-request-for-help.html">&lt;h2 id=&quot;ubuntu-mx-request-for-help&quot;&gt;ubuntu-mx request for help&lt;/h2&gt;

&lt;h6 id=&quot;14-aug-2012&quot;&gt;14 Aug 2012&lt;/h6&gt;

&lt;p&gt;Hi there, I forward an email from the ubuntu-mx team which I’m part of, thanks
Jono for your art of community book and Benjamin for asking&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Greetings,&lt;/p&gt;

&lt;p&gt;We are currently undergoing a reorganization process here at ubuntu-mx. We
have been pleasantly inspired by the work of ubuntu-co team, and we’re ready
to jump in.&lt;/p&gt;

&lt;p&gt;Our website, ubuntumexico.org has been updated (thanks to the ubuntu
tour team, you rock!, really) and we have also asked the members to update or
reactivate their launchpad membership, with an excellent response (at least
half of the team is still active and willing).&lt;/p&gt;

&lt;p&gt;So, we’re setting up some tasks (an exhaustive list in Spanish can be found
here: &lt;a href=&quot;https://web.archive.org/web/20120818142132/http://pad.ubuntu-uk.org:80/KhKIZ6NPr7&quot;&gt;https://web.archive.org/web/20120818142132/http://pad.ubuntu-uk.org:80/KhKIZ6NPr7&lt;/a&gt; , with an English translation
coming up). One of the main ideas we’re following up is to restart our
podcasting cycle (we called the iniciative the “Ubuntu-mx podcast Revival”).&lt;/p&gt;

&lt;p&gt;Other tasks include to participate in the UDW (with live translations) and run
our third UGJ, as well as other free software iniciatives in Latin America. Of
course, our main goal in the middle term is to be approved as an official LoCo
Team.&lt;/p&gt;

&lt;p&gt;So, you may wonder about the reason of this post, particularly, what could we
ask from you. Well, to be honest, we couldn’t help ourselves to announce that
we’re alive and ready to rumble, and ask whoever wants to help to join us. But
we are also looking for suggestions, particularly about where to host our
media contents (particularly the podcast’s episodes) and some administrative
policies that have worked for your LoCos.&lt;/p&gt;

&lt;p&gt;We’ve some ideas such as creating a launchpad.net repository (awesome for
decentralize management), using a ubuntu one account or using the
people.ubuntu.com spaces that our ubuntu members could donate.&lt;/p&gt;

&lt;p&gt;Anyways we’re open to your comments and ideas, and we thank you beforehand for
your attention.&lt;/p&gt;

&lt;p&gt;Ubuntu-mx team&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/08/14/ubuntu-mx-request-for-help/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>kernel -ck for ubuntu precise</title>
   <link href="https://javier.io/blog/en/2012/07/03/kernel-ck-for-ubuntu-1204.html"/>
   <published>2012-07-03T00:00:00+00:00</published>
   <updated>2012-07-03T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/07/03/kernel-ck-for-ubuntu-1204</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">kernel -ck for ubuntu precise</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/07/03/kernel-ck-for-ubuntu-1204.html">&lt;h2 id=&quot;kernel--ck-for-ubuntu-precise&quot;&gt;kernel -ck for ubuntu precise&lt;/h2&gt;

&lt;h6 id=&quot;03-jul-2012&quot;&gt;03 Jul 2012&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;UPDATE: 16/Jul/2014, the script was updated to compile the 3.15.5 kernel version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://ck-hack.blogspot.mx/&quot;&gt;ck&lt;/a&gt;&lt;/strong&gt; is the name for the Con Kolivas patchet which main purpose is to increment the performance for Linux in PC’s and laptops. Traditionally the kernel comes with a lot of things for enterprise environments, that’s why this patchset have some relative popularity with people who wants to improve their machine for games, multimedia and tradicional work (browsing the web, editing texts, im, etc).&lt;/p&gt;

&lt;p&gt;The steps to compile a kernel with these modifications are:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Download the vanilla kernel
Download and apply the: -bfq, -ck patchsets
Configure the kernel
Compile
Install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Fortunately some users at ubuntu-br.org have been following the -ck branch, close enough to create a script that automatize the process:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Kernel Omnislash (Unofficial) – Aprendendo a voar sem segredos!!! (learning to fly without secrets)
http://sourceforge.net/projects/scriptkernel/files/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After check it out, I’ve edited it (to avoid some errors and to add some bells and whistles) and I’ve put the result in: https://github.com/javier-lopez/learn/blob/master/sh/is/kernel-ck-ubuntu
The idea is that from time to time I check the script to see that it compiles the last -ck patchset version for the last Ubuntu LTS version. If you want to try it, run the following commands:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget https://raw.github.com/javier-lopez/learn/master/sh/is/kernel-ck-ubuntu
$ time sh kernel-ck-ubuntu
$ sudo dpkg -i ./linux-*.deb
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/59.png&quot;&gt;&lt;img src=&quot;/assets/img/59.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And reboot your system, if you don’t want to compile it yourself, I’ve build some .deb packages for amd64 and x86 😇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3.4.5&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.4.5-ck-amd64.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.4.5-ck-i386.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;3.7.1&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.7.1-ck-i386.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.7.1-ck-amd64.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;3.8.2&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.8.2-ck-amd64.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.8.2-ck-i386.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;3.9.2&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.9.2-ck-amd64.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.9.2-ck-i386.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;3.11.7&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.11.7-ck-amd64.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.11.7-ck-i386.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;3.12.1&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.12.1-ck-amd64.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.12.1-ck-i386.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;3.13.7&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.13.7-ck-i386.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.13.7-ck-amd64.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;3.14.4&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.14.4-ck-amd64.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.14.4-ck-i386.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;3.15.5&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.15.5-ck-amd64.tar.bz2&quot;&gt;amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://f.javier.io/rep/deb/3.15.5-ck-i386.tar.bz2&quot;&gt;x86&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>latex and me</title>
   <link href="https://javier.io/blog/en/2012/05/15/latex-and-me.html"/>
   <published>2012-05-15T00:00:00+00:00</published>
   <updated>2012-05-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/05/15/latex-and-me</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">latex and me</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/05/15/latex-and-me.html">&lt;h2 id=&quot;latex-and-me&quot;&gt;latex and me&lt;/h2&gt;

&lt;h6 id=&quot;15-may-2012&quot;&gt;15 May 2012&lt;/h6&gt;

&lt;p&gt;I maintain my CV in latex because it can easily generate different outputs, it’s easy to modify and I think it gives extra geeky points. In the other hand not always is easy to compile.., so I’ll write down the process to not forget it and do it faster next time.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.sharepdfbooks.com/ZZKLWWMPNYPU/template_banking_black.pdf.html&quot;&gt;&lt;img src=&quot;/assets/img/47.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ apt-get install texlive-latex-base texlive-latex-extra latex-xcolor texlive-fonts-recommended
$ wget http://mirror.ctan.org/macros/latex/contrib/moderncv.zip
$ unzip moderncv.zip
$ sudo mv moderncv /usr/share/texmf-texlive/tex/latex/
$ sudo mktexlsr
&lt;/pre&gt;

&lt;p&gt;After installing the dependencies and latex itself, the compilation process can be triggered as follows:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ latex cv.tex
&lt;/pre&gt;

&lt;p&gt;The resulting .dvi file can then be converted to a pdf file:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ dvipdfm cv.dvi
&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/2704079&quot;&gt;&lt;img src=&quot;/assets/img/48.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it seems like too much work, it can also be compiled &lt;a href=&quot;https://www.sharelatex.com&quot;&gt;online&lt;/a&gt; 😁&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>rm wrapper</title>
   <link href="https://javier.io/blog/en/2012/03/19/rm-wrapper.html"/>
   <published>2012-03-19T00:00:00+00:00</published>
   <updated>2012-03-19T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/03/19/rm-wrapper</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">rm wrapper</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/03/19/rm-wrapper.html">&lt;h2 id=&quot;rm-wrapper&quot;&gt;rm wrapper&lt;/h2&gt;

&lt;h6 id=&quot;19-mar-2012&quot;&gt;19 Mar 2012&lt;/h6&gt;

&lt;p&gt;Sometimes when I run:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ rm foo
&lt;/pre&gt;

&lt;p&gt;I realize I didn’t mean it, so with this in my mind I made a little &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/trash&quot;&gt;wrapper&lt;/a&gt; around rm, now, when I remove files, they’re send them to the trash bin, it’s compatible with nautilus/pcmanfm.&lt;/p&gt;

&lt;p&gt;Example: If I run from a terminal &lt;strong&gt;$ rm img.png&lt;/strong&gt; I can then go to the Trash carpet in Nautilus and restore it. If I delete an item with Nautilus (by pressing the &lt;strong&gt;Supr&lt;/strong&gt; button) I can open a terminal and type &lt;strong&gt;$ rm -u img.png&lt;/strong&gt; and get back my stuff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/53.png&quot;&gt;&lt;img src=&quot;/assets/img/53.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want use the script, download and move it to &lt;strong&gt;/usr/local/bin&lt;/strong&gt;, then you can use as &lt;strong&gt;rm_&lt;/strong&gt; or even override rm through and alias defined in the &lt;strong&gt;~/.bashrc&lt;/strong&gt; file:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ alias rm=&apos;trash&apos;
&lt;/pre&gt;

&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/0a5b334fd24f82bd5ede1&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt; --&gt;

&lt;p&gt;😈&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>long way to go - motu</title>
   <link href="https://javier.io/blog/en/2012/03/14/long-way-to-go.html"/>
   <published>2012-03-14T00:00:00+00:00</published>
   <updated>2012-03-14T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/03/14/long-way-to-go</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">long way to go - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/03/14/long-way-to-go.html">&lt;h2 id=&quot;long-way-to-go---motu&quot;&gt;long way to go - motu&lt;/h2&gt;

&lt;h6 id=&quot;14-mar-2012&quot;&gt;14 Mar 2012&lt;/h6&gt;

&lt;p&gt;Today I read that the MOTU team received a new member, congratulations &lt;a href=&quot;http://marcin.juszkiewicz.com.pl/&quot;&gt;Marcin
Juszkiewicz&lt;/a&gt; =)!!, this let’ me think that we (ronicardona and I) still
have a nice and long way to go, I don’t have any problem with that, I’m pretty
sure it’ll be fun =3 (the kind of fun I like), I only hope that we can help to
get involved to lots of local people in the process, I’ll copy &amp;amp; paste the log
so we can remember from time to time in what areas we should keep improving.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
=== meetingology changed the topic of #ubuntu-meeting to: Marcin
    Juszkiewicz&apos;s MOTU application
[14:07] &amp;lt;hrw&amp;gt; o/
[14:07] &amp;lt;bdrung&amp;gt; hrw: please introduce yourself
[14:07] &amp;lt;hrw&amp;gt; sure
[14:08] &amp;lt;hrw&amp;gt; I work for Linaro project. Our priority is to
        improve Linux on ARM.
[14:08] &amp;lt;hrw&amp;gt; I maintain arm(el,hf) cross compilers in Ubuntu since
        maverick (PPU for it got ~year ago)
[14:09] &amp;lt;hrw&amp;gt; in spare time or during Linaro ARM porting jams I work
        on fixing ftfbs for armel/armhf packages in Ubuntu
[14:10] &amp;lt;hrw&amp;gt; I worked on multiarching few packages to make cross
        compilation easier
[14:11] &amp;lt;hrw&amp;gt; list of ftfbs bugs which I fixed is in application
[14:11] &amp;lt;hrw&amp;gt; I think thats all - rest is in application
[14:12] &amp;lt;stgraber&amp;gt; how familiar are you with the Ubuntu release
        process and more specifically the various freezes?
[14:12] &amp;lt;hrw&amp;gt; stgraber: did FFe for cross compiler in maverick time,
        had SRU for it after maverick release.
[14:13] &amp;lt;stgraber&amp;gt; you mentioned multiarching packages, do you need
        a FFe for these if you were to do some now?
[14:14] &amp;lt;hrw&amp;gt; stgraber: until final freeze universe packages are
        allowed to be upload unless new features are added - as
        for those I usually check do I need FFe for them or not
[14:14] &amp;lt;hrw&amp;gt; stgraber: as multiarch is feature I would ask for FFe
        in such case.
[14:14] &amp;lt;stgraber&amp;gt; good :)
[14:14] &amp;lt;hrw&amp;gt; stgraber: maybe it will be decided that it may go as
        is but I prefer to be safe then sorry.
[14:15] &amp;lt;hrw&amp;gt; ofcourse before asking for FFe I check rebuild of
        packages which b-d on it
[14:15] &amp;lt;tumbleweed&amp;gt; i&apos;d say it&apos;s more a &quot;non-trivial packaging
        change&quot; than a feature, but yes, FFe is appreciated
[14:15] &amp;lt;hrw&amp;gt; otherwise it is just asking for problems
[14:15] &amp;lt;stgraber&amp;gt; hrw: are you subscribed to ubuntu-devel-announce
        and read it at least daily?
[14:15]  * tumbleweed wishes people checked reverse dependencies
        before filing FFes :P
[14:16] &amp;lt;hrw&amp;gt; stgraber: I am subscribed there. last mail was there
        at 01.03.2012
[14:16] &amp;lt;hrw&amp;gt; tumbleweed: I am used to daily builds of whole
        distributions so &apos;better safe then sorry&apos; is my second name
        ;F
[14:17] &amp;lt;hrw&amp;gt; tumbleweed: red buildbot meant &apos;drop everything and fix&apos;
[14:17] &amp;lt;hrw&amp;gt; stgraber: so, yes I read it when new mails arrive
[14:17] &amp;lt;stgraber&amp;gt; hrw: perfect
[14:17] &amp;lt;hrw&amp;gt; stgraber: also ubuntu-devel, launchpad-announce
[14:18] &amp;lt;micahg&amp;gt; hrw: is there a reason you&apos;re using your linaro
        address instead of your Ubuntu address for uploads as
        update-maintainer is set to error out on an Ubuntu address
[14:18] &amp;lt;hrw&amp;gt; and few debian lists (-arm -embedded) due to work
[14:18] &amp;lt;hrw&amp;gt; micahg: I do this as part of my Linaro work.
[14:18] &amp;lt;micahg&amp;gt; hrw: ah, ok
[14:19] &amp;lt;stgraber&amp;gt; hrw: now, let&apos;s say we are in milestone freeze
        (beta2) and you want to upload python-gevent which is a
        universe package, can you do it and if not why?
[14:19] &amp;lt;hrw&amp;gt; micahg: due years of my work for different clients I
        always used their domain on my work
[14:20] &amp;lt;hrw&amp;gt; stgraber: beta freeze means manual appoval for
        main/restricted so I could upload to universe. But as this
        is &amp;gt;beta I would first check is it worth and does it break
        something
[14:21] &amp;lt;tumbleweed&amp;gt; actually, manual approval everywhere, but
        universe uploads are waved through
[14:21] &amp;lt;micahg&amp;gt; tumbleweed: hrw: not ture :)
[14:21] &amp;lt;stgraber&amp;gt; most of universe ;)
[14:21] &amp;lt;micahg&amp;gt; *ture
[14:21] &amp;lt;micahg&amp;gt; *true
[14:21] &amp;lt;hrw&amp;gt; ops then
[14:21]  * micahg needs to fix that wiki page...
[14:21] &amp;lt;tumbleweed&amp;gt; micahg: right, there is some review
[14:21] &amp;lt;stgraber&amp;gt; hrw: so in this case, python-gevent is covered by
        the freeze even though it&apos;s in universe, do you know why?
[14:22] &amp;lt;hrw&amp;gt; stgraber: to not increase amount of possible rc bugs
[14:22] &amp;lt;stgraber&amp;gt; hrw: well, that&apos;s indeed important but that&apos;s not
        the reason :)
[14:23] &amp;lt;hrw&amp;gt; stgraber: nope
=== JanC_ is now known as JanC
[14:24] &amp;lt;tumbleweed&amp;gt; hrw: have you seen the seeded-in-ubuntu tool?
[14:24] &amp;lt;stgraber&amp;gt; python-gevent is an rdepends of python-x2go
[14:24] &amp;lt;stgraber&amp;gt; python-x2go is seeded by Edubuntu
[14:24] &amp;lt;hrw&amp;gt; tumbleweed: no, I did not
[14:24] &amp;lt;stgraber&amp;gt; and so is covered by the freeze
[14:24] &amp;lt;hrw&amp;gt; stgraber: ah. ok, now I understand
[14:24] &amp;lt;stgraber&amp;gt; anything that&apos;s in universe and seeded is covered
        by the freeze just as much as main is
[14:25] &amp;lt;stgraber&amp;gt; seeded-in-ubuntu python-gevent would indeed let you
        check this
[14:25] &amp;lt;hrw&amp;gt; thank you
[14:25] &amp;lt;hrw&amp;gt; will make use of it for my linaro seeds
[14:26] &amp;lt;tumbleweed&amp;gt; it gets its data from the most recent CD builds,
        so using it for linaro may be non-trivial
[14:26] &amp;lt;tumbleweed&amp;gt; hrw: you&apos;ve only been doing a small corner of the
        work MOTUs do (FTBFS and multi-arching) are you intending to
        broaden out? I assume you are focussing there for work reasons?
[14:26] &amp;lt;hrw&amp;gt; tumbleweed: but checking how it works and wriiting similar
        one may be useful one day
[14:27] &amp;lt;hrw&amp;gt; tumbleweed: yes, I am focusing most of my Ubuntu work on
        my work reasons.
=== smb` is now known as smb
[14:27] &amp;lt;hrw&amp;gt; tumbleweed: will use motu rights also to upload fixes done
        by coworkers. but as I lurk in #ubuntu-motu I can work on
        sponsoring other people
[14:28] &amp;lt;tumbleweed&amp;gt; great to hear
[14:28] &amp;lt;tumbleweed&amp;gt; if you come across an area you aren&apos;t already
        familiar with, you&apos;d ask for help?
[14:28] &amp;lt;hrw&amp;gt; motu is not ppu - there are some duties attached
[14:28] &amp;lt;hrw&amp;gt; tumbleweed: yes, I would
[14:28] &amp;lt;tumbleweed&amp;gt; well, no duties, but we are a community
[14:29] &amp;lt;hrw&amp;gt; tumbleweed: trying to find way in darkness can hurt
        so it is better to ask
[14:29] &amp;lt;tumbleweed&amp;gt; if you are unsure, at least
[14:29] &amp;lt;tumbleweed&amp;gt; I&apos;m done here, I think
[14:29] &amp;lt;hrw&amp;gt; tumbleweed: English is not my native. duties as &apos;will
        be nice to help others due to increased permissions&apos;
[14:30] &amp;lt;bdrung&amp;gt; hi, i am back. i had an issue with my internet
        connection.
[14:30] &amp;lt;bdrung&amp;gt; sorry for that.
[14:31] &amp;lt;micahg&amp;gt; hrw: how do you ensure that all changelogs between
        the version in the Ubuntu archive and a merge from Debian
        are present when uploading?
[14:31] &amp;lt;hrw&amp;gt; micahg: I use debdiff + gvim(diff) when merge such ones.
[14:32] &amp;lt;tumbleweed&amp;gt; micahg: I don&apos;t think hrw has uploaded a merge yet
[14:32] &amp;lt;hrw&amp;gt; micahg: I know that merge-changelog exists
[14:32] &amp;lt;hrw&amp;gt; tumbleweed: dpkg-cross
[14:33] &amp;lt;tumbleweed&amp;gt; ah
[14:33] &amp;lt;hrw&amp;gt; tumbleweed: 2.6.2 and 2.6.5
[14:33] &amp;lt;hrw&amp;gt; I am also doing merges for few ppa only packages
[14:33] &amp;lt;micahg&amp;gt; hrw: yes, but you didn&apos;t upload those :), sorry, I
        guess you probably won&apos;t be able to answer the question
[14:34] &amp;lt;micahg&amp;gt; that&apos;s ok though :)
[14:34] &amp;lt;hrw&amp;gt; micahg: they were sponsored from my debdiffs ;)
[14:34] &amp;lt;micahg&amp;gt; hrw: right, but this is something to check with the
        source package before upload or during generation and not
        the diff
[14:34] &amp;lt;hrw&amp;gt; ok
[14:36] &amp;lt;hrw&amp;gt; I had issues with bzr merging of changelogs and due
        to that reverted to do it by hand in gvim. gcc-x.y have
        changelog not compatible with current Debian policies
[14:37] &amp;lt;micahg&amp;gt; hrw: bzr-builddeb also has issues generating a
        proper source.changes file with all the changelog entries
        needed in it
[14:38] &amp;lt;hrw&amp;gt; micahg: I am not a fan of bzr anyway. But know how
        to use it
[14:38] &amp;lt;stgraber&amp;gt; micahg: &quot;bzr bd -S -- -sa -v&amp;lt;version&amp;gt;&quot; usually
        works fine here
[14:38] &amp;lt;micahg&amp;gt; stgraber: yes, but you need the -v, not just
        --package-merge
[14:38] &amp;lt;stgraber&amp;gt; micahg: right, I just don&apos;t trust
        --package-merge ;)
[14:40] &amp;lt;micahg&amp;gt; hrw: BTW, it&apos;s that -v option you need when merging
        to generate a source.changes with all the appropriate
        changelog entries and then they get sent to the -changes list
[14:40] &amp;lt;hrw&amp;gt; micahg: thanks
[14:40] &amp;lt;micahg&amp;gt; the merge-package scripts from a merge can do this
        for you in most cases
[14:41] &amp;lt;micahg&amp;gt; * from merges.ubuntu.com
[14:41] &amp;lt;tumbleweed&amp;gt; it&apos;s also mentioned in the Merging wiki page
[14:41] &amp;lt;hrw&amp;gt; used merges.ubuntu.com few times already
[14:42] &amp;lt;hrw&amp;gt; mostly for dpkg-cross work but also took a look there
        on other packages few times
[14:44] &amp;lt;micahg&amp;gt; hrw: do you have an interest in Debian?
[14:45] &amp;lt;hrw&amp;gt; micahg: I used Debian since 2000 to 2010 when I
        switched to Ubuntu due to being hired by Canonical to work
        on Linaro.
[14:45] &amp;lt;micahg&amp;gt; hrw: so, are you familiar with forwarding patches
        to their BTS?
[14:46] &amp;lt;hrw&amp;gt; micahg: yes, send patch to upstream is always useful
[14:47] &amp;lt;Laney&amp;gt; are Debian&apos;s arm ports much different from ours at
        the individual package level?
[14:47] &amp;lt;micahg&amp;gt; hrw: have you looked at getting your cross compilers
        into Debian or is that not possible/relevant for Debian?
[14:48] &amp;lt;hrw&amp;gt; Laney: Debian/armel is armv4t when Ubuntu one is
        armv7-a. armhf are same
[14:48] &amp;lt;bdrung&amp;gt; hrw: which arm version is needed for armhf?
[14:48] &amp;lt;hrw&amp;gt; micahg: I am working on it. we (Emdebian guys and me)
        decided that it will be more useful to get cross build-deps
        support and then proper multiarch buildable cross compiler
        instead of current ubuntu one
[14:49] &amp;lt;hrw&amp;gt; bdrung: armv7-a which mean cortex-a5/7/8/9/15 and
        compatible cores
[14:49] &amp;lt;hrw&amp;gt; bdrung: neon support is not required, vfp3d16 is what
        all arm7a chips have
[14:50] &amp;lt;hrw&amp;gt; micahg: multiarch buildable cross is &amp;lt;1h of work
        from my packages (+build time)
[14:51] &amp;lt;hrw&amp;gt; micahg: some changes will be needed in gcc-4.x
        probably but I had my hands there so many times...
[14:51] &amp;lt;ScottK&amp;gt; FWIW, I&apos;ve worked with hrw on some arm porting
        issues (don&apos;t recall if I ended up sponsoring the uploads
        or not) and I found him very pleasant to work with.
[14:51] &amp;lt;hrw&amp;gt; ScottK: thanks
[14:52] &amp;lt;bdrung&amp;gt; any ready to vote or are there still open questions?
[14:52] &amp;lt;hrw&amp;gt; ScottK: it was soemthing with Qt problems. they got
        solved by ubuntu.arm and linaro teams iirc and then
        ubuntu/arm team did uploads
[14:52] &amp;lt;stgraber&amp;gt; I&apos;m ready to vote
[14:53] &amp;lt;micahg&amp;gt; ready to vote
[14:54] &amp;lt;tumbleweed&amp;gt; when can I get an arm board with &amp;gt;=2G of RAM?
[14:54] &amp;lt;tumbleweed&amp;gt; also ready
[14:54] &amp;lt;Laney&amp;gt; lets go
[14:54] &amp;lt;hrw&amp;gt; tumbleweed: there are such ones already.
[14:54] &amp;lt;tumbleweed&amp;gt; hrw: affordable?
[14:55] &amp;lt;hrw&amp;gt; tumbleweed: depends on definition of &apos;affordable&apos;
[14:55] &amp;lt;bdrung&amp;gt; [VOTE] Should Marcin Juszkiewicz become MOTU?
[14:55] &amp;lt;meetingology&amp;gt; Please vote on: Should Marcin Juszkiewicz
        become MOTU?
[14:55] &amp;lt;meetingology&amp;gt; Public votes can be registered by saying +1,
        +0 or -1 in channel, (private votes
        don&apos;t work yet, but when they do it will be by messaging
        the channel followed by +1/-1/+0 to me)
[14:55] &amp;lt;tumbleweed&amp;gt; +1
[14:55] &amp;lt;meetingology&amp;gt; +1 received from tumbleweed
[14:55] &amp;lt;Laney&amp;gt; +1
[14:55] &amp;lt;meetingology&amp;gt; +1 received from Laney
[14:55] &amp;lt;hrw&amp;gt; tumbleweed: at last linaro connect I played with
        marvell board. quad a9, 4gb ddr3, 7xpcie x4 slots, 2 sata
        ports, 4x GbE - atx size beast
[14:55] &amp;lt;stgraber&amp;gt; +1
[14:55] &amp;lt;meetingology&amp;gt; +1 received from stgraber
[14:56] &amp;lt;bdrung&amp;gt; +1
[14:56] &amp;lt;meetingology&amp;gt; +1 received from bdrung
[14:56] &amp;lt;tumbleweed&amp;gt; hrw: nice
[14:57] &amp;lt;micahg&amp;gt; +1 would have liked to see more merges, but has
        been very responsive to comments in bugs
[14:57] &amp;lt;meetingology&amp;gt; +1 would have liked to see more merges, but
        has been very responsive to comments in bugs received from
        micahg
[14:57] &amp;lt;hrw&amp;gt; tumbleweed: or rather quad &apos;a9 compatible cores&apos;
[14:57] &amp;lt;bdrung&amp;gt; [ENDVOTE]
[14:57] &amp;lt;meetingology&amp;gt; Voting ended on: Should Marcin Juszkiewicz
        become MOTU?
[14:57] &amp;lt;meetingology&amp;gt; Votes for:5 Votes against:0 Abstentions:0
[14:57] &amp;lt;meetingology&amp;gt; Motion carried
[14:57] &amp;lt;tumbleweed&amp;gt; hrw: as a community (hobby) ubuntu developer,
        affordable means &quot;really cheap&quot;
[14:57] &amp;lt;tumbleweed&amp;gt; hrw: congrats, welcome to MOTU
[14:58] &amp;lt;hrw&amp;gt; tumbleweed: then no. ram is most expensive part usually
[14:58] &amp;lt;dholbach&amp;gt; congratulations hrw!
[14:58] &amp;lt;hrw&amp;gt; thanks a lot guys!
[14:58] &amp;lt;bdrung&amp;gt; hrw: congrats
&lt;/pre&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/03/14/long-way-to-go/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>vim autocompletion in debian/changelog</title>
   <link href="https://javier.io/blog/en/2012/03/11/vim-autocompletion-in-debian-changelog.html"/>
   <published>2012-03-11T00:00:00+00:00</published>
   <updated>2012-03-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/03/11/vim-autocompletion-in-debian-changelog</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">vim autocompletion in debian/changelog</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/03/11/vim-autocompletion-in-debian-changelog.html">&lt;h2 id=&quot;vim-autocompletion-in-debianchangelog&quot;&gt;vim autocompletion in debian/changelog&lt;/h2&gt;

&lt;h6 id=&quot;11-mar-2012&quot;&gt;11 Mar 2012&lt;/h6&gt;

&lt;p&gt;So I was testing hooks functionality in pbuilder, and from one link to another
I found that vim (at least the vim version that comes with Ubuntu) is able to
autocomplete LP: # bugs!&lt;/p&gt;

&lt;p&gt;To use it:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ vim debian/changelog or $ dch -i
&lt;/pre&gt;

&lt;p&gt;And then in “LP: #” press Ctrl-x Ctrl-o and it will provide with a list of
open bugs of the current package =)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-vim-autocompletion-in-debian-changelog-1.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-vim-autocompletion-in-debian-changelog-1.png&quot; alt=&quot;Image&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seems like it’s been a while since this little hack was made:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20100911131524/http://www.chiark.greenend.org.uk:80/ucgi/~cjwatson/blosxom/2008/01/31&quot;&gt;https://web.archive.org/web/20100911131524/http://www.chiark.greenend.org.uk:80/ucgi/~cjwatson/blosxom/2008/01/31&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://tinyurl.com/7es2j48&quot;&gt;http://tinyurl.com/7es2j48&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/03/11/vim-autocompletion-in-debianchangelog-6/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>online partners</title>
   <link href="https://javier.io/blog/en/2012/03/11/online-partners.html"/>
   <published>2012-03-11T00:00:00+00:00</published>
   <updated>2012-03-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/03/11/online-partners</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">online partners</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/03/11/online-partners.html">&lt;h2 id=&quot;online-partners&quot;&gt;online partners&lt;/h2&gt;

&lt;h6 id=&quot;11-mar-2012&quot;&gt;11 Mar 2012&lt;/h6&gt;

&lt;p&gt;For one reason or another I find more reliable remote people, I mean, whatever I make a new friendship it’s almost always the case that if I made it online it will last more time and will often of better quality, I suppose that’s because when you’re behind a screen, your acts are premeditated, you think better what you say and how to react to what people say to you. There are no “I’m moving somewhere else”, because there is no place without Internet!, and depending on your Internet addiction you can even end talking more with them than with other local people.&lt;/p&gt;

&lt;p&gt;Nothing, I appreciate online partners 😌&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>out of office</title>
   <link href="https://javier.io/blog/en/2012/03/03/out-of-office.html"/>
   <published>2012-03-03T00:00:00+00:00</published>
   <updated>2012-03-03T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/03/03/out-of-office</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">out of office</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/03/03/out-of-office.html">&lt;h2 id=&quot;out-of-office&quot;&gt;out of office&lt;/h2&gt;

&lt;h6 id=&quot;03-mar-2012&quot;&gt;03 Mar 2012&lt;/h6&gt;

&lt;p&gt;I’ve just finished some &lt;a href=&quot;http://www.youtube.com/user/ugjmexico&quot;&gt;videos&lt;/a&gt; for the UGJ, I spend almost all my day walking in Mexico city downtown looking at buildings and buying stuff, I took a cup of coffe with &lt;a href=&quot;http://xakemix.wordpress.com/&quot;&gt;Akemi&lt;/a&gt; and shaved my beard before going to bed 😢&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>with good luck!</title>
   <link href="https://javier.io/blog/en/2012/02/24/with-good-luck.html"/>
   <published>2012-02-24T00:00:00+00:00</published>
   <updated>2012-02-24T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/02/24/with-good-luck</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">with good luck!</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/02/24/with-good-luck.html">&lt;h2 id=&quot;with-good-luck&quot;&gt;with good luck!&lt;/h2&gt;

&lt;h6 id=&quot;24-feb-2012&quot;&gt;24 Feb 2012&lt;/h6&gt;

&lt;p&gt;I hate banks!, today I lost my morning trying to use paypal through my &lt;a href=&quot;https://web.archive.org/web/20260822050737/https://www.banorte.com/&quot;&gt;banorte&lt;/a&gt; account, however at the end I was able to buy my gift for &lt;a href=&quot;http://mwkdoll.blogspot.com/&quot;&gt;Mwkdoll&lt;/a&gt; =)! (a domain name) I hope she like it, she is one of the smartest girls I know…, I’ve also found a little jewel “&lt;a href=&quot;http://www.estantevirtual.com.br/formaseletras/Hans-Staden-Meu-Cativeiro-Entre-os-Selvagens-do-Brasil-48243284&quot;&gt;meu cativeiro entre os selvagens do brasil&lt;/a&gt;” (my captivity among the savages of Brazil) from “hans staden”, I’ve looked at most of the biggest libraries here and I’ve only found 2 portuguese books, this one in the street for only 1 dollar!! yeeei.&lt;/p&gt;

&lt;p&gt;Good luck!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ubuntu membership ((((\n____n/)))) yeeei!</title>
   <link href="https://javier.io/blog/en/2012/02/20/ubuntu-membership.html"/>
   <published>2012-02-20T00:00:00+00:00</published>
   <updated>2012-02-20T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/02/20/ubuntu-membership</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">ubuntu membership ((((\n____n/)))) yeeei!</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/02/20/ubuntu-membership.html">&lt;h2 id=&quot;ubuntu-membership-n____n-yeeei&quot;&gt;ubuntu membership ((((\n____n/)))) yeeei!&lt;/h2&gt;

&lt;h6 id=&quot;20-feb-2012&quot;&gt;20 Feb 2012&lt;/h6&gt;

&lt;p&gt;Every month at the 3rd Thursday the &lt;a href=&quot;https://wiki.ubuntu.com/Membership/RegionalBoards/Americas&quot;&gt;Americas&lt;/a&gt; regional board stand by at
#ubuntu-meeting and vote for hopefully approve a new ubuntu member, this is
one of the 3 regional boards existent, the others one are EMEA (europa-middle-
east-africa) and AsiaOceania, being an ubuntu member entitles some benefits
such as voting in nominal community councils, having an @ubuntu.com alias
(which is really neat), syndication at the ubuntu planet, and &lt;a href=&quot;https://wiki.ubuntu.com/Membership&quot;&gt;so on&lt;/a&gt;, it
also help to get in touch with awesome people involved in one of the more
excited projects of the moment ~__~.&lt;/p&gt;

&lt;p&gt;Last week the board revised my application which I send it 1 month ago to
being able to post in the planet, so I could promote our next &lt;a href=&quot;loco.ubuntu.com/events/ubuntu-mx/1532/detail/&quot;&gt;UGJ-df&lt;/a&gt;
}=), to show myself a real progress (I hope to obtain upload rights to the
archive soon, muahahah, and later, cofcof, hug dholbach &amp;gt;&lt;em&gt;__&lt;/em&gt;&amp;lt;/) and also to
feel me a little more comfortable while taking about Ubuntu, jeje, I mean, a
random guy taking about triaging/fixing bugs?, it’s cool, at least that’s how
I’d see it, but having a membership definitely will help me to talk to more
people in my area, not sure why but council members don’t look very open here
=S. I’d like to help as many people as possibly to become ubuntu members, it’s
not difficult at all, we need them and it’s fun! I will recur to dirty
icecream bribery if necessary, yeah, I’m evil!!!!!&lt;/p&gt;

&lt;p&gt;So, it wasn’t as scary as I though, I was a little nervous, mainly because I
know how bad my English is xD, aaaw!, however the people in there were very
kind, I just had to present myself and link to my wiki &amp;amp; lp profiles, they did
the rest, and at the end of the session I could count myself as one of the
pack n.n&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2012/02/20/ubuntu-membership-n____n-yeeei/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>clipboard synchronization between X11 and gnome apps</title>
   <link href="https://javier.io/blog/en/2012/02/20/clipboard-synchronization-x-gnome.html"/>
   <published>2012-02-20T00:00:00+00:00</published>
   <updated>2012-02-20T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/02/20/clipboard-synchronization-x-gnome</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">clipboard synchronization between X11 and gnome apps</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/02/20/clipboard-synchronization-x-gnome.html">&lt;h2 id=&quot;clipboard-synchronization-between-x11-and-gnome-apps&quot;&gt;clipboard synchronization between X11 and gnome apps&lt;/h2&gt;

&lt;h6 id=&quot;20-feb-2012&quot;&gt;20 Feb 2012&lt;/h6&gt;

&lt;p&gt;By default X11 powered systems have at least &lt;a href=&quot;http://en.wikipedia.org/wiki/X_Window_selection#Clipboard&quot;&gt;two different clipboards&lt;/a&gt; which may cause confusion sometimes 😖&lt;/p&gt;

&lt;p&gt;There is no way to disable/delete them, so the next best solution is to synchronizate them. &lt;a href=&quot;http://www.nongnu.org/autocutsel/&quot;&gt;Autocutsel&lt;/a&gt; is a free cli utility who can do this. It works by adding it to the &lt;strong&gt;~/.xsession&lt;/strong&gt; file or any other initialization file your windows system execute:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ autocutsel -fork #sync between X and Gnome apps
$ autocutsel -selection PRIMARY -fork #sync between Gnome apps and X
&lt;/pre&gt;

&lt;p&gt;Happy copy/pasting ☻&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>bash autocompletion</title>
   <link href="https://javier.io/blog/en/2012/01/01/bash-autocompletion.html"/>
   <published>2012-01-01T00:00:00+00:00</published>
   <updated>2012-01-01T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2012/01/01/bash-autocompletion</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">bash autocompletion</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2012/01/01/bash-autocompletion.html">&lt;h2 id=&quot;bash-autocompletion&quot;&gt;bash autocompletion&lt;/h2&gt;

&lt;h6 id=&quot;01-jan-2012&quot;&gt;01 Jan 2012&lt;/h6&gt;

&lt;!--**[![](/assets/img/54.jpg)](/assets/img/54.jpg)**--&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; It’s highly recommended to upgrade &lt;a href=&quot;/blog/en/2013/10/16/upgrade-to-bash-completion-2-0.html&quot;&gt;bash-completion&lt;/a&gt; to version &amp;gt;= 2.0 for an improved performance.&lt;/p&gt;

&lt;p&gt;I really like minimalism systems (and cli apps), they are faster, more stable and easier to control. I think it’s pretty cool to be able to write a command and get without hesitation a result (I’m aware I’m probably already deprecated, in a world where touch and gui applications are the norm, who would still prefer text based systems?). Sadly many of these commands are not especially user friendly, they contain tons of options and sometimes these options are quite hard to write correctly, when you download scripts from Internet it gets worse, all options must be written by hand because the lack autocompletion.&lt;/p&gt;

&lt;p&gt;Many people don’t realize this autocompletion magic work by programming simple bash scripts, so I decided to write a few notes about the process.&lt;/p&gt;

&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Bash triage autocompletion every time an user press &lt;strong&gt;&amp;lt;Tab&amp;gt;&amp;lt;Tab&amp;gt;&lt;/strong&gt;, for most simple commands a single call to &lt;strong&gt;complete&lt;/strong&gt; would be enough to generate correct alternatives. Let’s suppose &lt;strong&gt;foo&lt;/strong&gt; is a command who only take directories as arguments, the autocompletion logic can be described as:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ complete -o plusdirs foo
&lt;/pre&gt;

&lt;p&gt;From then on &lt;strong&gt;$ foo &amp;lt;Tab&amp;gt;&amp;lt;Tab&amp;gt;&lt;/strong&gt; will return a directory list, that one was easy 😉 Now, let’s give more examples:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ complete -A user bar #will autocomplete bar with a list of system users
$ complete -W &quot;-v --verbose -h&quot; wop #will autocomplete wop with &quot;-v&quot;, &quot;--verbose&quot; and &quot;-h&quot;
$ complete -f -X &apos;!*.[pP][dD][fF]&apos; evince foo #will autocomplete evince and foo with all pdf files
&lt;/pre&gt;

&lt;p&gt;The full syntax for &lt;strong&gt;complete&lt;/strong&gt; can be reviewed in the bash help, &lt;strong&gt;$ man bash&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;function-based&quot;&gt;Function based&lt;/h3&gt;

&lt;p&gt;One of the options &lt;strong&gt;complete&lt;/strong&gt; accept is &lt;strong&gt;-F&lt;/strong&gt; who calls a function, this function can be programmed at any length ✌ e.g:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ source file_where_pump_function_is_defined
$ complete -F \_pump pump
&lt;/pre&gt;

&lt;p&gt;Now whenever pump is typed followed by &amp;lt;Tab&amp;gt;&amp;lt;Tab&amp;gt; &lt;strong&gt;_primp()&lt;/strong&gt; will be called and will require to fill the &lt;a href=&quot;https://web.archive.org/web/20260728065230/https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html&quot;&gt;COMPREPLY&lt;/a&gt; array.&lt;/p&gt;

&lt;p&gt;Most of the files who contain these functions live in &lt;strong&gt;/etc/bash_completion.d/&lt;/strong&gt; and in recent years in &lt;strong&gt;/usr/share/bash-completion/completions/&lt;/strong&gt; (in Debian/Ubuntu systems), let’s suppose we’ve the following hand made script:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ fix -h
Usage: fix module
   -h  or --help     List available arguments and usage (this message).
   -v  or --version  print version.
   apache            poves /etc/init.d/apache2.1 to apache2.
   ipw2200           restart the ipw2200 module.
   wl                restart the wl module.
   iwlagn            restart the iwlagn module.
   mpd               restart mpd.
&lt;/pre&gt;

&lt;p&gt;The autocompletion logic can be defined in two ways, the easiest one would be to dump the following line in &lt;strong&gt;/etc/bash_completion.d/fix.autocp&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ complete -W &quot;-h --help -v --version apache ipw2200 wl iwlagn mpd&quot; fix
&lt;/pre&gt;

&lt;p&gt;After doing, it would be necessary to reload the environment:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ source $HOME/.bashrc
&lt;/pre&gt;

&lt;p&gt;WARNING: autocompletion will only work if it’s initialized in &lt;strong&gt;$HOME/.bashrc&lt;/strong&gt; or other files read by bash (it also must be installed $ sudo apt-get install bash-completion):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
if [ -f /etc/bash_completion ]; then
    source /etc/bash_completion
fi
&lt;/pre&gt;

&lt;p&gt;The more elaborated case would involve defining a function, let’s replace the &lt;strong&gt;/etc/bash_completion.d/fix.autocp&lt;/strong&gt; content with this:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
\_fix()
{

    if ! command -v &quot;fix&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
        return
    fi

    #defining local vars
    local cur prev words cword
    _init_completion || return #comment this line for bash-completion &amp;lt;2.0

    cur=&quot;${COMP_WORDS[COMP_CWORD]}&quot;
    prev=&quot;${COMP_WORDS[COMP_CWORD-1]}&quot;

    COMPREPLY=() #clean out last completions, important!

    COMMANDS=&quot;apache ipw2200 wl iwlagn mpd&quot;
    OPTS=&quot;-h --help -v --version&quot;

    case &quot;${cur}&quot; in #if the current word have a &apos;-&apos; at the beginning..
        -*) completions=&quot;${OPTS}&quot;     ;;
        *)  completions=&quot;${COMMANDS}&quot; ;;
    esac
    COMPREPLY=($(compgen -W &quot;${completions}&quot; -- ${cur}))
    return 0
}
complete -F \_fix fix
&lt;/pre&gt;

&lt;p&gt;The &lt;strong&gt;$cur&lt;/strong&gt; variable is important, parameters would be compared against it, in more complex examples, &lt;strong&gt;$prev&lt;/strong&gt; and even &lt;strong&gt;$prev_prev&lt;/strong&gt; can be compared.&lt;/p&gt;

&lt;p&gt;To generate option lists, &lt;strong&gt;compgen&lt;/strong&gt; is used regularly, this command compare and return matched results as a list, to wrap it up, here are some examples:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ compgen -W &quot;-v --verbose -h --help&quot; -- &quot;-v&quot;
-v
$ compgen -W &quot;-v --verbose -h --help&quot; -- &quot;--&quot;
--verbose
--help
$ compgen -W &quot;apache ipw2200 iwlagn mpd wl&quot; -- &quot;ap&quot;
apache
$ compgen -W &quot;apache ipw2200 iwlagn mpd wl&quot; -- &quot;i&quot;
ipw2200
iwlagn
&lt;/pre&gt;

&lt;p&gt;Once this two step process is understood it’s easy to see how most autocomplation scripts work. I’ll review a more complex example, &lt;strong&gt;android&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ android -h
  Usage: android [global options] action [action options]
  Global options:
      -v --verbose  Verbose mode: errors, warnings and informational messages are printed.
      -h --help     Help on a specific command.
      -s --silent   Silent mode: only errors are printed out.
  Valid actions are composed of a verb and an optional direct object:
      -   list
      -   list avd
      -   list target
      - create avd
      -   move avd
      - delete avd
      - update avd
      - create project
      - update project
      - create test-project
      - update test-project
      - create lib-project
      - update lib-project
      - update adb
      - update sdk
&lt;/pre&gt;

&lt;p&gt;As it can be noted most options depend of a previous command, “avd” should only be returned when list is used as an action:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ android list[Tab][Tab]
&lt;/pre&gt;

&lt;p&gt;And &lt;strong&gt;avd&lt;/strong&gt;/&lt;strong&gt;target&lt;/strong&gt; should be returned when no substring is present after list&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ android create[Tab][Tab]
&lt;/pre&gt;

&lt;p&gt;Should return &lt;strong&gt;avd&lt;/strong&gt;, &lt;strong&gt;project&lt;/strong&gt;, &lt;strong&gt;test-project&lt;/strong&gt; and &lt;strong&gt;lib-project&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ android create avd[Tab][Tab]
&lt;/pre&gt;

&lt;p&gt;And &lt;strong&gt;-a&lt;/strong&gt;, &lt;strong&gt;-c&lt;/strong&gt;, &lt;strong&gt;-f&lt;/strong&gt;, etc, should be returned when avd and create are the first parameters. The full autocompletion file for this example is located in &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/autocp/completions/android&quot;&gt;github&lt;/a&gt;, I’ll explain now the more important parts:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
\_android()
{
    if ! command -v &quot;android&quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
        return
    fi
    COMPREPLY=() #clean out last completions, important!
    cur=&quot;${COMP_WORDS[COMP_CWORD]}&quot;
    prev=&quot;${COMP_WORDS[COMP_CWORD-1]}&quot;
    number_of_words=${#COMP_WORDS[@]}

    if [ &quot;${number_of_words}&quot; -gt &quot;2&quot; ]]; then
        prev_prev=&quot;${COMP_WORDS[COMP_CWORD-2]}&quot;
    fi
&lt;/pre&gt;

&lt;p&gt;A &lt;strong&gt;prev_prev&lt;/strong&gt; variable is declared only when two or more arguments are written in the prompt.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
#=======================================================
#                  General options
#=======================================================
COMMANDS=&quot;list create move delete update&quot;
#COMMANDS=`android -h | grep &apos;^-&apos; | sed -r &apos;s/: .*//&apos; \
           | awk &apos;{print $2}&apos; | sort | uniq 2&amp;gt; /dev/null`
&lt;/pre&gt;

&lt;p&gt;List options can be declared fixed or generated at run time by parsing help screens, depending of the command you can use whenever method feels more comfortable.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
OPTS=&quot;-h --help -v --verbose -s --silent&quot;
#=======================================================
#                   Nested options [1st layer]
#=======================================================
list_opts=&quot;avd target&quot;
create_opts=&quot;avd project test-project lib-project&quot;
move_opts=&quot;avd&quot;...
&lt;/pre&gt;

&lt;p&gt;The same can be set for subcommands&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
#=======================================================
#                   Nested options [2nd layer]
#=======================================================
create_avd_opts=&quot;-c --sdcard -t --target -n --name -a \
                 --snapshot -p --path -f -s --skin&quot;
create_project_opts=&quot;-n --name -t --target -p --path -k \
                     --package -a --activity&quot;
create_test-project_opts=&quot;-p --path -m --main -n --name&quot;
create_lib-project_opts=&quot;-n --name -p --path -t --target \
                         -k --package&quot;...
&lt;/pre&gt;

&lt;p&gt;And subcommand options…&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
if [ -n &quot;${prev_prev}&quot; ]; then
#2nd layer
case &quot;${prev_prev}&quot; in
  create)
    case &quot;${prev}&quot; in
      avd)
         COMPREPLY=($(compgen -W &quot;${create_avd_opts}&quot; -- ${cur}))
         return 0
         ;;
      project)
         COMPREPLY=($(compgen -W &quot;${create_project_opts}&quot; -- ${cur}))
         return 0
         ;;
         ...
 esac
&lt;/pre&gt;

&lt;p&gt;Depending in &lt;strong&gt;$prev_prev&lt;/strong&gt;, &lt;strong&gt;$prev&lt;/strong&gt; and &lt;strong&gt;$cur&lt;/strong&gt; the correct list will be return, &lt;strong&gt;$ android subcomand option incomplete_option#CURSOR#&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
case &quot;${prev}&quot; in
    ##1st layer
    list)
        COMPREPLY=($(compgen -W &quot;${list_opts}&quot; -- ${cur}))
        return 0
        ;;
    create)
        COMPREPLY=($(compgen -W &quot;${create_opts}&quot; -- ${cur}))
        return 0
        ;;
    ...
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;$ android subcommand incomplete_option#CURSOR#&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
      #general options
      case &quot;${cur}&quot; in
         -*)
             COMPREPLY=($(compgen -W &quot;${OPTS}&quot; -- ${cur}))
             ;;
         *)
             COMPREPLY=($(compgen -W &quot;${COMMANDS}&quot; -- ${cur}))
             ;;
      esac
}
complete -F \_android android
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;$ android incomplete_subcommand#CURSOR#&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;extra&quot;&gt;Extra&lt;/h3&gt;

&lt;h4 id=&quot;available-functions&quot;&gt;Available functions&lt;/h4&gt;

&lt;p&gt;There exist plenty of available functions who can be used to autocomplete commonly used options, for example, if a command accepts a &lt;strong&gt;-f&lt;/strong&gt; option for file arguments, the &lt;strong&gt;_filedir&lt;/strong&gt; function can be used:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
-f)
    \_filedir
    return 0
    ;;
&lt;/pre&gt;

&lt;p&gt;Other pre-defined functions can be found at: &lt;a href=&quot;http://anonscm.debian.org/gitweb/?p=bash-completion/bash-completion.git;a=blob;f=bash_completion&quot;&gt;http://anonscm.debian.org/gitweb/?p=bash-completion/bash-completion.git;a=blob;f=bash_completion&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;debug&quot;&gt;Debug&lt;/h3&gt;

&lt;p&gt;Bash autocompletion scripts are easy to create, however eventually (especially with larger cli commands) there are chances things doesn’t work as expected, in those cases enabling bash verbose mode is the easiest and faster method to debug such scripts:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ set -x
$ source ~/.bashrc #reload the environment
$ command opc[Tab][Tab] #testing the autocompletion
...
...
... verbose output
&lt;/pre&gt;

&lt;h3 id=&quot;examples&quot;&gt;Examples&lt;/h3&gt;

&lt;p&gt;There are many bash completion scripts in &lt;a href=&quot;http://anonscm.debian.org/gitweb/?p=bash-completion/bash-completion.git;a=tree;f=completions&quot;&gt;Internet&lt;/a&gt; and &lt;a href=&quot;https://github.com/javier-lopez/learn/tree/master/autocp/completions&quot;&gt;some others&lt;/a&gt; in my personal repository. Looking at examples is probably the easiest way to learn the harder details.&lt;/p&gt;

&lt;h3 id=&quot;final-thoughts&quot;&gt;Final thoughts&lt;/h3&gt;

&lt;p&gt;Bash autocompletion may seems scary at the beginning but once several examples are read a clear pattern can be dazzled, depending on your system usage they can save you a lot of time/typing, so next time you find yourself writing to much give them a shot and let the computer do the job for you 😊&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://bash-completion.alioth.debian.org/&quot;&gt;http://bash-completion.alioth.debian.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>soporte técnico de steren</title>
   <link href="https://javier.io/blog/es/2011/12/11/soporte-tecnico-steren.html"/>
   <published>2011-12-11T00:00:00+00:00</published>
   <updated>2011-12-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2011/12/11/soporte-tecnico-steren</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">soporte técnico de steren</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2011/12/11/soporte-tecnico-steren.html">&lt;h2 id=&quot;soporte-técnico-de-steren&quot;&gt;soporte técnico de steren&lt;/h2&gt;

&lt;h6 id=&quot;11-dec-2011&quot;&gt;11 Dec 2011&lt;/h6&gt;

&lt;p&gt;Nada, hace tiempo que leo el blog de Manuel Micheline (&lt;a href=&quot;http://la-morsa.blogspot.com/&quot;&gt;La morsa&lt;/a&gt;) un catedrático de la facultad de ciencias de la UNAM / maestro FIDE en ajedrez y programador amateur, y me ha dado por crear una entrada imitando un poco su estilo.&lt;/p&gt;

&lt;p&gt;Hoy por la mañana me llego un router Steren (&lt;a href=&quot;http://www.steren.com.mx/_files/search.asp?s=COM-840\&quot;&gt;COM-840)&lt;/a&gt; que será usado para extender la señal de la red en las instalaciones donde trabajo, cuando lo vi me sorprendí porque no tenia idea que los comercializaban, en fin, estuve leyendo su instructivo y encontré un error en el manual que impedía entrar a la interfaz web, esto era debido a una mala traducción técnica, debo aclarar que no leí todo el manual, me limité a terminar de configurar el equipo y metí las cosas en su lugar, sin embargo al hacer esto noté que en la parte trasera del manual tenía una leyenda que rezaba: &lt;strong&gt;“Este instructivo puede mejorar con tu ayuda, llamanos a XXX-XXX-XXX-XXX”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Así que cogí el teléfono y marqué, la espera fue mínima y me atendió una señorita de soporte técnico, le comente el caso y tomo la corrección en menos de 5 min. Nada, me pareció profesional la manera en la que manejaron el suceso, y aunque no tengo mucha esperanza en el router, espero que también me sorprenda.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>print through the ldp protocol in a cups less environment</title>
   <link href="https://javier.io/blog/en/2011/12/01/ldp-printer-cups-less.html"/>
   <published>2011-12-01T00:00:00+00:00</published>
   <updated>2011-12-01T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/12/01/ldp-printer-cups-less</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="networking"/>
   
   
   
   <summary type="html">print through the ldp protocol in a cups less environment</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/12/01/ldp-printer-cups-less.html">&lt;h2 id=&quot;print-through-the-ldp-protocol-in-a-cups-less-environment&quot;&gt;print through the ldp protocol in a cups less environment&lt;/h2&gt;

&lt;h6 id=&quot;01-dec-2011&quot;&gt;01 Dec 2011&lt;/h6&gt;

&lt;p&gt;I’ve just discovered it’s possible to print through the &lt;a href=&quot;http://en.wikipedia.org/wiki/Line_Printer_Daemon_protocol&quot;&gt;LDP protocol&lt;/a&gt; without &lt;a href=&quot;http://www.cups.org/&quot;&gt;CUPS&lt;/a&gt; (cups-ldp in Ubuntu).&lt;/p&gt;

&lt;p&gt;For a unkown reason I had always though that all linux systems required to have CUPS installed to talk to any printer, which is not the case. LPD can be used perfectly to print to remote printers.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ rlpr -h -Plp -HIP_OF_THE_PRINTER_LDP_SERVER_HERE  file.[ps|pdf]
&lt;/pre&gt;

&lt;p&gt;In 2011 most Linux application can print to pdf/ps files, so you can skip &lt;strong&gt;cups-pdf&lt;/strong&gt; as well 😊. To print images, &lt;strong&gt;convert&lt;/strong&gt; (part of the &lt;a href=&quot;https://web.archive.org/web/20260625150036/https://imagemagick.org/script/index.php&quot;&gt;imagemagick&lt;/a&gt; suit) can do the job:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ convert image.jpg  file.ps
&lt;/pre&gt;

&lt;p&gt;And for plain text files, vim shines:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
:hardcopy &amp;gt; file.ps
&lt;/pre&gt;

&lt;p&gt;Aliases can help in case you find yourself typing the ip too often, eg &lt;strong&gt;alias print.192.168.1.11=’rlpr -h -Plp -H192.168.1.11’&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ print.192.168.1.11  file[.ps|pdf]
&lt;/pre&gt;

&lt;p&gt;All my requirements are covered 😎&lt;/p&gt;

&lt;p&gt;The printer/copier referenced on this post is the &lt;a href=&quot;http://usa.canon.com/cusa/support/office/b_w_imagerunner_copiers/imagerunner_5050_5055_5065_5070_5075_5570_6570/imagerunner_6570&quot;&gt;Canon ImageRunner 6570&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.mail-archive.com/misc@openbsd.org/msg56753.html&quot;&gt;http://www.mail-archive.com/misc@openbsd.org/msg56753.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20260826084813/http://www.gnu.org/software/a2ps/&quot;&gt;https://web.archive.org/web/20260826084813/http://www.gnu.org/software/a2ps/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.wizards.de/~frank/pstill.html&quot;&gt;http://www.wizards.de/~frank/pstill.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.ghostscript.com/&quot;&gt;http://www.ghostscript.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>setting up ubuntu for ubuntu development (upgrade)</title>
   <link href="https://javier.io/blog/en/2011/11/23/setting-up-ubuntu-for-ubuntu-development-upgrade.html"/>
   <published>2011-11-23T00:00:00+00:00</published>
   <updated>2011-11-23T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/11/23/setting-up-ubuntu-for-ubuntu-development-upgrade</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">setting up ubuntu for ubuntu development (upgrade)</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/11/23/setting-up-ubuntu-for-ubuntu-development-upgrade.html">&lt;h2 id=&quot;setting-up-ubuntu-for-ubuntu-development-upgrade&quot;&gt;setting up ubuntu for ubuntu development (upgrade)&lt;/h2&gt;

&lt;h6 id=&quot;23-nov-2011&quot;&gt;23 Nov 2011&lt;/h6&gt;

&lt;p&gt;In this post I’ll describe the way I upgrade my computers and my environment
for working with Ubuntu development (if it can be call it that way…). I always
run in my main computer the latest LTS version (lucid at this moment), and in
my test machine the latest development version (precise), I believe that there
will one great day when I know enough to make development in the test machine
and &lt;a href=&quot;https://help.ubuntu.com/community/UbuntuBackports&quot;&gt;backports&lt;/a&gt; / &lt;a href=&quot;https://wiki.ubuntu.com/StableReleaseUpdates&quot;&gt;SRU&lt;/a&gt;‘s for the stable one =3&lt;/p&gt;

&lt;p&gt;Since I use a lot my main computer, I install there pbuilder&lt;strong&gt;/&lt;/strong&gt; devs
tools&lt;strong&gt;/&lt;/strong&gt; virtualbox to modify packages for the development cycle, I only use
my test machine for packages that require real hardware to be tested. So, the
first thing I do when a new cycle starts is create a new directory for the
cycle that is starting, precise for this example.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir -pv misc/ubuntu/ubuntu-12.04 &amp;amp;&amp;amp; cd misc/ubuntu/ubuntu-12.04
$ mkdir  -pv app  diffs  isos  merge  udw
&lt;/pre&gt;

&lt;p&gt;I mantain my ubuntu related stuff with this hierarchy:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ tree -L 2 misc/ubuntu
 ├── results/
 │   ├── lucid-amd64/
 │   ├── lucid-i386/
 │   ├── maverick-i386/
 │   ├── natty-i386/
 │   ├── oneiric-i386/
 │   └── sid-i386/
 ├── ubuntu-10.04/
 │   ├── app/
 │   ├── diffs/
 │   ├── isos/
 │   ├── merge/
 │   └── udw/
 ├── ubuntu-10.10/
 │   ├── app/
 │   ├── diffs/
 │   ├── isos/
 │   ├── merge/
 │   └── udw/
 ├── ubuntu-11.04/
 │   ├── app/
 │   ├── diffs/
 │   ├── isos/
 │   ├── merge/
 │   └── udw/
 └── ubuntu-11.10/
 ├── app/
 ├── diffs/
 ├── isos/
 ├── merge/
 └── udw/
&lt;/pre&gt;

&lt;p&gt;Which can be disassemble it as follows:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;results&lt;/em&gt; &lt;strong&gt;= &amp;gt;&lt;/strong&gt; contains the output of pbuilder (.debs ready to been
tested), I’ve added a &lt;a href=&quot;https://gist.github.com/1387537&quot;&gt;patch&lt;/a&gt; to copy the packages keeping my ID as the
owner&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ubuntu-version&lt;/em&gt; &lt;strong&gt;= &amp;gt;&lt;/strong&gt; which contains everything related to that version,
isos, packages (&lt;a href=&quot;http://qa.ubuntuwire.org/ftbfs/&quot;&gt;FTBFS&lt;/a&gt;), udw logs, diffs (which are actually debdiffs,
this is the classic format to send patches), and merges&lt;/p&gt;

&lt;p&gt;Once the dirs have been created, I check the latest versions of some devs
packages (&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDevTools&quot;&gt;ubuntu-dev-tools&lt;/a&gt;, &lt;a href=&quot;https://launchpad.net/ubuntu-qa-tools&quot;&gt;ubuntu-qa-tools&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://launchpad.net/ubuntu-security-tools&quot;&gt;ubuntu-security-
tools&lt;/a&gt;)&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr branch lp:ubuntu-dev-tools ~/misc/ubuntu/tools/ubuntu-dev-tools
$ bzr get \
  http://bazaar.launchpad.net/~ubuntu-bugcontrol/ubuntu-qa-tools/master \
  ~/misc/ubuntu/tools/ubuntu-qa-tools
$ bzr branch lp:ubuntu-security-tools \
  ~/misc/ubuntu/tools/ubuntu-security-tools
&lt;/pre&gt;

&lt;p&gt;With those tools under my fingers I can start downloading the last isos (to test them), I do this as soon as possible, and then I keep upgrading it once a week, I use the &lt;strong&gt;$&lt;/strong&gt; ./dl-ubuntu-test-iso script who comes with the ubuntu-qa-tools package. Before I run it I edit the ~/.dl-ubuntu-test-iso file, currently it looks like &lt;a href=&quot;https://gist.github.com/1387600&quot;&gt;this&lt;/a&gt;, the parts that I change is RELEASE=”precise” and ISOROOT=”/home/chilicuil/misc/ubuntu/ubuntu-12.04/isos/” I only download the desktop / server and netbook versions, however the VARIANTS and FLAVORS variables can be edited to download more images. It will run faster if zsync is installed&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd ~/misc/ubuntu/tools/ubuntu-qa-tools/dl-ubuntu-test-iso &amp;amp;&amp;amp; \
  ./dl-ubuntu-test-iso &amp;amp;
&lt;/pre&gt;

&lt;p&gt;The next thing I do is to set up pbuilder, I’ve already wrote &lt;a href=&quot;/blog/es/2010/08/10/notas-sobre-pbuilder.html&quot;&gt;about it&lt;/a&gt;,
so I’ll just point out what variables I modify in ~/.pbuilder, for each new
release I change the UBUNTU_SUITES var:&lt;/p&gt;

&lt;p&gt;UBUNTU_SUITES=(“oneiric” “natty” “lucid“) =&amp;gt; UBUNTU_SUITES=(“precise”
“oneiric” “natty” “lucid“)&lt;/p&gt;

&lt;p&gt;And add the aliases to ~/.bashrc:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
alias pbuilder.precise=&apos;sudo DIST=precise pbuilder&apos;
&lt;/pre&gt;

&lt;p&gt;I also modify the /etc/bash_completion.d/pbuilder to get autocompletion:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
[ &quot;$have&quot; ] &amp;amp;&amp;amp; complete -F _pbuilder -o filenames pbuilder pbuilder.lucid pbuilder.maverick pbuilder.natty pbuilder.oneiric pbuilder.precise pbuilder.sid pbuilder.unstable
&lt;/pre&gt;

&lt;p&gt;The complete file is &lt;a href=&quot;https://gist.github.com/1388027&quot;&gt;here&lt;/a&gt;, finally I run:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ pbuilder.precise create
&lt;/pre&gt;

&lt;p&gt;To obtain the precise environment where packages would be build&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2011/11/23/setting-up-ubuntu-for-ubuntu-development-upgrade/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>deb package cache</title>
   <link href="https://javier.io/blog/en/2011/11/18/deb-packages-cache.html"/>
   <published>2011-11-18T00:00:00+00:00</published>
   <updated>2011-11-18T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/11/18/deb-packages-cache</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="networking"/>
   
   
   
   <summary type="html">deb package cache</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/11/18/deb-packages-cache.html">&lt;h2 id=&quot;deb-package-cache&quot;&gt;deb package cache&lt;/h2&gt;

&lt;h6 id=&quot;18-nov-2011&quot;&gt;18 Nov 2011&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I created a &lt;a href=&quot;https://raw.github.com/javier-lopez/learn/master/sh/is/apt-proxy&quot;&gt;script&lt;/a&gt; who automate the process described in this post.&lt;/p&gt;

&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/cfdfdda6da61dad9d9d5e&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt;--&gt;

&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;

&lt;p&gt;apt-cacher-ng is a kind of deb repository proxy, it caches deb packages &lt;strong&gt;on demand&lt;/strong&gt; between the computer who share the cache, it’s a great alternative for small environments. There are other alternatives, such as apt-cacher, apt-proxy and debmirror but those solutions can take more space or be harder to setup, so I won’t talk about them.&lt;/p&gt;

&lt;p&gt;In the client side, there exist mainly two ways of taking advantage of such services, &lt;a href=&quot;https://launchpad.net/squid-deb-proxy&quot;&gt;squid-deb-proxy&lt;/a&gt; and manual configuration. The first one uses &lt;a href=&quot;http://avahi.org/&quot;&gt;zeroconf&lt;/a&gt; to detect and use deb proxies whenever they’re available and the second one, well, is manual and works by adding a string to &lt;strong&gt;/etc/apt/apt.conf.d/01apt-cache&lt;/strong&gt; describing the proxy url. On this post I’ll talk about squid-deb-proxy.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;p&gt;[+] In the server side (which can be client at the same time):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install apt-cacher-ng squid-deb-proxy-client
$ sudo wget http://javier.io/mirror/apt-cacher-ng.service -O /etc/avahi/services/apt-cacher-ng.service
$ sudo service apt-cacher-ng restart
&lt;/pre&gt;

&lt;p&gt;[+] In the client side:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install squid-deb-proxy-client
&lt;/pre&gt;

&lt;p&gt;After executing these commands the apt-cacher-ng server will announce itself to all computers in the local network, and clients machines will be able to autoconfigure their apt preferences depending of whether they see an apt-cacher-ng server or not. Pretty cool 😊&lt;/p&gt;

&lt;h3 id=&quot;extra&quot;&gt;Extra&lt;/h3&gt;

&lt;h4 id=&quot;import-packages&quot;&gt;Import packages&lt;/h4&gt;

&lt;p&gt;Old packages (downloaded before setting up apt-cacher-ng) can be imported by executing:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo mkdir -pv -m 2755 /var/cache/apt-cacher-ng/_import
$ sudo mv -vuf /var/cache/apt/archives/*.deb /var/cache/apt-cacher-ng/_import/
$ sudo chown -R apt-cacher-ng:apt-cacher-ng /var/cache/apt-cacher-ng/_import
$ sudo apt-get update
&lt;/pre&gt;

&lt;p&gt;And going to &lt;a href=&quot;http://localhost:3142/acng-report.html&quot;&gt;http://localhost:3142/acng-report.html&lt;/a&gt; where a ‘&lt;strong&gt;Start import&lt;/strong&gt;’ button will show up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/57.png&quot;&gt;&lt;img src=&quot;/assets/img/57.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;delete-apt-cacher-ng&quot;&gt;Delete apt-cacher-ng&lt;/h4&gt;

&lt;p&gt;This setup can be destroyed at any time by running:&lt;/p&gt;

&lt;p&gt;[+] In the server:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get remove apt-cacher-ng squid-deb-proxy-client
$ sudo rm -rf /var/cache/apt-cacher-ng
&lt;/pre&gt;

&lt;p&gt;[+] In the clients:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get remove squid-deb-proxy-client
&lt;/pre&gt;

&lt;p&gt;Happy caching 😏&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>you just got kernelroll&apos;d ;)</title>
   <link href="https://javier.io/blog/en/2011/11/09/you-just-got-kernelrolled.html"/>
   <published>2011-11-09T00:00:00+00:00</published>
   <updated>2011-11-09T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/11/09/you-just-got-kernelrolled</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">you just got kernelroll’d ;)</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/11/09/you-just-got-kernelrolled.html">&lt;h2 id=&quot;you-just-got-kernelrolld-&quot;&gt;you just got kernelroll’d ;)&lt;/h2&gt;

&lt;h6 id=&quot;09-nov-2011&quot;&gt;09 Nov 2011&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/56.png&quot;&gt;&lt;img src=&quot;/assets/img/56.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rickrollin in kernel space ☺, this hack will intercept any system call to open multimedia files and replace them with rickrolling.mp3 😉&lt;/p&gt;

&lt;p&gt;To set it up in Ubuntu 10.04 you’ll need systemtap:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install systemtap
&lt;/pre&gt;

&lt;p&gt;Systemtap requires the kernel &lt;a href=&quot;http://en.wikipedia.org/wiki/Debug_symbol&quot;&gt;debug symbols&lt;/a&gt; who &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/linux/+bug/289087&quot;&gt;cannot be installed&lt;/a&gt; from the repositories in &lt;strong&gt;lucid&lt;/strong&gt;, although they can be installed from &lt;a href=&quot;http://ddebs.ubuntu.com/pool/main/l/linux/&quot;&gt;http://ddebs.ubuntu.com/pool/main/l/linux/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this particular case I’ve installed the 2.6.32 kernel:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo dpkg -l|grep linux-image
  ii  linux-image-2.6.32-34-generic
$ uname -m
  x86_64
&lt;/pre&gt;

&lt;p&gt;Therefore I’ll download the following files(~450MB):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-2.6.32-34-generic-dbgsym_2.6.32-34.77_amd64.ddeb
$ sudo dpkg -i linux-image-2.6.32-34-generic-dbgsym_2.6.32-34.77_amd64.ddeb
&lt;/pre&gt;

&lt;p&gt;Upon completion, the hack can be enabled this way:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo stap -e &apos;probe kernel.function(&quot;do_filp_open&quot;)\
 { p = kernel_string($pathname); l=strlen(p); \
 ext = substr(p, l - 4, l); if (ext == &quot;.mp3&quot; || ext == &quot;.ogg&quot; \
 || ext == &quot;.mp4&quot;) { system(&quot;mplayer /path/to/rirckroll.mp3&quot;); }}&apos;
&lt;/pre&gt;

&lt;p&gt;If you’re curious about other stap user cases, take a look at the documentation:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://sources.redhat.com/systemtap/&quot;&gt;http://sources.redhat.com/systemtap/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>compile software in pristine environments with pbuilder</title>
   <link href="https://javier.io/blog/en/2011/11/09/compile-software-in-pristine-environments-with-pbuilder.html"/>
   <published>2011-11-09T00:00:00+00:00</published>
   <updated>2011-11-09T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/11/09/compile-software-in-pristine-environments-with-pbuilder</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">compile software in pristine environments with pbuilder</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/11/09/compile-software-in-pristine-environments-with-pbuilder.html">&lt;h2 id=&quot;compile-software-in-pristine-environments-with-pbuilder&quot;&gt;compile software in pristine environments with pbuilder&lt;/h2&gt;

&lt;h6 id=&quot;09-nov-2011&quot;&gt;09 Nov 2011&lt;/h6&gt;

&lt;p&gt;I’m a paranoid of the order (at least in my system), every time I have to install software which is not included in the Ubuntu repositories I create .deb packages for such programs, sometimes it’s easy enough to do it manually (if the program doesn’t envolve a lot of dependencies), other times I rely on &lt;a href=&quot;http://asic-linux.com.mx/%7Eizto/checkinstall/&quot;&gt;checkinstall&lt;/a&gt; or &lt;a href=&quot;https://github.com/jordansissel/fpm&quot;&gt;fpm&lt;/a&gt; to do the job. Some persons wonder why I do still create hand made packages if fpm and checkinstall are available, well I do it because both tools can only create .deb packages but not .dsc definitions (a kind of .deb source package), these .dsc files can be upload to a ppa in &lt;a href=&quot;http://launchpad.net/&quot;&gt;launchpad.net&lt;/a&gt; where they’ll be compiled and saved. You want to do that because then you can use the url of your ppa to get automatic dependency resolution and good download speeds.&lt;/p&gt;

&lt;p&gt;When creating such packages (using any method) you’ll still need to download (at least temporally) build dependencies. As an order obsessed person I avoid doing it directly in my system and use chroot environments instead, these chroot boxes are way cheaper than virtualization solutions and faster to setup. Since I already use &lt;a href=&quot;https://viajemotu.wordpress.com/2010/08/10/notas-sobre-pbuilder&quot;&gt;pbuilder&lt;/a&gt; and it has a very nice &lt;strong&gt;–login&lt;/strong&gt; option, I use it to create temporal environments and destroy them on exit.&lt;/p&gt;

&lt;p&gt;Let’s suppose a new ffmpeg version has just been released and you want to try it on your stable Ubuntu system, these would be the steps necessary to compile, package and install it in your host system.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get -y remove ffmpeg x264 libx264-dev libmp3lame-dev
$ sudo pbuilder.natty --login
[natty-chroot] # apt-get install wget
[natty-chroot] # apt-get -y install nasm build-essential git-core \
                 checkinstall yasm texi2html libfaac-dev libopencore-amrnb-dev     \
                 libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev   \
                 libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev
[natty-chroot] # git clone git://git.videolan.org/ffmpeg
[natty-chroot] # cd ffmpeg
[natty-chroot] # ./configure --enable-gpl --enable-version3 --enable-nonfree \
                --enable-postproc --enable-libfaac --enable-libopencore-amrnb \
                --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis \
                --enable-libx264 --enable-libxvid --enable-x11grab --enable-libmp3lame
[natty-chroot] # make
[natty-chroot] # checkinstall --pkgname=ffmpeg --pkgversion=&quot;5:$(./version.sh)&quot; \
                --backup=no --deldoc=yes --default
$ cp /var/cache/pbuilder/natty-amd64/build/{number}/home/user/ffmpeg.deb ~
$ sudo dpkg -i ffmpeg_5:201111091946-git-1_amd64.deb
&lt;/pre&gt;

&lt;p&gt;Once installed, the tmp chroot environment can be destroyed by terminating the session&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
[natty-chroot] # exit
&lt;/pre&gt;

&lt;p&gt;Sweet ü&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>virtualbox and kvm sideways</title>
   <link href="https://javier.io/blog/en/2011/10/31/virtualbox-kvm-sideways.html"/>
   <published>2011-10-31T00:00:00+00:00</published>
   <updated>2011-10-31T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/10/31/virtualbox-kvm-sideways</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">virtualbox and kvm sideways</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/10/31/virtualbox-kvm-sideways.html">&lt;h2 id=&quot;virtualbox-and-kvm-sideways&quot;&gt;virtualbox and kvm sideways&lt;/h2&gt;

&lt;h6 id=&quot;31-oct-2011&quot;&gt;31 Oct 2011&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/55.png&quot;&gt;&lt;img src=&quot;/assets/img/55.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The above image contain a common error persons have whenever they try to use VirtualBox and KVM at the same time. Some forum posts suggest uninstalling kvm, however it’s quite simple to keep both solutions installed sideways.&lt;/p&gt;

&lt;p&gt;In Ubuntu, everytime VirtualBox is going to be used, KVM kernel modules should be disabled:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo service qemu-kvm stop &amp;amp;&amp;amp; sudo service vboxdrv start
&lt;/pre&gt;

&lt;p&gt;And viceversa:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo service vboxdrv stop &amp;amp;&amp;amp; sudo service qemu-kvm
&lt;/pre&gt;

&lt;p&gt;For other distributions, &lt;strong&gt;rmmod/modprobe/lsmod&lt;/strong&gt; can do the job 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>stop firefox directory autocreation</title>
   <link href="https://javier.io/blog/en/2011/10/29/stop-firefox-directory-autocreation.html"/>
   <published>2011-10-29T00:00:00+00:00</published>
   <updated>2011-10-29T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/10/29/stop-firefox-directory-autocreation</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">stop firefox directory autocreation</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/10/29/stop-firefox-directory-autocreation.html">&lt;h2 id=&quot;stop-firefox-directory-autocreation&quot;&gt;stop firefox directory autocreation&lt;/h2&gt;

&lt;h6 id=&quot;29-oct-2011&quot;&gt;29 Oct 2011&lt;/h6&gt;

&lt;p&gt;By default Firefox creates a &lt;strong&gt;Desktop&lt;/strong&gt; and &lt;strong&gt;Download&lt;/strong&gt; directories in &lt;strong&gt;$HOME&lt;/strong&gt; accordying to &lt;a href=&quot;http://www.freedesktop.org/wiki/Software/xdg-user-dirs&quot;&gt;freedesktop policies&lt;/a&gt;. This feature can be annoying for some persons (including me). IMO nobody should force you to use a pre-fixed directory layout.&lt;/p&gt;

&lt;p&gt;To disable this feature the &lt;strong&gt;$HOME/.config/user-dirs.dirs&lt;/strong&gt; file should be edited as follows:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat $HOME/.config/user-dirs.dirs
XDG_DESKTOP_DIR=&quot;$HOME/./&quot;
XDG_DOWNLOAD_DIR=&quot;$HOME/./&quot;
XDG_TEMPLATES_DIR=&quot;$HOME/./&quot;
&lt;/pre&gt;

&lt;p&gt;The Linux desktop specifications are pretty dumb 😔&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>proxy ssh + socks</title>
   <link href="https://javier.io/blog/en/2011/10/06/proxy-ssh-socks.html"/>
   <published>2011-10-06T00:00:00+00:00</published>
   <updated>2011-10-06T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/10/06/proxy-ssh-socks</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">proxy ssh + socks</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/10/06/proxy-ssh-socks.html">&lt;h2 id=&quot;proxy-ssh--socks&quot;&gt;proxy ssh + socks&lt;/h2&gt;

&lt;h6 id=&quot;06-oct-2011&quot;&gt;06 Oct 2011&lt;/h6&gt;

&lt;h4 id=&quot;problem&quot;&gt;Problem&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Facebook, Twitter, Youtube, etc are blocked.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;solution&quot;&gt;Solution&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Route traffic through ssh tunnels.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;ingredients&quot;&gt;Ingredients&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Unix account in an external host, eg; &lt;a href=&quot;https://web.archive.org/web/20230820225840/http://cjb.net/&quot;&gt;cjb.net&lt;/a&gt;, vps, etc&lt;/li&gt;
  &lt;li&gt;Ssh client&lt;/li&gt;
  &lt;li&gt;Traffic allowed through the 22 port (or any other port)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;procedure&quot;&gt;Procedure:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Create an ssh tunnel:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
[local]$ ssh -C2qTnN -D 9090 username@remote.machine
&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;Configure firefox to use the tunnel:
    &lt;ul&gt;
      &lt;li&gt;Edit ➮ Preferences ➮ Advanced ➮ Network ➮ Settings ➮ Manual proxy configuration&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;SOCKS Proxy 127.0.0.1 Port 9090&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;extra&quot;&gt;Extra&lt;/h3&gt;

&lt;p&gt;To get extra security connections can go through N nodes:&lt;/p&gt;
&lt;pre&gt;
Firefox (local) &amp;#10143;  host-1 &amp;#10143;  host-2 &amp;#10143;  host-n -&amp;gt; Internet
&lt;/pre&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
[local]$  ssh -C2qTnN username@host-1 -L 9090:localhost:9090
[host1]$  ssh -C2qTnN username@host-2 -L 9090:localhost:9090
...
...
[hostn-1]$ ssh -C2qTnN -D 9090 username@host-n
&lt;/pre&gt;

&lt;p&gt;Happy hacking 😈&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>a lenda da cuca</title>
   <link href="https://javier.io/blog/pt/2011/09/29/a-lenda-da-cuca.html"/>
   <published>2011-09-29T00:00:00+00:00</published>
   <updated>2011-09-29T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2011/09/29/a-lenda-da-cuca</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">a lenda da cuca</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2011/09/29/a-lenda-da-cuca.html">&lt;h2 id=&quot;a-lenda-da-cuca&quot;&gt;a lenda da cuca&lt;/h2&gt;

&lt;h6 id=&quot;29-sep-2011&quot;&gt;29 Sep 2011&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;img src=&quot;/assets/img/74.jpg&quot; alt=&quot;&quot; /&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A gente fala de uma mulher muito feia com a forma de jacaré, ela rouba as crianças que não obedecem a seus pias. A cuca não pode dormir e é por isso que vai andando pelas noites. Quando ela fica brava dá um berro que dá pra ouvir à 10 léguas de distância.&lt;/p&gt;

&lt;p&gt;Os meninos que não queiram ser roubados ter que dormi-se a boa hora.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>xperia mini pro - custom roms</title>
   <link href="https://javier.io/blog/es/2011/08/21/xperia-mini-pro-custom-roms.html"/>
   <published>2011-08-21T00:00:00+00:00</published>
   <updated>2011-08-21T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2011/08/21/xperia-mini-pro-custom-roms</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">xperia mini pro - custom roms</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2011/08/21/xperia-mini-pro-custom-roms.html">&lt;h2 id=&quot;xperia-mini-pro---custom-roms&quot;&gt;xperia mini pro - custom roms&lt;/h2&gt;

&lt;h6 id=&quot;21-aug-2011&quot;&gt;21 Aug 2011&lt;/h6&gt;

&lt;p&gt;Nada, hace poco me he hecho de un xperia mini pro (por $2800), después de haber perdido un xperia mini =(, y este fin de semana he experimentado hasta dejarlo con una configuración aceptable (a mi gusto), así que dejo un breve resumen de los pasos que seguí para ayudarme en el futuro.&lt;/p&gt;

&lt;p&gt;Este tutorial no debería seguirse a menos que se tenga exactamente el mismo teléfono y se desee obtener el mismo resultado.&lt;/p&gt;

&lt;p&gt;ANTES&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Android &lt;strong&gt;1.6&lt;/strong&gt; (SonyEricson) / &lt;strong&gt;Donut&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;versión de banda base &lt;strong&gt;M76XX-TSNCJOLYM-53404006&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Modelo: u20a&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/41.png&quot;&gt;&lt;img src=&quot;/assets/img/41.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/42.jpeg&quot;&gt;&lt;img src=&quot;/assets/img/42.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/43.png&quot;&gt;&lt;img src=&quot;/assets/img/43.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DESPUÉS&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Android &lt;strong&gt;2.3.5&lt;/strong&gt; (GinTonic.Se 1.3) / &lt;strong&gt;Gingerbread&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;versión de banda base &lt;strong&gt;M76XX-TSNCJOLYM-53404015&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Modelo: u20i&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/44.png&quot;&gt;&lt;img src=&quot;/assets/img/44.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/45.png&quot;&gt;&lt;img src=&quot;/assets/img/45.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/46.png&quot;&gt;&lt;img src=&quot;/assets/img/46.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Descarga:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;build.prop&lt;/strong&gt; (útil para cambiar la banda &lt;strong&gt;53404006&lt;/strong&gt; -&amp;gt; &lt;strong&gt;53404015&lt;/strong&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;root-xrecovery_x10miniPro.exe&lt;/strong&gt; (rootea e instala xrecovery, requiere Windows)&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;mybackupPro.apk&lt;/strong&gt; (backup de contactos, sms, apps)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.multiupload.com/4W2VJ6URER&quot;&gt;http://www.multiupload.com/4W2VJ6URER&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;faq&quot;&gt;FAQ&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es android?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Android es un sistema operativo enfocado a teléfonos y tabletas, principal competencia del sistema operativo que viene en los iphone, está basado en linux, aunque modifica muchas partes esenciales del mismo. Tiene miles de aplicaciones, gps, reconocimiento de voz, skype, twitter, facebook, youtube, angrybirds, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es un custom rom?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un custom rom es un sistema operativo modificado que reemplaza el que Sony Ericson/Telcel han puesto en tu teléfono.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cúal es la ventaja de un custom rom?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En primer lugar que corre una versión más reciente de android, adquiriendo un aumento en el rendimiento, por ejemplo android 2.2 es dos veces más rapido que android 2.1, y android 2.3 es 25% más rapido que la versión 2.2. También puede hacer otras cosas, por ejemplo mover las aplicaciones a la memoria externa (app2sd) o compartir internet a otros dispositivos a través de usb/wifi (requiere plan de datos).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cuáles son los requerimientos?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tener instalado xrecovery y haber ‘rooteado’ el teléfono, adicionalmente se puede tener a la mano PC Companion o SEUS (sony ericson update service) para regresar el teléfono a su instalación de fabrica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es ‘rootear’?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rootear se refiere a obtener permisos de administrador, por defecto los teléfonos traen medidas de seguridad que evitan, por ejemplo, eliminar aplicaciones que vienen por defecto (muestras de juegos, ideas telcel, etc). Con un teléfono rooteado es posible eliminarlas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es xrecovery?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xrecovery es un programa que se utiliza para instalar custom roms, se accede a el presionando la flecha &amp;lt;- al arranque del movil (cuando aparece la leyenda ‘sony ericson’)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo se instala un custom rom?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Los custom rom se distribuyen como archivos zip (1 archivo zip por rom), y se instalan con xrecovery&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué implicaciones legales conlleva instalar un custom rom?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se pierde la garantía, sin embargo el proceso puede ser revertido si es que en algún momento se requiere reinstalar la versión con la que venía el teléfono.&lt;/p&gt;

&lt;h3 id=&quot;backup&quot;&gt;Backup&lt;/h3&gt;

&lt;p&gt;Si el teléfono ya estaba siendo utilizado con anterioridad, es probable que haya datos que no se deseen perder, en el market existen aplicaciones que ayudan a hacer esto, adicionalmente de los datos que se sincronizan con la cuenta de google que se definio en el teléfono.&lt;/p&gt;

&lt;p&gt;Personalmente utilice &lt;strong&gt;mybackup pro&lt;/strong&gt; (sms’s) y &lt;strong&gt;titanium backup&lt;/strong&gt; (aplicaciones), mybackup pro viene incluido en el link de descarga, titanium puede adquirirse desde el market.&lt;/p&gt;

&lt;p&gt;Para instalar aplicaciones fuera del market, hay que habilitar &lt;strong&gt;‘Origenes Desconocidos’&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ajustes/Aplicaciones/Origenes Desconocidos&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;rootear-e-instalar-xrecovery&quot;&gt;Rootear e instalar xrecovery&lt;/h3&gt;

&lt;p&gt;Existen métodos y aplicaciones que otorgan permisos e instalan xrecovery, pero el más simple que encontré fue usar 1click:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;root-xrecovery_x10miniPro.exe (viene incluido en el zip)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para usarlo se siguen los siguientes pasos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Preparar el teléfono, habilitar la “depuración USB” en &lt;strong&gt;ajustes/aplicaciones/desarrollo&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Extraer el archivo (yo lo hice con WindRar)&lt;/li&gt;
  &lt;li&gt;Conectar el teléfono a la computadora&lt;/li&gt;
  &lt;li&gt;Abrir oneclickroot&lt;/li&gt;
  &lt;li&gt;Hacer click en ‘root’ y esperar que finalice (no debe demorar mas de 2 min)&lt;/li&gt;
  &lt;li&gt;Hacer click en ‘xrecover’ y esperar otro par de minutos&lt;/li&gt;
  &lt;li&gt;Reiniciar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ahora el teléfono debería estar rooteado y tener xrecovery (se puede probar presionando la flecha al arranque - aparecerá un menú)&lt;/p&gt;

&lt;h3 id=&quot;cambiar-banda-base&quot;&gt;Cambiar banda base&lt;/h3&gt;

&lt;p&gt;Muchos de los custom roms solo son compatibles con la versión 53404015, por lo que se tiene que actualizar a esa versión antes de volcar los roms, de lo contrario el teléfono entrará en un ciclo de reinicio infinito.&lt;/p&gt;

&lt;p&gt;Para eso se copia&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;build.prop&lt;/strong&gt; a &lt;strong&gt;/system&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lo que requiere un navegador de archivos con permisos de administrador, se puede usar &lt;strong&gt;‘File Expert’&lt;/strong&gt; (accesible a través del market), aunque por defecto no esos permisos, sin embargo se puede habilitar en:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;File Expert/menu/mas/ajustes/ajustes de explorador de archivos/&lt;strong&gt;explorador root&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se reinicia el programa y se reemplaza &lt;strong&gt;build.prop&lt;/strong&gt; por &lt;strong&gt;/system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Después de reiniciar, se conecta a una computadora, donde este corriendo PC Companion (viene incluido en el teléfono), y desde ahí se reestablece al setup de fábrica, el tiempo aproximado dependiendo de la conexión es de 40min (a 100kb/s).&lt;/p&gt;

&lt;p&gt;Después de reiniciar el teléfono la banda base debería ser la &lt;strong&gt;53404015&lt;/strong&gt;. Si es así se siguen los pasos de “&lt;strong&gt;Rootear e instalar xrecovery&lt;/strong&gt;” para reinstalar los componentes necesarios.&lt;/p&gt;

&lt;h3 id=&quot;instalar-custom-roms&quot;&gt;Instalar custom roms&lt;/h3&gt;

&lt;p&gt;Es recomendable hacer un backup del rom de fábrica, de esta manera si no convence el custom rom, se puede recuperar el sistema original, para probar con otro.&lt;/p&gt;

&lt;p&gt;Para crear un backup se reinicia el teléfono, y se presiona la tecla que tiene una flecha, aparecerá un menú, ahí se selecciona (se mueve con las teclas de volúmen, y se selecciona con la tecla de en medio)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;backup and restore/&lt;strong&gt;Backup&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eso creará una copia de seguridad en &lt;strong&gt;/sdcard/xrecovery&lt;/strong&gt;, para recuperarla se selecciona:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;backup and restore/&lt;strong&gt;restore&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algunos de los custom roms disponibles para el xperia mini pro, están listados aquí:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://tinyurl.com/3smura5&quot;&gt;http://tinyurl.com/3smura5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Después de probar algunos, he decidido usar de forma continua **GinTonic.SE&lt;/td&gt;
      &lt;td&gt;v1.3** (120MB~), disponible en:&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://forum.xda-developers.com/showthread.php?t=1207740&quot;&gt;http://forum.xda-developers.com/showthread.php?t=1207740&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La instalación de este y de otros, pasa por:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Reiniciar el telefono&lt;/li&gt;
  &lt;li&gt;Entrar en xrecovery (presionar varias veces la tecla de la fecla derecha&lt;/li&gt;
  &lt;li&gt;Ir a &lt;strong&gt;install zip from sdcard/choose zip from sdcard&lt;/strong&gt; y seleccionar el archivo zip&lt;/li&gt;
  &lt;li&gt;Esperar la instalación&lt;/li&gt;
  &lt;li&gt;Ir a &lt;strong&gt;wipe data/factory reset&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Reiniciar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Con eso, arrancará el nuevo SO, se llenará el perfil (cuenta de gmail), se instalará mybackupPro/titanium y se recuperaran los datos/aplicaciones.&lt;/p&gt;

&lt;p&gt;Estos custom roms ya viene rooteados y con xrecovery, así que no es necesario volver a correr 1click por tercera vez.&lt;/p&gt;

&lt;h3 id=&quot;extra-intermedio&quot;&gt;EXTRA (intermedio)&lt;/h3&gt;

&lt;p&gt;Instalar (desde el market)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Taskiller&lt;/li&gt;
  &lt;li&gt;AdFree&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Liberar espacio&lt;/p&gt;

&lt;p&gt;Para mover las aplicaciones a la tarjeta externa se va a:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;menu/administrar aplicaciones/descargadas&lt;/strong&gt;, luego se selecciona la aplicación y se presiona &lt;strong&gt;mover a sdcard&lt;/strong&gt;, libera aprox el 50% del tamaño de la app.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Otro truco es eliminar &lt;strong&gt;/data/dalvik-cache&lt;/strong&gt; y reiniciar (libera 13~ MB)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;O eliminar la cache de los programas en &lt;strong&gt;/data/data&lt;/strong&gt;, para saber cual app guarda más datos, se puede abrir una consola (viene incluida con el rom) y se escribe:&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ du -sk /data/data/* | sort -rn | head
&lt;/pre&gt;

&lt;p&gt;Y luego:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ rm -rf /data/data/some_app/cache
&lt;/pre&gt;

&lt;p&gt;También se puede mover las caches de algunos programas a otros lugares, para eso se hace un softlink&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir -p /sdcard/cache/market
$ cd /data/data/com.android.vending
$ rm -R cache
$ ln -s /sdcard/cache/market cache
&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>causa e efeito</title>
   <link href="https://javier.io/blog/pt/2011/07/02/causa-e-efeito.html"/>
   <published>2011-07-02T00:00:00+00:00</published>
   <updated>2011-07-02T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2011/07/02/causa-e-efeito</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="music"/>
   
   <category term="personal"/>
   
   
   
   <summary type="html">causa e efeito</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2011/07/02/causa-e-efeito.html">&lt;h2 id=&quot;causa-e-efeito&quot;&gt;causa e efeito&lt;/h2&gt;

&lt;h6 id=&quot;02-jul-2011&quot;&gt;02 Jul 2011&lt;/h6&gt;

&lt;p&gt;Gosto muito das cancoes de luta social&lt;/p&gt;

&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/L_gcV8O5Zl8&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>não tenho dinheiro</title>
   <link href="https://javier.io/blog/pt/2011/05/20/nao-tenho-dinheiro.html"/>
   <published>2011-05-20T00:00:00+00:00</published>
   <updated>2011-05-20T00:00:00+00:00</updated>
   <id>https://javier.io/blog/pt/2011/05/20/nao-tenho-dinheiro</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="poetry"/>
   
   <category term="music"/>
   
   
   
   <summary type="html">não tenho dinheiro</summary>
   
   <content type="html" xml:base="https://javier.io/blog/pt/2011/05/20/nao-tenho-dinheiro.html">&lt;h2 id=&quot;não-tenho-dinheiro&quot;&gt;não tenho dinheiro&lt;/h2&gt;

&lt;h6 id=&quot;20-may-2011&quot;&gt;20 May 2011&lt;/h6&gt;

&lt;p&gt;Eu tambem não! =)&lt;/p&gt;

&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/zdCF5Uknu-8&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre class=&quot;lyric&quot;&gt;
Vou, pela rua, caminhando mas pensando em meu amor
e vou, decorando coisas serias que preciso-lhe dizer
porque amo muito mas entendo que tao só de mi esperar
e eu, não sou nada sou tao pobe que nao posso-me casar

Não tenho dinheiro nem nada que dar, eu tenho solamente
amor para amar, si ela me ama vai compreender
si não para sempre vou ter esquecer

Não tenho dinheiro nem nada que dar, eu tenho solamente
amor para amar, si ela me ama vai compreender
si não para sempre vou ter esquecer

Eu sei, que ao seu lado amo muito e me sinto tao feliz
e sei que adiz cerqui sou tao pobe seu amor já perdi
entao, eu queria ter de todo por o mundo a seus pes

Mas eu naci pobre e é por isso que sempre ninguem me quer

Não tenho dinheiro nem nada que dar eu tenho solamente
amor para amar, si ela me ama vai compreender
si não para sempre vou ter esquecer

Não tenho dinheiro nem nada que dar eu tenho solamente
amor para amar, si ela me ama vai compreender
si não para sempre vou ter esquecer

Não tenho dinheiro nem nada que dar eu tenho solamente
amor para amar, si ela me ama vai compreender
si não para sempre pote diz-que ser 
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>the ubuntu packaging guide</title>
   <link href="https://javier.io/blog/en/2011/04/27/the-ubuntu-packaging-guide.html"/>
   <published>2011-04-27T00:00:00+00:00</published>
   <updated>2011-04-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/04/27/the-ubuntu-packaging-guide</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">the ubuntu packaging guide</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/04/27/the-ubuntu-packaging-guide.html">&lt;h2 id=&quot;the-ubuntu-packaging-guide&quot;&gt;the ubuntu packaging guide&lt;/h2&gt;

&lt;h6 id=&quot;27-apr-2011&quot;&gt;27 Apr 2011&lt;/h6&gt;

&lt;p&gt;Browsing around I came to the &lt;a href=&quot;https://launchpad.net/ubuntu-packaging-guide&quot;&gt;ubuntu packaging guide&lt;/a&gt;, a work in
progress, with lots of interesting tips and howto’s about what people need to
get started with ubuntu development (I really hope someone could document how
to work with &lt;a href=&quot;https://merges.ubuntu.com/&quot;&gt;merges&lt;/a&gt; and &lt;a href=&quot;http://qa.ubuntuwire.com/ftbfs/&quot;&gt;FTBFS&lt;/a&gt; bugs, still no light for me), now
I’ll just record how I ‘compile’ it, in case wanted to add something and I
forget how to test it xD&lt;/p&gt;

&lt;p&gt;I’m running Ubuntu lucid (10.04 also known as the LTS version), and I only had
to:&lt;/p&gt;

&lt;h4 id=&quot;download-the-source&quot;&gt;download the source&lt;/h4&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr branch lp:ubuntu-packaging-guide
&lt;/pre&gt;

&lt;h4 id=&quot;install-sphinx--httpswebarchiveorgweb20121022183301httpsphinxpocooorg80-&quot;&gt;install sphinx ( &lt;a href=&quot;https://web.archive.org/web/20121022183301/http://sphinx.pocoo.org:80/&quot;&gt;https://web.archive.org/web/20121022183301/http://sphinx.pocoo.org:80/&lt;/a&gt; )&lt;/h4&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install python-sphinx
&lt;/pre&gt;

&lt;h4 id=&quot;produce-the-documentation&quot;&gt;produce the documentation&lt;/h4&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ make html #or make latexpdf, check the Makefile out for more options
&lt;/pre&gt;

&lt;p&gt;I know nothing about sphinx but looking at the files I suppose the *.rst are
whom produce the files…&lt;/p&gt;

&lt;p&gt;Still no idea how to get the .deb package from it, but thanks to tumbleweed
from #ubuntu-motu to show me how simple getting the docs actually was &amp;gt;_&amp;gt;’
(even without the .deb package), i10n is still in progress at
&lt;a href=&quot;https://bitbucket.org/birkenfeld/sphinx/issue/561/configuration-option-store-translations-in&quot;&gt;mainstream&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a lot had happened for me, the alpha group is having a lot of more
comments, but still not sure if it’s having the success it was suppose to
have, the final iso testing for natty has been started, the oneiric (the next
ubuntu version) topics also have started, the newletters seems dead, people
talked about unity till the last minute…&lt;/p&gt;

&lt;p&gt;The blogs I keep reading and that I really, really recommend are:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://raphaelhertzog.com/&quot;&gt;http://raphaelhertzog.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://daniel.holba.ch/blog/&quot;&gt;http://daniel.holba.ch/blog/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;…going back to what people call ‘reality’ =(&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2011/04/27/the-ubuntu-packaging-guide/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ubuntu bugsquad mentorship group alpha</title>
   <link href="https://javier.io/blog/en/2011/04/26/ubuntu-bugsquad-mentorship-group-alpha.html"/>
   <published>2011-04-26T00:00:00+00:00</published>
   <updated>2011-04-26T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/04/26/ubuntu-bugsquad-mentorship-group-alpha</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">ubuntu bugsquad mentorship group alpha</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/04/26/ubuntu-bugsquad-mentorship-group-alpha.html">&lt;h2 id=&quot;ubuntu-bugsquad-mentorship-group-alpha&quot;&gt;ubuntu bugsquad mentorship group alpha&lt;/h2&gt;

&lt;h6 id=&quot;26-apr-2011&quot;&gt;26 Apr 2011&lt;/h6&gt;

&lt;p&gt;From the launchpad page:&lt;/p&gt;

&lt;p&gt;The Ubuntu BugSquad &lt;a href=&quot;https://launchpad.net/~bugsquad-mentorship-group-alpha&quot;&gt;Mentorship&lt;/a&gt; group α is a class of mentors and
students.&lt;/p&gt;

&lt;p&gt;This is a test-pilot run during the Natty cycle to see whether mentoring new
bug triagers in a group, having several mentors and a mailing list will
improve the results of the BugSquad Mentorship program.&lt;/p&gt;

&lt;p&gt;Rcart and me have enrolled ourselves, if you wanna join the initiative just
send a message to ubuntu-bugsquad AT lists.ubuntu.com, since it’s a restricted
group right now. Not a lot of messages have been interchanged yet, let’s see
how it grows up.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2011/04/26/ubuntu-bugsquad-mentorship-group-alpha/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>watch_battery</title>
   <link href="https://javier.io/blog/en/2011/04/07/watch-battery.html"/>
   <published>2011-04-07T00:00:00+00:00</published>
   <updated>2011-04-07T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/04/07/watch-battery</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">watch_battery</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/04/07/watch-battery.html">&lt;h2 id=&quot;watch_battery&quot;&gt;watch_battery&lt;/h2&gt;

&lt;h6 id=&quot;07-apr-2011&quot;&gt;07 Apr 2011&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/40.png&quot;&gt;&lt;img src=&quot;/assets/img/40.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I made a little &lt;a href=&quot;https://github.com/minos-org/minos-tools/blob/master/tools/watch-battery&quot;&gt;script&lt;/a&gt; to look after my laptop battery so it doesn’t shutdown at the middle of me working. It requieres &lt;strong&gt;notify-send&lt;/strong&gt;, &lt;strong&gt;hibernate&lt;/strong&gt; and &lt;strong&gt;acpi,&lt;/strong&gt; and targets Ubuntu:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install acpi libnotify-bin hibernate
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;WARNING:&lt;/strong&gt; For the hibernation to work the computer requires to have enough SWAP space (more than the amount of RAM)&lt;/p&gt;

&lt;p&gt;The scripts analyze the battery status and send notifications if the charge is less than 15%,10% or 7%, if the equipment reaches 5% it sends a final warning and hibernate the machine.&lt;/p&gt;

&lt;p&gt;I recommend to execute it every minute, a cron job can help:&lt;/p&gt;

&lt;pre class=&quot;sh_log&quot;&gt;
*/1 * * * * /usr/local/bin/watch_battery
&lt;/pre&gt;

&lt;p&gt;If you prefer to shutdown or suspend the equipment modify the &lt;strong&gt;$ACTION&lt;/strong&gt; variable:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# Actions
ACTION=&quot;$(command -v hibernate)&quot;
&lt;/pre&gt;

&lt;p&gt;Make sure &lt;strong&gt;sudo&lt;/strong&gt; can call the action command without requering password:&lt;/p&gt;

&lt;pre class=&quot;sh_properties&quot;&gt;
#===================================
# Cmnd alias specification
Cmnd_Alias SESSION=/usr/sbin/pm-suspend,/usr/sbin/hibernate,/sbin/shutdown

# usuario may use specific commands without passwd
user ALL=(root) NOPASSWD:SESSION
#===================================
&lt;/pre&gt;

&lt;p&gt;Special thanks to &lt;a href=&quot;http://forums.debian.net/viewtopic.php?f=8&amp;amp;t=52115#p299406&quot;&gt;smasty&lt;/a&gt; for the initial snippet.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/913004&quot;&gt;https://gist.github.com/913004&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>don&apos;t let cd slow you down, cd wrappers: wcd, commacd</title>
   <link href="https://javier.io/blog/en/2011/04/05/dont-let-cd-slow-you-down-wcd-commacd.html"/>
   <published>2011-04-05T00:00:00+00:00</published>
   <updated>2011-04-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/04/05/dont-let-cd-slow-you-down-wcd-commacd</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">don’t let cd slow you down, cd wrappers: wcd, commacd</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/04/05/dont-let-cd-slow-you-down-wcd-commacd.html">&lt;h2 id=&quot;dont-let-cd-slow-you-down-cd-wrappers-wcd-commacd&quot;&gt;don’t let cd slow you down, cd wrappers: wcd, commacd&lt;/h2&gt;

&lt;h6 id=&quot;05-apr-2011&quot;&gt;05 Apr 2011&lt;/h6&gt;

&lt;!--&lt;iframe  class=&quot;showterm&quot; src=&quot;http://showterm.io/ae29f68bee555cd89c65d&quot; width=&quot;640&quot; height=&quot;350&quot;&gt;&amp;nbsp;&lt;/iframe&gt;--&gt;

&lt;p&gt;Using a console interface to manage a computer has its disadvantages, some of them are especially visible when dealing with multiple files at the same time (moving/renaming/copying), typing long and crypted commands/options or moving around. On this entry I’ll talk about the last one.&lt;/p&gt;

&lt;p&gt;The default &lt;code&gt;cd&lt;/code&gt; behaviour on bash to change directories is quite strict, it requires to write full/relative paths and doesn’t recognize fuzzy search or any more complicated way of finding directories, some people use many &lt;a href=&quot;https://github.com/relevance/etc/blob/master/bash/project_aliases.sh&quot;&gt;aliases&lt;/a&gt; to workaround these issues, others change its default shell or use third party tools, eg: &lt;a href=&quot;https://github.com/clvv/fasd&quot;&gt;fasd&lt;/a&gt;, &lt;a href=&quot;https://github.com/vigneshwaranr/bd&quot;&gt;bd&lt;/a&gt;, &lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;fzf&lt;/a&gt;, etc to create a semi automatic way of moving faster.&lt;/p&gt;

&lt;p&gt;I prefer everything as minimalist and automatic as possible, so after reviewing lots of custom scripts, alternative shells and third party hacks, I think I’ve something good enough to write about and use on a daily basis.&lt;/p&gt;

&lt;p&gt;All start by enabling semi hidden bash options for autocorrecting and autocompleting directories:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ head ~/.bashrc
# http://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html
if [ &quot;${BASH_VERSINFO}&quot; -ge &quot;4&quot; ]; then
    shopt -s autocd cdspell dirspell
fi
&lt;/pre&gt;

&lt;p&gt;Now, bash can autocomplete &lt;strong&gt;1/2/3/foo&lt;/strong&gt; in the following scenarios:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd 1/2/3/foo
$ cd 1/2/3/ofo
$ 1/2/3/foo
&lt;/pre&gt;

&lt;p&gt;Moving between important directories and parent directories can be optimized by adding some aliases:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ head ~/.alias.common
alias ..=&quot;cd ..&quot;
alias ....=&quot;cd ../..&quot;
alias important.path=&quot;cd important/path&quot;
&lt;/pre&gt;

&lt;p&gt;Now it’s time for some major improvements. An important &lt;a href=&quot;http://www.zsh.org&quot;&gt;zsh&lt;/a&gt; cd related feature is called pattern recognition, e.g. &lt;strong&gt;$ cd s&lt;em&gt;/m&lt;/em&gt;/pl&lt;/strong&gt; will become &lt;strong&gt;super/master/plan&lt;/strong&gt;, that’s sweet, unfortunately bash is unable to recognize such patterns by itself, however with some &lt;a href=&quot;http://wcd.sourceforge.net/&quot;&gt;help&lt;/a&gt; it can do it even better.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install wcd
$ head ~/.alias.common
alias cd=&apos;. wcd&apos;
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;wcd&lt;/strong&gt; is not a binary, it’s a wrapper script around &lt;code&gt;wcd.exec&lt;/code&gt; (available on the &lt;code&gt;wcd&lt;/code&gt; package):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/wcd&quot;&gt;https://github.com/javier-lopez/learn/blob/master/sh/tools/wcd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once installed and configured, &lt;strong&gt;$ cd s&lt;em&gt;/m&lt;/em&gt;/pl&lt;/strong&gt; will take us to &lt;strong&gt;super/master/plan&lt;/strong&gt; no matter what the current is, &lt;a href=&quot;http://wcd.sourceforge.net/&quot;&gt;wcd&lt;/a&gt; works by creating an index file with all available directories and looking at it to find the best approximation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WARNING:&lt;/strong&gt; Wcd will require to regenerate the index db every now and then, a cronjob with the following content can help:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
0 23 * * *  /usr/local/bin/update-cd
&lt;/pre&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat /usr/local/bin/update-cd
#!/bin/sh
#description: update wcd db if available
#usage: update-cd

if [ -f &quot;$(command -v &quot;wcd&quot;)&quot; ] &amp;amp;&amp;amp; [ -f &quot;$(command -v &quot;wcd.exec&quot;)&quot; ]; then
    mkdir &quot;${HOME}&quot;/.wcd; wcd.exec -GN -j -xf &quot;${HOME}&quot;/.ban.wcd -S &quot;${HOME}&quot;
    [ -f &quot;${HOME}&quot;/.treedata.wcd ] &amp;amp;&amp;amp; mv &quot;${HOME}&quot;/.treedata.wcd &quot;${HOME}&quot;/.wcd/
fi
&lt;/pre&gt;

&lt;p&gt;Been able to move to any directory from anywhere is really helpful, however sometimes it’s desirable to move around parents and nearby directories efficiently, that’s where &lt;a href=&quot;https://github.com/shyiko/commacd&quot;&gt;commacd&lt;/a&gt; get in. With &lt;code&gt;commacd&lt;/code&gt; several aliases (&lt;code&gt;,&lt;/code&gt;, &lt;code&gt;,,&lt;/code&gt; and &lt;code&gt;,,,&lt;/code&gt;) are defined which can be used on the following scenarios:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ , /u/l/b #moving through multiple directories
=&amp;gt; cd /usr/local/bin
$ , d #moving through multiple directories with the same name
=&amp;gt; 1 Desktop
   2 Downloads
   : &amp;lt;type index of the directory to cd into&amp;gt;
~/code/projects/zion/src/module $ ,, #going up till a project directory is found (git/hg/svn based)
=&amp;gt; cd ~/code/projects/zion
~/code/projects/zion/src/module $ ,, pro #going into the first parent directory named pro*
=&amp;gt; cd ~/code/projects
~/code/projects/zion/src/module $ ,, zion matrix #subtituing the current path and going into the result
=&amp;gt; cd ~/code/projects/matrix/src/module
~/code/projects/zion/src/module $ ,,, matrix/tests #going into a sibling directory who has the same parent directory
=&amp;gt; cd ~/code/projects/matrix/tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As wcd, &lt;code&gt;commacd&lt;/code&gt; is a script who can be downloaded from:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/shyiko/commacd/master/commacd.bash&quot;&gt;https://raw.githubusercontent.com/shyiko/commacd/master/commacd.bash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or to get my personal version:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/javier-lopez/learn/master/sh/tools/commacd&quot;&gt;https://raw.githubusercontent.com/javier-lopez/learn/master/sh/tools/commacd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Upon getting any of them, the script should be used as an alias (due to the nature of the &lt;code&gt;cd&lt;/code&gt; built-in), eg, &lt;strong&gt;~/bashrc&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
if [ -f &quot;$(command -v &quot;commacd&quot;)&quot; ]; then
    . commacd
    alias ,=_commacd_forward
    alias ,,=_commacd_backward
    alias ,,,=_commacd_backward_forward
fi
&lt;/pre&gt;

&lt;p&gt;That’s it, now moving around should feel less archaic, happy cli browsing 😄&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>talks: introduccion a vim</title>
   <link href="https://javier.io/blog/es/2011/02/24/talks-introduccion-a-vim.html"/>
   <published>2011-02-24T00:00:00+00:00</published>
   <updated>2011-02-24T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2011/02/24/talks-introduccion-a-vim</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="talks"/>
   
   <category term="vim"/>
   
   
   
   <summary type="html">talks: introduccion a vim</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2011/02/24/talks-introduccion-a-vim.html">&lt;h2 id=&quot;talks-introduccion-a-vim&quot;&gt;talks: introduccion a vim&lt;/h2&gt;

&lt;h6 id=&quot;24-feb-2011&quot;&gt;24 Feb 2011&lt;/h6&gt;

&lt;p&gt;Hoy di una charla de introducción a &lt;a href=&quot;https://www.vim.org/&quot;&gt;vim&lt;/a&gt; en el
&lt;a href=&quot;http://enli.org.mx&quot;&gt;ENLI&lt;/a&gt; — el Encuentro Nacional de Linux y Software
Libre, en Puebla, México.&lt;/p&gt;

&lt;p&gt;Los slides no son un pdf ni un powerpoint: son &lt;strong&gt;65 archivos &lt;code&gt;.vim&lt;/code&gt; que se
presentan desde vim mismo&lt;/strong&gt; — cada lámina es un buffer, y navegar la charla
es navegar archivos. Si la charla es sobre el editor, ¿qué mejor
demostración que no salir de él en ningún momento?&lt;/p&gt;

&lt;p&gt;Los slides completos están disponibles en
&lt;a href=&quot;/talks/introduccion-a-vim/vim.feb.2011.tar.gz&quot;&gt;talks/introduccion-a-vim/vim.feb.2011.tar.gz&lt;/a&gt;.
Para verlos:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget -qO- javier.io/talks/introduccion-a-vim/vim.feb.2011.tar.gz | tar xz --one-top-level=vim.feb.2011 &amp;amp;&amp;amp; vim -u NONE -N vim.feb.2011/*.vim
&lt;/pre&gt;

&lt;p&gt;Con los 65 slides en la lista de argumentos, &lt;code&gt;:n&lt;/code&gt; avanza y &lt;code&gt;:N&lt;/code&gt; retrocede
— y ya sabes cómo salir ;)&lt;/p&gt;

&lt;p&gt;Update (2017): seis años después di la secuela —
&lt;a href=&quot;/blog/es/2017/07/27/talks-vlide.html&quot;&gt;programación de plugins para vim&lt;/a&gt;,
esta vez presentada con un plugin escrito a la medida para dar charlas.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>lint</title>
   <link href="https://javier.io/blog/en/2011/02/07/lint.html"/>
   <published>2011-02-07T00:00:00+00:00</published>
   <updated>2011-02-07T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2011/02/07/lint</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="personal"/>
   
   
   
   <summary type="html">lint</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2011/02/07/lint.html">&lt;h2 id=&quot;lint&quot;&gt;lint&lt;/h2&gt;

&lt;h6 id=&quot;07-feb-2011&quot;&gt;07 Feb 2011&lt;/h6&gt;

&lt;p&gt;My belly button has always produced lint, it’s a white, soft, and warm guest, she lives there, sometimes at night we talk.., and I realize we like the same things, we ask the same questions and sometimes we even get the same conclusions. This make me think about the possibility of had been a little lint in the belly button of someone else in a previous life.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>share connection between personal computers</title>
   <link href="https://javier.io/blog/en/2010/12/14/share-connection-between-personal-computers.html"/>
   <published>2010-12-14T00:00:00+00:00</published>
   <updated>2010-12-14T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/12/14/share-connection-between-personal-computers</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="shell"/>
   
   
   
   <summary type="html">share connection between personal computers</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/12/14/share-connection-between-personal-computers.html">&lt;h2 id=&quot;share-connection-between-personal-computers&quot;&gt;share connection between personal computers&lt;/h2&gt;

&lt;h6 id=&quot;14-dec-2010&quot;&gt;14 Dec 2010&lt;/h6&gt;

&lt;h3 id=&quot;wireless-to-wired&quot;&gt;Wireless to wired&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;eth0:&lt;/strong&gt; wired link to other machine&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;eth1:&lt;/strong&gt; wireless link to internet&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo ifconfig eth0 10.0.0.1
$ sudo iptables -F
$ sudo iptables -X
$ sudo iptables -t nat -F
$ sudo iptables -t nat -X
$ sudo iptables -t mangle -F
$ sudo iptables -t mangle -X
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
&lt;/pre&gt;

&lt;h3 id=&quot;wired-to-wireless&quot;&gt;Wired to wireless&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;eth0:&lt;/strong&gt; wired link to internet&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;eth1:&lt;/strong&gt; wireless interface as access point in ad-hoc mode&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo iwconfig wlan0 mode ad-hoc
$ sudo iwconfig wlan0 essid proxywlan
$ sudo ifconfig wlan0 10.0.0.1 up
$ sudo iptables -F
$ sudo iptables -X
$ sudo iptables -t nat -F
$ sudo iptables -t nat -X
$ sudo iptables -t mangle -F
$ sudo iptables -t mangle -X
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
&lt;/pre&gt;

&lt;p&gt;After completing any of the previous steps (and if no dhcp daemon has been set up) the client machine will require to be configured manually, eg:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;ip:&lt;/strong&gt; 10.0.0.2&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;gateway:&lt;/strong&gt; 10.0.0.1&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;dns:&lt;/strong&gt; 8.8.8.8&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise you can run a &lt;a href=&quot;https://raw.githubusercontent.com/javier-lopez/learn/master/python/tools/simple-dhcpd&quot;&gt;simple dhcpd&lt;/a&gt; daemon:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo simple-dhcpd -i eth0 -a 10.0.0.1
&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>wire and wireless concurrent connections with wicd</title>
   <link href="https://javier.io/blog/en/2010/12/07/wire-wireless-concurrent-connections-with-wicd.html"/>
   <published>2010-12-07T00:00:00+00:00</published>
   <updated>2010-12-07T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/12/07/wire-wireless-concurrent-connections-with-wicd</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">wire and wireless concurrent connections with wicd</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/12/07/wire-wireless-concurrent-connections-with-wicd.html">&lt;h2 id=&quot;wire-and-wireless-concurrent-connections-with-wicd&quot;&gt;wire and wireless concurrent connections with wicd&lt;/h2&gt;

&lt;h6 id=&quot;07-dec-2010&quot;&gt;07 Dec 2010&lt;/h6&gt;

&lt;p&gt;Even when it’s not possible to configure two concurrent connections from within &lt;a href=&quot;http://wicd.sourceforge.net&quot;&gt;wicd&lt;/a&gt; it can be tricked to do so. To do this the &lt;strong&gt;/etc/network/interfaces&lt;/strong&gt; file must be edited with the wired interface details, eg:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat /etc/network/interfaces
  auto eth0
  iface eth0 inet static
          address 10.0.0.1
          netmask 255.255.255.0
          network 10.0.0.0
          broadcast 10.0.0.255
&lt;/pre&gt;

&lt;p&gt;Afterwards, the wired interface will need to be removed from wicd &lt;strong&gt;properties&lt;/strong&gt;. That’s it!, now the wireless interface can be controled from wicd and the wired one through &lt;strong&gt;ifup&lt;/strong&gt;/&lt;strong&gt;ifdown&lt;/strong&gt; 😇&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://bugs.launchpad.net/wicd/+bug/228578&quot;&gt;https://bugs.launchpad.net/wicd/+bug/228578&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>send emails from terminal</title>
   <link href="https://javier.io/blog/en/2010/11/28/send-emails-from-terminal.html"/>
   <published>2010-11-28T00:00:00+00:00</published>
   <updated>2010-11-28T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/11/28/send-emails-from-terminal</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">send emails from terminal</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/11/28/send-emails-from-terminal.html">&lt;h2 id=&quot;send-emails-from-terminal&quot;&gt;send emails from terminal&lt;/h2&gt;

&lt;h6 id=&quot;28-nov-2010&quot;&gt;28 Nov 2010&lt;/h6&gt;

&lt;p&gt;In some systems the command &lt;strong&gt;mail&lt;/strong&gt; is installed by default and as its name
suggests it’s used to send/read emails (usually between users of the same
system), for this to work a mail server needs to be installed locally, I’m not
sure about others but it sounds like a lot of work for me. I just want a light
client from where I could send some emails. After searching on Internet I came
to &lt;a href=&quot;http://caspian.dotconf.net/menu/Software/SendEmail/&quot;&gt;Sendemail&lt;/a&gt;, a perl
script who connects to external smtp servers and use them to deliver messages:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install -y sendemail libio-socket-ssl-perl libnet-ssleay-perl
&lt;/pre&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sendemail -f from@foo.org \
  -u title -m message       \
  -t to@bar.com             \
  -s mail.foo.com:26        \
  -xu user -xp password
&lt;/pre&gt;

&lt;p&gt;Or with gmail:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sendemail -f from@foo.org \
  -u title -m message       \
  -t to@bar.com             \
  -s smtp.gmail.com:2587    \
  -o tls=yes -xu user -xp password
&lt;/pre&gt;

&lt;p&gt;Now, since gmail blocks hosts per ip, it sometimes doesn’t work when it used
from new locations, it can be very annoying. Fortunately, there are other ways
to send emails within a system, my favorite method is to use
&lt;a href=&quot;http://mailgun.com&quot;&gt;http://mailgun.com&lt;/a&gt;. When using mailgun you only need an
account in such service and &lt;strong&gt;curl&lt;/strong&gt; installed in your system. I’ve created a
script who wraps the required logic and just send emails.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ wget https://raw.github.com/javier-lopez/learn/master/sh/tools/mailgun
$ sh mailgun --api xxx &quot;address@to.com&quot; &quot;message&quot;
&lt;/pre&gt;

&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/6d595bb4e5424b943e54f&quot; width=&quot;640&quot; height=&quot;300&quot;&gt;&amp;nbsp;&lt;/iframe&gt;--&gt;

&lt;p&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>fixing an ubuntu bug</title>
   <link href="https://javier.io/blog/en/2010/11/05/fixing-an-ubuntu-bug.html"/>
   <published>2010-11-05T00:00:00+00:00</published>
   <updated>2010-11-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/11/05/fixing-an-ubuntu-bug</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">fixing an ubuntu bug</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/11/05/fixing-an-ubuntu-bug.html">&lt;h2 id=&quot;fixing-an-ubuntu-bug&quot;&gt;fixing an ubuntu bug&lt;/h2&gt;

&lt;h6 id=&quot;05-nov-2010&quot;&gt;05 Nov 2010&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-fixing-an-ubuntu-bug-1.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-fixing-an-ubuntu-bug-1.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;Daniel Holbach diagram (taken from a random ubuntu mailing
list)&lt;/p&gt;

&lt;p&gt;Related posts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/es/2010/08/06/como-arreglar-bugs-con-bzr-version-corta.html&quot;&gt;como arreglar bugs con bzr –version corta&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/es/2010/08/14/parchando-paquetes-con-quilt-bzr.html&quot;&gt;parchando paquetes con quilt + bzr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally published at &lt;a href=&quot;https://viajemotu.wordpress.com/2010/11/05/fixing-an-ubuntu-bug/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>links aleatorios, semana 25-30/octubre – random links - motu</title>
   <link href="https://javier.io/blog/es/2010/11/02/links-aleatorios-semana-25-30-octubre-random-links.html"/>
   <published>2010-11-02T00:00:00+00:00</published>
   <updated>2010-11-02T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/11/02/links-aleatorios-semana-25-30-octubre-random-links</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">links aleatorios, semana 25-30/octubre – random links - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/11/02/links-aleatorios-semana-25-30-octubre-random-links.html">&lt;h2 id=&quot;links-aleatorios-semana-25-30octubre--random-links---motu&quot;&gt;links aleatorios, semana 25-30/octubre – random links - motu&lt;/h2&gt;

&lt;h6 id=&quot;02-nov-2010&quot;&gt;02 Nov 2010&lt;/h6&gt;

&lt;p&gt;Esta semana, intente volver a conectarme despues de algun tiempo sin recibir
actualizacion, quiero enviar un cordial saludo a los chicos de i.am de go.to
por joderme la vida, solo unos verdaderos bastardos te notifican la suspension
de un servicio con horas de anticipacion, gracias! mi culo jamas habia estado
tan expuesto =)&lt;/p&gt;

&lt;p&gt;Regresando al tema y en vista de las pocas visitas de este blog, sí como esta
escrito en el ‘sobre’ este espacio es principalmente para mi propia
documentación, pero igual me entristese ver que la comunidad latinoamericana
no tiene interes por el empaquetamiento =(, asi que de ahora en adelante,
intentare escribir las entradas en español/ingles, con preferencia a este
último.&lt;/p&gt;

&lt;p&gt;Por que no lo hice desde el principio?, hay varias razones, primero porque hay
muy poca documentación en español, sino puedo generarla por el momento, al
menos traducir las cosas que iba ocupando me parecio buena idea, luego tambien
porque queria darle mas familiaridad al asunto, los tipos que se encargan de
esto no son unos super genios, son gente normal como tu o yo. Lo primero que
probablemente deje de traducir seran los logs de los canales, eso me tomaba
muchisimo tiempo y energia, aunque si llegara a recibir un solo comentario al
respecto lo aria con gusto (que no venga del enfermo de ronicardona -.-).&lt;/p&gt;

&lt;p&gt;Todas las faltas de ortografia/gramatica/coherencia que encuentren por fa, no
sean gachos, comentemelas.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;This week, I tried to plug-in myself again after a while without reading
anything MOTU related, I wanna send greetings to the i.am and go.to team, thx
for making my life a peace of crap, only assh&lt;em&gt;**&lt;/em&gt; cut services a few hours
before going offline, thx again!, my ass had never been so exposed to the air
=)&lt;/p&gt;

&lt;p&gt;Back to the topic and seeing that this blogs has so few visits, yes as I’ve
already written in the ‘about’ section, this blog is mainly for my own
pleasure but it’s still sad to see that the latin american comunity has to
interest in packaging =(, so from now on I’ll write my entries in
spanish/english giving preference to the second one.&lt;/p&gt;

&lt;p&gt;Why I hadn’t done it from the beginning? there are several reasons, first
because there is a lack of documentation in spanish so I thought, If I cannot
write it I will translate the material I read. Second, to make it look more
familiar, the guys who make this possible (the MOTU team) aren’t super genius,
it’s normal people like you and me and last but not least my English truly
SUCKS!&lt;/p&gt;

&lt;p&gt;The first stuff I’ll stop translating will be the ubuntu logs, they take a lot
of time and energy and aren’t viewed nor commented, so I think nobody cares
about them, of course I can be in a mistake, so if someone finds them useful,
just leave a comment and I’ll be happy to translate them again (except if that
person is ronicardona -.-)&lt;/p&gt;

&lt;p&gt;A last word, if you find any mistake in the orthography/grammar/consistency
please leave a comment that way I could improve my English and you’ll have a
huge THANK YOU!&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;http://raphaelhertzog.com/&quot;&gt;http://raphaelhertzog.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Llegue aqui a partir de un articulo de el ubuntu &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuWeeklyNewsletter&quot;&gt;newsletter&lt;/a&gt; (si no las leido, sugiero que lo hagas), es el blog personal de Raphaël Hertzog, un desarrollador de debian con una especial atencion a escribir articulos para usuarios que deseen convertirse en desarrolladores ,no he leido todas sus entradas, pero lo que he hecho me ha gusto, te puedes inscribir para recibir sus actualizaciones por correo,&lt;/p&gt;

&lt;p&gt;I came here because of an article of the amazing ubuntu &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuWeeklyNewsletter&quot;&gt;newsletter&lt;/a&gt; (if you haven’t read it, don’t doubt to checking it out), it’s the personal blog of Raphaël Hertzog, a debian developer who likes writing posts for users who want to become developers, I’ve read all his entries, but the posts I’ve read so far are good, people can subscribe to receive updates by email.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://askubuntu.com/search?q=motu&quot;&gt;http://askubuntu.com/search?q=motu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nada, impresionante fuente de respuestas, para ser sincero creo que contestan
mas rapido que en launchpad, me gusta el hecho de que desarrolladores y MOTU’s
se tomen el tiempo para contestar. No he podido evitar ver informacion hay
sobre lo que me interesa. La pregunta de ‘maco’ es en particular inspiradora.&lt;/p&gt;

&lt;p&gt;An amazing source of answers, to be honest I think it’s faster that launchpad,
one thing I really like is that developers and MOTU’s go and give an answer to
‘normal people’, I couldn’t stop myself from querying the database. The ‘maco’
question is really inspiring.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20170223150952/http://www.jonobacon.org/2010/08/23/getting-more-developers-interested-in-participating-in-ubuntu/&quot;&gt;https://web.archive.org/web/20170223150952/http://www.jonobacon.org/2010/08/23/getting-more-developers-interested-in-participating-in-ubuntu/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://fnords.wordpress.com/2010/08/24/getting-more-developers-interested-in-ubuntu/&quot;&gt;http://fnords.wordpress.com/2010/08/24/getting-more-developers-interested-in-ubuntu/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los links dicen mucho, al parecer en la version 11.04 la comunidad tratara de
involucrar a mas personas en el desarrollo de ubuntu, ojala sea asi =)&lt;/p&gt;

&lt;p&gt;The links are very descriptive, it seems like in the 11.04 version developers
will try to push harder to new comunity members to join the differents teams
to improve ubuntu even more!, I really hope they can do it =)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://lists.ubuntu.com/archives/ubuntu-beginners/2010-October/001196.html&quot;&gt;https://lists.ubuntu.com/archives/ubuntu-beginners/2010-October/001196.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El resumen del UDS (ubuntu developer submit), los UDS son reuniones que se
hacen antes de comenzar a trabajar en una nueva version donde se decide en que
trabajaran los desarrolladores en el ciclo actual.&lt;/p&gt;

&lt;p&gt;The UDS (ubuntu developer submit) summary, the UDS is a meeting which is done
before the developers start working in the next release, many important
decisions are defined here.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://lists.ubuntu.com/archives/ubuntu-beginners/2010-October/001196.html&quot;&gt;https://lists.ubuntu.com/archives/ubuntu-beginners/2010-October/001196.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un hilo de #ubuntu-beginners con varios blogs como este.&lt;/p&gt;

&lt;p&gt;A #ubuntu-beginners thread with several blogs like this.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://daniel.holba.ch/blog/?p=806&quot;&gt;http://daniel.holba.ch/blog/?p=806&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Han liberado la nueva version de Harvest ( &lt;a href=&quot;https://web.archive.org/web/20130812151151/http://harvest.ubuntu.com&quot;&gt;https://web.archive.org/web/20130812151151/http://harvest.ubuntu.com&lt;/a&gt; ), al
parecer una plataforma para hacer mas facil la colaboracion con ubuntu, probe
la version beta, pero no lo entendi, sin embargo creo que habra tutoriales
para aprender a usarlo, lo seguire de cerca&lt;/p&gt;

&lt;p&gt;The new version of Harvest (&lt;a href=&quot;https://web.archive.org/web/20130812151151/http://harvest.ubuntu.com&quot;&gt;https://web.archive.org/web/20130812151151/http://harvest.ubuntu.com&lt;/a&gt;) has been released,
it seems like a platform to making easier to collaborate with ubuntu, I tested
the beta version but to be honest I didn’t get it, however it seems like
tutorials will be made to get involved with it, I’ll look forward to it.&lt;/p&gt;

&lt;p&gt;Eso es todo, aaa, tambien han aceptado 2 de mis parches ^_^, pufff, tambien
tengo que volver a ponerme en contacto con mradn
(&lt;a href=&quot;https://launchpad.com/~mrand&quot;&gt;https://launchpad.com/~mrand&lt;/a&gt;), a estas alturas supongo que creera que estoy
muerto X_X&lt;/p&gt;

&lt;p&gt;That’s all I’ve read lately, ohhh, also 2 of “my” patches has been accepted
^_^, pufff, I need to get in touch with mrand again
(&lt;a href=&quot;https://launchpad.com/~mrand&quot;&gt;https://launchpad.com/~mrand&lt;/a&gt;), he must think I’m dead X_X&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/11/02/links-aleatorios-semana-25-30octubre/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>calavera</title>
   <link href="https://javier.io/blog/es/2010/10/28/calavera.html"/>
   <published>2010-10-28T00:00:00+00:00</published>
   <updated>2010-10-28T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/10/28/calavera</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="poetry"/>
   
   
   
   <summary type="html">calavera</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/10/28/calavera.html">&lt;h2 id=&quot;calavera&quot;&gt;calavera&lt;/h2&gt;

&lt;h6 id=&quot;28-oct-2010&quot;&gt;28 Oct 2010&lt;/h6&gt;

&lt;p&gt;Nada, una calavera de rimas fáciles para la banda extinta de #fel-clan&lt;/p&gt;

&lt;pre class=&quot;lyric&quot;&gt;
Andaba Catrina muy apurada
recorría freenode sin cesar
buscaba un grupo, uno singular
headshot al #fel-clan venia a dar

Pedradas, monólogos en gringo
batallas de emoticons de a montón
waza, y soporte sin distinción

Después de muchos /joins tirar
al canal del team pudo entrar
Hrgn fue al único que encontró
lanzo una granada y el susodicho
sin ENLI y sin cabeza se quedó

Idle entonces espero
a linuxeros, macqueros y windoceros
no importaba pues traía
paz paz para cualquiera
Chanserv le dio @ sin preguntar
uno a uno el averno iban a visitar

Thot entró y esta vez voz no le faltó
gritos dicen que se escucharon
cuando la Catrina desfundó su arma
y los dientes le tumbó

Uno menos se dijo riendo
y enseguida se puso a pensar
le hubiera preguntado cómo
el openBSD actualizar

La noche se acercaba
y la calaca desesperaba
uno, dos, cuatro, entraron de jalón
y a todos se los despachó

Leoi, avento a Ceotz al frente
corrió, saltó y disparó
entonces la máquina se le trabó
y en el acto se lo llevó

Jackrock creyendo que la tenía
disparo con furor
pero quedando out of army
la muerte del hi-skill lo eliminó

Centinela, al ver a todos caer
las paces intento hacer
y cuando en sus manos la tenía
un disparo certero lanzó
mal hizo el chaval, pues la Catrina
un pase VIP al infierno le dió

Más tarde que temprano
Azimov apareció
y viendo todo el tiradero
la submachine gun sacó

En seguida la muerte se lanzó
tres cartuchos descargó
de pies ligeros, ni una bala lo tocó
y a la cuarta, un Chilicuil lo salvó

Chilicuil quedo tendido
ni tiempo le dio de decir OMG
el karma ya le traía ganas
y juntas, todas sus cuentas se las cobró

La muerte lo intento todo
y Azimov le dio batalla
usando hacks no sabía
puedes evadir hasta el lodo

Más en un descuido
Azimov se torció el tobillo
cayo y se enterró su cuchillo

El AA llego, Asarch y Akemi juntitos
a la muerte se le antojaron romeritos
Asarch buzo caperuzo saco el recurso
mendigo misilazo acabo con el intruso

Akemi que no se enteró
piedras, lanzo y lanzo
y al pobre Asarch dio muerte
la única superviviente
&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ipod shuffle and rebuild_db</title>
   <link href="https://javier.io/blog/en/2010/10/18/ipod-shuffle-rebuild-db.html"/>
   <published>2010-10-18T00:00:00+00:00</published>
   <updated>2010-10-18T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/10/18/ipod-shuffle-rebuild-db</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="music"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">ipod shuffle and rebuild_db</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/10/18/ipod-shuffle-rebuild-db.html">&lt;h2 id=&quot;ipod-shuffle-and-rebuild_db&quot;&gt;ipod shuffle and rebuild_db&lt;/h2&gt;

&lt;h6 id=&quot;18-oct-2010&quot;&gt;18 Oct 2010&lt;/h6&gt;

&lt;p&gt;Some time ago I bought an ipod shuffle and as with all apple products it turned out to be somekind difficult to use on Linux. Rythmbox and gtkpod sometimes do weird stuff, so I keept testing projects till I found &lt;a href=&quot;http://shuffle-db.sourceforge.net/&quot;&gt;rebuild_db&lt;/a&gt;, a minimalist program who just get the job done ☃&lt;/p&gt;

&lt;p&gt;After connecting and mounting the device (it only works with shuffle models) you can create any directory (I call it ‘music’) and copy there all your tracks. At the end before unmounting just execute the program and it would rearrange the files and will create the expected structure. I’m now a happy ipod shuffle user 😎&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>comentarios aleatorios, semana 1-20/agosto - motu</title>
   <link href="https://javier.io/blog/es/2010/09/05/comentarios-aleatorios-semana-1-20-agosto.html"/>
   <published>2010-09-05T00:00:00+00:00</published>
   <updated>2010-09-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/09/05/comentarios-aleatorios-semana-1-20-agosto</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">comentarios aleatorios, semana 1-20/agosto - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/09/05/comentarios-aleatorios-semana-1-20-agosto.html">&lt;h2 id=&quot;comentarios-aleatorios-semana-1-20agosto---motu&quot;&gt;comentarios aleatorios, semana 1-20/agosto - motu&lt;/h2&gt;

&lt;h6 id=&quot;05-sep-2010&quot;&gt;05 Sep 2010&lt;/h6&gt;

&lt;p&gt;Quinta entrega que corresponde a la semana del 1 al 20 de Agosto del 2010.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;tuos&amp;gt; Should I mark status to “Fix committed” or “In progress” when I have a fix proposal in my bzr-branch but it is not reviewed yet?
&amp;lt;micahg&amp;gt; tuos: neither
&amp;lt;micahg&amp;gt; tuos: &amp;lt;https://wiki.ubuntu.com/UbuntuDevelopment/CodeReviews&amp;gt;, try asking in #ubuntu-reviews what they like the status to be _**#ubuntu-bugs:**
&amp;lt;tuos&amp;gt; deberia marcar el reporte como “Fix committed” o como “In progress” si tengo un parche en alguna de mis ramas en bzr? importa si aun no ha sido revisado?
&amp;lt;micahg&amp;gt; tuos: de ninguna forma
&amp;lt;micahg&amp;gt; tuos: &amp;lt;https://wiki.ubuntu.com/UbuntuDevelopment/CodeReviews&amp;gt;, o pregunta en **#ubuntu-reviews**
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;brummbaer&amp;gt; hello. i’d like to volunteer some time helping the bugsquad, and to make sure i get in the flow smoothly, i was hoping to sign up for a mentor. this page (&amp;lt;https://wiki.ubuntu.com/BugSquad/Mentors&amp;gt;) says i need to create a user wiki-page? is that necessary, and if so, how can i do so?
&amp;lt;JoeMaverickSett&amp;gt; brummbaer, i think you should take a look at these:
&amp;lt;https://wiki.ubuntu.com/HelpOnEditing&amp;gt;,
&amp;lt;https://wiki.ubuntu.com/HomepageBTTemplate&amp;gt;,
&amp;lt;https://wiki.ubuntu.com/HomepageBTTemplate2&amp;gt;
&amp;lt;brummbaer&amp;gt; thanks JoeMaverickSet; i’ve gone ahead and setup the wiki page, added it to my launchpad profile and applied to bugsquad-mentors and bugsquad. looking forward to helping out! _**#ubuntu-bugs:**
&amp;lt;brummbaer&amp;gt; hola. Me gustaria colaborar con el equipo bugsquad y asegurarme que lo hago de la manera adecuada, entonces tenia la esperanza de poder aplicar por un mentor. Esta pagina (&amp;lt;https://wiki.ubuntu.com/BugSquad/Mentors&amp;gt;) menciona que debo crear una pagina wiki para mi usuario, es realmente necesario?, si lo es, como puedo hacerlo?
&amp;lt;JoeMaverickSett&amp;gt; brummbaer, creo que deberias hecharle un vistazo a estos links: &amp;lt;https://wiki.ubuntu.com/HelpOnEditing&amp;gt;,
&amp;lt;https://wiki.ubuntu.com/HomepageBTTemplate,&amp;gt;
&amp;lt;https://wiki.ubuntu.com/HomepageBTTemplate2&amp;gt;
&amp;lt;brummbaer&amp;gt; gracias JoeMaverickSet; he seguido tu recomendacion y he creado la pagina, la agregue a mi perfil en launchpad y he creado mi solicitud para los equipos bugsquad-mentors y bugsquad. Esperando poder comenzar a ayudar.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;vish&amp;gt; what happened to menu item Help &amp;gt; Report a problem? it seems missing in Lucid
&amp;lt;seb128&amp;gt; vish, stable users usually want to get help not to report a bug, they are not technical enough for bugs
&amp;lt;vish&amp;gt; seb128: agreed , just wondering what happened.. has it always been removed after a release?
&amp;lt;seb128&amp;gt; no, we decided to try that in lucid
&amp;lt;vish&amp;gt; ah , cool. _**#ubuntu-bugs:**
&amp;lt;vish&amp;gt; que le paso al menu Ayuda &amp;gt; Reportar un fallo? al parecer no esta en Lucid
&amp;lt;seb128&amp;gt; vish, los usuarios que corren la version estable, en general quieren conseguir ayuda, no reportar un error, no son lo suficientemente tecnicos para hacerlo.
&amp;lt;vish&amp;gt; seb128: estoy de acuerdo, solo me preguntaba que habia pasado.. siempre se elimina despues de liberarse?
&amp;lt;seb128&amp;gt; no, decidimos probarlo por primera vez en lucid
&amp;lt;vish&amp;gt; ah , cool.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;km0r3&amp;gt; I need to forward bug 613622 to project’s bug tracker on SourceForge. I’ve opened a new bug and copypasted the information; is this the only way for forwarding bugs to SF?
&amp;lt;ubot2&amp;gt; Launchpad bug 613622 in qtpfsgui (Ubuntu) “qtpfsgui crash (affects: 1) (heat: 6)” [Undecided,New] &amp;lt;https://launchpad.net/bugs/613622&amp;gt;
&amp;lt;micahg&amp;gt; km0r3: yeah, you can link the bug if there’s an upstream project in LP _**#ubuntu-bugs:**
&amp;lt;km0r3&amp;gt; Quiero enviar el reporte [613622][114] al bugtracker de [SourceForge][115]. He abierto un nuevo bug y he copiado y pegado la informacion; esta es la unica dorma de mandarlos a SF?
&amp;lt;ubot2&amp;gt; Launchpad bug 613622 in qtpfsgui (Ubuntu) “qtpfsgui crash (affects: 1) (heat: 6)” [Undecided,New] &amp;lt;https://launchpad.net/bugs/613622&amp;gt;
&amp;lt;micahg&amp;gt; km0r3: si, puedes adjuntar el link si el proyecto original esta en LP
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;Hankyone&amp;gt; If i was to file a bug for a non working webcam, what log/file should I submit it with?
&amp;lt;micahg&amp;gt; Hankyone: &amp;lt;https://wiki.ubuntu.com/DebuggingHardwareDetection&amp;gt;
&amp;lt;Hankyone&amp;gt; micahg: Thanks! _**#ubuntu-bugs:**
&amp;lt;Hankyone&amp;gt; Si quisiera reportar un bug para una camara que no funciona, que archivo/log deberia adjuntar?
&amp;lt;micahg&amp;gt; Hankyone: &amp;lt;https://wiki.ubuntu.com/DebuggingHardwareDetection&amp;gt;
&amp;lt;Hankyone&amp;gt; micahg: Gracias!
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;JoshuaL&amp;gt; I have this bug where if i plug in my headphones it does not switch to the connector automaticly, i have to do it manually. same with unplugging.
&amp;lt;JoshuaL&amp;gt; What package should be used to report this bug?
&amp;lt;Pici&amp;gt; JoshuaL: I think you can just issue: ubuntu-bug audio and it will take care of the rest.
&amp;lt;JoshuaL&amp;gt; Pici, ok ty _**#ubuntu-bugs:**
&amp;lt;JoshuaL&amp;gt; Tengo este problema cuando conecto mis audifonos, al hacerlo el sonido no cambia a ellos automaticamente, tengo que hacerlo manualmente, lo mismo pasa cuando los desconecto.
&amp;lt;JoshuaL&amp;gt; A que paquete deberia reportar este error?
&amp;lt;Pici&amp;gt; JoshuaL: Creo que puedes usar: ubuntu-bug audio se encargara de reunir los datos necesesario.
&amp;lt;JoshuaL&amp;gt; Pici, ok gracias
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;drizzle&amp;gt; anyone here?
&amp;lt;drizzle&amp;gt; &amp;lt;https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/599466&amp;gt; is an upstream bug already reported in debian
&amp;lt;ubot2&amp;gt; Ubuntu bug 599466 in tzdata (Ubuntu) “tzdata refers to Americas as “America” (affects: 1) (heat: 97)” [Undecided,New]
&amp;lt;drizzle&amp;gt; &amp;lt;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508118&amp;gt;
&amp;lt;ubot2&amp;gt; Debian bug 508118 in tzdata “Incorrect term for Americas” [Minor,Open]
&amp;lt;micahg&amp;gt; drizzle: Also affects Distro, select debian and add tzdata as the package w/the link
&amp;lt;hggdh&amp;gt; drizzle: good. You can, then, add an upstream link to the bug
&amp;lt;drizzle&amp;gt; ok
&amp;lt;drizzle&amp;gt; im sorry
&amp;lt;drizzle&amp;gt; but how do i do this
&amp;lt;drizzle&amp;gt; im looking at the ubuntu bug
&amp;lt;hggdh&amp;gt; drizzle: select “Also affects distribution”, then select Debian, and add the link there
&amp;lt;drizzle&amp;gt; ok i did that
&amp;lt;drizzle&amp;gt; now i see
&amp;lt;drizzle&amp;gt; the screen has a lot of stuff on it
&amp;lt;hggdh&amp;gt; yes. Make sure you select Debian
&amp;lt;drizzle&amp;gt; i id
&amp;lt;drizzle&amp;gt; did
&amp;lt;drizzle&amp;gt; can i confirm it
&amp;lt;drizzle&amp;gt; i confirmed it in ubuntu
&amp;lt;hggdh&amp;gt; perfect. I will set it as Triaged _**#ubuntu-bugs:**
&amp;lt;drizzle&amp;gt; alguien por aqui?
&amp;lt;drizzle&amp;gt; [https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/599466][116]es un reporte de upstream que tambien esta en Debian
&amp;lt;ubot2&amp;gt; Ubuntu bug 599466 in tzdata (Ubuntu) “tzdata refers to Americas as “America” (affects: 1) (heat: 97)” [Undecided,New]
&amp;lt;drizzle&amp;gt; [http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=508118][117]
&amp;lt;ubot2&amp;gt; Debian bug 508118 in tzdata “Incorrect term for Americas” [Minor,Open]
&amp;lt;micahg&amp;gt; drizzle: Haz click en ‘Also affects Distro‘ y selecciona a debian y agrega a tzdata como el paquete afectado
&amp;lt;hggdh&amp;gt; drizzle: bien. despues puedes agregar el link del reporte en debian al bug
&amp;lt;drizzle&amp;gt; ok
&amp;lt;drizzle&amp;gt; lo siento
&amp;lt;drizzle&amp;gt; como lo hago?
&amp;lt;drizzle&amp;gt; lo estoy buscando en el reporte de ubuntu
&amp;lt;hggdh&amp;gt; drizzle: selecciona “Also affects distribution“, luego Debian, y agrega el link ahi
&amp;lt;drizzle&amp;gt; ok listo
&amp;lt;drizzle&amp;gt; ya veo
&amp;lt;drizzle&amp;gt; la pagina tiene muchas opciones
&amp;lt;hggdh&amp;gt; si. Asegurate de haber seleccionado Debian
&amp;lt;drizzle&amp;gt; si, lo hizo
&amp;lt;drizzle&amp;gt; y puedo confirmarlo en Ubuntu
&amp;lt;hggdh&amp;gt; perfecto. Puedo marcarlo como ‘Triaged‘
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;renier1&amp;gt; hi folks
&amp;lt;renier1&amp;gt; i’m hitting a nasty bug on ubuntu 10.04 netbook edition and would like to submit a report (my first)
&amp;lt;renier1&amp;gt; i’d appreciate some help on how to collect information for the report
&amp;lt;renier1&amp;gt; basically, i’m hitting a hang in the user interface, this occurs intermittently
&amp;lt;vish&amp;gt; renier1: what is the bug? what symptoms?
&amp;lt;renier1&amp;gt; by hang i mean, i’ve got mouse movement, but mouse clicks don’t respond at all
&amp;lt;renier1&amp;gt; prtscr works
&amp;lt;renier1&amp;gt; and i can switch to console mode with CTRL-ALT-F1
&amp;lt;renier1&amp;gt; can’t switch between apps (this usually occurs while browsing with either chrome or firefox)
&amp;lt;gorilla&amp;gt; renier1: have a read of the following:
&amp;lt;https://help.ubuntu.com/community/ReportingBugs&amp;gt;
&amp;lt;renier1&amp;gt; thanks gorilla, i will check it out
&amp;lt;vish&amp;gt; renier1: hang , and it does not respond or takes a very long time to respond?
&amp;lt;vish&amp;gt; hangs*
&amp;lt;renier1&amp;gt; vish, it does not respond, within 5-10 minutes. i’ve not left it any longer
&amp;lt;renier1&amp;gt; it’s been happened about 5times in the past 2-3weeks, never happened before
&amp;lt;renier1&amp;gt; i’ve installed all the automatic updates that the system suggested during that time, which leads me to suspect it’s a new bug
&amp;lt;vish&amp;gt; renier1: hmm , its probably something related to you graphics drivers , try checking launchpad for existing bugs
&amp;lt;renier1&amp;gt; i will do, thanks vish
&amp;lt;renier1&amp;gt; i’m from a solaris background, so my first inclination is to collect a crash dump for analysis
&amp;lt;renier1&amp;gt; is there an easy way to do this on ubuntu?
&amp;lt;JoshuaL&amp;gt; ubuntu-bug packagename
&amp;lt;renier1&amp;gt; JoshuaL, my problem is that it’s not easily apparent in which package the bug lives
&amp;lt;JoshuaL&amp;gt; ah
&amp;lt;renier1&amp;gt; the problem has occurred while using different browsers, and impacts the entire user interface
&amp;lt;renier1&amp;gt; for reference the graphics driver:
&amp;lt;renier1&amp;gt; VGA compatible controller: Intel Corporation Mobile 945GME Express Integrated Graphics Controller
&amp;lt;renier1&amp;gt; so, when i speak of crash dump i mean a dump of the entire os for post mortem analysis
&amp;lt;renier1&amp;gt; thanks for the help. i will check launchpad for existing bugs and log a placeholder bug describing the symptoms the next time the problem occurs
&amp;lt;JoshuaL&amp;gt; good luck finding the bug 🙂
&amp;lt;renier1&amp;gt; thanks 🙂
&amp;lt;renier1&amp;gt; hah, found the following which helps a lot:
&amp;lt;renier1&amp;gt; &amp;lt;https://wiki.ubuntu.com/X/Troubleshooting/Freeze&amp;gt; _**#ubuntu-bugs:**
&amp;lt;renier1&amp;gt; hola gente
&amp;lt;renier1&amp;gt; estoy peleando con un bug horrible en la version netbook de ubuntu 10.04 y me gustaria reportarlo (el primero)
&amp;lt;renier1&amp;gt; apreciaria que pudieran ayudarme a recolectar informacion para el reporte
&amp;lt;renier1&amp;gt; basicamente, se traba en la interfaz de usuario, ocurre aleatoriamente
&amp;lt;vish&amp;gt; renier1: que error? que sintomas?
&amp;lt;renier1&amp;gt; cuando digo que se traba quiero decir que puedo mover el raton, pero los clicks del raton no responden en absoluto
&amp;lt;renier1&amp;gt; el prtscr (puntero en pantalla?) funciona
&amp;lt;renier1&amp;gt; y puedo moverme entre las consolas con CTRL-ALT-F1
&amp;lt;renier1&amp;gt; aunque no puedo moverme entre aplicaciones (esto generalmente ocurre cuando estoy navegando con ya sea chrome o firefox)
&amp;lt;gorilla&amp;gt; renier1: echale un vistazo a:
&amp;lt;https://help.ubuntu.com/community/ReportingBugs&amp;gt;
&amp;lt;renier1&amp;gt; gracias gorilla, le dare una leida
&amp;lt;vish&amp;gt; renier1: umm se traba.., y de plano no responde o se tarda mucho?
&amp;lt;renier1&amp;gt; vish, no, no responde como 5-10 minutos. no lo he dejado mas tiempo
&amp;lt;renier1&amp;gt; me ha pasado como 5 veces en 2-3 semanas, nunca me habia pasado antes
&amp;lt;renier1&amp;gt; he instalado todas las actualizaciones automaticas que el sistema me ha sugerido, lo que me hace pensar que se trata de un nuevo error
&amp;lt;vish&amp;gt; renier1: hmm , tal vez tenga que ver con los drivers de tu tarjeta grafica, busca si encuentras errores similares en launchpad
&amp;lt;renier1&amp;gt; lo are, gracias vish
&amp;lt;renier1&amp;gt; vengo de usar solaris, asi que mi primera reaccion fue tratar de tomar un volcado de la memoria para analizarlo
&amp;lt;renier1&amp;gt; hay alguna forma indolora de hacer esto en ubuntu?
&amp;lt;JoshuaL&amp;gt; ubuntu-bug nombre_del_paquete
&amp;lt;renier1&amp;gt; JoshuaL, el problema es que, no estoy seguro de en que paquete se encuentre el error
&amp;lt;JoshuaL&amp;gt; ah
&amp;lt;renier1&amp;gt; el problema ocurre al momento de usar diferentes navegadores y afecta a toda la interfaz grafica
&amp;lt;renier1&amp;gt; para mayor referencia adjunto el driver que tengo:
&amp;lt;renier1&amp;gt; VGA compatible controller: Intel Corporation Mobile 945GME Express Integrated Graphics Controller
&amp;lt;renier1&amp;gt; asi, que cuando hablo de volcado, me refiero a un volcado de todo el sistema.
&amp;lt;renier1&amp;gt; gracias por la ayuda. buscare en launchpad y vere si puedo crear un log de lo que pasa la siguiente vez que el error se produzca
&amp;lt;JoshuaL&amp;gt; buena suerte 🙂
&amp;lt;renier1&amp;gt; gracias 🙂
&amp;lt;renier1&amp;gt; hah, he encontrado lo siguiente que al parecer esclarece mucho mas las cosas:
&amp;lt;renier1&amp;gt; [https://wiki.ubuntu.com/X/Troubleshooting/Freeze][118]
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dlbike76&amp;gt; Hello
&amp;lt;dlbike76&amp;gt; Is anyone from BugSquad around?
&amp;lt;micahg&amp;gt; dlbike76: for a couple minutes
&amp;lt;dlbike76&amp;gt; Ok so I’m looking at bug 613504. I have found a similar bug report at the upstream gnome bugtracker (#602494).
&amp;lt;ubot2&amp;gt; Launchpad bug 613504 in gnome-media (Ubuntu) “maximum output volume is not reached with voume control (affects: 1) (heat: 6)” [Undecided,New]
&amp;lt;https://launchpad.net/bugs/613504&amp;gt;
&amp;lt;dlbike76&amp;gt; Is finding the upstream bug report enough to change the status to confirmed?
&amp;lt;micahg&amp;gt; gnome 602494
&amp;lt;ubot2&amp;gt; Gnome bug 602494 in gnome-volume-control “allow media keys, mouse scroll wheel to use volume &amp;gt;100% once active” [Normal,Unconfirmed]
&amp;lt;http://bugzilla.gnome.org/show_bug.cgi?id=602494&amp;gt;
&amp;lt;maco&amp;gt; dlbike76: i would say yes
&amp;lt;micahg&amp;gt; not exactly the same bug
&amp;lt;dlbike76&amp;gt; Okay.
&amp;lt;maco&amp;gt; oh yeah those arent the same
&amp;lt;micahg&amp;gt; maco: you want to take over, I’m about to head to sleep
&amp;lt;maco&amp;gt; but in cases where you DO find actually-matching bugs, yes, id call that confirmed
&amp;lt;maco&amp;gt; micahg: not particularly 😛
&amp;lt;dlbike76&amp;gt; Thanks. I’ll keep looking. _**#ubuntu-bugs:**
&amp;lt;dlbike76&amp;gt; Hola
&amp;lt;dlbike76&amp;gt; hay alguien del equipo BugSquad por el momento?
&amp;lt;micahg&amp;gt; dlbike76: por 1 par de minutos
&amp;lt;dlbike76&amp;gt; Ok bien estoy buscando referencias sobre el bug [613504][119]. He encontrado un reporte similar en el bugtracker de gnome (#[602494][120]).
&amp;lt;ubot2&amp;gt; Launchpad bug 613504 in gnome-media (Ubuntu) “maximum output volume is not reached with voume control (affects: 1) (heat: 6)” [Undecided,New]
&amp;lt;https://launchpad.net/bugs/613504&amp;gt;
&amp;lt;dlbike76&amp;gt; encontrar un reporte en upstream es suficiente para marcar un paquete como ‘confirmed‘?
&amp;lt;micahg&amp;gt; gnome 602494
&amp;lt;ubot2&amp;gt; Gnome bug 602494 in gnome-volume-control “allow media keys, mouse scroll wheel to use volume &amp;gt;100% once active” [Normal,Unconfirmed]
&amp;lt;http://bugzilla.gnome.org/show_bug.cgi?id=602494&amp;gt;
&amp;lt;maco&amp;gt; dlbike76: yo diria que si
&amp;lt;micahg&amp;gt; no es exactamente el mismo error
&amp;lt;dlbike76&amp;gt; Ok
&amp;lt;maco&amp;gt; oh es cierto, no son el mismo
&amp;lt;micahg&amp;gt; maco: quieres continuar?, me gustaria ir a dormir
&amp;lt;maco&amp;gt; pero en el caso de que encontraras reportes que se refieran al MISMO error, si, yo diria que puedes confirmarlo
&amp;lt;maco&amp;gt; micahg: no realmente 😛
&amp;lt;dlbike76&amp;gt; Gracias. Seguire buscando.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;darran&amp;gt; hi all
&amp;lt;darran&amp;gt; can someone mark &amp;lt;https://bugs.launchpad.net/gedit/+bug/615506&amp;gt; as triaged please?
&amp;lt;ubot2&amp;gt; Ubuntu bug 615506 in gedit (Ubuntu) (and 1 other project) “Underscore must be a part of the word (affects: 1) (heat: 6)” [Undecided,New]
&amp;lt;yofel&amp;gt; darran: which importance?
&amp;lt;darran&amp;gt; wishlist or low
&amp;lt;yofel&amp;gt; well, decide and give me a reason
&amp;lt;drizzle&amp;gt; wishlist
&amp;lt;drizzle&amp;gt; it is marked as an enhancement in gnome
&amp;lt;drizzle&amp;gt; and it is not part of the product design _**#ubuntu-bugs:**
&amp;lt;darran&amp;gt; hola a todos
&amp;lt;darran&amp;gt; alguien podria cambiar el estatus de [https://bugs.launchpad.net/gedit/+bug/615506][121]a ‘triaged‘ por favor?
&amp;lt;ubot2&amp;gt; Ubuntu bug 615506 in gedit (Ubuntu) (and 1 other project) “Underscore must be a part of the word (affects: 1) (heat: 6)” [Undecided,New]
&amp;lt;yofel&amp;gt; darran: con que importancia?
&amp;lt;darran&amp;gt; ‘wishlist‘ o ‘low‘
&amp;lt;yofel&amp;gt; bueno, escoge 1 y me das una razon
&amp;lt;drizzle&amp;gt; wishlist
&amp;lt;drizzle&amp;gt; esta marcado como una mejora en gnome
&amp;lt;drizzle&amp;gt; y no es parte del diseño del programa
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;devildante&amp;gt; guys, how can one forward patches to Debian?
&amp;lt;micahg&amp;gt; devildante: submittodebian or reportbug
&amp;lt;yofel&amp;gt; devildante: &amp;lt;https://wiki.ubuntu.com/Debian/Bugs&amp;gt;
&amp;lt;devildante&amp;gt; micahg, yofel: thank you 🙂 _**#ubuntu-bugs:**
&amp;lt;devildante&amp;gt; chicos, como puedo reeviar parches a Debian?
&amp;lt;micahg&amp;gt; devildante: usa ‘submittodebian‘ o ‘reportbug‘
&amp;lt;yofel&amp;gt; devildante: &amp;lt;https://wiki.ubuntu.com/Debian/Bugs&amp;gt;
&amp;lt;devildante&amp;gt; micahg, yofel: gracias 🙂
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;Darxus&amp;gt; &amp;lt;http://packages.ubuntu.com/maverick/&amp;gt; is broken.
&amp;lt;Pici&amp;gt; Yes. _**#ubuntu-bugs:**
&amp;lt;Darxus&amp;gt; &amp;lt;http://packages.ubuntu.com/maverick/&amp;gt; esta roto.
&amp;lt;Pici&amp;gt; Si
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;MichealH&amp;gt; Hi. I am part of the bug squad on Launchpad but somehow I cant Triage bugs. Why?
&amp;lt;MichealH&amp;gt; Anyone?
&amp;lt;micahg&amp;gt; MichealH: setting bugs to triaged is a function of bug control, you can request bugs to be set in here
&amp;lt;MichealH&amp;gt; Ahh Okay but doesn’t applying for BugControl mean triaging 5 bugs?
&amp;lt;micahg&amp;gt; MichealH: it means triaging a lot more than 5, you just show 5 in the app
&amp;lt;MichealH&amp;gt; Yeah, I know
&amp;lt;micahg&amp;gt; MichealH: like I said, you can request it to be set in here, the triaged status tells developers there’s something to look at here, so it’s restricted
&amp;lt;MichealH&amp;gt; Does it mean you had gotten someone to triage the bugs?
&amp;lt;micahg&amp;gt; MichealH: no, it means ready for a dev to work on it (i.e. has all necessary info)
&amp;lt;MichealH&amp;gt; Yeah _**#ubuntu-bugs:**
&amp;lt;MichealH&amp;gt; Hola, soy parte del equipo de BugSquad en launchpad pero de alguna maera no puedo marcar bugs como ‘triaged‘, porque?
&amp;lt;MichealH&amp;gt; Alguien?
&amp;lt;micahg&amp;gt; MichealH: marcar bugs como ‘triaged‘ es una funcion del equipo BugControl, puedes pedir que te dejen entrar al grupo
&amp;lt;MichealH&amp;gt; Ahh Ok pero eso no quiere decir que primero tengo que clasificar (triage) 5 bugs?
&amp;lt;micahg&amp;gt; MichealH: son muchos mas que 5, en la peticion solo muestras 5
&amp;lt;MichealH&amp;gt; OK, ya veo
&amp;lt;micahg&amp;gt; MichealH: como dije, puedes pedir que te dejen entrar, el estatus ‘triaged’ le dice a los desarrolladores que hay algo que necesita checarse ahi, asi que esta restringido
&amp;lt;MichealH&amp;gt; quiere decir que haz encontrado a alguien que marcara los bugs?
&amp;lt;micahg&amp;gt; MichealH: no, quiere decir que esta listo para que un desarrollador pueda trabajar con el (por ejemplo, que tiene toda la informacion necesaria)
&amp;lt;MichealH&amp;gt; ok
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;lanoxx&amp;gt; why can i choose als other states such as fix commited or in progress but not triaged?
&amp;lt;maco&amp;gt; lanoxx: only Bug Control members can do that
&amp;lt;maco&amp;gt; ask here if you need one set
&amp;lt;lanoxx&amp;gt; does triaged have a special meaning?
&amp;lt;maco&amp;gt; yes, it means “dear developer: your turn” _**#ubuntu-bugs:**
&amp;lt;lanoxx&amp;gt; porque puedo escoger otros estado como ‘fix commited‘ o ‘in progress‘ pero no ‘triaged‘?
&amp;lt;maco&amp;gt; lanoxx: solo los miembros del equipo BugControl pueden hacerlo
&amp;lt;maco&amp;gt; pregunta aqui si necesitas que uno sea marcado como ‘triaged‘
&amp;lt;lanoxx&amp;gt; ese estado tiene un significado especial?
&amp;lt;maco&amp;gt; si, quiere decir “desarrollador: tu turno”
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;yofel&amp;gt; njin: [10:26:39] why, at the end of a bug page if i hit report another bug it link to the wiki page?
&amp;lt;yofel&amp;gt; that’s because that link goes directly to the launchpad bug filing page, without adding the ‘no-redirect’ option to the link, and as a normal user you get redirected to the wiki page in this case
&amp;lt;yofel&amp;gt; as you generally shouldn’t file bugs this way
&amp;lt;yofel&amp;gt; so that’s intentionally, not an issue with launchpad 😉 _**#ubuntu-bugs:**
&amp;lt;yofel&amp;gt; njin: [10:26:39] porque, si al final de un reporte hago click en ‘report another bug‘ me manda a la wiki?
&amp;lt;yofel&amp;gt; porque esa pagina va a la pagina de launchpad sin agregarle la opcion ‘no-redirect’, y como usuario ordinario, te redirige a la wiki en ese caso
&amp;lt;yofel&amp;gt; ya que, en general no deberias llenar reportes de esa forma
&amp;lt;yofel&amp;gt; asi que intensional, no es un error en launchpad 😉
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;njin&amp;gt; pedro_: we support backported packages?
&amp;lt;pedro_&amp;gt; njin, yes, have a look to
&amp;lt;https://help.ubuntu.com/community/UbuntuBackports&amp;gt; for more info about those
&amp;lt;njin&amp;gt; pedro_: thanks _**#ubuntu-bugs:**
&amp;lt;njin&amp;gt; pedro_: soportamos paquetes de backport? (backport es un repositorio extra donde se ponen versiones mas nuevas de los programas que no pueden ser agregadas a los repositorios principales de la version estable)
&amp;lt;pedro_&amp;gt; njin, si, dale una leida a esto
&amp;lt;https://help.ubuntu.com/community/UbuntuBackports&amp;gt;
&amp;lt;njin&amp;gt; pedro_: gracias
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;unimatrix&amp;gt; &amp;lt;http://packages.ubuntu.com/maverick/&amp;gt; any idea what’s going on here?
&amp;lt;ari-tczew&amp;gt; unimatrix: packages.ubuntu.com is orphaned _**#ubuntu-devel:**
&amp;lt;unimatrix&amp;gt; &amp;lt;http://packages.ubuntu.com/maverick/&amp;gt; alguna idea de lo que esta pasando aqui?
&amp;lt;ari-tczew&amp;gt; unimatrix: [packages.ubuntu.com][122] no tiene mantenedor
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;hrw&amp;gt; hi
&amp;lt;hrw&amp;gt; what is a procedure to get package from Debian to be available in Ubuntu?
&amp;lt;hrw&amp;gt; other then “compile it by yourself and keep it locally”
&amp;lt;ajmitch&amp;gt; generally just a sync request is needed to get it into the development release, though we’re pretty much at feature freeze
&amp;lt;sladen&amp;gt; hrw: sync request
&amp;lt;sladen&amp;gt; hrw: but you’ve got about 2 hours left to make it during this release cycle 🙂
&amp;lt;ajmitch&amp;gt; once it’s in the development release a backport to stable releases can be requested _**#ubuntu-devel:**
&amp;lt;hrw&amp;gt; hola
&amp;lt;hrw&amp;gt; cuales es el procedimiento para que un paquete de Debian este disponible en Ubuntu?
&amp;lt;hrw&amp;gt; otro que no sea “compilalo por ti mismo y mantenlo localmente”
&amp;lt;ajmitch&amp;gt; generalmente una peticion de sincronizacion (sync request) es necesario para copiarla a la version en desarrollo, aunque estamos muy cerca del feature freeze (a partir de esa fecha, no se aceptan nuevos paquetes, ni actualizaciones, solo se corrigen errores conocidos)
&amp;lt;sladen&amp;gt; hrw: sync request
&amp;lt;sladen&amp;gt; hrw: tienes como 2 hrs para meterlos en este ciclo (maverick) 🙂
&amp;lt;ajmitch&amp;gt; una vez que este en la version en desarrollo, puedes pedir un backport para la version estable (lucid)
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;neeraj&amp;gt; Can i download the source code of a latest released version of a certain package without using dget command on the dsc file?
&amp;lt;neeraj&amp;gt; Laney: what if I don’t have the package with me right now. I just want to quickly download source code of latest release of xyz package in Maverick.
&amp;lt;Laney&amp;gt; neeraj: If you have a maverick deb-src line, apt-get source package
&amp;lt;Laney&amp;gt; …or pull-lp-source package if you have ubuntu-dev-tools installed, or bzr branch lp:ubuntu/package
&amp;lt;Laney&amp;gt; many ways
&amp;lt;neeraj&amp;gt; Laney: ok Thanks for the pointers. Last question. If I have lucid and wants to download the source code of xyz package from Maverick, then what flag i should use. _**#ubuntu-devel:**
&amp;lt;neeraj&amp;gt; hay alguna forma de descargar la ultima version del codigo fuente de un paquete sin tener que usar dget con un archivo dsc?
&amp;lt;neeraj&amp;gt; Laney: Solo quiero descargar el codigo fuente de la ultima version del paquete xyz en Maverick
&amp;lt;Laney&amp;gt; neeraj: Lo puedes hacer si tienes una linea deb-src para maverick, si lo haces asi puedes decargarlo con apt-get source paquete
&amp;lt;Laney&amp;gt; o puedes usar pull-lp-source paquete si tienes instalado ubuntu-dev- tools, o tambien bzr branch lp:ubuntu/paquete
&amp;lt;Laney&amp;gt; hay muchas formas
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;lanoxx&amp;gt; im wondering what is necessary to approve a pending merge request for bzr? If I have read the code changes and think they are ok, can i approve a merge or do i need to part of some special group to do such a thing?
&amp;lt;lanoxx&amp;gt; In Launchpad I can choose approve Approve and enter a “review type” what should i enter there?
&amp;lt;lanoxx&amp;gt; does that have any effect?
&amp;lt;micahg&amp;gt; lanoxx: for Ubuntu, it’s ubuntu-dev, you can help test by joining the reviews team
&amp;lt;lanoxx&amp;gt; the particular packet is update-notifier
&amp;lt;lanoxx&amp;gt; Do I need to show that I have programming experience or anything to be in the review team?
&amp;lt;RAOF&amp;gt; Note that approving the merge is purely metadata – it’s not going to actually merge the code.
&amp;lt;RAOF&amp;gt; If you’re familiar with kernel or X development, consider it the same as a Reviewed-By: tag.
&amp;lt;ajmitch&amp;gt; maybe some time in the future, approving a merge on LP will do the merge, and automagically create a package from that. But not now
&amp;lt;micahg&amp;gt; lanoxx: I don’t think so, you can get more information in #ubuntu- reviews _**#ubuntu-devel:**
&amp;lt;lanoxx&amp;gt; me pregunto que necesito hacer para aprobar una peticion de ‘merge’ en bzr, si he leido los cambios y creo que estan bien, puedo aprobarlo? o necesito ser parte de un equipo especial para hacerlo?
&amp;lt;lanoxx&amp;gt; puedo escoger ‘Approve‘ en launchpad pero no se que introducir en el tipo de ‘revision’, que deberia poner?
&amp;lt;lanoxx&amp;gt; tiene algun efecto?
&amp;lt;micahg&amp;gt; lanoxx: para Ubuntu, es ubuntu-dev, puedes ayudar uniendote a los equipos de revisores
&amp;lt;lanoxx&amp;gt; el paquete particular es update-notifier
&amp;lt;lanoxx&amp;gt; necesito probar que tengo experiencia programando o alguna otra cosa para entrar al equipo?
&amp;lt;RAOF&amp;gt; Ojo que aprobar al ‘merge’, solamente combinas metadatos – no va a fusionar los cambios en realidad
&amp;lt;RAOF&amp;gt; si no tienes problemas con el desarrollo del kernel o de la X, puedes usar la etiqueda: ‘Reviewed-By’
&amp;lt;ajmitch&amp;gt; tal vez en el futuro, aprobar una peticion de fusion en LP, realmente aceptara los cambio y creara un paquete automaticamente a partir de ahi, por el momento no
&amp;lt;micahg&amp;gt; lanoxx: no lo creo, puedes leer obtener mas informacion en #ubuntu- reviews
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;mycae&amp;gt; Hello. I am a DM who has uploaded a new package into debian. However I am unfamiliar with the sync process for packages that are not currently in ubuntu, particularly in light of the debian testing and ubuntu feature freezes.
&amp;lt;mycae&amp;gt; After reading the wiki page DebianImportFreeze and SyncRequestProcess, I am still somewhat mystified as to whether or not I should request a sync.
&amp;lt;Laney&amp;gt; mycae: For a (source) NEW package you’ll need to file a feature freeze exception
&amp;lt;Laney&amp;gt; !ffe
&amp;lt;ubottu&amp;gt; Feature Freeze Exception. See
&amp;lt;https://wiki.ubuntu.com/FreezeExceptionProcess&amp;gt; for the freeze exception process.
&amp;lt;mycae&amp;gt; Is that still the case even though testing migration has stopped?
&amp;lt;Laney&amp;gt; it’s nothing to do with Debian’s freeze. 🙂
&amp;lt;mycae&amp;gt; so asking for a pull from unstable is OK?
&amp;lt;Laney&amp;gt; sure, providing that the freeze break is granted
&amp;lt;mycae&amp;gt; So, last question, “The ubuntu-release team will consider exceptions, where additions of packages are worthwhile”; what are the guidelines for “worthwhile”. My packages is for specialist scientific purposes.
&amp;lt;sabdfl&amp;gt; mycae: should be no problem, just ask for the sync
&amp;lt;mycae&amp;gt; ok _**#ubuntu-devel:**
&amp;lt;mycae&amp;gt; Hola. Soy un DM (debian mantainer), y acabo de subir un nuevo paquete a Debian. Sin embargo no estoy enterado del proceso de sincronizacion que siguen los paquetes que no estan en ubuntu, en particular en vista de la version testing en debian y el ‘feature freeze’ en Ubuntu
&amp;lt;mycae&amp;gt; Despues de leer la wiki ‘[DebianImportFreeze][123]‘ y ‘[SyncRequestProcess][124]‘, aun estoy desconcertado si debo o no pedir una sincronizacion.
&amp;lt;Laney&amp;gt; mycae: Para un nuevo paquete (fuente) necesitaras pedir una excepcion al proceso ‘feauture freeze’
&amp;lt;Laney&amp;gt; !ffe
&amp;lt;ubottu&amp;gt; Feature Freeze Exception. Ver
&amp;lt;https://wiki.ubuntu.com/FreezeExceptionProcess&amp;gt; para conocer el proceso
&amp;lt;mycae&amp;gt; entonces es el mismo proceso incluso si la migracion hacia testing ha parado?
&amp;lt;Laney&amp;gt; no tiene nada que ver con el congelamiento de Debian 🙂
&amp;lt;mycae&amp;gt; asi que pedir una sincronizacion con ‘unstable’ se puede hacer?
&amp;lt;Laney&amp;gt; seguro, mostrando que el cambio es aplicable al proceso (ffe)
&amp;lt;mycae&amp;gt; una ultima pregunta, “El equipo de lanzamiento de Ubuntu considerara las excepcion donde los cambios valgan la pena”; cuales son las caracteristicas de los cambios que “valen la pena”. Mi paquete es con fines cientificos especializados
&amp;lt;sabdfl&amp;gt; mycae: eso no deberia ser problema, solo pregunta por el sync
&amp;lt;mycae&amp;gt; ok
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;MTecknology&amp;gt; What’s the right way to install a file to /etc/default/ just install -f my_file /etc/default/ in rules ?
&amp;lt;geser&amp;gt; MTecknology: IIRC yes
&amp;lt;tumbleweed&amp;gt; MTecknology, geser: dh_installinit will install debian/packagename.default appropriately _**#ubuntu-motu:**
&amp;lt;MTecknology&amp;gt; Cual es la forma correcta de instalar un archivo en /etc/default/ puede hacerce con un ‘install -f my_file /etc/default/‘ en el archivo rules?
&amp;lt;geser&amp;gt; MTecknology: IIRC si
&amp;lt;tumbleweed&amp;gt; MTecknology, geser: dh_installinit instalara el archivo debian/packagename.default apropiadamente
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;lfaraone&amp;gt; If a package does not have a patch system, would it be a bad idea to add one during a SRU?
&amp;lt;micahg&amp;gt; lfaraone: yes 🙂 _**#ubuntu-motu:**
&amp;lt;lfaraone&amp;gt; Si un paquete no tiene un sistema de manejo de parches, es una mala idea agregar uno durante un SRU (Son cambios que se hacen a la version estable — [Stable Release Updates][125])?
&amp;lt;micahg&amp;gt; lfaraone: si 🙂
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;sbronsted&amp;gt; wgrant: How often is
&amp;lt;http://qa.ubuntuwire.org/ftbfs/&amp;gt; updated?
&amp;lt;wgrant&amp;gt; sbronsted: Once an hour. _**#ubuntu-motu:**
&amp;lt;sbronsted&amp;gt; wgrant: Que tan seguido se actualza
&amp;lt;http://qa.ubuntuwire.org/ftbfs/&amp;gt; ?
&amp;lt;wgrant&amp;gt; sbronsted: Cada hora.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shane2peru&amp;gt; I’m trying to help package a python app, It is all in the directory, and I created the deb with this: sudo dpkg-deb -b directory name.deb and it worked well, however the dev wants to be able to put files in the /home/$USER/app directory, how is this done?
&amp;lt;ajmitch&amp;gt; shane2peru: packages should never put files into home directories on installation
&amp;lt;ajmitch&amp;gt; the app can place files there when run, but packages cannot
&amp;lt;shane2peru&amp;gt; ajmitch, ok, this is a Bible application, with the ability to install other Bibles, or user material, like Sword does with .sword in the user directory, what is the proper way to do this?
&amp;lt;ajmitch&amp;gt; the app should have a shared directory &amp;amp; per-user data directories
&amp;lt;ajmitch&amp;gt; iirc sword would store bibles in /usr/share/sword or similar
&amp;lt;shane2peru&amp;gt; ajmitch, so it would be better if the Bibles, and or user data were in /usr/share/bibleanalyzer then
&amp;lt;shane2peru&amp;gt; it is a Bible app that is written in Python on windows, and is ported to Linux (specifically Ubuntu) but the dev is in need of some help from a Linux guy, that is where I come in
&amp;lt;ajmitch&amp;gt; yes, it would be better
&amp;lt;ajmitch&amp;gt; also, you should never need to be using dpkg-deb to put together a binary package 🙂
&amp;lt;shane2peru&amp;gt; it is really odd to me, because there is no compiling necessary, I’m compiled apps, and that seems less odd to me then building a deb from a folder
&amp;lt;shane2peru&amp;gt; ajmitch, ok, obviously I’m spilling out all my complete ignorance of this, what is the proper way to build a deb for a python app, and distribute it?
&amp;lt;ajmitch&amp;gt; you need to make a source package which has the standard files (control, changelog, rules, etc) in a debian/ directory
&amp;lt;ajmitch&amp;gt; the packaging guide has some good examples
&amp;lt;ajmitch&amp;gt; if I can recall the URL 🙂
&amp;lt;ajmitch&amp;gt; &amp;lt;https://wiki.ubuntu.com/PackagingGuide/Complete&amp;gt; _**#ubuntu-motu:**
&amp;lt;shane2peru&amp;gt; Estoy tratando de ayudar a empaquetar una aplicacion en python, todo esta en el directorio, he creado el binario (deb) con esto: sudo dpkg-deb -b directorio nombre.deb y ha funcionado correctamente, sin embargo los desarrolladores quieren ser capaces de agregar archivos en /home/$USUARIO/app, como puedo hacer esto?
&amp;lt;ajmitch&amp;gt; shane2peru: los paquetes jamas deberian agregar archivos en el directorio home al momento de la instalacion
&amp;lt;ajmitch&amp;gt; la aplicacion podria crearlos, pero el paquete no
&amp;lt;shane2peru&amp;gt; ajmitch, ok, mira, esta es una aplicacion de una Biblia con la habilidad de instalar otras, como Sword lo hace con los archivos .sword, si no es asi, cuale es la forma correcta de manejarlo?
&amp;lt;ajmitch&amp;gt; la aplicacion deberia tener un directorio compartido para el sistema y otra para los datos del usuario
&amp;lt;ajmitch&amp;gt; iirc sword guardara sus archivos en /usr/share/sword o en algun directorio similar
&amp;lt;shane2peru&amp;gt; ajmitch, asi que seria mejor que estos archivos estuvieran en /usr/share/bibleanalyzer , verdad?
&amp;lt;shane2peru&amp;gt; es una aplicacion escrita en python sobre Windows y esta siendo portada a Linux (especificamente a Ubuntu), asi que los desarrolladores estan buscando ayuda de alguna persona con conocimientos en Linux, ahi es donde entro yo
&amp;lt;ajmitch&amp;gt; si, eso estaria mejor
&amp;lt;ajmitch&amp;gt; tambien, nunca deberias usar dpkg-deb para crear un binario (.deb) 🙂
&amp;lt;shane2peru&amp;gt; es realmente molesto para mi, porque no hay necesidad de compilar nada, son aplicaciones ya compiladas, pero parece menos molesto que crear un binario a partir de un directorio
&amp;lt;shane2peru&amp;gt; ajmitch, ok, aparentemente estoy mostrando mi completa ignorancia del tema, cual es la manera adecuada de crear un .deb para una aplicacion en python? cual es la forma correcta de distribuirla?
&amp;lt;ajmitch&amp;gt; necesitas crear un paquete fuente con los archivos estandard (control, changelog, rules, etc) en el directorio debian/
&amp;lt;ajmitch&amp;gt; la guia de empaquetado tiene algunos ejemplos
&amp;lt;ajmitch&amp;gt; si recuerdo correctamente la URL 🙂
&amp;lt;ajmitch&amp;gt; &amp;lt;https://wiki.ubuntu.com/PackagingGuide/Complete&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;norax&amp;gt; If there is someone over there, just a question: Someone told me that when you submit a patch to launchpad you should subscribe to Ubuntu-Universe-Sponsors. Now it seems that this group is depreciated. Any alternative?
&amp;lt;ScottK&amp;gt; norax: ubuntu-sponsors
&amp;lt;norax&amp;gt; thank ScottK
&amp;lt;micahg&amp;gt; norax: yeah, sponsors then, patches that are suggestions for fixing usually go through reviews that will attempt to upstream and make sure it works
&amp;lt;micahg&amp;gt; debdiffs as tested fixes go through sponsors AFAIK
&amp;lt;norax&amp;gt; hmmm, don’t know. When I submit a patch, I create a debdiff and test it in my computer. I do not create a patch so other people can test and later create a debdiff to submit. I mean maybe I should subscribe just to reviews, and wait that it is tested from other people and later subscribe sponsors.
&amp;lt;micahg&amp;gt; norax: so then you just need -sponsors 🙂 _**#ubuntu-motu:**
&amp;lt;norax&amp;gt; si hay alguien por aqui, me gustaria hacer una pregunta: Alguien me dijo que al enviar parches a launchpad deberia suscribir al equipo ‘Ubuntu-Universe-Sponsors‘, sin embargo parece que este grupo ya no es valido, hay algun otro equipo?
&amp;lt;ScottK&amp;gt; norax: ubuntu-sponsors
&amp;lt;norax&amp;gt; gracias ScottK
&amp;lt;micahg&amp;gt; norax: si, puedes usar sponsors, los parches que son sugeridos para arreglar algun error usualmente van a traves del proceso de revision que intentara enviarlos al proyecto orinigal (upstream) y se asegurara de que funcione
&amp;lt;micahg&amp;gt; debdiffs van a traves del proceso de patrocinado AFAIK
&amp;lt;norax&amp;gt; hmmm, no se. Cuando envio un parche, creo un debdiff y lo pruebo en mi computadora. No creo el parche para que otras personas puedan probarlo despues y creen a su vez otro debdiff. Asi que tal vez solo deba suscribir a los revisores y esperarar a que sea probado por otra gente para suscribir al equipo ‘sponsors‘
&amp;lt;micahg&amp;gt; norax: en ese caso, entonces solo requieres –sponsors 🙂
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;chilicuil&amp;gt; hi, good afternoon, when dealing with bzr branches and quilt, should I remove the patches pile before using debcommit?
&amp;lt;chilicuil&amp;gt; I’ve added a new patch to a pkg using quilt and then I’ve used debcommit (leaving the changes), when I run $ bzr bd — -S -uc -us, I get the following error: “dpkg-source: error: cannot read xsane-0.997.orig.oG0rqG/debian/patches/fix_umask_permitions.patch: No such file or directory”, that patch is the one I made, what I’m doing wrong?, is this the correct channel?, or should I ask in another one?
&amp;lt;tumbleweed&amp;gt; did you bzr add that patch?
&amp;lt;chilicuil&amp;gt; tumbleweed: not afaik
&amp;lt;chilicuil&amp;gt; tumbleweed: ok, that made the trick, thx, and sry to bother u
&amp;lt;tumbleweed&amp;gt; chilicuil: np #### ubuntu-motu:
&amp;lt;chilicuil&amp;gt; hola, buenas tardes, al momento de usar ramas de bzr y quilt, deberia quitar la pila de parches antes de usar debcommit? _**#ubuntu-motu:**
&amp;lt;chilicuil&amp;gt; He agregado un nuevo parche a un paquete usando quilt y luego he usado debcommit (dejando todos los cambios) al momento de correr $ bzr bd — -S -uc -us, obtengo el siguiente error: “dpkg-source: error: no puede leer xsane-0.997.orig.oG0rqG/debian/patches/fix_umask_permitions.patch: No existe el archivo o directorio”, ese parche es el que he hecho, que estoy haciendo mal?, es el canal correcto?, o deberia preguntar en otro?
&amp;lt;tumbleweed&amp;gt; agregaste el parche a bzr? $ bzr add parche?
&amp;lt;chilicuil&amp;gt; tumbleweed: no hasta donde se
&amp;lt;chilicuil&amp;gt; tumbleweed: ok, ha funcionado, gracias y perdon por la molestia
&amp;lt;tumbleweed&amp;gt; chilicuil: de nada
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;and471&amp;gt; if there is a file in the debian dir that I need to edit, do I create a patch using the package’s patch system, or just edit the file directly?
&amp;lt;Rhonda&amp;gt; You edit the file directly.
&amp;lt;Rhonda&amp;gt; patches are for changes to the upstream source.
&amp;lt;and471&amp;gt; Rhonda, thanks _**#ubuntu-motu:**
&amp;lt;and471&amp;gt; si tengo un archivo en el directorio debian que necesito editar, creo un parche (usando algun sistema de parches, quilt, dpatch) o edito directamente el archivo?
&amp;lt;Rhonda&amp;gt; lo modificas directamente
&amp;lt;Rhonda&amp;gt; los parches son para cambios en el codigo fuente del programa
&amp;lt;and471&amp;gt; Rhonda, gracias
&lt;/pre&gt;

&lt;p&gt;Adicionalmente he entrando interesante el siguiente hilo:
&lt;a href=&quot;http://tinyurl.com/2bvlm2t&quot;&gt;http://tinyurl.com/2bvlm2t&lt;/a&gt; (Request for candidates: Applicacion review
board).&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/09/05/comentarios-aleatorios-semana-1-20agosto/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>parchando paquetes con quilt + bzr - motu</title>
   <link href="https://javier.io/blog/es/2010/08/14/parchando-paquetes-con-quilt-bzr.html"/>
   <published>2010-08-14T00:00:00+00:00</published>
   <updated>2010-08-14T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/08/14/parchando-paquetes-con-quilt-bzr</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">parchando paquetes con quilt + bzr - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/08/14/parchando-paquetes-con-quilt-bzr.html">&lt;h2 id=&quot;parchando-paquetes-con-quilt--bzr---motu&quot;&gt;parchando paquetes con quilt + bzr - motu&lt;/h2&gt;

&lt;h6 id=&quot;14-aug-2010&quot;&gt;14 Aug 2010&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;Introduccion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como parte del &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuBugDay/20100812&quot;&gt;Ubuntu hug day&lt;/a&gt;de esta semana, el equipo de triagers
(personas que se encargan de tener el primero contacto con los bugs de Ubuntu)
se concentro en la operacion &lt;a href=&quot;https://wiki.ubuntu.com/OperationCleansweep&quot;&gt;Clean Sweep&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Y ya que he leido la respectiva wiki, me he lanzado a revisar algunos de estos
parches, a continuacion describire el proceso de uno de ellos.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.xsane.org/&quot;&gt;Xsane&lt;/a&gt; es un front-end para sane, las librerias que hacen posible
controlar los scanners en linux. En su version mas reciente (al menos las
versiones que se encuentran en Ubuntu/Debian) el programa crea una carpeta en
~/.sane con permisos 770, lo que le da permisos de escritura/lectura al dueño
de la carpeta y al grupo al que pertenece ese usuario, alguien ha reportado el
&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/xsane/+bug/611950&quot;&gt;bug #611950&lt;/a&gt; donde propone cambiar los permisos por unos mas prudentes
700, si he entendido bien, y se ha tomado la molestia de adjuntar un
&lt;a href=&quot;http://launchpadlibrarian.net/52766337/xsane.h.diff&quot;&gt;parche&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ahora, como voluntario, y futuro colaborador de Ubuntu, uno debe asegurarse de
que el parche este en la forma adecuada para aplicarse al archivo, esto es,
con un changelog que indique los cambios y el parche en el formato adecuado, y
de ser necesario enviarlo a los desarrolladores o a Debian (upstream). En este
caso como el paquete usa ‘quilt‘ he agregado un parche de ese tipo y lo he
reenviado a Debian.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desarrollo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se descarga el codigo fuente, esta vez he usado bzr en lugar de $ dget -xu
&lt;a href=&quot;http://algun.mirror/ubuntu/maverick/etc/archivo.dsc&quot;&gt;http://algun.mirror/ubuntu/maverick/etc/archivo.dsc&lt;/a&gt; o $ apt-get source
paquete. Segun algunos desarrolladores de Ubuntu esta debe ser la manera
predilecta de arreglar bugs. Para una guia super rapida del proceso, ver
“&lt;a href=&quot;/blog/es/2010/08/06/como-arreglar-bugs-con-bzr-version-corta.html&quot;&gt;Como arreglar bugs con bzr –version corta”&lt;/a&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir xsane; cd xsaane
$ bzr branch lp:/ubuntu/xsane
Branched 28 revision(s)
$ cd xsane;
&lt;/pre&gt;

&lt;p&gt;Ahora se le dice a quilt el nombre del parche.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ quilt new fix_umask_permitions.patch
Patch fix_umask_permitions.patch is now on top
&lt;/pre&gt;

&lt;p&gt;OJO: hay que declarar antes en ~/.bashrc o en el archivo de configuracion que
use su shell “export QUILT_PATCHES=debian/patches“.&lt;/p&gt;

&lt;p&gt;Y luego agregar el/los archivo (s) que se van a editar, en este caso y
siguiendo el parche original, se agrega ‘src/xsane.h‘.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ quilt add src/xsane.h
File src/xsane.h added to patch fix_umask_permitions.patch
&lt;/pre&gt;

&lt;p&gt;Listo, =), ahora solo falta editar el archivo, en mi caso, he abierto con
‘vim’ y cambiado la cadena “#define XSANE_DEFAULT_UMASK 0007” por “#define
XSANE_DEFAULT_UMASK 0077“.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ vim usr/xsane.h
&lt;/pre&gt;

&lt;p&gt;Una vez hecho, se sale y se actualiza el parche, esto creara un archivo en
debian/patches/fix_umask_permitions.patch&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ quilt refresh
Refreshed patch fix_umask_permitions.patch
$ less debian/patches/fix_umask_permitions.patch
Index: xsane/src/xsane.h
 ===================================================================
 --- xsane.orig/src/xsane.h      2010-08-14 06:21:02.826514370 -0500
 +++ xsane/src/xsane.h   2010-08-14 06:25:47.695512049 -0500
 @@ -104,7 +104,7 @@
 #define XSANE_DEBUG_ENVIRONMENT        &quot;XSANE_DEBUG&quot;
 #define XSANE_PROGRESS_BAR_MIN_DELTA_PERCENT 0.025
 -#define XSANE_DEFAULT_UMASK            0007
 +#define XSANE_DEFAULT_UMASK            0077
 #define XSANE_HOLD_TIME                        200
 #define XSANE_CONTINUOUS_HOLD_TIME     10
 #define XSANE_DEFAULT_DEVICE           &quot;SANE_DEFAULT_DEVICE&quot;
 debian/patches/fix_umask_permitions.patch (END)
&lt;/pre&gt;

&lt;p&gt;El parche no solo se ha creado, sino que se ha aplicado, esto se puede
corroborar con el comando:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ quilt push
File series fully applied, ends at patch fix_umask_permitions.patch
&lt;/pre&gt;

&lt;p&gt;Ahora se modifica el changelog, describiendo el cambio:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ dch -i
xsane (0.997-2ubuntu3) maverick; urgency=low
 [Adrien Thebo]
 * Fix umask permitions (LP: #611950)
 - debian/patches/fix_umask_permitions.patch
-- chilicuil &amp;lt;chilicuil@i.am&amp;gt;  Sat, 14 Aug 2010 06:28:55 -0500
&lt;/pre&gt;

&lt;p&gt;OJO: Los cambios siempre deben hacerse para la ultima version de Ubuntu, por
defecto $ bzr branch lp:ubuntu/paquete descargara la ultima version, asi que
no hay de que preocuparse, pero $ dhc -i pondra la version que se este
corriendo, en mi caso debo cambiar la cadena ‘lucid‘ por ‘maverick‘.&lt;/p&gt;

&lt;p&gt;No hay que olvidar dar el credito a la persona que se tomo la molestia de
reportar y adjuntar el parche inicial. Despues de eso se debe agregar el
parche (s) a bzr, NO hay que OLVIDAR este paso o se obtendra un error al
momento de generar el paquete .dsc (codigo fuente de los .deb).&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr add debian/patches/fix_umask_permitions.patch
adding debian/patches/fix_umask_permitions.patch
&lt;/pre&gt;

&lt;p&gt;Se hace el commit (el cambio que se intentara hacer al paquete original):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ debcommit
bzr commit -m &apos;* Fix umask permitions (LP: #611950)
 - debian/patches/fix_umask_permitions.patch&apos; --fixes &apos;lp:611950&apos;
 Committing to: /home/chilicuil/misc/packages/xsane/
 modified .pc/applied-patches
 modified debian/changelog
 added debian/patches/fix_umask_permitions.patch
 modified debian/patches/series
 modified src/xsane.h
 Committed revision 29.
&lt;/pre&gt;

&lt;p&gt;Y se crea el archivo fuente (dsc):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr bd -- -S -uc -us
Building using working tree
Looking for a way to retrieve the upstream tarball
Using pristine-tar to reconstruct the needed tarball ...
&lt;/pre&gt;

&lt;p&gt;Se crearan un archivo .dsc y uno .changes, $ ls ..xsane/
xsane_0.997-2ubuntu3.debian.tar.gz xsane_0.997-2ubuntu3.dsc
xsane_0.997-2ubuntu3_source.changes xsane_0.997.orig.tar.gz&lt;/p&gt;

&lt;p&gt;Ahora se prueba con $ pbuilder para ver que aun compile correctamente y se
prueba en una maquina con maverick. Debo ser completamente honesto y decir que
para cambios tan sencillos como estos, solo verifico que compile y me olvido
de testear, sin embargo no lo omito por pereza , sino porque ahora mismo no
tengo otra maquina donde haga pruebas, estoy por comprarme una nueva
computadora con virtualizacion integrada, donde espero poder arreglar bugs mas
complicados que no solo requieran cambios triviales. Asi que si alguien por
cualquier razon llega a leer estas lineas, por favor pruebe el paquete.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo DIST=maverick pbuilder build  ../xsane_0.997-2ubuntu3.dsc
&lt;/pre&gt;

&lt;p&gt;OJO: Esto solo funcionara si tienen el mismo entorno que describo en “&lt;a href=&quot;/blog/es/2010/08/10/notas-sobre-pbuilder.html&quot;&gt;Notas
sobre pbuilder&lt;/a&gt;”&lt;/p&gt;

&lt;p&gt;Una vez compilado y testeado, se suben los cambios a Ubuntu:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr push lp:~chilicuil/ubuntu/maverick/xsane/fix-611950
Using default stacking branch /~ubuntu-branches/ubuntu/maverick/xsane/maverick at lp-70590544:///~chilicuil/ubuntu/maverick/xsane
Created new stacked branch referring to /~ubuntu-branches/ubuntu/maverick/xsane/maverick.
&lt;/pre&gt;

&lt;p&gt;Es importante que se siga el formato:
lp:~usuario/ubuntu/version/paquete/nombre_de_rama (esta ultima puede llevar el
nombre que sea), de lo contrario launchpad no les dejara subir los cambios.&lt;/p&gt;

&lt;p&gt;Una vez hechos, solo falta pedir que se integren,&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr lp-open
Opening https://code.edge.launchpad.net/~chilicuil/ubuntu/maverick/xsane/fix-611950/ in web browser
&lt;/pre&gt;

&lt;p&gt;Hay que dar click en ‘Propose for merging‘&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-parchando-paquetes-con-quilt-bzr-2.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-parchando-paquetes-con-quilt-bzr-2.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De ahi en adelante, la rama podra verse desde la pagina del reporte:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-parchando-paquetes-con-quilt-bzr-3.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-parchando-paquetes-con-quilt-bzr-3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con eso basta para que alguien pueda ver el cambio y pueda introducirlo a
ubuntu, para enviarlo a debian se debe hacer algunos pasos extra:&lt;/p&gt;

&lt;p&gt;Primero hay que configurar $ reportbug –configure; ara algunas preguntas
sencillas y se podra continuar con el proceso, esto solo se ara 1 vez, las
siguientes veces el programa leera la configuracion de ~/.reportbugrc .&lt;/p&gt;

&lt;p&gt;Luego sin salir del directorio donde esta debian/ se ejecuta:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ submittodebian
﻿﻿=== modified file &apos;.pc/applied-patches&apos;
--- .pc/applied-patches 2010-06-21 12:50:50 +0000
+++ .pc/applied-patches 2010-08-14 11:19:21 +0000
@@ -12,3 +12,4 @@
 fix_preview_mouse_events.patch
 fix_spin_button_pagesize.patch
 pot_desktop_msgid.patch
+fix_umask_permitions.patch
=== modified file &apos;debian/changelog&apos;
=== added file &apos;debian/patches/fix_umask_permitions.patch&apos;
--- debian/patches/fix_umask_permitions.patch   1970-01-01 00:00:00 +0000
+++ debian/patches/fix_umask_permitions.patch   2010-08-14 11:25:59 +0000
@@ -0,0 +1,13 @@
+Index: xsane/src/xsane.h
+===================================================================
+--- xsane.orig/src/xsane.h     2010-08-14 06:21:02.826514370 -0500
++++ xsane/src/xsane.h  2010-08-14 06:25:47.695512049 -0500
+@@ -104,7 +104,7 @@
+ #define XSANE_DEBUG_ENVIRONMENT       &quot;XSANE_DEBUG&quot;
+
+ #define XSANE_PROGRESS_BAR_MIN_DELTA_PERCENT 0.025
+-#define XSANE_DEFAULT_UMASK           0007
++#define XSANE_DEFAULT_UMASK           0077
+ #define XSANE_HOLD_TIME                       200
+ #define XSANE_CONTINUOUS_HOLD_TIME    10
+ #define XSANE_DEFAULT_DEVICE          &quot;SANE_DEFAULT_DEVICE&quot;
=== modified file &apos;debian/patches/series&apos;
--- debian/patches/series       2010-06-21 12:50:50 +0000
+++ debian/patches/series       2010-08-14 11:19:21 +0000
@@ -12,3 +12,4 @@
 fix_preview_mouse_events.patch
 fix_spin_button_pagesize.patch
 pot_desktop_msgid.patch
+fix_umask_permitions.patch
=== modified file &apos;src/xsane.h&apos;
--- src/xsane.h 2010-06-21 12:50:50 +0000
+++ src/xsane.h 2010-08-14 11:25:47 +0000
@@ -104,7 +104,7 @@
 #define XSANE_DEBUG_ENVIRONMENT        &quot;XSANE_DEBUG&quot;
 #define XSANE_PROGRESS_BAR_MIN_DELTA_PERCENT 0.025
-#define XSANE_DEFAULT_UMASK            0007
+#define XSANE_DEFAULT_UMASK            0077
 #define XSANE_HOLD_TIME                        200
 #define XSANE_CONTINUOUS_HOLD_TIME     10
 #define XSANE_DEFAULT_DEVICE           &quot;SANE_DEFAULT_DEVICE&quot;
&lt;/pre&gt;

&lt;p&gt;De lo cual he descartado la primer a parte, sobre el cambio en
debian/changelog y .pc/applied-patches, quedando de esta forma:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
=== added file &apos;debian/patches/fix_umask_permitions.patch&apos;
--- debian/patches/fix_umask_permitions.patch   1970-01-01 00:00:00 +0000
+++ debian/patches/fix_umask_permitions.patch   2010-08-14 11:25:59 +0000
@@ -0,0 +1,13 @@
+Index: xsane/src/xsane.h
+===================================================================
+--- xsane.orig/src/xsane.h     2010-08-14 06:21:02.826514370 -0500
++++ xsane/src/xsane.h  2010-08-14 06:25:47.695512049 -0500
+@@ -104,7 +104,7 @@
+ #define XSANE_DEBUG_ENVIRONMENT       &quot;XSANE_DEBUG&quot;
+
+ #define XSANE_PROGRESS_BAR_MIN_DELTA_PERCENT 0.025
+-#define XSANE_DEFAULT_UMASK           0007
++#define XSANE_DEFAULT_UMASK           0077
+ #define XSANE_HOLD_TIME                       200
+ #define XSANE_CONTINUOUS_HOLD_TIME    10
+ #define XSANE_DEFAULT_DEVICE          &quot;SANE_DEFAULT_DEVICE&quot;
=== modified file &apos;debian/patches/series&apos;
--- debian/patches/series       2010-06-21 12:50:50 +0000
+++ debian/patches/series       2010-08-14 11:19:21 +0000
@@ -12,3 +12,4 @@
fix_preview_mouse_events.patch
fix_spin_button_pagesize.patch
pot_desktop_msgid.patch
+fix_umask_permitions.patch
=== modified file &apos;src/xsane.h&apos;
--- src/xsane.h 2010-06-21 12:50:50 +0000
+++ src/xsane.h 2010-08-14 11:25:47 +0000
@@ -104,7 +104,7 @@
#define XSANE_DEBUG_ENVIRONMENT        &quot;XSANE_DEBUG&quot;
#define XSANE_PROGRESS_BAR_MIN_DELTA_PERCENT 0.025
-#define XSANE_DEFAULT_UMASK            0007
+#define XSANE_DEFAULT_UMASK            0077
#define XSANE_HOLD_TIME                        200
#define XSANE_CONTINUOUS_HOLD_TIME     10
#define XSANE_DEFAULT_DEVICE           &quot;SANE_DEFAULT_DEVICE&quot;
&lt;/pre&gt;

&lt;p&gt;Despues de eso, submittodebian buscara problemas parecidos con el fin de
evitar reportes duplicados, hay que leer con cuidado que no este en la lista,
si lo esta verificar si hay algo que se pueda agregar y si no esta, generar el
nuevo reporte:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-parchando-paquetes-con-quilt-bzr-4.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-parchando-paquetes-con-quilt-bzr-4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego pedira el nombre del reporte y un pequeña descripcion, es una buena idea
apuntar al bug original, para este bug mi reporte ha quedado de esta manera:
&lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=592972&quot;&gt;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=592972&lt;/a&gt; , no recuerdo donde
he leido que los bugs procedentes de Ubuntu deberan clasificarse como
‘wishlist‘, asi que no me he arriesgado y lo he clasificado de esa manera.&lt;/p&gt;

&lt;p&gt;Finalmente , en el reporte original (en launchpad) se agrega la liga del
reporte en Debian o en del bugtracker de cualquier otro proyecto (se hace
click en ‘Also affects project‘ y luego se agrega el url), segun aplique y se
cambia el tag ‘patch‘ por ‘patch-forwarded-debian‘ o ‘patch-forwarded-
upstream‘. Si se acepta se volvera a cambiar por ‘patch-accepted-debian‘ ,
‘patch-accepted-upstream‘ o si se rechaza por ‘patch-rejected-debian‘ o
‘patch-rejected-upstream‘. Y eso es todo, tan pronto el parche sea aceptado en
upstream o debian, volvera a ubuntu en forma de una sincronizacion o en caso
de no darse, aun se podra usar en ubuntu, si es aceptado la peticion de
‘merge’.&lt;/p&gt;

&lt;p&gt;NOTA: Esta entrada ha sido para mi autodocumentacion, sigase bajo su propio
riesgo.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/es/2010/06/20/parchando-paquetes-con-quilt.html&quot;&gt;Parchando paquetes con quilt&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/es/2010/06/20/parchando-paquetes-con-debdiff.html&quot;&gt;Parchando paquetes con debdiff&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/08/14/parchando-paquetes-con-quilt-bzr/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>notas sobre pbuilder - motu</title>
   <link href="https://javier.io/blog/es/2010/08/10/notas-sobre-pbuilder.html"/>
   <published>2010-08-10T00:00:00+00:00</published>
   <updated>2010-08-10T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/08/10/notas-sobre-pbuilder</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">notas sobre pbuilder - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/08/10/notas-sobre-pbuilder.html">&lt;h2 id=&quot;notas-sobre-pbuilder---motu&quot;&gt;notas sobre pbuilder - motu&lt;/h2&gt;

&lt;h6 id=&quot;10-aug-2010&quot;&gt;10 Aug 2010&lt;/h6&gt;

&lt;p&gt;He decidido hacer esta entrada despues de modificar muy levemente algunas de
las opciones en la conf. de pbuilder.&lt;/p&gt;

&lt;p&gt;Mi objetivo ha sido poder trabajar mas facilmente con diferentes versiones de
Ubuntu, lucid, maverick y sid (debian unstable).&lt;/p&gt;

&lt;p&gt;Si por alguna razon alguien mas llega a leer esta entrada, le advierto que
probablemente tendra que cambiar algunas de estas opciones. Tambien me
gustaria aclarar que todo lo he encontrado en la documentacion oficial:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.netfort.gr.jp/~dancer/software/pbuilder-doc/pbuilder-doc.html&quot;&gt;http://www.netfort.gr.jp/~dancer/software/pbuilder-doc/pbuilder-doc.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/PbuilderHowto&quot;&gt;https://wiki.ubuntu.com/PbuilderHowto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Primero explicare que es lo que he entendido por ‘pbuilder’, pbuilder es un
conjunto de scripts en bash que permiten crear un chroot donde se alojara 1 o
mas sistemas minimalistas, esto ademas de ayudar a la calidad de los paquetes
evitara que se descarguen y se dejen todas las dependencias regadas en la
maquina.&lt;/p&gt;

&lt;p&gt;La primera vez que se ejecuta $ sudo pbuilder create; este llamara a
‘debootstrap‘ el cual descargara paquetes elementales para tener un sistema
funcional de la distribucion que se haya elegido. A continuacion pbuilder
copiara algunos archivos de /etc, y agregara los repositorios que se hayan
elegido. Cuando el sistema este listo, lo empaquetara en un .tar.gz y lo
depositara en el lugar que se le haya indicado, por defecto en
/var/cache/pbuilder/.&lt;/p&gt;

&lt;p&gt;De ahi en adelante, cada vez que se llame para compilar algo, $ sudo pbuilder
build archivo.dsc; descomprimira el paquete, montara algunas carpetas,
descargara las dependencias y compilara el archivo que le hayan indicado. Una
vez completado el proceso, copiara el binario (.deb) al lugar que le hayan
especificado y las dependencias a su propia cache (que es diferente a la del
sistema) tambien destruira el entorno, asi la proxima vez que compile algo,
arrancara de 0, sin conocimiento previos de nada.&lt;/p&gt;

&lt;p&gt;Antes de intentar configurar ‘pbuilder‘ he intentado usar ‘pbuilder-dist‘ un
script en python que viene en el paquete ‘ubuntu-dev-tools‘, sin embargo mi
experiencia no ha sido la mejor, ya que no he podido hacer que hiciera
exactamente lo que queria, la responsabilidad la tomo yo mismo por no haber
sabido interpretar la documentacion, si alguien ha podido armar un buen
entorno con el, me gustaria leer su comentario.&lt;/p&gt;

&lt;p&gt;Lo primero que he hecho es agregar los siguiente a ~/.pbuilderrc :&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# https://wiki.ubuntu.com/PbuilderHowto
if [ -z &quot;$PATH_PBUILDER&quot; ]; then
  PATH_PBUILDER=&quot;/var/cache/pbuilder&quot; #without the last &quot;/&quot;
fi

# Codenames for Debian suites according to their alias. Update these when needed.
UNSTABLE_CODENAME=&quot;sid&quot;
TESTING_CODENAME=&quot;squeeze&quot;
STABLE_CODENAME=&quot;lenny&quot;
STABLE_BACKPORTS_SUITE=&quot;$STABLE_CODENAME-backports&quot;

# List of Debian suites.
DEBIAN_SUITES=($UNSTABLE_CODENAME $TESTING_CODENAME $STABLE_CODENAME
  &quot;unstable&quot; &quot;testing&quot; &quot;stable&quot;)

# List of Ubuntu suites. Update these when needed.
UBUNTU_SUITES=(&quot;maverick&quot; &quot;lucid&quot; &quot;karmic&quot; &quot;jaunty&quot; &quot;hardy&quot;)

# Mirrors to use. Update these to your preferred mirror.
DEBIAN_MIRROR=&quot;ftp.us.debian.org&quot;
UBUNTU_MIRROR=&quot;us.archive.ubuntu.com&quot;
#UBUNTU_MIRROR=&quot;mirrors.kernel.org&quot; #sometimes it&apos;s out of sync

# Optionally use the changelog of a package to determine the suite to use if
# none set.
if [ -z &quot;${DIST}&quot; ] &amp;amp;&amp;amp; [ -r &quot;debian/changelog&quot; ]; then
  DIST=$(dpkg-parsechangelog | awk &apos;/^Distribution: / {print $2}&apos;)
  # Use the unstable suite for certain suite values.
  if $(echo &quot;experimental UNRELEASED&quot; | grep -q $DIST); then
    DIST=&quot;$UNSTABLE_CODENAME&quot;
  fi
fi

# Optionally set a default distribution if none is used. Note that you can
# set your own default (i.e. ${DIST:=&quot;unstable&quot;}).
: ${DIST:=&quot;$(lsb_release --short --codename)&quot;}

# Optionally change Debian release states in $DIST to their names.
case &quot;$DIST&quot; in
  unstable)
    DIST=&quot;$UNSTABLE_CODENAME&quot;
    ;;
  testing)
    DIST=&quot;$TESTING_CODENAME&quot;
    ;;
  stable)
    DIST=&quot;$STABLE_CODENAME&quot;
    ;;
esac

# Optionally set the architecture to the host architecture if none set. Note
# that you can set your own default (i.e. ${ARCH:=&quot;i386&quot;}).
: ${ARCH:=&quot;$(dpkg --print-architecture)&quot;}

NAME=&quot;$DIST&quot;
if [ -n &quot;${ARCH}&quot; ]; then
  NAME=&quot;$NAME-$ARCH&quot;
  DEBOOTSTRAPOPTS=(&quot;--arch&quot; &quot;$ARCH&quot; &quot;${DEBOOTSTRAPOPTS[@]}&quot;)
fi

#################
# Base settings #
#################
BASETGZ=&quot;$PATH_PBUILDER/$NAME/$NAME-base.tgz&quot;
# Optionally, set BASEPATH (and not BASETGZ) if using cowbuilder
# BASEPATH=&quot;$PATH_PBUILDER/$NAME/base.cow/&quot;
DISTRIBUTION=&quot;$DIST&quot;
APTCACHE=&quot;$PATH_PBUILDER/$NAME/aptcache/&quot;
BUILDPLACE=&quot;$PATH_PBUILDER/$NAME/build/&quot;
BUILDRESULT=&quot;$HOME/misc/packages/ubuntu/results/$NAME/&quot;

if $(echo ${DEBIAN_SUITES[@]} | grep -q $DIST); then
  # Debian configuration
  MIRRORSITE=&quot;http://$DEBIAN_MIRROR/debian/&quot;
  COMPONENTS=&quot;main contrib non-free&quot;
  # This is for enabling backports for the Debian stable suite.
  if $(echo &quot;$STABLE_CODENAME stable&quot; | grep -q $DIST); then
    EXTRAPACKAGES=&quot;$EXTRAPACKAGES debian-backports-keyring&quot;
    OTHERMIRROR=&quot;$OTHERMIRROR | deb http://www.backports.org/debian $STABLE_BACKPORTS_SUITE $COMPONENTS&quot;
  fi
elif $(echo ${UBUNTU_SUITES[@]} | grep -q $DIST); then
  # Ubuntu configuration
  MIRRORSITE=&quot;http://$UBUNTU_MIRROR/ubuntu/&quot;
  COMPONENTS=&quot;main restricted universe multiverse&quot;
else
  echo &quot;Unknown distribution: $DIST&quot;
  exit 1
fi

# ccache
#sudo mkdir -p &quot;$PATH_PBUILDER/ccache&quot;
#sudo chmod a+w &quot;$PATH_PBUILDER/ccache&quot;
if [ -f /usr/bin/ccache ]; then
  export PATH=&quot;/usr/lib/ccache:$PATH&quot;
  export CCACHE_DIR=&quot;$HOME/.ccache_ubuntu&quot;
  EXTRAPACKAGES=&quot;ccache ${EXTRAPACKAGES}&quot;
  BINDMOUNTS=&quot;${CCACHE_DIR} ${BINDMOUNTS}&quot;
  #if [ -n &quot;${BUILDUSERID}&quot; ]; then
  #chown &quot;${BUILDUSERID}&quot;:&quot;${BUILDUSERID}&quot; &quot;${CCACHE_DIR}&quot; || true
  #fi
  #export CCACHE_PREFIX=&quot;distcc&quot;
fi
&lt;/pre&gt;

&lt;p&gt;Usando esta configuracion, es posible hacer, cada comando me ha tomado 30 min,
con una conexion de 1 Mb/s.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo DIST=lucid pbuilder create
$ sudo DIST=maverick pbuilder create
$ sudo DIST=sid pbuilder create
&lt;/pre&gt;

&lt;p&gt;Y se crearan 3 diferentes .tar.gz en diferentes localidades:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ tree /var/cache/pbuilder.
├── aptcache/
├── build/
├── lucid-i386/
│   ├── aptcache/
│   ├── build/
│   └── lucid-i386-base.tgz
├── maverick-i386/
│   ├── aptcache/
│   ├── build/
│   └── maverick-i386-base.tgz
├── pbuildd/
├── pbuilder-mnt/
├── pbuilder-umlresult/
├── result/
└── sid-i386/
    ├── aptcache/
    ├── build/
    └── sid-i386-base.tgz
&lt;/pre&gt;

&lt;p&gt;Para no tener que estar definiendo manualmente la distribucion, he creado unos
‘alias’ que lo hacen por mi, en ~/.bashrc:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
alias pbuilder.lucid=&apos;sudo DIST=lucid pbuilder&apos;
alias pbuilder.maverick=&apos;sudo DIST=maverick pbuilder&apos;
alias pbuilder.sid=&apos;sudo DIST=sid pbuilder&apos;
alias pbuilder.unstable=&apos;sudo DIST=unstable pbuilder&apos;
&lt;/pre&gt;

&lt;p&gt;De esta forma, puedo usar $ pbuilder.lucid create, por poner un ejemplo.&lt;/p&gt;

&lt;p&gt;Tambien he cambiado la ubicacion de donde se alojan los paquetes compilados,
porque comunmente hago backup de mi $HOME y me gustaria que estuvieran
incluidos sin tener que hacer una excepcion. Poco despues de hacer el cambio,
he notado que ‘pbuilder‘ escribe esa carpeta como ‘root‘ (pbuilder, hasta
donde se, siempre debe correr como root) lo cual me ha molesta un poco (soy
algo quisquilloso), asi que he modificado /usr/lib/pbuilder/pbuilder-
buildpackage para que cambie los permisos:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd /usr/lib/pbuilder
$ diff -Naur  pbuilder-buildpackage  ../../../../pbuilder-buildpackage
--- ./pbuilder-buildpackage    2009-12-30 10:28:35.000000000 -0600
+++ ../../../../pbuilder-buildpackage    2010-08-09 18:08:34.896255762 -0500
@@ -58,6 +58,8 @@
 if [ ! -d &quot;${BUILDRESULT}&quot; ]; then
 if [ -n &quot;${BUILDRESULT}&quot; ] ; then
 mkdir -p &quot;${BUILDRESULT}&quot;
+        chown -R &quot;${BUILDRESULTUID}:${BUILDRESULTGID}&quot; &quot;${BUILDRESULT}&quot;../../
+        chgrp -R &quot;${BUILDRESULTGID}&quot; &quot;${BUILDRESULT}&quot;../../
 fi
 if [ -d &quot;${BUILDRESULT}&quot; ]; then
 log &quot;I: created buildresult dir: ${BUILDRESULT}&quot;
&lt;/pre&gt;

&lt;p&gt;Eso provoca que ~/misc/packages/ubuntu/results pertenezca a mi usuario y no a
root, OJO: este cambio dudo que alguien quiera usarlo, lo comento para mi
propia referencia.&lt;/p&gt;

&lt;p&gt;Finalmente he decidio usar ‘ccache‘ para aumentar la velocidad en la que se
compilan los paquetes (al menos los que estan programados en C/C++). Para
darse una idea, un paquete que tarda 15 min sin ccache, reduce su tiempo a 12
min.&lt;/p&gt;

&lt;p&gt;Aqui he tenido que estar probando porque tambien uso ccache independientemente
de la empaquetacion. Asi que he creado 2 directorios, el que uso para
programas personales, ~/.ccache tiene los permisos ordinarios, y el que usa
ubuntu ~/.ccache_ubuntu (se puede ver en el archivo de conf de pbuilder que
puse mas arriba) debe tener permisos 777, esto es permisos para cualquiera.
Pbuilder internamente usa el usuario con id 1234, asi que o se le dan permisos
777 o se agrega ese usuario al mismo grupo y se le da 774, lo primero creo que
es mas “seguro”. Despues de eso y para ver las estadisticas se debe llamar
ccache, de esta manera: $ CCACHE_DIR=~/.ccache_ubuntu , he agregado otro alias
para simplificarlo:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
alias ccache.ubuntu=&apos;CCACHE_DIR=~/.ccache_ubuntu ccache&apos;
&lt;/pre&gt;

&lt;p&gt;De esta manera, puedo llamar a ccache como: $ ccache -s o $ ccache.ubuntu -s;
dependiendo de las estadisticas que quiera ver.&lt;/p&gt;

&lt;p&gt;Listo, eso es lo que he modificado al momento, me falta por investigar como
funcionan los ‘hooks‘, que al parecer son comandos que se ejecutan cuando se
cumplen determinadas caracteristicas, ya blogueare al respecto.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.debian.org/doc/maint-guide/ch-build.en.html#s-pbuilder&quot;&gt;http://www.debian.org/doc/maint-guide/ch-build.en.html#s-pbuilder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/08/10/notas-sobre-pbuilder/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>como arreglar bugs con bzr –version corta - motu</title>
   <link href="https://javier.io/blog/es/2010/08/06/como-arreglar-bugs-con-bzr-version-corta.html"/>
   <published>2010-08-06T00:00:00+00:00</published>
   <updated>2010-08-06T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/08/06/como-arreglar-bugs-con-bzr-version-corta</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">como arreglar bugs con bzr –version corta - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/08/06/como-arreglar-bugs-con-bzr-version-corta.html">&lt;h2 id=&quot;como-arreglar-bugs-con-bzr-version-corta---motu&quot;&gt;como arreglar bugs con bzr –version corta - motu&lt;/h2&gt;

&lt;h6 id=&quot;06-aug-2010&quot;&gt;06 Aug 2010&lt;/h6&gt;

&lt;p&gt;De la presentacion de &lt;a href=&quot;http://daniel.holba.ch/blog/&quot;&gt;dholbach&lt;/a&gt; en &lt;a href=&quot;http://irclogs.ubuntu.com/2010/08/05/%23ubuntu-classroom.html&quot;&gt;#ubuntu-classroom&lt;/a&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
bzr branch lp:ubuntu/&amp;lt;pkg&amp;gt;
cd &amp;lt;pkg&amp;gt;
# work on the fix
dch -i        # to document it
debcommit     # to commit locally
bzr bd -- -S -us -uc   # build a source package you can pass to pbuilder and other tools
# test-build the package and test it locally
bzr push lp:&amp;lt;lpid&amp;gt;/ubuntu/&amp;lt;release&amp;gt;/&amp;lt;pkg&amp;gt;/&amp;lt;branchname&amp;gt;
bzr lp-open
# click &apos;propose for merging&apos;
# DONE
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;En espanol:&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
bzr branch lp:ubuntu/&amp;lt;pkg&amp;gt;   # descarga la ultima version del codigo fuente del paquete
cd &amp;lt;pkg&amp;gt;
# trabaja en el parche
dch -i        # documenta
debcommit     # hace un &apos;commit&apos; localmente
bzr bd -- -S -us -uc   # crea un paquete .dsc que puede pasarse a pbuilder u otras herramientas
# compilar y probar localmente
bzr push lp:&amp;lt;lpid&amp;gt;/ubuntu/&amp;lt;release&amp;gt;/&amp;lt;pkg&amp;gt;/&amp;lt;branchname&amp;gt;   # envia los cambios a tu cuenta de launchpad
bzr lp-open   # abre una pagina que describe los cambios y ofrece enviarlos a ubuntu
# hacer click en &apos;propose for merging&apos; -- eso enviara tus cambios al equipo ubuntu-branches
# LISTO! =)
&lt;/pre&gt;

&lt;p&gt;You must have the bzr-builddeb package installed / Se debe tener el paquete
bzr-builddeb instalado.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTA: se pueden ver las ramas en las que se ha trabajado en:&lt;/em&gt;
&lt;a href=&quot;https://code.launchpad.net/~nombre_de_usuario&quot;&gt;https://code.launchpad.net/~nombre_de_usuario&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Relacionado: &lt;a href=&quot;/blog/es/2010/08/14/parchando-paquetes-con-quilt-bzr.html&quot;&gt;parchando paquetes con quilt + bzr - motu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/08/06/como-arreglar-bugs-con-bzr-version-corta/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>links aleatorios, semana 24-3/agosto - motu</title>
   <link href="https://javier.io/blog/es/2010/08/03/links-aleatorios-semana-24-3-agosto.html"/>
   <published>2010-08-03T00:00:00+00:00</published>
   <updated>2010-08-03T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/08/03/links-aleatorios-semana-24-3-agosto</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">links aleatorios, semana 24-3/agosto - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/08/03/links-aleatorios-semana-24-3-agosto.html">&lt;h2 id=&quot;links-aleatorios-semana-24-3agosto---motu&quot;&gt;links aleatorios, semana 24-3/agosto - motu&lt;/h2&gt;

&lt;h6 id=&quot;03-aug-2010&quot;&gt;03 Aug 2010&lt;/h6&gt;

&lt;p&gt;Esta semana me he concentrado en asignar paquetes a los reportes que &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+bugs?field.searchtext=&amp;amp;orderby=-datecreated&amp;amp;field.status%3Alist=NEW&amp;amp;field.importance%3Alist=UNDECIDED&amp;amp;assignee_option=none&amp;amp;field.assignee=&amp;amp;field.bug_reporter=&amp;amp;field.bug_contact=&amp;amp;field.bug_commenter=&amp;amp;field.subscriber=&amp;amp;field.component-empty-marker=1&amp;amp;field.status_upstream-empty-marker=1&amp;amp;field.omit_dupes.used=&amp;amp;field.omit_dupes=on&amp;amp;field.has_patch.used=&amp;amp;field.has_cve.used=&amp;amp;field.tag=&amp;amp;field.tags_combinator=ANY&amp;amp;field.has_no_package.used=&amp;amp;field.has_no_package=on&amp;amp;search=Search&quot;&gt;no
tienen&lt;/a&gt; uno, estos reportes son de los mas faciles porque muchos de ellos
los puedes convertir en preguntas o invalidar. Explico un poco como he
entendido el asunto o como no lo he entendido. Cuando reportas un error, la
&lt;a href=&quot;https://help.ubuntu.com/community/ReportingBugs&quot;&gt;forma correcta&lt;/a&gt; es hacerlo con $ ubuntu-bug, este comando adjunta un buen
de archivos sobre tu sistema, y asigna el error a determinado paquete fuente
(source package), sin embargo muchos usuarios tambien reportan errores desde
launchpad y olvidan ese dato, sin ello es muy probable que el reporte quede
sin solucionarse porque nadie se entera de su existencia. Al momento de
asignarle paquete, se hace un ping al “encargado” del paquete y es mas facil
que puedan verlo. Esta parte no me queda clara, por un lado he leido una y
otra vez que Ubuntu no tiene mantenedores, pero luego esta esta caracteristica
en lp. El procedimiento es muy sencillo, he leido al menos 3 veces la wiki:
&lt;a href=&quot;https://wiki.ubuntu.com/Bugs/FindRightPackage&quot;&gt;https://wiki.ubuntu.com/Bugs/FindRightPackage&lt;/a&gt; y configurado mi sistema para
que use los scripts de grasemonkey. El detalle estaba en instalar el paquete
‘firefox-lp-improvements‘, yo lo habia hecho manualmente descargando cada
archivo .js. Entonces cada vez (para ser completamente sincero, no siempre
hago el ping) que quiero asignar un paquete, encuentro el paquete fuente, hago
un ping en #ubuntu-bugs para corroborar, le doy en ‘No-package’ y gm
(gracemonkey, de ahora en adelante) autocompleta un comentario y asigna el
paquete al paquete fuente que deseo. Al ser mis primeros pasos me suscribo a
cada uno de los reportes que toco, y he leido con alegria que despues de
reasignarlos por lo general alguna persona con mayores conocimientos le da una
leida rapida, le asigna mejor importancia, empieza a trabajar en ella o la
anula por falta de datos, genial =)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Bugs/HowToTriage/Charts&quot;&gt;https://wiki.ubuntu.com/Bugs/HowToTriage/Charts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un dia de estos terminare imprimiendolo para pegarlo en mi pared.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20171024015234/http://hall-of-fame.ubuntu.com/&quot;&gt;https://web.archive.org/web/20171024015234/http://hall-of-fame.ubuntu.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inspirador&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.debian.org/doc/maint-guide/ch-dreq.en.html#fr14&quot;&gt;http://www.debian.org/doc/maint-guide/ch-dreq.en.html#fr14&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voy lento, pero seguro, ahora mismo estoy leyendo dh*, un conjunto de scripts
en perl que hacen basicamente toda la empaquetacion.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuGlobalJam&quot;&gt;https://wiki.ubuntu.com/UbuntuGlobalJam&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Del 27 al 29 de agosto, abran algunas conferencias virtuales, al estilo del
Ubuntu developer week pero enfocandose mucho mas en el arreglo de bugs. Tengo
la fantasia de algun dia poder correr un Local Jam por aqui, con un poco de
suerte el proximo año.&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/08/03/links-aleatorios-semana-24-3agosto/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>sincronizar paquetes, o como pedir paquetes de debian en ubuntu</title>
   <link href="https://javier.io/blog/es/2010/07/30/sincronizar-paquetes-o-como-pedir-paquetes-de-debian-en-ubuntu.html"/>
   <published>2010-07-30T00:00:00+00:00</published>
   <updated>2010-07-30T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/07/30/sincronizar-paquetes-o-como-pedir-paquetes-de-debian-en-ubuntu</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">sincronizar paquetes, o como pedir paquetes de debian en ubuntu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/07/30/sincronizar-paquetes-o-como-pedir-paquetes-de-debian-en-ubuntu.html">&lt;h2 id=&quot;sincronizar-paquetes-o-como-pedir-paquetes-de-debian-en-ubuntu&quot;&gt;sincronizar paquetes, o como pedir paquetes de debian en ubuntu&lt;/h2&gt;

&lt;h6 id=&quot;30-jul-2010&quot;&gt;30 Jul 2010&lt;/h6&gt;

&lt;p&gt;Al rededor del 70% de las aplicaciones de Ubuntu son copiadas de Debian sin hacer un solo cambio (ojo, esta cifra me la he sacado de la manga, pero igual creo que el verdadero porcentaje es alto), esto es, una maquina se conecta a los repositorios de Debian y baja indiscriminadamente todos los paquetes que puede, los prueba (compila), y si funcionan los copia a su propio repositorio y de esa forma estara disponible en Ubuntu de ahi en adelante, el proceso es indoloro y es la ventaja de ser el downstream de Debian, las cosas fluyen facilmente cuesta bajo. Si falla, el paquete pasara a engrosar la lista (de por si ya muy grande) de &lt;a href=&quot;http://qa.ubuntuwire.org/ftbfs/&quot;&gt;FTBFS&lt;/a&gt; (fail to build from source). Este proceso se esta llevando continuamente hasta una fecha establecida como “&lt;a href=&quot;https://wiki.ubuntu.com/DebianImportFreeze&quot;&gt;debian import freeze&lt;/a&gt;“.&lt;/p&gt;

&lt;p&gt;Para Maverick el DIF (para abreviar) fue el 24 de Junio del 2010 hace ya mas
de un mes, puede verse el calendario completo &lt;a href=&quot;https://wiki.ubuntu.com/MaverickReleaseSchedule&quot;&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Que pasa con todas las actualizaciones y los nuevos paquetes que aparezcan en
Debian despues de esta fecha?, AUN se PUEDEN sincronizar, pero el proceso ya
no es automatico, se tiene que crear un reporte, jurar y perjurarar que el
paquete funciona correctamente con la ultima version de Ubuntu y suscribir al
equipo ‘ubuntu-sponsor‘. En general la mayoria de estos reportes son aceptados
hasta otra fecha llamada “&lt;a href=&quot;https://wiki.ubuntu.com/FeatureFreeze&quot;&gt;feature freeze&lt;/a&gt;“, como su nombre lo dice a
partir de ahi, ya no se sigue desarrollando Ubuntu, solo se arreglan errores.
El FF (para abreviar) para Maverick sera el 12 de Agosto del 2010.&lt;/p&gt;

&lt;p&gt;Despues de esa fecha y solo en caso de que se trate de un paquete que mejore
significativamente la distribucion o que corriga algun error critico podra ser
sincronizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ejemplo:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hace 6-7 dias &lt;a href=&quot;http://packages.qa.debian.org/z/zathura.html&quot;&gt;aparecio&lt;/a&gt; en Debian un paquete para &lt;a href=&quot;https://pwmt.org/projects/zathura/&quot;&gt;zathura&lt;/a&gt;, zathura
es un visor de pdf super minimalista y con interfaz parecida a la de vim, hace
tiempo que lo utilizo (desde git), de hecho supe que estaba en Debian porque
ya habia empezado a empaquetarlo para Ubuntu cuando se me ocurrio buscarlo ( $
rmadison -u debian zathura).&lt;/p&gt;

&lt;p&gt;Para sincronizar este paquete se puede crear un reporte con un titulo similar
a &lt;em&gt;“ Sync zathura X (universe) from Debian sid (main)”&lt;/em&gt; por poner un ejemplo,
donde X es la version de zathura, (universe) es el repositorio en Ubuntu y
(main) es la seccion de Debian. Luego en el cuerpo del reporte se escriben las
razones por las que se quiere sincronizar y se adjunta un log donde muestre
que compila correctamente, algunos &lt;a href=&quot;https://launchpad.net/ubuntu/+bugs?field.searchtext=Sync&amp;amp;orderby=-datecreated&amp;amp;search=Search&amp;amp;field.status%3Alist=NEW&amp;amp;assignee_option=any&amp;amp;field.assignee=&amp;amp;field.bug_reporter=&amp;amp;field.bug_supervisor=&amp;amp;field.bug_commenter=&amp;amp;field.subscriber=&amp;amp;field.component-empty-marker=1&amp;amp;field.tag=&amp;amp;field.tags_combinator=ANY&amp;amp;field.status_upstream-empty-marker=1&amp;amp;field.has_cve.used=&amp;amp;field.omit_dupes.used=&amp;amp;field.omit_dupes=on&amp;amp;field.affects_me.used=&amp;amp;field.has_no_package.used=&amp;amp;field.has_patch.used=&amp;amp;field.has_branches.used=&amp;amp;field.has_branches=on&amp;amp;field.has_no_branches.used=&amp;amp;field.has_no_branches=on&quot;&gt;reportes&lt;/a&gt;. Para poder crear este
reporte, he tenido que descargar/compilar e instalar zathura en mi sistema.&lt;/p&gt;

&lt;p&gt;Descargando el archivo .dsc desde Debian:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir zathura; cd zathura
$ dget -xu http://ftp.de.debian.org/debian/pool/main/z/zathura/zathura_0.0.7-1.dsc
&lt;/pre&gt;

&lt;p&gt;Compilando:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd zathura-0.0.7/
$ debuild -us -uc
&lt;/pre&gt;

&lt;p&gt;Instalando:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo debi
Selecting previously deselected package zathura.
 (Reading database ... 197048 files and directories currently installed.)
 Unpacking zathura (from zathura_0.0.7-1_i386.deb) ...
 Setting up zathura (0.0.7-1) ...
 Processing triggers for menu ...
 Processing triggers for man-db ...
&lt;/pre&gt;

&lt;p&gt;Haciendo pruebas:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ zathura archivo.pdf
&lt;/pre&gt;

&lt;p&gt;Una vez que funcione, se puede crear el reporte, como ya habia mencionado se
puede hacer a “mano” pero tambien con “requestsync” este script esta en el
paquete “ubuntu-dev-tools” y se encarga de llenar el reporte y asignar los
equipos adecuados por nosotros, este es el que voy a usar para este ejemplo.&lt;/p&gt;

&lt;p&gt;Primero se le deben dar permisos en launchpad:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ BROWSER=firefox manage-credentials create -c ubuntu-dev-tools -l 2
&lt;/pre&gt;

&lt;p&gt;Firefox abrira una pagina y pedira el nivel de confiabilidad, ahi se debe
seleccionar “&lt;strong&gt;Change non-private data&lt;/strong&gt; “. Como en este caso zathura no
existe en Ubuntu, se utiliza la bandera ‘-n’ (new), tambien ‘-s’ porque aun no
tengo permisos sobre el archivo y –lp para que utilice la interfaz web de
launchpad, de lo contrario se mandara por correo (y puede tomar mas tiempo)
Ver $ man requestsync&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ requestsync -n -s --lp zathura
Currently the report looks as follows:
Summary (one line):
Sync zathura 0.0.7-1 (universe) from Debian unstable (main)
Description:
Please sync zathura 0.0.7-1 (universe) from Debian unstable (main)
All changelog entries:
zathura (0.0.7-1) unstable; urgency=low
 [ Sebastian Ramacher ]
 * Initial release (Closes: #582119)
 [ Jakub Wilk ]
 * Add myself to uploaders.
 -- Sebastian Ramacher &amp;lt;s.ramacher@gmx.at&amp;gt;  Fri, 23 Jul 2010 12:18:37 +0200
Do you want to edit the report [y/N]?
&lt;/pre&gt;

&lt;p&gt;Listo, el reporte esta hecho, se le pueden agregar detalles extra, presionando
‘y’ , de lo contario basta con presionar ‘n’ y ‘requestsync’ subira el
reporte, en este caso, me ha devuelto:
&lt;a href=&quot;https://bugs.edge.launchpad.net/ubuntu/+bug/611623&quot;&gt;https://bugs.edge.launchpad.net/ubuntu/+bug/611623&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eso es todo, en unos pocos dias zathura sera copiado a Ubuntu, y en la proxima
version podre instalarlo con $ sudo apt-get install zathura =), facil hasta
para mi.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/SyncRequestProcess&quot;&gt;https://wiki.ubuntu.com/SyncRequestProcess&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NOTA: Antes de crear el reporte hay que verificar que no haya sido pedido con
anterioridad.&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/07/30/sincronizar-paquetes-o-como-pedir-paquetes-de-debian-en-ubuntu/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>links aleatorios, semana ?-23/julio - motu</title>
   <link href="https://javier.io/blog/es/2010/07/23/links-aleatorios-semana-23-julio.html"/>
   <published>2010-07-23T00:00:00+00:00</published>
   <updated>2010-07-23T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/07/23/links-aleatorios-semana-23-julio</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">links aleatorios, semana ?-23/julio - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/07/23/links-aleatorios-semana-23-julio.html">&lt;h2 id=&quot;links-aleatorios-semana--23julio---motu&quot;&gt;links aleatorios, semana ?-23/julio - motu&lt;/h2&gt;

&lt;h6 id=&quot;23-jul-2010&quot;&gt;23 Jul 2010&lt;/h6&gt;

&lt;p&gt;No he podido leer mucho ultimamente asi que esta vez añadire lecturas que aun
no haya concluido.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;He terminado de leer las platicas que me habia perdido. Aun sigo pensando que
la de “getting started” (introduccion al desarrollo de ubuntu) por dholbach y
las de los papercuts, tanto de servidor como de escritorio fueron las mejores
platicas, esto posiblemente se deba a mi bajo nivel tecnico. Otras personas
probablemente opinen diferente.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://qa.ubuntuwire.org/ftbfs/&quot;&gt;http://qa.ubuntuwire.org/ftbfs/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui es donde se reportan los paquetes que fallan en la compilacion desde su
codigo fuente (fail to build from source), prometo a mi mismo intentar
solucionar un par de estos antes del domingo o me arranco el curita.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/PbuilderHowto&quot;&gt;https://wiki.ubuntu.com/PbuilderHowto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por recomendacion de dholbach (que bien me cae este tipo, jaja, creo que a
todos, al grado que he visto una foto donde aparece como el “osito cariñosito”
de ubuntu) estoy releyendo esta wiki, tratando de encontrarle sentido a cada
una de las opciones, esto despues de irritarlo al extremo con reiteradas
preguntas sobre el tema. Uno que es bruto.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://nullcortex.com/2009/12/visualizing-team-membership/&quot;&gt;http://nullcortex.com/2009/12/visualizing-team-membership/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se trata sobre un script que crea un grafico sobre la pertenencia de
determinado usuario (en launchpad) a los grupos (en launchpad cualquier puede
crear grupos, de ahi que existan muchisimos y algunas veces termines perdido),
para correr el script basta con descargarlo con bazaar (necesito leer una guia
para aprender a usar esto)&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ bzr branch lp:~bnrubin/+junk/lpdot
$ sudo apt-get install python-pydo
$ BROWSER=firefox ./lpdot.py chilicuil #ustedes pongan su nick
&lt;/pre&gt;

&lt;p&gt;Abrira firefox y pedira permisos para que el script pueda accesar a
determinados datos de su cuenta, yo le di de lectura no personales, cosa que
basto. Ya que pertenezco a muy pocos grupos mi imagen es bastante humilde,
para que no se viera tan egocentrico el asunto tambien he subido la de mi
tutor, &lt;a href=&quot;https://launchpad.net/~mrand&quot;&gt;mrand&lt;/a&gt;. Es una maravilla ese pedazo de codigo!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-links-aleatorios-semana-23-julio-1.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-links-aleatorios-semana-23-julio-1.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-links-aleatorios-semana-23-julio-2.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-links-aleatorios-semana-23-julio-2.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://behindmotu.wordpress.com/&quot;&gt;http://behindmotu.wordpress.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A traves de &lt;ubuntu-motu_A_T_lists.ubuntu.com&gt; (tendra utilidad que intente
proteger la direccion de la lista?) me he enterado de este inspirador blog, se
trata de entrevistas con varios MOTU’s. Conviene la pena hecharle un ojo, solo
con fines recreacionales.&lt;/ubuntu-motu_A_T_lists.ubuntu.com&gt;&lt;/p&gt;

&lt;p&gt;Tambien he empezado a leer:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.debian.org/doc/maint-guide/ch-start.en.html&quot;&gt;http://www.debian.org/doc/maint-guide/ch-start.en.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.debian.org/doc/debian-policy/ch-scope.html&quot;&gt;http://www.debian.org/doc/debian-policy/ch-scope.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dos manuales obligados si realmente quiero convertirme en un MOTU, sin embargo
estos francamente los terminare en un buen tiempo, tengo la mala costumbre
(por que no creo que sea practico) de leer sobre cada termino que no entiendo,
en este caso es practicamente sobre todas las utilidades, me siendo como si
fuera uno de esos bots de google, intentando indexar todo lo que encuentra a
su paso… Tal vez algun dia comprenda que eso es estupido y que mas vale buscar
conforme se requiera, por el momento ese es mi metodo.&lt;/p&gt;

&lt;p&gt;Estos ultimos dos los vengo haciendo en segundo plano, por el momento tambien
tengo que empezar a leer mas detalladamente sobre triaging bugs (clasificar
bugs), mi tutor me ha pedido que lea las siguientes wikis:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/BugSquad/GettingInvolved&quot;&gt;https://wiki.ubuntu.com/BugSquad/GettingInvolved&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/BugSquad&quot;&gt;https://wiki.ubuntu.com/BugSquad&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Bugs/HowToTriage&quot;&gt;https://wiki.ubuntu.com/Bugs/HowToTriage&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Bugs/Status&quot;&gt;https://wiki.ubuntu.com/Bugs/Status&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Bugs/Importance&quot;&gt;https://wiki.ubuntu.com/Bugs/Importance&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Bugs/Tags&quot;&gt;https://wiki.ubuntu.com/Bugs/Tags&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asi que tengo trabajo por delante.&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/07/23/links-aleatorios-3/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>i3 and xinerama</title>
   <link href="https://javier.io/blog/en/2010/07/23/i3-xinerama.html"/>
   <published>2010-07-23T00:00:00+00:00</published>
   <updated>2010-07-23T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/07/23/i3-xinerama</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">i3 and xinerama</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/07/23/i3-xinerama.html">&lt;h2 id=&quot;i3-and-xinerama&quot;&gt;i3 and xinerama&lt;/h2&gt;

&lt;h6 id=&quot;23-jul-2010&quot;&gt;23 Jul 2010&lt;/h6&gt;

&lt;p&gt;**Update Feb/2014: ** I’ve created a &lt;a href=&quot;https://github.com/minos-org/minos-tools/blob/master/tools/dmenu-xrandr&quot;&gt;dmenu script&lt;/a&gt; who lists and configures automatically available monitors.&lt;/p&gt;

&lt;p&gt;One of the main reasons I decided to stick with &lt;a href=&quot;http://i3-wm.org&quot;&gt;i3-wm&lt;/a&gt; over &lt;a href=&quot;https://web.archive.org/web/20190313003108/http://wmii.suckless.org/&quot;&gt;wmii&lt;/a&gt; was the improved &lt;a href=&quot;http://en.wikipedia.org/wiki/Xinerama&quot;&gt;xinerama&lt;/a&gt; support, that is the hability to use several screens at the same time, can you believe there are some window managers who don’t do it?, me neither 😳&lt;/p&gt;

&lt;p&gt;For example, if I were to clone the video output from my laptop screen to a video projector I could use:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ xrandr --output VGA1 --mode 1024x768 --same-as LVDS1
&lt;/pre&gt;

&lt;p&gt;Or if were to extend my virtual work place, I could execute:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ xrandr --output VGA1 --mode 1024x768 --right-of LVDS1
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;xrandr&lt;/strong&gt; accepts plenty of options, refer to the man page for more details.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/X/Config/Resolution&quot;&gt;https://wiki.ubuntu.com/X/Config/Resolution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>sobre el ubuntu developer week</title>
   <link href="https://javier.io/blog/es/2010/07/17/sobre-el-ubuntu-developer-week.html"/>
   <published>2010-07-17T00:00:00+00:00</published>
   <updated>2010-07-17T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/07/17/sobre-el-ubuntu-developer-week</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">sobre el ubuntu developer week</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/07/17/sobre-el-ubuntu-developer-week.html">&lt;h2 id=&quot;sobre-el-ubuntu-developer-week&quot;&gt;sobre el ubuntu developer week&lt;/h2&gt;

&lt;h6 id=&quot;17-jul-2010&quot;&gt;17 Jul 2010&lt;/h6&gt;

&lt;p&gt;El Ubuntu developer week ha terminado (udw de ahora en adelante), y ha sido
grandioso, desde el punto de vista de un joe cualquiera. Desde antes de
comenzar me puse a leer algunos de los logs anteriores y ya me esperaba algo
parecido, pero vivirlo ha sido mucho mejor. Todos los ponentes han sido muy
amables con todas nuestras preguntas, incluso siendo algunas repetitivas y
otras francamente estupidas (de esas hice mas de un par, lol).&lt;/p&gt;

&lt;p&gt;Uno de los ninja del equipo de kde, me ha dado un cinturon naranja solo por
asistir y seguir las intrucciones para configurar el entorno, :P, y poco
despues, justo terminando el udw me han asignado un tutor para el equipo
BugSquad, (los que se encargan de clasificar los bugs). Asi que de ahora en
adelante tendre 3hrs para preguntar hasta el cansancio, jeje.&lt;/p&gt;

&lt;p&gt;Debo volver a aclarar que no he hecho nada especial, solo he seguido el procedimiento, si alguien mas quiere un tutor ahora es el momento! (aunque al parecer tambien tienen pensado armar algo parecido para los MOTU, si!, son diferentes equipos). Solo he seguido el &lt;a href=&quot;https://wiki.ubuntu.com/BugSquad/GettingInvolved&quot;&gt;procedimiento&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Firmar el &lt;a href=&quot;http://www.ubuntu.com/community/conduct&quot;&gt;codigo de conducta&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Checar la guia &lt;a href=&quot;https://wiki.ubuntu.com/Bugs/HowToTriage&quot;&gt;How to Triage&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Y pedir el tutor, &lt;a href=&quot;https://wiki.ubuntu.com/BugSquad/Mentors&quot;&gt;BugSquad/Mentors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para esto basta con crear una wiki (&lt;a href=&quot;https://wiki.ubuntu.com/~javier-lopez&quot;&gt;aqui&lt;/a&gt; esta la mia) con el mismo nick
de launchpad, y poner el horario en el que estas disponible (en UTC, $date -u,
imprime la hora en UTC), tambien ayuda si especificas un area de interes,
kernel, gnome, kde, etc. Pero no es necesario, yo no he puesto ninguna y me
han aceptado : ), tampoco es necesario que tengas karma, he visto “alumnos”
con mas de 5000 y con 0, y son aceptados. Asi que no hay pretextos, ubuntu
esta abierto para todos.&lt;/p&gt;

&lt;p&gt;Tampoco es necesario ser parte del equipo o estar en “entrenamiento” para
clasificar y cerrar bugs, todos son bienvenidos, lo explicaron mucho mejor
ellos en la udw, los logs ya estan &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek&quot;&gt;disponibles&lt;/a&gt; :), personalmente le
seguire el hilo a ubuntu (server) &lt;a href=&quot;https://wiki.ubuntu.com/MeetingLogs/devweek1007/ImproveUbuntu&quot;&gt;papercuts&lt;/a&gt;, damn!, no puede ser mas
facil empezar a colaborar.&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/07/17/sobre-el-ubuntu-developer-week/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>comentarios aleatorios, semana 5-11/julio - motu</title>
   <link href="https://javier.io/blog/es/2010/07/13/comentarios-aleatorios-semana-5-11-julio.html"/>
   <published>2010-07-13T00:00:00+00:00</published>
   <updated>2010-07-13T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/07/13/comentarios-aleatorios-semana-5-11-julio</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">comentarios aleatorios, semana 5-11/julio - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/07/13/comentarios-aleatorios-semana-5-11-julio.html">&lt;h2 id=&quot;comentarios-aleatorios-semana-5-11julio---motu&quot;&gt;comentarios aleatorios, semana 5-11/julio - motu&lt;/h2&gt;

&lt;h6 id=&quot;13-jul-2010&quot;&gt;13 Jul 2010&lt;/h6&gt;

&lt;p&gt;Cuarta entrega que corresponde a la semana del 5 al 11 de Julio del 2010.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;simar&amp;gt; Hello I want to change the affects package of the bug to kernel. What should I choose in the search field ??
&amp;lt;nigelb&amp;gt; simar: the “linux” package
&amp;lt;simar&amp;gt; nigelb, thanks
&amp;lt;nigelb&amp;gt; np 🙂
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;simar&amp;gt; Hola, me gustaria cambiar el paquete que afecta un determinado bug al kernel. Que deberia poner en el campo de busqueda?
&amp;lt;nigelb&amp;gt; simar: el paquete “linux”
&amp;lt;simar&amp;gt; nigelb, gracias
&amp;lt;nigelb&amp;gt; np (no hay problema) 🙂
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;drew212&amp;gt; micahg: how do i install the LP scripts from GM? I lost it on my new install and i’m trying to set everything back the way it was =X
&amp;lt;micahg&amp;gt; drew212: &amp;lt;https://launchpad.net/~gm-dev-launchpad/+archive/ppa/+packages&amp;gt;
&amp;lt;drew212&amp;gt; micahg: thanks =)
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;drew212&amp;gt; micahg: como instalo los scripts para launchpad (LP) de [greacemonkey][67] (GM)? los perdi en mi nueva instalacion y estoy tratando de dejar todo como estaba antes =X #Es un scripts que permiten agregar [respuestas rapidas][68] a reportes invalidos. No lo he podido hacer andar
&amp;lt;micahg&amp;gt; drew212: [https://launchpad.net/~gm-dev- launchpad/+archive/ppa/+packages][69]
&amp;lt;drew212&amp;gt; micahg: gracias =)
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;simar&amp;gt; qense, Hi , While marking bugs as duplicate should I change the affects package(if its wrongly configured) of the bug before marking or not?
&amp;lt;qense&amp;gt; simar: When you mark bug X as a duplicate of bug Y you change nothing to bug X, but only leave a comment explaining that it is a duplicate and that the reporter should look at bug Y from now on. Then you mark bug X as a duplicate of bug Y.
&amp;lt;qense&amp;gt; simar: This is done to make it easy to continue the discussion on bug X if it turns out to not be a duplicate after all. The fact that the package is different from bug Y doesn’t matter
&amp;lt;qense&amp;gt; because duplicate bugs are hidden anyway.
&amp;lt;simar&amp;gt; qense, ok
&amp;lt;simar&amp;gt; qense, another thing How to triage bugs related to kernel ie touchpad bugs that are related to ubuntu kernel, I think these are not related to freedesktop ….
&amp;lt;qense&amp;gt; simar: Do you mean reporting them upstream?
&amp;lt;simar&amp;gt; qense, ya .. I’m sure the bug contains necessary information
&amp;lt;qense&amp;gt; simar: in that case: ask here, or ask at #ubuntu-kernel
&amp;lt;qense&amp;gt; simar: The kernel bug tracker is located at
&amp;lt;[https://bugzilla.kernel.org/&amp;amp;gt][70];, but I’m not sure whether the Ubuntu Kernel team handles the bugs themselves or not.
&amp;lt;simar&amp;gt; qense, i will try .. I think they do ..
&amp;lt;simar&amp;gt; qense, thnaks and have a nice day
&amp;lt;qense&amp;gt; simar: you’re welcome
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;simar&amp;gt; qense, Hola , si marco un reporte como copia de otro, deberia cambiar los paquetes que afecta el reporte original o no? (si esta incorrecto)
&amp;lt;qense&amp;gt; simar: cuando estableces que un reporte X es copia de otro Y, no cambias nada en el reporte X, solo dejas un comentario donde explicas que es una copia de otro y que la persona que lo reporto deberia ver el reporte original de ahi en adelante.
&amp;lt;qense&amp;gt; simar: Se hace para mantener la discusion del reporte X mas facilmente si resulta que al final no es duplicado de otro reporte. El hecho que el paquete sea diferente del reporte Y no importa.
&amp;lt;qense&amp;gt; porque los reportes duplicados no se toman en cuenta.
&amp;lt;simar&amp;gt; qense, ok
&amp;lt;simar&amp;gt; qense, otra cosa, como puedo clasificar errores relacionados con el Kernel?, por ejemplo; errores del touchpad que esten relacionados con el kernel de ubuntu , creo que estos no se relacionan con freedesktop ….
&amp;lt;qense&amp;gt; simar: quieres decir, como reportarlos a upstream?
&amp;lt;simar&amp;gt; qense, see .. estoy seguro que este bug contiene toda la informacion necesaria
&amp;lt;qense&amp;gt; simar: en ese caso pregunta aqui o en #ubuntu-kernel
&amp;lt;qense&amp;gt; simar: el bug tracker del kernel esta en
&amp;lt;[https://bugzilla.kernel.org/&amp;amp;gt][70];, pero no estoy seguro si el equipo del Kernel de Ubuntu maneje los reportes por si mismo y no.
&amp;lt;simar&amp;gt; qense, lo intentare .. creo que lo hacen ..
&amp;lt;simar&amp;gt; qense, gracias que tengas un buen dia
&amp;lt;qense&amp;gt; simar: gracias
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;somethinginteres&amp;gt; For this bug:
&amp;lt;https://bugs.launchpad.net/ubuntu/+source/evolution/+bug/572985&amp;gt; would you grab the src from LP to fix it or is the source on gnome.org somewhere?
&amp;lt;ubot2&amp;gt; Launchpad bug 572985 in evolution (Ubuntu) (and 2 other projects) “backup settings option uses unhelpful yes/no dialog (affects: 1) (heat: 52)” [Low,Triaged]
&amp;lt;vish&amp;gt; somethinginteres: adding a git patch to the upstream bug would be easier
&amp;lt;bcurtiswx&amp;gt; somethinginteres: since its an upstream issue, you’d try to use gnome git repositories
&amp;lt;bcurtiswx&amp;gt; git clone git://git.gnome.org/evolution maybe?
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;somethinginteres&amp;gt; Para este bug:
&amp;lt;https://bugs.launchpad.net/ubuntu/+source/evolution/+bug/572985&amp;gt; obtendrian el codigo desde Launchpad o desde algun lugar de gnome.org para arreglarlo?
&amp;lt;ubot2&amp;gt; Launchpad bug 572985 in evolution (Ubuntu) (and 2 other projects) “backup settings option uses unhelpful yes/no dialog (affects: 1) (heat: 52)” [Low,Triaged]
&amp;lt;vish&amp;gt; somethinginteres: agregar un parche mediante git al bug de upstream seria mas sencillo
&amp;lt;bcurtiswx&amp;gt; somethinginteres: como es un error de upstream, deberias probar con el repositorio de gnome
&amp;lt;bcurtiswx&amp;gt; podrias probar git clone git://git.gnome.org/evolution _#umm este comentario tal vez no sea tan util, pero dado que me he tomado la molestia de escogerlo y traducirlo, lo dejo. Lo importante aqui es ver como diferenciar cuando un parche debe ir en ubuntu o en el proyecto original, creo…
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;xelister&amp;gt;
&amp;lt;https://bugs.launchpad.net/ubuntu/+source/tremulous/+bug/513918&amp;gt;
&amp;lt;ubot2&amp;gt; Launchpad bug 513918 in tremulous (Ubuntu) “Tremulous is missing files and will not correctly start (affects: 9) (heat: 66)” [Undecided,Confirmed]
&amp;lt;xelister&amp;gt; please set priority to Medium – most native 3D games on linux (q3 based) do not work. We have so little of native games and they do not work. Year of linux on desktop…
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;xelister&amp;gt;
&amp;lt;https://bugs.launchpad.net/ubuntu/+source/tremulous/+bug/513918&amp;gt;
&amp;lt;ubot2&amp;gt; Launchpad bug 513918 in tremulous (Ubuntu) “Tremulous is missing files and will not correctly start (affects: 9) (heat: 66)” [Undecided,Confirmed]
&amp;lt;xelister&amp;gt; por favor, establece la prioridad a Media – la mayoria de los juegos nativos para linux en 3D (que se basen en q3) no funcionan. Tenemos tan pocos de esos y no funcionan. Venga el [año de linux][71] en el escritorio…
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;micromix&amp;gt; hey guys i an wondering how would we find out who fixes bugs for packages, do they have adopt a package like we do?
&amp;lt;hggdh&amp;gt; micromix: the fix may come from upstream, not from us; also *anyone* can propose a patch
&amp;lt;hggdh&amp;gt; micromix: and it is not necessary to adopt a package to work on fixes
&amp;lt;hggdh&amp;gt; although it helps to concentrate on a subset — you have to learn the code, and understand it
&amp;lt;micromix&amp;gt; hggdh: i was just curious to know what happens when we finish triage a bug
&amp;lt;hggdh&amp;gt; ah
&amp;lt;micromix&amp;gt; if it eventually reaches a developer
&amp;lt;micromix&amp;gt; or maybe we need to try to fix bugs ourselves
&amp;lt;hggdh&amp;gt; yes, eventually it reaches one. May take some time, since we are all quite busy
&amp;lt;hggdh&amp;gt; and, as I said above, *anyone* can work on a fix. We prefer fixes that the package developers approve
&amp;lt;hggdh&amp;gt; so — for example — if I write a fix for er, Evolution, then I should also propose it upstream
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;micromix&amp;gt; hola chicos, me pregunto como podriamos saber quien arregla determinados paquetes, ustedes tambien adoptan paquetes como lo hacemos nosotros #referiendose a la forma en la que debian trabaja, jaja, tengo la sensacion de haberlo traducido mal
&amp;lt;hggdh&amp;gt; micromix: el parche puede venir de upstream, no especificamente de nosotros; ademas *todos* pueden contribuir parches
&amp;lt;hggdh&amp;gt; micromix: y no es necesario adoptar paquetes para poder trabajar en parches
&amp;lt;hggdh&amp;gt; aunque ayuda que te concentres en algunos — tienes que aprender el codigo, entenderlo
&amp;lt;micromix&amp;gt; hggdh: solo tenia curiosida que pasa cuando terminamos de clasificarlos
&amp;lt;hggdh&amp;gt; ah
&amp;lt;micromix&amp;gt; si eventualmente alcanza un desarrollador
&amp;lt;micromix&amp;gt; o tenemos que arreglarlos nosotros mismos
&amp;lt;hggdh&amp;gt; si, eventualmente lo revisa un desarrollador. Puede tomar algun tiempo, ya que todos estamos algo ocupados
&amp;lt;hggdh&amp;gt; y, como dije mas arriba, *todos* pueden trabajar en los bugs. Aunque preferimos parches que hayan sido aprobados por los mantenedores del paquete #### no estoy seguro si se refiere al mantenedor de debian, o al desarrollador de ubuntu
&amp;lt;hggdh&amp;gt; — por ejemplo — si hago un parche para Evolution, debo mandarlo tambien al proyecto original
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;drew212&amp;gt; ddecator: and what if the work is already done before you do it, close it and put their name on it?
&amp;lt;ddecator&amp;gt; drew212: nah, when you close it using the tool it automatically puts your name. if you see they worked on it as part of the bugday, then you can usually ping them here and ask if there was something they still meant to do or if maybe they forgot to close it
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;drew212&amp;gt; ddecator: y que pasa si el trabajo ya fue hecho por alguien mas?, se cierra y se pone su nombre en el? #hablando del ubuntu bug day
&amp;lt;ddecator&amp;gt; drew212: nop, cuando lo cierras el programa ($ hugday close #bug) automaticamente pone tu nick (en la wiki). Si ves que lo trabajaron como parte del bugday, puedes preguntarles aqui si aun piensan agregarle algo o si lo han olvidado cerrar
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;elopio&amp;gt; Hi there.
&amp;lt;elopio&amp;gt; I marked one of the ubuntu bug day bugs as incomplete. But I don’t yet know what package it belongs too. Should I mark it as green on the wiki even though it hasn’t been assigned to a package?
&amp;lt;pedro_&amp;gt; elopio, if you’re subscribed to it and are going to continue to triage that bug, sure, mark it as green 😉
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;elopio&amp;gt; Hola #sobre el [ubuntu bug day][72]
&amp;lt;elopio&amp;gt; He clasificado uno de los reportes del ubuntu bug day como incompleto. Pero aun no se a que paquete pertenece (el ubuntu bug day al que se refiere se trato sobre asignar paquetes a los errores que no tenian asignado uno). Puedo marcarlo en verde (cerrado) aunque no tenga asignado paquete?
&amp;lt;pedro_&amp;gt; elopio, si te suscribes al reporte para seguir viendo su avance puedes marcarlo en verde 😉
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt; 09:34&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;mandara&amp;gt; can I add a watch in Launchpad to connect with &amp;lt;http://bugreports.qt.nokia.com&amp;gt; issue tracker?
&amp;lt;nigelb&amp;gt; mandara: hold on, checking
&amp;lt;mandara&amp;gt; k
&amp;lt;nigelb&amp;gt; mandara: sorry, not yet. &amp;lt;https://launchpad.net/bugs/bugtrackers&amp;gt; doesn’t list it
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt; 09:34&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;mandara&amp;gt; puedo agregar un link en Launchpad para seguir el avance de un bug en &amp;lt;http://bugreports.qt.nokia.com&amp;gt; ?
&amp;lt;nigelb&amp;gt; mandara: espera un momento, deja checo
&amp;lt;mandara&amp;gt; ok
&amp;lt;nigelb&amp;gt; mandara: aun no, lo siento. [https://launchpad.net/bugs/bugtrackers][73] no lo tiene listado #en LP puedes agregar links para ir actualizando las discusiones con otros bug trackers, poco despues de este comentario, nigelb creo un reporte para agregar soporte al bugtracker de qt.nokia.com
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;damascene&amp;gt; what is the version of mlterm that is going to be in Lucid
&amp;lt;damascene&amp;gt; sorry, Maverick Meerkat
&amp;lt;jmarsden&amp;gt; damascene: At the moment, Maverick has mlterm / 3.0.1-1 / maverick/universe / source, amd64, i386
&amp;lt;damascene&amp;gt; thanks
&amp;lt;jmarsden&amp;gt; Use rmadison to check for this.
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;damascene&amp;gt; cual es la version de mlterm que va a venir en Lucid
&amp;lt;damascene&amp;gt; perdon, en Maverick Meerkat
&amp;lt;jmarsden&amp;gt; damascene: por el momento, Maverick tiene este mlterm / 3.0.1-1 / maverick/universe / source, amd64, i386
&amp;lt;damascene&amp;gt; gracias
&amp;lt;jmarsden&amp;gt; usa rmadison para checarlo por ti mismo #con rmadison -u puedes ver las versiones en debian
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shapr&amp;gt; Laney: I’m new to ubuntu, have used debian for many years, is there an equivalent of debian/unstable?
&amp;lt;Laney&amp;gt; no not really, there’s a development release but it’s subject to various freezes
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shapr&amp;gt; Laney: Soy nuevo en ubuntu, aunque he usado debian por muchos años, hay algun equivalente a debian/unstable en ubuntu?
&amp;lt;Laney&amp;gt; no realmente, hay versiones en desarrollo, pero estan sujetas a varios freezes #periodos donde no puedes modificar sustancialmente la distribución, solo agregar parches que arreglen problemas puntuales.
&amp;lt;https://wiki.ubuntu.com/MaverickReleaseSchedule&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;maxwellian&amp;gt; Out of curiosity, what do people mean by “inline” patches? Patches applied directly to the source, rather than saved in something like debian/patches?
&amp;lt;ScottK&amp;gt; maxwellian: Yes.
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;maxwellian&amp;gt; solo por curiosidad, que es lo que la gente quiere decir cuando menciona parche “inline”? Parches que se aplican directamente al codigo fuente, en lugar de ponerse en sitios como debian/patches?
&amp;lt;ScottK&amp;gt; maxwellian: Si
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;ScottK&amp;gt; ryanakca: If Debian doesn’t have a patch system, don’t add one.
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;ScottK&amp;gt; ryanakca: Si Debian no integra sistema de parches (quilt, dpatch) no agregues uno
&lt;/pre&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/07/13/comentarios-aleatorios-4/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>gtk and java</title>
   <link href="https://javier.io/blog/en/2010/07/13/gtk-java.html"/>
   <published>2010-07-13T00:00:00+00:00</published>
   <updated>2010-07-13T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/07/13/gtk-java</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="personal"/>
   
   
   
   <summary type="html">gtk and java</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/07/13/gtk-java.html">&lt;h2 id=&quot;gtk-and-java&quot;&gt;gtk and java&lt;/h2&gt;

&lt;h6 id=&quot;13-jul-2010&quot;&gt;13 Jul 2010&lt;/h6&gt;

&lt;p&gt;One of the main reasons I don’t like java is how their applications looks, whenever I open a java program I’ve the sensation I’ve gone back to the past 10-15 years. Nevertheless some of those applications can be forced to use gtk when available:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
export _JAVA_OPTIONS=&quot;-Dawt.useSystemAAFontSettings=on -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel&quot;
&lt;/pre&gt;

&lt;p&gt;It can also be permanently set by copying it to &lt;strong&gt;~/.bashrc&lt;/strong&gt; or your favorite shell configuration file.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://blogs.sun.com/netbeansphp/entry/how_to_change_look_and&quot;&gt;http://blogs.sun.com/netbeansphp/entry/how_to_change_look_and&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>fu-search</title>
   <link href="https://javier.io/blog/en/2010/07/11/fu-search.html"/>
   <published>2010-07-11T00:00:00+00:00</published>
   <updated>2010-07-11T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/07/11/fu-search</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">fu-search</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/07/11/fu-search.html">&lt;h2 id=&quot;fu-search&quot;&gt;fu-search&lt;/h2&gt;

&lt;h6 id=&quot;11-jul-2010&quot;&gt;11 Jul 2010&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;http://commandlinefu.com&quot;&gt;commandlinefu&lt;/a&gt; is a popular website where one-liners for unix environments are posted. It’s a nice place to learn by example, look for ideas or just to spend time. I liked so much than I decided to build my own client:&lt;/p&gt;

&lt;!--**[![](/assets/img/37.png)](/assets/img/37.png)**--&gt;
&lt;!--**[![](/assets/img/38.png)](/assets/img/38.png)**--&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/38.png&quot;&gt;&lt;img src=&quot;/assets/img/39.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;!--&lt;iframe class=&quot;showterm&quot; src=&quot;http://showterm.io/e46d37e655b72730db834&quot; width=&quot;640&quot; height=&quot;300&quot;&gt;&amp;nbsp;&lt;/iframe&gt;--&gt;&lt;/p&gt;

&lt;p&gt;Feel free to grab it at: &lt;a href=&quot;https://github.com/javier-lopez/learn/blob/master/sh/tools/fu-search&quot;&gt;https://github.com/javier-lopez/learn/blob/master/sh/tools/fu-search&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>links aleatorios, semana 27-4/julio - motu</title>
   <link href="https://javier.io/blog/es/2010/07/06/links-aleatorios-semana-27-4-julio.html"/>
   <published>2010-07-06T00:00:00+00:00</published>
   <updated>2010-07-06T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/07/06/links-aleatorios-semana-27-4-julio</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">links aleatorios, semana 27-4/julio - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/07/06/links-aleatorios-semana-27-4-julio.html">&lt;h2 id=&quot;links-aleatorios-semana-27-4julio---motu&quot;&gt;links aleatorios, semana 27-4/julio - motu&lt;/h2&gt;

&lt;h6 id=&quot;06-jul-2010&quot;&gt;06 Jul 2010&lt;/h6&gt;

&lt;p&gt;Segunda entrega que corresponde a la semana del 27 al 4 de Julio del 2010.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.omgubuntu.co.uk/2010/06/test-drive-err-testdrives-new-gtk.html&quot;&gt;http://www.omgubuntu.co.uk/2010/06/test-drive-err-testdrives-new-gtk.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sobre el proyecto de un estudiante del Google &lt;a href=&quot;https://web.archive.org/web/2010/http://code.google.com/soc/&quot;&gt;Summer&lt;/a&gt; of Code, para crear
un lanzador de maquinas virtuales de los daily builds, Ubuntu como supongo
muchas mas distribuciones crea images iso diaramente, estas imagenes contienen
los ultimos cambios, optimas para desarrolladores y testers que no tengan
miedo toparse con un sistema totalmente inservible :P, umm, los alpha y beta
son completamente estables a su lado, aun asi este programa intenta llevar
estas isos a muchos mas usuarios (noveles) [hasta el momento solo es posible
descargando las imagenes manualmente (hasta donde se) y con scripts en bash
(zsync)] &lt;a href=&quot;http://cdimage.ubuntu.com&quot;&gt;http://cdimage.ubuntu.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo he instalado para probarlo y aunque la interfaz grafica ya tiene forma,
todavia esta muy verde, al grado que cuando descargas las iso, no obtienes
ninguna respuesta y la aplicacion parece colgarse, el autor ha prometido
agregar soporte para hilos lo mas pronto posible, mantendre el proyecto en
marca personal.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://wiki.ubuntu.com/EfrainValles/MOTUJourney&quot;&gt;https://wiki.ubuntu.com/EfrainValles/MOTUJourney&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://effiejayx.wordpress.com/&quot;&gt;http://effiejayx.wordpress.com/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Efrain Valles tambien parecio aventurarse en un viaje motu hace tiempo, me
sorprende que no haya cientos de paginas parecidas por la web, estuve leyendo
casi todo su blog, y tiene muy buenos tutoriales, con imagenes y comandos paso
a paso, super recomendable, umm, aunque personalmente no le entendi al
tutorial de sync/merge que hizo, necesito desesperadamente que alguien me
explique eso xD, he dejado un comentario en su blog, espero se apiade de mi
alma.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://launchpad.net/harvest/&quot;&gt;https://launchpad.net/harvest/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Harvest era/sera una plataforma para arreglar algunos de los bugs mas faciles
que pudieran existir en ubuntu (hasta donde me entere), digo era porque al
parecer en algun momento funciono, pero dado que lo estan actualizando a
Django ahora ya no esta. Sin embargo ya que esta en launchpad, es muy facil
ver como va su desarrollo, $ bzr branch lp:harvest&lt;/p&gt;

&lt;p&gt;Le he tomado unas capturas:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-1.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-1.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-2.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-2.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-3.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-3.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-4.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-4.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-5.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-6.png&quot;&gt;&lt;img src=&quot;/assets/img/viajemotu-links-aleatorios-semana-27-4-julio-6.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasta el momento parece manejar la autenticacion, y no se que tan bien, pero
hay una variedad de bugs, donde supongo que los colaboradores oficiales pueden
dejar comentarios/marcar los errores segun el nivel de complejidad, tambien
tiene links a los parches adjuntos, ummm, creo que me gusta, aunque viniendo
de Ubuntu esperaria un poco mas de efectos (eyecandy), y ademas el tema
deberia estar actualizado al de la ultima version, jejej, me impresiona la
facilidad con la que puedo criticar, siempre es mas facil de este lado del rio
🙂&lt;/p&gt;

&lt;p&gt;Ademas de lo anterior, estuve recolectando algunos bits por aqui y por alla de
los cuales no recuerdo su url, por eso creo que a partir de hoy creare un
archivo ‘link.ubuntu’ para ir poniendo ahi los mas interesantes mientras
navego para que no me vuelva a pasar, $ cat ubuntu.notas&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;check-needs-packaging&lt;/strong&gt; – verifica los paquetes que requieren empaquetamiento y crea un html en el directorio desde donde es lanzado&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;body-searching patron&lt;/strong&gt; – busca en el cuerpo de los bugs&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;count-senders&lt;/strong&gt; – cuanto el numero de mensajes mandados por usuario, creo que requiere que la lista la tengas en local, no lo he usado&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;tagged-bugs&lt;/strong&gt; – tampoco lo he usado, su descripcion dice que busca por la etiqueta de los bugs&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;triager-query&lt;/strong&gt; – de este, no he entendido ni su descripcion ni su funcionamiento&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;dl-ubuntu-test-iso&lt;/strong&gt; – descarga imagenes iso de los daily builds, su archivo de configuracion me ha parecido comodo, pero el script (en python) no ha funcionado como hubiera creido, estoy trabajando en mi propio version (en bash), sip, soy demasiado estupido para reinventar la rueda, obvio solo pretendo hacerla usable para mi mismo, no creo que nadie mas deba sufrir con sus posibles errores.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;iso-ripper&lt;/strong&gt; – de la descripcion, descomprime las imagenes iso a un directorio&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;debian-bug-search patron&lt;/strong&gt; – busca en el cuerpo de lo errores de debian&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;hugday&lt;/strong&gt; – lista y ayuda a marcar los errores que vas corrigiendo en el ubuntu hug day (dia en el que los desarrolladores se centran en reparar los bugs de 1 paquete)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;grab-merge paquete&lt;/strong&gt; , descarga de &lt;a href=&quot;https://merges.ubuntu.com/&quot;&gt;MoM&lt;/a&gt; y del &lt;a href=&quot;http://packages.qa.debian.org/common/index.html&quot;&gt;PTS&lt;/a&gt; de debian, este script me ha traido bastante frustracion :(, descarga tantos paquetes que no se por donde empezar, me gustaria que alguien me aclarara que es y para que sirve cada uno&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;rmadison paquete&lt;/strong&gt; devuelve la ultima version en todas las versiones de ubuntu, si se usa con la opcion -u entonces devuelve las versiones de debian, util para ver cuando un paquete necesita una sincronizacion (sync)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;update-maintainer&lt;/strong&gt; , edita el archivo debian/control para actualizar el mantenedor del paquete de debian a la lista de ubuntu (ubuntu-devel-discuss@lists.ubuntu.com)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;grab-attachments Numero_bug&lt;/strong&gt; , descarga todos los adjuntos de un reporte (debdiffs), antes de poder usarlo se requiere correr los siguientes comandos:&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ BROWSER=/usr/bin/firefox manage-credentials create -c ubuntu-dev-tools -l 2
&lt;/pre&gt;

&lt;p&gt;Si no especifican BROWSER se abrira launchpad con links2 o uno de esos
navegadores minimalistas.&lt;/p&gt;

&lt;p&gt;Tambien encontre de buen gusto la herramienta apt-rdepends, puede crear
graficos con las dependencias inversas de un paquete, es decir los paquetes
que dependen de el, un ejemplo, aqui para ‘notification-daemon‘&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ apt-rdepends --dotty notification-daemon | dot -Tpng &amp;gt; notification.png
$ apt-cache rdepends paquete
$ apt-rdepends -r paquete
&lt;/pre&gt;

&lt;p&gt;Tienen funciones mas o menos similares, aunque al parecer apt-rdepends maneja
mejor el listado de dependencias.&lt;br /&gt;
Tambien recogi unas notas sobre BUILDERS (constructores).&lt;br /&gt;
Estos comandos vendrian siendo equivalentes, todos contruiran al menos un
archivo .deb y otros tambien un paquete fuente .dsc, otros por el contrario
construiran el .deb a partir de un paquete fuente .dsc.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ dpkg -b directory packagename.deb
$ dpkg-buildpackage -rfakeroot
$ fake root debian/rules binary
$ sudo pbuilder build paquete.dsc
$ debuild -us -uc -b #parece ser un wrapper alrededor de dpkg-buildpackage
$ sbuild -As paquete.dsc #no estoy seguro de este ultimo
&lt;/pre&gt;

&lt;p&gt;Y tambien hice algunas notas sobre el proceso de combinar paquetes (merge),
estas aun no las he entendido, en cuando lo comprenda, are una entrada
exclusivamente para este tema:&lt;/p&gt;

&lt;p&gt;La combinacion va de debian testing (actualmente sid) a la ultima version de
ubuntu, maverick a 4 de Julio del 2010. Al no ser MOTU ni core-dev, es
necesario que alguien te apruebe los cambios. Comunmente segun esto que lei,
deberian comentarte detalles del paquete hasta que queden comformes para
despues subirlo a los archivos. El proceso ‘corto’ es el siguiente:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Seleccionar un paquete de MoM: &lt;a href=&quot;https://merges.ubuntu.com/universe.html&quot;&gt;https://merges.ubuntu.com/universe.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Descargarlo con $ grab-merge y leer el archivo REPORT (el cual me parece cifrado :S)&lt;/li&gt;
  &lt;li&gt;Buscar y solucionar los conflictos de cada archivo, dando preferencia a los cambios de Debian&lt;/li&gt;
  &lt;li&gt;Actualizar debian/changelog para anotar los cambios&lt;/li&gt;
  &lt;li&gt;Crear un nuevo paquete fuente $ merge-buildpackage -rfakeroot&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Verificar que se compila correctamente en pbuilder y si funciona pedir a un MOTU que revise los cambios y si estan bien que suba el paquete.&lt;/p&gt;

  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/07/06/links-aleatorios-2/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>comentarios aleatorios, semana 27-4/julio - motu</title>
   <link href="https://javier.io/blog/es/2010/07/05/comentarios-aleatorios-semana-27-4-julio.html"/>
   <published>2010-07-05T00:00:00+00:00</published>
   <updated>2010-07-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/07/05/comentarios-aleatorios-semana-27-4-julio</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">comentarios aleatorios, semana 27-4/julio - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/07/05/comentarios-aleatorios-semana-27-4-julio.html">&lt;h2 id=&quot;comentarios-aleatorios-semana-27-4julio---motu&quot;&gt;comentarios aleatorios, semana 27-4/julio - motu&lt;/h2&gt;

&lt;h6 id=&quot;05-jul-2010&quot;&gt;05 Jul 2010&lt;/h6&gt;

&lt;p&gt;Tercera entrega que corresponde a la semana del 27 al 4 de Julio del 2010.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dkulchenko&amp;gt; If I’ve been experiencing frequent kernel panics since I switched to Lucid, what should I file the bug against?
&amp;lt;micahg&amp;gt; dkulchenko: linux
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dkulchenko&amp;gt; si he estado teniendo [kernel panics][53] desde que me cambie a Lucid, a que paquete deberia reportar el error?
&amp;lt;micahg&amp;gt; dkulchenko: linux
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;slangasek&amp;gt; does BuildLiveCD also get updated on every build?
&amp;lt;ogra_cmpc&amp;gt; nope
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;slangasek&amp;gt; se actualiza el BuildLiveCD en cada compilacion? ## umm, debo aclararme a mi mismo luego que es el ‘BuildLiveCD’
&amp;lt;ogra_cmpc&amp;gt; nop
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;pitti&amp;gt; known bugs are better then breaking existing functionality
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;pitti&amp;gt; es preferible mantener errores en los paquetes que romper funcionalidades
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-meeting&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;lex79&amp;gt; cdbs is fast for write a package
&amp;lt;lex79&amp;gt; debhelper is the new way 🙂
&amp;lt;lex79&amp;gt; but seems high quality than cdbs
&amp;lt;lex79&amp;gt; indeed, minion likes cdbs _**#ubuntu-meeting** :
&amp;lt;lex79&amp;gt; cdbs es rapido para crear un paquete
&amp;lt;lex79&amp;gt; mientras que debhelper es un nuevo metodo 🙂
&amp;lt;lex79&amp;gt; tambien parece ser que es de mejor calidad que cdbs
&amp;lt;lex79&amp;gt; aunque, a minion le gusta cdbs
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dupondje&amp;gt; whats the policy with packages that are removed in debian btw ?
&amp;lt;Laney&amp;gt; we usually follow them
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dupondje&amp;gt; por cierto, cual es la politica que corresponde a los paquetes que han sido eliminados en debian?
&amp;lt;Laney&amp;gt; normalmente los eliminamos
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;gubatron&amp;gt; hi, is there a dh_&amp;lt;something&amp;gt; tool to copy your postinst script? (so I don’t do an ugly cp in my debian/rules)
&amp;lt;Laney&amp;gt; to copy it to where?
&amp;lt;gubatron&amp;gt; DEBIAN/
&amp;lt;Laney&amp;gt; yep, that’s dh_installdeb
&amp;lt;gubatron&amp;gt; you rule Laney17:47
&amp;lt;ajmitch&amp;gt; you shouldn’t ever need to touch the DEBIAN dir at all
&amp;lt;gubatron&amp;gt; it worked, thanks Laney. ajmitch: that’s what we want. The debian/rules file looks beautiful now. thanks.
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;gubatron&amp;gt; hola, existe alguna herramienta del tipo
&amp;lt;dh_&amp;lt;algo&amp;gt; para copiar los scripts [postinst][54]? (y asi no tenga que usar el horroso cp en el archivo debian/rules)
&amp;lt;Laney&amp;gt; para copiarlos donde?
&amp;lt;gubatron&amp;gt; DEBIAN/
&amp;lt;Laney&amp;gt; sip, [dh_installdeb][55]
&amp;lt;gubatron&amp;gt; gracias Laney
&amp;lt;ajmitch&amp;gt; aunque no deberias modificar el directorio DEBIAN para nada
&amp;lt;gubatron&amp;gt; funciono, gracias Laney. ajmitch: eso es lo que quiero. Ahora el archivo debian/rules (##este no es mas que un #makefile, aunque tecnicamente podria ser un ./configure o cualquier otro) luce fabulos, gracias.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;Rhonda&amp;gt; What do people put into the debian/changelog for backports? Version number and the likes?
&amp;lt;Laney&amp;gt; Source change backport from XX to YY (LP: #zzzzzz)
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;Rhonda&amp;gt; Que es lo que la gente pone en el archivo debian/changelog cuando declara un backport ?(##paquetes que iran a parar a una version anterior a la que se usa en desarrollo, lucid para maverick) que numero de version y esas cosas?
&amp;lt;Laney&amp;gt; Source change backport from XX to YY (LP: #zzzzzz) ##no tengo idea de como traducir esto, =)
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;tumbleweed&amp;gt; test in a pbuilder if you can
&amp;lt;shadeslayer&amp;gt; tumbleweed: sure… i can use that too.. its just that qtcreator takes about 90 mins to build 😛
&amp;lt;shadeslayer&amp;gt; i can use debuild -nc if something goes wrong with debuild
&amp;lt;shadeslayer&amp;gt; not with pbuilder
&amp;lt;tumbleweed&amp;gt; shadeslayer: /usr/share/doc/pbuilder/examples/C10shell
&amp;lt;shadeslayer&amp;gt; tumbleweed: the hook that exits to shell?
&amp;lt;shadeslayer&amp;gt; i have it.. can i run debuild nc with it?
&amp;lt;tumbleweed&amp;gt; that hook fires up a shell and installs vim so you can look around and try things. not too sure what you are asknig on the second line
&amp;lt;shadeslayer&amp;gt; tumbleweed: ^^
&amp;lt;shadeslayer&amp;gt; oh sorry
&amp;lt;shadeslayer&amp;gt; tumbleweed: i meant that after i drop to shell,can i run debuild -nc ?
&amp;lt;tumbleweed&amp;gt; it’s a root shell, and doesn’t have devscripts installed, so I noramlly just do debian/rules binary
&amp;lt;shadeslayer&amp;gt; hm
&amp;lt;tumbleweed&amp;gt; not quite identical to building in fakeroot, but you can work out what’s wrong, test solutions, and then try again
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;tumbleweed&amp;gt; pruebalo si te es posible en pbuilder
&amp;lt;shadeslayer&amp;gt; tumbleweed: seguro… tambien puedo usarlo.. solo que tomara como 90 min para compilarlo 😛
&amp;lt;shadeslayer&amp;gt; puedo usar [debuild][56] -nc (##debuild acepta las mismas opciones ademas de las suyas de [dpkg-buildpackage][57] , gracias a dererkazo de #debian-es por explicarme esto) si falla debuild
&amp;lt;shadeslayer&amp;gt; pero no con pbuilder
&amp;lt;tumbleweed&amp;gt; shadeslayer: /usr/share/doc/pbuilder/examples/C10shell
&amp;lt;shadeslayer&amp;gt; tumbleweed: el script que devuelve una shell?
&amp;lt;shadeslayer&amp;gt; ok.. puedo correr debuild -nc con el?
&amp;lt;tumbleweed&amp;gt; el script regresa una shell e instala vim para que puedas probar cosas, no estoy seguro de lo que quieres hacer con la segunda pregunta
&amp;lt;shadeslayer&amp;gt; tumbleweed: ^^
&amp;lt;shadeslayer&amp;gt; ohh, perdon
&amp;lt;shadeslayer&amp;gt; tumbleweed: quiero decir que si despues de que me regresa la shell, puedo correr debuild -nc ?
&amp;lt;tumbleweed&amp;gt; es una shell con permisos de super usuario, y no tiene el paquete devscripts instalado, asi que normalmente deberias ser capaz de correr el script debian/rules
&amp;lt;shadeslayer&amp;gt; hm
&amp;lt;tumbleweed&amp;gt; tampoco es lo mismo compilarlo ahi que en fakeroot, pero seguro es suficiente para poder ver lo que esta mal, y para que puedas probar soluciones
&lt;/pre&gt;

&lt;h2 id=&quot;notas-del-traductor&quot;&gt;Notas del traductor&lt;/h2&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/07/05/comentarios-aleatorios-3/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ubuntu developer week (la semana del desarrollador de ubuntu)</title>
   <link href="https://javier.io/blog/es/2010/07/02/ubuntu-developer-week-la-semana-del-desarrollador-de-ubuntu.html"/>
   <published>2010-07-02T00:00:00+00:00</published>
   <updated>2010-07-02T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/07/02/ubuntu-developer-week-la-semana-del-desarrollador-de-ubuntu</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">ubuntu developer week (la semana del desarrollador de ubuntu)</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/07/02/ubuntu-developer-week-la-semana-del-desarrollador-de-ubuntu.html">&lt;h2 id=&quot;ubuntu-developer-week-la-semana-del-desarrollador-de-ubuntu&quot;&gt;ubuntu developer week (la semana del desarrollador de ubuntu)&lt;/h2&gt;

&lt;h6 id=&quot;02-jul-2010&quot;&gt;02 Jul 2010&lt;/h6&gt;

&lt;p&gt;Me acabo de enterar de que la semana del desarrollador de Ubuntu, será del 12
al 16 de Julio del 2010, espero que esta sea la buena, y puede ayudarme a
involucrarme mas de cerca con el proyecto.&lt;/p&gt;

&lt;p&gt;Los logs de los eventos anteriores pueden encontrarse en:
&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek/Previous&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek/Previous&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;He leido que en ocasiones anteriores han habilitado canales paralelos en
diferentes lenguajes (como #motu-es o algo parecido) para que incluso los que
no tenemos un dominio muy amplio de la lengua de Shakespeare podamos entrar y
participar de las sesiones, ya actualizare el blog si lo confirmo, por lo
pronto dejare el mensaje original y una copia en español que google translator
me ha ayudado a hacer.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hello everybody,&lt;/p&gt;

  &lt;p&gt;Ubuntu Developer Week is back again, which means five days of&lt;br /&gt;
 action-packed IRC sessions where you learn more about hacking on Ubuntu,&lt;br /&gt;
 developing Ubuntu and how to interact with other projects.&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;We’ll have a fantastic time from July 12th 2010 to July 16th 2010, great&lt;br /&gt;
 speakers, interesting sessions, lots of good questions and great people&lt;br /&gt;
 who get to know each other.&lt;/p&gt;

  &lt;p&gt;If you’re new to Ubuntu Developer Week and what it is, check out the&lt;br /&gt;
 general page [1], how to join in [2] and how it all works [3].&lt;/p&gt;

  &lt;p&gt;[1] &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek&lt;/a&gt;&lt;br /&gt;
[2] &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek/JoiningIn&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek/JoiningIn&lt;/a&gt;&lt;br /&gt;
[3] &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek/Rules&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek/Rules&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;Our sessions cover:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;Getting involved with Ubuntu development, becoming a Kubuntu Ninja,&lt;br /&gt;
 Authoring Upstart jobs, Working With Translations, Having fun with&lt;br /&gt;
 Packaging QA&lt;/li&gt;
    &lt;li&gt;How Daily Builds work, Operation Cleansweep, Setting up a validation&lt;br /&gt;
 Dashboard, Working with Merge Proposals, Working with Django,&lt;br /&gt;
 Adopting an Upstream, Forwarding Bugs and Patches Upstream&lt;/li&gt;
    &lt;li&gt;How to work with Debian, Ubuntu Server, Xubuntu and Edubuntu&lt;br /&gt;
 goodness, Kernel Triage&lt;/li&gt;
    &lt;li&gt;Widgetcraft, QT Quick, QML&lt;/li&gt;
    &lt;li&gt;Desktop goodness, Application Indicators, Rocking Papercuts&lt;/li&gt;
    &lt;li&gt;Lots of FUN&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Please help spread the news, this will be an awesome opportunity to&lt;br /&gt;
 learn more and get involved.&lt;/p&gt;

  &lt;p&gt;Have a great day,&lt;br /&gt;
 Daniel&lt;/p&gt;

  &lt;hr /&gt;

  &lt;p&gt;Hola a todos.&lt;/p&gt;

  &lt;p&gt;La semana del desarrollador de ubuntu regresa, lo que significa que
tendremos 5 dias de sesiones de IRC pre-empaquetadas con una alta dosis de
accion, donde podras aprender mas sobre el desarrollo de Ubuntu y como este
interactua con otros proyectos.&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek&lt;/a&gt; (en inglés)&lt;/p&gt;

  &lt;p&gt;Tendremos un fabuloso programa del 12 al 16 de Julio del 2010, con
grandiosos ponentes, sesiones super interesantes, toneladas de buenas
preguntas e increible gente que podra conocer e intercambiar ideas con otra.&lt;/p&gt;

  &lt;p&gt;Si no estas familiarizado con la semana del desarrollador de ubuntu y su
objetivo, visita la pagina principal [1], las instrucciones de como
participar [2] y las reglas de convivencia [3].&lt;/p&gt;

  &lt;p&gt;[1] &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek&lt;/a&gt; (en inglés)&lt;br /&gt;
[2] &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek/JoiningIn&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek/JoiningIn&lt;/a&gt; (en inglés)&lt;br /&gt;
[3] &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDeveloperWeek/Rules&quot;&gt;https://wiki.ubuntu.com/UbuntuDeveloperWeek/Rules&lt;/a&gt; (en inglés)&lt;/p&gt;

  &lt;p&gt;Nuestras platicas cubren:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;Como involucrarse con el modelo de desarrollo de Ubuntu, como convertirse
en un ninja de Kubuntu, como crear scripts de Upstart, como ayudar a la
traduccion de Ubuntu, como crear paquetes QA (quality assurance —
aseguramiento de calidad?)&lt;/li&gt;
    &lt;li&gt;Como funcionan las compilaciones diarias de la distribución, que es la
operacion Cleansweep, como se trabaja con las fusiones (merges), como
trabajar con Django, como adoptar un upstream, como enviar reportes y
parches a upstream&lt;/li&gt;
    &lt;li&gt;Como trabajar con Debian, Ubuntu Server, Xubuntu y Edubuntu&lt;br /&gt;
 como clasificar correctamente los reportes de errores del kernel&lt;/li&gt;
    &lt;li&gt;Widgetcraft, QT Quick, QML&lt;/li&gt;
    &lt;li&gt;Muchas ideas que estan en borrador, aplicaciones interesantes para el
escritorio&lt;/li&gt;
    &lt;li&gt;Y mucha más diversion (sic)&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Por favor, ayudanos a difundir las buenas nuevas, esta es una grandiosa
oportunidad para aprender mas del proceso e involucrarse con Ubuntu.&lt;/p&gt;

  &lt;p&gt;Que tengan un buen día,&lt;br /&gt;
 Daniel&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/07/02/ubuntu-developer-week/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>comentarios aleatorios, semana 21-26/junio - motu</title>
   <link href="https://javier.io/blog/es/2010/07/02/comentarios-aleatorios-semana-21-26-junio.html"/>
   <published>2010-07-02T00:00:00+00:00</published>
   <updated>2010-07-02T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/07/02/comentarios-aleatorios-semana-21-26-junio</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">comentarios aleatorios, semana 21-26/junio - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/07/02/comentarios-aleatorios-semana-21-26-junio.html">&lt;h2 id=&quot;comentarios-aleatorios-semana-21-26junio---motu&quot;&gt;comentarios aleatorios, semana 21-26/junio - motu&lt;/h2&gt;

&lt;h6 id=&quot;02-jul-2010&quot;&gt;02 Jul 2010&lt;/h6&gt;

&lt;p&gt;Segunda entrega que corresponde a la semana del 21 al 26 de junio del 2010.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs&lt;/strong&gt; : About kernel syncs&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;ogasawara&amp;gt; xteejx: right, we rebase with each 2.6.35-rc# candidate as they come out
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs&lt;/strong&gt; : Sobre la sincronizacion del kernel&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;ogasawara&amp;gt; xteejx: correcto, sincronizamos el paquete base con cada version de 2.6.35-[rc#][45] que va saliendo
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;cwillu&amp;gt; what’s the email address to email to a launchpad bug report?
&amp;lt;cwillu&amp;gt; &amp;lt;bug#&amp;gt;@bugs.launchpad.net?
&amp;lt;cwillu&amp;gt; ah, yep; just showed up
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;cwillu&amp;gt; cual es el correo de los bugs que estan en launchpad?
&amp;lt;cwillu&amp;gt; &amp;lt;#bug&amp;gt;@bugs.launchpad.net?
&amp;lt;cwillu&amp;gt; oh, sip; lo acabo de encontrar
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;zyga&amp;gt; dholbach, where does ubuntu developer week take place? #ubuntu-meeting?
&amp;lt;dholbach&amp;gt; zyga: #ubuntu-classroom
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;zyga&amp;gt; dholbach, donde se va a dar el “[ubuntu developer week][46]” (la semana del desarrollador de ubuntu), en #ubuntu-meeting?
&amp;lt;dholbach&amp;gt; zyga: #ubuntu-classroom
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;encodec&amp;gt; hey all
&amp;lt;encodec&amp;gt; i want to understand how packages work
&amp;lt;encodec&amp;gt; by that i mean…
&amp;lt;encodec&amp;gt; who compiles them
&amp;lt;encodec&amp;gt; how are they added to package system
&amp;lt;cjwatson&amp;gt; developers upload source packages; they’re compiled by automatic build servers
&amp;lt;encodec&amp;gt; how?
&amp;lt;cjwatson&amp;gt; please expand on your question
&amp;lt;encodec&amp;gt; well i guess in linux its just a ./configure make script..
&amp;lt;cjwatson&amp;gt; dpkg-buildpackage is the official entry point
&amp;lt;cjwatson&amp;gt; unpack source package, cd into unpacked tree, run dpkg- buildpackage -b
&amp;lt;cjwatson&amp;gt; that calls debian/rules with various arguments, behind the scenes
&amp;lt;cjwatson&amp;gt; and debian/rules takes care of whatever the specifics of the package are. not everything is ./configure &amp;amp;&amp;amp; make
&amp;lt;encodec&amp;gt; ok ok
&amp;lt;encodec&amp;gt; what describes the dependencies, destination paths and such things?
&amp;lt;cjwatson&amp;gt; encodec: debian/control describes dependencies, although many of them are worked out dynamically by dpkg-shlibdeps
&amp;lt;cjwatson&amp;gt; encodec: destination paths are done by a mix of things; it’s easiest to run dpkg-buildpackage on a package and watch its output
&amp;lt;cjwatson&amp;gt; sometimes it’s the upstream build scripts (Makefile or whatever), sometimes debian/*.install, sometimes manual commands written directly into debian/rules, it varies
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;encodec&amp;gt; hola a todos
&amp;lt;encodec&amp;gt; me gustaria entender como funcionan los paquetes
&amp;lt;encodec&amp;gt; y con eso quiero decir..
&amp;lt;encodec&amp;gt; quien los compila
&amp;lt;encodec&amp;gt; como se agregan a los repositorios, etc
&amp;lt;cjwatson&amp;gt; encodec: los desarrolladores suben paquetes de codigo fuente (.dsc); y estos luego son compilados por servidores automatizados
&amp;lt;encodec&amp;gt; como?
&amp;lt;cjwatson&amp;gt; por favor se más concreto con tu pregunta
&amp;lt;encodec&amp;gt; bueno, yo creo que debería bastar con correr ./configure &amp;amp; make
&amp;lt;cjwatson&amp;gt; dpkg-buildpackage es el punto oficial de entrada
&amp;lt;cjwatson&amp;gt; luego se descomprime el paquete fuente, se mueve a la carpeta descomprimida y se corre dpkg-buildpackage -b
&amp;lt;cjwatson&amp;gt; eso llama a debian/rules con varios parametros detras de escena
&amp;lt;cjwatson&amp;gt; y debian/rules se encarga de cualquier detalle que pueda tener el paquete, no todo es ./configure &amp;amp;&amp;amp; make
&amp;lt;encodec&amp;gt; ok ok
&amp;lt;encodec&amp;gt; como se describen las dependencias, el lugar donde se pondran los binarios y esas cosas?
&amp;lt;cjwatson&amp;gt; encodec: el archivo debian/control describe las dependencias, aunque muchas de ellas se descubren dinamicamente con dpkg-shlibdeps
&amp;lt;cjwatson&amp;gt; encodec: el lugar a donde se copian los binarios se conforman por una mezcla de cosas, es mas facil usar dpkg-buildpackage sobre un paquete y ver su salida para darse una idea
&amp;lt;cjwatson&amp;gt; algunas veces es el script que viene de upstream (ya sea un Makefile o cualquier otra cosa), otras veces son los archivos debian/*.install, o puede que sean comandos a escritos directamente en debian/rules, varia.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;KIAaze&amp;gt; what is the name of the program/script to test install/uninstall/upgrade/etc of a package?
&amp;lt;KIAaze&amp;gt; I remember reading about something like that, but I can’t find it anymore
&amp;lt;ScottK&amp;gt; piuparts?
&amp;lt;KIAaze&amp;gt; yes, that looks like it. Thanks. 🙂
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;KIAaze&amp;gt; como se llama el script/programa que sirve para instalar/desinstalar/actualizar/etc un paquete?
&amp;lt;KIAaze&amp;gt; Recuerdo haber leido algo por el estilo, pero no puedo encontrarlo
&amp;lt;ScottK&amp;gt; [piuparts][47]?
&amp;lt;KIAaze&amp;gt; si, creo que ese es. Gracias 🙂
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-packaging&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;qnull&amp;gt; hello everybody. Is it possible to let launchpad build packages for different versions of ubuntu (lucid, maverick) from just one source package?
&amp;lt;geser&amp;gt; no, you need one upload for each release (you just need to change the upload target and modify the version slightly as each version can only be uploaded once)
&amp;lt;qnull&amp;gt; thanks for reply! You mean the target in the changelog?
&amp;lt;geser&amp;gt; yes
&amp;lt;qnull&amp;gt; It’s kinda stupid that you have to modify the source for that, isn’t it?
&amp;lt;geser&amp;gt; but also required by the archive layout. As all debs for a source package are in the same directoy, you need different file names for each release which can be acomplished by changeing the version string
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;qnull&amp;gt; hola a todos. Será posible hacer que launchpad cree paquetes para diferentes version de ubuntu (lucid, maverick), desde un solo paquete fuente (.dsc)?
&amp;lt;geser&amp;gt; no, necesitas subirlo para cada version (lo unico que tienes que cambiar es el objetivo y la versión del paquete, ya que solo puedes subir 1 vez una version determinada)
&amp;lt;qnull&amp;gt; gracias! cuando dices el objetivo, te refieres a la versión de ubuntu en el changelog?
&amp;lt;geser&amp;gt; sip
&amp;lt;qnull&amp;gt; es un tanto estupido que tengas que modificar el paquete fuente para eso, no lo creen?
&amp;lt;geser&amp;gt; pero es requerido para conservar la estructura del archivo (donde se guardan los .deb). Ya que todos los debs del mismo paquete fuente se guardan en el mismo directorio, necesitas una forma de diferenciarlo con los paquetes de las otras versiones de ubuntu, y esto se logra modificando la version en el changelog.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;micahg&amp;gt; kaushal: In Ubuntu, we generally don’t have maintainers
&amp;lt;micahg&amp;gt; kaushal: it’s in universe, so MOTU is responsible for packaging
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;micahg&amp;gt; kaushal: En Ubuntu, normalmente no tenemos mantenedores
&amp;lt;micahg&amp;gt; kaushal: esta en universe, asi que el equipo MOTU es responsable del mismo
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;slytherin&amp;gt; Rhonda: Is there any particular reason why you repackage upstream tarball as .tar.gz for wesnoth?
&amp;lt;Rhonda&amp;gt; Because source format 1.0 doesn’t support .tar.bz2?
&amp;lt;directhex&amp;gt; presumably for backportability
&amp;lt;directhex&amp;gt; that’s the usual reason to repack these days
&amp;lt;Rhonda&amp;gt; And the benefits of source format 3.0 are pretty minor when one is using quilt already
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;slytherin&amp;gt; Rhonda: hay alguna razon particular por la que hayas recomprimido el archivo tarball de upstream de wesnoth a un .tar.gz?
&amp;lt;Rhonda&amp;gt; porque un paquete fuente en formato 1.0 no soporta archivos .tar.bz2?
&amp;lt;directhex&amp;gt; probablemente para que sea capaz de mandarlo a versiones anteriores ([backports][48])
&amp;lt;directhex&amp;gt; esa es la razon mas frecuente para recomprimir
&amp;lt;Rhonda&amp;gt; eso y que las facilidades que pudiera darme un [formato 3.0][49] serian minimos si ya estoy usando quilt
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer_&amp;gt; geser: uh… im using the new source format … the one with debian/source/format
&amp;lt;shadeslayer&amp;gt; so no need to use the get-orig-source part?
&amp;lt;maxb&amp;gt; You can use source format 1.0 with an explicit debian/source/format – that doesn’t tell us anything 🙂
&amp;lt;shadeslayer&amp;gt; maxb: so what do i have to do for fomat v3 ?
&amp;lt;maxb&amp;gt; To enable use of it? Have a debian/source/format that contains “3.0 (quilt)” or “3.0 (native)”
&amp;lt;shadeslayer&amp;gt; maxb: thats what i have 😛
&amp;lt;maxb&amp;gt; Right, the point was just that “the one with debian/source/format” doesn’t actually say anything
&amp;lt;geser&amp;gt; shadeslayer: no need for get-orig-source in this case (see point 4 in
&amp;lt;http://wiki.debian.org/Projects/DebSrc3.0&amp;gt;)
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer_&amp;gt; geser: uh… estoy usando el nuevo formato … el que se usa con debian/source/format
&amp;lt;shadeslayer&amp;gt; asi que no necesito usar la parte de get-orig-source verdad?
&amp;lt;maxb&amp;gt; puedes usar el formato 1.0 con un archivo /debian/source/format explicito – eso no nos dice nada 🙂
&amp;lt;shadeslayer&amp;gt; maxb: umm, entonces que tengo que hacer para declararlo con el formato v3 ?
&amp;lt;maxb&amp;gt; para poder usarlo? debes tener un archivo /debian/source/format que contenga “3.0 (quilt)” o “3.0 (native)”
&amp;lt;shadeslayer&amp;gt; maxb: eso es lo que tengo 😛
&amp;lt;maxb&amp;gt; correcto, el punto era que si mencionas que tienes el formato que usa /debian/source/format no nos dices nada
&amp;lt;geser&amp;gt; shadeslayer: no hay necesidad de usar ‘get-orig-source‘ en este caso (ve el punto 4 en &amp;lt;http://wiki.debian.org/Projects/DebSrc3.0&amp;gt;)
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;carstenh&amp;gt; gubatron: lintian is very helpful to find errors in the package, after you made this dget some/url/whatever.dsc part work and build the package locally you should run lintian -I -E –pedantic *.changes to see packaging errors and warnings
&amp;lt;carstenh&amp;gt; (or without options to see the more major ones if the list is very long)
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;carstenh&amp;gt; gubatron: lintian es muy util para encontrar errores en los paquetes, despues de correrlo usa dget para descargar cualquier/url/descripcion.dsc y compilar el paquete localmente, ejecuta lintian con las opciones -I -E –pedantic *.changes para ver que errores/advertencias de avienta
&amp;lt;carstenh&amp;gt; (o sin ellas para ver las mas importantes en caso de que la lista sea muy larga)
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;Laney&amp;gt; the orig.tar.gz should be in the parent directory of the root of your packaging
&amp;lt;Laney&amp;gt; ie debian/../..
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;Laney&amp;gt; el paquete original (orig.tar.gz) deberia estar en el directorio superior de donde tienes el paquete descomprimido
&amp;lt;Laney&amp;gt; por ejemplo debian/../..
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;gastons&amp;gt; Is it possible to use optional dependencies in a control file?
&amp;lt;gastons&amp;gt; Depends: openjdk-6-jre / sun-java6-jre
&amp;lt;micahg&amp;gt; gastons: yes, give a read to the policy 7.1
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;gastons&amp;gt; es posible declarar dependencias opcionales en el archivo /debian/control?
&amp;lt;gastons&amp;gt; Depends: openjdk-6-jre / sun-java6-jre
&amp;lt;micahg&amp;gt; gastons: si, checate la seccion [7.1][50] de las [normas][51] (policy)
&lt;/pre&gt;

&lt;p&gt;13:09&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer&amp;gt; so no need to use the get-orig-source part? 13:09
&amp;lt;maxb&amp;gt; You can use source format 1.0 with an explicit debian/source/format – that doesn’t tell us anything 🙂 13:10
&amp;lt;shadeslayer&amp;gt; maxb: so what do i have to do for fomat v3 ? 13:13
&amp;lt;maxb&amp;gt; To enable use of it? Have a debian/source/format that contains “3.0 (quilt)” or “3.0 (native)” 13:17
&amp;lt;shadeslayer&amp;gt; maxb: thats what i have 😛 13:17
&amp;lt;maxb&amp;gt; Right, the point was just that “the one with debian/source/format” doesn’t actually say anything 13:21
&amp;lt;geser&amp;gt; shadeslayer: no need for get-orig-source in this case (see point 4 in &amp;lt;http://wiki.debian.org/Projects/DebSrc3.0&amp;gt;)
&lt;/pre&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/07/02/comentarios-aleatorios-2/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>links aleatorios, semana 21-26/junio - motu</title>
   <link href="https://javier.io/blog/es/2010/06/27/links-aleatorios-semana-21-26-junio.html"/>
   <published>2010-06-27T00:00:00+00:00</published>
   <updated>2010-06-27T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/06/27/links-aleatorios-semana-21-26-junio</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">links aleatorios, semana 21-26/junio - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/06/27/links-aleatorios-semana-21-26-junio.html">&lt;h2 id=&quot;links-aleatorios-semana-21-26junio---motu&quot;&gt;links aleatorios, semana 21-26/junio - motu&lt;/h2&gt;

&lt;h6 id=&quot;27-jun-2010&quot;&gt;27 Jun 2010&lt;/h6&gt;

&lt;p&gt;Al igual que los “comentarios aleatorios”, empezare a modo de reporte a
escribir sobre algunos de los blogs/wikis/manuales que vaya leyendo y la
impresion que me vayan dejando, probablemente todas esas impresiones no valgan
la pena tomar muy en serio, asi que deben tomarse con recelo.&lt;/p&gt;

&lt;p&gt;Aqui el primer reporte, que corresponde a la semana 21-26 de Junio del 2010.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://daniel.holba.ch/blog/?cat=15&quot;&gt;http://daniel.holba.ch/blog/?cat=15&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contiene una clase de FAQ no oficial. Altamente recomendable. Es una pena que
la ultima entrada sobre “Ask MOTU” haya sido hecho a finales del 2008.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/MOTU/Videos&quot;&gt;https://wiki.ubuntu.com/MOTU/Videos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contiene enlaces a varios videos, al parecer la idea esta abandonada, en
especial los tutoriales de “&lt;a href=&quot;http://www.youtube.com/watch?v=SLpoi5PlFP8&quot;&gt;Nicolas Valcárcel&lt;/a&gt;“, quien solo nos muestra
como preparar el entorno para empezar a empaquetar pero corta abruptamente la
serie, no quiero parecer tan desalmado para quejarme sobre ese hecho, pero
esos videos en Español hacen falta en la comunidad latinoamericana, aunque por
otra parte tambien pienso que cualquiera que quisiera estar interesado en
participar deberia ser capaz de comunicarse en Ingles, esto en la practica no
siempre es posible (incluyendome). Lo agrego en mi lista de que haceres.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuBugDay/BugsForExtraPoints&quot;&gt;https://wiki.ubuntu.com/UbuntuBugDay/BugsForExtraPoints&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El 24 de Junio fue un “&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuBugDay/&quot;&gt;UbuntuBugDay&lt;/a&gt;“, en ese dia se supone que se reunen
varios desarrolladores para concentrarse en arreglar muchos de los bugs
relacionados con un solo paquete. Me he pasado por #ubuntu-bugs para ofrecer
mi ayuda y aprender un poco mas del proceso al mismo tiempo, sin embargo no he
visto mucho movimiento asi que lo he dejado, ni modo, espero participar en el
siguiente Ubuntu bug day cuando (espero) tenga mayor experiencia. Me ha
parecido gracioso hasta morir el primer comentario que se encuentra en el
wiki, sobre el peor bug de Ubuntu, el &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+bug/1&quot;&gt;#1&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://lintian.debian.org/manual/&quot;&gt;http://lintian.debian.org/manual/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un mini manual (de 3 paginas) sobre lintian, un programa que sirve para
verificar que no haya errores al empaquetar paquetes fuente (.dsc) o binarios
(.deb). Despues de leer sobre la opcion -i, me he puesto a ver como estaban
los paquetes que hasta entonces habia descargado, jaja, ha sido un sin
sentido…&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ for paquete in `ls /var/cache/apt/archives/*.deb`;\
  do echo =======================; echo $paquete; \
  lintian -biv $paquete; echo; done|less
&lt;/pre&gt;

&lt;p&gt;Hasta entonces apenas habia notado la existencia de lintian (despues de correr
‘debuild’), pero ahora lo tengo un poco mas claro y eso me agrada :). Sin
embargo aun me ha quedado la duda de como verificar todos los paquetes desde
un directorio ($LINTIAN_DIST)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.xs4all.nl/~carlo17/howto/debian.html&quot;&gt;http://www.xs4all.nl/~carlo17/howto/debian.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.eyrie.org/~eagle/notes/debian/&quot;&gt;http://www.eyrie.org/~eagle/notes/debian/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El primer link son notas revueltas sobre el uso de dpkg, apt-file y un pequeño
how-to de parcheo de paquetes (incompleto desde mi punto de vista). El segundo
es un compendio mucho mas general de debian, aunque tiene partes especificas
de empaquetado y arreglo de errores (mucho mas completo).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+bug/596127&quot;&gt;https://bugs.launchpad.net/ubuntu/+bug/596127&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un curioso reporte al estilo del #1, una persona se queja de que los reportes
que manda no son respondidos y si lo son los errores no son corregidos, un
comportamiento mucho mas comun para el resto de usuarios mortales (como yo),
supongo.&lt;/p&gt;

&lt;p&gt;Desde mi punto de vista este es un reporte valido, creo que es una buena idea
que los miembros de los diferentes equipos que se encargan de marcar (triage)
los bugs pudieran irse rotando el papel de “working on it” (o trabajando en
el), en parte para recordarse a si mismos la existencia de estos errores y en
otra para mostrar a la comunidad la cantidad de esfuerzo y de gente
involucrada que hay en ubuntu. Me imagino un bonito log de 30 paginas o mas
llena de gente rotandose el bug :)’&lt;/p&gt;

&lt;p&gt;Tambien esta el otro pensamiento, este error no tiene una solucion practica,
es decir, no hay forma de que jamas Ubuntu pueda cerrar todos los errores que
tiene, esto porque esta limitado a nuestra naturaleza humana, propensa a
errores. Asi que estaria abierto por siempre, algo que podria ser frustante
para los que trabajan en la distribucion.&lt;/p&gt;

&lt;p&gt;Igual sigo creyendo que seria romantico tenerlo abierto, solo por si acaso 😉&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/06/27/links-aleatorios-1/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>“arregla un error en ubuntu”</title>
   <link href="https://javier.io/blog/es/2010/06/22/arregla-un-error-en-ubuntu.html"/>
   <published>2010-06-22T00:00:00+00:00</published>
   <updated>2010-06-22T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/06/22/arregla-un-error-en-ubuntu</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">“arregla un error en ubuntu”</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/06/22/arregla-un-error-en-ubuntu.html">&lt;h2 id=&quot;arregla-un-error-en-ubuntu&quot;&gt;“arregla un error en ubuntu”&lt;/h2&gt;

&lt;h6 id=&quot;22-jun-2010&quot;&gt;22 Jun 2010&lt;/h6&gt;

&lt;p&gt;Acabo de leer el “&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuWeeklyNewsletter/Issue198&quot;&gt;Ubuntu Weekly Newsletter&lt;/a&gt;#198″, que es como una
revista “digital” donde se tratan los temas mas recientes de los diferentes
equipos en Ubuntu, ya sea de desarrollo, seguridad, locos, mercadotecnia, etc.
(alguien deberia traducir esas revistas, realmente son muy buenas)&lt;/p&gt;

&lt;p&gt;Y en la primera pagina encontre un &lt;a href=&quot;http://daniel.holba.ch/blog/?p=691&amp;amp;cpage=1#comment-144022&quot;&gt;articulo&lt;/a&gt; muy interesante, dholbach un
miembro muy activo del equipo MOTU (es la persona que sale en los videos de
empaquetamiento basico que hay en &lt;a href=&quot;http://www.youtube.com/watch?v=4jzGIaZcGcM&quot;&gt;youtube&lt;/a&gt; –aqui, es el tipo al que
abrazan–) esta haciendo un experimento para que gente normal (como tu o yo)
intentemos arreglar un error aleatorio de ubuntu. Esto con la finalidad de ver
como se las arregla cada persona, que herramientas usa, que documentacion lee,
que preguntas se hace, donde se atora, y en general que sensacion le deja la
experiencia. Personalmente me ha gustado mucho la idea, asi que (incluso con
mi pesimo Ingles) me he volcado a su blog a dejar un comentario (2 intentos de
bug fixes creo que me hace perfecto candidato, jeje).&lt;/p&gt;

&lt;p&gt;Dejo la nota/traduccion:&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;We want to make it easy to get involved in Ubuntu on a broad basis, but also
make it easy to just go ahead and do something as a drive-by contribution.At
UDS we talked a lot about making it easy to just go and fix a bug that
bothers you. We did a couple of improvements to our documentation and some
other bits here and there.&lt;/p&gt;

  &lt;p&gt;What I now need is your feedback. It’d be super-sweet if you never just went
and fixed a bug in Ubuntu, you now just tried to do that. I don’t want to
give too many instructions, because I want to see how you go about finding
docs, which tools you use, what you do to make it happen, so the
instructions are thus:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;Wear your hardhat.&lt;/li&gt;
    &lt;li&gt;Remember an Ubuntu bug that bothered you or find one you’d like to work
on&lt;/li&gt;
    &lt;li&gt;Take notes. It’s important that you note down what exactly you tried to
do, what worked and what didn’t work. We want to fix the process harder and
make it super-smooth.&lt;/li&gt;
    &lt;li&gt;Add a comment to this blog entry or mail dholbach at ubuntu dot com with
your findings.&lt;/li&gt;
  &lt;/ul&gt;

&lt;/blockquote&gt;

&lt;blockquote&gt;

  &lt;p&gt;&lt;em&gt;Thanks a bunch in advance.&lt;/em&gt; This is an awesome opportunity for you to not
only fix a bug in Ubuntu, but also help fix the process involved.&lt;/p&gt;

  &lt;p&gt;I’ll report the findings in a couple of weeks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nos gustaria y queremos que sea facil contribuir a Ubuntu de una manera
continua, pero tambien que lo sea por casos especificos.&lt;/p&gt;

  &lt;p&gt;En la UDS (Ubuntu Developer Summit/Cumbre de desarrolladores de Ubuntu)
estuvimos hablando sobre la posibilidad de facilitar el proceso para las
personas que solo quieran ir y arreglar un bug que les molesta. Hicimos
algunas mejoras en la documentacion y en algunos otros lugares.&lt;/p&gt;

  &lt;p&gt;Ahora lo que queremos son sus comentarios. Seria super genial si nunca antes
hubieran arreglado un error y ahora lo intentaran. No me gustaria dar
demasiadas intrucciones, porque quiero ver como encuentran la documentacion,
que herramientas usan, como hacen el parche, etc. Siendo asi, las unicas
instrucciones que puedo darles son estas:&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;Preparense mentalmente.&lt;/li&gt;
    &lt;li&gt;Recuerden algun bug que les haya molestado o encuentren uno en el que
quisieran trabajar.&lt;/li&gt;
    &lt;li&gt;Tomen notas (al menos yo lo hago :P). Es importante que anoten
exactamente lo que han probado, lo que les ha funcionado y lo que no.
Queremos hacer del proceso algo simple para todo el mundo.&lt;/li&gt;
    &lt;li&gt;Comenten sus avances en este mismo blog a envien un email a dholbach at
ubuntu dot com sobre su experiencia.&lt;/li&gt;
  &lt;/ul&gt;

&lt;/blockquote&gt;

&lt;blockquote&gt;

  &lt;p&gt;&lt;em&gt;Muchas gracias de antemano.&lt;/em&gt; Esta es una grandiosa oportunidad no solo para
reparar un error en Ubuntu sino para mejorar el proceso en si.&lt;/p&gt;

  &lt;p&gt;Reportare las conclusiones en un par de semanas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;Y por supuesto que aqui comentare esas conclusiones una vez que salgan 🙂&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/06/22/arregla-un-error-en-ubuntu/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>parchando paquetes con quilt - motu</title>
   <link href="https://javier.io/blog/es/2010/06/20/parchando-paquetes-con-quilt.html"/>
   <published>2010-06-20T00:00:00+00:00</published>
   <updated>2010-06-20T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/06/20/parchando-paquetes-con-quilt</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">parchando paquetes con quilt - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/06/20/parchando-paquetes-con-quilt.html">&lt;h2 id=&quot;parchando-paquetes-con-quilt---motu&quot;&gt;parchando paquetes con quilt - motu&lt;/h2&gt;

&lt;h6 id=&quot;20-jun-2010&quot;&gt;20 Jun 2010&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Esta originalmente fue escrita en mi blog, la muevo aqui
porque esta mejor relacionada con la tematica de este blog.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introduccion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://software.schmorp.de/pkg/rxvt-unicode.html&quot;&gt;rxvt-unicode&lt;/a&gt; es una emulador de terminal ligero, lo mas sobresaliente es
su modo demonio, de esa forma se pueden lanzar muchas terminales sin consumir
demasiados recursos. En la ultima version de Ubuntu, viene con soporte para 88
colores, y un parche dentro del paquete de codigo fuente para obtener los 256
que son utiles para algunos programas como vim. Un reporte al respecto se
encuentra tanto en &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=493481&quot;&gt;Debian&lt;/a&gt; como en &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/rxvt-unicode/+bug/578129&quot;&gt;Ubuntu&lt;/a&gt;, &lt;a href=&quot;https://wiki.ubuntu.com/PackagingGuide/Howtos/Quilt&quot;&gt;quilt&lt;/a&gt; es una forma
de manejar parches, al igual que &lt;a href=&quot;https://wiki.ubuntu.com/PackagingGuide/Howtos/Dpatch&quot;&gt;dpatch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desarrollo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Al igual que en la entrada anterior, se crea una carpeta donde se aislara todo
el proceso y se descarga el codigo fuente junto con sus dependencias:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir rxvt; cd rxvt
$ apt-get source rxvt-unicode
$ sudo apt-get build-dep rxvt-unicode
$ cd rxvt-unicode-9.06/
$ less doc/urxvt-8.2-256color.patch
&lt;/pre&gt;

&lt;p&gt;Aqui mismo se puede observar los archivos que modifica, que son 4:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;– rxvt-unicode/configure.ac&lt;/p&gt;

  &lt;p&gt;– rxvt-unicode/src/feature.h&lt;/p&gt;

  &lt;p&gt;– rxvt-unicode/src/init.C&lt;/p&gt;

  &lt;p&gt;– rxvt-unicode/src/rxvt.h&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Antes de continuar hay que establecer la ruta donde quilt buscara los parches:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ export QUILT_PATCHES=debian/patches
&lt;/pre&gt;

&lt;p&gt;Por defecto, quilt buscara en /patches, es una buena idea agregar la variable
anterior a ~/.bashrc, despues de eso ya se pueden empezar a crear parches,
para hacerlo primero hay que dar de alta un parche, definir los archivos que
modificara, hacer los cambios y pedirle a quilt que genere el parche, para
este caso concreto:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$   quilt new urxvt-8.2-256color.patch
Patch urxvt-8.2-256color.patch is now on top
&lt;/pre&gt;

&lt;p&gt;Ahora se agregan los 4 archivos que se modificaran:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ quilt add configure.ac
File configure.ac added to patch  urxvt-8.2-256color.patch
$ quilt add src/feature.h
File src/feature.h added to patch  urxvt-8.2-256color.patch
$ quilt add src/init.C
File src/init.C added to patch  urxvt-8.2-256color.patch
$ quilt add src/rxvt.h
File src/rxvt.h added to patch  urxvt-8.2-256color.patch
&lt;/pre&gt;

&lt;p&gt;Ya se pueden modificar, sin embargo como en este caso (seguro hay muchos mas
casos similares) el parche ya esta hecho, solo lo aplicamos:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ patch -p1 &amp;lt; doc/urxvt-8.2-256color.patch
patching file configure.ac
Hunk #1  succeeded at 90 (offset -14 lines).
Hunk #2 succeeded at 125 (offset  -24 lines).
Hunk #3 succeeded at 154 (offset -27 lines).
...................
&lt;/pre&gt;

&lt;p&gt;Finalmente se hace que quilt genere el parche, que se guardara en
/debian/patches&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ quilt refresh
Refreshed patch urxvt-8.2-256color.patch
&lt;/pre&gt;

&lt;p&gt;El parche ya esta creado, puede verse con:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ less debian/patches/urxvt-8.2-256color.patch
&lt;/pre&gt;

&lt;p&gt;Ahora mismo el parche esta aplicado, para regresar el arbol a su estado
original, se usa ‘pop’:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ quilt pop -a
Removing  patch urxvt-8.2-256color.patch
Restoring src/init.C
Restoring  src/rxvt.h
Restoring src/feature.h
Restoring configure.ac
No patches applied
&lt;/pre&gt;

&lt;p&gt;La opcion -a, indica que se deben remover todos los parches, en este ejemplo
solo se tiene 1, asi que $ quilt pop hubiera dado el mismo resultado. Se puede
jugar un poco con quilt para acostumbrarse a el, si se ejecuta:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ quilt push
Applying patch urxvt-8.2-256color.patch
patching file  configure.ac
patching file src/feature.h
patching file  src/init.C
patching file src/rxvt.h
Now at patch  urxvt-8.2-256color.patch
&lt;/pre&gt;

&lt;p&gt;Se vuelve a parchar, para efectos de empaquetamiento, siempre se debe dejar en
el estado original, es decir hay que quitar todos los parches $ quilt pop -a&lt;/p&gt;

&lt;p&gt;El archivo debian/patches/series nos indica cuales y en que orden se aplican
las modificaciones, a proposito de parches, hay una aplicacion en ubuntu-dev-
tools que se llama ‘what-patch’, que si se ejecuta dentro de la carpeta
/debian o en su superior nos avisa que sistema de parches usa si es que
utiliza uno.&lt;/p&gt;

&lt;p&gt;Para integrar quilt al proceso de construccion, se creara un archivo en
debian/source/format con la cadena “3.0 (quilt)”, esto solo funciona en
versiones recientes de ubuntu (supongo que de debian tambien), &lt;a href=&quot;https://web.archive.org/web/20170910200600/http://pkg-perl.alioth.debian.org:80/howto/quilt.html&quot;&gt;metodos
alternativos&lt;/a&gt;.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir -pv debian/source
mkdir: created directory `debian/source&apos;
$  echo &quot;3.0 (quilt)&quot; &amp;gt; debian/source/format
&lt;/pre&gt;

&lt;p&gt;Y se agrega el archivo debian/README.source para informar que este paquete usa
quilt, el texto por defecto es:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat  debian/README.source
This  package uses quilt to manage all modifications to the upstream source.
Changes are stored in the source package as diffs in debian/patches and
applied during the build.
See  /usr/share/doc/quilt/README.source for a detailed explanation.
&lt;/pre&gt;

&lt;p&gt;Hasta ahi llega el manejo de quilt propiamente dicho, solo faltaria actualizar
el changelog y en este caso particular la edicion de los scripts postinst
(post-instalacion) y prerm (pre-remove) que actualizara &lt;a href=&quot;http://en.wikipedia.org/wiki/Terminfo&quot;&gt;terminfo,&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta vez he probado agregando ~chilicuil1,en lugar de $version_anterior+1,
quedando el paquete de esta forma:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;rxvt-unicode (9.06-3ubuntu1~chilicuil1) lucid; urgency=low&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;NOTA: Al parecer, hay que especificar la $version+1+nick# si se quiere crear
“una rama” personalizada, aun no entiendo muy claramente esto, lo anterior
queda:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;rxvt-unicode (9.06-3ubuntu2~chilicuil1) lucid; urgency=low&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finalmente se crea el diff, se crean los debs y se sube el codigo fuente a
lauchpad.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$  debuild -S; cd ..;
$ debdiff rxvt-unicode_9.06-3ubuntu1.dsc \
rxvt-unicode_9.06-3ubuntu2~chilicuil1.dsc\
 &amp;gt; rxvt-unicode_9.06-3ubuntu2~chilicuil1.debdiff
$ cd rxvt-unicode-9.06/; debuild -S  -sd; cd ..
$ dput ppa:chilicuil/pmx  \
rxvt-unicode_9.06-3ubuntu2~chilicuil1_source.changes
$ cd  rxvt-unicode-9.06/; debuild
&lt;/pre&gt;

&lt;p&gt;Me pregunto si abra una forma de crear los 3 con un solo comando…&lt;/p&gt;

&lt;p&gt;Se instala el paquete:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd  ..;
$ sudo dpkg -i \
rxvt-unicode_9.06-3ubuntu2~chilicuil2_i386.deb
&lt;/pre&gt;

&lt;p&gt;Referencias:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.miriamruiz.es/weblog/?p=134&quot;&gt;http://www.miriamruiz.es/weblog/?p=134&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Bugs/HowToFix&quot;&gt;https://wiki.ubuntu.com/Bugs/HowToFix&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20170910200600/http://pkg-perl.alioth.debian.org:80/howto/quilt.html&quot;&gt;https://web.archive.org/web/20170910200600/http://pkg-perl.alioth.debian.org:80/howto/quilt.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://scie.nti.st/2008/10/13/get-rxvt-unicode-with-256-color-support-on-ubunut&quot;&gt;http://scie.nti.st/2008/10/13/get-rxvt-unicode-with-256-color-support-on-ubunut&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/06/20/parchando-paquetes-con-quilt/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>parchando paquetes con debdiff - motu</title>
   <link href="https://javier.io/blog/es/2010/06/20/parchando-paquetes-con-debdiff.html"/>
   <published>2010-06-20T00:00:00+00:00</published>
   <updated>2010-06-20T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/06/20/parchando-paquetes-con-debdiff</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">parchando paquetes con debdiff - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/06/20/parchando-paquetes-con-debdiff.html">&lt;h2 id=&quot;parchando-paquetes-con-debdiff---motu&quot;&gt;parchando paquetes con debdiff - motu&lt;/h2&gt;

&lt;h6 id=&quot;20-jun-2010&quot;&gt;20 Jun 2010&lt;/h6&gt;

&lt;p&gt;&lt;em&gt;Esta y la siguiente entrada originalmente fueron escritos en
miblog, los muevo aqui porque estan mejor relacionados con la tematica
de este blog.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introduccion.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En la ultima version de Ubuntu existe un error en &lt;a href=&quot;http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki&quot;&gt;mpd&lt;/a&gt; que hace que se
detenga al reproducir archivos mp4a, el bug en cuestion esta documentado en
varios &lt;a href=&quot;http://us.generation-nt.com/answer/bug-556198-mpd-segfault-when-trying-play-m4a-aac-lc-file-help-168868501.html?page=2&quot;&gt;sitios&lt;/a&gt;, el &lt;a href=&quot;http://tinyurl.com/2d2usxt&quot;&gt;parche&lt;/a&gt; tambien esta disponible e integrado en la
ultima version de upstream (upstream es como se llama al proyecto original,
Debian es el upstream de Ubuntu y Ubuntu es el downstream de Debian), asi el
upstream del paquete mpd puede ser el paquete en Debian si se habla del
paquete o el sitio donde se desarrolla mpd si se habla del programa.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; tambien alberga el error
(&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/mpd/+bug/519787&quot;&gt;https://bugs.launchpad.net/ubuntu/+source/mpd/+bug/519787&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desarrollo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se puede empezar creando una carpeta para el paquete en cuestion (apt-get
source descargara mas de 3 paquetes desde el lugar donde se invoque).
Personalmente he creado una carpeta en ~/misc/packages/ubuntu-10.04 y luego un
alias ‘ubuntu’ que me ubica en el directorio independientemente de donde este.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir mpd; cd mpd #se crea un directorio  para aislar todo
$ sudo apt-get install devscripts ubuntu-dev-tools  cdbs quilt
$ sudo  apt-get source mpd
&lt;/pre&gt;

&lt;p&gt;Descarga el codigo fuente de mpd &lt;em&gt;debianizado&lt;/em&gt; (esto es, con diffs y archivos
de control/rules/patches/etc)&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo  apt-get build-dep mpd
&lt;/pre&gt;

&lt;p&gt;Descarga las dependencias del paquete para comprobar que funcione despues de
hacer cualquier cambio&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cd  mpd-0.15.4; vim src/algun_archivo.fuente
&lt;/pre&gt;

&lt;p&gt;Y en este punto se modifica el codigo, para este caso particular tuve que
hacerlo a mano porque el parche no funcionaba al 100%, pero para otros casos o
solo se editan detalles, como cambio de directorios/variables o se aplica el
respectivo parche, espero comentar en mi siguiente entrada como hacerlo con
&lt;a href=&quot;https://web.archive.org/web/20260802205332/http://savannah.nongnu.org/projects/quilt&quot;&gt;quilt&lt;/a&gt; , un metodo un poco más elegante. Es indispensable que se tenga
una idea clara de como funciona patch y diff
(&lt;a href=&quot;https://web.archive.org/web/20240809185331/http://www.gnu.org/software/diffutils/manual/diff.html&quot;&gt;https://web.archive.org/web/20240809185331/http://www.gnu.org/software/diffutils/manual/diff.html&lt;/a&gt;), otra guia un poco
mas digerible esta en: (&lt;a href=&quot;http://andalinux.wordpress.com/2009/08/24/crear-y-aplicar-parches-patches-en-linux/&quot;&gt;http://andalinux.wordpress.com/2009/08/24/crear-y-aplicar-parches-patches-en-linux/&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Una vez editado se actualiza debian/changelog:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ dch  -i
&lt;/pre&gt;

&lt;p&gt;La ventaja de editarlo con dch es que agrega automaticamente la version del
paquete y tambien el email y la hora en el formato adecuado. La modificación
al changelog se hace dependiendo de como se vea el resto, tratando de mantener
el estilo. Si esta es la primera entrada, el estilo bien podria ser (para este
caso particular):&lt;/p&gt;

&lt;p&gt;&lt;em&gt;mpd (0.15.4-1ubuntu4) lucid; urgency=low&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;* Apply patch from upstream to fix LP: #519787&lt;br /&gt;
– usr/decoder/ffmpeg_plugin.c (Debian bug #556198)&lt;br /&gt;
ffmpeg: align the output buffer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— chilicuil &lt;a href=&quot;mailto:chilicuil@i.am&quot;&gt;chilicuil@i.am&lt;/a&gt; Mon, 17 May 2010 08:14:46 -0500&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Con estilo me refiero a la forma en la que se introducen los comentarios, el
esqueleto por decirlo de alguna forma &lt;strong&gt;siempre&lt;/strong&gt; debe ser como se muestra:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;paquete - &amp;gt; version del paquete -&amp;gt; version de la distribucion -&amp;gt; urgencia&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;descripcion muy breve de los errores que cierra, o caracteristicas que
integra&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;descripcion mas extensa, describiendo cada uno de los archivos que se
modificaron y que se hizo en cada caso, tambien se vale mencionar errores de
otros bugtracks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;La version del paquete tambien tiene algunas consideraciones, como regla
general, si el paquete ya existia en Ubuntu (lo mas probable, al hablar de
parches), es decir, si termina en ubuntu&lt;strong&gt;X&lt;/strong&gt; , donde &lt;strong&gt;X&lt;/strong&gt; es un numero, se
le suma +1, esto ara que apt-get prefiera este paquete sobre el original.
Tambien se puede cambiar por algo como ubuntu&lt;strong&gt;X&lt;/strong&gt; ~usuario&lt;strong&gt;X,&lt;/strong&gt; para indicar
que es un paquete personal. Cualquiera de las 2 es valida, mas tarde espero
que alguien me aclare cuando usar una en lugar de la otra, que yo tampoco lo
tengo muy claro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OPCIONAL:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No hay que olvidar modificar debian/control si el paquete aun no tiene
mantenedor en Ubuntu, en ese caso se debe cambiar:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Maintainer: Original developer &lt;a href=&quot;mailto:dev@debian.org&quot;&gt;dev@debian.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;por:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Maintainer: Ubuntu Developers &lt;a href=&quot;mailto:ubuntu-devel-discuss@lists.ubuntu.com&quot;&gt;ubuntu-devel-discuss@lists.ubuntu.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;XSBC-Originial-Maintainer: Original developer &lt;a href=&quot;mailto:dev@debian.org&quot;&gt;dev@debian.org&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eso es todo a partir de aqui se pueden hacer 3 cosas (hasta donde se).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Se puede crear un paquete con el codigo (con las instrucciones necesarias para compilarlo) y con el que se aran los debdiff (el formato estandar que se maneja en launchpad para enviar parches).&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$  debuild -S; cd .. ; debdiff mpd_0.15.4-1ubuntu3.dsc  \
mpd_0.15.4-1ubuntu4.dsc &amp;gt; mpd_0.15.4-1ubuntu4.debdiff
&lt;/pre&gt;

&lt;p&gt;El ultimo es el que se envia&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Se puede generar un archivo con los cambios e instrucciones para compilar, que se puede subir a launchpad para crear un &lt;a href=&quot;https://help.launchpad.net/Packaging/PPA&quot;&gt;ppa&lt;/a&gt; (repositorio personal) que distribuya los *.deb&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$  debuild -S -sd #si el paquete ya existia \
en ubuntu, o con -sa si  no existe aun
$ cd ..; dput ppa:chilicuil/pmx  mpd_0.15.4-1ubuntu4.source.changes
&lt;/pre&gt;

&lt;p&gt;Esto empujara los cambios a launchpad –en codigo fuente, se compilaran los
debs finales en la nube&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;O se pueden crear los *.deb en local para su instalación inmediata.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$  debuild
&lt;/pre&gt;

&lt;p&gt;En cuyo caso el *deb aparecera en el directorio superior ($ cd ..), los 3
comandos anteriores firmaran los paquetes con la clave de &lt;strong&gt;$DEBEMAIL&lt;/strong&gt; , si
no se desea asi, se tienen que especificar las opciones -us -uc&lt;/p&gt;

&lt;p&gt;Al terminar y si no se quiere conservar el paquete, se elimina exceptuando
mpd_0.15.4-1ubuntu4.debdiff, para recuperar el entorno o para probar que el
parche se aplica sin errores se usa esto:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ mkdir mpd_nuevo; cd mpd_nuevo
$ sudo  apt-get source mpd; cp ~/mpd/mpd_0.15.4-1ubuntu4.diff  \
~/mpd_nuevo/
$ cd   mpd-0.15.4/
&lt;/pre&gt;

&lt;p&gt;Cuando se hace apt-get source el paquete es descomprimido, este es el
‘original’ (no es 100% original, puesto que ya esta debianizado)&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ patch -p1 &amp;lt; ../mpd_0.15.4-1ubuntu4.debdiff
&lt;/pre&gt;

&lt;p&gt;El resultado deberia poder volver a general los 3 paquetes descritos con
anterioridad.&lt;/p&gt;

&lt;p&gt;Los parches se pueden integrar a los reportes de launchpad:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;====Resumiendo===&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Se decarga desde apt-get source el paquete y sus dependencias&lt;/li&gt;
  &lt;li&gt;Se modifica el codigo, reglas, changelog&lt;/li&gt;
  &lt;li&gt;Se crea un paquete fuente y de ahi un parche, o un paquete fuente para subirse a launchpad, o se compila el binario. Claro que tambien se pueden hacer las 3 si se desea.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Referencias:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wiki.ubuntu.com/Bugs/HowToFix&quot;&gt;https://wiki.ubuntu.com/Bugs/HowToFix&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=SAxFpKBG-bU&amp;amp;feature=channel&quot;&gt;http://www.youtube.com/watch?v=SAxFpKBG-bU&amp;amp;feature=channel&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.bodhizazen.net/linux/launchpad-ppa-tips/&quot;&gt;http://blog.bodhizazen.net/linux/launchpad-ppa-tips/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://ubuntuforums.org/showthread.php?s=1e88fa1ad823decb139b63258360baeb&amp;amp;t=929498&quot;&gt;http://ubuntuforums.org/showthread.php?s=1e88fa1ad823decb139b63258360baeb&amp;amp;t=929498&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/06/20/parchando-paquetes-con-debdiff/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>comentarios aleatorios, semana 13-19/junio - motu</title>
   <link href="https://javier.io/blog/es/2010/06/20/comentarios-aleatorios-semana-13-19-junio.html"/>
   <published>2010-06-20T00:00:00+00:00</published>
   <updated>2010-06-20T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/06/20/comentarios-aleatorios-semana-13-19-junio</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">comentarios aleatorios, semana 13-19/junio - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/06/20/comentarios-aleatorios-semana-13-19-junio.html">&lt;h2 id=&quot;comentarios-aleatorios-semana-13-19junio---motu&quot;&gt;comentarios aleatorios, semana 13-19/junio - motu&lt;/h2&gt;

&lt;h6 id=&quot;20-jun-2010&quot;&gt;20 Jun 2010&lt;/h6&gt;

&lt;p&gt;En adicion de las entradas que pudiera escribir, intentare subir cada semana
comentarios que vaya encontrando tanto en los canales (#ubuntu-bugs, #ubuntu-
motu, etc) como en las listas (&lt;a href=&quot;https://lists.ubuntu.com/#Development+Lists&quot;&gt;https://lists.ubuntu.com/#Development+Lists&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Aqui la primera entrega, que corresponde a la semana del 13 al 19 de Junio del
2010.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;geser&amp;gt; build a deb mostly involves: installing the build- dependencies, apply patches if needed, build using the upstream Makefile, install using the upstream Makefile into a stage directory, build the debs from that staging directory
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;geser&amp;gt; crear un paquete deb basicamente implica: instalar las dependencias, aplicar parches segun se requieran, compilar usando el archivo Makefile que viene con el codigo, instalar usando el mismo archivo Makefile dentro de un directorio de pruebas. Crear el paquete deb a partir de ese directorio.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dupondje&amp;gt; How can I request a new package into universe? An update of another package is now depending on libopensync-plugin-vformat, but thats not in universe yet…&amp;lt;tumbleweed&amp;gt; dupondje: before debian import freeze, it should come in by itself, afterwards, a sync request works
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dupondje&amp;gt; Como puedo hacer que un nuevo paquete entre en universe (repositorio)? La actualizacion de un paquete depende de libopensync-plugin-vformat, pero libopensync-plugin-vformat aun no esta en universe…&amp;lt;tumbleweed&amp;gt; dupondje: antes del [DIF][6] (debian import freeze), el paquete deberia sincronizarse automaticamente, despues de ello, una [peticion][7] para sincronizarlo deberia funcionar
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt; Abut FTBFS testing&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;xteejx&amp;gt; Does it matter that I’m using Lucid?
&amp;lt;Laney&amp;gt; You’ll at least want a maverick chroot, and maybe a VM depending on what you’re up to
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt; Sobre testeo de __&lt;a href=&quot;https://wiki.ubuntu.com/UbuntuWeeklyNewsletter/glossary&quot;&gt;FTBFS&lt;/a&gt; (Fails To Build From Source –Paquetes que fallan al compilarse desde el codigo fuente)&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;xteejx&amp;gt; Importa si uso Lucid?
&amp;lt;Laney&amp;gt; Necesitaras al menos un chroot con maverick, y probablemente una maquina virtual dependiendo en lo que estes trabajando
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;ari-tczew&amp;gt; I’m pissed due to outdated packages.ubuntu.com
&amp;lt;Laney&amp;gt; I never use that
&amp;lt;Laney&amp;gt; lp/ubuntu/+source/package is always up to date debdiffs aren’t wrong, but bazaar is like a fashion, modern system for patches
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;ari-tczew&amp;gt; Estoy molesto porque los paquetes de packages.ubuntu.com estan desactualizados
&amp;lt;Laney&amp;gt; Yo nunca uso eso
&amp;lt;Laney&amp;gt; lp/ubuntu/+source/paquete siempre esta en la ultima version, los debdiffs no estan mal, pero bazaar esta de moda, un sistema moderno para manejar los parches.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer&amp;gt; are there any packaging jobs that i can look at to contribute to MOTU and eventually become one myself?
&amp;lt;micahg&amp;gt; shadeslayer: merges?
&amp;lt;shadeslayer&amp;gt; geser: where do i upload a package once i work upon it?
&amp;lt;geser&amp;gt; shadeslayer: file a bug, attach the debdiff, and subscribe the ubuntu-sponsors team
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer&amp;gt; hay algo relacionado con empaquetamiento que pueda hacer para contribuir con la comunidad y eventualmente convertirme en un MOTU?
&amp;lt;micahg&amp;gt; shadeslayer: [merges][9] (fusiones)?
&amp;lt;shadeslayer&amp;gt; geser: donde subo los paquetes una vez que haya trabajado en ellos?
&amp;lt;geser&amp;gt; shadeslayer: reporta un bug, adjunta el debdiff, y suscribe al equipo ubuntu-sponsors
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;trombonechamp_&amp;gt; How would one go about getting included in the ubuntu repos?
&amp;lt;funkyHat&amp;gt; trombonechamp_: the ideal way to go about it would be to get included in Debian’s repos, then the package will be automatically synced into Ubuntu in the next (or current) development cycle
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;trombonechamp_&amp;gt; Como podria uno incluir paquetes en los repositorios de ubuntu?
&amp;lt;funkyHat&amp;gt; trombonechamp_: la forma ideal seria que incluyeras tus paquetes en los repositorios de Debian (mentors.debian.net) y luego que los paquetes se sincronizaran automaticamente en la siguiente (o en esta misma) version de ubuntu
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;BlackZ&amp;gt; when I do a merge should I do the debdiff between the old ubuntu modified package and the new one modified, right?
&amp;lt;geser&amp;gt; BlackZ: between “new” Debian and “merged” Ubuntu
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;BlackZ&amp;gt; cuando hago un merge, deberia hacer el debdiff entre el paquete anterior de ubuntu y el nuevo, verdad?
&amp;lt;geser&amp;gt; BlackZ: es entre el nuevo paquete de Debian y el que haz combinado (merged) en Ubuntu
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dupondje&amp;gt; somebody knows if there is a way to build packages remotely ?
&amp;lt;dupondje&amp;gt; want to build maverick packages on my remote debian system 🙂
&amp;lt;micahg&amp;gt; dupondje: pbuilder?
&amp;lt;dupondje&amp;gt; but is there some easy way ? like pbuilder interacts remotely ?
&amp;lt;dupondje&amp;gt; or really need to ssh and do pbuilder remote ?
&amp;lt;pochu&amp;gt; dupondje: you can set up a build farm. DktrKranz wrote something for that, can’t remember its name though
&amp;lt;DktrKranz&amp;gt; dupondje, pochu: something like that is called debomatic
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;dupondje&amp;gt; alguien sabe si hay alguna forma de crear paquetes remotamente?
&amp;lt;dupondje&amp;gt; quiero compilar algunos paquetes para maverick en un sistema remoto que corre debian 🙂
&amp;lt;micahg&amp;gt; dupondje: pbuilder?
&amp;lt;dupondje&amp;gt; no hay una forma mas facil? por ejemplo hacer que pbuilder funcione remotamente?
&amp;lt;dupondje&amp;gt; o realmente necesito logearme via ssh y correr pbuilder?
&amp;lt;pochu&amp;gt; dupondje: puedes crear una granja. DktrKranz escribio algo al respecto, aunque ahora mismo no recuerdo el nombre
&amp;lt;DktrKranz&amp;gt; dupondje, pochu: hay una aplicacion llamada [debomatic][10] que puede hacer eso
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;jariq&amp;gt; I am not sure what to do then there is new upstream release available. Should I create new orig.tar.gz file and start with clean changelog ???
&amp;lt;BlackZ&amp;gt; jariq: nope, just add a new changelog entry, and yes, you need a new .orig.tar.gz for the new upstream release
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;jariq&amp;gt; No estoy seguro de lo que tengo que hacer cuando haya una nueva version en upstream (la pagina del proyecto original). Debo crear un nuevo archivo orig.tar.gz y empezar otro changelog ???
&amp;lt;BlackZ&amp;gt; jariq: no, solo agrega otra entrada en el changelog, por otro lado, si tendras que utilizar el nuevo archivo .orig.tar.gz de upstream
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;xteejx&amp;gt; Would source that builds/compiles with “./configure make make install” be easier to package than something that hasn’t got these, or are these scripts easy enough to make that it doesn’t make any difference?
&amp;lt;cpscotti&amp;gt; afaikm, if you use the standard (./conf, make , make install ) everything will get better for you
&amp;lt;cpscotti&amp;gt; (unless your app is in python or the like)
&amp;lt;xteejx&amp;gt; well I’m not a dev so I’d be picking an easy-ish one to package for my 1st time 🙂
&amp;lt;Laney&amp;gt; I advise you not to start with packaging new software
&amp;lt;xteejx&amp;gt; really? why?
&amp;lt;Laney&amp;gt; both because it’s very difficult and because it tends to lead to unmaintained packages in the archive
&amp;lt;Laney&amp;gt; it’s a better idea to get to grips with how stuff works by fixing existing bugs. And we have enough of those to work on
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-motu:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;xteejx&amp;gt; Los programas que usan “./configure make make install” son mas faciles de empaquetar que aquellos no lo usan?, o no hay mucha diferencia?
&amp;lt;cpscotti&amp;gt; hasta donde se, si usan la forma estandar (./conf, make , make install ) todo deberia ser mas facil para ti.
&amp;lt;cpscotti&amp;gt; (a menos que tu aplicacion este escrita en python o lenguajes similares)
&amp;lt;xteejx&amp;gt; bueno, no soy programador, asi que creo que escogere uno facil para iniciarme 🙂
&amp;lt;Laney&amp;gt; No te recomiendo que empieces empaquetando nuevos programas
&amp;lt;xteejx&amp;gt; no?, porque?
&amp;lt;Laney&amp;gt; umm, porque es dificil y tiende a crear paquetes que despues no son mantenidos en el archivo (el lugar donde estan los repositorios)
&amp;lt;Laney&amp;gt; es mejor, si quieres familiarizarte, que empiezas corrigiendo bugs. De esos tenemos muchos en los que podrias trabajar.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;charlie-tca&amp;gt; Bugs marked confirmed mean someone else also has it, or there is enough information to determine it is indeed a bug. there may not be a known workaround for it, though.
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;charlie-tca&amp;gt; Los bugs marcados como ‘confirmados’ quieren decir que alguien mas los tiene o que hay suficiente informacion para determinar que realmente es un bug, eso no significa que exista una forma de arreglarlo todavia.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;somethinginteres&amp;gt; hi all, some n00b questions: I am wondering if there’s a place I can go to explain the basics of launchpad? What each status of a bug means what ‘branch exists’ means etc. Also, when a patch is submitted for a reported bug how does that fix get to me? Will ubuntu find patches and send them out in the upgrade manager?
&amp;lt;micahg&amp;gt; somethinginteres: help.launchpad.net
&amp;lt;micahg&amp;gt; somethinginteres: patches are reviewed and applied when appropriate
&amp;lt;micahg&amp;gt; somethinginteres: patches normally go through -proposed and then to -updates if they test fine
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-bugs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;somethinginteres&amp;gt; hola a todos, algunas preguntas de novato: Me pregunto si hay algun lugar donde pueda encontrar como aprender a usar launchpad? Que significa cada etiqueta de estado de los bugs, y lo que significa que exista un ‘branch’ etc. Tambien me gustaria saber que pasa cuando un parche se adjunta a un reporte como llega ese parche a mi?, ubuntu encuentra esos parches y me los envia a traves del gestor de actualizaciones?
&amp;lt;micahg&amp;gt; somethinginteres: [help.launchpad.net][11]
&amp;lt;micahg&amp;gt; somethinginteres: los parches se revisan y se aplican cuando no contienen errores
&amp;lt;micahg&amp;gt; somethinginteres: luego normalmente se suben a -proposed y de ahi a -updates si funcionan correctamente
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt; &lt;BlackZ&gt;e.g. 6 months are enough for become a MOTU, if you
have demostrated your skills&lt;/BlackZ&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;BlackZ&amp;gt; (merge, packaging work, bug fix …)
&lt;/pre&gt;

&lt;p&gt;_&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt; &lt;BlackZ&gt;por ejemplo, 6 meses son suficientes para
convertirse en un MOTU, si has demostrado suficientementes habilidades&amp;lt;
BlackZ&amp;gt; (combinando, empaquetando, corrigiendo errores …)_&lt;/BlackZ&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;ogra&amp;gt; you have to either be MOTU or a delegated team developer before applying for core-dev
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;ogra&amp;gt; tienes que convertirte ya sea en un MOTU o en un delegado de un equipo de desarrollo antes de aplicar para ser miembro del equipo [core-dev][12]
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;BlackZ&amp;gt; netshine: if you join the MOTU team you will be an ubuntu member too
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;BlackZ&amp;gt; netshine: si te unes al equipo MOTU entonces tambien seras un miembro de ubuntu (y tendras uno de esos aliases @ubuntu.com :)’
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;nzmm&amp;gt; whats the ‘official’ way to upgrade to a dev version?
&amp;lt;nzmm&amp;gt; upgrade-manager -d?
&amp;lt;zyga&amp;gt; nzmm, yes
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;nzmm&amp;gt; cual es la manera ‘oficial’ de actualizar el sistema a la version en desarrollo?
&amp;lt;nzmm&amp;gt; upgrade-manager -d?
&amp;lt;zyga&amp;gt; nzmm, sip
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;javanix&amp;gt; hey everyone, who should i talk to (and where do i find them) if i want to help out with development?
&amp;lt;blueyed_&amp;gt; javanix: join #ubuntu-motu and look at wiki.ubuntu.com for starters – try also googling for “ubuntu development”. Also, there are bugs tagged “bitesize” on launchpad.net/ubuntu.
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-devel:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;javanix&amp;gt; hola gente, a quien le deberia preguntar (y donde podria encontrar a las personas adecuadas) si quisiera ayudar con el desarrollo de ubuntu?
&amp;lt;blueyed_&amp;gt; javanix: entra a #ubuntu-motu y hechale un ojo a [wiki.ubuntu.com][13] en la parte de principiantes – prueba buscando en google por “[ubuntu development][14]“. y, checa los bugs que tienen la etiqueta “bitesize” en [launchpad.net/ubuntu][15].
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;nigelb&amp;gt; having a pbuilder is not must for having the code.
&amp;lt;nigelb&amp;gt; you can always push to a ppa instead of using pbuilder
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;nigelb&amp;gt; usar pbuilder no siempre es necesario
&amp;lt;nigelb&amp;gt; tambien puedes mandar tus cambios a tu [ppa][16] en su lugar
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;svaksha&amp;gt; so wget &amp;lt;lp branch link&amp;gt; should get me the branch
&amp;lt;nigelb&amp;gt; no
&amp;lt;nigelb&amp;gt; svaksha: bzr branch should get you the branch
&amp;lt;geser&amp;gt; svaksha: using wget is like downloading the same file with your browser (e.g. firefox)
&amp;lt;geser&amp;gt; it has nothing to do with “branching” in the context of a version control system (like e.g. bzr)
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;svaksha&amp;gt; umm, asi que wget &amp;lt;liga del branch en lp (launchpad)&amp;gt; deberia descargar el branch?
&amp;lt;nigelb&amp;gt; no
&amp;lt;nigelb&amp;gt; svaksha: bzr branch deberia hacerlo
&amp;lt;geser&amp;gt; svaksha: usar wget seria como descargarlo desde tu navegador (por ejemplo firefox)
&amp;lt;geser&amp;gt; no tiene nada que ver con el concepto de “branching” en el contexto de un sistema de control de versiones (como bzr –bazaar–)
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;YoJack&amp;gt; Any good links for creating a debian package ?
&amp;lt;nigelb&amp;gt; &amp;lt;https://wiki.ubuntu.com/PackagingGuide/Complete&amp;gt;
&amp;lt;nigelb&amp;gt; Also, &amp;lt;http://www.debian.org/doc/maint-guide/&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;YoJack&amp;gt; Alguien sabe de algunas ligas donde expliquen como crear paquetes .deb?
&amp;lt;nigelb&amp;gt; &amp;lt;https://wiki.ubuntu.com/PackagingGuide/Complete&amp;gt;
&amp;lt;nigelb&amp;gt; Tambien puedes ver, &amp;lt;http://www.debian.org/doc/maint-guide/&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer&amp;gt; backports are : packages uploaded to maverick and ‘ backported ‘ to lucid
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer&amp;gt; los backports son : paquetes que son subidos a maverick y de ahi exportados a lucid o a una version anterior
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer&amp;gt; micahg: does motu have all their packaging stuff in bzr ?
&amp;lt;micahg&amp;gt; shadeslayer: well, everything in the archive is in bzr
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer&amp;gt; micahg: los integrantes del equipo MOTU tienen todos sus paquetes en bzr?
&amp;lt;micahg&amp;gt; shadeslayer: bueno, todo lo que esta en el archivo esta en bzr
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt; About how ppa works&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;shadeslayer&amp;gt; you upload your sources and packaging stuff to servers where the packages get built and published 😛
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-packaging:&lt;/strong&gt; Sobre como funcionan los repositorios ppa &amp;lt;
shadeslayer&amp;gt; subes tu archivo fuente (.dsc) a los &lt;a href=&quot;https://edge.launchpad.net/builders&quot;&gt;servidores&lt;/a&gt; y ellos se
encargan de compilarlo y publicarlo 😛&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#ubuntu-classroom:&lt;/strong&gt; About how patche management should work&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;@dholbach&amp;gt;  in an ideal world, it’d work like this:
&amp;lt;@dholbach&amp;gt;  – we get a patch in ubuntu
&amp;lt;@dholbach&amp;gt;  – we send it to the software authors of that piece of software (upstream)
&amp;lt;@dholbach&amp;gt;  – they like it
&amp;lt;@dholbach&amp;gt;  – it gets integrated
&amp;lt;@dholbach&amp;gt;  – the new release makes it into debian
&amp;lt;@dholbach&amp;gt;  – then we get it
&amp;lt;@dholbach&amp;gt;  sometimes you’ll find that it’s a patch that has only to do with packaging 07:20
&amp;lt;@dholbach&amp;gt;  in that case and if the package is in debian too, you’d just send it to debian 07:21
&amp;lt;@dholbach&amp;gt;  if the package is just in ubuntu, we need to integrate it ourselves
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;#ubuntu-classroom:&lt;/strong&gt; Sobre como deberia funcionar el manejo de parches&lt;/em&gt;&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
&amp;lt;@dholbach&amp;gt;  en un mundo ideal, funcionaria de esta manera:
&amp;lt;@dholbach&amp;gt;  – obtenemos un parche en ubuntu
&amp;lt;@dholbach&amp;gt;  – lo mandamos a los autores del software (upstream)
&amp;lt;@dholbach&amp;gt;  – les gusta
&amp;lt;@dholbach&amp;gt;  – lo integran
&amp;lt;@dholbach&amp;gt;  – la nueva version aparece en debian
&amp;lt;@dholbach&amp;gt;  – entonces lo copiamos de ahi
&amp;lt;@dholbach&amp;gt;  algunas veces veran que el parche solo se aplica a un defecto en el paquete
&amp;lt;@dholbach&amp;gt;  en ese caso y si el paquete tambien esta en debian, se manda el parche ahi
&amp;lt;@dholbach&amp;gt;  si el paquete solo esta en ubuntu, entonces nosotros mismos lo integramos
&lt;/pre&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/06/20/comentarios-aleatorios-1/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>i3</title>
   <link href="https://javier.io/blog/en/2010/06/16/i3.html"/>
   <published>2010-06-16T00:00:00+00:00</published>
   <updated>2010-06-16T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/06/16/i3</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   
   
   <summary type="html">i3</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/06/16/i3.html">&lt;h2 id=&quot;i3&quot;&gt;i3&lt;/h2&gt;

&lt;h6 id=&quot;16-jun-2010&quot;&gt;16 Jun 2010&lt;/h6&gt;

&lt;p&gt;I’ve been using &lt;a href=&quot;http://i3wm.org&quot;&gt;i3-wm&lt;/a&gt; for a year, it’s fast, configurable and l33t, so I don’t have intentions to change it. Nevertheless I decided to grab a more recent version (&amp;lt; 4), add some &lt;a href=&quot;http://i3wm.org&quot;&gt;patches&lt;/a&gt; and freeze it. This version is intend to be used in all supported Ubuntu LTS versions. Feel free to install it as well.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo add-apt-repository ppa:minos-archive/main
$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install i3-wm
&lt;/pre&gt;

&lt;p&gt;For completion, this is the &lt;a href=&quot;https://github.com/javier-lopez/dotfiles/blob/master/.i3/config.4&quot;&gt;~/.i3/config&lt;/a&gt; configuration file I use and how it looks&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/assets/img/minos-movie.png&quot;&gt;&lt;img src=&quot;/assets/img/minos-movie.png&quot; alt=&quot;minos movie&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy tiling 😊&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>primer paso, configurar el entorno - motu</title>
   <link href="https://javier.io/blog/es/2010/06/15/primer-paso-configurar-el-entorno.html"/>
   <published>2010-06-15T18:07:44+00:00</published>
   <updated>2010-06-15T18:07:44+00:00</updated>
   <id>https://javier.io/blog/es/2010/06/15/primer-paso-configurar-el-entorno</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">primer paso, configurar el entorno - motu</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/06/15/primer-paso-configurar-el-entorno.html">&lt;h2 id=&quot;primer-paso-configurar-el-entorno---motu&quot;&gt;primer paso, configurar el entorno - motu&lt;/h2&gt;

&lt;h6 id=&quot;15-jun-2010&quot;&gt;15 Jun 2010&lt;/h6&gt;

&lt;blockquote&gt;
  &lt;p&gt;Este es un pequeño paso para la humanidad pero un gran paso para mi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;Para poder empezar se necesita lo siguiente:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Abrir una cuenta en launchpad: &lt;a href=&quot;https://login.launchpad.net/+new_account&quot;&gt;https://login.launchpad.net/+new_account&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Crear una clave ssh y se &lt;a href=&quot;https://help.launchpad.net/YourAccount/CreatingAnSSHKeyPair&quot;&gt;subirla&lt;/a&gt; a launchpad o subir la que ya tengas&lt;/li&gt;
  &lt;li&gt;Crear una clave &lt;a href=&quot;https://help.ubuntu.com/community/GnuPrivacyGuardHowto&quot;&gt;gpg&lt;/a&gt; y se subirla a launchpad o subir la que ya uses&lt;/li&gt;
  &lt;li&gt;Firmar el codigo de &lt;a href=&quot;https://launchpad.net/codeofconduct&quot;&gt;conducta&lt;/a&gt; de Ubuntu&lt;/li&gt;
  &lt;li&gt;Instalar los scripts de desarrollo ‘ubuntu-dev-tools’ y se correr el programa ‘setup-packaging-environment’&lt;/li&gt;
  &lt;li&gt;Crear un entorno de desarrollo para compilar software. Yo uso pbuilder.&lt;/li&gt;
  &lt;li&gt;Crear un entorno de &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuDevelopment/UsingDevelopmentReleases&quot;&gt;desarrollo&lt;/a&gt; para probar software, esto es diferente de crear un chroot para compilar/empaquetar paquetes. Yo uso virtualbox.&lt;/li&gt;
  &lt;li&gt;Crear un ppa (repositorio personal), eso es opcional, pero lo he encontrado muy util para que puedan probar tus cambios rapidamente, usa: &lt;a href=&quot;https://launchpad.net/%7Eusuario/+activate-ppa&quot;&gt;https://launchpad.net/~&lt;strong&gt;usuario&lt;/strong&gt; /+activate-ppa&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Tener en marca personal canales importantes, como #ubuntu-motu #ubuntu-bugs, #ubuntu-devel, #ubuntu-meeting, #ubuntu-packaging&lt;/li&gt;
  &lt;li&gt;Suscribirse a listas relacionadas:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://lists.ubuntu.com/#Development+Lists&quot;&gt;https://lists.ubuntu.com/#Development+Lists&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://lists.ubuntu.com/#Bug+Lists&quot;&gt;https://lists.ubuntu.com/#Bug+Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Creo que eso es todo.&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/06/15/primer-paso-configurar-el-entorno/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>que es un motu y porque quiero ser uno</title>
   <link href="https://javier.io/blog/es/2010/06/15/que-es-un-motu-y-porque-quiero-ser-uno.html"/>
   <published>2010-06-15T16:15:06+00:00</published>
   <updated>2010-06-15T16:15:06+00:00</updated>
   <id>https://javier.io/blog/es/2010/06/15/que-es-un-motu-y-porque-quiero-ser-uno</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="ubuntu"/>
   
   <category term="motu"/>
   
   
   
   <summary type="html">que es un motu y porque quiero ser uno</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/06/15/que-es-un-motu-y-porque-quiero-ser-uno.html">&lt;h2 id=&quot;que-es-un-motu-y-porque-quiero-ser-uno&quot;&gt;que es un motu y porque quiero ser uno&lt;/h2&gt;

&lt;h6 id=&quot;15-jun-2010&quot;&gt;15 Jun 2010&lt;/h6&gt;

&lt;p&gt;Los MOTU son las personas que mantienen universe y multiverse, estos son los
repositorios donde se guardan las aplicaciones que no son mantenidas por
Canonical (la empresa que mantiene Ubuntu). Estas personas son usuarios de a
pie, como tu o yo. A parte de universe y universe tambien esta main,
restricted, y multiverse. Abre ‘synaptic’ -&amp;gt; ‘preferencias’ -&amp;gt; ‘repositorios’
para ver de que trata cada uno.&lt;/p&gt;

&lt;p&gt;La idea es simple, mantener Ubuntu con los estandares de calidad mas altos de
tal forma que tu pelicula no se detenga a la mitad por un problema en el
software que estas usando o que los servicios que corres en tu trabajo
funcionen a la primera para que puedas hacer cosas mas productivas y que tu
jefe este contento.&lt;/p&gt;

&lt;p&gt;El trabajo no es del todo facil (de lo contrario este blog no existiria), hay
que saber un poco de programacion en bash, perl, python, ruby, o C, esto para
poder saber que pasa cuando un error (bug) ocurre. Tambien es elemental saber
como funciona un archivo Makefile y herramientas cripticas como awk, head,
tail, grep, sed, vim, diff, patch, etc antes si quiera de empezar con el
viaje.&lt;/p&gt;

&lt;p&gt;Ok, entonces si el procedimiento es un tanto doloroso ¿Por que quiero ser
parte?&lt;/p&gt;

&lt;p&gt;Y aqui vienen mis razones&lt;strong&gt;personales&lt;/strong&gt; , no se y francamente no me importa
que razones pueda tener la demas gente, pero personalmente pasa que:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Creo en el movimiento del software libre, pero al mismo tiempo tambien me gusta que las cosas simplemente funcionen (sick) tal vez sea por eso que prefiero intentar colaborar con Ubuntu que con otra distribucion.&lt;/li&gt;
  &lt;li&gt;Tengo una cosa clara, las computadoras apestan y siempre que puedan intentaran sabotear lo que tengan a su alcance (siendo estas cosas algunas veces criticas), asi que me gustaria asegurarme personalmente que Ubuntu o lo que sea que utilize tenga la menor cantidad de errores (bugs) posibles.&lt;/li&gt;
  &lt;li&gt;Llevo tiempo chupando energia de Ubuntu y muchisimo software que utilizo mientras a mi me pagan por mantener ese mismo software que yo obtengo gratis, creo que eso podria hacer daño a mi Karma en el largo plazo.&lt;/li&gt;
  &lt;li&gt;Creo que me ara crecer a largo plazo como usuario/administrador&lt;/li&gt;
  &lt;li&gt;Podria tener uno de esos alias @ubuntu.com :)’&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esta lista ira creciendo conforme encuentre mas excusas.&lt;/p&gt;

&lt;p&gt;Publicado originalmente en &lt;a href=&quot;https://viajemotu.wordpress.com/2010/06/15/que-es-un-motu-y-porque-quiero-ser-uno/&quot;&gt;viajemotu.wordpress.com&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>synergy</title>
   <link href="https://javier.io/blog/en/2010/06/14/synergy.html"/>
   <published>2010-06-14T00:00:00+00:00</published>
   <updated>2010-06-14T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/06/14/synergy</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="tools"/>
   
   <category term="networking"/>
   
   <category term="security"/>
   
   
   
   <summary type="html">synergy</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/06/14/synergy.html">&lt;h2 id=&quot;synergy&quot;&gt;synergy&lt;/h2&gt;

&lt;h6 id=&quot;14-jun-2010&quot;&gt;14 Jun 2010&lt;/h6&gt;

&lt;p&gt;&lt;a href=&quot;http://synergy-foss.org&quot;&gt;Synergy&lt;/a&gt; is a program who unifies keyboard/mouse/clipboard between several machines (even running different OS), according to its website it supports Windows, OSX and Unix (requires x11 and xtest).&lt;/p&gt;

&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/4wkJx9Ozfu8&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;In Ubuntu it can be installed from the official repositories (both, client and server):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ sudo apt-get install -y synergy
&lt;/pre&gt;

&lt;p&gt;The server part bind to the &lt;strong&gt;24800&lt;/strong&gt; port, so it doesn’t require special permissions:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ synergys
&lt;/pre&gt;

&lt;p&gt;The clients can start and connect to the server ip by executing:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ synergyc --daemon server-ip
&lt;/pre&gt;

&lt;p&gt;By default, synergy doesn’t encrypt the link, a man in the middle could review the packets and see what the clients are writing. To avoid this problem, a ssh tunnel can be deployed:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ssh -f -N -L 24800:localhost:24800 server-ip
$ synergyc --daemon localhost
&lt;/pre&gt;

&lt;p&gt;Have fun 😋&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>configure WPA/WEP in openbsd</title>
   <link href="https://javier.io/blog/en/2010/05/25/wpa-wep-obsd.html"/>
   <published>2010-05-25T00:00:00+00:00</published>
   <updated>2010-05-25T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/05/25/wpa-wep-obsd</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="networking"/>
   
   <category term="linux"/>
   
   
   
   <summary type="html">configure WPA/WEP in openbsd</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/05/25/wpa-wep-obsd.html">&lt;h2 id=&quot;configure-wpawep-in-openbsd&quot;&gt;configure WPA/WEP in openbsd&lt;/h2&gt;

&lt;h6 id=&quot;25-may-2010&quot;&gt;25 May 2010&lt;/h6&gt;

&lt;h3 id=&quot;wpa---static-ip&quot;&gt;WPA - static ip&lt;/h3&gt;

&lt;p&gt;Since openbsd 4.4 (4.5 for ath0) it’s possible to connect to wpa networks, it doesn’t work with all drivers but eventually it should be viable with most of them.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ifconfig ath0 nwid ACCESS_POINT wpa wpapsk $(wpa-psk ACCESS_POINT PASSWORD)
$ ifconfig ath0 10.0.0.2 255.255.255.0 10.0.0.1  
&lt;/pre&gt;

&lt;p&gt;It can also be configured in &lt;strong&gt;/etc/hostname.ath0&lt;/strong&gt; for connecting at boot time:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat /etc/hostname.ath0
  inet 10.0.0.2 255.255.255.0 10.0.0.255 nwid ACCESS_POINT wpa wpapsk \
  0xc7bd82ef64a789369e18d6df63230a3b099f72a74b999bdbe837773e6081cb54
&lt;/pre&gt;

&lt;p&gt;The last parameter is taken from &lt;strong&gt;$ wpa-psk ACCESS_POINT PASSWORD&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;wpa---dinamic-ip&quot;&gt;WPA - dinamic ip&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ifconfig ath0 nwid ACCESS_POINT wpa wpapsk $(wpa-psk ACCESS_POINT PASSWORD)
$ dhclient ath0
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;/etc/hostname.ath0&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat /etc/hostname.ath0
  dhcp nwid ACCESS_POINT wpa wpapsk \
  0xc7bd82ef64a789369e18d6df63230a3b099f72a74b999bdbe837773e6081cb54
&lt;/pre&gt;

&lt;h3 id=&quot;wep---static-ip&quot;&gt;WEP - static ip&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ifconfig ath0 nwid ACCESS_POINT nwkey 0xPASSWORD
$ ifconfig ath0 10.0.0.2 255.255.255.0 10.0.0.1
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;/etc/hostname.ath0&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat /etc/hostname.ath0
  inet 10.0.0.2 255.255.255.0 10.0.0.255 nwid ACCESS_POINT nwkey 0xPASSWORD
&lt;/pre&gt;

&lt;h3 id=&quot;wep---dinamic-ip&quot;&gt;WEP - dinamic ip&lt;/h3&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ifconfig ath0 nwid ACCESS_POINT nwkey 0xPASSWORD
$ dhclient ath0
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;/etc/hostname.ath0&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ cat /etc/hostname.ath0
  dhcp nwid ACESS_POINT nwkey  0xPASSWORD
&lt;/pre&gt;

&lt;p&gt;The same commands can be used from the installer (by using ! as prefix)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>install ubuntu from the windows boot loader</title>
   <link href="https://javier.io/blog/en/2010/05/19/ubuntu-installation-from-windows-boot-loader.html"/>
   <published>2010-05-19T00:00:00+00:00</published>
   <updated>2010-05-19T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/05/19/ubuntu-installation-from-windows-boot-loader</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">install ubuntu from the windows boot loader</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/05/19/ubuntu-installation-from-windows-boot-loader.html">&lt;h2 id=&quot;install-ubuntu-from-the-windows-boot-loader&quot;&gt;install ubuntu from the windows boot loader&lt;/h2&gt;

&lt;h6 id=&quot;19-may-2010&quot;&gt;19 May 2010&lt;/h6&gt;

&lt;p&gt;I got a new netbook some weeks ago, I tested it fully for a month to verify the hardware didn’t have any defects, and decided to move on with the recent Ubuntu 10.04 release.&lt;/p&gt;

&lt;p&gt;The machine came pre-installed with Windows and I didn’t have any cd/usb available so I decided to use the system itself to install Ubuntu. The first step was to download &lt;a href=&quot;http://grub4dos.sourceforge.net/&quot;&gt;grub4dos&lt;/a&gt;, uncompress it and copy &lt;strong&gt;grldr&lt;/strong&gt; and menu.lst (grub loader) to &lt;strong&gt;C:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/26.png&quot;&gt;&lt;img src=&quot;/assets/img/26.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/27.png&quot;&gt;&lt;img src=&quot;/assets/img/27.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then I created a &lt;strong&gt;C:\boot\grub&lt;/strong&gt; directory and saved initrd (installer) and linux (kernel) in &lt;strong&gt;C:\boot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the x86 architecture, the files can be downloaded from:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20140228001450/http://archive.ubuntu.com/ubuntu/dists/lucid/main/installer-i386/current/images/netboot/ubuntu-installer/i386/initrd.gz&quot;&gt;https://web.archive.org/web/20140228001450/http://archive.ubuntu.com/ubuntu/dists/lucid/main/installer-i386/current/images/netboot/ubuntu-installer/i386/initrd.gz&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20150309195524/http://archive.ubuntu.com:80/ubuntu/dists/lucid/main/installer-i386/current/images/netboot/ubuntu-installer/i386/linux&quot;&gt;https://web.archive.org/web/20150309195524/http://archive.ubuntu.com:80/ubuntu/dists/lucid/main/installer-i386/current/images/netboot/ubuntu-installer/i386/linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For amd64:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20101229085053/http://archive.ubuntu.com/ubuntu/dists/lucid/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz&quot;&gt;https://web.archive.org/web/20101229085053/http://archive.ubuntu.com/ubuntu/dists/lucid/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20141004180829/http://archive.ubuntu.com:80/ubuntu/dists/lucid/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/linux&quot;&gt;https://web.archive.org/web/20141004180829/http://archive.ubuntu.com:80/ubuntu/dists/lucid/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/28.png&quot;&gt;&lt;img src=&quot;/assets/img/28.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Afterwards I copied &lt;strong&gt;C:\menu.lst&lt;/strong&gt; to &lt;strong&gt;C:\boot\grub&lt;/strong&gt; and edit it this way:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/29.png&quot;&gt;&lt;img src=&quot;/assets/img/29.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally I added the entry to the Windows loader and rebooted the system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/30.png&quot;&gt;&lt;img src=&quot;/assets/img/30.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/31.png&quot;&gt;&lt;img src=&quot;/assets/img/31.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/32.png&quot;&gt;&lt;img src=&quot;/assets/img/32.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/33.png&quot;&gt;&lt;img src=&quot;/assets/img/33.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At startup a new entry called &lt;strong&gt;Start GRUB&lt;/strong&gt; will showed up. That’s it, it will bring up the rest of the process.&lt;/p&gt;

&lt;p&gt;WARNING: This method requires an Internet connection through a wired interface, it may work with some wifi cards but the installer won’t recognize most of them so it’s better not to rely on it.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://help.ubuntu.com/community/Installation/FromWindows&quot;&gt;https://help.ubuntu.com/community/Installation/FromWindows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>deb file structure</title>
   <link href="https://javier.io/blog/en/2010/05/19/deb-file-structure.html"/>
   <published>2010-05-19T00:00:00+00:00</published>
   <updated>2010-05-19T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2010/05/19/deb-file-structure</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">deb file structure</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2010/05/19/deb-file-structure.html">&lt;h2 id=&quot;deb-file-structure&quot;&gt;deb file structure&lt;/h2&gt;

&lt;h6 id=&quot;19-may-2010&quot;&gt;19 May 2010&lt;/h6&gt;

&lt;p&gt;Deb packages are nothing but &lt;a href=&quot;http://en.wikipedia.org/wiki/Ar_%28Unix%29&quot;&gt;ar containers&lt;/a&gt;, what set them apart (besides the sufix) are the 3 blobs they always contain.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;debian-binary: package version, normally 2.0&lt;/li&gt;
  &lt;li&gt;control.tar.gz: compressed package files containing &lt;a href=&quot;http://en.wikipedia.org/wiki/Cryptographic_hash_function&quot;&gt;checksums&lt;/a&gt;, scripts (https://web.archive.org/web/20100926195126/http://www.debian.org:80/doc/FAQ/ch-pkg_basics.html), metadata, etc.&lt;/li&gt;
  &lt;li&gt;data.tar.gz: compressed package files containing the program itself (commonly in binary format)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NOTE: Modifying .deb packages directly is not the right way to do it. The formal procedure is described at the Debian packaging guide:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://wiki.debian.org/HowToPackageForDebian&quot;&gt;http://wiki.debian.org/HowToPackageForDebian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On this example I required to extract some files from firefox-launchpad-plugin. I had already installed firefox from a third party source and Ubuntu wanted to install its own version as a dependency which wasn’t going to happen.&lt;/p&gt;

&lt;p&gt;To uncompress deb packages a call to ar is enough:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ar xv firefox-launchpad-plugin_0.4_all.deb
  x - debian-binary
  x - control.tar.gz
  x - data.tar.gz
&lt;/pre&gt;

&lt;p&gt;If all you want is to modify the package, you can extract the .tar.gz files, modify them and repackage them with:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ar r firefox-launchpad-plugin_0.4_all.deb debian-binary control.tar.gz data.tar.gz
  ar: creating firefox-launchpad-plugin_0.4_all.deb
&lt;/pre&gt;

&lt;p&gt;On this example however I’ll only copy some files to the file system:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ tar zxvf data.tar.gz
  ./
  ./usr/
  ./usr/lib/
  ./usr/lib/firefox-addons/
  ./usr/lib/firefox-addons/searchplugins/
  ./usr/lib/firefox-addons/searchplugins/launchpad-bug-lookup.xml
  ./usr/lib/firefox-addons/searchplugins/launchpad-bugs.xml
  ./usr/lib/firefox-addons/searchplugins/launchpad-package-bugs.xml
  ./usr/lib/firefox-addons/searchplugins/launchpad-packages.xml
  ./usr/lib/firefox-addons/searchplugins/launchpad-people.xml
  ./usr/lib/firefox-addons/searchplugins/launchpad-specs.xml
  ./usr/lib/firefox-addons/searchplugins/launchpad-support.xml
$ find ~/.mozilla/ -type d  -iname searchplugins
  /home/javier/.mozilla/firefox/h5xyzl6e.default/searchplugins
$ mv ./usr/lib/firefox-addons/searchplugins/* ~/.mozilla/firefox/h5xyzl6e.default/searchplugins/
&lt;/pre&gt;

&lt;p&gt;Done!, I don’t need to mess with a dependency hell for a bunch of files 😏&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/34.png&quot;&gt;&lt;img src=&quot;/assets/img/34.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>k estas haciendo? (curl + cookies + post)</title>
   <link href="https://javier.io/blog/es/2010/03/09/k-estas-haciendo-curl.html"/>
   <published>2010-03-09T00:00:00+00:00</published>
   <updated>2010-03-09T00:00:00+00:00</updated>
   <id>https://javier.io/blog/es/2010/03/09/k-estas-haciendo-curl</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">k estas haciendo? (curl + cookies + post)</summary>
   
   <content type="html" xml:base="https://javier.io/blog/es/2010/03/09/k-estas-haciendo-curl.html">&lt;h2 id=&quot;k-estas-haciendo-curl--cookies--post&quot;&gt;k estas haciendo? (curl + cookies + post)&lt;/h2&gt;

&lt;h6 id=&quot;09-mar-2010&quot;&gt;09 Mar 2010&lt;/h6&gt;

&lt;p&gt;En la &lt;a href=&quot;http://mononeurona.org&quot;&gt;MN&lt;/a&gt; habia una sección de chat al estilo de twitter, no tenia una API definida, pero podia ser analizada y convertida para desplegarse en la consola.&lt;/p&gt;

&lt;p&gt;El script muestra como puede usarse curl con cookies para enviar datos a través del protocolo http (post/get).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://gist.github.com/3058885&quot;&gt;&lt;img src=&quot;/assets/img/25.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>my current desktop</title>
   <link href="https://javier.io/blog/en/2009/10/15/current-desktop-setup.html"/>
   <published>2009-10-15T00:00:00+00:00</published>
   <updated>2009-10-15T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2009/10/15/current-desktop-setup</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   <category term="personal"/>
   
   
   
   <summary type="html">my current desktop</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2009/10/15/current-desktop-setup.html">&lt;h2 id=&quot;my-current-desktop&quot;&gt;my current desktop&lt;/h2&gt;

&lt;h6 id=&quot;15-oct-2009&quot;&gt;15 Oct 2009&lt;/h6&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/assets/img/5.png&quot;&gt;&lt;img src=&quot;/assets/img/5.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/6.png&quot;&gt;&lt;img src=&quot;/assets/img/6.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;a href=&quot;/assets/img/7.png&quot;&gt;&lt;img src=&quot;/assets/img/7.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ubuntu 9.04 + E17 + Ecomorp&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>less is more, and even more with color</title>
   <link href="https://javier.io/blog/en/2009/06/05/less-with-color.html"/>
   <published>2009-06-05T00:00:00+00:00</published>
   <updated>2009-06-05T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2009/06/05/less-with-color</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="shell"/>
   
   <category term="tools"/>
   
   
   
   <summary type="html">less is more, and even more with color</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2009/06/05/less-with-color.html">&lt;h2 id=&quot;less-is-more-and-even-more-with-color&quot;&gt;less is more, and even more with color&lt;/h2&gt;

&lt;h6 id=&quot;05-jun-2009&quot;&gt;05 Jun 2009&lt;/h6&gt;

&lt;p&gt;I’ve just discovered how to colorize &lt;strong&gt;less&lt;/strong&gt; output, It may seems unimportant but I really prefer to colorize my life when possible.&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ ls -la --color |less -R
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;img src=&quot;/assets/img/2.png&quot; alt=&quot;&quot; /&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The colors are defined by editing the &lt;strong&gt;~/.bashrc&lt;/strong&gt; file&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
# Less Colors for Man Pages
export LESS_TERMCAP_mb=$&apos;\E[01;31m&apos;       # begin blinking
export LESS_TERMCAP_md=$&apos;\E[01;38;5;74m&apos;  # begin bold
export LESS_TERMCAP_me=$&apos;\E[0m&apos;           # end mode
export LESS_TERMCAP_se=$&apos;\E[0m&apos;           # end standout-mode
export LESS_TERMCAP_so=$&apos;\E[38;5;246m&apos;    # begin standout-mode - info box
export LESS_TERMCAP_ue=$&apos;\E[0m&apos;           # end underline
export LESS_TERMCAP_us=$&apos;\E[04;38;5;146m&apos; # begin underline
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;img src=&quot;/assets/img/3.png&quot; alt=&quot;&quot; /&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same trick can be used for other commands who output colorized messages (except for those who they detect when stdout is going through a pipe such as grep):&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ tree -Ca /sys/ | less -R
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;&lt;img src=&quot;/assets/img/4.png&quot; alt=&quot;&quot; /&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;More color codes can be consulted at: &lt;a href=&quot;http://ascii-table.com/ansi-escape-sequences.php&quot;&gt;http://ascii-table.com/ansi-escape-sequences.php&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>geek songs</title>
   <link href="https://javier.io/blog/en/2008/12/23/geek-songs.html"/>
   <published>2008-12-23T00:00:00+00:00</published>
   <updated>2008-12-23T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2008/12/23/geek-songs</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="music"/>
   
   
   
   <summary type="html">geek songs</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2008/12/23/geek-songs.html">&lt;h2 id=&quot;geek-songs&quot;&gt;geek songs&lt;/h2&gt;

&lt;h6 id=&quot;23-dec-2008&quot;&gt;23 Dec 2008&lt;/h6&gt;

&lt;p&gt;Here are some geeky songs I was not aware of, it’s not that I spend all my day looking for them 😉&lt;/p&gt;

&lt;h4 id=&quot;code-monkey&quot;&gt;Code monkey&lt;/h4&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/5W_wd9Qf0IE&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h4 id=&quot;kill--9&quot;&gt;Kill -9&lt;/h4&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Fow7iUaKrq4&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h4 id=&quot;white-and-nerdy&quot;&gt;White and nerdy&lt;/h4&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/N9qYF9DZPdw&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;[+] &lt;a href=&quot;https://www.youtube.com/watch?v=N9qYF9DZPdw&quot;&gt;Watch on YouTube&lt;/a&gt; (label blocks embedding on every upload)&lt;/p&gt;

&lt;h4 id=&quot;mc-hawking--entropy&quot;&gt;Mc hawking -Entropy&lt;/h4&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/2knWCuzcdJo&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h4 id=&quot;mac-or-pc&quot;&gt;Mac or PC&lt;/h4&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Jkrn6ecxthM&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h4 id=&quot;the-geeks-get-the-girls&quot;&gt;The geeks get the girls&lt;/h4&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/AtGGC7i-XPE&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;[+] &lt;a href=&quot;https://www.youtube.com/watch?v=pDcz43pt6r4&quot;&gt;Studio version on YouTube&lt;/a&gt; (embedding blocked by the label; live take above)&lt;/p&gt;

&lt;h4 id=&quot;sunny-sunny-sunday&quot;&gt;Sunny sunny sunday&lt;/h4&gt;
&lt;div class=&quot;youtube&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/B1b-oM72Pac&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;If you know more let me know, most of the tracks were grabbed from &lt;a href=&quot;http://www.catonmat.net/blog/category/musical-geek-friday/&quot;&gt;catonmat.net&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>kexec reboot</title>
   <link href="https://javier.io/blog/en/2008/11/04/kexec-reboot.html"/>
   <published>2008-11-04T00:00:00+00:00</published>
   <updated>2008-11-04T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2008/11/04/kexec-reboot</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">kexec reboot</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2008/11/04/kexec-reboot.html">&lt;h2 id=&quot;kexec-reboot&quot;&gt;kexec reboot&lt;/h2&gt;

&lt;h6 id=&quot;04-nov-2008&quot;&gt;04 Nov 2008&lt;/h6&gt;

&lt;p&gt;Since the 2.6 Linux kernel version came out there is a new way to reboot quite fast. &lt;a href=&quot;http://en.wikipedia.org/wiki/Kexec&quot;&gt;Kexec&lt;/a&gt; is a new call system who replaces the running kernel with a new one without the need to go through the bios initialization process. It means than now you’re able to reboot faster, taking away 20, 30 or even 60 seconds from the boot process.&lt;/p&gt;

&lt;p&gt;To use it, the “kexec-tools” package must be installed and the option “CONFIG_KEXEC” enabled, after setting up the system, kexec can be used this way:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ kexec -l /boot/vmlinuz --command-line=&quot;`cat /proc/cmdline`&quot; --initrd=/boot/initrd
$ kexec -e
&lt;/pre&gt;

&lt;p&gt;The first line loads the kernel in memory and returns the control to the user, it’s now up to you to decide when to “reboot” the system (the second line will do it), &lt;a href=&quot;http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.0/html/Realtime_Tuning_Guide/sect-Realtime_Tuning_Guide-Realtime_Specific_Tuning-Using_kdump_and_kexec_with_the_RT_kernel.html&quot;&gt;some persons&lt;/a&gt; are already using this technique to load new kernels when the running one panics.&lt;/p&gt;

&lt;p&gt;In the current upstream implementation, kexec doesn’t auto unmount the plugged devices, so it’s must be done manually:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ kexec -l /boot/vmlinuz --command-line=&quot;`cat /proc/cmdline`&quot; --initrd=/boot/initrd
$ sync
$ umount -a
$ kexec -e
&lt;/pre&gt;

&lt;p&gt;Fortunately the Debian/Ubuntu maintainers had already integrated this logic on the reboot/halt scripts and therefore it’s now possible to reboot the system without unmounting anything:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ kexec -l /boot/vmlinuz --command-line=&quot;`cat /proc/cmdline`&quot; --initrd=/boot/initrd
$ shutdown -r now
&lt;/pre&gt;

&lt;p&gt;In &lt;a href=&quot;http://lizards.opensuse.org/2008/10/13/automatic-reboot-with-kexec/&amp;quot;&amp;gt;&quot;&gt;OpenSuse 11.1&lt;/a&gt; kexec may even be an opt-in. The day where I never shutdown my computer gets closer.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/linux/library/l-kexec.html&quot;&gt;http://www.ibm.com/developerworks/linux/library/l-kexec.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.linux.com/feature/150202&quot;&gt;http://www.linux.com/feature/150202&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://lwn.net/Articles/15468/&quot;&gt;http://lwn.net/Articles/15468/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://code.google.com/p/atv-bootloader/wiki/Understandingkexec&quot;&gt;http://code.google.com/p/atv-bootloader/wiki/Understandingkexec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>gentoo useflags</title>
   <link href="https://javier.io/blog/en/2008/07/25/useflags-gentoo.html"/>
   <published>2008-07-25T00:00:00+00:00</published>
   <updated>2008-07-25T00:00:00+00:00</updated>
   <id>https://javier.io/blog/en/2008/07/25/useflags-gentoo</id>
   <author>
     <name>Javier López</name>
   </author>
   
   
   <category term="linux"/>
   
   
   
   <summary type="html">gentoo useflags</summary>
   
   <content type="html" xml:base="https://javier.io/blog/en/2008/07/25/useflags-gentoo.html">&lt;h2 id=&quot;gentoo-useflags&quot;&gt;gentoo useflags&lt;/h2&gt;

&lt;h6 id=&quot;25-jul-2008&quot;&gt;25 Jul 2008&lt;/h6&gt;

&lt;p&gt;These are the flags I’m using for a pentium-m laptop.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#console USE=&quot;${USE} bash-completion gpm ncurses slang fbcon&quot;

#graphical interface USE=&quot;${USE} dbus X gnome -kde cairo libnotify &quot;

#cd/dvd USE=&quot;${USE} cdr -dvdr dvdread &quot;

#hardware USE=&quot;${USE} -3dfx -3dnow acpi -apm -altivec bluetooth hal
ieee1394 ipod lirc lm_sensors mmx hddtemp -mpi -multilib -netboot nocd pcmcia
pda ppds -scanner sse sse2 usb wifi gphoto2 opengl&quot;

#dev USE=&quot;${USE} cscope dbm doc emacs examples expat -fortran -gcj
gtk -ifc -jikes java java6 javascript -mule pcre perl php python -qt3 -qt4
readline ruby sdl spl subversion&quot;

#net USE=&quot;${USE} -aim cups -freewnn ftp -icq idn imap ipv6 jabber libgda
mime mozilla -msn -oscar samba sockets socks5 ssl vhosts -yahoo evo mailwrapper
rss&quot;

#sound USE=&quot;${USE} alsa -oss ao esd osc ladspa lame
libsamplerate pulseaudio aac -arts audiofile -cddb cdparanoia dts flac jack
lash mad matroska mikmod modplug mp3 musepack musicbrainz&amp;amp;nbsp; ogg openal
shorten sox speex vorbis &quot;

#misc formats USE=&quot;${USE} bzip2 pdf xml zlib &quot;

#images USE=&quot;${USE} imagemagick gif jbig jpeg jpeg2k lcms mng openexr png
raw svg -wmf xpm&quot;

#video USE=&quot;${USE} a52 aalib dv dvb dvd encode exif
ffmpeg gstreamer libcaca mpeg mplayer quicktime theora v4l2 vcd -win32codecs xv
xvid&quot;

#security USE=&quot;${USE} clamav cracklib crypt pam syslog &quot;

#random USE=&quot;${USE} -accessibility -bindist cdinstall -debug fam nptl
offensive -old-linux posix session source spell threads truetype unicode videos
xprint xscreensaver nls&quot;

#dangerous flags: alpha, amd64, arm, hppa, ia64, mips, ppc, ppc64
#ppc-macos, s390, sh, sparc, x86 

#*******************************************
#*******************************************
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After changing use global flags, gentoo needs to be recompiled:&lt;/p&gt;

&lt;pre class=&quot;sh_sh&quot;&gt;
$ emerge --update --deep --with-bdeps=y --newuse world
&lt;/pre&gt;
</content>
 </entry>
 

</feed>
