skysight-inc/HackerNews huggingface dataset:
Install wsgopher and head to:

gopher://sdf.org
gopher://hngopher.com
gopher://magical.fish
gopher://bitreich.org

Wsgopher it's out there, search for in
under old win 3.1 software archives,
where are several.
Nice to see another one of these tools. Tonari also recently released innernet in this space, written in Rust as well:

https://blog.tonari.no/introducing-innernet
> So if you use Firefox or Brave on an iPhone, you’re simply using Safari with a different “skin.” This skin can clearly do some content blocking, and it can provide a different browser UI — but it cannot change the fundamental web technologies that are available in the browser.

Firefox Focus is a decent alternative with the best of both worlds.

http://mzl.la/1NDD2IB
Oil is Bourne compatible, but has a mode to opt you into the better behavior. Example:

osh$ empty=''
osh$ x='name with spaces.mp3'

This is like Bourne shell:

$ argv $empty $x
['name', 'with', 'spaces.mp3'] # omit empty and split

$ argv "$empty" "$x"
['', 'name with spaces.mp3'] # unchanged

Opt into better behavior, also available with bin/oil:

$ shopt --set oil:basic

$ argv $empty $x
['', 'name with spaces.mp3'] # no splitting/elision

If you want to omit empty strings, you can use the maybe() function, which returns a 0 or 1 length array for SPLICING with @:

$ argv @maybe(empty) "$x"
['name with spaces.mp3'] # omitted empty string

Example of splicing arrays:

$ array=("foo $x" '1 2')

$ argv $empty @array
['', 'foo name with spaces.mp3', '1 2']

This is called "Simple Word Evaluation": https://www.oilshell.org/release/latest/doc/simple-word-eval...

Feedback appreciated!

