this post was submitted on 24 Feb 2024
25 points (96.3% liked)

Programming

17540 readers
69 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 2 years ago
MODERATORS
 

Hello everyone, first post over here, I'm a junior dev that was working on an open source picture organizer based on location groups within sub-directories, like streets and cities (inferred from EXIF geotags being extracted and sent to a reverse geocoding API) which I've first coined as GeoPicSorter (outlined in its home page). There's a TL;DR at the bottom if you want to get right into my questions, but I felt like talking about my tool could be of help and worth it in case anyone ever wants to help with its development, anyway...

To develop it, I used Java and NetBeans (as the only IDE I found with a free GUI editor at the time I started ― at least over a year ago) and GeoPicSorter accomplishes the goal I needed it for, however, as I updated it, I started to feel like I've underestimated how hard to maintain and messy code becomes for the GUI part. NetBeans had its own gimmicks like making it read-only, fully naming the Swing classes every single time they were called, etc. The Swing GUI also feels kind of uncomfortable to me (specially in the folder selection part where I choose a folder with the pictures to organize, it's too compact/constrained) and I'd like for my program to use the system GUI, or at least something that makes it feel classic yet user-friendly. But it's not like Java is the worst option to use, I just feel like there could be better options suited for the project, and I want to learn a new language in the process.

I've attempted to re-write my tool (and rebrand it in hopes the name can be shortened without conflict with "GPS"), to write cleaner code while attempting to retain cross-platform compatibility (which ideally, I'd like my tool to have so more people can try it. I'd like it to work at least for Windows, and hopefully Linux without Wine, maybe Mac too). It's not a necessity though, just would be great to reach more users. The re-write would be available at a Codeberg repo.

For the re-write: I've tried Dart, Python, and C++ so far, however, I struggle with different things in each language that make it impossible for me to figure out on my own with my experience, and I feel like I'm wasting time going in circles. The problems I have are:

  • Dart: I haven't touched it in a long time, but I believe my issue was the lack of documentation and functions/methods for the only EXIF reader I could find, and how it extracts the coordinates (into an array-like set of 3 numbers that represents latitude/longitude in DMS format) without functions to handle them and convert them to DD easily.
  • Python: while it was a satisfying language to learn and experiment with (and had everything I needed), I couldn't figure out how to make an executable that could detect (and depend) on the system installation of Python (instead of bundling one), I've exhausted every EXE-generating option I could find, and none worked the way I needed it to. If there's one you think I possibly didn't try, I'd love to know!
  • C++: I'm having trouble to start a project properly. I'm pretty much a newbie with CMake (which seems I need to use if I want to make a cross-platform C++ project), and my greatest struggle was setting up the dependencies so as to not to give a hard time to new contributors to join or make one-time contributions (and when I move to another setup). I've tried Conan, and its repository has everything I needed (including Qt for the GUI), but for some reason it's been a struggle to get the dependencies (and the project itself) set up around it. I'm using Visual Studio for now since I found it best to get into C++ and it was recommended, but I'm open to other options. Qt always failed to install via Conan on the command line (IIRC, the error was just a generic one and occurred after waiting for the download and install).

So, I've been using FLTK, but the GUI options and components feel very limited, and I'm stuck with VS2017 and Conan 1.x, because the add-on for VS is outdated, and I couldn't integrate 2.x into VS.

