HN user

bgrainger

348 karma

Director of Software Development at Faithlife.

http://faithlife.codes/

[ my public key: https://keybase.io/bgrainger; my proof: https://keybase.io/bgrainger/sigs/t_sdP8-ktPcjS-f6m6GKpcHa90Pmtm1bRpCQA_l4Hig ]

Posts15
Comments83
View on HN

The promise was that WPF would use hardware-accelerated libraries such as DirectWrite to put text on the screen even faster than GDI+ (using the CPU) could do. The reality turned out to be quite different: multiple layers of abstraction and just plain inefficient WPF code [1] meant that users needed powerful CPUs and GPUs just to get reasonable performance.

[1] https://faithlife.codes/blog/2019/06/improving-wpf-text-disp...

I first encountered this in Bjarne Stroustrup's 2000 book, _The C++ Programming Language_. As he notes in the introductory material:

In code examples, a proportional-width font is used for identifiers. … At first glance, this presentation style will seem “unnatural” to programmers accustomed to seeing code in constant-width fonts. However, proportional-width fonts are generally regarded as better than constant-width fonts for presentation of text. Using a proportional-width font also allows me to present code with fewer illogical line breaks.

I switched years ago and would never go back to monospace.

Completely agree, and I've started writing more Roslyn analyzers to provide quick feedback to the LLM (assuming you're using it in something like VS Code that exposes the `problems` tool to the model).

I also want C# semantics even more closely integrated with the LLM. I'm imagining a stronger version of Structured Model Outputs that knows all the valid tokens that could be generated following a "." (including instance methods, extension properties, etc.) and prevents invalid code from even being generated in the first place, rather than needing a roundtrip through a Roslyn analyzer or the compiler to feed more text back to the model. (Perhaps there's some leeway to allow calls to not-yet-written methods to be generated.) Or maybe this idea is just a crutch I'm inventing for current frontier models and future models will be smart enough that they don't need it?

We self-host GitHub using GitHub Enterprise Server. It is a mature product that requires next-to-no maintenance and is remarkably stable. (We did have a period of downtime caused by running it on an underprovisioned VM for our needs, but since resolving that it hasn't had problems.)

Of course we have a small and mostly unchanging number of users, don't have to deal with DDoS attacks, and can schedule the fairly-infrequent updates during maintenance windows that are convenient for us (since we don't need 100% availability outside of US working hours).

I don't have the metrics in front of me, but I would say we've easily exceeded github.com's uptime in the last 12 months.

[dead] 2 years ago

There's an ongoing issue with ranking in Google Search that's affecting a large number of search results. We've identified the root cause and this issue is unrelated to the ongoing core update rollout.

Are you sure? The article says "cite this as Yan et al. (May 2024)" and published-time in the metadata is 2024-05-12.

Weird: I just refreshed the page and it now redirects to a different domain (than the originally-submitted URL) and has a date of June 8, 2023. It still cites articles and blog posts from 2024, though.

The Kenya joke explanation is fun, but probably not the real reason. ChatGPT (GPT-3.5) also fails for "L":

User: Did you know that there is no country in Africa that starts with the letter "l"?

ChatGPT: Yes, that's correct! As of my last knowledge update in September 2021, there is no sovereign country in Africa that starts with the letter "L." If there have been any changes or new developments since then, I wouldn't be aware of them.

(Libya is just one counterexample.)

The paper proposes (on p32) that the following four paragraphs (pp 35-36) be added to the standard MIT license (which begins with "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files...").

The terms “person” and “individual” are defined as a natural person, as the term is defined by the United States Patent and Trademark Office (PTO), and/or 35 U.S.C. § 100, as amended. The term “Artificial Intelligence Model” means any non-human generative machine learning system or computer program, algorithm, or functional prediction engine supported by cloudbased/computing platforms. The term “Source Code” means the preferred form of a program for making, creating, and modifying software source code, documentation source, and configuration files.

No use, modification, combination, study, collection, share, reproduction, distribution, and/or access of Software may be made under this License, by any non-human generative Artificial Intelligence Model without the express written consent of the inventor, which may be withheld or delayed for any reason. Any appropriation, adoption, disclosure, reproduction, use, and/or access of the licensed Software by any non-human Generative Artificial Intelligence Model shall immediately terminate all rights granted to the Licensee. The Licensor shall have the right, at any time, to withdraw consent by written notice, thereby terminating with immediate effect all use of Software made under this License unless otherwise specified. This License is the controlling instrument and supersedes all prior and conflicting Terms of Service, Privacy Statements, and/or Terms for Additional Products and Features of source repositories where this License may be distributed by the owner of the License.

By accessing and using this data, you acknowledge that you have read, understood, and agree to be bound by these terms and conditions. If you do not agree to these terms and conditions, you may not access or use this data. You may not use this data for the training or inference of Generative artificial intelligence models without the prior permission of the copyright holder. (“Generative artificial intelligence models” are used to create new content or data that is similar to the original data, but not identical. Examples of Generative artificial intelligence models include but are not limited to, text generation models, image and video generation models, and music generation models. The restrictions on Generative artificial intelligence models apply to any use of this data, whether the generative artificial intelligence is trained on this data or uses this data for inference.)