(Interestingly zsh also doesn't split words, but it silently removes empty strings).
What would you use for layer 2 transport today(in spefific for playing ild games)?
Are you saying you consider std::array<int, 5> in C++ to be a dependent type? I'm pretty sure it's not right. I'm pretty sure that the "value" in that quote is, implicitly, a "runtime value", or "value of a variable", similar to how we often say "type" without saying "type of a variable". This "5" isn't the value of a variable, it's just an expression. If you continue on to the next paragraph on this Wikipedia page, you will read, first:

> The return type of a dependent function may depend on the value (not just type) of one of its arguments. For instance, a function that takes a positive integer n may return an array of length n, where the array length is part of the type of the array.

second:

> A dependent pair may have a second value of which the type depends on the first value. Sticking with the array example, a dependent pair may be used to pair an array with its length in a type-safe way.

Generally, it's the same nomenclature as with the explanation of static vs dynamic type systems: in static type systems, types are attributes of variables, functions and expressions, whereas in dynamic type systems types are attributes of values. And in the static type system of C, 5 has type int, because it's an expression. It representing a value is secondary. A side effect of it is: you can write a compile-time constant in C that will overflow its type, because the type is assigned based on the lexical category, not on the value.

As far as I understand, in a dependent type system it should be possible to implement a resizable array "std::vector<int, n>", where n is the length of the array (a variable), then write a "concat" function which concatenates two such arrays, and whose return (static) type depends on the lengths of the arrays passed as arguments. This is different than parametric polymorphism, such as the one that C++ has, since we can't know at compile-time all the possible lengths of arrays that we're going to get at runtime. Idris example here: https://idris2.readthedocs.io/en/latest/tutorial/typesfuns.h...

If someone has a better understanding of the topic, I'd be delighted to be shown wrong.
I wonder if that’s not necessarily a negative thing. Much of the beauty of the open-source ecosystem comes from its (typical but not guaranteed) lack of explicit wealth incentives. It feels to me like the idea that wealth redistribution necessitates widespread poverty is almost purely speculative, though I’m happy to be corrected.
Shellcheck and the VS Code Shellcheck extension[1] are really good. I never write a bash script without it.

Built-in autofixes and direct links to extensive documentation on each rule, with easy to grasp examples. It's just awesome.

[1]: https://marketplace.visualstudio.com/items?itemName=timonwon...
I use https://github.com/coturn/coturn, provided as the coturn package on Ubuntu 20.04.
> And how often is the vehicle in a good enough condition that it can be resold?

Kind of an implicit assumption in that question that just because the owner is missing payments and has bad credit they're dirty or the car is beat to hell. Any ways there's markets for cars in every shape between pristine and just on the usable side of totaled.

> how many months are required to be able to repossess and turn a profit by then reselling the car?

They can sell it to an intermediary or send it to auction pretty quickly.
It's fine, I wasn't personally offended nor should you feel like you need to censor yourself. It's really difficult to justify turning uPnP off when you can't necessarily control every application that runs on your network. My wife is going to get rather annoyed when whatever video conferencing software she uses stops working, and I'm gonna get mad when the game I want to play doesn't work - which is why I engage in a somewhat fruitless fight with the stuff I can control to keep the uPnP port punching under control somewhat.

It's definitely a bug in the nas that it continues to punch ports no matter how it is configured. Plenty of software gives you the option of not punching ports.
“They that would give up a little convenience for a little security deserve neither and they shall lose them both.” -Beenjammin Frankmon
I think the best way to write things safely is to not write them in Bash in the first place. Better pick a strongly typed language of your choice.
> Say you have an opinion piece in a news paper that says that electric cars will always be expensive toys for the rich.

Well, you don't see poor people buying EVs that much. That's car manufacturer statistics, which I believe deserves a good degree of trust.

In the market for new cars, poor people buy cheapest IC cars, but not cheapest EVs.

I will take the point that middle class is now buying budget EVs, but you don't have real economy class EVs selling that well in the West, and in China as well.

Wuling Mini EV will classify as a true economy class EV, but what people lauding it don't say it that Chinese IC vehicles in the same price range outsell Mini EV many, many times over.
I'm pretty interested to know what parts of this cost have hit their practical limit, and which still have cost to be squeezed out?

-- Mineral scarcity/cost of mining

-- Cost of processing, refining lithium

-- Cost of making battery chemical contents

-- Cost of assembling rest of complete battery

Any info on how much more advance there is to go on these aspects?

And, after all that is squeezed out, is lithium still going to be the thing for 30 years?
> This restriction is not found in other programming languages

It is. C used to have variable-length arrays as a required part of the standard, but that was made an optional feature in C99. C++ (like Rust) does not have variable-length arrays at all.

If you need a dynamically-sized array in any language, usually you allocate the array on the heap — for instance, with malloc/free, or with a vector type like C++’s std::vector or Rust’s Vec.

As for why, I’m not entirely sure — hopefully someone with more expertise than me can chime in. I’m not sure if it adds too much complexity in the compiler, or if they were simply deemed too unsafe even for C/C++ (since it’s way too easy to accidentally overflow the stack with VLAs).
The billing is pretty important.

Using Mapbox GL JS 2.0 offline using a local tile server still requires an account and a per tile fee.
I see what you mean but I think it's a bit more complicated than that. It's hard to make the right choice when most of the information you receive comes from the entities in whose interest is you not making the right choice (e.g. Google, FB).

An average HN reader is in a very comfortable situation compared to the remaining 99.9% of the population, who might not have time to think about this.

Unless, and I might've misunderstood you, by "us" you mean the people who work on those platforms, and have the time and resources to think about these matters, in which case I'd say that I agree with your statement. What's worse is how much brain power we're wasting on solving problems that shouldn't exist in the first place.

"The best minds of my generation are thinking about how to make people click ads"
Oh sorry is it paywalled for you? It works for me.
The size of all stack-allocated items needs to be known at compile-time. It's the same reason you can't directly have a field in a struct that is the same type as the struct: the size can't be known at compile-time.

If you need an array of unknown size, then you can heap allocate it or use std::vec::Vec (usually via the vec! macro) to provide a nice interface for doing so.

If you need nested structs, e.g. for a tree, then you need to make the field, e.g. the children nodes, pointers or a Box type.

Rust tries to make what it's doing with memory obvious. Other languages with unknown array sizes do a lot of potentially unpredictable memory allocations and copies.
My problem is mostly the libraries, and in-house code written by other contractors, not all of them have been written at the same quality level as the C++ standard library.

Contracting is the main point that makes me happy not having to deal daily with C++.
Curated list of blockchain and general cryptocurrency resources:

https://github.com/Xel/Blockchain-stuff
I'm not sure what you are responding to. I admitted that the transactions could be traced via. the onramp, but my point is that Bitcoin is not any worse than Cashapp. (Which the parent is trying to say)
So 29kWH/day. Say you get half of that from your solar panels at sunrise. 13.9kWh is almost the other half.
How Health Care Became the Big Industry in Steel City
>That said ... the other product with similar GUI design system was/is ... VB :)

