se How ‘Playing It Safe’ Almost Cost Me Everything (Don’t Settle!) By chasejarvis.com Published On :: Mon, 07 Oct 2024 13:00:45 +0000 Playing it safe nearly cost me everything. Don’t settle—learn how to break free from self-betrayal and follow your true path. The post How ‘Playing It Safe’ Almost Cost Me Everything (Don’t Settle!) first appeared on Chase Jarvis. The post How ‘Playing It Safe’ Almost Cost Me Everything (Don’t Settle!) appeared first on Chase Jarvis. Full Article chasejarvisLIVE Podcast courage fear of failure growth mindset Never play it safe playing it safe risk risk-taking
se The Dark Side of Productivity Myths Exposed By chasejarvis.com Published On :: Wed, 30 Oct 2024 13:00:36 +0000 In this episode, Oliver Burkeman gets real with me about the power of embracing limits to unlock a richer, more productive life. We talk about his book, Meditations for Mortals, and unpack why so much of traditional time management is flawed. Instead of chasing perfection, Oliver shows how small, intentional steps and accepting our constraints can actually lead to more freedom and fulfillment. His take on “imperfectionism” and the value of presence offers a fresh way to tackle life’s demands. Some highlights we explore: Shifting from private doubts to taking small, meaningful actions Using “imperfectionism” to overcome perfectionism’s trap Letting go of control to reduce stress and gain momentum Enjoy! FOLLOW OLIVER BURKEMAN: twitter | website Listen to the Podcast Subscribe The post The Dark Side of Productivity Myths Exposed first appeared on Chase Jarvis. The post The Dark Side of Productivity Myths Exposed appeared first on Chase Jarvis. Full Article chasejarvisLIVE Podcast control imperfectionism limitations perfectionism productivity time management
se Why You’re Not Finding Your Purpose By chasejarvis.com Published On :: Thu, 07 Nov 2024 14:00:04 +0000 In this episode, Héctor García and Francesc Miralles, authors of books on Ikigai and Purushartha, talk about finding purpose and living meaningfully. They share how these ancient philosophies intersect and offer real ways to connect your passions, talents, and the needs of the world around you. From flow states and personal discovery to insights on genuine friendships and self-reflection, Héctor and Francesc explain how purpose is something built through experience, not stumbled upon. Some highlights we cover: The Four Circles of Ikigai for aligning love, skills, profession, and impact How flow states and personal experiences guide you to what matters Reflective practices like journaling and connecting with friends as tools for self-discovery Enjoy! FOLLOW HÉCTOR GARCÍA: twitter | instagram | linkedin | website FOLLOW FRANCESC MIRALLES: twitter | instagram | facebook | website Listen to the Podcast Subscribe The post Why You’re Not Finding Your Purpose first appeared on Chase Jarvis. The post Why You’re Not Finding Your Purpose appeared first on Chase Jarvis. Full Article chasejarvisLIVE Podcast finding your passion flow state ikigai journaling meaning of life passion purpose self-awareness self-knowing talent
se What Are the Common Misconceptions about Digital Trading Services? By cssdeck.com Published On :: Fri, 19 Jul 2024 12:49:20 +0000 Digital trading services have transformed the investment landscape for stocks, commodities, and other financial instruments. But do you know what’s true and what’s not about these services? Let’s dive into the common misconceptions surrounding digital trading and distinguish between myth [...] Read Article The post What Are the Common Misconceptions about Digital Trading Services? first appeared on CSS Reset. Full Article Uncategorized
se How CSS Enhances User Experience in Online Gaming By cssdeck.com Published On :: Tue, 17 Sep 2024 13:48:53 +0000 The world of online casinos is now more competitive than ever before. This forces online casinos to push the limits of technology and come up with unique designs focused on improving the user experience. Since most of such platforms offer similar [...] Read Article The post How CSS Enhances User Experience in Online Gaming first appeared on CSS Reset. Full Article Uncategorized
se How to Create a Computer Settings Icon By vectips.com Published On :: Tue, 26 Jan 2021 15:00:07 +0000 Welcome back to another icon dedicated tutorial, in which we’re going to learn how to quickly create a computer settings icon inside of Figma, using nothing more than a couple of basic geometric shapes. So, assuming you already have the software up and running let’s jump straight into it! Tutorial Details: Computer Settings Icon Program: […] The post How to Create a Computer Settings Icon appeared first on Vectips. Full Article Tips and Tricks figma glyph icon illustration vector
se How to Create a Security Icon By vectips.com Published On :: Thu, 28 Jan 2021 15:00:57 +0000 In today’s tutorial, we’re going to take a quick look behind the process of creating a security icon, and see how we can take some simple shapes and turn them into a finished usable product. So, assuming you already have Figma running in the background, let’s jump straight into it! Tutorial Details: Security Icon Program: […] The post How to Create a Security Icon appeared first on Vectips. Full Article Tips and Tricks design figma glyph glyph icon icon design illustration vector design vector icon
se Spark SEO By welovewp.com Published On :: Thu, 25 Feb 2021 21:13:15 +0000 Spark SEO offers search engine Optimisation services to small and medium local businesses. We are a remote team of absolute subject matter experts, and we are ready to help your local business grow Full Article Corporate WordPress Gallery Bootstrap CSS3 Fixed Navigation HTML5 Icons jQuery Parallax Responsive Scroll Slider Texture Typography Vector Video Video Background
se Sucuri Security WordPress Plugin Review By blogohblog.com Published On :: Thu, 09 May 2019 12:40:03 +0000 Sucuri Inc. is a globally recognized authority in all matters related to website security, with specialization in WordPress Security. The Sucuri Security WordPress plugin is free to all WordPress users. It is a security suite meant to complement your existing security posture. It offers its users a set of security features for their website, each... Full Article WordPress Security
se Becoming an Australian Citizen by Descent – A Path for Those Born Abroad By visaaustralia.com.au Published On :: Thu, 05 Sep 2024 02:01:11 +0000 Australia is a nation built on migration, with many citizens tracing their heritage back to different parts of the world. For those born outside Australia to Australian parents, citizenship by descent offers a direct route to becoming an Australian citizen. What is Citizenship by Descent? Citizenship by descent is a way for individuals born outside […] The post Becoming an Australian Citizen by Descent – A Path for Those Born Abroad appeared first on Australian Visa Experts. Full Article News australian citizenship australian parents character assessment citizenship australia citizenship by descent dual citizenship parental citizenship permanent resident proof of parentage relationship evidence
se If my business sponsors an overseas worker on a Temporary Skill Shortage (482) visa, can they work for another employer? By visaaustralia.com.au Published On :: Tue, 24 Sep 2024 03:43:19 +0000 When a Temporary Skill Shortage (TSS) visa (subclass 482) is granted by the Department of Home Affairs it come with a mandatory condition, Condition 8107. This condition governs the visa holder’s employment arrangements and ensures that they adhere to the requirements of the visa. While holding a TSS visa the individuals work rights were generally […] The post If my business sponsors an overseas worker on a Temporary Skill Shortage (482) visa, can they work for another employer? appeared first on Australian Visa Experts. Full Article News 482 visa Condition 8107 employment arrangements temporary workers TSS visa TSS visa holder visa requirements work rights worker exploitation
se Limiting your options on purpose By changingperspectives.de Published On :: Mon, 12 Sep 2016 11:55:19 +0000 Being a photographer with some spending money and a bad habit of lusting after gear, I have amassed a lot of photo gear. Due to that I am often carrying at least two lenses and also prefer zoom lenses versus […] Full Article Photo Tip Thoughts
se Constance Ephelia Seychelles By www.fubiz.net Published On :: Wed, 04 Jan 2023 12:20:04 +0000 Découverte du plus grand hôtel des Seychelles, situé dans un domaine immense pour un séjour avec des activités variés. Membre de la gamme des hôtels Constance avec une forte réputation, cet établissement est adapté pour les familles et les couples avec le luxe de choisir entre deux plages et cinq restaurants. Plus de détails en […] Full Article Photography Travel constance ephelia seychelles
se Timelapse Unveils the Sky Vault over the Joshua Tree National Park By www.fubiz.net Published On :: Sat, 07 Jan 2023 12:18:44 +0000 Le court métrage “Moonlight Mojave” est un sublime timelapse pris dans le parc national de Joshua Tree, dans un paysage nocturne. Un ciel étoilé hypnotique se déploie au dessus du désert que la lune et les étoiles illuminent comme si c’était le jour. Le film fait partie du projet Skyglow, qui veut sensibiliser au problème […] Full Article Nature Photography User Featured nature
se Beautiful Japanese Watercolours By www.fubiz.net Published On :: Tue, 10 Jan 2023 17:13:21 +0000 Sous les mains expertes de l’artiste serbe Endre Penovác, l’encre coule. Vivant son histoire naturellement, elle occupe l’espace sur le papier. Le peintre vient ensuite souligner quelques traits, dessiner des yeux, apporter une touche de couleur ou ajouter des détails qui viennent créer une texture. En ressortent des animaux sauvages et domestiques à l’allure quasi […] Full Article Graphic Painting Illustration painting
se Sexy Female Superheroes - Fashion Design Trends By icanbecreative.com Published On :: Wed, 17 May 23 20:55:30 +0300 The aesthetic world of female superheroes isn't just about battles and superpowers—it's also about stunning, innovative fashion that turns heads and inspire ... Full Article Design Inspiration
se Recreating The Iconic 'Mouse in Manhattan' Scenery From Tom & Jerry Classic Cartoons By icanbecreative.com Published On :: Sat, 10 Jun 23 20:28:30 +0300 Tom and Jerry, the mischievous cat and clever mouse duo, have been captivating audiences for generations with their hilarious antics. As a child, I was capt ... Full Article Design Roud-up
se Septerra Core Redesign: Legacy of the Creator Reimagined By icanbecreative.com Published On :: Sun, 10 Sep 23 12:46:16 +0300 Septerra Core: Legacy of the Creator stands as a testament to the golden era of role-playing games. With its intricate storyline, captivating characters, an ... Full Article Design Roud-up
se 18 Clever Logo Design Ideas: Fresh Showcase Of Creativity By icanbecreative.com Published On :: Thu, 05 Sep 24 11:11:27 +0300 The gallery features a collection of 18 cleverly implemented logo design ideas that highlight the art of logo creation. These logos showcase not only smart ... Full Article Logo Inspiration
se Personal User Interfaces: A.I. Augmented Reality And The Future Of Personalized Advertising By icanbecreative.com Published On :: Thu, 07 Nov 24 13:08:44 +0200 Technology today loves making stuff just for you, and it's changing the game in how we get our digital kicks. In an era where personalization is paramount, ... Full Article Learning
se Where is the Options Bar in Photoshop and How to Use It? By www.bittbox.com Published On :: Fri, 09 Jun 2023 11:31:10 +0000 One of the best things about Photoshop is its exceptional tool flexibility, simplifying our work and enhancing our productivity. The Options Bar works as a gateway to access all the options associated with the selected tool, enabling seamless customization and control over the tools for us. What is the Options Bar? The Options Bar is... The post Where is the Options Bar in Photoshop and How to Use It? appeared first on Bittbox. Full Article Photoshop
se Scale Tool in Illustrator: What It Does and How to Use It By www.bittbox.com Published On :: Mon, 12 Jun 2023 12:01:39 +0000 Ready to add the finishing touches to your design in Adobe Illustrator? But the objects aren’t properly aligned? Does your design look unprofessional because it isn’t adjusted properly? Well, worry no more! Because with just a few steps, this tutorial explains how to use Illustrator's Scale Tool to resize, adjust, and align your design perfectly. ... The post Scale Tool in Illustrator: What It Does and How to Use It appeared first on Bittbox. Full Article Illustrator
se How to Use the Vanishing Point Filter in Adobe Photoshop By www.bittbox.com Published On :: Wed, 21 Jun 2023 11:45:57 +0000 Have you ever seen the realistic concept art of games with many buildings and tall towers? Or the pictures of busy markets with giant billboards and advertisements? Or the images with street perspectives, including Photoshopped texts and digitally painted graffiti? These images grab our attention and appeal to our eyes. For a designer, artist, or... The post How to Use the Vanishing Point Filter in Adobe Photoshop appeared first on Bittbox. Full Article Photoshop
se How to Use the Slice Tool in Adobe Illustrator By www.bittbox.com Published On :: Tue, 04 Jul 2023 11:37:31 +0000 The Slice Tool in Illustrator is an excellent tool for dividing artwork into smaller pieces for various purposes, like web design, logo creation, creating interactive elements, and more. It separates parts of an element that can be saved as individual images. In this tutorial, we'll discuss the concept of the Slice Tool and provide a... The post How to Use the Slice Tool in Adobe Illustrator appeared first on Bittbox. Full Article Illustrator
se Presentation Slides: Frontend 2010, Norway By ndesign-studio.com Published On :: Tue, 26 Oct 2010 03:42:59 +0000 On Sep 2nd, 2010, I spoke at a design conference called Frontend 2010 (hosted by IXD) in Oslo, Norway. Below is the slide of my presentation. You may read the recap on Web Designer Wall or download the presentation at SlideShare. Full Article Blog Updates
se New Minimal & Responsive Theme Released at Themify By ndesign-studio.com Published On :: Tue, 31 May 2011 15:10:38 +0000 I just wanted to announce a new WordPress theme that I designed called Elemin. It is minimal theme coded with Google font, CSS3, Javascript and HTML5. The design is completely fluid and responsive (using CSS3 Media Queries). This means the layout automatically adapts based on the user’s viewport. To see it in action, visit the […] Full Article Blog Updates
se Cake Based on Phoenix Illustration By ndesign-studio.com Published On :: Fri, 01 Jun 2012 20:34:29 +0000 Check out this awesome cake made by Elena based on my Phoenix illustration. According to Elena, it took her about a week, 5 hours each day, to finish it. I’m amazed with the details and colors she input on the work. It depicts the features of the Chinese phoenix. The cake was for a local cake […] Full Article Blog Photos
se MIT offering free photography courses By www.tzplanet.com Published On :: Tue, 01 Jul 2014 22:26:08 +0000 MIT offering both graduate and undergraduate level photography courses for free. Related posts: "What Photography is and means", by Martin Gommel Underwater Photography: the Basics Fundamentals of Photography, Tom Ang – Book Review Full Article Photography News CLasses Courses Featured Free MIT
se Pathway to the Lighthouse (St Mary’s) By www.tzplanet.com Published On :: Fri, 11 Jul 2014 23:00:20 +0000 The St Mary's lighthouse is located on a tiny tidal island and accessible through a short causeway, just north of Whitley Bay, England. Related posts: Bonnington Linn – Falls of Clyde Full Article Focus on Images Featured Home Lighthouse Long Exposure monochrome Sea
se Dry St Mary’s Lighthouse By www.tzplanet.com Published On :: Sun, 27 Jul 2014 21:47:02 +0000 St. Mary's lighthouse The lighthouse is located on a tiny tidal island and accessible through a short causeway, just north of Whitley Bay, England. Related posts: Pathway to the Lighthouse (St Mary’s) Full Article Focus on Images Featured Home image Lighthouse
se It seems I’m a Reuters photographer By www.tzplanet.com Published On :: Wed, 30 Jul 2014 21:02:00 +0000 A publication used one of my images without license - Booo; they gave me credit for it - Yay; and Reuters?!? Related posts: Photo Competition: Environmental Photographer of the Year 2007 Sebastiao Salgado: The Photographer as Activist Environment: a Photographer’s Contribution Full Article Miscellaneous Antonio Marques Attribution Credit Featured Reuters
se How Woo merchants can use NFTs By woocommerce.com Published On :: Tue, 30 Jul 2024 21:01:17 +0000 Capitalize on NFTs for a quick boost. How to do it on WooCommerce. Learn the basics with examples, top tools, & tips for a successful NFT sale. Full Article Business Ideas Payments
se Spain-based DOMMA sees 350% YoY growth with WooCommerce and Google By woocommerce.com Published On :: Tue, 24 Sep 2024 12:31:25 +0000 How the wellness brand DOMMA achieved 350% year-over-year growth with one key tool. Can’t-miss success tips from a successful women-owned brand. Full Article Customer Stories
se How to choose an NFT and tokengating partner By woocommerce.com Published On :: Thu, 17 Oct 2024 10:00:00 +0000 How to navigate NFTs + the top considerations for choosing the right partner in this beginners guide for store owners. Full Article Enterprise Ecommerce Marketing Sell Online
se Top Life Project surpasses revenue goals by 59% in year one By woocommerce.com Published On :: Tue, 22 Oct 2024 17:28:57 +0000 How did Top Life Project exceed revenue goals by 59%? The story behind their WooCommerce-powered health brand & booming product launches. Full Article Customer Stories
se What are digital products? How to sell them in 2024 By woocommerce.com Published On :: Thu, 24 Oct 2024 16:09:10 +0000 Are digital products more profitable? How does inventory work? Examples you can start selling fast! The best tools to sell digital products. Full Article Business Ideas Sell Online
se First time of Starboard Waterline SUP on Horsetooth Reservoir By photokayaker.fit2paddle.com Published On :: Fri, 16 Jun 2023 00:45:59 +0000 In mid-June, I went paddleboarding on Horsetooth Reservoir, starting from Soldier Cove in Lory State Park. I believe it is the shortest walk from the park to the water and puts you in the middle of somewhat protected and quiet […] Full Article SUP trip reports Horsetooth Reservoir paddleboard Starboard Waterline
se Summer paddling, swimming and photography on Horsetooth Reservoir By photokayaker.fit2paddle.com Published On :: Mon, 18 Sep 2023 22:51:02 +0000 Stand up paddling During August 2023 I visited Horsetooth Reservoir several times with Starboard Waterline SUP, the same board I paddled in the Missouri River 340 race. It was rather a relaxed paddling with a lot of photography since I […] Full Article SUP trip reports navigational lights open water swimming paddling swimming
se 5 Best WordPress Hosting Providers to Choose From By wphacks.com Published On :: Sun, 02 Jan 2022 08:00:00 +0000 It’s easy to underestimate the effect hosting has on how well your WordPress website operates. The right hosting plan can […] The post 5 Best WordPress Hosting Providers to Choose From appeared first on WPHacks. Full Article Beginners Guide web hosting wordpress hosting
se Divi vs Elementor: Which WordPress Page Builder Plugin to Use and Why By wphacks.com Published On :: Tue, 04 Jan 2022 12:56:00 +0000 Divi and Elementor are two of the most popular visual page builders for WordPress on the market. Both tools have […] The post Divi vs Elementor: Which WordPress Page Builder Plugin to Use and Why appeared first on WPHacks. Full Article Plugins
se Save Your Camera! Use a Wrist Strap By alphatracks.com Published On :: Thu, 04 Nov 2021 17:08:47 +0000 Save Your Camera! Use a Wrist Strap Vampires, monsters, zombies, dropping your camera. When it... The post Save Your Camera! Use a Wrist Strap appeared first on Alphatracks. Full Article review Tips & Tricks Alphatracks Photography Wrist Strap
se No longer an Underdog, Sony cameras and lenses win multiple categories at TIPA 2022 World Awards By alphatracks.com Published On :: Sat, 04 Jun 2022 01:01:12 +0000 The Technical Image Press Association, otherwise known as TIPA, has just released its list of... The post No longer an Underdog, Sony cameras and lenses win multiple categories at TIPA 2022 World Awards appeared first on Alphatracks. Full Article E-Mount E-Mount Mirrorless Camera Sony Alpha Sony FE 24-70mm F2.8 Sony FE 70-200mm Sony ZV-E10 TIPA
se Self-Host Your Identity Provider with authentik By www.viget.com Published On :: Fri, 31 May 2024 00:00:00 -0400 Authentication! What a hassle! Evans, where's that SAML from Earth!? You start off simple enough — username / password authentication in your application. Then, well, someone mentions that traditional passwords are a security vulnerability, so maybe we should use one-time passwords. That inevitably leads to discussions about magic links and multi-factor authentication. Next thing you know, one dev is in a corner, rocking back and forth and muttering something about SAML, and another dev just left — walked out the door, never to be seen again. Well, not to worry, we've got just the tool for you. authentik is an open-source identity provider written in Python. I'm going to focus on the self-hosted version, but they also offer a paid enterprise plan if you want some extra support. Self-Hosting The philosophy of open-source tools and self-hosting is a big, complex topic for another post. In the world of SaaS products, you likely don't need to self-host. I quite like hosted identity providers like Clerk and Auth0. They're good and appropriate solutions for different types of apps and companies. But I just love to self-host tools. Tinkering and toying with Docker, reverse proxies, and sometimes even server hardware is a lot of fun to me. It does add complexity in some (or many) places, but a little extra complexity means you've got a little more control over your tooling. Self-hosting also allows me to disconnect from the Internet and still be able to work on features and enhancements in my projects. As long as I've already installed the relevant packages or pulled the right Docker images, I can keep working if I'm in a place where I can't (or don't want to) connect to the Internet. This is a small thing, but really important to me. authentik makes it really easy to self-host your application. Right out of the gates, they provide a Docker Compose example and a Kubernetes example. Getting authentik running took me about 10 minutes using the Docker Compose example. Most of that was reading. This can make authentik a great tool during the proof-of-concept or beta phase of your application, getting authentication out of the way so you can focus on building the cool and unique features of your app. Integrations One of the great things that authentik has waiting for you is a bunch of documentation on integrating with a lot of tools you probably already use. These integrations range from other self-hosted apps like Outline (another favorite of mine) to cloud providers like AWS and even platforms like WordPress. authentik's integration docs show you how to set up authentik for your existing providers and applications, so no need to dig around for the right configuration. Sure, if you're building your own application, you don't have the luxury of a README (until you write one, of course!), but don't worry — all the documentation you'll need for your choice of providers is at your fingertips. Personally, I'm fan of the OAuth2 provider for most my pet projects, but I also find the Proxy Provider to be a really great tool if you want to secure a static site that doesn't have any means of authenticating users. Customization This is a pretty nice default login screen, but maybe a mountain road isn't your vibe. You can change this background, add your own company logo, and add your own CSS. Just add your static files to your authentik deployment and modify to your heart's content. But actually, that's not even the cool part of the customization to me. authentik has the concepts of Flows and Stages that are used to determine what steps a user should take to log in, log out, and more. First, you define Stages that represent a single step of authentication — something like requiring a user to enter their username or a password. There's a whole lot to choose from. Once you've set up your Stages, you'll create a Flow, stringing those Stages together until you have a complete process to authenticate, register, or even delete a user. Flows can be imported and exported as .yaml files, making it easy to keep your Flows and Stages synced between different environments. authentik comes with a pretty reasonable set of default Flows and Stages. If you're setting authentik up just to try it out, you might not need to add anything. They do have a couple of example Flows to get you started, though. Flows and Stages can feel pretty intimidating. On your dev server, I'd recommend basically deleting all of the default Flows and Stages and building up new ones from scratch. It's the easiest way to learn how these pieces fit together. If you accidentally break something in dev, you can always just drop your database and spin up a fresh install. Conclusion authentik is an awesome tool and I've only scratched the surface of what it can do for you. As a self-hosted identity provider, it gives you a lot of control on how your services are authenticated. It's great for local development and beyond, and it has a lot of ready-to-go integrations for services you might already use. If you're interested in further reading, I'd definitely recommend checking out the docs on Outposts and External Sources. Hopefully this has given you some inspiration to spin up a local instance of authentik and try it out! It will definitely simplify your authentication needs. Here's your SAML, Mr. Horrible Gelatinous Blob! Full Article Code Back-end Engineering Security
se Handling Spelling Mistakes with Postgres Full Text Search By www.viget.com Published On :: Tue, 25 Jun 2024 12:37:00 -0400 Background # Postgres Full Text Search (FTS) is a great way to implement site search on a website running Postgres already, without requiring additional infrastructure. On a recent engagement with a client, we were deciding between Postgres FTS and ElasticSearch. Ultimately we chose FTS because we could spin it up without having to add extra infrastructure, as we would with ElasticSearch. Since the project was written in Ruby on Rails, we were able to use the excellent PgSearch gem to implement FTS in ActiveRecord. Multisearch # As we wanted a general site search, we needed to utilize multisearch. Multisearch combines multiple ActiveRecord models into one search 'document' table that you can search against. For example, if a user searches for some search term, and the search is configured for multisearch, then every single model that we mark as multisearchable will be searched for that term at the same time. See here for more detail. Search Features # PgSearch allows for different search features, tsearch, trigram, and dmetaphone. The default is tsearch, which uses the built-in Postgres Full Text Search. This was great for our use case, since it also comes with highlighting, a feature that was required. The highlighting is from a field returned by Postgres FTS, where it returns the text around the search term for context and bolds the search terms. Spelling Mistakes # Unfortunately, tsearch does not handle misspelled words. However, as I mentioned before, PgSearch allows for other search features! And trigram is a feature that can be installed via a Postgres extension (pg_trgm) that does just that. Trigram # The idea behind trigram search is to split pieces of text into sets of three-letter segments, and compare the sets to one another If two trigram sets are similar enough, we assume there was a spelling mistake, and return the document with the correctly-spelled term. As a quick example (ignoring whitespace): Consider the word Viget. Viget would make trigrams: [vig, ige, get] Now, consider our evil twin agency, Qiget. They would make trigrams [qig, ige, get] The two trigram sets match very closely, with only one of the trigrams not being the same. Thus, if we were to compare these with pg_trgm, we could reasonably tell that anyone typing 'Qiget' must have been actually looking for 'Viget', and just misspelled it. Working Trigram into our existing solution # PgSearch allows us to use multiple search features at once, so we can use tsearch and trigram side by side. Note that we cannot just replace tsearch with trigram due to needing some features in tsearch that are exclusive to it. Here is what an example configuration might look like. PgSearch.multisearch_options = { using: { tsearch: { prefix: true, highlight: { MaxFragments: 1 } }, trigram: { only: [:content] } } } Trigram (and timelines) causing issues # While it was easy to slot Trigram into our multisearch, it caused a pretty serious performance hit. We were seeing 50x-75x slower searches with both features combined than with just tsearch. We needed to find a way to balance performance with handling misspellings At the point that handling misspellings became prioritized, the entire search feature was almost fully QA'd and about ready to go out. There wasn't much time left in the budget to find a good solution for the issue. This thread from the PgSearch repo sums it up pretty well – there were multiple other users that were/are having similar issues as we were. The top-rated comment in this thread is someone mentioning that the solution was to just use ElasticSearch ('top-rated' is doing a lot of heavy lifting. It did have the most likes...at two). We needed to find some sort of middle ground solution that we could act on quickly. Postgres Documentation saves the day # In the docs for the Trigram Postgres extension, the writers give an idea for using Trigram in conjunction with Full Text Search. The general idea is to create a separate words table that has a Trigram index on it. Something like this worked for us. Note that we added an additional step with a temporary table. This was to allow us to filter out words that included non-alphabet characters. execute <<-SQL -- Need to make a temp table so we can remove non-alphabet characters like websites CREATE TEMP TABLE temp_words AS SELECT word FROM ts_stat('SELECT to_tsvector(''simple'', content) FROM pg_search_documents'); CREATE TABLE pg_search_words ( id SERIAL PRIMARY KEY, word text ); INSERT INTO pg_search_words (word) SELECT word FROM temp_words WHERE word ~ '^[a-zA-Z]+$'; CREATE INDEX pg_words_idx ON pg_search_words USING GIN (word gin_trgm_ops); DROP TABLE temp_words; SQL This words table is therefore populated with every unique word that exists in your search content table. For us, this table was pretty large. result = ActiveRecord::Base.connection.execute("SELECT COUNT(*) FROM pg_search_words").first['count'] puts result.first['count'] # => 1118644 Keeping the words table up-to-date # As mentioned in the docs, this table is separate from your search table. Therefore, it needs to be either periodically regenerated or at least have any new words added to search content also added to this table. One way to achieve this is with a trigger, which adds all new words (still filtering out non-alphabet characters) that are inserted into the documents table to the words table create_trigger("pg_search_documents_after_insert_update_row_tr", generated: true, compatibility: 1) .on("pg_search_documents") .after(:insert, :update) do <<-SQL_ACTIONS CREATE TEMP TABLE temp_words AS SELECT word FROM ts_stat('SELECT to_tsvector(''simple'', ' || quote_literal(NEW.content) || ')'); INSERT INTO pg_search_words (word) SELECT word FROM temp_words WHERE word ~ '^[a-zA-Z]+$'; DROP TABLE temp_words; SQL_ACTIONS end Note that this does not handle records being deleted from the table – that would need to be something separate. How we used the words table # Assuming for simplicity the user's search term is a single word, if the search returns no results, we compare the search term's trigram set to the trigram index on the words table, and return the closest match. Then, we'd show the closest match in a "Did you mean {correctly-spelled word}?" that hyperlinks to a search of the correctly-spelled word Given more time, I would have liked to explore options to speed up the combined FTS and Trigram search. I'm certain we could have improved on the performance issues, but I can't say for sure that we could have gotten the search time down to a reasonable amount. A future enhancement that would be pretty simple is to automatically search for that correctly-spelled word, removing the prompt to click the link. We could also change the text to something like "Showing results for {correctly-spelled word}". Ultimately, I think with the situation at hand, we made the right call implementing Trigram this way. The search is just as fast as before, and now in the case of misspellings, a user just has to follow the link to the correctly-spelled word and they will see the results they wanted very quickly. Full Article Code
se How we use DDEV, Vite and Tailwind with Craft CMS By www.viget.com Published On :: Wed, 10 Jul 2024 11:00:00 -0400 In 2022 we changed our dev tooling for new Craft CMS projects. Goodbye complex esoteric Webpack configuration, hello Vite. Goodbye complex esoteric Docker Compose configuration, hello DDEV. This small change in tooling has completely transformed our development experience. We start work faster and avoid wasting billable time debugging Webpack and Docker. From Webpack to Vite # Webpack has been the defacto way of bundling JavaScript and front end assets. It’s a powerful tool… but with that great power comes great responsibility complexity. Vite bills itself as the “next generation” of frontend tooling. Vite is much faster at bundling. But more importantly… its default configurations work great for most website projects. Before (Webpack) # Well over 300 lines of configuration spanning three files. Good luck making changes! After (Vite) # A crisp 30 - 50 lines of code. Want to switch to TypeScript? Need to drop in a popular front-end framework? Easy! All it takes is adding a plugin and 2-3 lines of config. Deleting old code has never felt this good! From Docker to DDEV # Docker is another development staple. It isolates server infrastructure into virtual “containers.” This helps avoid issues that arise from each developer having a slightly different setup. However, Docker can have a learning curve. Config changes, PHP upgrades and unexpected issues often eat up precious project time. Enter DDEV! DDEV describes itself as “Container superpowers with zero required Docker skills: environments in minutes, multiple concurrent projects, and less time to deployment.” We’ve found that statement to be 100% true. Before (Docker) # Every Craft project has a different Docker config. Bugs and upgrades required deep Docker experience. Last (but not least), it was difficult to run several projects at one time (ports often conflict). After (DDEV) # Performance is consistently better than our hand-rolled setup thanks to Mutagen and faster DB import/exports. Simultaneous projects run out of the box. DDEV provides (and maintains) a growing list of helpful shortcuts and DX features. Getting started # Ready to make the switch? Here’s how to set up DDEV, Vite and Tailwind on your own Craft project. Show me the config files already! # If you would rather see full config files instead of following step by step, check out our Craft Site Starter on GitHub. DDEV # Let’s set up a fresh DDEV project and start customizing. Make sure you have DDEV installed on your computer. If you’re a PHPStorm user, install the exceedingly helpful DDEV plugin. VS Code users have a similar plugin too! Follow Craft’s guide for creating a new project (they love DDEV too). Now you have a fresh .ddev/config.yaml just waiting to be customized. Node Version # Open your DDEV config and make sure your Node JS version matches Vite’s recommendations. nodejs_version: '20' # Vite 5 expects Node 18+ Ports for Vite’s dev server # Next, expose ports that Vite’s dev server uses will use to serve assets. web_extra_exposed_ports: - name: vite container_port: 3000 http_port: 3000 https_port: 3001 Routing ports can sometimes be confusing. This diagram might help! Vite’s dev server runs inside of DDEV’s web container (a Docker container). Until we expose these extra ports, any custom port within DDEV is unavailable to your host machine (your computer). When it’s time to configure Vite, we’ll use port 3000 HTTP and HTTPS traffic must use separate ports. We use port 3000 for http traffic and 3001 for https Run Vite automatically # Usually, you’ll want Vite to watch and build files automatically after you start a DDEV project. Using web_extra_daemons adds a separate background process (daemon) for Vite. web_extra_daemons: # Run Vite in a separate process - name: 'vite' command: 'npm install && npm run dev' directory: /var/www/html Use hooks to improve DX # DDEV’s powerful hooks system can run tasks before or after various DDEV commands. These post-start tasks keep dependencies and schemas up to date every time you start DDEV. hooks: post-start: - composer: install # Keeps installed packages up to date - exec: ./craft up # Apply migrations & project config changes Time for Vite # Vite is a Node app that’s installed with NPM. Your project will need a package.json. If you don’t have one set up yet, follow NPMs initialization script. ddev npm init # Don't forget to ignore node_modules! echo node_modules >> .gitignore ????Why ddev at the start of the command? This let’s us run NPM from within DDEV’s Docker containers. This means you’ll always be using the Node version configured for this project. DDEV has a bunch of shortcuts and aliases for running CLI commands (such as npm, yarn, craft and composer). Make sure your NPM package is configured for ES Modules # Our various config files will be using ES Module syntax for imports and exports. ddev npm pkg set type=module Install Vite! # ddev npm install --save-dev vite Add convenience scripts to package.json # "scripts": { "dev": "vite", "build": "vite build" } npm run dev runs Vite in dev mode. It watches and builds your files every save. Files are served through Vite’s dev server. npm run build bundles your JavaScript, CSS and static images for production. Your deploy process will usually call this script. Configure vite.config.js # Running Vite for a server rendered CMS requires some extra configuration. These options put production files in the right spot and keeps Vite’s dev server running on a specific port. import { defineConfig, loadEnv } from 'vite' // Match ports in .ddev/config.yaml and config/vite.php const HTTP_PORT = 3000 const HTTPS_PORT = 3001 export default defineConfig(({ command, mode }) => { const env = loadEnv(mode, process.cwd(), '') return { // In dev mode, we serve assets at the root of https://my.ddev.site:3000 // In production, files live in the /dist directory base: command === 'serve' ? '' : '/dist/', build: { manifest: true, // Where your production files end up outDir: './web/dist/', rollupOptions: { input: { // The entry point for Vite, we'll create this file soon app: 'src/js/app.js', }, }, }, server: { // Special address that respond to all network requests host: '0.0.0.0', // Use a strict port because we have to hard code this in vite.php strictPort: true, // This is the port running "inside" the Web container // It's the same as continer_port in .ddev/config.yaml port: HTTP_PORT, // Setting a specific origin ensures that your fonts & images load // correctly. Assumes you're accessing the front-end over https origin: env.PRIMARY_SITE_URL + ':' + HTTPS_PORT, }, } }) Add JavaScript and CSS files (Entrypoint) # Vite needs an entry point to determine what JavaScript, CSS and Front End assets it needs to compile. Remember src/js/app.js that we defined in vite.config.js? Let's make that file now. /* Make a file in src/js/app.js */ import '../css/app.css' console.log('Hello Craft CMS') We’ll also add our CSS as an import in app.js . In plain-old-JavaScript you can’t import CSS files. However, Vite uses this to figure out CSS dependencies for the project. Once Vite builds everything for production, you end up with a separate CSS file. The Craft Vite plugin includes this automatically with along your JavaScript bundle. /* Make a file in src/css/app.css */ body { background-color: peachpuff; } Install the Vite Craft Plugin # ddev composer require nystudio107/craft-vite ddev craft plugin/install vite Vite assets have different URLs in dev mode vs. production. In dev mode, assets are served from Vite’s dev server. It uses the ports that we defined in our DDEV & Vite configs. When Vite builds for production, filenames are hashed (app.js becomes app-BZi_KJSq.js). These hashes change when the contents of the file changes. Browser can cache these files indefinitely. When an asset changes, a whole new file is served. To help find these hashed filenames, Vite creates a manifest.json file. The manifest associates the name of your asset src/js/app.js to the hashed file that ends up on your server web/dist/assets/app-BZi_KJSq.js The Craft Vite Plugin by NYStudio107 takes care of all this routing for you. { "src/js/app.js": { "file": "assets/app-BZi_KJSq.js", "name": "app", "src": "src/js/app.js", "isEntry": true, "css": ["assets/app-BXePGY5I.css"] } } Configure the Vite Craft Plugin # Make a new plugin config file in config/vite.php <?php use crafthelpersApp; // Use the current host for dev server requests. Otherwise fall back to the primary site. $host = Craft::$app->getRequest()->getIsConsoleRequest() ? App::env('PRIMARY_SITE_URL') : Craft::$app->getRequest()->getHostInfo(); return [ 'devServerPublic' => "$host:3001", // Matches https_port in .ddev/config.yaml 'serverPublic' => '/dist/', 'useDevServer' => App::env('CRAFT_ENVIRONMENT') === 'dev', 'manifestPath' => '@webroot/dist/.vite/manifest.json', // Optional if using React or Preact // 'includeReactRefreshShim' => true, ]; Include your Vite bundles in Twig # The script and asset functions includes the appropriate files depending on in if you’re in dev mode or production. Clear out your templates/index.twig file and add the following snippet to your <head> tag. {# Load our main CSS file in dev mode to avoid FOUC #} {% if craft.vite.devServerRunning() %} <link rel="stylesheet" href="{{ craft.vite.asset("src/css/app.css") }}"> {% endif %} {{ craft.vite.script('src/js/app.js', false) }} Whew! ???? We’re at a point now where we can test our integration. Run ddev restart and then ddev launch . You should see “Hello Craft CMS” in your browser console. Setup Tailwind # Now that Vite is processing src/css/app.css, it’s time to install Tailwind and really get cooking. These steps are based on Tailwind’s official installation guide. But make sure to run all commands from within DDEV. Install packages # ddev npm install -D tailwindcss postcss cssnano autoprefixer # No DDEV shortcut for npx :( ddev exec npx tailwindcss init -p Configure template paths in tailwind.config.js # /** @type {import('tailwindcss').Config} */ export default { // Watch Twig templates and any JS or JSX that might use Tailwind classes. content: ['./templates/**/*.twig', './src/**/*.{js,jsx,ts,tsx,svg}'], theme: { extend: {}, }, plugins: [], } Configure postcss.config.js for production # export default { plugins: { tailwindcss: {}, autoprefixer: {}, ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}) } } Add Tailwind directives to src/css/app.css # @tailwind base; @tailwind components; @tailwind utilities; You’ll most likely need to run ddev restart again to get Vite to recognize your new Tailwind config. ❓ Do i need to set up live reload of Twig? Turns out it’s already done for you! Styling a Tailwind project means editing Twig files to change styles. It’s super handy to reload your browser every time you save. Normally you’d reach for vite-plugin-restart to get this functionality. However, Tailwind’s JIT mode automatically notifies Vite when CSS has compiled and the page should reload. That's a wrap! # That’s all it takes to configure a minimal DDEV and Vite project! We’ve found that both of these tools are easy to extend as a project get more complo'ex. Adding things like Redis or React are just a plugin install and a few lines of config away. ???? If you'd like to see this setup (and more) in a real-world Craft CMS project, check out our Craft Site Starter on GitHub. Go forth and Vite + DDEV to your heart’s desire. Full Article Code Content Management Tooling
se What is a Headless CMS and When Should I Use One? By www.viget.com Published On :: Wed, 17 Jul 2024 10:00:00 -0400 When starting a new project, decision makers are faced with the dilemma of choosing a content management system (CMS). Sometimes, it’s not that simple and they must choose whether to go with a traditional CMS or a headless CMS. Both offer unique benefits and cater to different needs, making it crucial to understand when each makes sense for your project. Let’s take a look at some considerations that can help you make the right decision.What is a Traditional CMS?Traditional CMS’s – like Craft CMS, WordPress, and Drupal – offer a pre-packaged solution for content creation, management, and delivery. They include powerful interfaces with content editing capabilities and templating out of the box, enabling you to create sites with ease. A traditional CMS can be monolithic because the back-end and front-end are tightly coupled. Using a traditional CMS typically means you are using all of the tools included to achieve your goal.What is a Headless CMS?A Headless CMS is like a Traditional CMS in that it includes content creation and management tools. But it differs in the fact that the back-end content management system is decoupled from the front-end (presentation layer), allowing developers to use any technology stack they prefer for building the front-end of the site. The back-end acts as an API with its only purpose being to serve content from the database. There are CMS options like Contentful, Payload, and Strapi that are built to be headless. Popular traditional CMS’s like Craft CMS and WordPress also offer headless variants.The Restaurant AnalogyLet’s simplify things a bit more and look at the decision using an analogy; a restaurant. Traditional Restaurant (Traditional CMS)Imagine a restaurant where the kitchen and dining room are connected. The chefs cook the food, and the waitstaff serve it directly to the customers in the same building. This setup means that everything is closely integrated, and the kitchen (back-end) is tightly coupled to the dining experience (front-end). Picture a scenario where the restaurant decides to change from table service to buffet style. The food now needs to be prepared in advance and delivered to the front of house in a different way, potentially even requiring new equipment. The restaurant needs to be reconfigured to not only accommodate the buffet but also to interface with the kitchen differently. Because the restaurant and kitchen are coupled, both sides would require work in order to accommodate a shift in strategy. Ghost Kitchen (Headless CMS)Now, think of a ghost (or cloud) kitchen where food is prepared centrally but can be delivered to various locations or dining experiences. The kitchen (back-end) focuses solely on cooking (content creation and management) and doesn't worry about where the food is served. Instead, the meals (content) can be delivered to different endpoints like food trucks, home deliveries, or partner restaurants (or in our case websites, mobile apps, etc.). This separation allows more flexibility in how and where the content is delivered without changing the core cooking process. If a new experience requires new equipment or processes, the kitchen can be expanded without affecting the front-end experience.When to Use a Headless CMSOmni-Channel Content Delivery If you consistently need to deliver content across multiple platforms (websites, mobile apps, IoT devices), a headless CMS is ideal because it can serve the same content through APIs to any front-end. The front-end can be swapped out without any need for development to the back-end.Scalability and FlexibilityIf you want the ability to keep your content management system up-to-date independently of the presentation layer, a headless CMS can allow for more agile and scalable development. This could be especially useful if you anticipate needing to redesign or update parts of the front-end frequently without affecting the back-end content.Front-end Framework PreferencesMaybe your team has developers who are very proficient in a particular JavaScript framework, like Next.js, SvelteKit, or Astro. The time needed to learn a new templating language could push you past your deadline. Maybe you have some cool interactive interface in mind? A headless CMS can provide the raw content for your developers to build highly custom, tailor-made front-ends in whatever language or framework they please.SecurityGoing headless can offer security advantages due to its decoupled nature. By communicating via API to the front-end, data access can be controlled more granularly. Because the back-end is only responsible for content management and delivery, fewer plugins are typically used which means a smaller chance of vulnerabilities due to third-party software.Hosting & InfrastructureA cloud-based headless CMS offers additional advantages over a self-hosted headless CMS. It can simplify maintenance and operating costs since the cloud provider is responsible for updates and security of the platform. Cloud-based solutions like Strapi Cloud often come with integrated security features, automatic backups, and disaster recovery options.Which will you choose?While the flexibility and security a headless CMS offers may be great benefits, it may not be necessary for every project and could even introduce complexity. It’s important to consider the long-term purpose of the project and who will be responsible for maintaining it as well as authoring content. If your primary focus is on managing and delivering content in a structured manner with rapid development, a traditional CMS can be an excellent choice. But if you feel any of the examples I’ve laid out above align with your project’s requirements then a headless CMS may be right for you! Whatever route you take, remember that both Craft CMS and WordPress can be used in traditional or headless applications and are a fine choice either way! Now you know the differences between a traditional and headless CMS, and an informed decision can be made. If you have more questions or a project you think could benefit from a traditional or headless CMS, we’d love to help! Full Article Code Front-end Engineering Back-end Engineering Content Management
se Use Behavioral Analytics Data to Make Your Site More Effective By www.viget.com Published On :: Tue, 10 Sep 2024 10:00:00 -0400 Behavioral analytics are a great way to get a sense of what users are or are not doing on your website or app. While behavioral analytics may not provide insights into why users are behaving a certain way, this method does provide a quick and cost-effective way to see what your users are currently doing at scale. Knowing how your users are engaging with your website or product can help you make informed decisions that have a positive impact on engagement and conversions.Here at Viget, we use behavioral analytics data for a number of use cases:Our client has a specific question about a certain aspect of their website or app (e.g., a specific user flow or content type) and wants to learn more about how and when users are engaging. We are redesigning a client’s website and want to get a sense of where the current experience is excelling or falling short.We are conducting an annual analysis to help clients keep an eye on potential areas of growth or stagnation. We are reviewing behavioral changes on a site or app after launching a new experience or feature to assess performance.But what kind of insights can you expect to find from behavioral analytics data? It ultimately depends on the website or app, the users, and the kinds of questions you are asking, but let’s go through a few different examples of what kind of information you can gain from behavioral analytics tools.Who is using your website or product?Understanding who is using your website can provide helpful context on your user base and potentially unlock growth with new user groups you may have been unaware of. To investigate this, we may look at geographic location, language, device type, and any other demographic information that may be available. Sometimes this kind of data provides what I like to call descriptive information—information that often doesn’t feel immediately actionable but can become more useful relative to other data points. This could come from comparing your data to last year, to industry standards, to other content on the website, or it might come from comparing it to an assumption that an individual or organization holds. Here are some examples of findings that shed light on who was using the website or product:✦32% of sessions were from users outside the United States. Through a previously conducted survey, we were aware that some users were looking for content that was not specific to the United States. This metric helped us better gauge the size of that need.✦97% of Canadian sessions interacted with the website in English, with only 3% of Canadian sessions using French. We were unsure to what degree French content needed to be prioritized and this metric helped provide a sense of scale.✦15% of searches were conducted on a mobile device. Although 15% may seem low, this metric was actually higher than expected because there were known issues with the mobile search experience. This demonstrated that even though the mobile experience was harder to use than the desktop version, users were still inclined to use it, further illustrating the importance of improving the mobile experience. How do users get to your website or product?Knowing how users navigate to your website or product can highlight what traffic sources are particularly effective in driving conversions, but it can also help to provide important context on user expectations or goals. To understand this, we look at both the source/medium that brought them to the website as well as the first page they viewed. For example, users might:Come from google and land on a blog articleGo directly to your home pageCome from an email referral to a donation page Learn about you from ChatGPT and land on your About pageFrom there, we might look at engagement rate, conversion rates, or other metrics to get a sense of what these users are doing and whether anything stands out as particularly effective or ineffective. Here are some examples of acquisition insights that informed our understanding and approach:✦Only 10% of sessions started on the home page, with most users starting much deeper in the site on content-specific pages. Because only a small portion of users entered on the homepage, we could not solely rely on homepage messaging to orient users to the site. This highlighted the importance of providing sufficient context on any page of the site to ensure that users navigate to their desired content, regardless of what page they land on.✦Although the paid ads were effective in driving users to the website, those sessions had abnormally high bounce rates, with one traffic source having a 95% bounce rate. This indicated a potential mismatch between what users expected based on the ad, and what was actually on the page.✦Organic search brought in a large amount of new traffic to their site through the blog pages and while users engaged with the blog content, they were not engaging with the CTAs. Because these new users were potentially learning about this organization for the first time, the donation CTAs were likely not the best fit, and we recommended shifting the CTAs on those pages to focus more on learning about the organization.What content or features do users engage with?Here is where we start to get to the meat of what your users are actually doing on your website or product. Knowing what users are doing and what they’re not using can help to establish priorities and inform decisions. You might be surprised to learn that users are actually engaging with specific features or content quite a bit, but others are barely used. If the content or feature is surprisingly popular, then we likely don’t want to outright remove it and may instead consider iterating or leveraging that offering more. If users aren’t engaging with content or a feature, it may be worth considering the effort to maintain and iterate on that offering. Here are some examples of engagement insights that helped us identify opportunities related to content or features:✦Less than 1% of users were engaging with a particular feature. These same users were showing high engagement with other features though, indicating that users either didn’t know this feature existed, knew the feature existed but didn’t understand the value add, or the feature was simply not something they needed.✦For a highly engaged audience, there wasn’t a standout page that most users visited. These users viewed a variety of pages across multiple sessions, typically viewing highly specific content pages. This indicated that instead of relying on a single page to drive conversions, getting users to the specific details they needed was likely a better approach in getting users to try the product.✦Nearly 84K sessions engaged with a particular content type. While this was lower than other content types, it was much higher than expected. It was largely organic traffic and the sessions were highly engaged. We recommended doing some additional research to better understand the potential opportunities with that type of content.What is the user journey or path?Another major area of investigation is the sequence of steps users take when viewing content or completing certain actions. This could be perusing content on the website, going through a signup funnel, or checking out to make a purchase. This helps us identify:the actual paths that lead to conversions (which is not always the path we assume it is) areas where users drop off at key points in the funnelmoments where users have to “turn around” in the journey, because the path laid before them doesn’t align with their needs This information can help you build towards a frictionless experience that encourages users to sign up, complete a purchase, or find the resources they need.Here are some examples of user journey insights that helped us understand where there were existing points of friction for users:✦While the CTA to demo the product appealed to users and they were quick to engage with it, it often resulted in users backtracking to the previous page. We hypothesized that users were eager to get to the demo, but were moving too quickly and missed important context, resulting in them having to go back to a previous page. We were able to confirm this with user testing and recommended transitioning some of that context to the CTA page.What “turning around” in the user journey can look like: ✦A select few products had abnormally high drop off rates, but at different stages depending on the product. For one product, there was an abnormally high cart-abandonment rate, and for another product, there was an abnormally low add-to-cart rate. Based on these findings we recommended looking further into what is impacting a user’s purchasing decisions.What dropoff can look like at different stages: The Ecosystem at LargeSome clients have a larger ecosystem of products or services, and it’s important to look at how users engage with and navigate across the ecosystem. This might include subdomains for a shop, a marketing site versus the product site, help documentation, etc. By looking at the larger ecosystem we can reveal important connections that are missing or connections that could be strengthened.Here are some examples of insights that demonstrated a need for changes in those ecosystem connections:✦For sessions where a user was looking for a particular kind of resource, 95% of the searches were done exclusively in a single subdomain or microsite. Through user interviews we were able to confirm that this siloed experience was intentional for experienced users but unintentional for less-experienced users, who were largely unaware of the other parts of the ecosystem that were available. We recommended making changes to improve discoverability of those other areas.✦For sessions where a user navigated between two domains, 75% of sessions navigated to the other domain to view documentation specifically. Yet, depending on the product, sometimes the documentation was hosted on a subdomain specific to documentation and sometimes it was available on the product domain. This created an inconsistent experience where for some products, users could find what they needed on the product website, but for other products, users were sent to an entirely different subdomain. We recommended creating a more consistent experience for users, where regardless of the product, the documentation would be found in the same location. Here at Viget, there are a wide variety of insights we may discover for any one project through behavioral analytics. These insights can help to identify new user groups, help to prioritize content or features maintenance and updates, or bring to attention moments in the user journey that are causing friction. These opportunities can help you bring in new users and retain your existing users, by providing an experience that aligns with their needs, whether that is finding resources, getting involved in a community, or making a purchase. If you’re interested in making your website or application more effective for your users by leveraging the power of behavioral analytics data, we’d love to hear from you. Full Article Strategy Data & Analytics Research
se Setting up a Python Project Using asdf, PDM, and Ruff By www.viget.com Published On :: Tue, 17 Sep 2024 10:00:00 -0400 When I was tasked with looking into alternative ways to set up a new Python project (not just using the good ol' pip and requirements.txt setup), I decided to try to find the tools that felt best to me, as someone who writes Python and Ruby. On this journey, I found a way to manage dependencies in Python that felt as good as bundler, among other great tools. The Runtime Version Manager # asdf has been my primary tool of choice for language version management for multiple years now. The ease of adding plugins and switching between versions of those plugins at a local or global level has saved me massive amounts of time compared to alternatives. If you've never set up asdf before, follow the instructions here to get it set up. For reference, I use fish for my shell, so I installed asdf using the "Fish & Git" section. Once you have asdf on your machine, the next step is to add the plugins you need for your project. Plugins are the actual tools that you want to manage the versions of, like NodeJS, Python, Ruby, etc. For the purposes here, I'll start with adding the plugin for Python: asdf plugin-add python Once you have added a plugin to asdf, you're ready to install various versions of that plugin. Since we just installed Python, we can install the version we want: asdf install python 3.12.4 # OR if we want to just use whatever the latest version is asdf install python latest Once the version you want is installed, you can tell asdf to use that version in the current directory by running: asdf local python 3.12.4 # OR asdf local python latest depending on which version of python you installed. The Dependency Manager # In the past, I just used pip install and requirements file(s) to handle most of this. I knew of other options, like pipx or pipenv, but I still have never tried using them. I was more interested in finding a dependency manager that did these things in a significantly different way than what I was used to with pip. Therefore, I wanted to find something that felt similar to bundler for Ruby. Luckily, very early on in my journey here, I found PDM. Upon reading what PDM did, I immediately decided to try it out and get a feel for what it offered. Some key notes for me that piqued my interest: Lockfile support Can run scripts in the "PDM environment" pdm run flask run -p 3000 executes the normal flask run -p 3000 command within the context of your installed packages with PDM. In other words, it adheres to PEP 582 and allows you to run project commands without needing to be in a virtual environment, which to me is a big plus. Similar commands to bundler pdm run => bundle exec pdm install => bundle install pdm add <package> => bundle add <gem-name> Note: My workflow was almost always to just add gem <gem-name> to the Gemfile rather than using bundle add, but there is no direct 1:1 equivalent of a Gemfile with PDM. Installing PDM # PDM has its own asdf plugin, so let's just use that here as well! Running: asdf plugin-add pdm adds the plugin itself to asdf, and running: asdf install pdm latest # can replace 'latest' with a specific version number here too installs the latest version of PDM. Finally, set the local version with: asdf local pdm latest ✦Side note about asdf local asdf local creates a .tool-versions file (if it doesn't already exist) in the current working directory, and appends the plugin and version number to it. At this point, the directory in which you ran asdf local python 3.12.4 and asdf local pdm latest should have that .tool-versions file, and the contents should be a line each for Python and PDM with their associated version numbers. This way, if someone else pulls down your project, they can just run asdf install and it will install the versions of those plugins, assuming the user has the necessary plugins added themselves. Now that we have PDM and Python set up, we're ready to use PDM to install whichever packages we need. For simplicity, let's set up a simple Flask app: pdm add flask flask-sqlalchemy flask-htmx This line adds Flask, Flask-SQLAlchemy and Flask HTMX. Flask is a web application framework, Flask-SQLAlchemy adds SQLAlchemy and its ORM, and HTMX builds on top of HTML to allow you to write more powerful HTML where you'd otherwise need some JS. Side note, but HTMX is really cool. If you haven't used it before, give it a go! I'm even a part of the exclusive group of HTMX CEOs. Linting and Formatting # Finally, I wanted to find a way to avoid pulling in multiple packages (commonly, Black, Flake8 and isort) to handle linting and formatting, which felt to me like it could be the job of one tool. Pretty quickly I was able to find Ruff which did everything I wanted it to, along with being really fast (thanks Rust ????). First things first, we need to install Ruff. Since it's a Python package, we can do it using PDM: pdm add ruff Once it's installed, we can use ruff check and ruff format to lint and format, respectively. Note that since we installed via PDM, we need to prepend those ruff calls with pdm run: pdm run ruff check --fix This runs the linter and fixes any issues found (if they are automatically fixable). The linter can also be run in --watch mode: pdm run ruff check --watch which re-lints on every saved change and tells you of any new errors it finds. The Ruff formatter is similar to use: pdm run ruff format which will automatically fix any formatting issues that it finds and can fix. If you want to use this in CI (which you should), you can use the --check flag that will instead exit with a non-zero status code, rather than actually formatting the files: pdm run ruff format --check Bringing it all together # Working with projects set up this way is much easier than how I used to do it. Using tools like asdf, PDM, and Ruff rather than pyenv, pip, and Black/Flake8/isort make both setting up projects and pulling down/installing existing projects more straightforward. I hope the contents of this article are helpful to anyone interested in setting up Python projects in a similar way. Full Article Code Back-end Engineering Tooling
se The Rise, And Fall, Of Adobe? By www.beyondphototips.com Published On :: Tue, 24 Sep 2024 10:03:51 +0000 This post: The Rise, And Fall, Of Adobe? was first published on Beyond Photo Tips by Susheel Chandradhas Many of us use Adobe tools regularly. I’ve used them since 1995, and I still do. But there was a time, a few years ago, when I was very frustrated with Adobe, and that I moved away from the Creative Cloud ecosystem. In the video coming up, Jazza explains why Adobe is so widely used […] This post: The Rise, And Fall, Of Adobe? was first published on Beyond Photo Tips Full Article Opinion Video Adobe Jazza SAAS
se RIP a Livecast #636 – Maggot May with special guest Necrosexual By metalinjection.net Published On :: Tue, 07 Sep 2021 20:35:00 +0000 We're excited to have our friend, the most electrifying man in corpse entertainment, Necrosexual join us at the top of the show to talk about his new EP, Seeds of […] Full Article RIP a Livecast featured2