Jody Bruchon profile
Jody Bruchon
Jody Bruchon
I like to help people become better in every way I can. I do this through my videos, my software, and my essays online.
Subscribe
Send Message

Share

Tell people about this page...

Subscription Tiers

$5
per month
10e9653c 36ba 4ec8 bdba 1ace604906ba 120x120 209x28 203x203
Casual Supporter

There are no tangible rewards for this tier other than my appreciation. Your support is very important to me. As always, I am happy to receive your input and feedback regardless of your level of support, so feel free to email me at [email protected] anytime.

2 subscribers
Unlock
$25
per month
595006be af87 481f 8dc4 7ba9555ea168 120x120 274x2 3115x3115
Bronze Supporter

In addition to my eternal gratitude that you got from the lowest tier, supporters at this level will be placed in the end credits in any tutorial videos I produce. I may also occasionally ask for your feedback on something.

Note that if I don't reach the tier required to produce tutorial videos and I don't need any feedback from a wide audience, this tier effectively doesn't come with rewards other than my arbitrarily higher gratitude and you feeling good about doing your part to support open source software development.

0 subscribers
Unlock
$50
per month
A2caea0f 693e 41a0 94be 91380a69813a 120x120 1432x6 2553x2554
Silver Supporter

Wow! You're pretty serious about helping me out, eh? For your generosity and consideration, you will become part of my inner circle of advisors. I will occasionally ask for your opinions and feedback. This isn't the same as paying for implementing a feature, but if you want to push for certain fixes or features to be handled sooner, this is the best place to do it.

If I create any tutorial videos while you are at this tier, I will also mention you in the video credits.

As always, my gratitude comes with your support.

0 subscribers
Unlock
$100
per month
854f6256 5a28 4838 bc50 633216878fd0 120x120 0x893 2738x2739
Gold Supporter

You're a superstar! In addition to the Silver tier offering, I'll place you very prominently in any videos I make AND I'll add thanks to you in the documentation and long-form help text for the software.

You must remain a supporter at this level for the help text and "current gold supporter" documentation credits, but past Gold tier supporters will remain mentioned in the documentation.

In addition, since only about 30 people at this level of support would free me up to work on my software full-time, you're making a major ongoing contribution to open source software development.

0 subscribers
Unlock
$250
per month
570940b6 ba7c 4c42 8e41 e02a1cb075b3 120x120 207x0 2740x2737
Platinum Supporter

Are you rich? Do you need your bank account to lighten up? Then this tier is for you! This is exclusively for people who want to make a major contribution to open source development. You'll obviously receive all of the Gold benefits, but Platinum comes with special perks, which is why so few people can join this tier.

At this level, you get to steer my development to a much greater extent than anyone else. You want a feature implemented? I'll work on it. You want a new software tool written? I'll make it. You want me to fix something in the software that's driving you a little bit nuts? I'll fix it. All of this assumes your request is within my abilities and can be reasonably implemented, so if you want to join this tier to get something done, email me first and tell me what you're after to make sure I can do it!

Any video tutorials I make during membership in this tier will contain spoken and visual credits and thanks to you near the start of the video, along with a 10-15 second statement of your choosing (must be work-safe). You will feature prominently in the software documentation and help text for any software I am working on at the time. While a part of this tier, if you request a bug fix, feature, or new program, and I fulfill that request, I'll credit you in the software's change log and/or commit history for anything you're involved in.

Did I mention that I'll give you gratitude? Because I'll definitely give you a truckload of gratitude.

Limited (0 out of 4) subscriptions
Unlock

Welcome

  • Subscriptions will increase the amount of time I can work on my software projects for you instead of doing mundane work for someone else.

Recent posts

Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post

I made youtube-dlc faster when using an archive file

For all the details as well as a video showing off the difference in performance, read my article on jodybruchon.com! The short version is that I made the archive file feature of youtube-dlc (a fork of youtube-dl) massively quicker. The article explains the programming process and shows the steps I took along the way.
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post

I wrote a new tool: zeromerge

This program merges two files together that are the same size but with missing blocks of data (currently processed at 4K granularity) represented by all zeroes. This is particularly useful for old torrents that aren't fully seeded. In many cases, several different torrents exist for an identical file or file set, possibly with different extra files (garbage text files saying where it was downloaded from, for example) or a different torrent chunk size. It is very sad to have two torrents in the pipeline and see that the missing data chunks in one can be filled in with successful chunks from the other and vice-versa, possibly creating a complete or near-complete file. However, I found no tool existed for this purpose.

Thus, zeromerge was born! Feed it two file paths and an output file path and it'll combine the two files into one unified file. You can then copy the unified file over both of the originals and perform a torrent re-check to make the new progress visible and start cross-seeding those newly merged chunks of data to others. Files must be the exact same size and any present data which is not identical will cause zeromerge to abort.