That's because the guy in charge of Delphi left for Microsoft and is still in charge of Visual Studio :)
Nope. 1800 sqft house. re: the freezers, I just like to cook a lot.
With TURN, all the traffic to the clients is routed through the TURN server indeed. That makes hosting a discussions server more traffic-heavy than otherwise...

(and it turns out that the server software that I use implements TURN and STUN in the same daemon)
This is a victory-lap by the class of people who have been so successful specifically because they have hidden behind the virtue of tolerance long enough to enforce their agendas without democratic approval (abortion, mass immigration, pornography, etc.) and to relentlessly propagandize and retroactively manufacture consent for said agendas.

The irony is that these people continue pretending to be working class, when the working class is the last bastion of organic culture which they want to crush.

> [Tolerance] is an agreement to live in peace, not an agreement to be peaceful no matter the conduct of others. A peace treaty is not a suicide pact.

I agree. As I've stated before, the logical conclusion of tolerance-as-virtue is that nothing but tolerance is permitted; all other institutions must be hollowed out into vehicles of tolerance, and then the vehicle will be discarded. One can see the final stages of this with Christianity, and one can readily see its progress within Islam as well.

> The model of a peace treaty highlights another challenge which tolerance always faces: peace is not always possible, because sometimes people’s interests are fundamentally incompatible.

This is exactly the situation tolerance is for. Two factions with strong, incompatible views that need to work together for common benefit.
> My programming experience is that that these "mathy" objects are about the only unambiguous use case for operator overloading.

Rust's ability for smart pointers to overload the dereference operator works pretty well, though there is still some potential for abuse.

Part of what makes it reasonable is the required function signature: It can only ever produce a reference to some other type, which rules out some of the crazier possibilities.
Easy: my mother drilled it into me for years that a prank played after 12 noon on April 1st made you the fool, I've abided by that rule of the game for 35 years, I'm not about to start breaking it now.
Yep, Boston frequently tops lists of cities with the best public transportation in the country. Really wish more cities had that infrastructure.
That's the easy part. Plenty of applications (such as bittorrent clients) use randomized ports. So you have to either disable that, manually add the port forward every time you start the client, or let UPnP handle it, because you don't let any untrusted devices or apps onto your network.

And multiple devices on the network may need the same port forwarded at different times, such as multiple games consoles.
Most everybody needs a buddy to help them with the car buying process to navigate car dealership tricks. Dealerships are well oiled machined designed to extract money and they have years of practice.

Poor people need even more help give they have no room for error.
> Why do rust arrays have to have a size known at compile time?

Having a known-length array type in a programming language:

* allows the compiler to make certain optimizations using the information it has on the length, especially if the length is small

* allows the programmer to enforce constraints on the length of arrays at compilation time, which can make program correctness more evident and easier to accomplish

> This restriction is not found in other programming languages.

Ever heard about C or C++ or Go? Even dynamic languages like Julia allow defining such types.
Not necessarily, society could decide what a value of “I win“ income is.

Maybe it’s $1 billion, after which you hit a ceiling function or wealth becomes ergodic, and you earn a badge that says “you won” (in the context of this society).

