My workflow for generating short form video

a work-in-progress update

I wanted to offer a quick update on a project that I have been working on for the past couple of weeks. I've been working on a basic terminal workflow for short form video generation that utilizes bash and ffmpeg. This simple stack has been great for prototyping, flexibility, and iterating on a rough idea; this stack choice has proved useful in yielding an effective result.

The project is tentatively called short-form-video-generation, and is able to generate music-synced short form videos that are ideal for the current social media landscape (E.g. tiktok, shorts, reels, etc.). All the workflow requires is an .mp3 file that that is under 60 seconds in duration and a .mov file that is over 1 minute in duration. Once the video and audio files are added, one only has to invoke a bash script via the sh command.

There are some aspects that should be considered for creating an optimal video:

  • the .mp3 audio file should be perfect loop
  • the .mov should be in the time lapse style such as:
    • painting process video
    • cooking process video

a simplified overview of how the script works:

Ffmpeg is used to convert the .mov file (from iPhone) to an .mp4 file. From there the duration of the audio file is read and declared as a variable using sed commands. This number is then divided by 16 to determine the length of each video clip. Once the clip length is determined, an ffmpeg command is used to split the video file into as many sequential clips with the specified clip duration as possible. Then the clip filenames are then randomly shuffled using the shuf command and outputted to a .txt file. Finally ffmpeg is used to concatenate the final video given the .txt file that contains the specified clips to use, the provided .mp3 file is added to the final video as well. The shuffle and concatenate step is repeated recursively ten times. This results in ten final videos to choose from; usually one final clip tends to highlight the interesting aspects of the original clip better than the others. I also managed to include a clean up function that removes all files except for the files in contained in the original/ and final/ directories.

This workflow, while crude, saves hours of editing time over the course of generating even 5 videos. This allows me time to be able to compose and produce bespoke music for my short form videos. If you would like to check out some of the videos that I have made using this workflow, you can check out some of my YouTube shorts here. I am excited to continue to develop this project, perhaps into a full fledged program for the open source community.

until then, code on,

devUserContact 🐦

I built a CLI application using Rust

my thoughts on getting rusty in the terminal

I'm writing this blog post just to say that I've written a small but useful terminal-based app using Rust called rrdir. This CLI application is used for r ecursively r emoving a dir ectory in your file tree. I got the idea develop this application when presented with the task of deleting all the node_modules directories that were scattered on my machine.

At first I considered creating a simple bash script but then I realized that I didn't want to set a sudo rm -rf command loose on my computer. So I turned to the famed, perhaps infamous, systems programming language Rust and I must say, I was not disappointed. I had always wanted to complete even a small project in Rust, this was my opportunity to do just that.

Something nice about a building a Rust app is that it compiles to a binary file. This makes for easy execution in the command line. Rust also made the prospect of permanently removing directories from my file tree feel much safer than if I had used a bash script (no matter how much I love Bash). rrdir is able to output the matching directories to the console and inquire weather or not the user would like to remove the list of directories. This allows the user a chance to inspect the returned list to see if there are any directories that should not be deleted. Rust's ownership system also guarantees that only the directories that were returned in the list will be removed.

Developing this CLI program was honestly great fun and I feel like I became more well acquainted with Rust as a result. If anyone who reads this is a more experienced Rust dev, I would appreciate any insight that you may have to offer in the form of a pull request or otherwise. Thank you in advance.

code on, devUserContact

What Has devUserContact Been Up To??

My programming journey as of late!

It has been a while since I have posted on this blog; but in all honesty, It is because I have been quite busy! allow me to fill you in on what I've been up to.


I am proud to announce that I have recently completed two certificate programs! The first certificate is one that I had been studying for on Coursera. This was a course offered by Google on the subject Data Analytics. I found it tremendously informative and I feel like the course did a great job in solidifying some of the fundamentals in a modern approach to programming. After all, almost all of what one deals with in computer programming involves data and the interpretation of data. This course helped me to formalize my understanding of The Data Life Cycle, which, in turn, helped me to achieve a more complete global understanding of my projects. The Google Data Analytics course also contained a great unit on writing larger SQL queries which I found quite illuminating and useful.

The second certificate that I completed more recently was from the NVIDIA Machine Learning Institute. This course was Fundamentals of Deep Learning, something that I have found interesting for a while now. It was a great to get my bearings in this expanding field of computer science. For the final test I had to create a neural network that leveraged computer vision to categorize images of fruit; we had to train our model to 95% accuracy! It was nice to get hands on experience with machine learning as well as receive an an introduction into how neural networks are trained and employed. I am especially looking forward to implementing the concepts that I learned in this course into my projects.