Since writing this tool, I have used this successfully in two different cases to merge two pairs of files with missing data into one complete file and one file with only one piece missing instead of several.

https://github.com/jbruchon/zeromerge
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon

Windows XP support in jdupes

Comments
Like(0)
Dislike(0)
This post belongs to a locked $5 tier.
Unlock Tier
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon

All quiet on the jdupes front

Comments
Like(0)
Dislike(0)
This post belongs to a locked $5 tier.
Unlock Tier
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post

jdupes 1.18.2 - Google Drive File Stream fix

For some reason, Google Drive File Stream hands down the same device:inode pairing for all directories, which technically means (to jdupes) that all directories are the same directory. Since this is very obviously not the case, the double-traversal protection code needs to be turned off for the -r/--recurse option to work on Google Drive File Stream. That code exists for a very good reason (it prevents you from accidentally adding the same directory twice and having every file match itself and potentially get deleted at the end, plus it blocks symbolic links to directories from causing an infinite loop of recursion) but it makes it basically impossible to make any practical use of jdupes on the virtual hard drive that GDFS gives you to work with.

This release adds the -U/--notravcheck option which disables the double-traversal protection mechanism, allowing GDFS to work with recursion as expected. There isn't any real reason to worry about updating unless you need this feature.

Also included in this release's code base is a unified "package" build script (just puts binaries and documentation in a zipped or tarred directory) and build-time removal of the CPU cache line info code (that only works on Linux) when not compiling for Linux. I also corrected some documentation typos and split the internal behavior flags since the program ran out of 32-bit flag space. There are too many features to fit in a mere 32 bit flags!
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon

Check out my minimal 'vi' clone!

Comments
Like(1)
Dislike(0)
This post belongs to a locked $5 tier.
Unlock Tier
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post

Snippets!

I've compiled a bunch of little things I've written over the past decade into one collection. There is a myriad of 6502 assembly code, batch files, C helper functions, and shell scripts at your disposal. Go check out the "snippets" project on GitHub. Happy hacking!

***** DESCRIPTION OF SOME SNIPPETS *****

6502 CPU assembly code (in ACME Cross-Assembler format)
-------------------------------------------------------
6502/byte2bin: convert a byte to an 8-character string of binary digits
6502/blockmove: move a block of memory (including sizes over >256 bytes)
6502/detect6502: detect what variant of 6502/65816 CPU is in use
6502/divide_16-8-8: divide 16-bit number by 8-bit number
6502/divide_8-8-8: divide 8-bit number by 8-bit number
6502/multiply_8-8-16: multiply two 8-bit numbers
6502/pagefill: fill a 1-256 byte area of memory with a value
6502/pagemove: move a block of memory (256 bytes or less)

6502/nes: bootstrapping code for a basic Nintendo Entertainment System ROM

Batch files for Windows Command Prompt
--------------------------------------
batch_files/extract_audio_to_wav:
    use ffmpeg to pull the first audio track out of a video file (to WAV)
batch_files/companionlink_revival_kit:
    script to watch-and-restart CompanionLink (or anything you edit it for)

C functions (and header files to use them)
------------------------------------------
c/byteplane_xfrm: byte-plane transform from lzjody (see byteplane_xfrm.png)
c/jody_cacheinfo: get cpu0 cache sizes from standard sysfs path on Linux
c/jody_endian: endianness detection and conversion (untested)
c/jody_paths: pathname processing functions used in jdupes for link names
c/jody_sort: numerically correct file name compare function (for sorting)
c/jody_string: str[n][case]cmp that returns only equality (faster)
c/jody_strstr: two-way strstr() that is relatively fast and quite small
c/jody_strtoepoch: convert datetime string to seconds since the epoch
c/jody_win_unicode: Windows Unicode helpers for aiding portability
c/strcat_fixed: a faster strcat() for when string length is already known
c/string_malloc: a simple, fast memory allocator for small pieces  of data
c/win_stat: Windows stat() and NT-to-UNIX epoch portability helper code
c/xorpipe: XORs the data in a pipeline by a 32-bit key

Shell scripts (POSIX sh and/or GNU Bash)
----------------------------------------
shell_scripts/ansicolors:
    ANSI color escape sequences for shell script echo
shell_scripts/change_hplj_status:
    change READY message on old HP LaserJet printer displays
shell_scripts/clean_mpchc_thumbnail_names:
    remove some of the junk in MPC-HC thumbnail image file names
shell_scripts/convert_all_to_xz:
    convert all .tar.* packages to .tar.xz and report saved space
shell_scripts/count_total_files_in_directory:
    shows how many files are under each subdirectory of the current one
shell_scripts/gather_file_dir_statistics:
    shows various file/directory stats, including avg/min/max file size
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon

jdupes-1. 18. 1: Exclude files by date

Comments
Like(1)
Dislike(0)
This post belongs to a locked $5 tier.
Unlock Tier
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post

jdupes-1.17.1: APFS clone support

Exciting news for my Mac users! If you have macOS 10.13 (High Sierra) or higher and you have APFS volumes, you now have access to the -B option for copy-on-write deduplication! All of my Macs run old operating systems, so I don't have direct access to anything newer than Mac OS X 10.9 Mavericks. I got my hands on a Mac that needed a clean install of High Sierra so I took a few hours to write clone support while it was in my hands.

A nice side effect of adding this support is that I've cleaned up some of the build stuff surrounding the CoW dedupe code. Any future platforms that get CoW support will be easier to add.

The list of filesystems that support -B/--dedupe is now Linux XFS, Linux BTRFS, and macOS 10.13+ APFS. Any filesystem that gains support for the API interfaces used for these features will automatically be supported in the future.

As always, thank you for your support. The more support I receive, the more time I can spend improving the software.
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post

Prelude: SubscribeStar Needs Post Auto-Drafts

I found out the hard way that SubscribeStar doesn't have an auto-draft writing feature and you can lose your entire post just by hitting [ESC] on the keyboard. This is the third time I've written this post, so it'll be much shorter than the previous two.


New Release: jdupes 1.17.0

I've just released jdupes-1.17.0 and I think you're going to love it. This release fixes every long-standing problem with dedupe (used on Linux with BTRFS and more recently XFS) and adds an exciting new substring matching feature for finer-grained control over what gets scanned.

Bug Fix: Dedupe Code Rewritten

The dedupe code had several problems. It allocated a potentially huge memory structure that the kernel couldn't process due to internal size limits anyway, and it exhibited some strange misbehavior in several somewhat common cases. I decided to do a complete rewrite of the dedupe code from scratch. The new code seems to work in every test I've tried. I don't use dedupe, so if you notice a problem, please report it on the GitHub issue tracker for jdupes.


Feature: Substring Matching in File Paths

Remember how I added extension matching in jdupes-1.15.0? Now I've also added substring matching that works in a similar way. You can only specify one substring per -X nostr/onlystr to match (no comma-separated lists like the noext/onlyext tags) but the no/only meaning is the same. The substring match is done against the full relative file path, so tricks like directory matching are also possible. For detailed help, type jdupes -X help and learn about the new substring match extfilter tags. Some examples:

Exclude a directory: jdupes -X nostr:some_dir/

Only include paths containing the word "index": jdupes -X onlystr:index

Only scan JPEGs with IMG_ in the name: jdupes -X onlyext:jpg -X onlystr:IMG_

Only scan .tar.xz files: jdupes -X onlystr:".tar.xz"

Note that these substring matches happen across the whole file path, so if you use jdupes -X onlystr:IMG_ as in the above example (hoping to only scan files beginning with "IMG_")and there happens to be a directory called SOME_IMG_STUFF or even just IMG_STUFF in a file's path, all of the subdirectories and files will match, despite the files not necessarily starting with the desired substring. You can strengthen this check by requiring a leading slash: jdupes -X onlystr:"/IMG_" and/or you can exclude problematic directories using a nostr match that will catch them: jdupes -X onlystr:"/IMG_" -X nostr:"IMG_STUFF"

Head over to https://github.com/jbruchon/jdupes/releases and snag yourself a copy of the latest goodness! Let me know if you have any problems ([email protected]). I'm always happy to help

Also, if you're reading this and you don't already support my work, please consider tossing me a few bucks. The more support I receive here,. the more I can work on this stuff. I'd rather continue to work on fixes and features for my software than be beholden to a "real job," and this is how I'm trying to do it. Thank you to everyone who uses my software and helps me, be it through positive feedback, bug reports, code contributions, or good old-fashioned cold hard cash.
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post
Another one bites the dust! Today I completely rewrote the file dedupe code in jdupes, commonly associated with BTRFS on Linux, and more recently with XFS. Rewriting from scratch was definitely the right choice. The new code is less complex and fixes some long-standing issues with the dedupe (-B) option not always working correctly. There are some improvements that could be made, like taking advantage of the ability to pass a lot of files to the kernel at once, but the added complexity was not worth the extra trouble.

Next on the to-do list: adding the ability to match strings in file paths and include/exclude files based on that matching.

You can see the rewrite in this commit: https://github.com/jbruchon/jdupes/commit/a2d5d88bcbc0e37a2cdc009ac0fb8718a4fb8a0e