Any attempt by other artificial intelligence models to access or use this data without such permission shall be deemed a violation of this license and a breach of copyright laws. The copyright holder reserves the right to pursue all legal remedies available, including but not limited to injunctive relief and damages, against any party that violates this license.

On the home page, "For more detailed information take a look at the specification." links to https://www.domainverification.org/spec which is a 404.

`dig 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com TXT` returns: ;; ANSWER SECTION: 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com. 0 IN TXT "@dv=1;d=Example user emali;e=2025-01-01;s=[seo;email;marketing;storage;security];p=[serviceprovider1.com];sn=[service.serviceprovider.com];h=4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg"

There's a typo in "Example user emali".

These simple mistakes don't engender confidence in the proposal.

We've been running GitHub Enterprise Server (first on-prem, now in a Cloud VM) for many years. Size: low thousands of repos, less than a terabyte of total data.

Pros: Not affected by GitHub.com downtime; stability has generally been good for us; you have full control over the org and user names on the instance (instead of having to pick globally-unique ones on github.com); can sync licenses between GHES and github.com if you want to use some private repos on github.com; can raise your API rate limit as high as you want; probably cheaper to provide your own storage.

Cons: New features from github.com can take months (or longer) to be released to GHES; many third-party integrations only work with github.com not GHES; if something goes down, it's now your fault; Actions requires bring-your-own self-hosted runners; autoscaling your self-hosted runners is non-trivial.

The last point is probably the biggest negative for us. We're trying to use GitHub Actions more, but I don't really want to have to manage a pool of autoscaling runners. (I'm doing it, though.) If GitHub provided an add-on service to connect GitHub-managed cloud runners to GHES, I'd use it. (Needing to always keep code private and on-premises is not a requirement for us.)

While we primarily (though not exclusively) serve a religious user base, Faithlife is a non-religious corporate organization and does not discriminate on the basis of race, religion, sex, national origin, age, disability, or any other protected category when hiring or promoting.

There is no affiliation with any particular church.

Faithlife | https://faithlife.com/careers

Faithlife is a purpose-driven tech company committed to the church. We're the creators of Logos Bible Software and are focused on the mission of using technology to equip the church to grow in the light of the Bible.

Full-stack senior software engineer | Remote (US and Mexico) | Full time | https://fl.vu/y29ox6

Software Engineers on Faithlife's Sermon Tools team design, implement and maintain our sermon tools within Logos Bible Software and Proclaim Presentation Software. Our tools help thousands of pastors plan, prepare, present, preach and publish their sermons every week.

Manager, software engineering | Remote (US and Mexico) | Full time | https://fl.vu/g35kd2

Engineering managers are hands-on technical leaders who build products and coach team members. In this role, you will write code, lead one-on-ones, and organize the team to deliver products and features to our users. You will work with cross-functional partners in product and design to evaluate new features and maintain your team’s aligned priorities and roadmap.

I kept technical notes about the protocol, to serve as a future reference for myself and for other developers.

As someone who's written a MySQL client (in C#: https://github.com/mysql-net/MySqlConnector), I'd be very interested to see your notes. Are they available anywhere, or were they the confidential IP of your client?

Unsurprisingly, bugs were uncovered every time a new client was added.

I've faced the same thing, from a client perspective. Every time a new server is tested (MySQL, MariaDB, Amazon Aurora, Azure Database for MySQL, etc.), I find slightly different interpretations of the protocol and have to accommodate them.

Couldn't one just save the extra round-trip with length-prefixed strings by sending the query together with the parameters in a single message?

No, this wouldn't work, because you have to send COM_STMT_PREPARE (https://dev.mysql.com/doc/internals/en/com-stmt-prepare.html) first, which takes the SQL and returns a "statement ID". Then you can send COM_STMT_EXECUTE (https://dev.mysql.com/doc/internals/en/com-stmt-execute.html) which contains the statement ID and the parameters. Finally, you would ideally send COM_STMT_CLOSE (https://dev.mysql.com/doc/internals/en/com-stmt-close.html) to free the server-side resources for the prepared statement, although this could be "pipelined" with the EXECUTE packet.

MySqlConnector (C# - https://github.com/mysql-net/MySqlConnector) uses "smoke and mirrors" for the "text" protocol (because MySQL Server has no way to send parameters as part of a `COM_QUERY` packet, https://dev.mysql.com/doc/internals/en/com-query.html) and true parameters for the "binary" protocol, which does (https://dev.mysql.com/doc/internals/en/com-stmt-execute.html).

Every MySQL client needs to do something similar, due to the design of the MySQL protocol.

One major problem is that the MySQL "text" protocol doesn't support true parameterised queries. There's no way to pass parameters in the `COM_QUERY` packet: https://dev.mysql.com/doc/internals/en/com-query.html

That's probably why many of the libraries mentioned in this thread use "smoke and mirrors". Of course, it is quite possible to correctly escape a value by rendering it to a string first, _then_ encoding the whole thing.

To have true parameterised queries, you need to use the "binary" protocol, which many MySQL libraries don't offer support for. (MySQL also has some frustrating limitations with the binary protocol, such as not allowing a SQL string containing more than one statement to be prepared.)