Qua

Reader

Syndicated list of all public content of Qua users.

from El blog de Juan

La primer pregunta cuando que le pasa por la cabeza a las personas si les dicen que abandonen Google y sus servicios en su celular es “¿y cómo voy a hacer , si no podré usar ?“. Afortunadamente hay muchas alternativas libres, disponibles en F-droid o en repositorios individuales para las aplicaciones más comunes (y otras no tanto), así que a continuación dejaré una recopilación de las mejores aplicaciones que yo he probado con las cuales no se extrañará casi nada a Google.

Tienda de aplicaciones.

Reemplaza a Play Store

  • F-droid: La primer “tienda” que hay que descargar es F-droid, un repositorio de aplicaciones libres desde el cual podremos descargar y actualizar nuestras aplicaciones totalmente libres.

img

  • Aurora Droid: Una aplicación alternativa para conectarse a F-droid con una apariencia mucho más atractiva.

img

  • Aurora Store: Lo admito: no todas las alternativas libres disponibles valen la pena, algunas son malas, quedan a deber, o definitivamente no existen. Si hemos renunciado a Google en nuestro Android pero hay alguna aplicación a la que aún no podemos renunciar, la mejor manera de descargar aplicaciones de Play Store es con Aurora Store; además de tener una apariencia muy atractiva nos permite conectarnos sin necesidad de tener cuenta, además nos informa de los trackers que tengan las aplicaciones, protegiendo nuestra privacidad.

img

Reemplaza a Chrome

  • Fennec: Se trata de Firefox pero sin los complementos privativos de este último. Posee todas las características del navegador de Mozilla.

img

Correo

Reemplaza a Gmail

  • Fair email: Un cliente de correo, funciona con protocolos como IMAP por lo que puede usarse con una cuenta de gmail o de outlook. Tiene varias características centradas en la privacidad y está en constante desarrollo.

img

  • Tutanota: Tutanota es un servicio de correo enfocado en la privacidad y con sede en Alemania. Su servicio gratuito ofrece 1 Gb. de almacenamiento, varios dominios para elegir y encriptación punto a punto de todos los mensajes. Su cliente para android está disponible para su descarga en F-droid.

img

Calendario

Reemplaza a Google Calendar, el calendario propio de cada compañía

  • Simple Calendar: Una aplicación de calendario sencilla, personalizable en los colores y aspectos de la interfaz, además permite sincronización mediante CalDAV o archivos .ics.

img

Nube y sincronización

  • Nextcloud: Nextcloud es un servicio de almacenamiento en la nube selfhost donde uno mismo debe montar su propio servidor, de esta forma la privacidad está asegurada gracias a que la información está en nuestros propios ordenadores. La aplicación para Android está disponible en F-droid y ofrece lo común en este tipo de servicios. Para comenzar a usar Nexcloud sin tener que pasar por todo el proceso de montar un servidor en https://nextcloud.com/signup/ se pueden encontrar sugerencias de proveedores que usan Nextcloud.

img

  • Syncthing: Un servicio de sincronización p2p, donde los dispositivos se sincronizan entre sí en red local. No hay servidores remotos, cada dispositivo en un servidor, de esta forma, la información se mantiene en los dispositivos que deseamos sincronizar únicamente.

img

  • DAVx⁵: La mejor manera de sincronizar nuestros calendarios con algún servicio en la nube es CalDAV, un protocolo similar a WebDAV que permite sincronizar calendarios y listas de tareas. Muchos servicios de calendarios como Outlook, Google Calendar o Nextcloud permiten el uso de CalDAV, y la aplicación que se encarga de hacer la sincronización es DAVx⁵. De esta forma se puede tener calendarios sincronizados, sin importar el servicio de almacenamiento en la nube que usemos.

img

Cámara

Reemplaza a Google Camera, la aplicación de cámara de cada compañía

  • Open Camera: Una aplicación de cámara muy completa, con opciones avanzadas para tomar fotos y que da como resultado fotos de gran calidad. Su interfaz es algo (muy) anticuada pero funcional.

img

Galería

Reemplaza a Google fotos, la galería propia de la compañía

  • Simple Gallery: Una galería muy personalizable, me recuerda en momentos a QuickPic. Tiene muchas opciones para organizar y administrar las fotos y videos en la memoria del teléfono.

img

Toma de notas y listas de tareas

Reemplaza a Google Keep, Evernote, Todoist

  • Markor: Un editor Markdown que nos permite tomar notas y hacer listas de tareas en formato todo.txt. Una aplicación muy completa que puede ser utilizada tanto como aplicación de notas sueltas como un completo editor Markdown.

img

  • Orgzly: Una aplicación de lista de tareas que usa el formato org-mode para almacenarlas. Cuenta con varias de las características propias de org-mode como son las etiquetas, prioridades, agenda, la capacidad de “doblar” las notas de un encabezado, entre otras opciones.

  • SimpleTask: Otra aplicación de lista de tareas, esta vez usando el formato todo.txt, lo que la hace más sencilla para usarse con (y quizá enfocada a) el sistema GTD. Cuenta con la posibilidad de crear filtros complejos y añadir scripts en LUA para mejores filtrados.

  • Omni Notes: Si se busca una aplicación más parecida a Google Keep, Omni Notes es la alternativa perfecta. Permite hacer notas con dibujos, audios, imágenes, checklist y texto.

img

Lector de noticias

Reemplaza a Feedly, Flipboard, Google Kiosco

  • Feeder: Un lector RSS simple que añade el feed RSS de cualquier URL soportado, convierte la página web en texto plano para poder leerlo incluso sin conexión, permite activar notificaciones de aquellos canales que más nos interesen, entre otras opciones.

img

  • Flym: Un lector de noticias que permite añadir fácilmente nuevas fuentes de noticias. AL igual que Feeder descarga la página en texto plano para poder leerla cómodamente.

img

Música y videos

  • VLC: El reproductor de video por antonomasia es FLOSS y está disponible en F-droid. VLC reproduce prácticamente cualquier formato de audio o video y es totalmente configurable hasta en aspectos muy avanzados como son códecs y demás.

img

  • Phonograph: Además de una gran interfaz muy agradable, Phonograph posee un editor de etiquetas, editor de letras y varias configuraciones. Es un reproductor normal, pero su gran interfaz y lo redondo de sus opciones de configuración lo vuelven uno de mis favoritos.

img

  • Music Player GO: Un navegador muy minimalsta, cuya personalización se limita a elegir uno de los varios tonos pasteles con los que cuenta y poco más. Cuenta con una interfaz unificada así que no hay que moverse entre mil pantallas diferentes, todo está en una sola. Es un reproductor muy simple que se limita a reproducir música, pero hay una atracción en esa simpleza que me hace volver a él constantemente.

