Originally published at valerieburzynski.com For the uninitiated, "Standup" is a metaphoric title given to a daily team meeting where all attendees stand. The intent of this is to hasten the meeting while achieving an objective: to have the team discuss... ]]>
Originally published at valerieburzynski.com The Journey Begins At the end of last year my main work machine was upgraded to a MacBook Pro with an M1 Max processor. I quickly got to work setting up my usual dev environment, then cloned the git project... ]]>
In this ongoing series, we're going to explore Rails Test Driven Development by focusing on katas. In the art of Karate, a kata is a form, or choreographed sequence of movements, practiced repetitiously with the intent of making incremental improvement... ]]>
This RegEx Will Change How You Design With Tailwind Are you using TailwindCSS in you project? … of course you are it's all the rage lately, and everyone’s using it. Need to change all the color based utilities in your app because you need to... ]]>
Hello again. Thank you for sticking with me through the first three posts in this series. We are finally to the part that triggered the series in the first place. Phoenix is great at helping us stay focused on the server end of the client-server paradigm... ]]>
Welcome to the third installment of our series on building a 'Single Page App' with Phoenix LiveView. In this series we are exploring building a highly interactive application that most devs would assume has to be coded in javascript in the browser... ]]>
As promised in the first article of this series we are about to embark on a journey to build a collaborative rich text editor widget. In this post we will do all the setup work of starting a new Phoenix LiveView app, adding a Document context and doing... ]]>
As an industry we’ve been very focused on frictionless and fast user interactions on the web, and rightly so. We’ve been pushing our tools to the limit for decades. Every turn of the wheel brings progress, but also its own set of weaknesses. In the... ]]>
We need relationships in our lives. It’s part of what makes us human. However, in an era of remote work and outside restrictions, how do we make time for the small conversations that we used to take for granted in our lives and on which so many relationships... ]]>
Thinking about my last post triggered me to finally read Kill it with Fire by Marianne Bellotti. The book is all about modernizing legacy systems, which is something developers have to do frequently. Often, systems that are working well tend to get... ]]>
When I was a child, my parents had this concept about words we don't say. We don't say "sh*t" or "d*mn". They called them "four letter words." Kind of silly in retrospect, given all the four letter words we do say. What would the world be without love... ]]>
When the end of the year approaches and the weather (depending where you are!) begins to have a snap in the air, the holiday season is near. Here at Bendyworks, the change isn’t personified in an office tree or snacks showing up in the breakroom. That... ]]>
Why Tailwind is awesome TailwindCSS is taking the world by storm. It is essentially a set of composable, opinionated utility classes that allows for a consistent set of colors, spacings, sizes, shadows and more. Tailwind gives a developer or designer... ]]>
Bendyworks is dipping it's collective toes in the Elixir waters. Several of us have been reading, taking courses and building practice apps to become proficient at writing Elixir and using the Phoenix framework. This activity includes sending a contingent... ]]>
In the previous post in this series , we created a portable development environment with docker-compose. I've noticed that a lot of blog posts and tutorials for Dockerizing Rails apps tend to finish before covering the subject of testing within Docker... ]]>
I really wanted to attend Data Con LA in person this year. Unfortunately, that wasn't an option, thanks to the delta variant of COVID-19 and Americans not being vaccinated at a high enough rate to reach herd immunity. So instead, for the second year... ]]>
In the time following the start of the COVID pandemic, Bendyworks transformed from an office-based team of software developers in downtown Madison, Wisconsin, to an all-remote company with employees in half a dozen states. In spite of the many challenges... ]]>
Building phone apps used to be simpler. There were a small number of phone sizes and an even smaller number of screen sizes to support. Your app always took up the whole screen so developers tended to target particular screen sizes and exact pixel... ]]>
Phones and tablets come in all shapes and sizes. Now that Mac, Windows and tvOS support is in the works, the variation in screen geometries will only grow even more varied. On the web we have media queries and responsive layouts via Cascading Style... ]]>
In part 1 of this series , we created a Dockerfile that encompasses the Rails portion of our app, now we need to connect it with other services. docker-compose is a lightweight orchestration tool that's perfect for this purpose. I don't recommend using... ]]>
One of the most difficult things as a developer when working on a team is onboarding. The process usually goes something like this: Look at the README, install dependencies, realize that something is missing or out of date, ask another developer for... ]]>
Introduction Rails is a highly productive, highly opinionated, and very popular framework in which to create monolithic web applications. Due to the dominance of reactive Javascript frameworks such as React and Angular, the monolithic style of creating... ]]>
Recently, an advisor asked me a simple question: "What's Bendyworks' customer retention over the past 18 months?" Truth to tell, I really didn't know, so I decided to go look, expecting a mix. I was surprised to find that every single project was either... ]]>
What The Javascript? Consider for a moment, the problematic code sample below that unexpectedly evaluates to undefined : Exhibit A // for educational purposes only; the following line is a bug _ . get ( state [ ' key1 ' , ' key2 ' ], {}); It's using lodash ]]>
When I first heard about Windows Subsystem for Linux (WSL), I got excited. I hadn't used Windows for development in years. Configuring Node and Ruby on Rails in Linux or on a Mac was easy; so I didn't have much impetus to switch. I'd also heard of... ]]>
Redux is a popular tool which is used to manage application state in JavaScript. Redux is based on three core principles : that application state should be kept in a single store, that the state should only be changed by discrete and well-defined actions... ]]>
When? Now! Interactions on the internet today appear to be so fluid and instant. It's becoming more unacceptable from today's user experience perspective to have to refresh the web page when data changes. We want the changes to be reflected instantly... ]]>
This is part 6/6 of the "Capacitor Plugin for Text Detection" series. At this point, we have both android and iOS plugins in place and ready to use. In this post, let's flesh out our sample app, ImageReader to use the result from the plugins to obtain... ]]>
This is part 5/6 of the "Capacitor Plugin for Text Detection" series. In the previous post , we walked through how to use our plugin in the sample app, ImageReader . In this post, let's dive into developing our android plugin. Android Plugin To use... ]]>
This is part 4/6 of the "Capacitor Plugin for Text Detection" series. In the previous post , we cleaned up the web implementation of the plugin and added a shim between our plugin and client code. In this post, let's look into actually using the plugin... ]]>
This is part 3/6 of the "Capacitor Plugin for Text Detection" series. In the previous post , we created an iOS plugin. In this post, while we aren't quite implementing a web plugin, we'll modify the web plugin to reflect the fact, and also add a shim... ]]>
This is part 2/6 of the "Capacitor Plugin for Text Detection" series. In the previous post , we created a skeleton plugin and a sample app ( ImageReader ) to work with the plugin. In this post, let's dive into creating an iOS Plugin for detecting text... ]]>
Introduction In this series of blog posts, I'm going to walk through building a Capacitor Plugin, specifically a Text Detection plugin using CoreML and MLKit. Capacitor plugins are handy when you're writing a Hybrid App with Ionic or a PWA but want... ]]>
Building an Ember App that connects to a JSON API server Phase 1: Setting up your projects Phase 2: Designing your API with Swagger and JSON API Phase 3: Developing an API with Express and Swagger Phase 4: Building an Ember App that connects... ]]>
Tools, tools and tools It's good to have different tools to solve different problems or build different types of web applications and websites. This gives developers a lot of power, flexibility, and ability to really squeeze all of the power and potential... ]]>
Bendyworks has recently been exploring how to better support remote workers, with the end goal of becoming a fully hybrid remote office. We have always supported remote work when necessary or beneficial, but until now we have not supported fully remote... ]]>
Introduction Rails 6 is now out and can be used by the public. In a previous post , I took a look at Active Storage; a new framework bundled with Rails 5.2. The framework highlighted today comes fresh out of the Rails 6: Action Text. We'll be going... ]]>
Bendyworks recently had the amazing opportunity to host a small get together for the students of Maydm . Maydm describes themselves as: Integrating computer science learning, mentorships, & internships through programs that prepare students for... ]]>
Introduction When storing static files in Rails, the first toolsets I reach for are 3rd party gems like: CarrierWave or Paperclip (before they deprecated it in favor of Active Storage). Active Storage was introduced with Rails 5.2. Check out the ]]>
This is it. 31 blog posts in 31 days. Writing a month of flutter has been a ton of work but also lots of fun and a good learning experience. I really appreciate how supportive and and positive everyone as been. Publishing experience For the series... ]]>
For the last post before the month's wrap up tomorrow, I wanted to do something more fun: use a hero animation between the home page list and the individual post page. When I first implemented the Hero animation it never worked going back from a ]]>
Yesterday I implemented saving new users to Firestore but I wasn't happy with the implementation. So today I refactored everything , well not everything but a lot. There are still areas for improvement but I like the general pattern being used now. ]]>
Today was supposed to be simple. Take form values , save them in Firestore . It works but the current implementation is messy so I'm going to walk through the work in progress (WIP) code and refactor it tomorrow. The larger architectural change was... ]]>
When a user signs in with Google I'm going to create a user document in Firestore. Each authenticated user should only be able to create one user document. These documents will eventually be readable by other users so Firestore needs to have server... ]]>
One aspect of using Firestore for my data backend means I need to be certain my security rules are configured correctly. Otherwise users might be able to read or write date they shouldn't have access to. A few days ago I set up Firestore in the server ]]>
For this festive day of Christmas, I'm going to do something more fun and add a fancy icon. For android I will be using an adaptive icon so that it looks good in any shape and has a nice wiggle of movement . A big thank you goes to @tommy_emo_ for... ]]>
After a user signs in with Google and registers , their info needs to be saved to a databasee. I'm going to use Firebase Firestore as my backend. Within the birb codebase I'm going to create a server directory and initialize a Firestore project inside... ]]>
With the new user registration form in place, it's time to make sure the form is tested and will work as expected. There are basically five different states that need to be tested. Default state This is the view users will first arrive to and here... ]]>
After a user navigates to the registration page , they should be able to enter their name and agree to the Terms of Service/Privacy Policy. I'll start by updating RegisterPage to render a RegisterForm widget that I'll create in a minute. Wrapped around... ]]>
With users now being able to sign in with Google , I want to have them confirm their name and agree to a terms of service. To lay the groundwork I'm going to add a placeholder RegisterPage and navigation to it . This will be my second page, of what... ]]>