If you earn such a badge, society would call on you for advise (if you are a non-inheritor).
I'm considering the previous posters comment on how the users who post illegal materials should be responsible, not the platform. But yeah that makes sense. In this case it would be as if the city knew about the child pornography on the street but decided not to do anything about it.
There are a few places where you don't need a car. I didn't have a car in NYC and now I still don't in Chicago. Of course if you can't afford a car you probably can't afford to move.
It does have a whiff of ego in the style. It's already odd to have a 'company' domain show 'My Blog' on the home page.

Even to call the signs 'immature' isn't helpful, as it implies that a dev is not as mature as they 'should' be. An illustrative quote is "Immaturity is something that comes with age." Junior would be a more fitting description, as that's only referring to their current progress rather than a judgement.
Maybe I am missing something, but when we care about unwind-protect, I would rather stay with safer languages than C++.
Cost per kWh and weight per kWh. But, also cost and weight per home as the home’s energy needs are largely unchanged.
I think it more to do with the historical lifestyle and culture - Swedes, Finns and Norwegians have been integrated into the continental mainstream
of settled agriculture and Christianity for centuries while Saami held out as a more nomadic, hunter-gatherer culture for most of modernity.
Not that I want to really get in to this, but I hope people know that “lamb” is just a baby sheep. Sheep normally live to be like ~8 years old, but lamb is a sheep that is less than 1 year old. Even if they are raised in nice conditions, their lives are cut quite short.
> you don't see poor people buying EVs that much

You do, however, see upper middle class people buying them. Which wasn't the case a decade ago, when the Leaf came out [1].

[1] https://en.wikipedia.org/wiki/Nissan_Leaf
I also wonder how much work it is to recondition older battery packs.

Weight and volume is really important for a car, but for a residential installation? Not so much.
Loom (YC W12) leaks private video snippet clips, as a feature
They might be just using less electricity but other means to generate their needs.

I've heard that the EU has a lot more district heating (which wouldn't show up in an electricity bill, AFAIK) and I'd imagine a fair deal of older buildings have a boiler using oil or gas or something else to burn.

AC is also just not very prevalent.
> I don’t have FB or or WhatsApp but my Insta account (using a separate email address and no personal details) keeps recommending my therapist to me.

So what? What's the harm?

People sure like to write emotionally charged posts arguing for privacy, but they're always suspiciously low on details on what bad things (actually) happened.

Even in this case with phone numbers and other data leaked, so what? What harm do data leaks cause?

Seems like making a fuss about nothing.

> How are we still ok with this shit?

We're ok with a lot of shit. I think if we were to make a list of shit this would rank pretty low.
> C++ templates on the other hand you could argue are not types (but templates), but that is nit-picking.

Not only is it nitpicking, it seems wrong even in an academic sense of the term. Whether the template itself is a type or not probably depends on what theoretical language you use to discuss it.

The template is monomorphized into a new type per instantiation, yes, but the moment it actually has a number in it it's a type.

In D the template can quite happily accept pretty much anything as a parameter (particularly structs i.e. better code quality), and I'm surprised other languages don't allow this. Why have a bunch of template parameters on a line when you can just program the way you normally would.
As for definition, it already exists: https://docs.oracle.com/javase/8/docs/api/java/lang/Number.h...

As for abuse prevention: it would be impossible to use the common operators like +, -, +=, <<, >> and so on for anything that is not numbers, and therefore prevent C++ levels of overloading abuse.
You have my upvote for "corporate spyware" :)
I love lamb but absolutely hate goat. I've eaten a lot of goat (unfortunately) as I used to live in Africa and when traveling, it was often the only meat around (like in small villages). It has this weird greasy and sickening smell.
I agree on Boston being a pseudo-city, disagree that SF is... Especially if you are including DC but not SF
Making a Crusader Kings 3 ruler with every setting on maximum
Corporations Like Nike Paid $0 Federal Tax in 2020 While CEO Pay Soared
That revives memories :) I used to play it alot on the Amiga. Interesting to see, that the game is still alive. Unfortunately currently not avialable on iOS or the Mac :(
How about hybrids like Priuses?
Thanks! It's been a fun journey learning how to make tech stories entertaining in audio. I'm sure I still have lots more to learn.

I don't have any monetization happening right now, but it is a great idea. Words of encouragement certainly support the podcast as does just sharing it with people you might think enjoy it.
You keep saying "whatever" software wouldn't work without UPnP, but you are failing to give us concrete examples.
>engage with the commenter's not-completely-unreasonable point

Wow.

Might I suggest you stop using weasel words, or stop waffling.

You could have said "reasonable point", unless you're waffling to leave yourself with an escape hatch (because you don't have the courage of your convictions), which your later reply to yellowapple also suggests:

https://news.ycombinator.com/item?id=26607927

That reply sounds heavily like weasel words to me.
It's probably more complicated than a writer's quotable phrase could convey.
How are you able to send whatsapps to people you don't have a prior conversation with ?

I am doing the same boat...and was working fine until i lost & replaced my old phone. All conversations were lost, and this makes it challenging to use whatsapp for any non-group conversations (since I can't start any).
Panasonic of 90s looked unstoppable in consumer electronics. Panasonic now looks like a shell
Purple articles are from the lifestyle section. They’re not really meant to be hard hitting news or anything.
So is this issue mostly with consoles? I've always kept UPnP off and we do lots of gaming here without a problem, but pretty much all PC gaming.
Yes. Given 1000 players and 1000 turns, if each player starts with $100 in capital under your chosen parameters:

import random

l = 0.33
w = 0.5
c = 100
m = 1000
p = {k: c for k in range(m)}
n = 1000

for k in range(n):
for j in range(m):
if random.choice([0,1]):
p[j] += (w * p[j])
else:
p[j] -= (l * p[j])

print(sum([p[k] for k in p]) / len(p))

print(sum(1 for k in p if p[k] > c) / len(p))

I wrote this up quickly so there might be an error, but under your stated parameters the average wealth increases over time and most people end up wealthier than they started. Specifically, the number of people who will be wealthier at the end seems to converge to somewhere between 57-60%.

NB: This assumes you bet your entire capital each round instead of a constant bet size. In the presence of non-ergodicity you wouldn't want to do this, but that just means it's an even stronger result that most people come out ahead.

In fact 33% happens to be the maximum loss percentage this system (win rate, win percentage, bet = total capital) can tolerate while still exhibiting higher wealth for most players over time :)
I also had good experience with mini-PCs like Chuwi's. They are pretty cheap, have a good amount of ports and have the advantage of having newer CPUs with very little power consumption.
If all the smart people like you used XML, how come it was so painful to use and it died?
I think this all boils down to "why do you like what I don't like?"
Their chart doesn’t have any time allocated to commuting. I find that odd.
> and viola

I love this typo.
There are many other ways this could happen, did you google her address on your phone browser or something like that? IG always seems to give recommendations based on what I've watched on youtube recently or looked up somehow.
Ask HN: OCR Libraries for Receipt Scanning/Parsing?
I'm interested in keeping tabs on my spending and comparing prices of items I buy at grocery stores, because I tend to not think about it when I need something. I am conscious of the extreme price discrepancies for the exact same items at stores just blocks apart here in NYC, but it's difficult to keep track of the prices of each item at various places to optimize shopping.

I want to build a system that can keep a running tab of my purchases by item, price, and store. I need to find a library that can effectively scan a receipt, recognize the store (usually name, number, address and logo at the top), and differentiate each item label and its price. I plan to manually tag each item label from a store's receipt with the item's barcode the first time it is seen.

I have been sporadically googling the past 6 months but am still unsure which OCR library(s) I should invest my time in. Or how low level I should start. Should I grab a library like tesseract and do my own feature extraction or libs that spit out semi-structured objects with text and hope it returns something similar enough across store receipts to make sense of consistently?

I'm ok with this being an extended project, but I would like some input on choosing a solid library with accurate OCR and advice on how to approach training/parsing from someone with more experience.

Other solutions and advice are also welcome++
I paid for a Covid-19 vaccine