img

  • NewPipe: Newpipe permite reproducir videos desde YouTube sin enviar casi información a Google. Permite “suscribirse” a canales, ver videos (se puede en ventana flotante fuera de la app, y sin pagar), descargarlos tanto en audio como en video, crear listas de reproducción, importar y exportar nuestras suscripciones, entre otras características que envidian poco o nada a la app oficial de YouTube.

img

Redes sociales

Reemplaza a Facebook, twitter y demás

  • Frost for Facebook: Frost es un cliente para Facebook (en realidad, una forma más cómoda de acceder a la web de Facebook) con varias opciones interesantes como varios temas, multicuenta y un peso mucho, mucho menor al de la app de facebook.

img

  • Twidere: Un cliente para varios servicios de microblogging, entre ellos Twitter. Twidere ofrece todas las opciones que se pueden buscan en un cliente de Twitter, como ver post, comentarlos, ver y descargar imágenes, seguir usuarios, crear listas, ver tendencias y mucha personalización.

img

  • Slide: Un cliente para Reddit con muchas opciones de personalización y para hacer más cómoda la experiencia en reddit. Es posible ver post, comentar, suscribirse a subreddits, ver imágenes directamente aunque estén alojadas en servers externos y muchas opciones más.

img

Otros

  • Pocket Maps (reemplazo de Maps): Una app para ver y descargar mapas desde OpenStreetMaps

  • DuckDuckGo (reemplazo de Google Now): Un navegador simple con muchas opciones de privacidad enfocado en hacer búsquedas rápidas, justo como Google Now.

  • Pdf Viewer Plus (reemplazo de Adobe Reader): Un lector de Pdf sencillo que hace justo eso: abrir Pdf's

  • File Manager: Un navegador de archivos sencillo, con una interfaz muy agradable y moderna.

 
Leer más...

from El blog de Juan

Cómo usuario de Emacs he tratado de llevar su uso a la mayoría de los aspectos de mi vida, y uno donde no podía faltar era, por supuesto, en mi trabajo. Como profesor de matemáticas, una de las principales tareas que realizo es planear mis clases, así que dediqué un tiempo en construir un sistema que me permitiera planear mis clases, llevar control sobre ellas y presentar mis planeaciones en un formato legible para el humano promedio. A continuación comparto lo que he logrado hasta ahora.

¿Cómo planeaba antes?

Aprendí a planear clases durante formación como docente, en aquella época se me dio una plantilla de MS-Word y con ella trabajaba. El problema de esta plantilla es que MS Word (y Libre Office también en ocasiones) hacen una tortura manejar tablas; en incontables ocasiones la tabla se movía, se negaba a cambiar su tamaño, a añadir nuevas filas, y en más de una ocasión fue más sencillo reiniciar todo el trabajo que arreglar la tabla que ya tenía.

img

Por alguna misteriosa razón, todos los profesores que conozco utilizan un formato similar en tabla, pero colocan todo dentro de una sola celda, es decir, la tabla funciona más que nada como “marco” para la hoja. Dado que nada me obligaba a mantener ese formato tan enfadoso de escribir decidí eliminarlo, sin embargo, la información que contiene se mantiene prácticamente intacta.

Seleccionando las herramientas

El formato elegido para trabajar fue Org-mode, un formato que, curiosamente, uso para todo, menos para organizar mi día. Org-mode posee la sencillez de escritura de Markdown, el poder de LaTeX (especialmente para escribir fórmulas), la capacidad de exportar en varios formatos, capacidad de seguimiento de hábitos, entre otras muchas bondades que lo hacen sumamente poderoso y a la vez (casi siempre) fácil de usar.

Gracias a su capacidad de “doblar” los encabezados me permite ver solo la sección que me interesa en el momento y mantener “dobladas” el resto de forma que no interrumpan mi lectura, y su capacidad de exportar en PDF con LaTeX me permite generar un documento rápidamente para entregar a la dirección de la escuela.

Describiendo el sistema

Al abrir alguna de mis planeaciones lo primero que encontramos es un encabezado llamado “org-data” acompañado de una etiqueta :noexport:; este encabezado incluye todas las opciones de org-mode y LaTeX:

#+title: PLANEACIÓN DIDÁCTICA
#+author: Yo
#+options: toc:nil date:nil num:nil p:nil tags:nil todo:nil
#+seq_todo: COMENZADO(t!) | TERMINADO(d!)
#+startup: indent
#+startup: logdrawer
#+latex_class: koma-article
#+latex_header: \usepackage{lmodern}
#+latex_header: \fontfamily{lmss}\selectfont 
#+latex_header: \usepackage[margin=1in, letterpaper]{geometry}
#+latex_header: \usepackage[spanish]{babel}
#+latex_header: \usepackage{fancyhdr}
#+latex_header: \setlength{\headheight}{15.2pt}
#+latex_header: \pagestyle{fancy}
#+latex_header: \chead{\bfseries ESCUELA SECUNDARIA \\ "nombre de la escuela" \\ SECUENCIA DIDÁCTICA}
#+latex_header: \lhead{\includegraphics [width=2cm]{/path/to/escudo.png}}
#+latex_header: \rhead{\includegraphics [width=2cm]{/path/to/otro-escudo.png}}
#+latex_header: \cfoot{}
#+latex_header: \renewcommand{\headrulewidth}{0pt}
  • title y author: Incluyen el título y mi nombre, para que aparezcan al exportar a PDF
  • options: Las opciones de exportación de org-mode. Evitan que genere un índice, la fecha de creación, que numere cada encabezado, que exporte las etiquetas y las secuencias TODO
  • seq_todo: La secuencia de TODO, en lugar de mostrar TODO y DONE, mostrará COMENZADO y TERMINADO. El signo de admiración añade la fecha cada vez que se modifica el estado TODO del encabezado.
  • startup: indent: Añade un sangrado de manera que el contenido de los encabezados estén alineados con el subnivel al que pertenecen.
  • startup: logdrawer: Guarda las notas y las fechas cuando cambia el estado TODO en un drawer llamado LOGBOOK.
  • latex_header: Órdenes de LaTeX, necesarias para darle formato al PDF que se genere. Entre otras cosas, definen los márgenes, el tipo de papel y el encabezado de las páginas.

La mayoría de esas instrucciones las descubrí en el momento, googleando lo que quería lograr y encontrando la información en foros y en el manual de Org-mode.