While taking the Fundamentals of Deep Learning course I also virtually attended NVIDIA's GTC ( G PU T echnology C onference ). I must say that it was actually mind-blowing. There are so many emerging industries in AI and Machine Learning, and tuning in to GTC was honestly an excellent opportunity to be able to get up to speed on all the new paradigms and technology in this field. Between the NVIDIA conference and course I was able to learn a lot about this exciting new frontier.


Aside from resuming regular commits on my GitHub, this is a bit of what I have been up to development wise. I have added some new features to this blog such as animated loading text. I also implemented a ThreeJS graphic on the landing page that you can checkout here! Thanks for taking the time to check in on my development blog; it's always a pleasure to be able to write these posts that keep folks in the loop on my programming endeavors.

code on, devUserContact 🐦

My First Pull Request

Thoughts on Github

In my daily programming adventures, I was able to accomplish something pretty sweet. I made my first pull request on Github! Even more exciting, The pull request was merged to the main repository!

I use Github for personal projects almost everyday. However the prospect of coming across an error in someone else's repository and, on top of that, knowing what could be done to correct said error always felt out of reach to me. Now I realize that making a pull request is more about everyone helping each other improve the quality of code wherever possible. So what is this error I had discovered that I was also able to fix? Was is patching some security flaw in a repository that is responsible for facilitating global fiscal transactions? Was it fixing a bug in a popular framework so that hundreds of thousands of devs could now be spared a headache debugging their projects??

I'll tell you what I was able to fix; it was a typo in a README file that contained a broken link! Here is how it happened.

I've been a little more active of Github lately because I've been branching out trying to get into some new languages; currently I've been pretty interested in Rust. Rust is a great language for exploring generally younger repositories on Github because the Rust language has a great open-source community that is currently growing steadily with new projects being started often. I was trying out a game engine written in Rust called Bevy. I was downloading a bunch of different Bevy Assets to try out for a game dev project that I'm planning on starting. When I was diving into some of the documentation on these bevy plugins I was executing a lot of the code examples that are included in their repective Github repositories. Upon running one of the examples I noticed that a name change in one of the example rust files had not yet been updated in the repositories README where the examples where listed. I was surprised to discover this but I quickly started researching how to properly submit a pull request on Github. I was able to submit the typo edit to the main repository where my commits would eventually would be merged.

In this experience I came to the realize how open Github truly is. Being able to contribute to any public repository is an indispensable feature that should be utilized and not avoided due to its perceived complexity. As for the repository that I was able to make my small contribution, check out bevy_ecs_tilemap! It is a great Rust crate for designing tile-maps in a manner that fits the ECS design pattern of Bevy.

I am looking forward to continuing working on my projects in computer programming with my newfound enthusiasm for Github and the open source ecosystem. If I could offer any advice on the subject of leveling up your git / Github skills it would be this. Once you get comfortable using git / Github, try to use all the features! You might be surprised on how code collaborating can encourage, as well as, inspire you development process. Using Github in this way will increase your exposure to code and will acclimate you to the vastness of the open-source ecosystem. Eventually you might find that you knew more than you thought you did all along.

as always, code on,

devUserContact 🐦

Emoji Fortune: My latest project

a fun application for your next fortune reading 🔮

I'm pleased to debut my most recent project: Emoji Fortune

Emoji Fortune is an app that reveals your fortune in a unique set of emoji. I had a great time developing this idea; I managed to make a few improvements in my workflow this time around. For the first time, I used a bash script that I wrote to automatically generate a custom template for my Next.js app. I enjoyed the benefits of not having to remove the default Next.js page, it honestly felt like it saved me a considerable amount of time.

Something interesting that came about while developing this app was the task of creating a JSON file that contained all of the current emoji. I decided to create a separate GitHub repository for it so that it could be shared easily: Emoji - Complete List

I am excited to continue implementing ideas for this project because I find emoji so amusing. I am also inspired by the potential this app has to create a moment of enjoyment for anyone. To me, it is great that the internet can be used for this purpose.

code on, devUserContact 🐦

Blog Updates

Cataloging some developments

I've been busy building out my blogs backend and general infrastructure. Here is a list of some things that have been implemented and improved:


I designed my backend to deliver data from separate databases to multiple blogs


