• 5 Posts
  • 180 Comments
Joined 1 year ago
cake
Cake day: June 11th, 2023

help-circle

  • Read/Inspect and contribute to FOSS. They’ll be bigger and longer lived than small, personal, and experimental projects.

    Study computer science.

    Work, preferably in an environment with mentors, and long-/continuously-maintained projects.

    Look at alternative approaches and ecosystems. Like .NET (very good docs and guidance), a functional programming language, Rust, or Web.

    That being said, you ask about “should”, but I think if it’s useful for personal utilities that’s good enough as well. Depends on your interest, goals, wants, and where you want to go in the future.


    For me, managing my clan servers and website, reading online, and contributing to FOSS were my biggest contributors to learning and expertise.


  • Damn, that’s a long list. Looks like a lot of work to collect and prepare.

    I was looking for more of an overview of it and selected them from the headlines:

    1. 2014: Completely broken IndexedDB implementation
    2. 2015: 100vh (100% viewport height) means a different thing in mobile Safari to everywhere else
    3. 2016: <body /> with overflow:hidden CSS is scrollable on iOS
    4. 2017: Safari incorrectly blocks localhost as mixed content when accessed from an HTTPS page
    5. 2018: OS 11.2.2 broke WebAssembly
    6. 2018: Safari 11.1 broke MessageChannels
    7. 2019: Audio stops playing when standalone web app is no longer in foreground
    8. 2019: PWA in iOS uses old assets after publishing new servicerWorker/assets
    9. 2020: Add Fullscreen API to iOS (& display fullscreen)
    10. 2021: Safari shipped blob.stream(), crashes with a NULL pointer exception
    11. 2021: Appending an element to the shadow DOM in many cases hard crashes the browser process
    12. 2021: LocalStorage is broken when a page is open in more than one tab
    13. 2021: IndexedDB APIs hangs indefinitely on initial page load
    14. 2021: Fetch request streaming is implemented just enough to pass feature detection, but it doesn’t actually work
    15. 2021: IndexedDB API information leaks
    16. 2023: Notifications API: support for the badge, icon, image and tag options
    17. 2024: On-screen keyboard does not show up for installed web apps (PWAs) when focusing a text input of any kind
    18. 2008: Focus events for non-input elements behave differently in Safari to every other browser
    19. 2012: Using border-image with border-style: none is rendered completely wrong
    20. 2014: WebKit doesn’t calculate padding-top/-bottom: n% correctly
    21. 2014: Pointer events should allow for device-pixel accuracy
    22. 2017: Support for 120Hz requestAnimationFrame
    23. 2018: Some Fetch requests incorrectly completely skip the service worker
    24. 2020: Safari 14 shipped a broken replaceChildren() method, which caused glitches in Construct.
    25. 2020: When leaving current scope of PWA, back button incorrectly reads “Untitled”
    26. 2020: Safe-area-inset-bottom still set when keyboard appears
    27. 2020: Support for background-attachment: local has suddenly completely disappeared
    28. 2021: IntersectionObserver and ResizeObserver fire in incorrect order
    29. 2021: Mousemove events fire when modifier keys are pressed, even if the mouse isn’t moved
    30. 2021: Scrolling in home screen apps incorrectly latches to document
    31. 2022: WebM Opus support is inconsistent in Safari
    32. 2022: Installed web app with viewport-fit cover causes overscroll issues, breaks position fixed and -webkit-fill-available
    33. 2023: iPadOS: Viewport doesn’t correctly restore after dismissing software keyboard for installed web apps
    34. 2023: iPadOS: window loses focus when dismissing the keyboard, breaks Page Lifecycle API
    35. 2024: Svh and lvh are incorrect on iOS in third party browsers
    DOM query
    let a = ''
    for (let x of document.querySelectorAll('h3 a[title]')) a += x.title + "\n"
    a
    




  • If you only care about contributing improvements, no, it doesn’t matter.

    If you want to at least be recognized as an author, and be able to say “I made this”, the license opposes that.

    Waiver of Rights: You waive any rights to claim authorship of the contributions […]

    I don’t know how they intend to accept contributions though. I guess code blocks in tickets or patch files? Forking is not allowed, so the typical fork + branch + create a pull request does not work.



  • I’ve been using TortoiseGit since the beginning, and it covers everything I need. Including advanced use cases. I can access almost all functionality from the log view, which is very nice.

    I’ve tried a few other GUIs, but they were never able to reach parity to that for me. As you say, most offer only a subset of functionalities. Most of the time I even found the main advantage of GUIs in general, a visual log, inferior to TortoiseGit.

    GitButler looks interesting for its new set of functionalities, new approaches. Unfortunately, it doesn’t integrate well on Windows yet. Asking for my key password on every fetch and push is not an acceptable workflow to me.





  • Using early returns and ternary conditional operator changes

    private boolean meetsRiderPreferences(Rider rider, Driver driver) {
        if (driver.rating >= 4.5) {
            if (rider.preferences.includes('Premium Driver')) {
                  return driver.isPremiumDriver;
            } else {
                  return true;
            }
        } else if (driver.rating >= 4.0) {
            return true;
        } else {
            return false;
        }
    }
    

    to

    private boolean meetsRiderPreferences(Rider rider, Driver driver) {
        if (driver.rating < 4.0) return false;
        if (driver.rating < 4.5) return true;
    
        return rider.preferences.includes('Premium Driver') ? driver.isPremiumDriver : true;
    }
    

    dunno if java has them, but in C# switch expressions could put more of a case focus on the cases

    private boolean meetsRiderPreferences(Rider rider, Driver driver) {
        return driver.rating switch {
            < 4.0 => false,
            < 4.5 => true,
            _      => rider.preferences.includes('Premium Driver') ? driver.isPremiumDriver : true,
        };
    }
    

    or with a body expression

    private boolean meetsRiderPreferences(Rider rider, Driver driver) => driver.rating switch {
        < 4.0 => false,
        < 4.5 => true,
        _      => rider.preferences.includes('Premium Driver') ? driver.isPremiumDriver : true,
    };
    

    The conditional has a true result so it can be converted to a simple bool condition as well.

    private boolean meetsRiderPreferences(Rider rider, Driver driver) => driver.rating switch {
        < 4.0 => false,
        < 4.5 => true,
        _      => !rider.preferences.includes('Premium Driver') || driver.isPremiumDriver,
    };
    


  • Kissaki@programming.devtoProgramming@programming.devMaking GUIs, how do you pick?
    link
    fedilink
    English
    arrow-up
    6
    arrow-down
    1
    ·
    edit-2
    11 days ago

    Blazor is incredibly versatile in terms of where and how you run it. The UI is in HTML and CSS, the generated runtime bindings in JavaScript, but you can code the backend as well as frontend logic in C# / .NET / Razor template files.

    It can render on the server or client, even work offline with WebAssembly and Service Worker, and dynamically switch between or combine them.

    You can also integrate it into Windows Forms, WPF, or multi-platform .NET MAUI with Webview2, which will render “as a website” while still binding and integrating into other platform UI and code.


    Your goals of “neat little GUI” and “as portable as possible” may very well be opposing each other.

    Main questions are what do you have (technologies); what are you constraints, and what do you need. Different tech has different UI tech. Overall, most GUI programming is a hassle or mess.

    If you want to dip your toes, use the tech you like, and look for simple GUI techs first. Don’t try to do everything/all platforms at once first.



  • If Markdown formatting is enough for you, I would look into using a static site generator, like Hugo or Jekyll.

    If you want to keep your existing content as static files but same website skeleton and layout instead of copying and editing files you’ll copy one and create the layout template. Then content and new posts and pages can be generated from Markdown files. If you set up CI they won’t need to run Hugo or what you’re using, only push the Markdown files to your Git repository.

    Whatever you want to do primarily depends on: Your formatting, styling, functionality, and interfacing needs for the editor, and what you’re willing to use or invest for setup.

    Hugo runs from a single binary. The source layout is reasonable. With a single layout the folder structure doesn’t have to be complex.

    I’m not very familiar with alternative [Markdown] static site generators.


  • You’re good to keep your skepticism. If you trust them, the ones creating the tutorial to have vetted to a degree, or that a very popular package like that is vetted to a reasonable degree, you’ll just go ahead with it. (Like most people do without questioning it.)

    You’ll need considerable experience and insight to do good, reasonable risk assessment. Without that, you can either trust and hope in others, or skip the ecosystem and look for alternative technologies.

    It’s also worth noting that your potential impact is considerable lower if you’re only doing local test and development work, not publishing or publicly serving anything. I’m not personally familiar if or to what degree running arbitrary local commands has been limited in the npm ecosystem by now.


  • They make valid points, and maybe it makes sense to always prefer them in their context.

    I don’t think exceptions always lead to better error handling and messages though. It depends on what you’re handling.

    A huge bin of exception is detailed and has a lot of info, but often lacks context and concise, obvious error messages. When you catch in outer code, and then have a “inaccessible resource” exception, it tells you nothing. You have to go through the stack trace and analyze which cases could be covered.

    If explicit errors don’t lead to good handling I don’t think you can expect good exception throwing either. Both solutions need adequate design and implementation to be good.

    Having a top-level (in their server context for one request or connection) that handles and discards one context while the program continues to run for others is certainly simple. Not having to propagate errors simplifies the code. But it also hides error states and possibilities across the entire stack between outer catch and deep possible throw.

    In my (C#) projects I typically make conscious decisions between error states and results and exceptional exceptions where basic assumptions or programming errors exist.