shakedown.social is one of the many independent Mastodon servers you can use to participate in the fediverse.
A community for live music fans with roots in the jam scene. Shakedown Social is run by a team of volunteers (led by @clifff and @sethadam1) and funded by donations.

Administered by:

Server stats:

246
active users

#releasemonday

0 posts0 participants0 posts today
Karsten Schmidt<p><a href="https://mastodon.thi.ng/tags/ReleaseMonday" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ReleaseMonday</span></a> — One of the recent (already very useful!) new package additions to <a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> is:</p><p><a href="https://thi.ng/leaky-bucket" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/leaky-bucket</span><span class="invisible"></span></a></p><p>Leaky buckets are commonly used in communication networks for rate limiting, traffic shaping and bandwidth control, but are equally useful in other domains requiring similar constraints.</p><p>A Leaky Bucket is a managed counter with an enforced maximum value (i.e. bucket capacity). The counter is incremented for each a new event to check if it can/should be processed. If the bucket capacity has already been reached, the bucket will report an overflow, which we can then handle accordingly (e.g. by dropping or queuing events). The bucket also has a configurable time interval at which the counter is decreasing (aka the "leaking" behavior) until it reaches zero again (i.e. until the bucket is empty). Altogether, this setup can be utilized to ensure both an average rate, whilst also supporting temporary bursting in a controlled fashion...</p><p>Related, I've also updated/simplified the rate limiter interceptor in <a href="https://thi.ng/server" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/server</span><span class="invisible"></span></a> to utilize this new package...</p><p><a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> <a href="https://mastodon.thi.ng/tags/DataStructure" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>DataStructure</span></a> <a href="https://mastodon.thi.ng/tags/RateLimiting" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>RateLimiting</span></a> <a href="https://mastodon.thi.ng/tags/OpenSource" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>OpenSource</span></a> <a href="https://mastodon.thi.ng/tags/TypeScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>TypeScript</span></a> <a href="https://mastodon.thi.ng/tags/JavaScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>JavaScript</span></a></p>
Karsten Schmidt<p>What follows <a href="https://mastodon.thi.ng/tags/ReleaseSunday" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ReleaseSunday</span></a>? <a href="https://mastodon.thi.ng/tags/ReleaseMonday" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ReleaseMonday</span></a> of course!</p><p>The new additions are mainly what was mentioned in my previous toots of the past 24h:</p><p><a href="https://thi.ng/color" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/color</span><span class="invisible"></span></a><br>Configurable CSS default conversions/serializations (e.g. `CSS_LEVEL3` [initial default] vs `CSS_LEVEL4` [supported])</p><p><a href="https://thi.ng/transducers" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/transducers</span><span class="invisible"></span></a><br>Added `syncTuples()` transducer, a useful companion (post-processing step) for `multiplex()` transformation pipelines</p><p><a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> <a href="https://mastodon.thi.ng/tags/OpenSource" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>OpenSource</span></a> <a href="https://mastodon.thi.ng/tags/TypeScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>TypeScript</span></a></p>
Karsten Schmidt<p><a href="https://mastodon.thi.ng/tags/ReleaseMonday" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ReleaseMonday</span></a> 🚀 — Still warm from uploading, this round includes notable updates to these package (updated/fixed code examples in the readme's), in A-Z order:</p><p><a href="https://thi.ng/hiccup-canvas" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/hiccup-canvas</span><span class="invisible"></span></a> — fixed vertex memory layout attrib handling for packed polygons/polylines (mainly of interest for WASM interop)</p><p><a href="https://thi.ng/logger" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/logger</span><span class="invisible"></span></a> — major version update: restructured &amp; updated base types/implementations to support hierarchies of loggers, also to simplify creating &amp; configuring child loggers attached to the newly provided central ROOT logger. Various other thi.ng packages with logging support have already been updated...</p><p><a href="https://thi.ng/mime" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/mime</span><span class="invisible"></span></a> — updated to latest snapshot of mime-db, update vendor prefixed overrides, add isCompressible() predicate</p><p><a href="https://thi.ng/ramp" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/ramp</span><span class="invisible"></span></a> — updated/extended vector type interpolation, now truly supports n-dimensional vectors (previously only 2d/3d/4d)</p><p><a href="https://thi.ng/text-canvas" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/text-canvas</span><span class="invisible"></span></a> — major version update: added/updated texmode plotting functions and support compositing multiple bar plots using additive blending for CLI based dataviz purposes[1], cleanup parts of API.</p><p>For more updates check the main readme:<br><a href="https://thi.ng/umbrella" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/umbrella</span><span class="invisible"></span></a></p><p>Ps. Thank you to the 28 people who've filled in the community survey[2] and gave some great feedback over the past 10 days. It's open for another 10 days, so if you haven't participated yet, now is the time :) Thank you very much in advance!</p><p>[1] <a href="https://mastodon.thi.ng/@toxi/111957681302985179" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">mastodon.thi.ng/@toxi/11195768</span><span class="invisible">1302985179</span></a><br>[2] <a href="https://forms.gle/XacbSDEmQMPZg8197" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">forms.gle/XacbSDEmQMPZg8197</span><span class="invisible"></span></a></p>
Karsten Schmidt<p>🚀 <a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> <a href="https://mastodon.thi.ng/tags/ReleaseMonday" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ReleaseMonday</span></a> with new, just released functionality:</p><p>The parameter tweening/animation package <a href="https://thi.ng/ramp" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/ramp</span><span class="invisible"></span></a> has received a major update (v3.0.0) and now supports:</p><p>- interpolation of arbitrary &amp; nested types (numeric, nD vector values and nested objects of the same are supported out-of-the-box, extensible)<br>- grouped/nestable ramp/timeline channels, with each channel having its own independent set of keyframes, interpolation type &amp; options<br>- per-channel time domain mapping functions (e.g. for clamping, looping, speed adjustments, direction etc.)</p><p>Incredibly complex animations can be achieved with these features (and the fact it's all declarative and supports dynamic/procedural generation of keyframes &amp; timelines). I shall write more about this in due course...</p><p>For now, here's a small (purposefully underwhelming, basic(!)) demo, showing some of these concepts in action, using the vertical scroll position to drive (reactively) various CSS properties. A few more smaller examples are also in the package readme...</p><p>Btw. This package has ZERO relationship with HTML/CSS and can be useful in any other usage scenarios, from WebGL to any other parameter tweening tasks...</p><p>The attached image shows the commented demo source code.</p><p>Demo:<br><a href="https://demo.thi.ng/umbrella/ramp-scroll-anim/" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">demo.thi.ng/umbrella/ramp-scro</span><span class="invisible">ll-anim/</span></a></p><p>Source code:<br><a href="https://github.com/thi-ng/umbrella/blob/develop/examples/ramp-scroll-anim/src/index.ts" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">github.com/thi-ng/umbrella/blo</span><span class="invisible">b/develop/examples/ramp-scroll-anim/src/index.ts</span></a></p><p><a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> <a href="https://mastodon.thi.ng/tags/CSS" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>CSS</span></a> <a href="https://mastodon.thi.ng/tags/Tween" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Tween</span></a> <a href="https://mastodon.thi.ng/tags/Animation" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Animation</span></a> <a href="https://mastodon.thi.ng/tags/Transition" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Transition</span></a> <a href="https://mastodon.thi.ng/tags/Reactive" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Reactive</span></a> <a href="https://mastodon.thi.ng/tags/TypeScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>TypeScript</span></a> <a href="https://mastodon.thi.ng/tags/JavaScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>JavaScript</span></a> <a href="https://mastodon.thi.ng/tags/UI" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>UI</span></a></p>
Karsten Schmidt<p>So <a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> <a href="https://mastodon.thi.ng/tags/ReleaseMonday" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ReleaseMonday</span></a>: Today's release is the first time all 186 packages have been built using <a href="https://esbuild.github.io" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">esbuild.github.io</span><span class="invisible"></span></a> instead of TypeScript's own compiler (which is now only being used when needed for type checking and to generate type declaration files). The overall output format and target (ES2022) remains the same. I've been doing extensive tests with the various bundled examples and some other of my own projects, but should you run into any unexpected issues on your end, please do report back, either here or file an issue on GitHub. 🙏</p><p>New packages: In an effort to further reduce 3rd party runtime dependencies (of which there're almost none anyway), but also to improve performance, I've recently added <a href="https://thi.ng/msgpack" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/msgpack</span><span class="invisible"></span></a>, a serializer/deserializer for the <a href="https://msgpack.org/" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">msgpack.org/</span><span class="invisible"></span></a> format, which I've been using for various things, incl. the <a href="https://thi.ng/umbrella" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/umbrella</span><span class="invisible"></span></a> repo-wide doc search index (UI &amp; hosting location to be urgently updated/improved):</p><p><a href="https://demo.thi.ng/umbrella/rdom-search-docs/" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">demo.thi.ng/umbrella/rdom-sear</span><span class="invisible">ch-docs/</span></a></p><p>Also new: <a href="https://thi.ng/rdom-forms" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/rdom-forms</span><span class="invisible"></span></a>, a data-driven, declarative &amp; extensible HTML form generator based around <a href="https://thi.ng/hiccup-html" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/hiccup-html</span><span class="invisible"></span></a> &amp; <a href="https://thi.ng/rdom" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/rdom</span><span class="invisible"></span></a>. The form elements are unstyled by default, but highly customizable. In addition to being aimed at rdom (for using reactive form field values), it's also highly suitable for static HTML-generation or SSR purposes. Check out the new example project for details (also open the dev console to view HTML output).</p><p><a href="https://github.com/thi-ng/umbrella/tree/develop/examples/rdom-formgen" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">github.com/thi-ng/umbrella/tre</span><span class="invisible">e/develop/examples/rdom-formgen</span></a></p><p>I've already started updating/simplifying the UI generation of several other example projects in the repo, but the API of this new package is still WIP only. Be warned, there might/will be changes ahead...</p><p><a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> <a href="https://mastodon.thi.ng/tags/OpenSource" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>OpenSource</span></a> <a href="https://mastodon.thi.ng/tags/TypeScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>TypeScript</span></a> <a href="https://mastodon.thi.ng/tags/JavaScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>JavaScript</span></a> <a href="https://mastodon.thi.ng/tags/esbuild" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>esbuild</span></a></p>
Karsten Schmidt<p>Even though <a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> isn't using a low-level language, many of its design aspects and decisions are explicitly about keeping resource usage low and being generally aware of code bundling, tree shaking (dead code elimination), CPU, energy &amp; bandwidth consumptions... As the collection now consists of 186 libraries (with ~3850 source files!), every even minor saving in the shared build infrastructure will quickly have a positive compounding impact. Over the past month I've been busy updating &amp; testing new tooling for the entire monorepo and am super happy to report _drastically_ reduced build &amp; test times! "Drastically" here meaning a factor of 10-20x(!!!) faster... 🚀</p><p>Time to build &amp; test the entire monorepo on GitHub's CI:</p><p>Previously, using only TypeScript for building &amp; NodeJS for testing:<br>30-40 mins (😱)</p><p>Now, using <a href="https://esbuild.github.io" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">esbuild.github.io</span><span class="invisible"></span></a> for building and <a href="https://bun.sh" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">bun.sh</span><span class="invisible"></span></a> for testing:<br>1:50-2 mins (🤯)</p><p>On my MBA M1 (2021) the whole process only takes now 56 seconds!</p><p>If you want to apply the same kind of optimizations for your own project, do take a look at my package.json and tsconfig.json files in this repo:</p><p><a href="https://github.com/thi-ng/umbrella" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">github.com/thi-ng/umbrella</span><span class="invisible"></span></a></p><p>Ps. It's also <a href="https://mastodon.thi.ng/tags/ReleaseMonday" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ReleaseMonday</span></a>. Details about that in a later post... 🫡</p><p><a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> <a href="https://mastodon.thi.ng/tags/Optimization" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Optimization</span></a> <a href="https://mastodon.thi.ng/tags/CI" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>CI</span></a> <a href="https://mastodon.thi.ng/tags/BuildTools" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>BuildTools</span></a> <a href="https://mastodon.thi.ng/tags/EnergyConsumption" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>EnergyConsumption</span></a> <a href="https://mastodon.thi.ng/tags/TypeScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>TypeScript</span></a> <a href="https://mastodon.thi.ng/tags/esbuild" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>esbuild</span></a> <a href="https://mastodon.thi.ng/tags/Bun" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Bun</span></a> <a href="https://mastodon.thi.ng/tags/Monorepo" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Monorepo</span></a> <a href="https://mastodon.thi.ng/tags/OpenSource" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>OpenSource</span></a> <a href="https://mastodon.thi.ng/tags/GitHub" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GitHub</span></a></p>
Karsten Schmidt<p><a href="https://mastodon.thi.ng/tags/HowToThing" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>HowToThing</span></a> #028 — Randomized, space-filling, nested 2D grid layout generator using <a href="https://thi.ng/layout" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/layout</span><span class="invisible"></span></a> &amp; <a href="https://thi.ng/transducers" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/transducers</span><span class="invisible"></span></a></p><p>Already gave a glimpse of this yesterday[1]. This example uses the new `StackedLayout` generator to create random multi-column base layouts and allocate cells of varying sizes (column/row spans). Depending on size, each cell also has a probability to produce nested child layouts in its place (up to 4 levels). The example also shows how the layout gen can be queried to determine &amp; allocate any remaining empty space(s) at the bottom of each nesting level (since it's highly likely that there's such)... The result is a completely space-filling grid layout (which the new thi.ng website will likely be based on too, obviously with some of the more sane/usable/responsive configurations...)</p><p>Demo (reload for random config):<br><a href="https://demo.thi.ng/umbrella/layout-gridgen/" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">demo.thi.ng/umbrella/layout-gr</span><span class="invisible">idgen/</span></a></p><p>Source code:<br><a href="https://github.com/thi-ng/umbrella/blob/develop/examples/layout-gridgen/src/index.ts" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">github.com/thi-ng/umbrella/blo</span><span class="invisible">b/develop/examples/layout-gridgen/src/index.ts</span></a></p><p>If you have any questions about this topic or the packages used here, please reply in thread or use the discussion forum (or issue tracker):</p><p><a href="https://github.com/thi-ng/umbrella/discussions" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">github.com/thi-ng/umbrella/dis</span><span class="invisible">cussions</span></a></p><p>Ps. It's also <a href="https://mastodon.thi.ng/tags/ReleaseMonday" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ReleaseMonday</span></a> — check main <a href="https://thi.ng/umbrella" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">thi.ng/umbrella</span><span class="invisible"></span></a> readme for latest updates/changelogs... 🚀</p><p>[1] <a href="https://mastodon.thi.ng/@toxi/111317359454947648" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="ellipsis">mastodon.thi.ng/@toxi/11131735</span><span class="invisible">9454947648</span></a></p><p><a href="https://mastodon.thi.ng/tags/ThingUmbrella" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>ThingUmbrella</span></a> <a href="https://mastodon.thi.ng/tags/Grid" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Grid</span></a> <a href="https://mastodon.thi.ng/tags/Layout" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Layout</span></a> <a href="https://mastodon.thi.ng/tags/GenerativeDesign" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GenerativeDesign</span></a> <a href="https://mastodon.thi.ng/tags/GenerativeArt" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GenerativeArt</span></a> <a href="https://mastodon.thi.ng/tags/TypeScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>TypeScript</span></a> <a href="https://mastodon.thi.ng/tags/JavaScript" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>JavaScript</span></a> <a href="https://mastodon.thi.ng/tags/GUI" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>GUI</span></a> <a href="https://mastodon.thi.ng/tags/Frontend" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Frontend</span></a> <a href="https://mastodon.thi.ng/tags/Tutorial" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Tutorial</span></a></p>