Show HN: Angeldust – a fast and efficient video game - <AUTHOR> After years of solo development I'm presenting: Angeldust, an omni-compatible action RPG and building game!
Website: http://angeldu.st
My single server hosts 250+K active players in one giant, dynamic fantasy world. Angeldust's game server is pervasively multithreaded, implementing John Carmack's dream of processing an immutable world state each tick.
Both world handling and network traffic routing uses any number of threads. For networking, a typical game session only uses ~3Kbps of bandwidth, enabling decent play even over 2G/EDGE networks.
The client is programmed in C++ with bits of C, Objective-C, Java and PHP. It runs really well on very low-end and obsolete hardware, all the way up to modern systems with fast GPUs.
Angeldust works perfectly on Windows XP+, even without hardware OpenGL; Mac OS X 10.6+, even on the first 2006 32-bit Intel GMA945 MacBook1,1; Linux 64-bit glibc 2.17+; Android v2.2.3+, supporting Bluetooth game controllers; and iOS 6+, though iTunes App Store forces iOS 8+ (any way around this?).
I live stream weekly on YouTube and Twitch, even right now! Come ask me your development questions! I often see developers playing together with their kids.
YouTube channel: https://www.youtube.com/AngeldustLive
One more thing: the Angeldust website ( https://angeldu.st ) uses plain HTML and CSS to offer interactive, game-related actions. It's fully functional even without JavaScript enabled. <comment><USER3> This looks impressive. Can you go into how you implemented the immutable world state each tick a bit more?

I'm developing a game myself, and figuring out a good method of multithreading it took a lot of work. While I am content with the results, I wouldn't say I arrived at a good solution.

It sounds like you went with a purely functional approach? Did you rebuild the entire gamestate each tick, or keep a list of changes you needed to make to the relevant data?

<comment><AUTHOR> This question was the most asked one during my livestream. It's a good one! Even though it's 01:33 right now after a 7 hour livestream, I'll try to answer it as clearly as possible, building from the foundation up to the high level.

The Angeldust game world is tracked in an "active chunk set". A chunk is a 2D part of the world, 32x32x64 in-game blocks (meters). The active chunk set tracks only the chunks that contain, or are near, players. This chunk set is processed in parallel on any number of threads/cores configured in the server settings file.

Angeldust tracks two states for the data contained in each chunk, kind of like an array of size 2. Each tick, one state in the array is the immutable "read"-state and the other is the mutable "write"-state. Every tick these states ping-pong between the roles.

During processing the server processes the read state and copies over unchanged entity/world data by simply pushing pointers to that data into std::vector<>s in the write state. For things that did change I push a new pointer into the write state and clear up the old pointer in the next tick. Pushing pointers saves memory bandwidth since you don't have to copy all entity data for every tick. And still you can guarantee that the "read"-state will be unmodified so that other CPUs/cores/threads can freely access all of the data and pointers.

On the livestream I discussed a few cases where I do use (largely uncontested) mutexes for data synchronization: for friend chat and private chat I do a lookup of destination hero pointers in the "hero map" and then lock/unlock the hero's mutex for pushing chat messages into a vector.

Does this make sense? Let me know if I should elaborate. I will probably take a nap now, but I'll answer you (and others) tomorrow.

I'll also do another livestream tomorrow, because I feel everyone on HN has very useful questions, feedback and ideas.

<comment><USER4> Thanks for the explanation! I happened to be thinking of similar multithreading ideas (chunks and ping-ponging states) recently, but was stuck on what happens when computation happens across chunks in multiple threads. e.g. an object move across chunk border, or an object interaction affecting two objects in different chunks. Could you elavorate on your approach about these? I'm really curious

<comment><AUTHOR> Good follow-up question! As for the read state, you're already golden in the sense that you only read data and don't update it. If a chunk needs world or entity data from a neighboring chunk—or even halfway across the world—you can just follow pointers there and you know the data is available and accurate.

For the write state, you're absolutely right that entities will need to transition between chunks. The server looks up the destination in the "active chunk set" I mentioned and then uses per-chunk std::vector<>s guarded by a mutex to push "migrating" entities. This requires a mutex since multiple CPUs/cores/threads/chunks can be pushing entities to the same destination chunk. These mutexes largely have zero to little contention.

Does that answer your question in an acceptable way?

<comment><USER4> Thanks! The idea of having a list of migrating entities per chunk is good, and it avoids locking on the list of all entities in a chunk. But I still have some confusion about it:

> The server looks up the destination in the "active chunk set" I mentioned

but what if the entity teleports to an inactive chunk?

> and then uses per-chunk std::vector<>s guarded by a mutex to push > "migrating" entities.

Will these migrating entities participate in later calculation within the same tick, or are they excluded? If excluded, what happens when there are two mechanisms that mutates that entity, but the first one put it into the migrating list of another chunk? If included, the thread of which chunk will continue this calculation?

And when some kind of mechanism mutates two entities in different chunks, which thread is chosen to run this mutation? And how does it mutate the state for an entity in the other chunk?

Meanwhile since you mentioned ticks, (just to be sure) are you using a barrier per tick to wait for all threads to finish the same tick? When are the migrating entities merged into the main list, and are you using another barrier for that?

<comment><AUTHOR> Really getting into the nitty-gritty here. If an entity migrates to an inactive chunk, I keep the entity "on hold" and add a "chunk set mutation" to the active chunk set so that the set is expanded in the next tick. The processing thread for this newly added chunk sees that no data exists yet and synchronizes the state from the backend during the subsequent tick. On this tick the entity gets added to the new chunk write state and disappears quietly from the old chunk in the next tick since it isn't "on hold" or copied anymore.

As for the processing per tick: the entire active chunk set gets semi-randomly processed by threads. You'd be absolutely right that the order of operations isn't always deterministic. An entity not being processed for a tick doesn't happen since the old chunk will still process entities that are "on hold", but only perform a subset of operations. Double-processing does occur and this is sometimes visible while playing with a chat message being duplicated. This happens pretty rarely and I took care to make sure occasional double- processing doesn't interfere with gameplay mechanics.

As for synchronization: yes, each tick all processing threads join together and the server performs minor central processing and scheduling. Then the next tick begins and all threads are started again.

<comment><USER4> I see. It seems sometimes we do have to live with non-deterministic behaviors or even small errors.

I'm still unsure about the following question from your answers: > when some kind of mechanism mutates two entities in different chunks, which thread is chosen to run this mutation? And how does it mutate the state for the entity in the other chunk? My initial thought was this would require adding locking on every entity, since it might be accessed from another chunk/thread. But that's clearly not ideal. Maybe have a separate list for outside-chunk changes, and merge them with internal changes later?

And regarding having two states: How/when are you sending world state to clients? My thought was to clone the current state periodically and send it to clients (can sending takes less than one tick? I don't have an idea). Sending state to clients seems to be needed if the game needs client side predication, hence this question.

<comment><AUTHOR> I think your first question is actually supposed to be: what if a _single_ (not two) entity is modified from multiple chunks?

All external effects that can happen to an entity are written to an atomic integer that tracks healing points, damage points and effects like poison and stunning. Angeldust currently runs on CPUs supporting atomic integers everywhere, so this doesn't have to fall back to mutexes. On platforms/compilers without atomic integers I have a software-fallback that uses mutexes for this, but currently it's not used anywhere.

Most world state is compiled into flat byte arrays each tick to save processing time, since many clients can be in the same area at once. The server bundles these world state byte arrays for chunks near a client together and sends them over the network. The client interpolates from these updates. What you see on screen lags behind subtly to make sure animations are smooth. I think this happens in most online games since you don't really want to extrapolate.

Angeldust's game pace and mechanics are designed so that the interpolation doesn't affect your aiming accuracy or game experience too much.

<comment><USER4> Thank you again for all the explanations!

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER5> How did you afford taking off years of work to develop this? Did you have a lot of capital / runway? Low cost of living?

Kudos for this extremely well polished project. This is the dream many of us have but can't or won't embark upon. This is very inspirational.

<comment><AUTHOR> Good question. I started working right after what we call "middle school" in the Netherlands which translates to high school I think. During the daytime I would work my job and in the evening self-study for the "Open University" we have here.

I lived with my parents during this time and could save up money as a buffer. Thanks to that support I could financially bridge these past years of development without worrying too much. Also: keeping expenses as low as possible. My product is old school and so are my computers.

<comment><USER5> You're killing it!

Great choices, fantastic execution.

You're going to go far. Keep it up!

<comment><AUTHOR> Thanks! A slight word of warning though, something that also came up during yesterday's livestream:

I've been really lucky to be able to successfully fulfill my childhood dream by making this game. But like Freddie Mercury sung: it's [not always] been a bed of roses or a pleasure cruise. I've sacrificed progress in other areas of my life to see this through to the end. I hope to catch up there starting as early as next year. Nonetheless I definitely wouldn't be the same without having taken on this adventure. I've grown so much as a developer, an entertainer and even as a person by creating Angeldust.

<comment><USER6> >> _I 've sacrificed progress in other areas of my life to see this through to the end_

>> _I 've grown so much as [..] and even as a person by creating Angeldust_

These are words of wisdom that prove your point, and I think it's a great thing you've posted them here!

</comment></comment></comment></comment></comment><comment><AUTHOR> Thanks so much everyone for all the positivity so far! I'm still streaming right now. After the stream I'll catch up with all questions and comments here, I've had a blast talking about my work so far.

And if any of you can get me in touch with John Carmack that'd be very awesome ;)!

<comment><USER7> send him e-mail!! worked for me :)

<comment><AUTHOR> Both you and Exuma: thanks for the down to earth answers! I'll give it my best shot.

</comment></comment></comment><comment><USER8> For the senior citizens viewing this they might relate the term "AngelDust" with the dissociative PCP, let me assure them though, it hasn't been called AngelDust since the 70s. You'd be much more likely to hear it referred to as "wet" or "sherm". IF you went to the ghetto and tried t buy Angel Dust they'd think you were a cop. It's like calling weed "dope". Just a little disambiguation from a drug name etymologist :)

<comment><USER9> > For the senior citizens viewing this they might relate the term "AngelDust" > with the dissociative PCP, let me assure them though, it hasn't been called > AngelDust since the 70s.

I don't see that connection as an issue with the game or your post. It certainly isn't doing anyone any harm, despite what others suggested in earlier comments.