As always, I appreciate your ongoing support. I would like to work on fixes and features more often, but I have to pay the bills one way or another!
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post
Over the past weekend, I implemented a feature in jdupes that was pretty strongly desired by the user community. Version 1.16.0 has the ability to filter by file extensions, either by excluding files with certain extensions or only scanning files with certain extensions. Now you can do things like scan only the JPEG files you dumped from your phone while ignoring all of the videos, scan a software project folder's .c and .h files for duplicates while ignoring all of the others, or find all duplicates except for XML files.

In addition, I've cleaned up the extended filter (-X/--extfilter) framework and created an entirely separate help text section (jdupes -X help) that explains the extfilter options and behavior in great detail.

The extended filters are also cumulative, so specifying multiple filter options works as expected; for example, "jdupes -X noext=mp3 -X noext=aac -X size+=:1M" will exclude all files from consideration that end in .mp3/.aac as well as all files that are 1MiB or larger in size.

Unfortunately, there is not currently a way to combine filters, i.e. exclude all files with a particular extension over a particular size. That may be a feature in the future, but right now, I'm trying to add some basic filter functionality that satisfies as many basic filtering use cases as possible with as little work as possible. In the case of the extension filter, it took me about 3-4 hours to code, test, and fix issues with the feature, then issue a new release. It was relatively easy to implement, and even includes the ability to scan a comma-separated list of extensions rather than requiring a separate option for every single extension you want to filter.

Other features that filter on file paths will be more difficult to implement, but are highly desired by the community, so I have plans to implement those soon. The next fix, however, will be for the problematic BTRFS/XFS dedupe support that can't dedupe (ioctl_fideduperange) large file sets properly.

Thanks as always for your continued support. More support means more time to work on my projects! I appreciate all of your help.

https://github.com/jbruchon/jdupes/releases/tag/v1.16.0
Df4290e4 5ae8 4c46 865d d8a935c465fb 120x120 0x0 1920x1920
Jody Bruchon
Public post
It's official! I've thought for a while about what I'd like to do instead of "a real job" and working on my open source software projects is what I ultimately decided upon, so here's my first post on SubscribeStar! I'm still getting the hang of things here,. but it's going to be a while before I have enough support to "quit my day job" anyway. If you have not yet seen my video about my push to gain enough support to work on my open source software full-time, go to jodybruchon.com and that video should be at the top of the home page playlist.

I'm finalizing the dollar amount needed to quit working, but I'm not ready to settle on a number just yet. As with all things in humanity, the issue is not as simple as tallying up monthly bills and adding a little margin for safety. I can state for an absolute fact that the required amount to go full-time with open source will be over $2,000 per month.

I had originally created this account with the goal of just making videos, though I never promoted it for that purpose. I am replacing the current "goals" section soon, but I definitely can't finalize that today either. This whole thing is a process that won't happen overnight.

Thanks to everyone who can contribute a monthly pledge to make this possible. Even if you can't contribute financially, you can tell others about my software and my tutorial videos so that more people are aware of them, and I'll gladly thank you for that as well.

The subscription gives you:
  • Full, unlimited access to Star's profile content - to view it online or to download it to future use.
  • Support your Star by contributing – one-time or recurring.
  • You can cancel this subscription at any time.

Star Stats

32 days
 Trust Period
2 subscribers
13 posts

Goals

$9 of $100
per month
Consistent, planned development time can be put on my schedule when I reach this goal. I will allocate a two-hour minimum block per week (at least eight total hours per month) to work on my open source software projects. You'll be able to see that work is being done by looking at my Git commits in my repositories.
$9 of $800
per month
Upon hitting this goal, I'll allocate at least five hours per week (20 hours per month) to working on my open source software. I will also start working on video tutorials and better documentation for the software rather than strictly working on the code, because knowing how to use the software effectively is at least as important as having it available. This will effectively make open source software development a part-time job.
$9 of $3,000
per month
Full independence! I am 100% certain that this level of support will enable me to cleanly shut down my existing businesses within 2-3 months of hitting this goal and switch to full-time open source software development. This goal's result is not 100% guaranteed. Closing down my other income sources is a very dangerous thing. If I reached this goal but my subscribers are suspiciously unbalanced in favor of a few high-value contributors, and those contributors were actually trolls behind a campaign to hit this goal and then pull all of that high-value support once I have shut down my other sources of income, I would be in serious financial trouble and have no significant source of income left. That's why the 2-3 month delay between this goal being reached and my full-time commitment to open source work cannot be avoided.

Features

The subscription gives you:
  • Full, unlimited access to Star's profile content - to view it online or to download it to future use.
  • Support your Star by contributing – one-time or recurring.
  • You can cancel this subscription at any time.
Subscribe

Other stars

This website uses cookies to improve your experience while you navigate through this website. Continue to use this website as normal if you agree to the use of cookies. View our Privacy Policy for the details. By choosing "I Accept", you consent to our use of cookies.