El siguiente encabezado que vemos es uno llamado “DATOS GENERALES”, donde incluyo la misma información que en la sección del mismo nombre en el viejo formato de Word, con al diferencia que aquí he vertido la información como una lista.

Un tercer encabezado se llama “PRIMER TRIMESTRE” y aquí es donde comienza el verdadero trabajo.

Las secuencias y las sesiones

Cada trimestre de la clase de matemáticas está dividido en una serie de Secuencias (o contenidos), cada secuencia se divide en sesiones de 50 minutos, y estas a su vez, en 3 momentos: inicio, desarrollo y cierre.

Existen dos formas de planear una secuencia, cada una con sus ventajas y desventajas:

  • Planear por secuencia: Se planea el inicio, desarrollo y cierre de una secuencia didáctica de varios días. Es más sencillo de planear y más rápido, pero también más ambiguo y con mas oportunidad a la improvisación.
  • Planear por sesión: Se planea el inicio, desarrollo y cierre de cada una de las sesiones que componen la secuencia. Esta forma es más tardada y más compleja, pero añade más puntos de control y elimina mucha de la ambigüedad que hay en el otro método.

Personalmente soy partidario del segundo método, aunque he probado ambos y mucho tiempo preferí planear por secuencias, hoy encuentro más provechoso tener claro el trabajo en cada una de las sesiones de trabajo.

Todas las sesiones comienzan con los organizadores curriculares, que he vertido de la siguiente forma:

