Principal Engineer for Accumulate

  • 10 Posts
  • 126 Comments
Joined 1 year ago
cake
Cake day: June 12th, 2023

help-circle





  • Ethan@programming.devtoProgrammer Humor@programming.dev<br>
    link
    fedilink
    English
    arrow-up
    2
    ·
    edit-2
    4 months ago

    if you work in a shared codebase then PLEASE just follow whatever convention they have decided on, for the sake of everyone’s sanity.

    That goes without saying; I’m not a barbarian.

    “readability” is subjective. much like how there is no objective definition of “clean code”.

    Did you not see the part where I said it’s less readable “in my opinion”?

    i am insisting that people use a common standard regardless of your opinion on it.

    I can read this one of two ways: either you’re making an assertion about what people are currently doing, or you’re telling me/others what to do. In the first case, you’re wrong. I’ve seen many examples of self-closed <br> tags in the open source projects I’ve contributed to and/or read through. In the second case, IDGAF about your opinion. When I contribute to an existing project I’ll do what they do, but if I’m the lead engineer starting a new project I’ll do what I think is the most readable unless the team overwhelmingly opposes me, ‘standards’ be damned, your opinion be damned.

    The spec says self-closing is “unnecessary and has no effect of any kind” and “should be used only with caution”. That does not constitute a specification nor a standard - it’s a recommendation. And I don’t find that compelling. I’m not going to be a prima donna. I’m not going to force my opinions on a project I’m contributing to or a team I’m working with, but if I’m the one setting the standards for a project, I’m going to choose the ones that make the most sense to me.


  • Sorry, I forgot about this. I’ve attached my full configuration at the end. The steps are:

    1. If the container is on a server, SSH to it or whatever.
    2. Execute docker exec --privileged -it container_name bash.
      • --privileged is required to make delve work. I don’t entirely remember why.
      • -it is something like --interactive and --terminal, it’s what you need to get a proper interactive shell.
      • container_name is the name of your container.
      • bash can also be sh or pwsh or whatever shell your container has (hopefully it has one).
    3. Launch delve dlv attach PID --headless --listen=:2345 --accept-multiclient --api-version=2.
      • PID is the ID of the process you want to debug. This should be 1 if you’re debugging the main process of the container.
      • --listen=:2345 says to listen on (TCP) port 2345 on all interfaces (0.0.0.0)
      • The other flags are the one that vscode-go expects.
    4. If the container is on a server, forward ports ssh ${USER}@${SERVER} -NL LOCAL:2345:REMOTE:2345.
      • LOCAL is the local IP to listen on, usually localhost. When a process connects to your local IP, it will be forwarded to the remote.
      • REMOTE is the remote IP to connect to, this should be the IP of your container. When a connection is forwarded from your local machine, this is where it is forwarded to. My containers are set up with --net host so I can use localhost as REMOTE but that’s not the default so you may have to use docker inspect to figure out your container’s IP.

    I also included the path substitution configs I use. I generally debug these by pausing the target, clicking on something in the stack trace, seeing what path it tries to load, then adjusting the substitute path so that it loads the correct file.

    {
      "name": "Attach to a docker container",
      // Get a shell in the container: `docker exec --privileged -it ${NAME} bash`
      // Launch delve:                 `dlv attach 1 --headless --listen=:2345 --accept-multiclient --api-version=2`
      // Forward the port (if remote): `ssh ${USER}@${SERVER} -NL localhost:2345:localhost:2345`
      // Then run this debug config
      "presentation": {
        "group": "99-Miscellaneous",
      },
      "type": "go",
      "request": "attach",
      "mode": "remote",
      "remotePath": "${workspaceFolder}",
      "port": 2345,
      "host": "127.0.0.1",
      "substitutePath": [
        // // Full paths (GitLab Docker build)
        // {
        //   "to": "/go/",
        //   "from": "${env:HOME}/go/", // <-- MODIFY THIS if you're not using the default GOPATH
        // },
        // {
        //   "to": "/root/",
        //   "from": "${workspaceFolder}",
        // },
        // Trimmed paths
        {
          "to": "gitlab.com/accumulatenetwork/accumulate/",
          "from": "${workspaceFolder}/",
        },
        {
          "to": "github.com/AccumulateNetwork/",
          "from": "${env:HOME}/go/pkg/mod/github.com/!accumulate!network/", // <-- MODIFY THIS if you're not using the default GOPATH
        },
        // {
        //   "to": "",
        //   "from": "${env:HOME}/go/pkg/mod/", // <-- MODIFY THIS if you're not using the default GOPATH
        // },
      ],
    }
    


  • Attaching to and debugging a process most certainly does work. I did it yesterday. Your issue is that Go doesn’t have any way of telling the process to pause until a debugger attaches. Which is frustrating but not the same issue.

    Specifically for debugging stdin, by far the easiest way to do that (in VSCode) is "console": "integratedTerminal". Another comment links a stack overflow answer that includes other options.













  • It’s not just about learning a language. Given two equivalent languages, writing a project using one or the other is always going to be less work and less of a maintenance burden than writing it using both. A competent manager will take that into account when deciding what tools to use. On top of that, learning a new language has a cost. Of course Rust and JavaScript are not equivalent, but which one is ‘better’ is highly subjective and dependent on how you measure ‘better’. So a manager needs to take that into account. But my fundamental point is that using two languages for a project adds overhead, and learning a language adds overhead, so unless cost (including time) is irrelevant, there must be a compelling reason to choose a dual-language solution* over a single-language solution, and to chose a solution that requires your devs to learn a new language over one that does not. Not to mention switching platforms has a massive cost if your project is already mature. Even if you’re creating a new project, if your team already knows JavaScript and doesn’t have any particular objection to Electron, there’s no compelling reason.

    If there is a good reason to learn a language then people will.

    Sure. Except in my experience interviewing candidates and from what I’ve seen online, there are a lot of developers out there who aren’t very good. I am not optimistic that the average developer will have an easy time learning a new language. If the “we” in “Is this the electron alternative we’ve been waiting for” is you and I, that’s not a problem. But if OP meant to suggest there will be a large-scale shift away from Electron, then the average developer is quite relevant.

    *As someone else pointed out, Dioxus is designed with the intent that you’ll right the frontend in Rust, so it’s not exactly dual-language like I thought.