That said... I'm 21 years old, and I still associate "angel dust" with PCP. The name is still used by popular rappers including Mac Miller [0] and Run the Jewels [1]. It is still defined as PCP in 6 of the top 7 results, vs 5 of the top 7 for "sherm" and 0.3/7 for "wet" on Urban Dictionary [2,8,9]. Angel dust is the most common synonym for PCP on Urban Dictionary [10]. The name "angel dust" was used to refer to PCP in a 2011 episode of Its Always Sunny in Philadelphia [3]. The name is still in common parlance on Reddit [4,5,6]. However, the drug seems to have experienced a decline in popularity, accounting for less than 0.1% of all documented hallucinogenic drug use in the United States in 2017 [7] - suggesting that the term "angel dust" is not well known simply because the drug isn't commonly used, and not because the term has been abandoned.

I just don't want anyone to get into trouble thinking that they can use the phrase "Angel Dust" without it being seen as a reference to hard drugs by the general public.

I am also surprised that this association is being rejected, considering that the creator of the game is going by "Frank Lucas" [11], which is the name of a famous drug trafficker [12].

[0]: [https://www.youtube.com/watch?v=rIQqzTNRmoc](https://www.youtube.com/watch?v=rIQqzTNRmoc)

[1]: [https://www.youtube.com/watch?v=R_esHn4X03U](https://www.youtube.com/watch?v=R_esHn4X03U)

[2]: [https://www.urbandictionary.com/define.php?term=Angel%20Dust](https://www.urbandictionary.com/define.php?term=Angel%20Dust)

[3]: [https://itsalwayssunny.fandom.com/wiki/The_Gang_Goes_to_the_...](https://itsalwayssunny.fandom.com/wiki/The_Gang_Goes_to_the_Jersey_Shore)

[4]: [https://www.reddit.com/r/PCP/comments/ba1754/two_dimes_of_pc...](https://www.reddit.com/r/PCP/comments/ba1754/two_dimes_of_pcp_angel_dust/)

[5]: [https://www.reddit.com/r/Drugs/comments/5tru38/what_is_angel...](https://www.reddit.com/r/Drugs/comments/5tru38/what_is_angel_dust_and_what_is_the_high_like/)

[6]: [https://www.reddit.com/r/serialpodcast/comments/2qove1/how_l...](https://www.reddit.com/r/serialpodcast/comments/2qove1/how_long_does_an_angel_dust_pcp_trip_last/)

[7]: [https://www.drugabuse.gov/drugs- abuse/hallucinogens](https://www.drugabuse.gov/drugs-abuse/hallucinogens)

[8]: [https://www.urbandictionary.com/define.php?term=sherm](https://www.urbandictionary.com/define.php?term=sherm)

[9]: [https://www.urbandictionary.com/define.php?term=Wet](https://www.urbandictionary.com/define.php?term=Wet)

[10]: [https://www.urbandictionary.com/define.php?term=PCP](https://www.urbandictionary.com/define.php?term=PCP)

[11]: [https://angeldu.st/en/game#play-now- button-3](https://angeldu.st/en/game#play-now-button-3)

[12]: [https://en.wikipedia.org/wiki/Frank_Lucas](https://en.wikipedia.org/wiki/Frank_Lucas)

<comment><USER10> I love your username. Do you follow any particular current of Western Ceremonial Magick?

<comment><USER9> I do not! (Sorry to disappoint - I'm a run of the mill atheist).

My name was inspired by a Gilfoyle line in Silicon Valley, which references Magick:

[https://getyarn.io/yarn- clip/9481dd82-17de-4791-b110-0e58434...](https://getyarn.io/yarn- clip/9481dd82-17de-4791-b110-0e584342f7df)

(Since you're on HN there is a good chance you're familiar with the show - <USER2> if you're not, the Gilfoyle character is a self-proclaimed LaVeyan Satanist)

</comment></comment></comment></comment><comment><USER11> This looks incredible. Gives me vibes of old school Runescape, mixed with Minecraft. Plus the performance as you've detailed it sounds like quite a feat! Also very cool to see a project that supports old hardware--I remember being a kid with hand-me-down computers struggling to play even some Flash games.

Gonna give this a play tonight. Rock on, dude!

<comment><AUTHOR> Thanks for the feedback, I hope you enjoy playing. I'll be livestreaming again today at 17.00h UTC, feel free to swing by to hunt together, or talk technology!

</comment></comment><comment><USER12> Do you have any plans to open-source all or parts of the game or underlying platform? Do you plan on developing this into it's own 'game engine' or plan on going further than this initial game? I've been following a few multi- threaded game projects and they are always very interesting to read up on, best of luck!

<comment><AUTHOR> Yes, open sourcing at least the client part of the game is something that I'm very interested in. I'm not entirely sure when or how this will happen just yet, it will depend greatly on the commercial success of the game. But it's definitely my preferred course of action for the future.

EDIT: I'm not really interested in separating or spinning off the engine, but you will have few problems turning the game into something entirely different.

<comment><USER13> While I would advise against open sourcing the core of the game, opening the client api may be a good idea - perhaps others can write clients for it, but there may be issuing around people making bots to cheat the game.

<comment><AUTHOR> I wrote a "bot" myself in the form of a network simulator for general and load testing of the server. If players were to automate the game I'd be more than happy to make a special server where we could show off their work. Making an agent navigate an open 3D space and performing planned tasks would make for an impressive demo for all parties involved.

<comment><USER14> That might make a good first open source release actually, if it implements a good chunk of the game protocol you might be able to use it to get a rough idea for the types of ideas people would want to run with, and it would also allow people to hit the ground running actually implementing ideas against the engine quickly.

A separate test server would be a _very_ good companion idea.

<comment><AUTHOR> I hadn't even considered this before, but I see your point! Getting a "core" part of the game's "API" released first allowing players to fiddle around writing a bot sounds like a beautiful gift for the technically inclined players. Because of the small(er) scope it could help iron out wrinkles in the open-sourcing of the client as a whole later on. Thanks!

</comment></comment></comment></comment></comment></comment><comment><USER15> This is the most interesting thing I've seen in a while. Props man. Good work.

<comment><AUTHOR> Thanks so much! Finally sharing the end result of all my hard work feels really good. And seeing so many visitors swing by on the livestream is insane!

<comment><USER15> Yeah. I'm definitely going to follow you for more updates. It will be interesting to slowly learn from you via osmosis as I've been interesting in developing browser games for a long time. Seriously impressive to see what today's tools enable creative people like you to do as a team of one.

<comment><AUTHOR> "Today's tools" do not necessarily allow you to make anything like this. I'd even go as far as to say that an array of ancient hardware and software are the main reason for being able to make a product focusing on compatibility and performance. Not aiming for a moral high ground, but just looking at it practically.

I started Angeldust on my trusty, white MacBook1,1 mentioned in the starting post. Having only an Intel GMA945 for powering a 1280x800 display and trying to get a decent frame rate forces some design decisions. I quickly ran into optimizing for GPU overdraw and resources instead of being bottlenecked by the dual-core Intel CPU.

Then I ported the engine to iPhone 3GS where you get the exact opposite situation: the GPU can push lots of pixels to a 480x320 screen, but the ARM CPU is struggling to keep up. Just this 2006/2009 era combination of hardware alone forced me to be efficient with both CPU and GPU. Eventually I even got the engine running smoothly on a first-gen Raspberry Pi on a 1280x1024 display which is no small feat.

I think if you start from "today's tools" on "today's hardware" it's entirely too easy to consider any older platform inaccessible or obsolete, while if you work the other way around you appreciate the sheer power older devices have when used properly. Then moving onto newer hardware is just icing on the cake and just shows you how ridiculously powerful a modern 6-core Ryzen with an appropriate GPU is.

<comment><USER16> Your stories are great to listen to. Is there any other place I can follow you other than YouTube channel?

<comment><AUTHOR> Pick your poison; I also have a Twitch channel:

[https://www.twitch.tv/AngeldustLive](https://www.twitch.tv/AngeldustLive)

I'm not a social media user and I currently don't keep a public blog. There are many interesting aspects of Angeldust to talk about and I have many war stories from this and previous projects that would make for an interesting read or listen.

Just this evening I talked on my livestream about my rough introduction to SIGPIPE randomly killing my server processes. I can understand that a YouTube or Twitch livestream isn't the most convenient format for hearing these stories, but it's currently my most warm and entertaining way to share them.

Streaming is a highlight in my life, while writing out stories feels like work. Very faintly I'm crystallizing a plan to share knowledge in a written way, but for now I think the livestream is going to be my preferred way for requesting and telling stories.

</comment></comment></comment></comment></comment></comment><comment><USER17> > _programmed in C++ with bits of C, Objective-C, Java and PHP_

I am very curious how and why this happened

<comment><AUTHOR> On the livestream I detailed this a bit. Angeldust has a single "domain model" containing all item, entity and object properties contained in a PHP code generator that generates C++ source code and header files for use in the client, server and asset tools. It also generates PHP files for use in the interactive and tied-to-the-game website. The website is also in PHP.

The client uses Objective-C to integrate certain platform features into the C++ codebase on iOS and macOS. Java is used for some functionality not provided by the Android NDK.

</comment></comment><comment><USER18> Congratulations, amazing work!

I absolutely love how you have opted out for frameworks on the website and that it just work. Kudos!

The same for your considerations for making it work on old hardware and you comments on your live stream today about your old Mac and making it run on Windows XP as well.

More developers need that attitude.

I wish you all the best and I hope this becomes a Minecraft size success!

<comment><AUTHOR> (Michael Scott:) Finally! Thank you. The "old school" PHP -> HTML + CSS with minimal JavaScript website is a thing of beauty I think. It's heartwarming that HN didn't dismiss my website just because it's not Web 2.0 or 3.0. From a technical perspective it's very much Web 1.0. But I see it as being elegant, functional, very fast and maintainable. It's tied in to the game at a core level as well, with real-time updates of in-game action. Also: I didn't even see a CPU spike during HN's peak hug, so try harder, soldiers!

As for the older hardware and building something for performance: in my dreams this past night I realized that HN as a website closely fits my design philosophy. This website is just completely transparent and gets out of your way. You get a box. You enter text. Boom. It's beautiful. I hadn't posted on here before, but the entire experience has been delightful.

Tangent: sometimes it feels like the home computer I grew up with was faster than any modern device that I use. I'm glad I'm at least able to recreate that feeling of raw performance on older hardware. Computers have always been insanely fast, I'm not sure where we lost sight of that.

</comment></comment><comment><AUTHOR> Still streaming, sorry, it's a crazy and crazily cool moment for me right now. I promise I'll be back with answers soon! :D

</comment><comment><USER19> Have you thought about porting this to Nintendo switch? Indie community is huge so many games do well on the platform.

<comment><AUTHOR> Yes. A lot! Unfortunately I've always considered "the big three" consoles completely out of reach for my project. Many players have asked about a port to the Switch and other consoles. I'm confident I'd be able to pull it off technically without too many issues. But I have zero experience dealing with parties like Nintendo and adhering to their (I imagine) very strict policies for games. Being a mostly-multiplayer cross-platform-play title complicates things too I think.

During my stream yesterday I also discussed Switch compatibility. I think Angeldust is a _perfect_ fit for the Switch. Nintendo's design philosophy very closely matches mine. Angeldust is big, bold, colorful, cheery. Let's get it on there stat I'd say!

If you have pointers on getting started with indie development on the Switch, I'd happily start reading up. Now's a good time as any. And with most things in the game I learned everything by just starting and winging it. Hopefully this'll be another case of being able to quickly internalize things and get going.

<comment><USER20> These guys help indies port to consoles, maybe they have a few tips?

[https://do-games.com/](https://do-games.com/)

<comment><AUTHOR> Thanks, I took a look. They look geared specifically to getting Unity engine projects "ported". Porting my (non-Unity) code is the least of my worries; I'm already maintaining about ten different build toolchains.

I anticipate most problems in the Nintendo Switch platform rules and guidelines that I'm completely unfamiliar with as of yet. And I lack the hardware to test. But now that I'm forced to think more about it, both seem like solvable problems. Thanks for the inspiration :)

<comment><USER20> I found that company via a gdc talk by the guy who did The First Tree (the talk was called No Time, No Budget or something alike). He used them mostly to get through the hurdles of rules and guidelines. Glad I could inspire good luck with your game!

</comment></comment></comment></comment></comment><comment><USER21> How did you choose the name?

For a native english speaker, the only association I have is with really hard street drugs (specifically PCP), and that association is very strong.

Is there a special meaning for your game?

<comment><AUTHOR> Since your message popped up right at the top I'm going to reply to it, hopefully summarizing my view on this and addressing the lively discussion about the game's name.

There is a special meaning for the game. The short backstory is included on the game's website. Here's the gist: in the game's lore Violet and Crimson are angel siblings. Violet is the angel of creation, Crimson the angel of destruction. Due to unforeseen circumstances both angels shatter to dust. This dust dwindles towards the planet where the game takes place. Subsequently parts of the game world and its inhabitants have been permanently infused with magical energy. Energy derived from the dust of angels. Angeldust.

"Angeldust" is beautifully fitting and it's a beautiful name in my opinion. I wouldn't want it any other way. There's an entire design language behind the lore, the names and composition of the game world. To a casual observer this might not be apparent or make sense. But everything ties together perfectly.

I've seen discussion and jokes about the name before when reaching a larger audience. It's great that people have an opinion on the name and some of it's (in my view) lesser known historical usages. As far as I'm concerned Angeldust is a pretty cool video game product with unique properties. In no way, shape or form do I want to endorse or conjure connection to other, past uses of "Angeldust". I hope you can appreciate the context, connection and product that "Angeldust" refers to for me.

And then I get there's a bit of confirmation-bias and pattern-matching going on with my name. I wouldn't have expected otherwise from the smart hackers here. I have no good argument against this. I wasn't aware that I share my name with a (for you all, well known?) dude from the past. Given finite first and last names, collisions are bound to happen. Maybe we should start using MD5- or SHA-hashes as names to prevent this in the future.

<comment><USER22> i like the name and don't associate games with drugs, so for me personally the name, even though used for some drug as a nickname (official name of the drug is obviously not angeldust) doesn't make that click. I think personally plenty of people will not relate it, and for most who do it might just be a bit of a giggle / afterthought if they do.

If it's really related to the in-game content and lore i'm sure players will figure that out and create a new more positive association to the word.

For example, a male donkey is called a "Jack", yet people still name their kids Jack, not relating that to a male donkey... (maybe a little more benign example.)

Personally i wouldn't worry about it too much! it's not like the game is called CrystalMeth or something....

<comment><USER23> Well, traditionally, Jack was a nickname for John. So they likely named their kids John. Though I guess more often these days people give their children a nickname as their fully-qualified given name.

</comment></comment></comment></comment><comment><USER24> What are the advantages of using your custom engine instead of unity, unreal engine?

<comment><AUTHOR> My vision was to make an "all-inclusive" product where people with ancient hardware would be able to enjoy a modern-day product. All existing engines focus on modern specs like OpenGL 3.x, 64-bit processors and operating system versions that I am not even able to run on some of my own devices.

In addition I have complex, dynamic geometry to render. And I wrote a custom, fixed-precision integer math library to prevent rounding errors for the almost infinite game world. Other products have weird rounding errors near the start, the middle or end of their worlds because of inconsistent floating-point accuracy. Moving to doubles only mitigates the problem instead of solving it.

And then it's just efficiency too. I have no idea how or why Unity or Unreal will treat my assets. As demonstrated on the stream: the game instantly switches between visual styles and texture quality. It lazily loads all resources so the main thread is only stalled when doing bulk uploads to the GPU. This makes the game start up in less than a second, something I couldn't pull off with a COTS engine.

Let me know if this answer didn't address your question fully.

<comment><USER25> How long did the client side engine take to build, if you had been able to do it full time?

<comment><AUTHOR> It's ridiculously hard to come up with an answer to this seemingly simple question. I've tracked my time usage pretty meticulously by version number, but for most features I had to develop the server-side, client-side, website and network simulator code simultaneously. Developing this (or any) game I think isn't a process where you build the server first, then build the simulator and then build the client. It's building v0.0 for all parts, then v0.1 for all parts and onwards where all parts gain features in lockstep.

For Angeldust I've done dozens of updates, each and every single one building upon the existing base. Looking back it's amazing to see that the product evolved in an almost linear fashion from v0.0 all the way to the current version without ever having to drop or redo features. But because the product evolved as a whole I can not really distill a time estimate for only the "client side engine".

I mean: would you consider _testing_ the client side engine part of client side engine development? For testing you need a working server. For which you "need" a working network simulator. It's dependencies all the way down.

And how about translation work for in-engine strings, updating shared libraries and frameworks, issue tracking, writing the asset conversion toolchain (which needs assets, which need integration). It's very hard to come up with any solid number. Maybe if you can severely limit your question's scope I can come up with an educated guess.

<comment><USER25> I think all that counts. I guess I'm just tempted to make a game engine as a hobby project. I made an OpenGL renderer in uni once (it was fun), but I don't really know what the scope would be to extend it substantially - obviously, not to "unreal" levels or anything even close

<comment><AUTHOR> Go for it! If you already have OpenGL experience—doesn't matter what level—you "only" have to add a bit of basic 3D world math and input handling. I found SDL ([http://libsdl.org](http://libsdl.org)) to be a very good core framework to build upon regarding input handling.

For the 3D world, start with a checkerboard pattern or so. In fact, this is almost exactly what I did to start Angeldust. I once showed off some early game prototypes on my stream, take a look at this one for example: [https://www.youtube.com/watch?v=qMs8YpkSrg0&t=3289](https://www.youtube.com/watch?v=qMs8YpkSrg0&t=3289)

If you keep watching that stream you'll see other in-progress versions so you can see how my product evolved.

<comment><USER25> Any other resources you would recommend? I read that physics is particularly time consuming for example. Thanks for the replies so far; it's very fun to see your work

<comment><AUTHOR> I didn't really use many external resources during development, most of the time I'm just "winging it" and acting towards a goal that I have in my mind. Coming up with a naive solution first, then trying to optimize it a bit in my head, then writing the code for it.

Angeldust's physics are relatively straightforward since it's based on a voxel grid. All game world intersections are approximated using axis-aligned bounding boxes (AABBs). I wrote the physics engine myself from scratch to reduce the number of game world data lookups, because that's pretty much the hot path in the code.

In the YouTube video from my earlier comment you can see that initially I started out with just game world boundary clipping and simple plane physics on the checkerboard. As I expanded my game world model, the physics engine grew along. So my advice would be (again) to start simple and grow from there. You'll do fine!

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER26> Is there a Mac installer available for download? App store says the game isn't available in my region (USA)

<comment><AUTHOR> Quick answer—both Steam and Itch.io offer DRM-free, standalone macOS versions:

Itch.io: [https://metagaming.itch.io/angeldust](https://metagaming.itch.io/angeldust)

Steam: [https://store.steampowered.com/app/488440/](https://store.steampowered.com/app/488440/)

Long answer—you are the fourth hacker to report that the game isn't available for you on one of Apple's App Stores. I've contacted Apple right after my stream yesterday, now waiting for a reply. If anyone can help me diagnose this or get it working, that'd be greatly appreciated. I recently switched from a free tier to a paid tier for the product launch, so I might be messing up something.

<comment><USER27> It's showing up for me in the App Store, macOS Mojave 10.14.6 (18G1012) from Argentina. Hope it helps with diagnosing somehow, and good luck with the project, looks impressive.

</comment></comment></comment><comment><USER28> Assuming "works perfectly on XP even without hardware OpenGL" means you have a software renderer as backup, can you explain more about how you get performance out of one on modern OSes (where DOS techniques of direct framebuffer access don't apply)?

<comment><USER29> Windows XP IIRC shipped with a soft OpenGL that'd look like a hardware version. I imagine they's not doing anything special other than not having requirements that a soft renderer can't fulfill.

<comment><AUTHOR> Right on. Software OpenGL 1.1 works on XP (and other Windowses) and the render engine falls back to minimal features if it detects this.

</comment></comment></comment><comment><USER13> How long did it take you to reach 250k players, and has there been marketing involved?

<comment><AUTHOR> This HN post is kind of the first attempt at getting the game out to "the public" aside from passively being present on app stores like Steam, Itch and Google Play.

<comment><USER13> Sounds good - keep up the good work!

</comment></comment></comment><comment><USER30> This looks cool!

250K players is impressive. Are those real players or bots?

Interesting to know more about performance too, what is your rate of update per second? How long does it take to process a tick?

Do you have a tech blog? Would be really interesting to learn more.

<comment><AUTHOR> You might have noticed I already took a looong time to formulate a reply to your questions. And I'm still not sure how to approach them, so I'll reply to the last part first.

Currently I only have my livestreams as a public presence. I find it a very comfortable and pleasant medium for conveying who I am. It lets me share stories and ideas including non-verbal cues and that's a major plus for me. So if you want to learn more, definitely subscribe or follow on YouTube and/or Twitch:

[https://www.youtube.com/AngeldustLive](https://www.youtube.com/AngeldustLive)

[https://www.twitch.tv/AngeldustLive](https://www.twitch.tv/AngeldustLive)

I honestly appreciate talking about technical things a lot, even though I might be playing what appears to be a silly video game. As for streaming: I just did three consecutive days, but will take a short break. I'll be back this Thursday.

</comment></comment><comment><USER31> Awesome job. I'm working on a game with some similar technical challenges (landscape is based on actual Earth though) and backend is in Java. I'll see if I can get my friends to play.

<comment><AUTHOR> I read somewhere about doing your project in a "release early, release often" style of development. While developing Angeldust I got others involved and playing after just a few months of part-time development. Getting feedback, ideas and issues early definitely helped me build a rock-solid base on which I could build the overarching gameplay.

So if you have friends (you're already doing great there!), get them playing today! Or tomorrow! It also forces you to have a working build pipeline and packaging process for getting builds out to others instead of toying around on your own machine. Also: don't take my advice as gospel, but judge its merit for yourself.

<comment><USER32> [https://en.wikipedia.org/wiki/Release_early,_release_often](https://en.wikipedia.org/wiki/Release_early,_release_often)

</comment></comment></comment><comment><USER33> Impressive for a solo indie game dev.

</comment><comment><USER34> Hello, very impressive project, great job! I have two qestions, somehow related but not fully.

1) How did you handle such big distance draw? Are you using lod and occlusion culling? Was it PVS or rather depth buffer based solution? Did you use bsp or octrees or something else?

2) what data structures did you use to hold the world and it's objects? And how much of it is kept on the server vs client?

<comment><AUTHOR> Angeldust has practically zero level of detail (LoD) and has no occlusion culling. "Almost zero LoD" means that geometry is always rendered at full resolution, but subtle vertex-shaded effects like the waving of grass are not applied for distant geometry. So you will see grass everywhere, but it won't wave when it's "unnoticeably" far away. Other than that I just push millions of mostly buffered triangles and vertices each frame at high view distance without a hitch. Turns out computers are pretty fast these days.

Note that I'm working on a newer render engine that actually uses more GPU shading capabilities and this engine runs even smoother than the current one, since it balances the workload a lot better between CPU and GPU.

As for data structures: both client- and server-side it's pretty much a simple std::map<coordinate, chunk*>. Its O(log(n)) lookup is adequate and I don't want or need to do complicated things to ensure decent performance. On top of the map I do spatially-aware caching to prevent say 99% of actual map lookups which turns the majority of lookups into O(1) which seems pretty much optimal.

As for keeping data: the server is authoritative in everything. The server keeps the data. You can take any device, install Angeldust and sign in with your credentials and you'll find yourself back in the same world, same friends, same progress, same everything that you had on another device.

Same with game state: the server tells the client everything. The client is basically just a dumb graphical terminal application that renders 3D visuals instead of VT100 text.

</comment></comment><comment><USER35> Awesome were you inspired by Ace of Spades at all or have heard of it?

I remember that original voxel-based engine and web server list that launched the client using their custom URI.

It was awesome how small the game was and how fun it was the simple concept (Minecraft with guns and no floating blocks).

<comment><AUTHOR> I once saw a trailer for AoS, but to be honest I don't really play many games myself these days. I find that working on Angeldust is in itself a reward that alleviates the need to play games as escapism or entertainment.

<comment><USER20> Just curious, what would you say to your customers that are playing you game for the sake of escapism or entertainment?

<comment><AUTHOR> I'd say: have fun! With Angeldust being a shared, persistent, open online world it's a pretty cool place to make friends and work on building projects together. You can leave a permanent mark in a place where you can be someone else compared to real life.

But I always advise enthusiastic players to keep an eye out on real life. Mind your health and your relationships. Real life, family, friends—they all come first. Of course you can be friends in-game and even build meaningful relationships there, but that's no substitute for living a well-balanced "real" life.

I've been an avid gamer in the past, and right now I'm a very avid developer. I try to balance that in real life by playing sports and exercising three or four times per week. Going out on walks, to the movies, meeting up with friends. "Balance in all things" as a character from Baldur's Gate would say.

</comment></comment></comment></comment><comment><USER36> This game is not available in the Dutch Apple App Store :(

<comment><USER37> Same for the UK.

<comment><AUTHOR> Sorry for taking a while to reply—I contacted Apple support and it seems like the issue is out of my control. For both you and the GP comment I'd like to refer you to my reply here with background and more information:

[https://news.ycombinator.com/item?id=21872869](https://news.ycombinator.com/item?id=21872869)

</comment></comment></comment><comment><USER38> Looks fantastic! When did you originally start development?

<comment><AUTHOR> I'm going to give a sentimental answer instead of a fully accurate one. This also came up during the livestream, so it's a great question!

When I was a five or six years old kid I used to program on our home computer, a Philips P2000. Monochrome green on black CRT, Zilog Z80 CPU, different ROMs for running BASIC or Pascal or whatever you hacked onto it. My very first program drew Christmas trees on screen. Very appropriate to share this story right now. I immediately showed my mom, who wasn't really impressed, because she didn't understand what I had done. I had told my computer what to do—wow!

Then one day I was walking around the schoolyard imagining the world around me being digitized and available as large, 3D blocks inside my computer. "My" P2000 wasn't advanced enough to pull it off and similarly _I_ wasn't advanced enough to program something like that. But the idea of having a coarse, 3D replica of my world and being able to have fun in there with my school buddies always stuck with me.

Many years later, at an intellectual dead-end in my job I took a month-long vacation to regain focus on my life and myself. And I suddenly remembered my childhood dream, or fantasy, of that 3D world. And I realized that computers were now advanced enough and _I_ was advanced enough. So I decided to take on the journey, channelling my inner five-year old.

Some players have joked about this with me. That they're actually investing their time in the figments of a five year old's imagination. And that's not far from the truth. Even though Angeldust is better, more beautiful and more professional that I had ever imagined, it is the actual implementation of my childhood dream.

So the answer to your question is that I started development somewhere between being five years old and now. Hopefully this answer still gives you some joy and insight!

</comment></comment><comment><USER39> What's your plans for commercialising AngleDust?

<comment><AUTHOR> Attaching a price tag it (done!) and trying to spread the word through relevant channels (in progress). Posting on Hacker News has been a thoroughly enjoyable process so far and I look forward to meeting more great minds.

</comment></comment><comment><USER40> I tried to download the game from appstore but it's not available in NZ, maybe you can provide actual package to download without app store.

<comment><AUTHOR> Of course! I can't distribute iOS apps outside of the iTunes App Store, but I do have DRM-free, standalone versions of Angeldust for macOS here:

Itch.io: [https://metagaming.itch.io/angeldust](https://metagaming.itch.io/angeldust)

Steam: [https://store.steampowered.com/app/488440/](https://store.steampowered.com/app/488440/)

If anyone nows a way to distribute iOS 6.1+ apps that doesn't violate my agreements with Apple, get in touch with me :D!

</comment></comment><comment><USER41> Is there a way to close an account?

<comment><AUTHOR> Sure, ping me on the e-mail address listed on the support page.

</comment></comment><comment><USER42> Wow. It works everywhere. Amazing

</comment><comment><USER43> Does fast & efficient = fun?

<comment><USER44> Makes it more likely.

I've noticed a first-pass test for video game quality is to watch the speed of menu transitions -- a slow transition time is indicative of other problems (menus are the least interesting, and very common, interface a game provides you; no one wants to spend any more time in the menu than they have to, except the designers).

Speed correlates highly to quality in game implementations.

Additionally, being a multiplayer game, fun also comes almost for free -- as long as you give decent tools for supporting the social interaction, the players will bring the fun in themselves. (For some reason, a lot of games fear their player base, and strangle the interaction opportunities as much as possible).

</comment></comment><comment><USER45> What are your server costs?

<comment><AUTHOR> It of course depends on the demand, but very low in general. During periods where I don't have a lot of player activity even a single vCPU is enough to host about 2.000 simultaneous players.

<comment><USER46> > It of course depends on the demand

Do you require downtime to scale or is it seamless?

<comment><AUTHOR> Migrating requires downtime since the game server runs as a monolithic entity. I migrate between dedicated servers and VPSes based on expected demand. Right now we're running on big metal to be able accommodate many players coming while I'm more actively promoting it.

When the hype settles down I'll probably move back to a small VPS. I always joke that Angeldust and the server would even run on your toaster. I bet it would even be able to serve hundreds of simultaneous players before turning into toast.

<comment><USER47> Not sure how your backend works, but I read a neat technique by I think Second Life, where each actor is in a zone, and a zone is managed by a server.

If a player leaves the zone, their entire code stack and current state is shipped to the next zone (script hand off) without the player noticing. They mentioned because each actor is running in a VM/scripting language, the servers can pause/resume the VM for that actor on any machine they move to - pretty neat.

<comment><AUTHOR> You can read a bit about the Angeldust backend architecture in this comment chain (I have no idea what to call this): [https://news.ycombinator.com/item?id=21858618](https://news.ycombinator.com/item?id=21858618)

The Second Life approach sounds like a very good solution if you're having to, and willing to use multiple servers because of performance reasons. I think Angeldust's architecture is a bit cleaner and more straightforward due to different design goals. I specifically wanted to reduce complexity and keep a simple infrastructure so that I could code, debug and manage everything on my own.

I also have the luxury of using a single, big, many-core server if necessary. When Second Life started I don't think 32+-core servers were a thing, so their scaling model was probably also born out of sheer necessity.

</comment></comment></comment></comment></comment></comment><comment><USER48> Amazing job man, well done

</comment><comment><USER49> No OpenBSD support :p.

<comment><AUTHOR> Don't sweat it! I did get an older version of Angeldust running on OpenBSD with pledge and unveil without problems. It's just not a market I can comfortably cater to at the moment. Kick back and relax for a moment and there'll probably be a binary or source distribution for *BSDs too. Same with Raspberry Pi. Game runs beautifully, but I have no great packaging and distribution process yet.

In addition I also ran Angeldust on Haiku. There is no reason why a product like this wouldn't run everywhere.

(Also shoutout to theo and/or tedu if you're here.)

</comment></comment><comment><USER50> this looks incredible, thank you for sharing!!

</comment><comment><USER51> Tried registering, but the password input in the Android app doesn't support pasting text...

<comment><AUTHOR> Yes, I'm sorry that the UI support on Android is a bit limited. Input support is a bit lowest-common-denominator there to work around keyboard bugs.

<comment><USER52> I would also add that I get a little ticked off when I have to adjust my password manager's defaults - in this case reducing from 64 to 32 characters.

In the past I have very-often stopped exploring a new thing at this point but this time I am continuing! Looks great and I also eagerly await more details of it's implementation.

<comment><AUTHOR> Honestly, thanks for the feedback. I never realized / got feedback that players would indeed use a password manager for a game like mine. "It's just a game!" is not the best defense here and the workflow of getting an external password into the game afterwards is also pretty subpar. I'll need to think on this for a good solution.

<comment><USER53> When you use a password manager, you use it for everything has a password.

</comment></comment></comment></comment></comment><comment><USER54> How is this not Minecraft without extra steps?

</comment><comment><USER55> This comment will get downvoted but, dude, you are a GOD tier programmer. How?

<comment><AUTHOR> Thanks for the kind words! I'm not sure if I can give you a recipe or an answer. I do me like you do you. Everyday I give it my best and eventually you end up with a product like this. Just get started and work on your dreams!

</comment></comment><comment><USER56> The graphic style - oh, my eyes!!! Please team up with a designer, or with a _different designer!_

...I don't mean the quality, it's understandable resources are constrained. I mean the _actual artistic decisions_... it burns your visual cortex with all those colors and textures fighting each other. What's the theme, "kindergardeners on acid meeting Elvis"?! or "South Park but in Fortnite drawn while drunk"?

<comment><AUTHOR> Oof! I'm the designer and art director myself. Please elaborate a bit as "colors and textures fighting each other" doesn't give me the slightest clue as to what you perceive as problematic. Can you post annotated screenshots so I can learn from this? Then I'll go and fire myself!

I've been playing the game in both the "Cartoon" and "3D" visual style for years and it's been a very pleasant and eye-pleasing experience for me. Please open your world a bit for me. Maybe share some of your design work for inspiration. Thanks in advance for your feedback.

<comment><USER56> Heh, sorry, I've been to harsh with the comment I guess... it's probably just me personally being "highly allergic" to this particular toony-style. I think it sort of falls in some "uncanny valley" of design, being neither stylized/abstract/low-poly-ish enough, nor realistic enough, nor fully- pixelated/blocky/minecrafty, but just in-between.

In general I like styles that either:

\- just go all the way in the stylized direction, like Bad North [1], The Witness [2] or even Clash of Clans [3] (to be honest I also dislike CoC-style popular with mobile games nowadays, but at least it's consistent/harmonious in its candy-plasticky look)

\- OR they actually try to do the realistic-style part, like the classic Age of Empires, or toony-ish-ralisticky like more modern Northgard [4]

\- OR they fully embrace the blocky style like Minecraft, or the 8-bit/pixelated style of clearly retro-style games

"In between" styles just look... _annoying_ , giving a "sand in your eye" mental sensation of the early 90s games that were too shallow and childish. It lacks some "higher harmony" thing that I can't describe any better. I get this "allergic" reaction also when I see this style in clothing or architecture or whatever.

Anyway, keep up the work if you and others enjoy it, don't be discouraged by people that just prefer smth else!

I'm just a bit sad bc I probably would've liked the game mechanics, but the style totally turns me off.

[1] [https://store.steampowered.com/app/688420/Bad_North_Jotunn_E...](https://store.steampowered.com/app/688420/Bad_North_Jotunn_Edition/)

[2] [https://store.steampowered.com/app/210970/The_Witness/](https://store.steampowered.com/app/210970/The_Witness/)

[3] [https://play.google.com/store/apps/details?id=com.supercell....](https://play.google.com/store/apps/details?id=com.supercell.clashofclans&hl=en_GB)

[4] [https://store.steampowered.com/app/466560/Northgard/](https://store.steampowered.com/app/466560/Northgard/)

<comment><AUTHOR> Thanks for the elaboration, I get that the design just doesn't do it for you personally. Did you already see that the game's also available in a highly abstract "Cartoon" visual style featuring hand-drawn, 2D animated sprites à la Paper Mario 64? Here's the trailer in the "Cartoon" visual style:

[https://www.youtube.com/watch?v=J7LK0s8LgmQ](https://www.youtube.com/watch?v=J7LK0s8LgmQ)

Maybe this style appeals more to you?

</comment></comment></comment></comment><comment><USER57> Uninstalled. Looks like fun but I let Google choose a hard password and there's no way to paste it into the Android app. I tried typing it but had to swap back and forth between apps to get all the pieces of the password. The game clears the password when I got back. Last chance change password but I don't see how.

<comment><USER58> Totally valid criticism but kind of dickish delivery. The guy built a game, for free, I think it's worth more than an "Uninstalled."!

<comment><USER57> Totally justified remark. I was frustrated after trying it. I'll reinstall after the password fix. Thanks for keeping me honest :)

</comment></comment></comment><comment><USER59> Culturally speaking getting kids into a game called "Angel Dust" which is street slang for PCP is not going to do society any favors.

<comment><USER60> It also won't harm society at all. It might harm the game, but I doubt it.

<comment><USER61> Tell that to the slightly hard-of-hearing bookstore employee who, when I asked for Minecraft, gave me a copy of Mein Kampf.

</comment></comment></comment><comment><USER10> You seriously may want to reconsider the name. 'Angel Dust' is a slang for the narcotic PCP - I immediately was confused and only clicked so I could tell what it actually was.

Not sure how this didn't come up before? At any point in development? O.o

Edit: whoa, downvotes, really? Care to say why? This is a legitimate concern?

<comment><USER62> Minor nit: PCP is a dissociative hallucinogen, not a narcotic.

<comment><USER9> "Narcotic" has shifted, at least in American vernacular, from meaning drugs that induce sleep to meaning any illegal or Schedule-I drug.

Merriam-Webster: [https://www.merriam- webster.com/dictionary/narcotic](https://www.merriam- webster.com/dictionary/narcotic)

Collin's Dictionary: [https://www.collinsdictionary.com/dictionary/english/narcoti...](https://www.collinsdictionary.com/dictionary/english/narcotic)

Edit, regarding "no one calls marijuana a narcotic":

Not sure why I was downvoted, considering that we are discussing angel dust rather than marijuana.

The United States Government calls marijuana a narcotic:

[1]: [https://www.federalregister.gov/documents/2019/08/29/2019-18...](https://www.federalregister.gov/documents/2019/08/29/2019-18714/international- drug-scheduling-convention-on-psychotropic-substances-single-convention-on- narcotic)

[2]: [https://www.incb.org/incb/en/narcotic- drugs/index.html](https://www.incb.org/incb/en/narcotic-drugs/index.html)

As do The UN and the World Health Organization (in process of amendment):

[1]: [https://www.healthpolicy-watch.org/who-recommends- cannabis-s...](https://www.healthpolicy-watch.org/who-recommends-cannabis- should-be-reclassified-in-un-convention-on-narcotic-drugs/)

[2]: [https://www.who.int/medicines/access/controlled- substances/U...](https://www.who.int/medicines/access/controlled- substances/UNSG_letter_ECDD41_recommendations_cannabis_24Jan19.pdf?ua=1)

And the Australian Government: [https://www.legislation.gov.au/Details/F2018L00106](https://www.legislation.gov.au/Details/F2018L00106)

As well as the Swiss Government: [https://www.ch.ch/en/cannabis/](https://www.ch.ch/en/cannabis/)

And the Government of Singapore: [https://www.cnb.gov.sg/](https://www.cnb.gov.sg/)

And the European Union: [http://www.emcdda.europa.eu/publications/topic- overviews/cla...](http://www.emcdda.europa.eu/publications/topic- overviews/classification-of-controlled-drugs/html_en)

It's important to note the apparent legal definition of "narcotic" when discussing drugs, as it drastically differs from the traditional use, and includes a much longer list of substances.

<comment><USER63> No one calls weed a narcotic.

<comment><USER64> Cops sure do.</comment></comment></comment></comment></comment>


Tech help for healthcare idea - <AUTHOR> Aloha! I am looking for someone who would be interested in helping me develop a platform to help health care practitioners in practice.  Essentially using technology to improve the workflow in a medical/dental. Thank you and aloha. <comment><USER2> How will you sell it? Building something that's better than the software that's predominantly used in healthcare at the moment is very easy but selling it is incredibly hard because you have to get past incumbents and policies designed to keep those incumbents in place.

<comment><AUTHOR> Great question. We just have to make it better than what's out there in the existing software. There are multiple outside programs healthcare providers use because practice management softwares are not tech advanced in every area.

</comment></comment><comment><USER3> yea, lets build something.

email me!

[http://www.google.com/recaptcha/mailhide/d?k=01Di5Hwj11ONgE-...](http://www.google.com/recaptcha/mailhide/d?k=01Di5Hwj11ONgE- qgdvkaZqQ==&c=SI4fOhqO0nlea3L09rnJz_WFNBLKhzQIXRcbIn9UO3k=)

^ its hidden so i dont get anymore spam :)

</comment><comment><USER4> Interesting, contact me.

<comment><AUTHOR> Aloha - how do I contact you? Apologies, new at this website. Thank you.</comment></comment>


Hacker calls me and says he tapped my phone. WTF? - <AUTHOR>

I called him back and no answer. I tried to reset my phone and it says "error". I also cannot turn it off. What is going on? <comment><USER2> What kind of phone? I don't know anything about this stuff but I can google and try to help</comment>


Show HN: Versey - <AUTHOR> https://www.versey.co

<comment><USER2> Would you describe this as Instagram for audio recordings?

<comment><AUTHOR> Instagram for audio is a good description</comment></comment>


Thailand Won't Make You Happy - <AUTHOR> http://rebelceo.com/thailand-wont-make-you-happy/

<comment><USER2> I've heard Chang Mai in northern Thailand has an awesome expat community with good wifi and communal office spaces. Sounds pretty good to me!</comment>


Show HN: OSM Based Android Social Map for Travel and Real-Time Interaction - <AUTHOR> http://stappz.com/a

<comment><AUTHOR> Thank you for your feedback. This is very helpful to see what is missing in the description. The social side is to see the content that is provided by other people. This way, it's a personal map where you mark what you like and at the same time you see what others like. Like "world position" bookmarking exchange. Please tell me if this was now somehow understandable:)

</comment><comment><USER2> (from a quick, tired glance at the store page) Seems interesting, although the text doesn't really make clear to me what exactly to expect. IMHO it goes to much into detail about the mapping features (but as a Locus user, none of these are new to me) and I somehow still don't have a clear idea what the social side looks like.

</comment><comment><AUTHOR> Thanks a lot. We do our best to improve it. So any feedback is welcome. Feedback helps us to set development priorities.

</comment><comment><USER3> I think it's cool stuff and very easy to use. The maps look awesome... UP!

</comment><comment><USER4> just downloaded. High quality app! this has to be upvoted...</comment>


Do You Think SF or NYC Public Transportation System Could Use This? - <AUTHOR> http://soentrepreneurial.com/2012/06/24/do-you-think-sf-or-nyc-public-transportation-system-could-use-this/

<comment><USER2> I've seen something like this demo'd in NYC, unfortunately I can't remember if it was a NY Tech Meetup or other event, in the last six-eight months.

The NYC Metrocards come in two flavors: unlimited (day, week, and month) and pay as you go dollar denominated. The dollar denominated ones are topped up in such a way that you get _n_ bonus dollars (essentially additional rides) for every X dollars. It had been the case that if you only use your metrocard on the subway and most buses then you don't end up with odd dollar amounts on the card. But certain buses (typically express buses) charge more than "one ride" (whatever that currently is, $2.50 I think), however with the last fare increase they did not adjust the bonus so now you do end up with odd dollar amounts.

There's also an automatic refill "pay as you go" card, the EasyPayXPress Metrocard which can be filled from a credit/debit card.

Fares are discussed here: <http://www.mta.info/metrocard/mcgtreng.htm#payper>

As to whether it would be useful? Sure? Maybe? In NYC most subway stations have metrocard vending machines where you can top up, but almost no bus stops do.

The MTA is in the very slow process of evaluating MetroCard replacements and options (there's been multiple NFC-ish experiments with fobs and credit cards), now would be a good time to contact the MTA if you have something that can add value (and scale).</comment>


A Very Rare Book: The mystery surrounding a copy of Galileo's pivotal treatise - <AUTHOR> http://www.newyorker.com/magazine/2013/12/16/a-very-rare-book

<comment><USER2> I read this in print and it is an absolutely fascinating read. Take the time with your morning coffee or lunch to take your time with it. Here is another take:

[http://lareviewofbooks.org/essay/faking- galileo#](http://lareviewofbooks.org/essay/faking-galileo#)

</comment><comment><USER3> What a fascinating read! It's kind of sad in some ways - the contrast between Galileo doing his work here in Padova, and modern Italy, with the guy spending a few months in jail and then being sentenced to house arrest in his villa after having put all that time and energy into deceit and theft.

</comment><comment><USER4> Was anyone else thinking about The Ninth Gate as they began reading this piece? The globetrotting, talk of valuable books and masterful antiquarian knowledge, and slow but definite buildup of tension were the same. Anyone know of another film or book that has this same feel?

Excellent piece, worth reading to the end.

<comment><USER5> The book, Foucault's Pendulum by Umberto Eco, comes to mind.

[http://en.wikipedia.org/wiki/Foucault%27s_Pendulum](http://en.wikipedia.org/wiki/Foucault%27s_Pendulum)

<comment><USER6> Foucault's Pendulum is best read as a satire. I wasn't told that it sort of was before I read it and found it maddening. The moment I realised Umberto Eco was mocking everybody who believed this stuff was important, it all made much more sense.

</comment></comment></comment><comment><USER7> _" Gingerich has examined nearly every extant first- and second-edition copy—six hundred in all—of Copernicus's On the Revolutions of the Heavenly Spheres."_

That is a fascinating book; part history of science, part detective story and part bibliophile's wet dream: [http://www.amazon.com/The-Book-Nobody-Read- Revolutions/dp/B0...](http://www.amazon.com/The-Book-Nobody-Read- Revolutions/dp/B000BNPG8C)

</comment><comment><USER8> > "In addition to offering insights on celestial movement, the book rebutted > Aristotle, who had maintained that heavenly bodies were smooth and > "perfect"; with his telescope, Galileo had also looked extensively at the > Earth's moon, and could see mountains and craters on its surface."

Surely you can see the moon's unevenness with the naked eye?

<comment><USER9> This is correct. But the belief in Aristotle's philosophy was even more powerful:

 _" The medieval followers of Aristotle, first in the Islamic world and then in Christian Europe, tried to make sense of the lunar spots in Aristotelian terms. Various possibilities were entertained. It had been suggested already in Antiquity that the Moon was a perfect mirror and that its markings were reflections of earthly features, but this explanation was easily dismissed because the face of the Moon never changes as it moves about the Earth. Perhaps there were vapors between the Sun and the Moon, so that the images were actually contained in the Sun's incident light and thus reflected to the Earth. The explanation that finally became standard was that there were variations of "density" in the Moon that caused this otherwise perfectly spherical body to appear the way it does. The perfection of the Moon, and therefore the heavens, was thus preserved."_

[http://galileo.rice.edu/sci/observations/moon.html](http://galileo.rice.edu/sci/observations/moon.html)

<comment><USER10> That ... seems like a lot of effort to avoid facing up to the moon looking bumpy. And Aristotle? WTF dude, you saw the same thing!

</comment></comment></comment><comment><USER11> Very interesting, I wanted some more info on the "Florence Sheet", but Google turned up nothing but this article (or references to it). That seems strange.

<comment><AUTHOR> Mario Biagioli has written about it (I think the Google issue is just that historians usually call it "Galileo's Drawings of the Moon" or the like, rather than "the Florence sheet").

Here's Biagioli on it: [http://books.google.fr/books?id=XfKjO9I47QUC&pg=PA145&dq=gal...](http://books.google.fr/books?id=XfKjO9I47QUC&pg=PA145&dq=galileo+moon+florence&hl=en&sa=X&ei=ZuYJVMj8PM3KaJzWgogO&redir_esc=y#v=onepage&q=galileo%20moon%20florence&f=false)</comment></comment>


Ask HN: How can I learn more about algorithms? - <AUTHOR>

I'm a 20 year old that's been programming for 9 years now, primarily in PHP and Python.<p>Have I already been exposed to algorithms? Should I have? How can I learn more about them? <comment><USER2> Buy and read: [http://www.amazon.com/Introduction-Algorithms-Third- Thomas-C...](http://www.amazon.com/Introduction-Algorithms-Third-Thomas- Cormen/dp/0262033844)

Once you've gotten through that, consider borrowing TaoCP from your local library.

<comment><USER3> Is that actually the best book on basic algorithms or just a book that is virally recommended?

<comment><USER2> It's the best general-purpose algorithms textbook I've seen. There are lots of other books which go more in-depth into specific areas, but you need to cover the basics first.

</comment></comment></comment><comment><USER4> You can learn about [http://en.csharp- online.net/CSharp_Design_Patterns_Made_Simp...](http://en.csharp- online.net/CSharp_Design_Patterns_Made_Simple)</comment>


Computation, Memory, Nature, and Life (2004) - <AUTHOR> http://www.fourmilab.ch/documents/comp_mem_nat_life/ <comment><USER2> Thanks for the article. This was a really nice discussion of life as computation.

That said, I disagree with Conjecture 2 on the basis that no independent storage was ever indicated for any class 4 behavior in _A New Kind of Science_ , and "storage" achieved through encoding of information by transformation of immutable (homeostatic, anyway) state seems downright ubiquitous in nature.

In the post, John seems to draw a false dichotomy between computation and storage. I thought Stephen's book actually did a fine job of demonstrating (repeatedly, and at length) how the data and the computational machinery can be one in the same when the rules for transformation are inherent to the system. Ultimately, whether or not one thinks this true is probably decided by one's beliefs about the most basic laws of physics, and I'm rooting for a discrete universe.</comment>


CSS Click Events - <AUTHOR> http://tympanus.net/codrops/2012/12/17/css-click-events/

<comment><USER2> > _"This blog post is about showing the possibilities of CSS and some clever > hacks. It's clearly not for "real life" use cases. Please, consider the > whole article as a playground for experimenting, not as a tutorial to handle > click events on your website or application."_

I just want to make sure people see that part of the post. Great post, but as the disclaimer says, there are many reasons you should not do this for a client website, your application, etc.

Other than that, this has some really neat concepts in it. I have always been a big fan of the work done by Codrops! :)

</comment><comment><USER3> You don't have to hide the checkbox like that; display: none; is fine. Also looks better code-wise.

And apparently performance wise: [http://www.zeldman.com/2012/03/01/replacing- the-9999px-hack-...](http://www.zeldman.com/2012/03/01/replacing-the-9999px- hack-new-image-replacement/)

<comment><USER4> display:none will be problematic for mobile Safari since the label click won't trigger the checkbox to be checked. The 100% text-indent snippet from that article on zeldman.com does not seem to work when applied to a checkbox... it remains visible.

<comment><USER5> Another way is to put the checkbox within the label and absolute position it to the outside of the label's box. With the label having a relative position and hidden overflow you shouldn't see the checkbox. But this may not be suitable based on the design and other factors. Plus I haven't browser checked it since I would normally do such things with Javascript.</comment></comment></comment>


Oak Ridge N.L. surges forward with 20-kilowatt wireless charging for vehicles - iam-TJ https://www.ornl.gov/news/ornl-surges-forward-20-kilowatt-wireless-charging-vehicles <comment><AUTHOR> Does anyone have a source for this that isn't the press release? I'm struggling to find something more technical. The video talks about 95% efficiency but the press release says 90%.

Their website doesn't seem to have any real information either, just links to 2011 papers and a note that they work on wireless power transfer.

I assume there's more information somewhere, but I'm completely failing to find it. It's a shame it's not more common to at least link to in press releases (or on the video description).

<comment> iam-TJ Same here, but I did figure out that the technology is a development of the existing 'Plugless' [0] by Evatran Group, Inc., and found an Idaho N.L. report dated 2014 [1] "Test Results of the PLUGLESS™ Inductive Charging System from Evatran Group, Inc." which says:

"... Note that the maximum efficiency for this operation condition of a 100-mm gap at 3.3 kW is 88.8% at X = −90 mm and Y = −30 mm ..."

Which seems to indicate they've improved the efficiency for the heavy-duty system that Evatran, Oak Ridge, Clemson and partners are reporting on now.

Then I found [2] "Wireless Charging of Electric Vehicles" which is a July 2015 Oak Ridge N.L. project update that talks about Milestones and the Technical Accomplishments.

That search of energy.gov led me to another related project [3] "Technology Requirements and Evaluations for High Power Applications of Wireless Power Transfer" (on-going research into 100kW+).

And this [4] "High Efficiency, Low EMI and Positioning Tolerant Wireless Charging of EVs".

[0] [https://www.pluglesspower.com/about/](https://www.pluglesspower.com/about/)

[1] [https://avt.inel.gov/sites/default/files/pdf/evse/WirelessCh...](https://avt.inel.gov/sites/default/files/pdf/evse/WirelessChargingTestResultsPaper.pdf) (warning, TLS X509 certificate is for different sub-domains!)

[2] [http://energy.gov/sites/prod/files/2015/07/f24/vss103_onar_2...](http://energy.gov/sites/prod/files/2015/07/f24/vss103_onar_2015_o.pdf)

[3] [http://energy.gov/sites/prod/files/2015/07/f24/vss152_onar_2...](http://energy.gov/sites/prod/files/2015/07/f24/vss152_onar_2015_o.pdf)

[4] [http://energy.gov/sites/prod/files/2015/07/f24/vss102_lewis_...](http://energy.gov/sites/prod/files/2015/07/f24/vss102_lewis_2015_o.pdf)

<comment><AUTHOR> Sorry I missed this reply, thank you for all the extra info.

</comment></comment></comment><comment><USER2> If I'm reading this right, most plug in systems currently are a third of the 20kW rating of this charger, but this wireless charger is 90% efficient. So the extra 2kW is just lost to heat? That's a lot of energy to lose - I'm not sure if the convenience is worth it when it still would be close to a half hour to charge the 10kWh battery they're testing on.

<comment><AUTHOR> > If I'm reading this right, most plug in systems currently are a third of the > 20kW rating of this charger, but this wireless charger is 90% efficient. So > the extra 2kW is just lost to heat? That's a lot of energy to lose

I'm not sure where the 90% figure in the article comes from, the video says 95% (so that'd be down to 1KW). He also says it's "very close" to the onboard charger efficiency, but I don't know if that means 95% is close to 99.x% or if onboard chargers have other losses and maybe it's normal to lose (say) 4% with current setups.

> I'm not sure if the convenience is worth it when it still would be close to > a half hour to charge the 10kWh battery they're testing on.

It depends a lot on the use case. If you're trying to replace having to plugin something overnight it's not really saving you much. But what if parking spaces had the chargers in? Or taxi-ranks? Busses are another good example where being able to reduce the required battery would be pretty good.

Edit - reducing the time it takes to charge your battery by reducing the human element required is good, but how useful it is depends on how long you want to charge for. Want to charge for half an hour? Not really saving much time there. Want to charge for 45 seconds here and there throughout the day? Now you're saving more time.

Wireless doesn't have to be the only way of charging, but it may be significantly better for some use cases.

<comment> iam-TJ I was thinking of this in the context of trickle-charging by embedding the technology in the road at well-known bottle-necks, traffic lights, and anywhere where there is predictable very slow-moving traffic, as well as in the obvious candidates such as car parks and parking bays.

For parking bays on public streets in residential areas where on-street parking is the only option it offers an option _without_ needing to add a lot of additional pavement furniture (charging pods).

Right now the capital cost versus utilisation equation probably doesn't look rational, but in 15 years or so when a significant fraction of vehicles are electric or hybrid it could make a deal of sense.

Not sure if it'll ever happen but the current experiments with (solar) power- generating road surfaces combined with this and local energy storage could be interesting. Top up the storage batteries during light traffic; discharge the storage batteries and charge vehicles during peak traffic periods and overnight.

</comment></comment></comment><comment><USER3> For comparison, Tesla Superchargers are 120 kW at peak (when charging an empty battery): [http://insideevs.com/tesla-cranks-superchargers-up- past-120-...](http://insideevs.com/tesla-cranks-superchargers-up-past-120-kw/)

They are not wireless, though.</comment>


The Lightest Metal Ever (2015) [video] - <AUTHOR> http://www.boeing.com/features/2015/10/innovation-lightest-metal-10-15.page <comment><USER2> I thought this was familiar, and a search revealed it was posted here twice back in 2011... so, not exactly new.

[http://insights.dice.com/2011/12/13/ultralight-metallic- micr...](http://insights.dice.com/2011/12/13/ultralight-metallic- microlattice/)

[http://newatlas.com/ultralight-micro-lattice- material/20537/](http://newatlas.com/ultralight-micro-lattice-material/20537/)

<comment><USER3> Even this article is a year old (2015) but yes this has been around for a while.

Interesting none the less.

</comment></comment><comment><USER4> Does it bother anyone else that the audio is so highly edited? They're literally stitching together sentences that she did not say. I'm used to videos cutting phrases together, but they're cutting individual words together in a way I've never see^B^B^B heard before.

<comment><USER5> You probably just don't notice when it is done in stuff with higher production values.

To me the most likely explanation is that they wanted a certain (short) run time and she only did 1 take.

<comment><USER6> So my response is _don 't do that_.

<comment><USER7> Don't do one take? Uh, if I was her I wouldn't do more than one take. I might not do the shoot at all. I wouldn't get paid more by doing a promotional video shoot. Why would I care? Why would she?

<comment><USER8> Presenting your ideas is an important part of most, if not all, high complexity works. If you're an engineer - present your ideas and results, so you can get better feedback, if not more appreciation. If you're a product person, explain the results to practically anybody - improves conversations which lead to better mutual understanding. For executives it's even more straightforward - remember how many hours Steve Jobs spent preparing demoing first iPhones?

<comment><USER7> What you describe is the type of stuff that is largely unimportant. This is not a commercial for a retail product, it is for an unapplied manufacturing technique. It doesn't mater who you wow with this stuff. It has an application or it doesn't. In fact, for all the good this video does, they should have just wrapped an egg it the stuff and dropped in from a building. 15 seconds of potentially viral video would have done a better job than this video. The video is fine for telling an engineering story, however. She and the hack videographer did a fine job for a low-stakes presentation. It's fine, really

</comment></comment></comment></comment></comment></comment><comment><USER9> The title should say "lightest metal structure".

Lithium is the lightest metal. (Though technically Li-6 isotope is even lighter)

[http://scitation.aip.org/content/aip/journal/jcp/27/5/10.106...](http://scitation.aip.org/content/aip/journal/jcp/27/5/10.1063/1.1743927)

</comment><comment><USER10> When someone talks about 'light' metal, I assume they incorrectly refer to the weight of a solid cube (cm^3) of the metal, that is, the density. A wireframe, to me, is not a metal. It consists of metal but its structure, including air, is not a metal. I don't say my cupboard is made out of the lightest wood in existence because if I divide its volume (including the air inside!) by its weight, it's lighter than any cube of wood.

<comment><USER11> Ironically, balsa wood, pine, and oak are all just boring same ole cellulose and lignin composite surrounded by varying amounts of nothing. Used to be surrounded by water when the tree was alive.

Yes yes there are trivial details in that pine is 1% pine tar and oak has 1% whatever dyes and stuff to make it darker color, but to one sig fig or to 10% accuracy, its all the same.

<comment><USER12> You make a very good point, but we can amend ([http://paulgraham.com/disagree.html](http://paulgraham.com/disagree.html)) the GP's argument to say that such macroscopic holes are not very impressive. Now if they were as small as those in balsa, and invisible to the eye... then on a macroscopic level it would appear to be superlight metal. It could also help that the holes are sufficiently small as to not percolate ([https://en.wikipedia.org/wiki/Percolation_theory](https://en.wikipedia.org/wiki/Percolation_theory)).

</comment></comment></comment><comment><USER13> Question: will it ever be possible to wrap a thin impermeable film around a structure like that, suck out the air inside and end up with a lighter-than- air solid in order to build vacuum airships?

<comment><USER14> Theoretically yes, practically no. But why bother? Supporting the walls by filling the space with a gas lighter than air would be more efficient.

<comment><USER15> Theoretically, no, not this particular substance.

But anyway, the reason people are fascinated with the idea is that vacuum is a renewable and abundant resource. Heck, space is almost completely full of it.

All of the lighter-than-air gases I'm aware of have downsides, like hydrogen's permeability and flammability, or helium's rarity and price.

<comment><USER11> Hot air is lighter than air, and aerogel like low density materials have some weird property where the thermal conductance is lower than bare gas when the mean free path in the aerogel is shorter than the mean free path in bulk gas. In other words they're better hot air balloons than actual hot air balloons.

Something interesting to think about is if they don't leak heat energy very well, and the exterior is something heat proof (steel foil?) you can heat up the air inside to arbitrary temps until radiative glow exceeds the other thermal losses. So if you think nylon hot air balloons are high performance, imagine balloons with much higher lift per volume. A liter of air weighs about a gram so its always going to take a large piece of aerogel to lift me (I weigh quite a few grams) but ...

A hot air balloon sized piece of aerogel is not economically viable right now, even for the military... or is it?

<comment><USER15> Low-density materials surrounded by a thin shell are still going to weight a lot more than air surrounded by a thin shell. Also, you have to look into how this is going to be heated. For a hot air balloon to work, all the air inside has to be hot. If your balloon is filled with an amazingly efficient insulator....

Also, the reason airships use lighter-than-air gas is because then they don't have to carry lots of heavy fuel for heating air. Things like fuel, and pipes to carry heat throughout your aerogel, will rapidly eat up any efficiencies you gained.

</comment></comment></comment></comment></comment><comment><USER16> Basically cardboard made out of metal?

</comment><comment><USER17> I feel like the video was a bit sales-oriented. Is it just me?

<comment><USER18> Yeah, call when you have a really cool application / problem solved. Also the Astrodome is probably 99% air.

<comment><USER19> tough crowd! no love for basic R&D.

<comment><USER17> I'm not saying I don't like basic R&D. Quite the opposite actually.

</comment></comment></comment></comment><comment><USER20> 21st Century Chainmail! Our forefathers would be proud.

</comment><comment><USER21> Does the lack of centering with the play button bother anyone else?

<comment><USER14> That, and the constant background hiss in the audio. I get that they are going for a windy/airy feel, but it comes off as a poor recording.

</comment></comment><comment><USER22> It's... 3D chicken wire? Not terribly impressed. From the video it shows that it's also super weak. You won't be building airplanes with this stuff.

This obsession with super light materials that "are strong for their weight" seems a bit useless to me. It never seems to scales to something that weighs a medium amount while maintaining its strength to form something actually useful. Supposedly, spider silk is incredibly strong. But if you can't scale that strength there is no point to it.

At least aerogel has purposes for extreme insulation, but as this is made out of metal I don't see use there either.

Nevertheless, I applaud progress.

<comment><USER23> If the exterior is rigid and the inside is filled with this material it could be strong enough for many structural projects. As was shown in the video our bones are created in the same way. I think the issue will be cost.

<comment><USER24> Yeah, when I read about this before, I think they were making it with a 3D laser sintering technique, which comes with some baggage. Mainly it's slow and with current technology I don't know if you'd be able to print a continuous sheet of it versus the cubes they showed in the video.</comment></comment></comment>


Recharging the Python standard library - <AUTHOR> http://programming.oreilly.com/2013/10/dead-batteries-included.html

<comment><USER2> Summary: The author wishes that the third-party requests module were part of the Python standard library (ignoring the wishes of the person who wrote the requests module).

The title is link bait. The "batteries" work fine - some are venerable, but they are well tested and documented.

The author ignores stellar parts of the standard library such as: collections, itertools, contextlib, functools, itertools, sqlite3, hashlib, struct, json, elementtree, etc.

Essentially, the author is bashing the entire standard library because the urllib modules are somewhat dated. IMO, The rant is not worthy of being on the front page of Hacker News.

<comment><USER3> Hmm, I was going to list additional standard libraries that I use on a regular basis to "prove" the author wrong, but I could only come up with two (in addition to your list): csv & re.

Still, the only thing I use with any frequency that is an outright replacement for standard library functionality is requests and beautifulsoup. Well, if you don't include ipython, which is an absolute necessity.

<comment><USER4> I can come up with quite a few of them.

        os
        sys
        logging
        os.path
        re
        subprocess
        datetime
        json
        pickle
        itertools
        urllib2
        signal
        traceback
        socket

It has a lot to do with my job - devops for remote clients. I can't rely on the ability to use 3rd party python libraries, and my stuff has to work reliably with few problematic corner cases. The standard library fulfills both of those cases pretty well.

To refer back to the "old batteries" argument, the included batteries may be the old lead acid type, but they're dependable in a lot of cases where newer lithium ion batteries would rather catch fire.

<comment><USER5> If I may ask, what's wrong with datetime? I may not have encountered unusual cases, but for most uses the date + datetime + timedelta scheme seems to work pretty well.

<comment><USER3> My only gripe with datetime and time are the organization of it. I can never remember whether it's datetime.datetime.now or datetime.now or time.timedelta or datetime.timedelta, and so on.

<comment><USER4> Yeah, typing datetime.datetime for everything gets pretty old.

I just remember that datetime is the package, datetime.datetime is the class, and datetime.datetime.now() is a @classmethod that returns instances of that class. I do kinda wish it was datetime.now() for the constructor instead.

</comment></comment></comment></comment></comment></comment><comment><USER6> I get the feeling that overloading the division operator for paths is a really bad idea for clarity... To someone who is unfamiliar with the path.py package, it looks like you're trying to divide some sort of object by a string.

Not to mention the fact that, in his code, he aliased path to p, so it's even more confusing as to what is going on there.

<comment><USER7> It does make the code a lot clearer to read. There are a lot of other python packages that overload specific operators/magic functions to aid readability. For example, numpy arrays overload the slice operator to great effect.

Also, on the same topic, what about using the '+' operator with strings and lists/tuples for concatenation? Or the '|', '&' and '^' operator for sets (which I have to admit I never use because I can never remember which is which)?

<comment><USER4> > It does make the code a lot clearer to read.

If, and only if, you're familiar with how the path library works. I had to shift mental contexts away from python and into shell to understand that it was a "shortcut" for os.path.join(). The division operator is not typically associated with path joining in programming languages.

Frankly, it's not really offering any greater level of abstraction for paths; just shortcuts. You still have to call makedirs, open, write, etc. I don't find the minute improvements to os.path.join that terribly compelling.

<comment><USER8> I agree. I inherited some code that did this and it was not immediately obvious what was going on. I thought the variables being used where numbers, and I was very confused.

</comment></comment></comment></comment><comment><USER9> The author has some reasonable points. There is old cruft in the standard library, and there are vital 3rd party libraries that will never go into the standard library. I don't think the path example is particularly strong, but things like NumPy, IPython, pytz and requests are essential for some tasks.

The following is rather poor advice, though: "Python programmers should never restrict themselves to the standard library and should be open—even eager—to depend on third party packages that provide the APIs and functionality they need."

Really, you should not be "eager" to depend on things outside the standard library unless you have a good reason to. Every 3rd-party dependency you use adds complexity and you will have to make sure that the latest version doesn't change out from under you. If you are building an open source tool, for example, you may end up supporting multiple versions of the packages you depend on. Sure, use a 3rd-party library if it is worth that overhead, but you should never do it without good reason.

</comment><comment><USER10> Now that we've (mostly) figured out how to do dependency management, a large standard library has become more of a liability than an asset. As a scala fan I hope we can move more library-type functionality out into, well, libraries, allowing that to evolve on its own schedule, and keeping the core language small.

<comment><USER11> A while back, while I was a doing Ruby, I remember a discussion that came up regarding moving some of/all of (can't remember) the standard library to Gems so that, as you say, they could "evolve on their own schedule". It'd be interesting if standard libraries of languages adopted this approach. A release of a language would then become the interpreter/compiler and set of vendored libraries deemed the standard library. Then, in projects, if say, the path module gets updated with new features, I can include that version and not wait for the next major/minor release of the language to get new features/bug fixes.

<comment><USER12> The term "standard library" has a second interpretation that is increasingly relevant in modern programming: as well as meaning "the [one true] standard library", it could also mean "the library of standards". It doesn't necessarily have to provide its own tools. It can also define conventions and frameworks that establish a baseline for interoperability that everyone else's tools can work with.

I don't believe it's realistic to create a standardised toolbox when every new language come along and expect everything in it to still be a good way of doing things ten years later, as requirements change and new ideas come along. This is probably why so many languages today have at least a _de facto_ standard place where you get other libraries when you need them: PyPI, CPAN, Boost, etc.

On the other hand, there are many recurring themes that appear in those libraries, particularly in the interface they offer and their overall design: basic data types and data structures, application-specific concepts like windows and database connections and file formats, architectural tools like publish-subscribe mechanics and test hooks. Standardising these common ideas, so it's as easy as possible to connect up libraries from different sources or to replace one library with another, offers many benefits in efficiency and maintainability for a programming language's ecosystem as a whole.

We already see examples of this being done: many languages have a somewhat standardised interface for connecting to SQL-based database engines, for example. We also see some unfortunate examples where it wasn't done quickly enough, such as the myriad string types everyone defined in C++ because there was no standard type for so long.

I suspect the most successful programming languages of tomorrow may not have anything like as many tools available "out of the box" as Java and Python and C# do today. However, if I were a betting man, I'd wager they will all provide solid foundations for managing third party libraries and much better frameworks and conventions for interoperability between those libraries.

</comment></comment></comment><comment><USER13> Some of us use python as a rapid prototyping language before writing "real" code in c or even (horrors) c++ for performance. This is what makes ctypes so popular, python becomes the glue between calls to well tested low level functionality. So the place of the std libraries in this paradigm is to replace the c-like functionality. In c mkdir does not return the directory name, so os.mkdir does not either, allowing translation of the final prototype to c where it becomes another well tested tool in the next evolution of the application.

I can appreciate the need for higher level libraries in the std, but not at the expense of os, sys, and other 'dead' modules.

</comment><comment><USER14> Batteries included or not, I can always find battery replacements in Python and that's what I love about it.

Do you want an excellent graph library? you have networkx. Do you need more speed? bind an existing C++ library with SWIG. If I want to use .NET or Java libraries there is IronPython and Jython. And you have two excellent IDEs: Visual Studio and PyCharm.

<comment><USER15> _Batteries included or not, I can always find battery replacements in Python and that 's what I love about it._

I agree that the breadth of high-quality python libraries is great... but in a language that believes

"There should be one-- and preferably only one --obvious way to do it,"

it'd be nice if we weren't also looking for replacements for the standard library.

</comment></comment><comment><USER16> the article mentions pytz, but that's pretty low-level. i wrote a wrapper, called simple-date, that tries to make it easier to use. [https://github.com/andrewcooke/simple- date](https://github.com/andrewcooke/simple-date) (self, link, obviously; also 3.2+ only)

</comment><comment><USER17> Slightly off topic, but does anyone know why is PyCrypto standard part of the python library?

<comment><USER4> Do you mean why is PyCrypto _not_ part of the standard library? Export controls, mostly.

From PyCrypto's website:

"Unfortunately, cryptography software is still governed by arms control regulations in Canada, the United States, and elsewhere. The controls are fairly loose for free/open-source software, but they exist nonetheless."

<comment><USER17> Ahh, ok, that makes sense.

</comment></comment></comment><comment><USER8> Who is this article for?

<comment><USER18> The author.

</comment></comment><comment><USER19> I'll just leave these here:

[http://www.python.org/dev/peps/pep-0428/](http://www.python.org/dev/peps/pep-0428/)

[http://www.python.org/dev/peps/pep-0431/](http://www.python.org/dev/peps/pep-0431/)</comment>