\dotfill
** Secuencia 1  (# de sesiones: fecha/inicio --> fecha/cierre)
Nombre del contenido o secuencia
- **Aprendizaje esperado:**
- **Eje temático:**
- **Tema:**
- **Consideraciones previas:** 

\dotfill

Como cada secuencia comienza con exactamente los mismos datos, he creado una plantilla de YASnippet, de manera que solo escribo sec + TAB y se despliega toda la plantilla, al presionar TAB al siguiente elemento y puedo llenarla sencillamente.

Dos elementos quizá llamen la atención. El primero, la orden \dotfill; esta es una función de LaTeX que añade una línea punteada, solo sirve para separar los organizadores curriculares del resto de la información. El segundo elemento que llama la atención lo hace por su ausencia, ¿por qué escribo las fechas de una forma tan informal en lugar de usar alguna de las muchas opciones que Org-mode ofrece? La razón es que el formato de org-mode (es decir, el estándar ISO) es bastante confuso para lo que estoy acostumbrado, y, aunque me permitiría usar la agenda, tuve algunos problemas que explicaré más adelante.

Ahora toca llenar cada una de las sesiones que componen la secuencia. Para esto, nuevamente he usado una plantilla de YASnippet:

*** Sesión 1

**** Inicio (  min.)
- 

**** Desarrollo (  min.)
- 

**** Cierre (  min.)
- 

**** Recursos
- 

**** Evaluación
- 

Esta plantilla me permite escribir rápidamente el número de la sesión de la que se trata, la cantidad de minutos dedicados a cada momento, y finalmente, redactar las actividades que se realizarán en cada momento, los recursos necesarios para la sesión y los métodos de evaluación. Nuevamente, los mismos datos que en el formato anterior.

Extras que solo Org-mode ofrece

Hasta aquí, salvo la automatización de YASnippet, no he alcanzado nada muy interesante. Pero las bondades de Org-mode comienzan a verse a partir de aquí.

Al comenzar cada secuencias y cada sesión, cambio el estado TODO a COMENZADO, automáticamente se añade la fecha dentro de un drawer llamado LOGBOOK, al terminar la sesión o secuencia cambio nuevamente el estado TODO a TERMINADO, esto me permite no solo llevar un control de qué clases ya impartí y donde voy, sino también el día en el que las comencé, esto con el fin de llevar un seguimiento de las fechas y ver si voy cumpliendo con las fechas que me propuse.

img

Un elemento que se puede ver en la plantilla de Word y que no he agregado aquí es el de “ADECUACIONES”, este apartado sirve para anotar aquellos cambios que he decidido hacer a mi clase. Con Org-mode logro esto presionando C-c C-z sobre el encabezado donde quiero hace mi adecuación (o una anotación) esto abre un buffer donde puedo escribir y guardo mi nota con C-c C-c. El resultado es un pequeño texto así:

        - Nota tomada el [2019-09-13 vie] \\
        Adecuación realizada

Esta nota se almacena dentro del LOGBOOK.

Una última característica a la que saco provecho es a Org-capture y la función Diario. Los profesores llevamos generalmente un Diario de Clase, aunque cada quien lo diseña de diferente forma, yo apunto en él los elementos o sucesos más relevantes de la sesión y que deseo registrar para futuras referencias. En mi init.el tengo la siguiente plantilla:

        (global-set-key (kbd "C-c c") 'org-capture)
        (setq org-capture-templates
              '(
        	("d" "Diario" entry
        	 (file+olp+datetree "/path/to/DIARIO.org")
        	 "* %?" :prepend t)))

Al presionar C-c c d un buffer aparece y me permite escribir una entrada normal. Esta entrada se almacena en un archivo llamado DIARIO.org y automáticamente llena los encabezados del año, mes y día, de manera que el diario luce algo así:

img

Las etiquetas las agregué yo presionando C-c C-q al momento de escribir los encabezados, de forma que me facilite un futuro filtrado.

Exportando a PDF

Si entrego al director el archivo .org y lo abre en el bloc de notas me lo va a devolver con la misma. Necesito entregarlo en un formato legible por una persona normal, y ese formato es PDF. Las órdenes de LaTeX establecidas al inicio ya le dan formato al documento, y el drawer LOGBOOK, por defecto, no se exporta, eso permite generar un documento limpio que puedan leer o imprimir para archivarlo. El resultado luce más o menos así (censuro el nombre de la escuela y los escudos por seguridad):

img

TODO

Quedan muchos aspectos en los que debo trabajar para que mi sistema sea más cercano a la perfección:

  • Uso de la agenda: No he encontrado la forma (si es que existe) de excluir los fines de semana de la agenda
  • Uso de enlaces a otros archivos: Tengo libros y demás materiales que uso diario, enlazarlos podría acelerar el proceso de buscarlos y abrirlos
  • Mejorar el PDF resultante: lo admito, se ve feo, la tabla de Word será todo lo que quieran, pero se ve bonita.

Pese a que quedan cosas por mejorar, considero que he logrado un sistema funcional, sencillo de seguir (una vez ya establecido) y que me permite centrarme en diseñar mis clases, y no en acomodar una horrible tabla. Claro que para alcanzar este sistema tardé varios días buscando e ideando como hacer lo que quería, y creo que justo ahora estoy cerca del formato perfecto para planear clases. Al menos para mi.

 
Leer más...

from Aus der "Berichterstattung über die Ergebnisse der mit wohnungslosen Menschen geführten Interviews"

Aus der Mitteilung auf die ich mich beziehe will ich zwei konkrete Punkte aufgreifen.

  • Dauerzuweisung einer Unterbringung...
  • Abschaffung der Taschengeld-Regelung bei Unterbringung in einer stationären Einrichtung

Dauerzuweisung in einer Unterbringung...

Berechtigt! Jedoch darf nicht vergessen werden, es muss in erster Linie darum gehen dass die Ursachen die zur Obdach- beziehungsweise Wohnungslosigkeit von Menschen führen beseitigt werden. Darüber hinaus muss natürlich auch mehr bezahlbarer Wohnraum für alle geschaffen werden.

In Köln, so unpassend diese Formulierung auch sein mag, erfolgt der Einstieg in das Hilfesystem in der Regel über eine der Notschlafstellen. Diese haben keine einheitlichen Verweildauern. Es gibt solche, wo man bis zum nächsten Tag, wo die Fachstelle Wohnen beim Wohnungsamt der Stadt Publikumsverkehr hat bleiben kann. Es gibt solche, wo man maximal fünf Nächte im Monat übernachten kann.

Wenn man bei der Fachstelle Wohnen vorspricht erfolgt die Zuweisung entweder in ein Hotel (einen gewerblichen OBG-Betrieb) oder in ein Wohnheim eines Freien Trägers. Bei einer Hotel-Zuweisung muss man alle zwei Monate zur Verlängerung zum Sozialamt. Im Vergleich zu einer Unterbringung in einem Wohnheim oder Betreutem Wohnheim verläuft die Verlängerung unbürokratisch. Man nimmt den Termin wahr, quittiert mit seiner Unterschrift dass man die Papiere für die Verlängerung bekommen hat und geht wieder, bis zum nächsten Termin in zwei Monaten. Bei Wohnheimen kann man in der Regel maximal zwei Jahre bleiben. Hier wird jedoch alle sechs Monate über einen sogenannten Hilfeplan entschieden ob weiter verlängert wird oder nicht. Diese Regelung gibt es auch im Betreuten Wohnen (BeWo).

Oft, nicht bei allen Bewohnern, kommt es vor dass man nach dem Wohnheim oder mittendrin ins BeWo kommt. Theoretisch gibt es dort keine Zeitbegrenzung wie lange man bleiben kann.

Abgesehen von der Unterbringung in einer Notschlafstelle, sollten alle Zwischenstationen und Verschiebebahnhöfe abgeschafft werden. Die Menschen müssen so lange in einer Unterkunft bleiben dürfen bis sie eine eigene Wohnung gefunden haben.

Abschaffung der Taschengeld-Regelung bei Unterbringung in einer stationären Einrichtung

Berechtigt! Man muss es sich, vereinfacht ausgedrückt, vorstellen wie wenn die Jobcenter beispielsweise das Arbeitslosengeld II an die eigenen Eltern überweist und man dann jedesmal wie ein kleines Kind als Bittsteller zu ihnen muss wenn man Geld haben will. Man unterstellt meiner Meinung nach sozusagen alle obdach- und wohnungslosen Menschen einem Generalverdacht, dass sie nicht mit ihrem Geld haushalten können. Zumindest in Köln ist das Hilfesystem hier so gestrickt, dass es eigentlichen bei allen Freien Trägern der stationären Einrichtungen so ist, dass man dem zustimmen muss, dass die Sozialleistungen (Hartz IV, Grundsicherung) an den Träger überwiesen werden und man von dort immer ein Taschengeld bekommt. Nur bei wenigen ist es wissentlich so, dass man die Leistungen auf ein eigenes Girokonto überweisen lassen kann.

Taschengeld-Regelung heißt jedoch nicht, dass man seine vollen Leistungen auch wieder zurückbekommt. Ein Teilbetrag wird für Verpflegung einbehalten, den man sich dann wieder als Verpflegungsgeld ausbezahlen lassen kann, wenn man sich selbst versorgen möchte. Zwei mal im Jahr kann man sich Kleidergeld auszahlen lassen. Die größte Summe geht jedoch für die Betreuung drauf. Das heißt sozusagen dass betroffene Menschen das System der Unterkünfte bei der Obdach- und Wohnungslosenhilfe selbst finanzieren. Eigentlich wird es doppelt finanziert. Abhängig davon auf Grund von welchem Paragraphen man in einer Unterkunft aufgenommen wird, springen in Köln die Stadt Köln beziehungsweise der Landschaftsverband Rheinland als Kostenträger ein. Das heißt die Betreiber der Einrichtungen bekommen zweimal Kohle.

Das die Menschen selbstbestimmt, frei und menschenwürdig leben können, damit einhergehend die Möglichkeit sich selbst versorgen zu können, muss absolute Priorität haben.

 
Weiterlesen...

from nandabanda

Zepeto Hack Cheats Get Unlimited Coins And Tips & Tricks For Zepeto Coins Zepeto Cheats are available for browser, Android and iOS! With its help, you will be able to get unlimited Coins! It’s extremly easy to use and there is no need to download anything. This Zepeto Online Cheat was just released and its purpose is to easily give you as many Coins as you need without spending your money. So if you’re looking for a way to get easy Coins, this is the best place for you. Our Zepeto Guide is the best, it contains detailed instructions, so everyone will be able to use it!

Go to – https://store.gamesdynamo.com/zepeto-hack-coins-generator-online-2/

Zepeto is a popular game recently released on iOS and Android. You can make yourself a cute 3-d character by using a wide variety of customized alternatives. You’re able to adjust many factors of the character such as hair shade, eye shape and so on. In case you aren’t satisfied along with your first made character, you may rebuild it until you are satisfied with it. There are plenty of things you need to learn about the game, our Zepeto cheats and suggestions will enable to do anything you want! It’s not that easy to create a working Zepeto Cheat that works perfect, but we managed to do it, so feel free to try it right away!

Go to – https://store.gamesdynamo.com/zepeto-hack-coins-generator-online-2/

If you love social video games, then you will love this! Our new Zepeto Cheats work on every device and we make sure to bring you new updates every week! We hope you will enjoy new features that are going to be released! For now, you can get unlimited Coins, but we plan to implement more stuff! Our Zepeto Cheats are safe to use, and we recommend you to try it right away! If you have any questions, feel free to leave a comment!

Go to – https://store.gamesdynamo.com/zepeto-hack-coins-generator-online-2/

Tags – Zepeto Hack android, Zepeto Cheat, Zepeto Cheats, Zepeto Hack no survey, Zepeto nedlasting, Zepeto hack herunterladen, Zepeto hacka ladda, Zepeto hackear baixar, Zepeto hackear descarga, Zepeto hakata ladata, Zepeto hacke laste ned, Zepeto cheat without taking any survey, Zepeto triche, Zepeto astuce, Zepeto trucchi, Zepeto astuces, Zepeto mod apk, mod for Zepeto, Zepeto money hack, Zepeto Glitch ios, Zepeto Money Glitches, how to hack Zepeto 2019, Zepeto Coins Hack No Human Verification, Zepeto Codes, Triche pour Zepeto, Zepeto codigo,

 
Read more...

from Byte for your thoughts

Advanced use cases

In this part of CLI development series I'll go over some of the more advanced use cases. I've previously discussed general tips for making command line apps nice to use. If you missed that blog post you can find it here.

As use cases grow more complex it makes more and more sense to look for existing solutions and reuse / incorporate them into our own applications. That's why I'll devote more space in this post to highlighting existing projects, as opposed to talking about my own experiences.

Source code generation

One use case where CLIs excel is project scaffolding and code generation. For example of such apps you can take a look at Yeoman and its list of generators. Yeoman itself is oriented towards web development, although its most popular generator JHipster outputs Spring Boot applications. As a side note, if you ever find yourself with some spare time, checking out JHipster is a wonderful way to spend few hours. One more old school example of project scaffolding in Java world are Maven archetypes.

If you look at those examples you will quickly find that they provide rich set of features and customizations. One thing that most dedicated code generation tools have in common is a plugin system that allows users to define their own templates. If code generation is your primary use case, developing a plugin for an existing tool is a good idea. That approach will save you a lot of time and you'll end up with a more polished product.

On the other hand, there are CLIs that offer code generation as an addition to their core features. For example think of init commands in tools like npm or git. Extracting scaffolding features out of these tools and delegating it to dedicated code generations apps would be detrimental to user experience. If you find yourself in a similar situation you should implement code generation within your CLI instead.

Most popular approach to code generation is to treat source files as plain text. In order to generate them you will need a good templating library. I've had to use some clumsy and cumbersome templating libs in legacy projects so I appreciate the importance of picking a library that works for you. One experiment I like to do when evaluating a templating library is to try to make a template for serializing some data structure into a pretty formatted json. Json format has a few tricky rules, like requiring comma after all but the last property, escaping quotes in string values, proper indentation for pretty format etc. If a templating library makes writing json templates enjoyable you'll probably have no problems with source code.

One last trick that can simplify source code generation is running output of your CLI through standard formatters for the language you are generating. This doesn't work if there are competing formatting standards, or if community uses widely different formats. Example of this would be Java world where no two code bases look the same. On the other hand, Go programming language comes with prescribed gofmt formatter that code generation tools use. Having properly formatted source code becomes important when it comes to pull requests and similar situation that require diffing 2 files / versions.

Introspection

Another advanced use case for CLIs is source code analysis. This one is more complicated that source code generation. While generation can be implemented using text manipulation, in order to analyze source code you will generally need to tokenize it and build a syntax tree out of it. This is getting away from templating and into compiler theory.

Fortunately, most modern languages provide tools for introspection of their own source code. So, if you know you'll need to analyze Java code it might be a good idea to write your CLI in Java. You can probably find a library for parsing your language of choice, which you can reuse in your tool.

Problems with this approach arise if you need your tool to analyze multiple languages. One example of this is code editors and IDEs. A common solution for that type of apps is to use Language Server protocol to communicate to dedicated language server implementations. That way the application code is decoupled from language servers which can be implemented for each language. A more advanced example is source{d} engine, an application for source code analysis. Under the hood it is using Babelfish, a universal code parser that can produce syntax trees for various languages. Like LSP, it too has dedicated language drivers executing in separate Docker containers that communicate with a single app server over gRPC.

If your CLI requires analysis of source code from multiple languages you should probably use one of existing solutions. If features of LSP are enough for you that seems like the most widely adopted solution. If you need full flexibility of abstract syntax trees, then Babelfish might be a bit more complex, but more powerful solution.

Text-based UI

You might find that a simple loop of reading the arguments, processing them and outputting results is no longer enough for your use case. Processing can be complex, so you may need to update users on it's progress. You may need extra input from your users. Workflow you are implementing might be complex and require continuous interaction from users. At this point you may need to build a Text-based User Interface (TUI).

Input prompts are the most basic use case. Example of this is how npm init (and may other scaffolding tools) guide users through process of setting up a project. When designing such interactions you should allow for all prompts to be customized with CLI flags, so that command can execute without any prompts. Common pattern for doing this is to add a -y / --yes flag that will automatically accept default options. In doing this you will make your command usable by larger scripts for which user interaction is impractical.

Next up, there's the use case of informing users of the progress of CLI command execution. Modern dependency management tools (again npm is a good example) will display a live progress bar while downloading dependencies. Another example is HTTP load testing tool vegeta. It can dynamically output the progress of a stress test while its running. It also does something interesting: it allows you to pipe its output through a formatter tool to a dedicated plotting terminal application jplot. Jplot then renders live charts in the terminal. This is a good pattern to follow if you need live plotting and don't feel like re-implementing it yourself.

Lastly, there are full-blown TUI applications, starting with “simple” ones like htop and on to the likes of vim and emacs. If you are thinking of building similar TUI apps you should be able to find a framework in your language of choice that can help with laying out your application's UI elements. However, if you are expecting other developers' contribution to your application, it might be a better idea to go with something like a web app UI. That way you will have a larger pool of contributors to attract to your project.

What I did

In the CLI I built for work I implemented some code generation features. For project scaffolding I actually reused an existing parent project that all subsequent ones fork off of. Because of this my init command basically does a shallow git clone of the parent repository.

I also implemented an add commands for generating config and code required to expose a new API endpoints. Since I picked Go for my language I went with standard library's template package. I found it expressive enough to write all my templates and generate properly formatted json, Groovy and Kotlin code. It has just enough features for all my use cases, and not too many as to make it complicated to use. Much like Go language itself, using it was a zen-like experience.

I did not have any use for code analysis or TUI in that particular project. However, I've recently been playing around with termui, a terminal dashboard library also written in Go. It's easy enough to work with, but my use cases are not all that advanced either.

In conclusion

This blog post concludes the series on CLI development. You can find first post that deals with picking the technology and distribution stack here, and general CLI usability tips here. While the series is done, I might have some more thought on CLI development in the future. In case you are interested in this type of content, you can:

 
Read more...

from Mauthausen-Gusen

 
Read more...

from Mauthausen-Gusen

 
Read more...

from FeaturePoints Hack Unlimited Points In Feature Points Hack

FeaturePoints Hack – How To Get Unlimited Points In Feature Points Hack And Cheats And there you go. Here goes the best of our work. Our FeaturePoints Hack gives you Unlimited FeaturePoints you wanted and more. The best about it? It’s Free. Our propertiary technology connects to Feature Points servers directly, hence it can’t be patched. Why we share it at no cost at all? Our mission is to give you all the Feature Points. Try our tool today and check this out!. Hate the rich kids and want to have all this exclusive content in your game? Want to make your account a lot of Feature Points? Give our cheats a try.

Go to – https://store.gamesdynamo.com/featurepoint-hack/

Our Cheat allows you to add an infinite number of Feature Points to your account infinite number of times! Ask how is this possible? It’s easy! Our program connects to the database service accounts all s Feature Points and converts the individual bits and replaces the value of your Points on the Feature you specified in the program! Does not it look beautiful? In the program have included many useful things such as PROXY !. With this little thing by adding yourself points for different accounts do not get banned. You simply undetectable. We put a mask on your mac/ip‑ address and other stuff to fool the system of Feature Points. Feature Points Hack works on Windows as well as on the Mac and Linux platform. Check out our Feature Points Cheat and leave a comment! Thank you!

Go to – https://store.gamesdynamo.com/featurepoint-hack/

Go to – https://store.gamesdynamo.com/featurepoint-hack/

Tags – feature points,feature points hack,featurepoints code,featurepointsgenerator.tk,feature points reddit,feature points scam,feature points generator,feature points apk,feature points cheat,feature points glitch,feature points app,featurepoints safe,feature points app download,featurepoints android,feature points alternative,feature points app review,feature points android hack,feature points app hack,feature points adder,feature points app iphone,feature points virus,is featurepoints a safe app,feature points bot,feature points bonus code,feature points bad,feature points buddy,feature points buddy download no survey,feature points bluestacks,feature points best referral code,feature points buddy download,feature points buddy no survey,feature points buddy free download,feature points clash of clans,featurepoints.com sign up,featurepoints.com review,feature points cydia hack,feature points referral code,feature points cydia,feature points code hack,featurepoints c'est quoi,feature points download,feature points download apk,feature points download android,feature points download for iphone,feature points doesn't work,feature points does it work,feature points definition,feature points double points,feature points detection,feature points delete,feature points plus d application,feature points email,feature points expired,feature points exploit,feature points enter referral code,feature points error connecting to server,feature points error connecting to google,feature points error,feature points erfahrungen,feature points españa,feature points error connecting to facebook,feature points e seguro,featurepoints facebook,featurepoints free gift cards apk,feature points faq,featurepoints free gift cards,featurepoints free download,feature points for android,feature points friends,feature points forum,feature points for iphone,feature points for clash of clans,feature points glitch 2015,feature points glitch android,feature points generator 2015,feature points glitch 2016,feature points generator.tk,feature points gift cards,feature points guide,feature points get more points,feature points hack 2015,feature points hack apk,feature points hack cydia,feature points hack 2016,feature points hack tool,feature points help,feature points hack android,feature points hack 2013,feature points hack no survey,featurepoints ios,feature points ipad,feature points is it safe,feature points ios hack,feature points invite code,feature points itunes gift card,feature points isn't working,feature points india,feature points iphone 6,feature points ios 6,feature points jailbreak,feature points jailbreak hack,featurepoints hack jailbreak,feature points hack july 2013,feature points hack no jailbreak,feature points cheat no jailbreak,feature points hack working july 2013,feature points jeuxvideo.com,feature points kiem tien,featurepoints khong co app,feature points kullanımı,featurepoints không cộng điểm,klt feature points,feature points game killer,feature points for kindle,feature points para kazanma,feature points nasıl kullanılır,feature points login,featurepoints legit,feature points legit hack,feature points like apps,is featurepoints legal,feature points link,feature points link expired,feature points logo,feature points là gì,is featurepoints legit yahoo,feature points mod apk,feature points mod,feature points madden mobile,feature points mod apk download,feature points mac,feature points mod aptoide,feature points multiple accounts,feature points multiple devices,feature points more offers,feature points meaning,feature points not working,feature points not giving me points,feature points no apps to download,feature points not getting points,feature points new account,feature points no offers,feature points not downloading,feature points not receiving points,feature points not working on android,feature points not in app store,featurepoints out of stock,feature points on android,feature points online,feature points online hack,feature points offers,feature points on ipad,feature points opencv,feature points on pc,featurepoints or freemyapps,feature points or appbounty,como usar o featurepoints,feature points o co chodzi,featurepoints pc,feature points pending,feature points paypal,feature points points,feature points point adder,feature points portal,feature points points generator,feature points pc download,feature points pending apps,feature points profile won't install,featurepoints p&d,feature points questions,feature points que es,feature points para que sirve,feature points referral code hack,is featurepoints real,feature points real or fake,feature points referral code hack 2014,feature points referral hack,feature points referral link,feature points rewards list,feature points redeem codes,featurepoints // r=none,www.featurepoints/r/rzss9o,feature points sign up,feature points sign in,feature points support,feature points steam,feature points similar,feature points sponsorship,feature points starbucks,feature points sold out,featurepoints tumblr,featurepoints twitter,feature points tips,feature points tricks,feature points tutorial,feature points top eleven,feature points tinhte,feature points terms,feature point tracking,feature points thebotnet,feature points unlimited points,feature points update,feature points unlimited points apk,feature points unlimited points 2015,feature points username,feature points unlimited points 2014,feature points udid faker,udid feature points,feature points unlimited points hack,feature points us only,feature points vs appnana,feature points vpn,feature points video,feature points vs function points,feature points and free my apps,appbounty vs feature points,vpn one click feature points,feature points velocity,feature points vpn sorunu,feature points website,feature points won't work,feature points words their way,feature points won't give me points,feature points wiki,feature points windows phone,feature points work,feature points web,feature points wikipedia,feature points worth it,feature points xbox one,feature points youtube,feature points yahoo answers,feature points yahoo,feature points hack yahoo answers,does feature points work yahoo,feature points uygulama yok,feature points 1 amazon,feature vertices to points arcgis 10,feature vertices to points 10.1,feature vertices to points 10.2,feature points 2015,feature points 2016,feature points 2015 hack,feature points 2014,feature points 2,feature points 2013,feature points 2013 hack,feature points glitch 2013,feature points code 2014,feature points 3d,40 plot points feature films,feature points 4pda,feature points $5 paypal,feature points 5000,feature points iphone 5s,feature points iphone 5,feature points 6000,feature points 60000,feature points ios 7,feature vertices to points arcgis 9.3

 
Read more...

from Byte for your thoughts

Command line citizen

Continuing with series on development of command line tools, this week I'll look into more practical tips for making a CLI app that's nice to use. If you missed the first part where I discussed picking the language for your app you can find it here. Like I mentioned in the first post, what follows are just some of my own opinions, tips and tricks.

Arguments and flags

On the most basic level users interact with your app by invoking commands and sub-commands, and by passing arguments and flags to them. Maintaining a consistent and intuitive set of commands, arguments and flags makes for a better user experience. Here are a few to keep in mind when defining them:

  1. Keep command names short and intuitive. They should be easy to remember. You can define several aliases for the same command. For example you can make both new and init commands do the same thing.

  2. Provide helpful error message in case user attempts to invoke a non existing command. A good example of this is how git will suggest similar sounding alternative:

    $ git stats
    git: 'stats' is not a git command. See 'git --help'.
        
    The most similar command is
        status
    
  3. Define a short version for commonly used flags. One convention is to use double dash for full name and single dash for short name. Also, you can group short flags behind a single dash. For example docker run -it image is same as docker run --interactive --tty image.

  4. For extra credits add auto-completion support. Covering bash and perhaps zsh can make most of your users happy.

Common commands

There are some commands that many CLIs could benefit from. One example is a help command that exposes the documentation from within the app itself. Another one is version. Try to keep consistent format for the version number. Semantic versioning is always a good option.

If there's some kind of project setup, like scaffolding of new project or initialization of CLI configuration files, automate that with an init command. Examples of this include git init and npm init.

In case your CLI requires some specific setup on the local machine for some or all of its functions, it's a good idea to build a doctor command that verifies the local setup and offers instructions for fixing it. For examples check out npm doctor and flutter doctor. I've found that giving users a diagnostic tool like that makes supporting your CLI way easier.

Providing help

Regardless of how logically laid out the CLI commands seem to you, your users will manage to get lost. Having an always present and accessible help system helps with that. Make sure that every command supports the --help flag.

Get into a habit of writing help documentation for your commands. Think of it in same way you think of tests. Your command is not done without it. I find it interesting to use a documentation first approach and write the docs before implementation. Document, implement, refactor loop works well too. Docs don't have to be super detailed or cover all the features from the start. You can add details as your command develops, and you can go back and rephrase parts of it later. The trick is to have some docs from the beginning, and keep iterating on them.

When it comes to presentation, make sure help is accessible from the CLI itself. Depending on platform your users may expect docs to be available in a dedicated format as well. For example man pages on Linux. You might also want to package your docs as markdown and include it in your git repository. Most git servers like GitHub, GitLab and Bitbucket will nicely render markdown files. If that's not enough you can go one step further with dedicated GitHub wiki or a GitHub pages page.

When it's time to quit

By now your users can find their way around your well structured commands, and thy know where to look for help. They are happily using your tool, until they encounter some long running CLI process and they decide to quit. When that time comes, try not to turn your app into an Internet meme:

I've been using VIM for about 2 years now, mostly because I can't figure out how to exit it.

Average VIM user

You should listen to kill signals from the OS (like SIGINT and SIGTERM) and handle them by terminating your app. Perform any cleanup you need, like flushing files and stopping background processes, but make sure app exits in the end.

Miscellaneous tips

A few more random tips:

  1. Provide a global flag for controlling output verbosity level. No-one likes overly chatty apps, but having no debugging output when something goes wrong is worse. Add --verbose flag to all of your commands so your users can pick level they need.

  2. Provide users with a way to format the CLI output. Tabulated format is nice for showing results in a terminal. However, piping results to another command would benefit from more straightforward, simpler formatting. For an example of rich formatting support take a look at docker formatting.

  3. Allow users to define commonly used settings and flags in a configuration file. If your use-case revolves around working with individual projects, add support for project-level configuration, like git does.

What I did

Taking care of all the things mentioned above gets easier if you start with a feature rich framework. For my needs I picked Cobra, a well established library in the Go community. It's used by Docker, Kubernetes and etcd, to name a few. Other languages / ecosystems will have other popular frameworks. Take time to find one that fits your needs and coding style. You can often find them by looking at popular CLI tools written in a given language. For example, Heroku CLI is a Node app, and uses the oclif framework.

Next up

That wraps up the discussion of general patterns for making CLIs that are nice to use. In the next post of the series I'll go into more advanced use cases that CLI tools are good for. If that sounds interesting, you might want to:

 
Read more...

from Qua info

Last night my mastodon account at https://todon.nl got silenced and removed within a timespan of 12 hours (most of which I was asleep), so I also do not have an export of my data, which is why I'm writing here to reach Qua.name users.

I'm not even sure what I did exactly to offend the administrator, but fact is that I have to change accounts.

As the todon.nl account has been deleted, followers won't see the usual 'mrb has moved to..' signal in the profile, so I am going over the places which used the account as a contact point.

The new account is @mrb@mastodon.nl

You may want to update your subscriptions.

 
Read more...

from El blog de Juan

Por cuestiones de trabajo, he tenido la necesidad de mudarme a un pueblo lejos de la ciudad, un pequeño pueblo pesquero de unos tres mil habitantes. No es que yo viviera en la capital del mundo, pero sí en la capital de mi estado, y como tal, vivía en una ciudad pequeña, pero con la inseguridad, la indiferencia y los servicios públicos y privados que se puede esperar de una población urbana. Si bien mi conexión a internet no era la mejor, e incluso muchas veces renegué de ella, lo cierto es que me funcionaba para ver videos a 720p, navegar de una manera decente en internet y mantener mi instalación de Arch Linux al día. Nada de eso puedo hacer ahora, al menos no con la misma facilidad.

El internet en el pueblo donde llegué es sencillamente malo. Las velocidades de descarga son de 50 kbps en sus mejores momentos y ver videos, incluso a 144p, es a veces imposible. Los datos móviles no son una opción tampoco pues no alcanzamos ni el 3G. En esta situación, poco antes de mi viaje decidí formatear mi partición root y decirle adiós a Arch, al menos por un año, y reemplazarla por Debian 10.

No es la primera vez que uso una distro basada en Debian, mas si la primera vez usando el mismo Debian, y la verdad, he encontrado más dificultades aquí que en Arch. Uno pensaría que por tener un instalador CLI, configurar el sistema sería difícil, pero es curioso como en Debian he tenido más problemas para dejar funcionando ciertos paquetes.

En primer lugar me decanté por la versión net-install con una configuración muy mínima, pues al usar BSPWM no necesito un entorno de escritorio completo. Ya estaba preparado para encontrarme con paquete viejos (bspwm está como 3 versiones atrasado), lo que no esperaba era que, a pesar de presumir más de 86 mil paquetes en sus repos, paquetes como Polybar o Light no están disponibles, y su instalación desde el código fuente puede ser dolorosa, puesto que las dependencias usan nombres diferentes en Debian y están más segmentadas: lo que en Arch era uno o dos paquetes en Debian son cinco o seis. Cabe decir que varios de mis scripts simplemente no funcionaron en Debian y tuve que hacerles ciertas modificaciones.

En cuanto al tema de la estabilidad, bueno, hasta ahora, no me ha crasheado ningún programa solo o me ha dado un comportamiento extraño, solamente Flameshot se traba si establezco una ruta para guardar las fotos en la línea de comandos, y Dunst se niega a arrancar automáticamente mediante D-bus como lo hacía en Arch, aunque es pronto para dar una opinión completa.

En resumen, durante estas dos semanas, usar Debian ha sido algo interesante, he podido restaurar mi workflow casi por completo, y digo casi porque quizá se me esté olvidando algo. No obstante, debo decir que la experiencia para mi, en Arch, fue superior en los primeros días, y extraño aspectos como AUR que facilita muchísimo la instalación de paquetes fuera de los repos oficiales, pero ya que depende muchísimo del internet me fue necesario migrar a otra distribución. Esperaré a las siguientes semanas para fijar definitivamente una opinión, por ahora hace un muy buen trabajo, pero no me ha hecho olvidar a mi querido Arch Linux.

Finalmente les dejo una captura de mi escritorio como luce actualmente:

Rice

 
Leer más...

from veer66

code แค่นี้เลย

fn cnt_links(s: usize, e: usize, tu: &Textunit, en_sent: &RTok) -> usize {
    tu.links.iter()
        .filter(|link| link.target > s && link.target < e)
        .filter(|link| link.source >= en_sent.s && link.source < en_sent.e)
        .count()
}

พอเขียน test แบบยาว ก็เจอจุดพัง

#[test]                                                                                                                                                
    fn cnt_links_simple() {
        let tu = Textunit {
            bi_text: BiText { source: String::from(""),
                              target: String::from(""),
            },
            bi_rtoks: BiRToks {
                source: vec![RTok {s:100, e:101, text: String::from(" ")},
                             RTok {s:102, e:103, text: String::from(" ")},],
                target: vec![RTok {s:300, e:301, text: String::from(" ")},
                             RTok {s:302, e:303, text: String::from(" ")},],
            },
            links: vec![Link {source: 0, target: 1},
                        Link {source: 1, target: 0}],

        };
        let en_sent = RTok {s: 302, e:303, text: String::from(" ")};
        assert_eq!(cnt_links(0, 1, &tu, &en_sent), 1);
    }

ระบบ type ช่วยอะไรไม่ค่อยได้เพราะมันเป็น integer หมด ยกเว้นจะใช้ type แบบที่มีหน่วยได้ แต่แบบนั้นก็ไม่รู้ว่าโปรแกรมจะยาวกว่านี้อีกเปล่า

รู้สึกว่าปัญหาของโปรแกรมนี้หลัก ๆ เลยคือ test มันยาวเกิน

 
Read more...

from Byte for your thoughts

I've recently been working a lot with Spring Cloud Gateway. It's been (mostly) a pleasant experience, but I do encounter some annoying quirks from time to time. This is a story about one of them.

Use-case

A few days ago I was debugging an issue at work when a backend microservice developer that my API Gateway proxies to asked me to try using keep-alive connections. The request sounded reasonable enough, adding headers to downstream request is easy in Cloud Gateway. I already have few headers that I'm adding.

Hold my beer. I got this.

me, going into this

setRequestHeader

I configure my Spring Gateway routes programmatically, so adding headers to request looks something like this:

builder.routes()
  .route(r -> r.path("/foo/bars")
    .filters(f -> f.setRequestHeader(HttpHeaders.CONNECTION, "keep-alive"))
    .uri(backendUrl))
  .build();

I already had my route set up, so all I needed to add was the setRequestHeader line. So far so good.

Signs of trouble

Next up, I updated tests to check for the new header. This is where I detected the problem. I use WireMock to simulate backend services in tests. Checking requests that API Gateway sends downstream is straightforward:

verify(getRequestedFor(urlEqualTo("/foo/bars"))
  .withHeader("Connection", equalTo("keep-alive"))
);

And the test failed. Here's what WireMock told me:

No requests exactly matched. Most similar request was:  expected:<
GET
/foo/bars

Connection: keep-alive
> but was:<
GET
/foo/bars

Basically, requests were going through, the route was properly sending them to mocked backend service, but Connection header was missing.

Debugging

Having a test that fails consistently was useful, because it allowed me to debug the issue. I put my first breakpoint inside SetRequestHeaderGatewayFilterFactory class. That's where GatewayFilter that sets headers is implemented. I ran my test and everything looked good. Connection header was added to mutated request, and mutated exchange was passed on to filter chain.

Next up, I decided to look into NettyRoutingFilter. That's where Spring Cloud Gateway makes HTTP requests to backend services. I put a break point at the start of filter method and inspected the exchange parameter. My Connection header was there. I proceeded to read the rest of the method, and found this line:

HttpHeaders filtered = filterRequest(getHeadersFilters(), exchange);

Turns out there's a set of HttpHeadersFilters that operate on HTTP headers and can exclude some of the ones previously set by GatewayFilters. In my particular case the culprit was RemoveHopByHopHeadersFilter. As its name suggests, its function is to remove headers that are only relevant for requests between client and API Gateway, and not intended to be proxied to backend services. In this particular case, I wanted to retain the Connection header. Fortunately RemoveHopByHopHeadersFilter can be configured with external configuration.

Solution

The solution was to add the following:

spring.cloud.gateway.filter.remove-hop-by-hop.headers:
    - transfer-encoding
    - te
    - trailer
    - proxy-authorization
    - proxy-authenticate
    - x-application-context
    - upgrade

to application.yaml config file. With that RemoveHopByHopHeadersFilter no longer removed the Connection header. Tests passed, I deployed API Gateway and backend services handled themselves better.

Example

I've created a demo project that illustrates this issue and the solution. You can find it on GitHub. Feel free to play around with it, and if you find additional issues, or better solutions, please let me know about them at:

 
Read more...