After all this context (which I'm sorry it dragged for so long already), I can finally ask: what can I do to properly start my project from scratch? Or is there a language/framework that'll best suit my needs? The dependencies it has are already mentioned on the home page, but the EXIF reader should be able to at least make it possible to get the coordinates in DD format, and consider the reference cardinals for latitude and longitude before the conversion from DMS format.

Should note that I'm determined to see my project through, I'm just lost on what to do and in need of advice.

Any help is appreciated, thanks in advance!

TL;DR: I'd like directions on how to set up a software project with dependencies, so that future contributors can pitch in with the least amount of set-up required when they clone the repo. The original program is an open source location-based picture organizer for desktop systems, and I want to rewrite it with a different set of tools (preferably not Java with NetBeans), its code will be hosted at Codeberg.

you are viewing a single comment's thread
view the rest of the comments
[–] jeffhykin@lemm.ee 5 points 9 months ago* (last edited 7 months ago) (1 children)

Also

I've exhausted every EXE-generating option I could find [for python]

Unfortunately software is one giant mess right now. You'd think things like compiling to an EXE for python would be standard. They're not. One day, maybe 15 years from now, we will have Nix be user friendly, a single line installer for everything, and have it all "just work". But until then, almost everything is hacked together.

Overview of (basically) all GUI systems

I believe Flutter, React Native, and Android studio are the only major ones I don't have experience with.

EDIT! (2024-4-30) .NET Avalonia seems like a great modern option that I have not gotten to try. Its C# and fully cross platform. It could be a real game changer compared to the options I've listed below

  • Yes as far as I know theres no good exe maker for python. Python without dependencies (or async) is great, a nice little scripting lang for prototyping or data analysis. Python with dependencies is terrible, truly awful for packaged user-applications.
  • C++ / C are and effectively will always be miserable IMO. You'll basically never be able to automate it without nix. Make, cmake, autoconf, pkg-tools, ant, etc they're all a mess. For example, biggest blocker to python packaging is that many python packages are wrappers around C/C++ packages. The most annoying thing about one of the tools I'm about to mention (electron) are the dependencies that secretely use C++.
  • The most modern, consistent, and cross platform graphical systems right now are Electron and Tauri, which are literally browsers with URL bar/buttons removed. Electron is what Discord, Spotify, and VS Code use. Its bulky but theres a lot of support/tutorials. Tauri is the new, faster/cleaner kid on the block and uses the Rust language, which has good dependency management. But Tauri doesn't have the tutorials or ecosystem yet. Also Rust is a very hard language. For both you'll need to learn Javascript/HTML/CSS, which is probably good. But you'll also need the terrible npm ecosystem, and get introduced to javascript frameworks which seem great until theyre not. That said, basically every cross platform not-browser GUI I know of (JavaFX, QT, TCL/TK, WxWidgets, FLTK) has exactly the miserable experience you're getting; lots of dependency hedaches, and weird graphical differences between operating systems. Also that list is in order, with FLTK being untouchable garbage, and JavaFX being the least-bad in my experience.
  • Even if you're okay with using a broswer, (which solves lots of dependency/setup problems, and is the most useful/flexible UI system I've used) it still has stupid API problems because HTML was originally made to display documents (like microsoft word documents). It wasn't meant to be a full blown UI system; it just became that over time. Stuff like styles and positioning in HTML has edgecases, like "fixed" meaning absolute and "absolute" actually meanting "relative to parent" and "relative" meaning "relative to where the element would normally be".
  • Unity game dev (uses C#, which is similar to Java, but better IMO) might actually be worth looking into for your case. First check the unity API's for your images and GPS tasks. The good news is they support packaging up applications for every OS. The bad news is you can't automate the setup because its proprietary. The (very good) open source alternative is Godot.
  • The final alternative is, just don't go cross platform. This is the only not-mess, not hacky, intentionally-designed toolset approach I know of. MacOS has Swift and XCode, Microsoft has Visual Studio and C#. Neither are great but they're both the "this is how we expect you to do it" approches. You might be able to adapt these to other platforms (swift has been gaining some cross platform support and the .net runtime for C# can be cross platform).

My perfect setup would be Tauri (with all security disabled), with Deno accessible on the front end, all installed/setup by Nix. But alas, that doesnt exist yet. Even with +3 years of nix experience I can't even get Tauri running in Nix.

[–] demesisx@infosec.pub 5 points 8 months ago (1 children)

I’ve been looking into building and developing a Lemmy fork using Nix but I got stuck on nixifying the part of the build instructions where you have to combine front end and back end in git submodules. It’s a bummer too because I won’t even write a single line of code on this fork until I have it properly setup with flakes. It’s just how I am. 🤣

Maybe my flake can help you get Tauri working and maybe that would motivate you to help me get Lemmy working with Nix tooling instead of Ansible and Docker as it is now? ;)

[–] jeffhykin@lemm.ee 2 points 8 months ago* (last edited 8 months ago)

Same haha.

I've already started it twice for lemmy, but didn't put in heavy effort yet. I've got a wrapper for nix that helps with common issues, but its on the messy side.

There are so many small GUI apps I want to make but I refuse until I can get Tauri to build an appimage and macos app within nix. It was more than a year ago since I put a lot of effort on that though. If you've got any tips/pointers or examples for tauri I'd be happy to hear them.