# HTML5

Published articles for HTML5.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## htmx 4.0: a Fetch-Based Rewrite, Built-In Morphing Swaps, and Explicit Attribute Inheritance

DevFeed: [htmx 4.0: a Fetch-Based Rewrite, Built-In Morphing Swaps, and Explicit Attribute Inheritance](<https://devfeed.tech/articles/htmx-4-0-a-fetch-based-rewrite-built-in-morphing-swaps-and-explicit-attribute-inheritance-42775.md>)

Original publisher: [Read original article](<https://www.infoq.com/news/2026/09/htmx-4-released/>)

Author: Daniel Curtis

Published: 2026-09-18T09:32:00Z

Content type: news

Language: en

Sources: [InfoQ](<https://devfeed.tech/sources/infoq.md>)

Topics: [htmx](<https://devfeed.tech/topics/htmx.md>), [fetch](<https://devfeed.tech/topics/fetch.md>), [Library](<https://devfeed.tech/topics/library.md>), [Document Object Model (DOM)](<https://devfeed.tech/topics/dom.md>), [Streaming](<https://devfeed.tech/topics/streaming.md>), [API](<https://devfeed.tech/topics/api.md>), [Inheritance](<https://devfeed.tech/topics/inheritance.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [Ajax](<https://devfeed.tech/topics/ajax.md>), [CSS](<https://devfeed.tech/topics/css.md>), [npm](<https://devfeed.tech/topics/npm.md>), [WebSocket](<https://devfeed.tech/topics/websocket.md>)

Tags: [ajax](<https://devfeed.tech/tags/ajax.md>), [api](<https://devfeed.tech/tags/api.md>), [css](<https://devfeed.tech/tags/css.md>), [development](<https://devfeed.tech/tags/development.md>), [elements](<https://devfeed.tech/tags/elements.md>), [fetch](<https://devfeed.tech/tags/fetch.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [htmx](<https://devfeed.tech/tags/htmx.md>), [htmx-4-released](<https://devfeed.tech/tags/htmx-4-released.md>), [inheritance](<https://devfeed.tech/tags/inheritance.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [library](<https://devfeed.tech/tags/library.md>), [news](<https://devfeed.tech/tags/news.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [npm](<https://devfeed.tech/tags/npm.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [server-side-rendering](<https://devfeed.tech/tags/server-side-rendering.md>), [streaming](<https://devfeed.tech/tags/streaming.md>), [web-development](<https://devfeed.tech/tags/web-development.md>)

### AI overview

htmx 4.0 has been released as a major rewrite built on the fetch() API. It adds native streaming, built-in morphing swaps that preserve DOM state, multi-target updates, explicit attribute inheritance, standardized event names, and history refetching. The release is distributed under npm's next tag, while htmx 2.x remains supported.

### Source excerpt

htmx 4 has been released, featuring a transition from XMLHttpRequest to the fetch() API, enhancing streaming capabilities. Key updates include built-in morphing swaps for DOM state preservation and an hx-partial tag for cleaner updates. Attribute inheritance is now explicit, with event names standardized. The library maintains focus on minimal JavaScript while remaining popular among frameworks. By Daniel Curtis

## ESP32 Bit Pirate: Bridging Modern Microcontrollers and Browser-Based Hardware Debugging

DevFeed: [ESP32 Bit Pirate: Bridging Modern Microcontrollers and Browser-Based Hardware Debugging](<https://devfeed.tech/articles/esp32-bit-pirate-bridging-modern-microcontrollers-and-browser-based-hardware-debugging-17393.md>)

Original publisher: [Read original article](<https://www.infoq.com/news/2026/09/esp32-bitpirate-web/>)

Author: Olimpiu Pop

Published: 2026-09-14T06:06:00Z

Content type: news

Language: en

Sources: [InfoQ](<https://devfeed.tech/sources/infoq.md>)

Topics: [ESP32](<https://devfeed.tech/topics/esp32.md>), [HTML5](<https://devfeed.tech/topics/html5.md>), [browsers](<https://devfeed.tech/topics/browsers.md>), [Hardware](<https://devfeed.tech/topics/hardware.md>), [C++](<https://devfeed.tech/topics/c-plus-plus.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>)

Tags: [browser](<https://devfeed.tech/tags/browser.md>), [browsers](<https://devfeed.tech/tags/browsers.md>), [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [command-line](<https://devfeed.tech/tags/command-line.md>), [debugging](<https://devfeed.tech/tags/debugging.md>), [development](<https://devfeed.tech/tags/development.md>), [development-tools](<https://devfeed.tech/tags/development-tools.md>), [embedded-devices](<https://devfeed.tech/tags/embedded-devices.md>), [embedded-software-dev](<https://devfeed.tech/tags/embedded-software-dev.md>), [esp32](<https://devfeed.tech/tags/esp32.md>), [esp32-bitpirate-web](<https://devfeed.tech/tags/esp32-bitpirate-web.md>), [html5](<https://devfeed.tech/tags/html5.md>), [microcontrollers](<https://devfeed.tech/tags/microcontrollers.md>), [news](<https://devfeed.tech/tags/news.md>)

### AI overview

ESP32 Bit Pirate is a browser-based, multi-protocol debugging platform for ESP32-S3 boards. It uses HTML5 APIs such as Web Serial and WebUSB for firmware flashing, terminal access, documentation, and hardware analysis without requiring local development tools.

### Source excerpt

ESP32 Bit Pirate project integrates multi-protocol debugging within a browser environment using HTML5 APIs. It enables users to install firmware and interact with microcontrollers like the ESP32-S3 directly from the browser. The platform supports various digital and wireless protocols while providing hands-on guidance through practical recipes for tasks such as memory dumping and signal analysis. By Olimpiu Pop

## Why regex isn't email validation

DevFeed: [Why regex isn't email validation](<https://devfeed.tech/articles/why-regex-isn-t-email-validation-16072.md>)

Original publisher: [Read original article](<https://workos.com/blog/why-regex-isnt-email-validation>)

Author: WorkOS

Published: 2026-08-24T00:00:00Z

Content type: article

Language: en

Sources: [WorkOS Blog](<https://devfeed.tech/sources/workos-blog.md>)

Topics: [Parsing](<https://devfeed.tech/topics/parsing.md>), [Forms](<https://devfeed.tech/topics/forms.md>), [HTML5 and CSS3 tricks](<https://devfeed.tech/topics/html5-and-css3-tricks.md>), [Library](<https://devfeed.tech/topics/library.md>), [Internet](<https://devfeed.tech/topics/internet.md>)

Tags: [advice](<https://devfeed.tech/tags/advice.md>), [deliverability](<https://devfeed.tech/tags/deliverability.md>), [domain](<https://devfeed.tech/tags/domain.md>), [email](<https://devfeed.tech/tags/email.md>), [forms](<https://devfeed.tech/tags/forms.md>), [framework](<https://devfeed.tech/tags/framework.md>), [html5](<https://devfeed.tech/tags/html5.md>), [internet](<https://devfeed.tech/tags/internet.md>), [library](<https://devfeed.tech/tags/library.md>), [regex](<https://devfeed.tech/tags/regex.md>), [validation](<https://devfeed.tech/tags/validation.md>)

### AI overview

The article explains that email syntax validation with regexes, HTML5 checks, or framework libraries does not establish deliverability or confirm that a mailbox exists. It recommends a loose syntax check and stopping there, while recognizing that stronger checks address separate, less reliable questions.

### Source excerpt

Checking that an address looks right and checking that it can receive mail are different problems. Most signup forms only solve the first one.

## Testing That a Canvas Diagram Actually Painted Pixels

DevFeed: [Testing That a Canvas Diagram Actually Painted Pixels](<https://devfeed.tech/articles/testing-that-a-canvas-diagram-actually-painted-pixels-34098.md>)

Original publisher: [Read original article](<https://philipptheserver.com/posts/canvas-pixel-testing/>)

Author: Philipp Lehmann (philipp.lehmann@gruppe.ai)

Published: 2026-07-21T07:00:00Z

Content type: tutorial

Language: en

Sources: [Philipp Lehmann](<https://devfeed.tech/sources/philipp-lehmann.md>)

Topics: [Canvas](<https://devfeed.tech/topics/canvas.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Playwright](<https://devfeed.tech/topics/playwright.md>), [Document Object Model (DOM)](<https://devfeed.tech/topics/dom.md>), [browser](<https://devfeed.tech/topics/browser.md>)

Tags: [browser](<https://devfeed.tech/tags/browser.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [frontend](<https://devfeed.tech/tags/frontend.md>), [html5](<https://devfeed.tech/tags/html5.md>), [playwright](<https://devfeed.tech/tags/playwright.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This tutorial explains why DOM-based tests can pass even when an HTML5 canvas renders nothing. Because canvas pixels are not represented in the DOM and jsdom does not provide real canvas rendering, it recommends using Playwright with a real browser and checking pixel data with getImageData.

### Source excerpt

getImageData in Playwright to assert a canvas actually drew pixels, since jsdom has no canvas renderer and DOM assertions pass on a blank canvas.

## One-Shot Any Web App with Gradio's gr.HTML

DevFeed: [One-Shot Any Web App with Gradio's gr.HTML](<https://devfeed.tech/articles/one-shot-any-web-app-with-gradio-s-gr-html-7227.md>)

Original publisher: [Read original article](<https://huggingface.co/blog/gradio-html-one-shot-apps>)

Author: yuvraj sharma; hysts; Freddy Boulton

Published: 2026-02-18T00:00:00Z

Content type: article

Language: en

Sources: [Hugging Face - Blog](<https://devfeed.tech/sources/hugging-face-blog.md>)

Topics: [web applications](<https://devfeed.tech/topics/web-applications.md>), [modern web development](<https://devfeed.tech/topics/modern-web-development.md>), [HTML5 and CSS3 tricks](<https://devfeed.tech/topics/html5-and-css3-tricks.md>), [React UI animations](<https://devfeed.tech/topics/react-ui-animations.md>)

Tags: [3d](<https://devfeed.tech/tags/3d.md>), [app](<https://devfeed.tech/tags/app.md>), [artificial-intelligence](<https://devfeed.tech/tags/artificial-intelligence.md>), [claude](<https://devfeed.tech/tags/claude.md>), [community](<https://devfeed.tech/tags/community.md>), [css](<https://devfeed.tech/tags/css.md>), [gradio](<https://devfeed.tech/tags/gradio.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [object-detection](<https://devfeed.tech/tags/object-detection.md>), [python](<https://devfeed.tech/tags/python.md>), [react](<https://devfeed.tech/tags/react.md>), [spaces](<https://devfeed.tech/tags/spaces.md>), [speech](<https://devfeed.tech/tags/speech.md>), [three-js](<https://devfeed.tech/tags/three-js.md>), [transcription](<https://devfeed.tech/tags/transcription.md>), [vibe-coding](<https://devfeed.tech/tags/vibe-coding.md>)

### AI overview

The article shows how Gradio's gr.HTML can create interactive, single-file Python web apps without a separate frontend build step. Examples include timers, a kanban board, visual ML result viewers, 3D controls, and live speech transcription.

### Source excerpt

We're on a journey to advance and democratize artificial intelligence through open source and open science.

## Python 3.12.12, 3.11.14, 3.10.19 and 3.9.24 are now available!

DevFeed: [Python 3.12.12, 3.11.14, 3.10.19 and 3.9.24 are now available!](<https://devfeed.tech/articles/python-3-12-12-3-11-14-3-10-19-and-3-9-24-are-now-available-2376.md>)

Original publisher: [Read original article](<https://blog.python.org/2025/10/python-31212-31114-31019-and-3924-are/>)

Author: Thomas Wouters

Published: 2025-10-09T00:00:00Z

Content type: release

Language: en

Sources: [Python Insider](<https://devfeed.tech/sources/python-insider.md>)

Topics: [releases](<https://devfeed.tech/topics/releases.md>), [HTML5 and CSS3 tricks](<https://devfeed.tech/topics/html5-and-css3-tricks.md>)

Tags: [complexity](<https://devfeed.tech/tags/complexity.md>), [html5](<https://devfeed.tech/tags/html5.md>), [python](<https://devfeed.tech/tags/python.md>), [python-3-10](<https://devfeed.tech/tags/python-3-10.md>), [release](<https://devfeed.tech/tags/release.md>), [releases](<https://devfeed.tech/tags/releases.md>), [security](<https://devfeed.tech/tags/security.md>)

### AI overview

Python 3.12.12, 3.11.14, 3.10.19, and 3.9.24 are security releases. The supplied notes cover libexpat and setuptools updates, ZIP validation, and HTML parsing fixes.

### Source excerpt

[](https://discuss.python.org/t/python-3-12-12-3-11-14-3-10-19-and-3-9-24-are-now-available/104273#p-273973-old-timer-release-party-1)Old-timer Release Party...

## 🖤 Automatic Dark mode for Hugo using Tailwind CSS

DevFeed: [🖤 Automatic Dark mode for Hugo using Tailwind CSS](<https://devfeed.tech/articles/automatic-dark-mode-for-hugo-using-tailwind-css-25241.md>)

Original publisher: [Read original article](<https://kau.sh/blog/dark-mode-hugo-henry-tailwind/>)

Author: Kaushik Gopal

Published: 2025-04-04T23:01:08Z

Content type: tutorial

Language: en

Sources: [Kaushik Gopal's Site](<https://devfeed.tech/sources/kaushik-gopal-s-site.md>)

Topics: [Dark Mode](<https://devfeed.tech/topics/dark-mode.md>), [CSS](<https://devfeed.tech/topics/css.md>), [Tailwind CSS](<https://devfeed.tech/topics/tailwind.md>), [Hugo](<https://devfeed.tech/topics/hugo.md>), [implementation](<https://devfeed.tech/topics/implementation.md>)

Tags: [css](<https://devfeed.tech/tags/css.md>), [dark-mode](<https://devfeed.tech/tags/dark-mode.md>), [html5](<https://devfeed.tech/tags/html5.md>), [hugo](<https://devfeed.tech/tags/hugo.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [scheme](<https://devfeed.tech/tags/scheme.md>), [tailwind](<https://devfeed.tech/tags/tailwind.md>), [tailwind-css](<https://devfeed.tech/tags/tailwind-css.md>)

### AI overview

This tutorial explains how to add automatic dark-mode support to a Hugo site using Tailwind CSS 4.0 and the CSS prefers-color-scheme media feature. The implementation updates theme color variables and adds a dark class to the root HTML element.

### Source excerpt

On a ✈ back home, I decided to add Dark mode support to Henry. Having recently upgraded to Tailwind CSS 4.0, this was a piece of cake to do. I leverage the widely supported CSS @media prefers-color-scheme feature and Tailwind's native dark-mode support. The implementation only required a few changes: 1. update main theme.css ### In my main theme.css file where I declare the existing colors, I add the CSS @media selector for the "dark" variable indicator. @theme { /* henry background */ --color-hbg: var(--color-slate-50); --color-hbg-dark: var(--color-slate-200); /* ... */ } @media (prefers-color-scheme: dark) { .dark { /* henry background */ --color-hbg: #1c2b33; --color-hbg-dark: #152027; /* ... */ } } 2. update base html body ### In my root html page, I simply add the "dark" variable indicator class <html class="dark"> Now CSS automatically knows to pull in the dark variant of colors when the system indicates light/dark mode. There is no step 3! Your browser doesn't support HTML5 video. Download the video instead. This was so easy to do, in fact, that I even managed to catch up on Gladiator II on the plane ride which I personally give a solid 3.0 just for Denzel.

## Why developers should embrace creative coding again

DevFeed: [Why developers should embrace creative coding again](<https://devfeed.tech/articles/why-developers-should-embrace-creative-coding-again-10247.md>)

Original publisher: [Read original article](<https://www.figma.com/blog/why-developers-should-embrace-creative-coding-again/>)

Author: Jake Albaugh

Published: 2025-01-09T00:00:00Z

Content type: article

Language: en

Sources: [Figma Blog](<https://devfeed.tech/sources/figma-blog.md>)

Topics: [creative coding](<https://devfeed.tech/topics/creative-coding.md>), [creative technology](<https://devfeed.tech/topics/creative-technology.md>), [browsers](<https://devfeed.tech/topics/browsers.md>), [Web](<https://devfeed.tech/topics/web.md>), [CSS](<https://devfeed.tech/topics/css.md>), [HTML5](<https://devfeed.tech/topics/html5.md>), [SVG](<https://devfeed.tech/topics/svg.md>), [GSAP](<https://devfeed.tech/topics/gsap.md>), [modern web development](<https://devfeed.tech/topics/modern-web-development.md>), [WebGL](<https://devfeed.tech/topics/webgl.md>), [Figma plugin](<https://devfeed.tech/topics/figma-plugin.md>)

Tags: [animation](<https://devfeed.tech/tags/animation.md>), [browsers](<https://devfeed.tech/tags/browsers.md>), [creative-coding](<https://devfeed.tech/tags/creative-coding.md>), [css](<https://devfeed.tech/tags/css.md>), [design](<https://devfeed.tech/tags/design.md>), [design-tools](<https://devfeed.tech/tags/design-tools.md>), [developers](<https://devfeed.tech/tags/developers.md>), [figma](<https://devfeed.tech/tags/figma.md>), [figma-plugin](<https://devfeed.tech/tags/figma-plugin.md>), [free](<https://devfeed.tech/tags/free.md>), [gsap](<https://devfeed.tech/tags/gsap.md>), [html5](<https://devfeed.tech/tags/html5.md>), [svg](<https://devfeed.tech/tags/svg.md>), [tools](<https://devfeed.tech/tags/tools.md>), [web](<https://devfeed.tech/tags/web.md>), [webgl](<https://devfeed.tech/tags/webgl.md>)

### AI overview

The article argues that developers should revive creative coding by using modern browser capabilities beyond templates and conventional design tools. It highlights HTML5, inline SVG, GSAP animations, WebGL, advanced CSS, responsive features, and newer color spaces such as HSL and OKLCH, along with the CSS color-mix() Figma plugin.

### Source excerpt

Modern browsers have evolved beyond what most design tools can do. It's up to us to break free from templates and tap into the web's true creative potential.

## HTML popover Attribute

DevFeed: [HTML popover Attribute](<https://devfeed.tech/articles/html-popover-attribute-37485.md>)

Original publisher: [Read original article](<https://davidwalsh.name/html-popover-attribute>)

Author: David Walsh

Published: 2024-04-15T11:19:02Z

Content type: tutorial

Language: en

Sources: [David Walsh](<https://devfeed.tech/sources/david-walsh.md>)

Topics: [HTML](<https://devfeed.tech/topics/html.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [CSS](<https://devfeed.tech/topics/css.md>), [User experience (UX)](<https://devfeed.tech/topics/ux.md>)

Tags: [css](<https://devfeed.tech/tags/css.md>), [css-html5](<https://devfeed.tech/tags/css-html5.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [ux](<https://devfeed.tech/tags/ux.md>)

### AI overview

This tutorial explains how to create a native HTML modal with the popover attribute, using a trigger attribute and an element to identify the popover content. It also shows how CSS can style the modal's background layer.

### Source excerpt

Modals have been an important part of websites for two decades. Stacking contents and using fetch to accomplish tasks are a great way to improve UX on both desktop and mobile. Unfortunately most developers don't know that the HTML and JavaScript specs have implemented a native modal system via the popover attribute -- let's check [...] The post HTML popover Attribute appeared first on David Walsh Blog.

## How to Override width and height HTML attributes with CSS

DevFeed: [How to Override width and height HTML attributes with CSS](<https://devfeed.tech/articles/how-to-override-width-and-height-html-attributes-with-css-37475.md>)

Original publisher: [Read original article](<https://davidwalsh.name/css-override-width-height>)

Author: David Walsh

Published: 2024-02-05T11:28:01Z

Content type: tutorial

Language: en

Sources: [David Walsh](<https://devfeed.tech/sources/david-walsh.md>)

Topics: [CSS](<https://devfeed.tech/topics/css.md>), [HTML](<https://devfeed.tech/topics/html.md>), [Responsive Design](<https://devfeed.tech/topics/responsive-design.md>), [html elements](<https://devfeed.tech/topics/html-elements.md>), [Web Development](<https://devfeed.tech/topics/web-development.md>)

Tags: [css](<https://devfeed.tech/tags/css.md>), [css-html5](<https://devfeed.tech/tags/css-html5.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [image](<https://devfeed.tech/tags/image.md>), [responsive-design](<https://devfeed.tech/tags/responsive-design.md>)

### AI overview

This tutorial explains how CSS can override HTML width and height attributes for images. It discusses preserving image dimensions for layout performance while using responsive styling to avoid distorted images.

### Source excerpt

One of the HTML elements that frequently comes into collision with CSS is the img element. As we learned in Request Metrics' Fixing Cumulative Layout Shift Problems on DavidWalshBlog article, providing image dimensions within the image tag will help to improve your website's score. But in a world where responsive design is king, we need [...] The post How to Override width and height HTML attributes with CSS appeared first on David Walsh Blog.

## AutoGrow Textareas with CSS

DevFeed: [AutoGrow Textareas with CSS](<https://devfeed.tech/articles/autogrow-textareas-with-css-37473.md>)

Original publisher: [Read original article](<https://davidwalsh.name/autogrow-textareas>)

Author: David Walsh

Published: 2023-12-18T11:55:51Z

Content type: tutorial

Language: en

Sources: [David Walsh](<https://devfeed.tech/sources/david-walsh.md>)

Topics: [CSS](<https://devfeed.tech/topics/css.md>), [Web Development](<https://devfeed.tech/topics/web-development.md>)

Tags: [css](<https://devfeed.tech/tags/css.md>), [css-html5](<https://devfeed.tech/tags/css-html5.md>), [html5](<https://devfeed.tech/tags/html5.md>), [web](<https://devfeed.tech/tags/web.md>)

### AI overview

A tutorial about using CSS to make textarea elements expand automatically, including how to allow vertical and horizontal growth and constrain the size with standard properties.

### Source excerpt

As the demands of the web change and developers experiment with different user experiences, the need for more native language improvements expands. Our presentation layer, CSS, has done incredibly well in improving capabilities, even if sometimes too slow. The need for native support for automatically expanding textarea elements has been long known...and it's finally here! [...] The post AutoGrow Textareas with CSS appeared first on David Walsh Blog.

## Writing a Sokoban Puzzle Game in JavaScript

DevFeed: [Writing a Sokoban Puzzle Game in JavaScript](<https://devfeed.tech/articles/writing-a-sokoban-puzzle-game-in-javascript-37609.md>)

Original publisher: [Read original article](<https://www.taniarascia.com/sokoban-game/>)

Author: hello@taniarascia.com

Published: 2021-07-26T00:00:00Z

Content type: tutorial

Language: en

Sources: [Tania Rascia](<https://devfeed.tech/sources/tania-rascia.md>)

Topics: [JavaScript](<https://devfeed.tech/topics/javascript.md>), [Code](<https://devfeed.tech/topics/code.md>), [Canvas](<https://devfeed.tech/topics/canvas.md>), [HTML5](<https://devfeed.tech/topics/html5.md>), [Demo](<https://devfeed.tech/topics/demo.md>), [Web Development](<https://devfeed.tech/topics/web-development.md>)

Tags: [canvas](<https://devfeed.tech/tags/canvas.md>), [code](<https://devfeed.tech/tags/code.md>), [demo](<https://devfeed.tech/tags/demo.md>), [game](<https://devfeed.tech/tags/game.md>), [games](<https://devfeed.tech/tags/games.md>), [graphics](<https://devfeed.tech/tags/graphics.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [puzzle](<https://devfeed.tech/tags/puzzle.md>)

### AI overview

A tutorial describing the implementation of a Sokoban puzzle game in JavaScript. It explains the map representation, entity movement and pushing rules, recursive handling of multiple blocks, and rendering the game on an HTML5 canvas.

### Source excerpt

So the other day, I made an implementation of a Sokoban puzzle game in JavaScript. Here's the source code and here's the demo. The game...

## Keycloak on OpenShift

DevFeed: [Keycloak on OpenShift](<https://devfeed.tech/articles/keycloak-on-openshift-31570.md>)

Original publisher: [Read original article](<https://www.keycloak.org/2018/05/keycloak-on-openshift>)

Author: Stian Thorgersen

Published: 2018-05-31T00:00:00Z

Content type: tutorial

Language: en

Sources: [Keycloak Blog](<https://devfeed.tech/sources/keycloak-blog.md>)

Topics: [Keycloak](<https://devfeed.tech/topics/keycloak.md>), [Node.js](<https://devfeed.tech/topics/node-js.md>), [HTML5](<https://devfeed.tech/topics/html5.md>)

Tags: [deployment](<https://devfeed.tech/tags/deployment.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [html5](<https://devfeed.tech/tags/html5.md>), [idm](<https://devfeed.tech/tags/idm.md>), [kerberos](<https://devfeed.tech/tags/kerberos.md>), [keycloak](<https://devfeed.tech/tags/keycloak.md>), [ldap](<https://devfeed.tech/tags/ldap.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [openid-connect](<https://devfeed.tech/tags/openid-connect.md>), [openshift](<https://devfeed.tech/tags/openshift.md>), [saml](<https://devfeed.tech/tags/saml.md>), [sso](<https://devfeed.tech/tags/sso.md>)

### AI overview

A tutorial showing how to deploy Keycloak on OpenShift, then deploy a Node.js REST service and an HTML5 application and secure both with Keycloak.

### Source excerpt

In this post you'll see how to deploy Keycloak on OpenShift. You'll also learn how to deploy a Node.js based REST service and an HTML5 application to OpenShift and secure these with Keycloak. There is also a screencast showing this example at https://youtu.be/9zUWqbK3BqI. If you don't already have OpenShift available a good place to start is by using MiniShift. Deploying Keycloak First of all create a new project in OpenShift with oc by running: oc new-project keycloak The next thing to do is to import the Keycloak template into OpenShift, by running: oc replace --force -f "https://raw.githubusercontent.com/jboss-dockerfiles/keycloak"\ "/master/openshift-examples/keycloak-https.json" Now open the OpenShift console and open the keycloak project. Click on Add to Project and Browse Catalog. In the catalog you should find Keycloak. Click on it. Click next on the information. Under configuration set a username and password that you can remember in the Keycloak Administrator Username and Keycloak Administrator Password fields. Then click on create. Click on Continue to project overview. Wait for the deployment to complete then click on the link to the application. Your browser will complain about the certificate as it is a self-signed certificate. Ignore this and proceed. Click on Administration Console, then login with the username and password you entered previously. Keep this tab open as you will need it later. You have now deployed Keycloak onto OpenShift. Configure Clients in Keycloak We need to create clients for the service and the application we will secure. Open the tab with the Keycloak admin console. Click on Clients and Create. For Client ID enter service and click Save. Under Access Type select bearer-only and click on Save. Click on Clients then Create again. For Client ID enter app and click Save. For Valid Redirect URIs and Web Origins enter *. In production environment it is very important that you enter the correct URL for your application, but since thi

## DIY Portable Secrets Manager With a Raspberry Pi Zero and ARC

DevFeed: [DIY Portable Secrets Manager With a Raspberry Pi Zero and ARC](<https://devfeed.tech/articles/diy-portable-secrets-manager-with-a-raspberry-pi-zero-and-arc-41256.md>)

Original publisher: [Read original article](<https://www.evilsocket.net/2017/12/07/DIY-Portable-Secrets-Manager-with-a-RPI-Zero-and-the-ARC-Project/>)

Author: Simone Margaritelli

Published: 2017-12-07T16:42:48Z

Content type: tutorial

Language: en

Sources: [evilsocket](<https://devfeed.tech/sources/evilsocket.md>)

Topics: [Raspberry Pi](<https://devfeed.tech/topics/raspberry-pi.md>), [passwords](<https://devfeed.tech/topics/passwords.md>), [Encryption](<https://devfeed.tech/topics/encryption.md>), [SQLite](<https://devfeed.tech/topics/sqlite.md>), [API](<https://devfeed.tech/topics/api.md>), [Go](<https://devfeed.tech/topics/go.md>), [HTML5](<https://devfeed.tech/topics/html5.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [Markdown](<https://devfeed.tech/topics/markdown.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Server](<https://devfeed.tech/topics/server.md>)

Tags: [aes](<https://devfeed.tech/tags/aes.md>), [api](<https://devfeed.tech/tags/api.md>), [arc](<https://devfeed.tech/tags/arc.md>), [arcd](<https://devfeed.tech/tags/arcd.md>), [cybersecurity](<https://devfeed.tech/tags/cybersecurity.md>), [database](<https://devfeed.tech/tags/database.md>), [encryption](<https://devfeed.tech/tags/encryption.md>), [go](<https://devfeed.tech/tags/go.md>), [golang](<https://devfeed.tech/tags/golang.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [markdown](<https://devfeed.tech/tags/markdown.md>), [notes](<https://devfeed.tech/tags/notes.md>), [oss](<https://devfeed.tech/tags/oss.md>), [password-manager](<https://devfeed.tech/tags/password-manager.md>), [passwords](<https://devfeed.tech/tags/passwords.md>), [pi](<https://devfeed.tech/tags/pi.md>), [portable-hacking](<https://devfeed.tech/tags/portable-hacking.md>), [project-release](<https://devfeed.tech/tags/project-release.md>), [raspberry-pi](<https://devfeed.tech/tags/raspberry-pi.md>), [secrets](<https://devfeed.tech/tags/secrets.md>), [self-hosted](<https://devfeed.tech/tags/self-hosted.md>), [terminal](<https://devfeed.tech/tags/terminal.md>)

### AI overview

This tutorial presents ARC, a self-hosted secrets manager designed to store encrypted passwords, notes, and files and synchronize access across devices without relying on cloud hosting or a paid server. It describes a Go REST API server using SQLite and an HTML5/JavaScript browser client, then begins configuring the system on a Raspberry Pi Zero.

### Source excerpt

For the last few days I've been working on a new project which I developed for very specific needs and reasons: I need to store safely (encrypted) my passwords, sensitive files, notes, etc. I need to access them from anywhere, with every possible device ( desktop, mobile, terminal ). I need those objects to be syncronized accros all my devices. I don't want to use "the cloud". I don't want to pay for a server. I don't want to enable port forwarding and host it myself with DynDNS or alikes. So I wrote ARC.

## The lesser-known features in Rails 5.1

DevFeed: [The lesser-known features in Rails 5.1](<https://devfeed.tech/articles/the-lesser-known-features-in-rails-5-1-26277.md>)

Original publisher: [Read original article](<https://www.justinweiss.com/articles/the-lesser-known-features-in-rails-5-dot-1/>)

Author: Justin Weiss

Published: 2017-05-02T05:49:00Z

Content type: tutorial

Language: en

Sources: [Justin Weiss](<https://devfeed.tech/sources/justin-weiss.md>)

Topics: [Rails](<https://devfeed.tech/topics/rails.md>), [Ruby](<https://devfeed.tech/topics/ruby.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [HTML5](<https://devfeed.tech/topics/html5.md>)

Tags: [2017](<https://devfeed.tech/tags/2017.md>), [features](<https://devfeed.tech/tags/features.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [new-features](<https://devfeed.tech/tags/new-features.md>), [rails](<https://devfeed.tech/tags/rails.md>), [ruby](<https://devfeed.tech/tags/ruby.md>)

### AI overview

This article surveys lesser-known Rails 5.1 improvements, including consistent HTML5 tag helpers, the assert_changes test helper, delegation with delegate_missing_to, and the replacement of alias_method_chain with prepend.

### Source excerpt

Last week, during RailsConf 2017, Rails 5.1 shipped. If you followed the announcements, you've seen the big features: better integration with modern JavaScript, encrypted secrets, and system tests. And there's my personal favorite: finally getting rid of the weird combo of form_for and form_tag, and replacing it with form_with. I can't wait to try it. But the reason I love Rails isn't the big new features. It's the little, constant improvements. It's those quality-of-life changes that make me happier when I'm writing Rails apps. And Rails 5.1 is full of them. More consistent tag helpers Have you used Rails' tag helpers, like tag and content_tag? <%= content_tag :p, @user.name, class: "name" %> Rails 5.1 adds a new tag helper syntax. Use calls like tag.div or tag.br, and you can stop worrying about parameter order and juggling two different methods: <%= tag.p @user.name, class: "name" %> <%= tag.br %> These new tag helpers support HTML5 by default, and even let you create your own elements: <%= tag.pea @user.name, class: "name" %> <!-- turns into <pea class="name">Justin Weiss</pea> --> Assert more than just differences I love assert_difference. Before assert_difference, I spent way too much time juggling local variables in tests: old_score = @user.score @user.answer_question!(...) assert_equal old_score + 10, @user.score With assert_difference, it's much clearer what you're trying to do: assert_difference "@user.score", 10 do @user.answer_question!(...) end In Rails 5.1, assert_changes takes this one step further. assert_difference only checks changes in count. But assert_changes can check non-numerical changes, like changes between two strings, or between nil and something else: assert_changes "users(:justin).name", from: "Justin", to: "Bob" do @user.update_attributes(name: "Bob") end Instead of a string, you can give it a lambda: assert_changes -> { users(:justin).name }, from: "Justin", to: "Bob" do @user.update_attributes(name: "Bob") end to: can be anything tha

## CloudFormation vs. Terraform

DevFeed: [CloudFormation vs. Terraform](<https://devfeed.tech/articles/cloudformation-vs-terraform-22365.md>)

Original publisher: [Read original article](<http://www.afronski.pl/2017/04/11/terraform-vs-cloudformation.html>)

Author: Wojtek Gawroński (afronski)

Published: 2017-04-11T08:00:00Z

Content type: comparison

Language: en

Sources: [Wojtek Gawroński](<https://devfeed.tech/sources/wojtek-gawronski.md>)

Topics: [Terraform](<https://devfeed.tech/topics/terraform.md>), [AWS CloudFormation](<https://devfeed.tech/topics/aws-cloudformation.md>), [Amazon Web Services](<https://devfeed.tech/topics/aws.md>), [Infrastructure as code](<https://devfeed.tech/topics/infrastructure-as-code.md>), [vendor lock-in](<https://devfeed.tech/topics/vendor-lock-in.md>), [Disaster Recovery](<https://devfeed.tech/topics/disaster-recovery.md>)

Tags: [aws](<https://devfeed.tech/tags/aws.md>), [aws-cloudformation](<https://devfeed.tech/tags/aws-cloudformation.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [clojure](<https://devfeed.tech/tags/clojure.md>), [css](<https://devfeed.tech/tags/css.md>), [css3](<https://devfeed.tech/tags/css3.md>), [disaster-recovery](<https://devfeed.tech/tags/disaster-recovery.md>), [erlang](<https://devfeed.tech/tags/erlang.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [infrastructure-as-code](<https://devfeed.tech/tags/infrastructure-as-code.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [mono](<https://devfeed.tech/tags/mono.md>), [net](<https://devfeed.tech/tags/net.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [sicp](<https://devfeed.tech/tags/sicp.md>), [terraform](<https://devfeed.tech/tags/terraform.md>), [vagrant](<https://devfeed.tech/tags/vagrant.md>), [vendor-lock-in](<https://devfeed.tech/tags/vendor-lock-in.md>), [webgl](<https://devfeed.tech/tags/webgl.md>)

### AI overview

This comparison examines Terraform and AWS CloudFormation for automating cloud infrastructure. The author explains the decision to use a pure CloudFormation setup, choose AWS, and drop Terraform, while discussing provider dependence, vendor lock-in, and disaster recovery considerations.

### Source excerpt

CloudFormation vs. Terraform. a There is a time when every project that uses a cloud computing service has a difficult choice to make - should we automate the infrastructure or not? Immediately after, another question pops up - how should we do it? Should we use a dedicated tool (AWS CloudFormation, Azure Resource Templates, OpenStack Heat or Google Cloud Deployment Manager) or a provider-agnostic solution? And then - immediately after a surprise comes in - at first glance, there is no other tool like Terraform available on the market (but there is - it is called Foreman :wink:). So we have a good tool, built by amazing people (HashiCorp) which does not rely on any particular cloud - problem solved? Not entirely. As a grown up, you know that like the ORM does not let you change database on the fly, Terraform will not let you automatically switch your cloud provider for your entire system. From the other hand - you fear vendor lock-in, and for sure you are considering how to design and prepare disaster recovery scenarios. A lot of unknowns, isn't it? I would like to show my rationale for a new project and infrastructure for which I, among others, was responsible. The motivation which drove us towards a pure CloudFormation setup, the reason behind our bet on AWS, and the motivation behind the decision to drop Terraform. Keep in mind that all remarks and comments pointed in this article are constructive criticism - it does not change my opinion about companies that created those tools at all. I have huge respect for both for AWS and HashiCorp - the work they have done, especially in tooling and cloud computing landscape is outstanding. As a user of AWS Services and HashiCorp tools I am grateful for the work they did. If you do not have experience with CloudFormation or Terraform - please read either amazing documentation or any other introductory article. I will assume your basic knowledge about these two. Terraform is not a silver bullet. When I evaluated Terraform, i

## Custom validators in template driven Angular forms

DevFeed: [Custom validators in template driven Angular forms](<https://devfeed.tech/articles/custom-validators-in-template-driven-angular-forms-21303.md>)

Original publisher: [Read original article](<https://juri.dev/blog/2016/11/ng2-template-driven-form-validators/>)

Published: 2016-11-13T00:00:00Z

Content type: tutorial

Language: en

Sources: [Juri Strumpflohner](<https://devfeed.tech/sources/juri-strumpflohner.md>)

Topics: [Angular](<https://devfeed.tech/topics/angular.md>), [Forms](<https://devfeed.tech/topics/forms.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [angular](<https://devfeed.tech/tags/angular.md>), [forms](<https://devfeed.tech/tags/forms.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [validation](<https://devfeed.tech/tags/validation.md>)

### AI overview

A tutorial on template-driven forms in Angular 2+, covering built-in HTML5 validators, form validation state, validation errors, and custom validators.

### Source excerpt

Lorem ipsum dolor sit amet

## How V8's compilation cache supports function inlining

DevFeed: [How V8's compilation cache supports function inlining](<https://devfeed.tech/articles/a-mythical-beast-called-jit-22364.md>)

Original publisher: [Read original article](<http://www.afronski.pl/2016/04/08/a-mythical-beast-called-jit.html>)

Author: Wojtek Gawroński (afronski)

Published: 2016-04-08T17:45:00Z

Content type: article

Language: en

Sources: [Wojtek Gawroński](<https://devfeed.tech/sources/wojtek-gawronski.md>)

Topics: [Compiler](<https://devfeed.tech/topics/compiler.md>), [V8](<https://devfeed.tech/topics/v8.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [JIT](<https://devfeed.tech/topics/jit.md>), [Optimization](<https://devfeed.tech/topics/optimization.md>), [Node.js](<https://devfeed.tech/topics/node-js.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [cache](<https://devfeed.tech/tags/cache.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [clojure](<https://devfeed.tech/tags/clojure.md>), [compilation](<https://devfeed.tech/tags/compilation.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [css](<https://devfeed.tech/tags/css.md>), [css3](<https://devfeed.tech/tags/css3.md>), [erlang](<https://devfeed.tech/tags/erlang.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [inlining](<https://devfeed.tech/tags/inlining.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [mono](<https://devfeed.tech/tags/mono.md>), [net](<https://devfeed.tech/tags/net.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [optimization](<https://devfeed.tech/tags/optimization.md>), [sicp](<https://devfeed.tech/tags/sicp.md>), [v8](<https://devfeed.tech/tags/v8.md>), [vagrant](<https://devfeed.tech/tags/vagrant.md>), [webgl](<https://devfeed.tech/tags/webgl.md>)

### AI overview

This article explains why just-in-time compilation in V8 is difficult for JavaScript and discusses compilation caching as an optimization technique related to function inlining. It distinguishes compilation caches from inline caches.

### Source excerpt

A mythical beast called JIT I have recently bumped into one of those articles which title sounds rather like "one weird trick" ad. Guiding just from it, you can imagine how small amount of information is contained there, and by actually going through that link there you will definitely make sure that it has some knowledge, but no real explanations are in place. Of course, a final explanation is indeed really simple - Function.prototype.toString() returns everything even the comments inside the function body, size of that string is a feature that allows the optimizing compiler inside V8 to make a decision to inline that particular function or not. There is even a command line switch which to use to modify a limit and a default value. Simple enough? Not really. That article left a lot of unanswered questions. Probably because of that JIT compilers and its optimization techniques are kind of black magic. Why is it hard? Obviously compiler engineers are not dumb people (they are actually really smart) and they are not obfuscating and complicating this by accident or on purpose. They are working hard, especially with such weakly typed and underspecified languages like JavaScript to provide you an optimized version of your code. Why is it a hard job? It is all about guarantees. How many of them you can recall from memory when it comes to JavaScript? Not a lot of them, right? That is not good, especially from the perspective of a compiler engineer. JavaScript is everywhere, success of the internet spread this language, and nowadays success of Node.js pushed this language from front-end, even to server-side - and everywhere people are talking about performance. Obviously not about native like performance for scientific computations, but the more complexity is pushed to the application layer, the more of it will have to be optimized after all. That's why compilers and their creators have to be smart people - they have to deal with complexity of your applications and "illness

## Jenkins 2.0

DevFeed: [Jenkins 2.0](<https://devfeed.tech/articles/jenkins-2-0-22363.md>)

Original publisher: [Read original article](<http://www.afronski.pl/2016/04/03/jenkins-2-0.html>)

Author: Wojtek Gawroński (afronski)

Published: 2016-04-03T15:30:00Z

Content type: release

Language: en

Sources: [Wojtek Gawroński](<https://devfeed.tech/sources/wojtek-gawronski.md>)

Topics: [Jenkins](<https://devfeed.tech/topics/jenkins.md>), [Automation](<https://devfeed.tech/topics/automation.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [automation](<https://devfeed.tech/tags/automation.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [clojure](<https://devfeed.tech/tags/clojure.md>), [compatibility](<https://devfeed.tech/tags/compatibility.md>), [css](<https://devfeed.tech/tags/css.md>), [css3](<https://devfeed.tech/tags/css3.md>), [erlang](<https://devfeed.tech/tags/erlang.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [jenkins](<https://devfeed.tech/tags/jenkins.md>), [mono](<https://devfeed.tech/tags/mono.md>), [net](<https://devfeed.tech/tags/net.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [release](<https://devfeed.tech/tags/release.md>), [sicp](<https://devfeed.tech/tags/sicp.md>), [vagrant](<https://devfeed.tech/tags/vagrant.md>), [webgl](<https://devfeed.tech/tags/webgl.md>)

### AI overview

This article reviews the beta release of Jenkins 2.0, covering its improved user interface, built-in delivery pipelines with Jenkinsfile support, and stated backward compatibility with Jenkins 1.x. It notes that the current LTS version remained recommended for production deployments at the time.

### Source excerpt

Jenkins 2.0 Introduction Recently maintainers of Jenkins - the leading and most popular open source automation server - announced that long awaited version 2.0 is available to download and additionally it is marked as a beta release. It means that they're still recommending current LTS version for a production deployments, but new version is coming really soon. So let's look what it offers! What's new? Improved usability (aka "New UI") That is probably the most single awaited feature in Jenkins community. It means a lot for both, power users and newcomers. A lot of feedback was taken into account when preparing that feature. Old pages (e.g. Create Item or Job Configuration) look really clean and modern (we finally have tabs in Job Configuration page), new views like Pipeline Stage view (we will describe whole feature in the next section) look even more awesome: But that's not the end of goodies from that release. Delivery pipelines Finally Jenkins will be packaged with built-in delivery pipelines feature. It means that it will not require anymore plugins for doing that. It brings finally support for Jenkinsfile - concept which allows to codify your pipelines, and store it inside version control (either together with application source code or outside, in one of your supporting repositories). Besides that - finally no more XML fiddling when it comes to job configuration, because it will use a nice DSL: node { git url: 'https://github.com/joe_user/simple-maven-project-with-tests.git' def mvnHome = tool 'M3' sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify" step([$class: 'ArtifactArchiver', artifacts: '**/target/*.jar', fingerprint: true]) step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml']) } That is a well known concept, similar to the job DSL plugin. But finally, it will be built-in and ready to use right after installation, without any additional effort. Full backward compatibility That is the most important thing

## Writing custom modules for Ansible

DevFeed: [Writing custom modules for Ansible](<https://devfeed.tech/articles/writing-custom-modules-for-ansible-22362.md>)

Original publisher: [Read original article](<http://www.afronski.pl/2016/03/28/writing-custom-modules-for-ansible.html>)

Author: Wojtek Gawroński (afronski)

Published: 2016-03-28T19:00:00Z

Content type: tutorial

Language: en

Sources: [Wojtek Gawroński](<https://devfeed.tech/sources/wojtek-gawronski.md>)

Topics: [Ansible](<https://devfeed.tech/topics/ansible.md>), [modules](<https://devfeed.tech/topics/modules.md>), [Automation](<https://devfeed.tech/topics/automation.md>), [configuration-management](<https://devfeed.tech/topics/configuration-management.md>), [Erlang](<https://devfeed.tech/topics/erlang.md>), [JSON](<https://devfeed.tech/topics/json.md>), [YAML](<https://devfeed.tech/topics/yaml.md>), [Scripting](<https://devfeed.tech/topics/scripting.md>)

Tags: [ansible](<https://devfeed.tech/tags/ansible.md>), [automation](<https://devfeed.tech/tags/automation.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [clojure](<https://devfeed.tech/tags/clojure.md>), [code](<https://devfeed.tech/tags/code.md>), [commands](<https://devfeed.tech/tags/commands.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [configuration-management](<https://devfeed.tech/tags/configuration-management.md>), [css](<https://devfeed.tech/tags/css.md>), [css3](<https://devfeed.tech/tags/css3.md>), [erlang](<https://devfeed.tech/tags/erlang.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [json](<https://devfeed.tech/tags/json.md>), [modules](<https://devfeed.tech/tags/modules.md>), [mono](<https://devfeed.tech/tags/mono.md>), [net](<https://devfeed.tech/tags/net.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [programming](<https://devfeed.tech/tags/programming.md>), [scripting](<https://devfeed.tech/tags/scripting.md>), [sicp](<https://devfeed.tech/tags/sicp.md>), [vagrant](<https://devfeed.tech/tags/vagrant.md>), [webgl](<https://devfeed.tech/tags/webgl.md>)

### AI overview

This tutorial explains Ansible modules, including their role in remote infrastructure management, YAML-based declarative configuration, dependencies on the provisioned machine, and JSON input/output requirements. It then introduces a case study for implementing a custom module in Erlang to process XML status pages.

### Source excerpt

Writing custom modules for Ansible Introduction What is Ansible and what is a module? If you are a big fan of automation, if you are focused on spreading and building software in line with DevOps culture, tools related with automation / configuration management like Chef or Ansible are probably well known to you. From the other hand that what differentiates those tools is a topic for a next blog post. Without diving into those differences, let's briefly zoom into details for those people which do not know what Ansible and modules are. Ansible is a free-software platform for configuring and managing machines. It combines deployment, ad-hoc tasks execution and configuration management. This tool uses YAML and declarative way of defining steps, which are modifying state of your fleet. Module is a single piece of those steps, a well defined way of executing certain tasks on the remote infrastructure. It executes commands, and communicates by outputting JSON to standard output - it means that it can be written in any programming or scripting language. Development Before we'll start actual implementation we need to know how it works underneath. Requirements If you want to write a custom module, we stated above that you have to be aware of two things. Your module code will be executed on the provisioned machine, so all dependencies which your module requires, have to be there. Second, your module communicates over specific input and output protocols. It uses certain syntax for sending input parameters (either sent as a stdin or a file) and JSON protocol which will be consumed as an output of the module. And nothing more - any other, non-JSON compliant output will be treated as an error, and would not be consumed by Ansible properly. Case Study We would like to consume XMLified status pages and do certain actions based on checked and exposed facts, scraped from aforementioned place. Because I like Erlang, I will use that language to implement that module. We will do it usin

## Maintaining a 500-Day GitHub Contribution Streak for Documentation and Habit Building

DevFeed: [Maintaining a 500-Day GitHub Contribution Streak for Documentation and Habit Building](<https://devfeed.tech/articles/500-shades-of-green-22361.md>)

Original publisher: [Read original article](<http://www.afronski.pl/2016/02/17/500-shades-of-green.html>)

Author: Wojtek Gawroński (afronski)

Published: 2016-02-17T22:30:00Z

Content type: opinion

Language: en

Sources: [Wojtek Gawroński](<https://devfeed.tech/sources/wojtek-gawronski.md>)

Topics: [Git](<https://devfeed.tech/topics/git.md>), [dotfiles](<https://devfeed.tech/topics/dotfiles.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [clojure](<https://devfeed.tech/tags/clojure.md>), [css](<https://devfeed.tech/tags/css.md>), [css3](<https://devfeed.tech/tags/css3.md>), [erlang](<https://devfeed.tech/tags/erlang.md>), [git](<https://devfeed.tech/tags/git.md>), [github](<https://devfeed.tech/tags/github.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [mono](<https://devfeed.tech/tags/mono.md>), [net](<https://devfeed.tech/tags/net.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [projects](<https://devfeed.tech/tags/projects.md>), [sicp](<https://devfeed.tech/tags/sicp.md>), [vagrant](<https://devfeed.tech/tags/vagrant.md>), [webgl](<https://devfeed.tech/tags/webgl.md>)

### AI overview

The author describes maintaining a 500-day GitHub contribution streak and explains that the practice supported personal documentation, disciplined commit history, workload planning, community activities, and open-source contributions. The article also notes that contribution histories can be artificially altered using separate repositories and rewritten dates, and that streak quantity does not measure programming quality.

### Source excerpt

500 shades of Green No, it is not fake. I did it - I have managed to have real streak which last 500 days in a row and document it on Github. But, you can do it in a different way - there are couple of projects which allows you to create arbitrary history of your contributions (it uses a separate repository for that and well - it cheats using ability of git to bend the time). One is here. :wink: No, it does not mean anything. I am not a better programmer than anyone else, definitely quantity does not involve quality (I will describe this in details below). No, it does not mean that I did not have proper holidays or that I have spent all my free time on that. Why did you do that? Mainly because of two reasons: documentation and creating habits. Many of the repositories like afronski/playground-notes, afronski/dotfiles or afronski/papers_i_love are pure and private documentation of my notes, publicly visible settings and observations with commit history. It also helped me when it comes to developing new habits: Taking care about commit history, proper commit messages, linear and nice history. Working with facilities like rebase, squash or fix-ups helped me a lot in daily job. Besides that some commits have attached story with explanation why I applied that change. It is sometimes priceless, because I can drop my mental overhead related to fear of forgetting something important. And when I hit the same wall again I can tackle it with certainty and exact solution. Example here. Also having a daily habit of delivering something valuable is crucial. It helps a lot when it comes to daily work, when it comes to planning the workload, actual steps to be done. It also helps regarding planning my weeks and during a lot of other related activities - like meet-up organization, building community around them or preparing real contributions to open source projects. Another point is related with developing other habits. It is easier to develop a new habit on top of existing foundat

## My year in review - 2015

DevFeed: [My year in review - 2015](<https://devfeed.tech/articles/my-year-in-review-2015-22360.md>)

Original publisher: [Read original article](<http://www.afronski.pl/2015/12/31/my-year-in-review-2015.html>)

Author: Wojtek Gawroński (afronski)

Published: 2015-12-31T15:00:00Z

Content type: article

Language: en

Sources: [Wojtek Gawroński](<https://devfeed.tech/sources/wojtek-gawronski.md>)

Topics: [Programming](<https://devfeed.tech/topics/programming.md>), [Elixir](<https://devfeed.tech/topics/elixir.md>), [Microservices](<https://devfeed.tech/topics/microservices.md>), [phoenix](<https://devfeed.tech/topics/phoenix.md>), [ClojureScript](<https://devfeed.tech/topics/clojurescript.md>), [Erlang](<https://devfeed.tech/topics/erlang.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [Node.js](<https://devfeed.tech/topics/node-js.md>), [Bash](<https://devfeed.tech/topics/bash.md>), [C](<https://devfeed.tech/topics/c.md>), [Python](<https://devfeed.tech/topics/python.md>), [Ruby](<https://devfeed.tech/topics/ruby.md>)

Tags: [blog](<https://devfeed.tech/tags/blog.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [clojure](<https://devfeed.tech/tags/clojure.md>), [css](<https://devfeed.tech/tags/css.md>), [css3](<https://devfeed.tech/tags/css3.md>), [erlang](<https://devfeed.tech/tags/erlang.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [languages](<https://devfeed.tech/tags/languages.md>), [microservices](<https://devfeed.tech/tags/microservices.md>), [mono](<https://devfeed.tech/tags/mono.md>), [net](<https://devfeed.tech/tags/net.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [programming](<https://devfeed.tech/tags/programming.md>), [sicp](<https://devfeed.tech/tags/sicp.md>), [vagrant](<https://devfeed.tech/tags/vagrant.md>), [webgl](<https://devfeed.tech/tags/webgl.md>), [year-in-review](<https://devfeed.tech/tags/year-in-review.md>)

### AI overview

A personal review of 2015 covering talks, meetups, blog posts, books, programming languages, and plans for 2016. It highlights work involving microservices, Elixir, Phoenix, Node.js, Erlang, ClojureScript, and several other languages.

### Source excerpt

My year in review - 2015 Github Talks Nov 2015 - Evolution > Revolution - how should microservices be built? Sep 2015 - Elixir + Phoenix Jun 2015 - ZeroMQ in Node.js Apr 2015 - Erlang Ecosystem (PL) Feb 2015 - Elixir Feb 2015 - ClojureScript + Om = ♥ Details: My Talks Meetups Two meet-up groups created and continued in 2015: NodeSchool Silesia Silesian BEAMers Blog Most viewed blog posts by me Books List of book which I've read in 2015 and reading challenge. Favorite technical book of 2015 Pragmatic Thinking and Learning: Refactor Your Wetware - blog post about it Number of books read 20 Programming Favorite programming languages (or related) I've hacked on/with this year Languages with pet projects: Erlang #1, Erlang #2, Elixir #1, Elixir #2 ClojureScript Programming languages used for work-related projects this year JavaScript - ES 5 (Node.js, Front-End), JavaScript - ES6 (Front-End), Java, C, Ruby, Python, Bash Programming languages that I hope to explore next year Idris, Rust, Prolog Plans for 2016 Apply 100:10:1 rule to my open source work. Proceed with cost-benefit analysis and focus on monetization in terms of open source work. Try to kick-off another meet up in Silesia region - Papers We Love. Learning (even more than previously) about theory and how to design distributed and real-time systems. Focus on doing interactive blog posts and higher quality (premium?) materials. Push even harder work related with quality and visibility of blog posts. Take more time to discover new music. Happy New Year! :wink:

## Elixir's gen\_event Behavior and Its Event Manager and Handler Design

DevFeed: [Elixir's gen\_event Behavior and Its Event Manager and Handler Design](<https://devfeed.tech/articles/what-is-wrong-with-gen-event-22359.md>)

Original publisher: [Read original article](<http://www.afronski.pl/2015/11/02/what-is-wrong-with-gen-event.html>)

Author: Wojtek Gawroński (afronski)

Published: 2015-11-02T15:00:00Z

Content type: opinion

Language: en

Sources: [Wojtek Gawroński](<https://devfeed.tech/sources/wojtek-gawronski.md>)

Topics: [Elixir](<https://devfeed.tech/topics/elixir.md>), [modules](<https://devfeed.tech/topics/modules.md>), [Processes](<https://devfeed.tech/topics/processes.md>), [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Simulation](<https://devfeed.tech/topics/simulation.md>)

Tags: [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [clojure](<https://devfeed.tech/tags/clojure.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [console](<https://devfeed.tech/tags/console.md>), [css](<https://devfeed.tech/tags/css.md>), [css3](<https://devfeed.tech/tags/css3.md>), [elixir](<https://devfeed.tech/tags/elixir.md>), [erlang](<https://devfeed.tech/tags/erlang.md>), [handler](<https://devfeed.tech/tags/handler.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [module](<https://devfeed.tech/tags/module.md>), [mono](<https://devfeed.tech/tags/mono.md>), [net](<https://devfeed.tech/tags/net.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [process](<https://devfeed.tech/tags/process.md>), [sicp](<https://devfeed.tech/tags/sicp.md>), [vagrant](<https://devfeed.tech/tags/vagrant.md>), [webgl](<https://devfeed.tech/tags/webgl.md>)

### AI overview

This article examines Elixir's gen_event behavior, explaining how event managers receive events and dispatch them to installed handler modules. It presents the design as a pattern the author considers problematic, while noting that the article dates from 2015 and that Elixir has changed since then.

### Source excerpt

Beware: this article is from 2015 and in Elixir world couple things changed a bit. Here you can find the updated version of this blog post. What is wrong with gen_event? I never used gen_event, I think it is a bad pattern. At first it may look like a controversial statement, but I heard a lot of those complaints from other people. Originally, I heard that exact statement during the presentation made by Garrett Smith about pattern language - someone asked about that behavior at the end. More recently I heard similar thing in José Valim's presentation about what will come next in Elixir. It confuses me every time I hear that, so I want to investigate topic more deeply. But before we will dive into reasons and explanations, let's recall what is the purpose of this behavior. What is gen_event? OTP introduces two different terms regarding that behavior - an event manager and event handler modules. Responsibility of event manager is being a named object which can receive events. An event can be, for example: an error, an alarm, or some information that is to be logged. Inside manager we can have 0, 1 or more event handlers installed. Responsibility of the handler is to process an event. When the event manager is notified about an event, it will be processed by all installed handlers. The easiest way to imagine that is to think about manager as a sink for incoming messages and handlers as different implementations which are writing messages to disk, database or terminal. Another example can be taken from my implementation of Francesco Cesarini's assignment called Wolves, Rabbits and Carrots simulation. Main purpose of that task is to introduce concurrency, but internally it is a simulation - so certain events are happening, and they will be broadcasted to the rest of entities. In that case simulation_event_stream is an event manager: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 -module(simulation_event_stream). -export([ start_link/0, co

## A history of HTML input elements and their inconsistent browser behavior

DevFeed: [A history of HTML input elements and their inconsistent browser behavior](<https://devfeed.tech/articles/i-you-but-you-re-bringing-me-down-35505.md>)

Original publisher: [Read original article](<https://meowni.ca/posts/a-story-about-input/>)

Author: Monica Dinculescu

Published: 2015-10-22T00:00:00Z

Content type: opinion

Language: en

Sources: [Monica Dinculescu](<https://devfeed.tech/sources/monica-dinculescu.md>)

Topics: [HTML](<https://devfeed.tech/topics/html.md>), [Web Development](<https://devfeed.tech/topics/web-development.md>), [Web platform](<https://devfeed.tech/topics/web-platform.md>), [Forms](<https://devfeed.tech/topics/forms.md>), [browsers](<https://devfeed.tech/topics/browsers.md>)

Tags: [browsers](<https://devfeed.tech/tags/browsers.md>), [chrome](<https://devfeed.tech/tags/chrome.md>), [file](<https://devfeed.tech/tags/file.md>), [firefox](<https://devfeed.tech/tags/firefox.md>), [forms](<https://devfeed.tech/tags/forms.md>), [html](<https://devfeed.tech/tags/html.md>), [html5](<https://devfeed.tech/tags/html5.md>), [password](<https://devfeed.tech/tags/password.md>), [radio](<https://devfeed.tech/tags/radio.md>)

### AI overview

This opinion article reviews the history of HTML input elements, including their original types, the behavior of image and file inputs, differences between browsers, and the relationship between input and textarea. It also discusses newer HTML5 input types and their uneven implementation.

### Source excerpt

Some people build furniture. Some people knit. Some people have hobbies that don't involve HTML specs from the 90s. I am not those people. So here's a story about <input>, how it got to be the jerk that it is, and why it needs to die in a fire. The early years 1995 was a good year. Friends, ER, Xena were all on TV. TLC had dominated the charts with "Waterfalls". Browsers were ok, because HTML was pretty ok. We had Mosaic, Netscape and IE1, and the HTML2 spec was finally getting around to standardizing forms. 1995 was the year when <input> was born, and now that it's about old enough to drink, we need to have a talk. Input initially came along with 8 types: text, password, checkbox, radio, image, hidden, submit and reset, and in a separate RFC that followed, file. Wait, did you say image? Yeah, let's talk about it. <input type="image" src="cat.png"> looks like an image, but it's actually an image button that also submits the (x,y) coordinates of where you clicked on the image. Unless you don't specify a src file, in which case it's an "image button" that says "Submit". Unless you're in Firefox, in which case it says "Submit Query" and looks like a label. Unless you're in IE in which case it doesn't say anything at all. Also, for your local pub trivia night, the message that the type=file input to indicate you haven't done anything is "No file chosen", "no file selected", "No file selected", and just an empty textbox on Chrome, Safari, Firefox and IE respectively. Right, ok. And now, a <textarea> rant I always thought input and textarea came at later dates, and that explained why they're kind of insanely different. This is kind of true, since input was around in Mosaic since at least 1993, and it was a fixed-up implementation of ISINDEX. However, on the record, they were both children of the HTML2 spec, which decided that <input> is a self closing tag and uses a value attribute, while <textarea> needs a closing tag and uses its contents, even though they both just hol

[Next page](<https://devfeed.tech/tags/html5.md?cursor=WyIyMDE1LTEwLTIyVDAwOjAwOjAwKzAwOjAwIiwgIjliNTM4NWYzLTU4MzYtNGIwYi1hZGQzLWVlY2ExZmQ4YjNjNiJd>)