I migrated my backend application to the java language

  • Within java I used Spring Boot Framework
  • While I found Spring boot somewhat opinionated I grew to appreciate its robust design patterns.
  • Setting up my Java Spring Boot application as my backend meant configuring a server on Linode.
    • This required that I manually configure SSL certificates as well as a custom CORS configuration. I was able to accomplish this with by implementing a reverse proxy with Iginx.

I implemented GraphQL into my stack

  • The process of implementing GraphQL into my existing project was simple enough and provided the benefit of being able to easily standardize variable names across all of my front end applications.
  • GraphQL has great potential for efficiency because it helps to solve a problem called over-fetching. This can occur when a GETrequest is made by the front end for a whole row of data when only one column of that row is needed to perform a function.

I have started an art blog

  • You can visit my new blog at artusercontact.com
  • With this art blog being slightly more abstract than my blog here are devUserContact, I am able to test and implement features on my blogs more easily.
  • I'm loving the ethos of computer programming regarding duplication and variation. It becomes so easy to execute variations of the same idea. There is truly so much one can accomplish with code.
  • With this art blog complete as proof of concept; I can say with certainty that there will be more blogs on different subjects to come.

Thoughts:

With having learned so much through implementing these changes in my stack, I am inspired and excited to learn even more as I progress in the field of web development and computer programming. As always, I hope that you have found my posts even remotely informative. My toDoList.md has been getting pretty long so stay tuned for more updates and projects.

code on, devUserContact 🐦

A Little Info About This Blog

A few things about this blog while I continue building it

I have been learning a lot while building this blog. I'll explain a bit about the tech stack that I used to develop it. I will provide links throughout this post so you may investigate these languages and frameworks for yourself.


The Database: MariaDB hosted on Linode server

I chose MariaDB for my database; while searching for potential options, I had read that their website has excellent documentation. I was not disapointed! Concepts in the documentation are explained clearly with great examples as well. MariaDB is also a fork of MySQL so it's nice to know that what you learn will carry over to other relational database languages.

I chose to host my database on Linode because I enjoy using Linux operating systems. I'm using their Alpine distribution option because it is their most lightweight offering so it pairs well with their most basic hosting plan. Linode also has an excellent dashboard with analytics that provide plenty of data on your node as well as account security.


The Backend: Nodejs hosted on Digital Ocean

Nodejs is a good framework to start learning backend programming because it is built on top of the JavaScript language. So far, the backend that I have constructed for this blog is somewhat simple; but I plan on expanding its functionality over time.

Digital Ocean is a hosting service that I've wanted to try for a while (having used Heroku before); and I've been enjoying the user experience so far. Regarding my experience configuring my backend application, I had to do a little digging to understand how to edit your app's encrypted environment variables after its been deployed. Their CLI is nice as well.


The Frontend: Nextjs hosted on Netlify

Nextjs is an opinionated react framework that requires less configuration than a vanilla react app. I've built a few apps with Nextjs so this blog project was a great opportunity for me to take a deeper dive into the framework. Nextjs has useful tools built in such as a ESLint and an optimized router.

Netlify was an easy choice to make for hosting my frontend simply for its free tier plan. Their basic plan is more than effective for hosting even multiple projects, You get 300 minutes of build time per month and free custom URLs when using the netlify.app domain. They also provide a useful link that displays the status of your app; this is especially useful for your repository README.md on GitHub.


Final Thoughts:

This blog was my first project where I attempted to tackle a full-stack architecture. It's been a great learning experience and has given me the practical knowledge to be able to conceptualize how I may develop larger projects going forward. I hope that this article might have been useful to you.

coding on, devUserContact 🐦

My First Blog Post

Excited to share my developments with the web

Greetings all,

This is a first for me, but I'm quite intrigued to be able to share my projects with the world through this blog template that I've created. for my first post I will demonstrate my affinity for figlet by using a codeblock:

 _          _   _                             _        
| |        | | | |                           | |    |  
| |     _  | | | |  __             __   ,_   | |  __|  
|/ \   |/  |/  |/  /  \_  |  |  |_/  \_/  |  |/  /  |  
|   |_/|__/|__/|__/\__/    \/ \/  \__/    |_/|__/\_/|_/

I've always enjoyed figlet; it brings me nostalgic memories of beginning to play around in the terminal and becoming interested in code. That's all for now, I hope that you continue to enjoy these posts.

best, devUserContact 🐦