CRDT: Conflict-free replicated data type - <AUTHOR> https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type <comment><USER2> Several interesting open source projects are working with CRDTs to make state synchronization in distributed systems an easier problem to deal with:

      - Braid HTTP (https://braid.news/)
      - Automerge (https://github.com/automerge/automerge)
      - Gun (https://gun.eco/)
      - Yjs (http://y-js.org/)
      - Noms (https://github.com/attic-labs/noms)
      - DAT (https://dat.foundation/)

Personally, I'm most excited for Braid's effort to bring state sync to HTTP through the IETF process, as well as Automerge's progress in P2P via Hypermerge (and it's star app, Pushpin). I'd also like to see Gun succeed, but have had a hard time getting started due to visually distracting quirks in its documentation.

<comment><USER3> Horde [0] is a really interesting Elixir library for distributed, self-healing state using CRDT

[0]: [https://github.com/derekkraan/horde](https://github.com/derekkraan/horde)

<comment><USER4> Horde is indeed a really interesting Elixir library. It's based on the CRDT library, DeltaCrdt [0], also by Derek Kraan. He discusses DeltaCrdt here [1] and Horde here [2].

BTW, Horde is a distributed supervisor, i.e. analogous to what regular Elixir OTP supervisors do, except that it can restart processes on different cluster nodes. It also provides a distributed process registry.

Daniel Azuma of Google gave a great 39 minute talk at ElixirConf 2018, "Docker and OTP: Friends or Foes?" [3], where he shows Horde (and DeltaCrdt) in action to keep a multi-player tank video game going while the Docker container it's running in gets killed and and the Elixir processes get respawned on another container. The state is persisted across Elixir nodes in other containers in an instance of DeltaCrdt.

(Again, the talk is really good -- if the above sounds interesting, you'll want to check it out [3]).

[0] [https://github.com/derekkraan/delta_crdt_ex](https://github.com/derekkraan/delta_crdt_ex)

[1] [https://moosecode.nl/blog/how_deltacrdt_can_help_write_distr...](https://moosecode.nl/blog/how_deltacrdt_can_help_write_distributed_elixir_applications)

[2] [https://moosecode.nl/blog/introducing_horde](https://moosecode.nl/blog/introducing_horde)

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

</comment></comment></comment><comment><USER5> For anyone more deeply interested in this topic I recommend to read this blog post from Archagon. It describes the different alternatives (OT, CmRDT, CvRDT, diff sync) for writing a collaborative editor. And unlike academic papers it is written in a format how a programmer does research and thinks about a problem in real life, so it's very natural to follow, even if it's long and complex.

[http://archagon.net/blog/2018/03/24/data-laced-with- history/](http://archagon.net/blog/2018/03/24/data-laced-with-history/)

(I am not affiliated in any way, just enjoyed it very much)

<comment><USER6> Alexei's work on this subject is very good: the best practical introduction to the subject.

However, I feel that it is worthwhile (necessary?) to completely understand the academic basis for CRDT. A good place to start is Shapiro et al's second paper : [https://hal.inria.fr/inria-00555588/document](https://hal.inria.fr/inria-00555588/document) .

In order (sic) to understand the paper you need to have a grasp of Order Theory. This is not terribly hard to get your head around. This is a good place to start: [http://jtfmumm.com/blog/2015/11/17/crdt- primer-1-defanging-o...](http://jtfmumm.com/blog/2015/11/17/crdt- primer-1-defanging-order-theory/) also [https://www.wikiwand.com/en/Order_theory](https://www.wikiwand.com/en/Order_theory) and basically stop when you understand this : [https://www.wikiwand.com/en/Lattice_(order)](https://www.wikiwand.com/en/Lattice_\(order\))

The reason why the formal basis is important is: that's the whole point of CRDT -- previously (been there, got the t-shirt..) folks just made up replication mechanisms they thought would work. Then they build them and embarked on a process of fixing the bugs. Sometimes that took decades. CRDT is nothing new in terms of : software to perform eventually consistent replication. The new thing is that there's a way to formally prove that your bright idea for replication will in fact work (as in : it will converge and it will have the consistency properties you expect). So if you're not seeing that aspect, then you're really not with the program.

btw originally the C stood for Commutative or Convergent, not Conflict-Free. There are plenty of CRDTs that cope with conflicts consistently, rather than being conflict free (e.g. LWW Register).

<comment><USER7> FWIW, I disagree that it is necessary (or even desirable) to understand the academic basis first.

The core idea of CRDTs are intuitive and easy to understand from an engineering perspective. For me, the academic literature unnecessarily complicates and obscures what's going on, and I would also point newcomers to something like [http://archagon.net/blog/2018/03/24/data-laced-with- history/](http://archagon.net/blog/2018/03/24/data-laced-with-history/).

It probably has to do with where you are coming from. If you're not a mathematician or theoretical computer scientist, I don't think that reading these documents is going to be a very helpful start.

<comment><USER6> I hear you because I thought the same way until recently. I have worked with eventually consistent replication since long before the CRDT papers and thought initially it was just some academic mumbo jumbo layered over intuition. However, based on my journey through the field I'd encourage you to try again to grokk the academic side of the work because it's really the key insight and (for me) it's very much not intuitive. In fact that's the tripping hazard in all this: the simple examples are intuitive which leads to a sense that everything is similarly intuitive. Not so, for me at least.

I'm neither Mathematician nor Computer Scientist (I'm an Electrical Engineer), but I have learned not to fear formal notation and advanced abstract concepts. They're really not that hard to understand once the terminology is decoded.

</comment></comment></comment></comment><comment><USER8> An interesting problem is how much interface mismatch you get when you try to solve real-life problems using CRDTs.

Awhile back I implemented the "become a connection" logic for a project that has purely CRDTs datatypes, and I kind of went back and forth between composing well known CRDTs to model all the possible state, or just implementing the solution as a finite state machine whose CRDT-ability had to be reasoned for this particular purpose. Ending doing the second.

Got the intuition that this is a very nice way to think about distributed software but the right abstractions may not be in place just yet.

<comment><USER9> Could you elaborate on "become a connection" logic? What kind of problem is that? You may need to change user interface a bit to fit into CRDTs.

<comment><USER6> Like a LinkedIn connection, I assume.

<comment><USER8> Yes, it was for a chat proof-of-concept app. But the end result ended up being so convoluted I thought no sane person would program like that, so I went back to the drawing board.

Look at _init() here to get a feel of it:

[https://github.com/hyperhyperspace/hyperhyperspace- web/blob/...](https://github.com/hyperhyperspace/hyperhyperspace- web/blob/master/src/services/people/contacts.js)

<comment><USER6> Your code didn't look so bad to me :)

I think you may have met some of my colleagues working on similar problems at Dweb camp recently.

</comment></comment></comment></comment></comment><comment><USER10> I'm under the impression that CRDTs are somewhat limited by the lack of a clear way to combine several structures along with application-specific logic.

In the 2012 paper "Logic and Lattices for Distributed Programming" (by Conway, Marczak, Alvaro, Hellerstein, and Maier) they write:

> CvRDTs present two main problems: (a) the programmer bears responsibility > for ensuring lattice properties for their methods (commutativity, > associativity, idempotence), and (b) CvRDTs only provide guarantees for > individual values, not for application logic in general.

They give this example of the second point:

> A replicated, fault-tolerant courseware application assigns students into > study teams. It uses two set CvRDTs: one for Students, another for Teams. > The application reads a version of Students and inserts the derived element > <Alice, Bob> into Teams. Concurrently, Bob is removed from Students by > another application replica. The use of CvRDTs ensures that all replicas > will eventually agree that Bob is absent from Students, but this is not > enough: application-level state is inconsistent unless the derived values in > Teams are updated consistently to reflect Bob's removal. This is outside the > scope of CvRDT guarantees.

They continue:

> Taken together, the problems with [CvRDTs] present a _scope dilemma_ : a > small module (e.g. a set) makes lattice properties easy to inspect and test, > but provides only simple semantic guarantees. Large CvRDTs (e.g., an > eventually consistent shopping cart) provide higher-level application > guarantees but require the programmer to ensure lattice properties hold for > a complex module, resulting in software that is difficult to test, maintain, > and trust.

This leads to a research project about monotonic logic as a distributed programming paradigm.

[http://bloom-lang.net](http://bloom-lang.net)

[http://boom.cs.berkeley.edu](http://boom.cs.berkeley.edu)

</comment><comment><USER11> I found it useful the IPFS research repository in Github [1], there are a lot of resources there including background concepts.

[1] [https://github.com/ipfs/research-CRDT](https://github.com/ipfs/research- CRDT)

</comment><comment><USER12> I find that we use CRDT's quite often in the form of append-only sets (formally a G-Set). Rather than choose the CRDT specifically, we've seen that an append-only set was the natural choice for a particular need and then we identified the commutative and idempotent properties of the operation. Once identified, we leverage them for scale.

One good example is processing items in an SQS queue, where (without enabling FIFO) there is no guarantee of ordering. With a G-Set you can read and merge batches of items (and retry naively) without affecting the outcome.

</comment><comment><USER13> I've been researching these recently. Some things I've found: \- Macrometa is a new startup and stateful edge (distributed database) service. I just tried them this morning. User experience is very raw but it works great. You can shim it in front of existing DBs (Dynamo, Firebase, etc) for better performance. \- Gun: where macrometa runs on edge servers, Gun runs on the client. Mark is a fantastic community and they are doing interesting things. I had trouble implementing it but that's because I'm lousy at javascript. \- Redis uses CRDTs or something similar: [https://redislabs.com/redis- enterprise/technology/active-act...](https://redislabs.com/redis- enterprise/technology/active-active-geo-distribution/) \- This presentation is fantastic: [https://www.infoq.com/presentations/crdt-distributed- consist...](https://www.infoq.com/presentations/crdt-distributed-consistency/)

</comment><comment><USER14> I wasn't familiar with CRDTs until Chris McCord started talking about them wrt Phoenix Channels. Really cool and interesting stuff.

</comment><comment><USER15> I've been working my way through 'A comprehensive study of Convergent and Commutative Replicated Data Types'[0] and I've been finding them very approachable. I'm trying to implement them in Clojure as I go and that has been interesting. I've also starting looking at 'Mergeable persistent data structures'[1], and that one already has a repo with the code in Ocaml, but I have to admit that I don't understand that queue structure yet.

It does seem like a good way to dodge some of the tough problems that come up in distributed systems.

[0][https://hal.inria.fr/file/index/docid/555588/filename/techre...](https://hal.inria.fr/file/index/docid/555588/filename/techreport.pdf) [1][http://gazagnaire.org/pub/FGM15.pdf](http://gazagnaire.org/pub/FGM15.pdf)

</comment><comment><USER16> CRDTs are very interesting, powerful, and simple datatypes. I've experimented with a Go CRDT DAG, and it was simple to implement. The much more difficult part with a CRDT is message routing. Even with routing, managing network membership is a tough problem. There are multiple approaches, like Gun's superpeers, or Gossip protocols, but this remains a very challenging aspect of using CRDTs.

</comment><comment><USER17> I recently went down this rabbit hole and sincerely hope there will be some sort of return to local-first software development, with an eye to collaboration. CRDTs post a unique opportunity to develop software that empowers users with their own data, yet retains the ability to collaborate and store it on a server.

</comment><comment><USER18> I've been working with a forked version of ShareJS for a while and its worked well over the years, so OT is certainly a viable option for anyone interested in collaborative work. I would recommend anyone use ShareDB rather than ShareJS, though. The former is a cleaner, more modern version of the latter.

</comment><comment><USER19> Has anyone made a good sequential log CRDT yet? (It's a hard problem)

<comment><USER6> What's your definition of sequential in this context?

</comment></comment><comment><USER20> These are fascinating, I built a toy replicated K/V in go using CRDTs:

[https://github.com/lonelycode/yzma](https://github.com/lonelycode/yzma)

</comment><comment><USER21> I am trying to understand how CRDT compares to Lamport timestamps or vector clocks. Couldn't you achieve most of the same objectives using these abstractions as well?

<comment><USER22> Directly discussed here:

[http://archagon.net/blog/2018/03/24/data-laced-with- history/...](http://archagon.net/blog/2018/03/24/data-laced-with- history/#convergence-techniques-a-high-level-overview)

</comment></comment><comment><USER23> As a coding challenge I had to implement one based on the Wikipedia article.

I challenge you to do the same!

<comment><USER24> Bonus points if you can complete the challenge under an hour with tests!

</comment></comment><comment><USER25> This was already posted here some months ago.

[https://www.google.com/search?q=hacker+news+crdt](https://www.google.com/search?q=hacker+news+crdt)

<comment><USER26> Call me crazy but I think CRDTs are interesting enough to deserve a repost

<comment><USER27> I dunno, I heard and read so many times about CRDT that I wouldn't say it's nerdy interesting to just posting wikipedia page here.

Something more, some failure stories like [1] would be interesting.

[1] [https://news.ycombinator.com/item?id=19886883](https://news.ycombinator.com/item?id=19886883)</comment></comment></comment>


Easiest checkout ever - Never enter your details at an online store again - <AUTHOR> http://www.snapscanapp.com/

<comment><AUTHOR> Note: It's only available in South Africa for now.</comment>


Reload, reloaded: faster and leaner page reloads - <AUTHOR> https://blog.chromium.org/2017/01/reload-reloaded-faster-and-leaner-page_26.html <comment><USER2> More technical details are available in the Facebook post linked at the bottom of the article. [https://code.facebook.com/posts/557147474482256](https://code.facebook.com/posts/557147474482256)

> _we found that Chrome would revalidate all resources on pages that were > loaded from making a POST request. The Chrome team told us the rationale for > this was that POST requests tend to be pages that make a change — like > making a purchase or sending an email — and that the user would want to have > the most up-to-date page. However, sites like Facebook use POST requests as > part of our login process. Every time a user logged in to Facebook the > browser ignored its cache and revalidated all the previously downloaded > resources. We worked with Chrome product managers and engineers and > determined that this behavior was unique to Chrome and unnecessary. After > fixing this, Chrome went from having 63% of its requests being conditional > to 24% of them being conditional._

And later on, discussing immutable long-cached resources:

> _There was some debate about what to do, and we proposed a compromise where > resources with a long max-age would never get revalidated, but that for > resources with a shorter max-age the old behavior would apply. The Chrome > team thought about this and decided to apply the change for all cached > resources, not just the long-lived ones. You can read more about their > process here [the parent article]. Because of Chrome 's blanket approach, > all developers and sites are able to see improvement without making any > changes themselves._

They say Firefox resolved not to implement it this way, instead adding a new cache-control header, "immutable." [https://hacks.mozilla.org/2017/01/using- immutable-caching-to...](https://hacks.mozilla.org/2017/01/using-immutable- caching-to-speed-up-the-web/)

So, uh, this means that Chrome and Firefox now have _very_ different caching behavior, by design. :-(

I must say that I prefer Firefox's approach, or even FB's approach where long- lived cache results are handled differently. Refresh's revalidation behavior provides a valuable safety net to ensure that users know how to get a page "back to normal."

Regardless, I wish the Chrome and Firefox team would come to agreement on a proposal, rather than each doing their own thing. That's bad for the web.

<comment><USER3> I agree that immutable seems like a better solution. But it still puts a little too much trust in the urls not breaking and puts an unnecessary onus solving a solved problem. Immutable resources should be referred to by some straightforward variaton of a hash of the immutable bytes that form their content. Its similar to how git works for example. [1]

So what does this look like in practice? rather than serve a your css as

        <link rel="stylesheet" type="text/css" "ref="https://example.com/styles/site.css"/>

you'd instead use something like[2]:

        <link rel="stylesheet" type="text/css" "ref="sha256:abc123..."/>

And all the resources could be verified for integrity after being downloaded and trivially changed thereafter.

For privacy concerns, the url provides the additional feature of sandboxing the content via the origin access controls. As a step 2 addition the urn could still contain the current url style as an optional suffixed parameter, which if provided the browser would use to sandbox that particular hash to that site as a provider of it. Referring to that hash from a site that has not previously provided the data would fail, unless the site is able to either prove that has the data by resending it, or rehashing it some way.

1: I don't mean to be pedantic but a lot of people don't understand that you can take any number of bytes, compute a 256 or 512 bit cryptographic hash for it, and be guaranteed of a longer than the lifetime of the universe level small chance of ever finding any other bytes that produce the same 256 or 512 bit number, even when trying as hard as you can with all the resources you can muster.

2: There are several different ways to do the addressing for the content (magnet uris, IPFS univeral hashes etc). The browser vendors ought to pick one and move on.

<comment><USER4> We discussed this approach -- one difficulty with it is that the website often doesn't know the hash of the resource. For example, imagine a server that takes urls of the from images.fbcdn.net/abc124.jpg/200x200 and dynamically resizes the image to 200x200 px. It it is impossible to know what the hash of this resource will be without calculating it beforehand.

The subresource integrity spec supports cases where the developer is able to calculate the hash beforehand

<comment><USER3> I hadn't considered dynamic urls as the dominant use case. But I can certainly see the importance in handling them as well. To me that feel like a function memoization problem (e.g. this example was a function of 2 parameters, height and width). For that case passing along cache-control: immutable, integrity: sha-abc123 headers in the response feels like the best current solution.

Though it would be nice to somehow have the url self-descriptively assert its purity. Something to the effect of saying `I don't have the content-hash for this now but whatever i return is going to be immutable`, rather than having to muck around in the web-server protocol layer to assert that fact via cache- control: immutable.

I think fundamentally the metadata on whether a particular url is immutable/pure or not, should be self evident, rather than buried in as an implementation detail in the response's http header.

</comment></comment></comment></comment><comment><USER5> I still sometimes see "broken" pages (on both desktop and mobile - more common with flaky WiFi) - e.g. pages that have bad or broken CSS because the server connection was interrupted. The resulting pages are usually nigh-unusable, and the broken resources can end up cached in the browser.

Usually a reload will solve this issue. It sounds like the Chrome team wanted to validate only the main resource and rely on cached data - isn't this inherently going to break the "reload a broken page" use case? It sounds as if the Chrome team wants to abandon that use case entirely because "the quality of webpages has improved". That may be true - but the quality of some network links hasn't!

<comment><USER4> This use case will still work. If your connection is interrupted the resource will not be cached. The new reload behavior will still cause the resource to be re-requested.

What if the resource is corrupt -- say a bit got flipped due to a hardware error. In the old version of reload you would send a conditional request to the server "has this resource been modified since date X". The server would say "no it hasn't" with a 304 (unless the bit flip happened to affect the header and changed the date to a much newer date). Thus a normal reload would cause you to continue to use the invalid resource. The only way to fix this situation is by doing a ctrl+shift+r -- neither Chrome's nor Firefox's approach makes this worse than it was in the past

<comment><USER3> That is pretty good explantion. It seems like it's possible to kill two birds (avoiding unneeded 304s and correcting corruption) with one stone and solve this problem via something like pushing subresource integrity [1] ahead, as well as a magnet uri / IPFS notion of linking to content by it's hash.

1: [https://developer.mozilla.org/en- US/docs/Web/Security/Subres...](https://developer.mozilla.org/en- US/docs/Web/Security/Subresource_Integrity)

</comment></comment></comment><comment><USER6> I get the motivation, but I suspect this will end up frustrating some users.

Surely moving from "reload everything" to just "reload the page only" will break some existing use cases.

I suspect, for example, some people use the reload button when a captcha isn't readable, even if the captcha has a little reload button.

</comment><comment><USER7> So how do I "ctrl + shift + r" on mobile when I want a true reload?

</comment><comment><USER8> I'd have to say that Firefox did this much better. [https://news.ycombinator.com/item?id=13493407](https://news.ycombinator.com/item?id=13493407)

</comment><comment><USER9> does this have any impact on who does webdev and often substitutes resources reusing the same url or similar things?

<comment><USER10> Lots more Ctrl+F5 to refresh instead of just pressing F5.

It's actually been super annoying to explain to Project Managers - as they often don't see CSS changes due to this change (which actually happened nearly over a month ago).

<comment><USER11> Ctrl+Shift+R is a bit more ergonomic.

> It's actually been super annoying to explain to Project Managers - as they > often don't see CSS changes due to this change (which actually happened > nearly over a month ago).

You are appending a cachebuster to the URL that changes for every release, right?

<comment><USER10> _> You are appending a cachebuster to the URL that changes for every release, right?_

I'm in a department with a many years outdated CMS. The modern CMS does this after minification. The version I'm stuck with doesn't do cache busting or minification. My department is stuck on the outdated CMS due to our necessary continued support of IE8. So unfortunately no, we're not. We do so manually once a site is in production but it isn't worth the effort to do manually while things are still fast moving and internal. It's much easier to occasionally remind the project manager that they need to do a hard refresh.

<comment><USER11> That sucks. If I was in your situation I'd look into having the webservers rewrite caching headers to just disable caching completely in the internal environment.

</comment></comment></comment></comment></comment><comment><USER12> Can they do something about refreshing Gmail already? Takes forever and gmail gets hung so often I have to do it at least once a day. One of the slowest pages on the web.</comment>


Ask HN: What advice would you give to a computer science undergraduate? - <AUTHOR> I am about to enter into the 2nd year of my CS course in university. The second year is when actual CS courses begin. I've had a basic C course. I have good knowledge of basic computer science, some algorithmic knowledge and a good experience with JavaScript and Node.JS. Yet, it would be great if I could get real advice / insights from professional computers scientists on things to explore ( in the CS field ) in college. <comment><USER2> The things that you think are going to take a long time will take a short time and the things you think will take a short time will take long.

So, for instance, if you have 4 hours scheduled to implement some neural network to optimize X, it may take 30 minutes to type in the algorithm and get it working, but it will take 3 hours to get the environment set up, the version of Tensorflow or whatever up and running, and much longer to type up your results.

So, hopefully, if you expect this, you won't crumple in despair when you find your self 1.5 hours into the time and you haven't even got the right language working with your IDE for that hello world to come up. No, you're right on track, and just keep going.

</comment><comment><USER3> Learn how to use your debugger. People will tell you things like "If you use unit tests, you never have to use the debugger!" but it's nonsense. When one of your tests break, you have to dig in and find out why it broke, and that means debugging. Plus a lot of things can't be reasonably tested in unit tests.

Take a class on ethics. Most companies hiring CS majors today are sorely lacking in ethics and it would be good to know ahead of time which are which.

Learn how to ask questions to get good answers. In particular, learn how to write up an MCVE - Minimal, Complete, Verifiable Example [0]. The better the quality of the question, the better the quality of the answer. This is really hard when starting out using a technology you know nothing about. In those cases, describing what you're trying to do, what approach you're taking, and why you think that approach is useful will get you to answers about how to do it correctly more quickly.

Don't spend too much time on HackerNews. The articles posted here tend to attract a certain crowd with a certain viewpoint on any given subject and it's a bit of an echo-chamber.

[0] [https://stackoverflow.com/help/minimal-reproducible- example](https://stackoverflow.com/help/minimal-reproducible-example)

</comment><comment><USER4> \- Make 1 web application

\- Make 1 mobile application

\- Make 1 desktop application

\- Nothing fancy for the above just some that solve simple problems, good if they solve your problems!

\- Learn to use a version control.

\- Try to intuit with hands on coding a hard domain you will like: graphics, AI, compilers. The trick is if you like the hard parts, you most likely like it!

\- See if you can work with some professor where you can learn how to implement code for papers published in the hard domain you like.

\- By the time your internship arrives, you can build a decent portfolio.

\- And eat, sleep, exercise.

I know the above can be a lot with your studies, hopefully you can pull it off. Good luck.

<comment><USER5> I would also highly recommend learning version control - GitHub has a good set of Git tutorials at [https://try.github.io/](https://try.github.io/), and [http://ohshitgit.com/](http://ohshitgit.com/) is a handy reference for common mistakes/pitfalls in it.

Using version control regularly gives you:

* Backups in case of mistakes/system failure (so long as you remember to sync/push your work to an external server)

* Room to experiment with various approaches to a problem (since you can always reset to a known good state)

* Experience in explaining and structuring your solutions to problems

</comment></comment><comment><USER6> Study something else in addition to computer science, preferably in the humanities or social sciences. A lot of the problems we're seeing in big tech come down to the fact that the people working there don't understand anything outside of software development, and we'd be better off if they had wider and more diverse backgrounds.

Ideally you'd do your CS major in a liberal arts program rather than in engineering, but that might be impractical. Get as close as you can, though.

</comment><comment><USER7> Read (and converse) voraciously and follow the directions it may lead you... Into art, philosophy, psychology, business, politics, literature. This will help you to find things you love, it will also give you insight into adjacent topics that will allow you to shine in an area of CS that is right for you. You will never have such a perfect chance to do this as your university years.

<comment><AUTHOR> Thank you!

</comment></comment><comment><USER8> What I would suggest is to actually take advantage of the environment that the university provides to you. Speak with professors, learn what they do, ask questions, potentially work with them, interact with students - generally try to learn as much as possible by exploring all the different sides of the comp. science world and most importantly, enjoy it!!!

</comment><comment><USER9> If you want to go into academia:

Get very good grades especially in math and cs. Do research for credit or money. Get a summer research position. Don't worry too much about authorships your first year; you will hopefully end up as an nth author. In later years you're going to want to get a few nice publications (either high profile as nth author or ok-levle as first author) to get into a good grad school.

If you want to go into industry:

Prioritize getting an internship with a good company over all else. Get good at solving algo/DS problems. The big household-name tech companies will open doors for you if you have them on your resume, and they have special programs for freshman-sophomore students.

Regardless:

Take academic courses instead of practical courses. University practical courses (e.g. web dev) usually lag behind industry, and you will have ample opportunity in your career to learn new practical skills. You will probably never be in a state of mind or environment where you can get as much out of academic subjects (e.g. statistics, AI, theory of computation, etc.) as you are in now. Always always always prioritize conceptual understanding over trivia you can just google.

<comment><USER10> > Take academic courses instead of practical courses.

I would caveat this with: Make sure you have some structured activity that forces you to write a bunch of code. If you're not competing in ICPC or doing something similar, you should be taking courses like Operating Systems, Compilers, etc. that require significant coding assignments almost every semester.

Theory classes like Discrete Math, Theory of Computation, Algorithms, etc. are great, but it's important to have structured practice to make sure you're developing your coding skills as well. Most students won't actually complete coding projects on their own time, so it's good to put yourself in situations that force you to do it.

Overall great advice though.

<comment><USER9> Yes, fully agree. I think getting good at algo/DS is essentially the same as doing ICPC. Personally, the limited amount of time I spent on ICPC has probably had the greatest benefit/cost from college in my life so far.

</comment></comment></comment><comment><USER11> The best advice I can give you is to try things that your professors aren't telling you to do already, and also to try going one layer deeper into the system then you think you need to in order to solve problems. Doing so will reveal things to you about why the solutions are the way they are.

You'll probably come out with a good understanding of gc'ed languages like Javascript and Python, but the interpreters for these languages still interface with the modern operating system with a systems language like Assembly, C, or Rust.

Maybe try bringing up a simple application on a Z80 or similar MCU that blinks an LED connected to a GPIO. Then switch to using the pulse-width-modulated output to blink the same LED but at different blink rates and potentially even make it fade in and out.

You will learn more about embedded systems from that project than you ever could from messing with Linux on a Raspberry Pi. And everything you learn will give you a better understanding of how computer systems actually work. You will also have to learn more about C and potentially C++ then you ever thought was possible.

You don't need to write an OS from scratch either. You can use something like [https://freertos.org/](https://freertos.org/). There's board support for widely-available platforms.

<comment><AUTHOR> Thanks a lot for your advice

</comment></comment><comment><USER12> Computer science is not software engineering.

They are both very valuable and are extremely complementary but they are not the same thing. As you enter the workforce, understanding this distinction will serve you well.

<comment><USER13> Seconded. And, if you're intending to head for industry (and something like 95% of CS grads wind up there[1]), you need software engineering more than you need CS. Try to get as much of it as you can.

[1]: All numbers made up.

</comment></comment><comment><USER14> \- If you're in it just for the money, bounce now.

\- Be curious.

\- Push your comfort-zone, often. Do hard things: write a C compiler, design a pipelined/microcoded/branch-predicting MICMAC processor, write a kernel module, write a 3D graphics engine, and so on.

\- Master the fundamental concepts, data structures and algorithms.

\- Dig deep: computer architecture/organization, assembly, Linux from Scratch, source code of OSes/tools, etc. And, there's more out there than just FOSS; some very useful tools aren't new, OSS or popular. Get proficient at debugging tools.

\- Don't get stuck, emotional or religious about any one domain.

\- Master one or two domains.

\- Be ambivalent, healthily suspicious of and open to "new" flavors of tech fashions.

\- Practicing and reading books is all well-and-good, but trying to make something is the best teacher.

\- Throwing away and rewriting a few times helps.

\- Write for clarity, not cleverness.

\- Work on something that matters.

\- Avoid job security where you can by documenting and writing obvious code, because it will hold you back more than help.

\- Don't write useless, giant comments.

\- Don't write heaps of uncommented code.

\- Literate programming can be awesome for tricky/complicated desired code behavior.

\- Don't reinvent the wheel if you don't have to.

\- Premature optimization is a faux pas.

\- Small changes.

\- The only good code is small pieces of low complexity, tested code; fragile, big function, "black boxes" are evil.

\- Use mostly standard conventions.

\- Have fun, break things and put them back together again :)

</comment><comment><USER15> Do an internship. I found getting experience working with real cow-orkers and (hopefully) dealing with issues that affect real flesh-and-blood customers was incredibly valuable. Make sure you are paid, by the way . . .

Read a ton of code. You're going to be spending your entire career doing this, so you might as well get started.

My personal prejudice is to understand what's going on _at all levels_ of a computer, from the silicon all the way to user experience. You don't need to know the gory details of transistor physics, but knowing _in general_ what's happening at the major levels of things will be an invaluable.

<comment><USER3> Regarding internships - they can be very difficult to get. When I was in school, I was at a top school, so everyone was a top student. I was probably average for my school, which meant I could never get an internship because there were always 20 people better than me for any position and everyone applied. Instead, I spent summers working on the University's network which gave me a lot of real-world experience. Unfortunately, most employers didn't find it worthwhile (despite the fact that our network was significantly larger and more heterogenous than theirs), so while it didn't look great on a resume, it actually helped enormously in actually doing the work I eventually got. After my first job, it was easier to find places to hire me because I was "proven." But I really would have liked to have gotten an internship. Nobody was interested in me, though. I hope the OP has better luck (or skill) than me!

</comment></comment><comment><USER10> In no particular order:

\- Find out which courses at your university require lots of coding, and make sure you take those. Often these will be known as some of the hardest courses in the department (although some hard courses are more theory-focused). Those classes will be your most direct preparation for the work you'd be doing if you took a job as a software engineer.

\- Identify the smartest/most talented students who are in your classes, and look for opportunities to work with them. You don't necessarily have to be social friends, but you should aim to work on problem sets and group projects with them if possible. When you're working with them _do not_ skimp and let them do all the work - put in the best effort that you can, so that they enjoy working with you. You'll learn a lot from them, and they will be a core part of your professional network after you graduate. Later in your career when you're looking to switch jobs, your former classmates will be happy to endorse you when you apply for a role at their company (and vice versa).

\- Office hours are underutilized, and tend to be frequented by students who are asking for extra credit, deadline extensions, etc. For each of your professors, read their web page and skim some of their publications to get an idea of their research area. If the topic interests you, then come up with some questions to ask, go to office hours, and ask them. You will broaden your knowledge of CS, and you never know when something you learned this way might be useful in the future. Learning firsthand from experts in the field is a rare opportunity, and you don't even have to be graded on it. If you're particularly interested in the topic, it's normally pretty easy to get involved in research as an undergrad, since you you cost basically nothing.

\- Make sure you take Linear Algebra, because it's really useful for stats, ML, etc. and it's a pain to learn by yourself.

\- Don't forget to have fun! Get involved in 1 or 2 on-campus clubs or organizations with people that you enjoy spending time with. This doesn't have to be CS-related - any shared interest works well, whether that's outdoor activities, literature, sports, theater, photography, etc.

</comment><comment><USER16> 1\. Spend some real time and energy learning how to debug: [https://blog.regehr.org/archives/849](https://blog.regehr.org/archives/849)

2\. Learn how to decompose big problems into a set of little problems. I'm not sure where (if) they teach this in CS but that's the skill that really lets you get somewhere interesting.

3\. Find a group of friends and build something together. Most professional programming is a group activity and learning how to communicate and work with other people is super valuable.

</comment><comment><USER17> Build up formal foundations eg. complexity, runtimes, grammars, state machines and proofing (use something like coq to get used to it). Learn an imperative (c), a functional (haskell), a declarative (answer set programming or prolog) and an oop language (java). if you understand them you can easily switch between languages. do math and ignore ai because it's just simple math. Do something with parallel computing eg use MPI, OpenMP or computations on the graphic card. keep coding.

<comment><AUTHOR> Thank you for answering my question! :-D

</comment></comment><comment><USER18> Take courses across a breadth of areas in Computer Science, even if you think you don't (or won't) enjoy them much. Don't take up courses only in areas you enjoy (say, Networking) and have no concrete knowledge of areas you think you don't really like (say, Graphics) - Undergrad in my opinion is ideal for building up breadth of Computer Science knowledge. You can always focus on specific areas in grad school or when you start working.

</comment><comment><USER19> [http://paulgraham.com/college.html](http://paulgraham.com/college.html) outlines the advice of pg on the subject.

</comment><comment><USER20> Practice building things from start to finish. Figuring out how to start and keep intellectual "blinders" on to keep yourself focused and making progress is a really important skill that's hard to develop otherwise.

Go to meetups and well... meet people and potential investors / founders. If you do this you'll have a good set of potential mentors and likely not have issues finding interviews when it's time to look for an internship or job.

<comment><AUTHOR> Thanks a lot for your advice!

<comment><USER20> No worries! Feel free to PM or reach out if you're in Boston / NYC.

Another tip is to never speak negatively of anyone you've worked with as an intern to other potential employers. Once you're a professional, I'd air on the side of neutral if someone asks why you left a startup or your opinion of a specific ex-colleague.

You never know who you're talking to also knows... Been burned by that one when I thought I was just "being honest".

</comment></comment></comment><comment><USER21> One thing that helped me a lot was getting involved in competitive programming. Back then it was just the ACM contests but now there are multiple sites like Topcoder, Codekatas, Codewars, etc. Working through different levels of challenges in different languages helps push your language and algorithm knowledge. Reading other people's solutions is also a huge help.

</comment><comment><USER22> What kept me from quitting my computer science program was advice I got from a friend of mine:

> _A computer science program is like training for the Olympics only to coach > your little cousin 's softball team_

In other words - it's going to be hard, it's likely going to over prepare you for the real world, but if you make it, you'll be fine.

</comment><comment><USER23> You must learn how to learn. You need to be able to teach yourself new things. Professors will only be around for a brief moment, and in the real world you'll need to be able to teach yourself new things from the internet and books. So whatever it is you decide to learn, try and teach it to yourself using available materials.

</comment><comment><USER24> General workplace advice: Know how much you want to work. Don't get exploited into doing extra work. Do your best not to take work home. Your boss it typically useful, but ultimately he's not your friend. Keep your dignity and try to have a life outside of work.

Other than that, know what interests you and what doesn't interest you. Don't be afraid to reevaluate your interests over time. Don't be afraid to ask questions. If you think you're correct, be confident and say it.

Some people will say a breadth of skills is important and they are. But don't seek undue skills just because people say they're important. Do what interests you and you'll find a way to make it work out. Though in general, having a base of knowledge in complexity, algo, and data structures will help you find a job quicker. Every computer science program will teach this though.

</comment><comment><USER25> Writing is a highly underrated skill. Start practicing how to write effectively, to be succinct and precise.

Reading helps in more ways than you might imagine - voraciously read.

Build many things. They don't need to be large, they don't need to be fancy.

</comment><comment><USER26> Make sure you understand big-O properly. Focus hard on algos and data structures. Keep looking for areas of specialization, eg Networking, AI, compilers, formal grammars, etc. Don't forget to work on the math. Keep coding.

<comment><AUTHOR> Thanks for your advice! Should I learn Data Structures and Algorithms outside of the course ( it is offered in the second semester ) or wait for it to be taught? A lot of students in fact do the first ( competitive programming ) but I personally don't like it.

</comment></comment><comment><USER27> Pursue what truly interests you, not the hot trends of the day, which will be gone in a year or two.

Fundamentals. Algorithms, efficiency.

Related maths that interest you and intersect with CS. Topology, graph theory, set calculus.

</comment><comment><USER28> Take as many math and/or statistics classes now up to as high a level as you can while still learning effectively.

</comment><comment><USER29> Learn C and some asm, so you know how the computer really works. There will always be jobs for people who know that. Jobs in the higher levels shift a lot (go find someone today who still gets paid to write visual basic)

</comment><comment><USER30> Do not incur more than $7,540 in debt. This is half a minimum wage job so even if you can't get employment and have to live with your parents, you can pay it off in max 6 months with just a min wage job.

</comment><comment><USER31> Learn a lot now about the societal context in which you will practice, decide how you want to fit into the world, and pursue that.

</comment><comment><USER32> Practice writing, speaking, and presenting. Communication with other people is key to working on projects and teams.

</comment><comment><USER33> Find a company that's going to grow.

This single factor can dramatically affect your career growth.

</comment><comment><USER34> Get the fuck out of coding. Get an MBA and if you must remain in tech rather than doing productive work: become a product manager. Preferably not in the US.

Being a coder means being a commodity; you're competing with people in countries where the GDP per capita is less than $2k. Unless you can quote chapter and verse from Knuth, and since you're mentioning Javascript, you probably can't, you're human chum to be exploited by oligarchs. Find something better to do, even if it's bullshit.

<comment><USER15> This is terrible advice.

<comment><USER34> No, it's absolutely realistic advice. It's a shitty profession unless you're insanely great at a speciality. Telling kids some nonsense about study X, Y Z is bad advice and cruelty to animals.

We really don't need to breed a new generation of code monkey slaves. You're better off studying watchmaking or leather working if you want a craftsman like profession involving science and engineering. Otherwise: be the boss.

<comment><USER35> You're seriously delusional. I've had largely great experiences as a developer and its largely a passion for me still. Sorry it wasnt a free meal ticket for you.

<comment><USER35> Oh and by and large I'm a generalist.

<comment><USER34> I did fine; mostly at prediction. Anyone who can't see the writing on the wall is fooling themselves, and telling young people otherwise (aka just study X as a generic javascript dude who studied in collitch) is a terrible, terrible thing.

Schools who sell sugar plum fairies should stake their students success. Are you willing to give this kid advice that you're on the financial hook for for the next 40 years?

<comment><USER15> I think there's a recipe for becoming one of the dreaded "code monkeys":

\- "Hey, I could make a bunch of easy money writing code!" So, off to school for a degree, not bothering to learn anything other than VM-based languages and web development.

\- Get a job and never crack open a book (or read a paper) on software again.

\- Only learn new stuff as it pertains to your immediate work.

I see this _time after time_ in the resumes that I encounter. I think the half-life of a software career that follows this pattern is about 15 years and that's probably being generous. These people will spend most of their time either being taught the ropes as an industry newcomer (which is fine) or being told what to do by others (because they didn't keep their skills up). Their agency never really develops because their skills stagnate relative to the people who _do_ get with a program.

I don't mean that someone should work all day then go home and commit like crazy on personal projects, that's also terrible advice. But it's not hard. For instance, if they spend an hour a week reading a conference paper then that's 50 papers a year and they're probably learning new things (or are at least aware of what they don't know); spread the subject matter around and after a few years of this they'll be in conversations like "Hmmm, this feature we want looks a lot like that consensus thingy I read about a few months ago, and they solved it by..."

"Wow, how'd you know about all that stuff?"

Reading a couple papers, maybe an hour or two a week, why?

The G-G-GP is terrible advice because someone who is even a little motivated and who exercises above-average career upkeep can do really, really well and have a long tenure writing software. People will want to work with them, even. Managers will ask their advice on a regular basis! Advising people who are technically inclined that getting an MBA is unconditionally better is just, well, _wrong_. I could be more forceful.

tl;dr; if you treat your software career like an actual career (and not some kind of easy con on the world that will continue to pay off for decades) then you'll probably get good results.</comment></comment></comment></comment></comment></comment></comment>


The Lisp Interpreter - <AUTHOR> http://books.google.com/books?id=68j6lEJjMQwC&lpg=PP1&pg=PA70#v=onepage&q&f=false

<comment><USER2> The entire book is posted here by permission of MIT Press: [http://www.softwarepreservation.org/projects/LISP/lisp15_fam...](http://www.softwarepreservation.org/projects/LISP/lisp15_family#Lisp_15_Programmers_Manual_)</comment>


Capacitance Electronic Disc - <AUTHOR> https://en.wikipedia.org/wiki/Capacitance_Electronic_Disc <comment><USER2> They probably would have gotten better sales had they marketed the product for audiophiles as a HD audio medium.

<comment><USER3> Being contact / stylus media they kinda skipped. My dad had a friend with one and it was interesting to hear about. Stylii (styluses?) were expensive and the disks very rapidly wore out so it would be a tough sell.

Its interesting that to the best of my knowledge nobody commercially tried digital encoding on a contact/tonearm media, at least on a serious scale. That might have been interesting.

Its amazing how "kid friendly" VHS tapes are compared to nearly anything else. Not too small, tough plastic, touch almost anything and nothing happens, an excellent UI.

<comment><USER4> > Its amazing how "kid friendly" VHS tapes are compared to nearly anything > else. Not too small, tough plastic, touch almost anything and nothing > happens, an excellent UI.

You've never fished toast or coins or keys or pens or raisins or breadsticks out of the machine? That slot was large and inviting.

</comment></comment></comment><comment> m-i-l A short discussion about these on HN a month or so ago:

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

<comment><USER5> FYI HN recently added a "past" link that takes you to previous discussions.

<comment><USER6> That's a nice idea, but it doesn't say until you click whether there are any previous discussions. Better to have someone point out the uncommon case where there's something interesting.

</comment></comment></comment><comment><USER7> Someone has been watching Applied Science.</comment>


Student accused of being a terrorist for reading book on terrorism - <AUTHOR> http://www.theguardian.com/education/2015/sep/24/student-accused-being-terrorist-reading-book-terrorism <comment><USER2> I wonder how they would handle a Muslim physics student doing what in the 1970s was a perfectly ordinary exercise, that is, calculating the minimum quantity of U235 necessary for a self sustaining chain reaction? What would happen if he had to write an essay on how to optimize the yield of such a reaction (add tampers, boosting). All such things are relevant to the understanding of the peaceful uses of nuclear energy.

<comment><USER3> Makes you wonder who the real terrorists are.</comment></comment>


Ex-Myspace Exec to Launch Facebook Alternative - <AUTHOR> http://allthingsd.com/20110526/ex-myspace-exec-to-launch-facebook-alternative-with-funding-from-dfj/

<comment><USER2> Keep feeding the "social bubble". And still noone invests on free education... [http://www.youtube.com/watch?v=DtpeSpkK_JI&feature=playe...](http://www.youtube.com/watch?v=DtpeSpkK_JI&feature=player_detailpage#t=1165s)</comment>


SAGE: A Test to Detect Signs of Alzheimer's and Dementia - <AUTHOR> https://wexnermedical.osu.edu/brain-spine-neuro/memory-disorders/sage <comment><AUTHOR> From: [https://www.alzheimers.net/1-28-15-SAGE-alzheimers- examinati...](https://www.alzheimers.net/1-28-15-SAGE-alzheimers-examination/)

The latest study concerning SAGE evaluated[1] its effectiveness as a cognitive screening assessment tool in community settings. Researchers evaluated over 1,000 participants over the age of 50 from 45 community events. The scores on the test range from 22 — indicating normal cognition — to 15 — signifying mild cognitive impairment — and a score below 14 may indicate the presence of dementia. The study found that when the test was given to its participants from over 45 different events:

\- The average score for SAGE was 17.8%

\- 71.6% of the people that took the test had normal cognition

\- 10.4% had mild cognitive impairment

\- 18% had dementia

[1] [https://www.alzheimers.net/1-7-15-non-invasive-method- detect...](https://www.alzheimers.net/1-7-15-non-invasive-method-detect- alzheimers)

</comment><comment><USER2> Sadly US centered test.

We dont even know whats a nickel or a quarter...

<comment><USER3> Why don't they learn to use standardized measurement units...

</comment></comment><comment><USER4> One of the tests: [https://wexnermedical.osu.edu/-/media/files/wexnermedical/pa...](https://wexnermedical.osu.edu/-/media/files/wexnermedical/patient- care/healthcare-services/brain-spine-neuro/memory-disorders/sage/forms/sage- form-1-us.pdf?la=en)

</comment><comment><USER5> I've taken the SAGE test on several occasions, but I remember it having a section where you have to memorize 4 words early in the test and then recall them later. There was also a section where you had to name as many objects of a class that started with a particular letter as possible in a limited time (as many animals that start with the letter S as possible in 30 seconds). These two sections were the hardest by far, and seem to be removed from this version. Why is that? This version of SAGE is so easy, it seems that you would have to suffer from severe dementia to score anything less than perfect.

<comment><USER6> There is "I have finished/done" phrase mentioned in the middle of the test to answer later "Have you finished?"/"Are you done?" question at the end of the test (though it seems easier than memorizing 4 words compared to 3 words that form a meaningful phrase that is the answer to the immediate suggestive question).

There is a question on naming 12 different things in a kitchen/countries (also easier -- no time limit, no constraint on the first letter).

"The test has a sensitivity of 79 percent and a false positive rate of 5 percent in detecting cognitive impairment from normal subjects." btw, you don't need the perfect score to be considered "normal" by the test.

</comment></comment><comment><USER7> I'd like to see a harder version of this test (designed to detect milder impairments), and I'd like the test to be auto-generated so I can run the same test on myself for example once per month so I can draw a graph of any decline in performance.

An online version could also hide information and ask you to recall it, or time how long tasks take.

</comment><comment><USER8> How accurate is this test? The .edu address lends credibility but that's all I have to go on. What do the results mean, specifically?

<comment><AUTHOR> Researchers at Ohio State evaluated study participants using SAGE and then evaluated the same subjects with other established assessment tools. The test has a sensitivity of 79 percent and a false positive rate of 5 percent in detecting cognitive impairment from normal subjects. Results were published in the January-March 2010 issue of Alzheimer's Disease & Associated Disorders: [http://www.ncbi.nlm.nih.gov/pubmed/20220323](http://www.ncbi.nlm.nih.gov/pubmed/20220323)

</comment></comment><comment><USER9> What's the difference between this and standard MMSE?

</comment><comment><USER3> Why there isn't an on-line version?

<comment><USER10> Some of the questions necessarily involve a pen and paper. eg "copy this picture" and link the circled characters.</comment></comment>


Act legalises personal cannabis use, becoming first Australian jurisdiction to - <AUTHOR> https://www.abc.net.au/news/2019-09-25/act-first-jurisdiction-to-legalise-personal-cannabis-use/11530104 <comment><USER2> Title is incorrect: it should say 'ACT' (Australian Capital Territory), not 'Act'.

</comment><comment><USER3> >Cultivating cannabis through a Canberra winter will not be easy though, as any Canberra gardener can attest.

Sounds like growing cannabis is popular in Canberra.</comment>


Ask HN: Is Sublime Text dead? - <AUTHOR> The latest beta (3) build dates from 2013. The latest stable is almost one year old. Several features are missing, mainly a proper go to definition mechanism. Is the project dead? <comment><USER2> This was posted in the ST forum on Mar. 18, 2014 [1]:

"From the Sublime office: We are not selling to Github, we are not stopping development of Sublime. As noted by another poster, this is effectively a one man band (I'm here to answer sales questions, process your refunds and get the mail so Jon doesn't have to). The past few months of silence on the development front have been a combination of boring back end work (taxes, new payment platform) as well as a break for the man driving this whole operation. No, we don't currently have a loud internet presence, which is can be an understandable cause for concern-something we intend to address once we move into the production version of 3. There is a vision for continued growth and development, there is momentum behind Sublime Text; it is not dead, just slow.

I'm happy to field any specific questions you might have about the Sublime's future: firstname.lastname@example.com."

[1] [https://www.sublimetext.com/forum/viewtopic.php?f=2&t=15477&...](https://www.sublimetext.com/forum/viewtopic.php?f=2&t=15477&start=50#p58951)

<comment><USER3> I know this feeling. One-man bands are especially prone to "Valve time." On 4chan, "soon" basically means "anywhere between an hour from now and never."

<comment><USER4> It can also be a problem with micro-managing and fear of delegation. Speaking more from personal experience than to this project. As a one man outfit it can be difficult to let go of something you're so attached to.

<comment><USER2> I hear you, but Jon should take heed from his predecessor, Textmate.

Textmate was a prime example of what happens when an incredibly popular project is run by a single individual. The fact that TM 2 has flourished (IMO) since being open-sourced, is a good indication that additional eyes are a good thing.

I'm not suggesting that Jon open-sources ST, just saying that reaching out for help is not a bad thing in these one-man-band projects.

<comment><USER5> I've open sourced [http://github.com/EGreg/Q](http://github.com/EGreg/Q)

Docs: [http://platform.qbix.com](http://platform.qbix.com)

So far my company are still the only ones working on it

<comment><USER6> May I suggest adding a link to the [http://platform.qbix.com](http://platform.qbix.com) in your README.md

<comment><USER5> Yep - we haven't completed it yet so even though the platform is already opensourced under GPL and we are committing to it bazaar-style and not cathedral-style, it's not yet been properly marketed.

I just wanted to illustrate how just opensourcing things isn't enough. You need marketing, PR or organic notoriety. And often that takes resources. Once, I met Eben Moglen and he yelled at me for half an hour simply for taking investors for my company. I explained to him that "free software" doesn't solve the economics for entrepreneurs who start new projects. You still need to use resources. Later when I sent him the link to github he said he was wrong but stopped short of an apology. Quite a strange guy.

</comment></comment></comment></comment></comment></comment></comment><comment><USER7> I don't understand what people are doing that they need editors to have rapid development cycles.

Hell, the only reason I tend to drop editors (which happens rarely) is exactly because there's so much development that it has become bloated with bells and whistles I don't need.

It's an editor, not a fashion item.

<comment><USER8> Because there is still lots of room for improvement. I'm still waiting for the ability to set a bookmark on a line by clicking on a line number. The key bindings for booksmarks are a bit awkward, I don't always want to remember key bindings, and using the menus take too much time.

</comment></comment><comment><USER9> Weird how a product that's used by thousands of developers all around the world every day is still basically a one-man-show.

<comment><USER10> I can't imagine that the product hasn't made enough money that it wouldn't be viable to hire a developer, or to take on investment to expand the operation. ST seems to be the most popular code text editor amongst developers.

<comment><USER11> Textmate had that mind share for a while. That one man shop pretty much stoppped. I see no reason why Sublime won't go that way if other developers (somehow) aren't brought in.

<comment><USER12> Developers do get tired and burn out.

</comment></comment></comment></comment><comment><USER8> I hope Sublime Text isn't going the way of Textmate: after making lots of profits during a short period of hype, the product enters a period of complacency.

<comment><USER13> I've been using TextMate 2 "alpha" for a while now. It's pretty usable.

<comment><USER14> I would go as far as to say it's VERY usable. I and many of my colleagues use it every single day. I can't recall it ever crashing on me.

</comment></comment></comment><comment><USER15> I cannot say anything about the status, but saying "a proper go to defintion mechanism" is missing, is misleading. First, ST3 has a Go To definition feature, and second ST has always been a Text Editor first, IDE second. I am more frustrated that long standing bugs and inconistencies do not get fixed.

</comment><comment><USER16> There were 3 years between vim 7.3 and 7.4 releases, but nobody has ever thought vim was dead.

<comment><USER17> And 1314 patch versions between 7.3.0 and 7.4.0. Not a good comparison.

Edit: Downvotes for factual information on HN?

</comment></comment><comment><USER18> I guess that people begin to talk about the dead of sublime text with the launch of github Atom. Since there are basically the same features and with a beautiful interface to manage the extensions, everyone started to look back to ST and ask: "Ok, what's your move now?".

I have almost nothing to complaint about ST, I've been using the version 3 regularly for a few months. Off course, I want new features (and a few bugfixes, damn you single quotes bug), but I'm pretty happy.

<comment><USER19> Until Atom does something for other than Mac, it's just an experiment and not a real tool.

<comment><USER20> I've been a Windows user for about two decades, and I've never heard anyone complain about software being Windows-exclusive — it was just the norm. But now that the Mac's become a little more popular, I see lots of tech-savvy people suddenly getting offended whenever a cool new piece of software comes out for OSX first. It's really annoying.

<comment><USER21> Linux people complain about Windows all the time.

<comment><USER22> Linux people complain all the time.

<comment><USER23> People complain all the time.

</comment></comment></comment></comment></comment></comment><comment><USER24> Atom really annoyed me to be honest, I wouldn't have bothered requesting a beta invite if I knew it was Mac only at the moment.

Furthermore, why is Windows and Linux only an afterthought here? That suggests to me that further down the road, new updates and bug fixes will be released for the Mac version, with the Windows and Linux versions left to suffer.

I'll stick with Sublime and VIM for the foreseeable, thanks.

<comment><USER25> It was done because using WebKit on Mac is ten times easier then Windows/Linux. It makes for a faster/easier mvp.

While Windows/Linux are also fairly easy to implement using CEF, they didn't do that. And instead opted for using the Mac built in WebKit libraries.

</comment></comment><comment><USER26> It isn't as pretty as Sublime Text but I am a long time (~15 years I think now) user of UltraEdit. I have never used the Linux or OS X versions just Windows but it is a pretty solid editor with loads of features and very, very fast. Kind of pricy these days though, I bought it a long time ago with a lifetime upgrade license and it has been well worth the money IMHO.

<comment><USER27> I always like UltraEdit and paid the premium for many years. Two things happened though (1) it competed by getting bloated rather than better -- honestly the 2000/1 version may have been favorite. and (2) The world (or my subsection of it) coalesced around ST -- well, other than the VIMs and EMACS faithful.

So I adapted, and I really do like ST. Got the features I want, and a clean interface.

<comment><USER26> Yeah I know what you mean about the bloat added in the 00s that was crap. They did seem to listen a lot to their users though as things got better. It isn't as quick to load as Sublime Text 3 (which is lightening fast!) but it can open big (like several hundred MB or more) files in and instant whereas Sublime Text is a lot slower.

My biggest gripe with UltraEdit is that it basically has zero ways to extend it. It has no plugin system and their macro system is horrible. This is where Sublime Text is really great.

</comment></comment></comment><comment><USER28> Sure, it'd be great if the author open sourced it if he's no longer interested in doing it, but whatever. My license is still valid, and it still does everything I paid for it to do. If someone wants to take up the charge and make a better version, it looks like there's a market for that.

</comment><comment><USER29> No, it isn't. Move on.

How do this kind of threads get to 1st page at HN?!

</comment><comment><USER30> There seems to be a bit of a discussion on the forum:

[http://www.sublimetext.com/forum/viewtopic.php?f=2&t=15775](http://www.sublimetext.com/forum/viewtopic.php?f=2&t=15775)

</comment><comment><USER31> Shame its not opensource then people could contribute more than just plugins!

</comment><comment><USER32> I hope it's not dead. I just moved a few months ago from Eclipse to Sublime Text for Go and Javascript programming. I'm loving not having a slow IDE to deal with.

<comment><USER33> You should give Komodo edit a try. For go you can use this plugin [https://github.com/trentm/komodo-go](https://github.com/trentm/komodo-go) and it already has JavaScript support.

<comment><USER34> I tried and tried to like Komodo but it feels laggy

</comment></comment></comment><comment><USER35> If it dies, at least there's Atom now. I just bought my Sublime Text 2 license, though, and I'm happy to stay with it because it gives me all I need.

</comment><comment><USER36> A while ago Sublime Text 2 announced that the current version was now outdated, fair enough. However it didn't let me use the program any more, suggesting I go and update.

Roughing it with Notepad++ now.

<comment><USER2> Is Notepad++ that bad? I used it heavily in my Windows days and loved it at the time. There were features in it that I loved that I have yet to see other editors tackle natively (the diff view was awesome).

<comment><USER36> No, I like it, sorry first time use of the phrase "to rough it" :)

Sublime though looked and felt really super polished, something to fall in love with. I guess I put that comment out to see if I was mistaken, and it could move back in...

</comment></comment></comment><comment><USER37> Still works for me

</comment><comment><USER38> Now I know about it at all... Thanks. :)

</comment><comment><USER39> Dead Sexy.

</comment><comment><USER40> He's getting ready for a Sublime Text 4 alpha release. It's supposed to ship any day now.</comment>


How one game developer is making The Pirate Bay work for him - <AUTHOR> http://www.arstechnica.com/gaming/2012/09/how-one-game-developer-is-making-the-pirate-bay-work-for-him/

<comment><USER2> This only works in a few specific cases that can get the massive numbers to donate (it's really just a numbers game).

In most cases, your game will be pirated and you won't make that much money. If you actually were able to sell something, you might be able to make enough to survive, which is a win-win for everyone.

If you truly want to battle piracy, make games that allow you to purchase in- game additions to help you along in the game. Fruit Ninja and Farmville both do this.

Donations have historically been a bad way to run a business. I'm not sure why people keep making the same mistakes in thinking that it's a good business model.</comment>


The Global Consciousness Project  Meaningful Correlations in Random Data - <AUTHOR> http://noosphere.princeton.edu/index.html

<comment><USER2> My initial thought is that the RNGs are connected over the internet, and not a separate closed network. The information from these RNGs are collected at a central location (Princeton?). If this is true, then couldn't a world-news worthy event cause a flood of information across the internet, which could have slight effects on the observed behavior of the RNGs? The time stamp for each observation may not be accurate. Or, even more extreme, the flood of news could effect the observation itself (i.e. floating point errors). I guess what I am trying to get at is the theory of relatively plays a role in the gathering of information from different nodes. The cascade of new information from a huge news story could cause a sort of "gravitational" lens through which the RNGs are seen. Thoughts? Am I crazy?</comment>


Bill Gates: 'Souring' on Microsoft? - <AUTHOR> http://theweek.com/article/index/212033/bill-gates-souring-on-microsoft <comment><USER2> Bill Gates has been selling millions of MSFT shares each year for years. You cannot look at his most recent sale as evidence of anything other than he is continuing to do what he has been doing all along.

</comment><comment><USER3> The entire article is just a bunch of suppositions, no evidence to sustain any of them.</comment>


Frontend Masters: New Responsive Web Design Course by Ben Callahan - <AUTHOR> http://frontendmasters.com/courses/responsive-web-design/retrofitting-twitter/

<comment><USER2> Aparajayah is an Professional Web Design Company offering top quality & Eye catchy Website Design Services as per client needs.

<http://www.aparajayah.com/web_design></comment>


PirateBrowser - No more censorship - <AUTHOR> http://piratebrowser.com/

<comment><USER2> It's not a browser. It's a pre-configured Firefox with Tor and proxy manager.

<comment><USER3> >It's not a browser

>It's Firefox

So Firefox is not a browser?

<comment><USER2> Firfefox is a browser. PirateBrowser is not.</comment></comment></comment>


Jared Kushner dared to dream, and so should you - <AUTHOR> https://www.washingtonpost.com/blogs/compost/wp/2017/01/10/jared-kushner-dared-to-dream-and-so-should-you/?hpid=hp_no-name_opinion-card-c%3Ahomepage%2Fstory <comment><USER2> The mixture of sarcasm and dead seriousness of this essay is perfect. Also, this whole thing is bonkers. It makes Trump's presidency look like that of a strong man dictator from a third-world country. Cronyism everywhere.</comment>


Kickstarter's Biggest Success Ever: Nano Wristbands Raise $1M - <AUTHOR> http://www.fastcodesign.com/1663858/kickstarters-biggest-success-ever-nano-wristbands-raise-1m-jump-to-apple-store <comment><USER2> Great. So now Apple officially sells it!

I love kickstarter.com and this project. I personally have no interest in getting this product but it just shows what a bright future might be there for designers.

</comment><comment><USER3> The biggest takeaway was that it helped to sell more nanos. That was probably the main reason Apple decided to add it to their store.</comment>


React-control-center give you cool coding experience in Counter - <AUTHOR> https://stackblitz.com/edit/funny-counter <comment><AUTHOR> do you love this kind of counter? [https://stackblitz.com/edit/funny- counter](https://stackblitz.com/edit/funny-counter)

</comment><comment><AUTHOR> more easy and power than redux、mobx,just have a try...</comment>


Ask HN: I am a successful entrepreneur, does anybody have a cool project? - <AUTHOR>

Hi HN:  So after college I moved to Argentina cause it sounded fun.  Subsequently, I opened a burrito shop, the first of its kind.  The people loved it so we opened more...and over the next 5 years it grew from a one store business to 14 stores in 5 latin american countries.
My partner (biz partner and college buddy who started it w/ me) and I sold majority shares in the business about a year ago.
We traveled for a bit, moved back to the US, got married and are adjusting.
I am looking for a cool project, people to meet to start something, or a job at a startup.
read more about me here. http://about.me/jordanmetzner
Help me out HN.... <comment><USER2> Take location-based tasking (Gigwalk etc.), make a professional version, figure out how to move hi-res images and hi-def video most efficiently between users and then smash it into Wikileaks by making users and payments anonymous. This would be a great tool for professional information gatherers.

</comment><comment><USER3> I have a project that was started last year. We tried for YC but didn't make it. My team got burned out and now it's stopped. Our mission was to make mobile advertising more effective and connect the advertisers with the audiences. The advertisers can target their campaign at specific demographic audience. The ads are full screen and there's a mechanism for the advertisers to "interact" with the audience. Also, we bring mobile advertising to SMB that do not have the skill or resource to get into the mobile space. I'd be happy to go into more detail if you are interested.

<comment><AUTHOR> Hi dnguyen... email me at jordanmetzner at gmail

</comment></comment><comment><USER4> Are you looking for a paid job? or you want to join another startup as a partner? or are you looking to invest?

For paid jobs and joining other start ups twitter is actually pretty handy. Follow some companies, people you like and they are always tweeting/retweeting opportunities. Make sure to also follow incubators they are always retweeting about jobs for their companies.

<comment><AUTHOR> thanks solo.... looking something paid or a partner at a startup as well.... just a good opportunity to work hard and build cool things.

</comment></comment><comment><USER5> Let's go back to South America and start more brick and mortar businesses?

<comment><AUTHOR> who is we? what r ur thoughts....email me</comment></comment>


HTML5 Security Cheatsheet: What your browser does when you look away... - <AUTHOR> http://html5sec.org/

<comment><USER3> I don't get it. This page basically shows all available event handlers and other attributes for HTML elements and says "you can put JavaScript here". Well, thanks.

Letting your users write HTML/CSS (or not escaping input) is a bad idea to begin with.

<comment><USER4> Sometimes you have to allow some user input, like <b>, <font>, or <i> tags in those WYSIWYG editors. This is a reference for what you should remove from your whitelist or add to your blacklist.

<comment><USER5> Still, OP's right. If you need to let them use plain HTML (it's better to use markdown or something similar) just parse it and remove any attributes and tags not on your whitelist.

<comment><USER6> Or make them use Markdown, org-mode syntax, BBCode or s-expressions ({b text in bold {i and italics}}). User formatting should never go directly to the browser, without being reinterpreted by the website.

</comment></comment></comment></comment><comment><USER7> Some of these are ingenius. Placing an input box far down a page, setting it to autofocus, and then reacting to body onscroll? I'd never have thought of that. Glad these references exist!

I have exploited the embedding of Flash to do XSS before. It's funny that while the site I was on heavily filtered any JS input in its rich text editor, you could easily upload a Flash file (served from the SAME domain!), and XSS it.

<comment><USER8> _> Some of these are ingenius. Placing an input box far down a page, setting it to autofocus, and then reacting to body onscroll?_

Although this sounds quite clever, I don't see the value in this. If your HTML whitelist contains "on..." attributes such as "onscroll", you have deeper issues than this clever trick. Almost certainly you are vulnerable to stuff like "onclick", too.

Except if you use blacklists where you added "onclick" and forgot to add "onscroll". But in that case, if you are using blacklists instead of whitelists, you are almost certainly doomed anyway. (see <https://news.ycombinator.com/item?id=4794745>)

</comment></comment><comment><USER9> I'm not sure what this is saying. If it's talking about things the browser can be made to do my response is "so? that's intentional".

If it's about things that can happen if you embed user (read: attacker) provided content in your page then you have already lost. There's never a time that you can safely embed content from an untrusted source in your page - <USER2> blacklist or whitelist based approach to content is going to be safe. The correct approach to user provided content is to parse the content, drop anything you don't understand or recognize exactly. Then escape all of the left over content, and reconstruct at the end.

You could use markdown to do this for you, or you could do it manually if you want you own rules (and/or <>-like syntax).

Filtering content is just not sound and every time I see something that seems to imply that it is, it makes me cry.

(A example of this taken to its extreme is WebGL shader parsing. A correct + "safe" implementation of WebGL must at the very least: 1\. parse the shader itself, dropping all comments, etc 2\. perform strict semantic analysis on the result of <1> (especially as many GL drivers don't) 3\. take the result of <2> and turn that back into text 4\. throw the result of <3> at the gl engine

This is necessary to ensure that not only is the shader correct (in the terms of webgl), but also to ensure that no parsing oddities can get through (e.g. something seen as a comment terminator in the driver but not the validator - bugs like this have happened with multiple validators in multiple contexts over the last few decades)

</comment><comment><USER10> This page could be much better with just a little bit more prose.

</comment><comment><USER11> Quite a list. Kinda makes me feel bad for all the people writing HTML sanitizers :(

<comment><USER12> It's really not that difficult if you use a parser + whitelist. You don't have to care about this sort of thing if you limit people to using certain tags/attributes in WYSIWYG editors and other inputs.</comment></comment>


How we raised capital one month after launching - <AUTHOR> http://8fit.com/story/seed-funding/

<comment><USER2> They say each app install costs 30c, 10% of installs are active users, and in June 13% of active users were paying members - so the total customer acquisition cost was $23 for each customer paying $4/mo. They expect the percentage of paying people will double in the coming months, although no indication of why that would be the case or what the expected attrition rates are (fitness clientele is notoriously flaky). Unfortunately I couldn't find any Twitter chatter about 8fit so it's hard to gauge the sentiment of the initial 10k users.

Look like a smart investment into a strong founding team, rather than the product itself at this stage (not suggesting that the product cannot stand on it's own merit - only that the "team" slide was the most impressive part to me).

<comment><USER3> Exactly. How do you raise a funding round after 1 month? Easy - just launch a successfully funded start-up first.

<comment><USER4> I'm not mad at them or anything but it is probably the #1 reason for them successfully raising money at this stage. Seems misleading not to have that front and center.

<comment><USER5> Did the article mention if the investors were the same as earlier projects or not? Not that it really matters, the fact that they successfully built a 50m startup is likely enough to get 200k from a lot of people.

</comment></comment></comment></comment><comment><USER6> Taking a look at your app, it seems a little disingenuous to tell people they can see the same results without a gym membership. Maybe a complete beginner will see the same results for a few weeks, but after that there's no way.

Also, fitness advice I can trust and nutrition plans that work? Why should I trust you guys over anyone who has an actual background in exercise physiology or nutrition? Do you have any evidence that your nutrition plans are better than premade ones online? I'm blown away that people give Soylent so much crap, but they're following the same principles as apps like this (an "if it fits your macros" approach) but do it with consistency and accuracy that a meal plan could never achieve.

It looks like you're off to a strong start, and I wish you the best of luck, but the app so far looks like it's strongly overselling/under-delivering which can be pretty offputting.

<comment><USER7> 8fit is currently erroring out for me, but you don't need a gym to get where you want to get.

Not all non-gym bodyweight routines will work, but there are a few that use progressive overload and changing leverages to keep things "hard". This is what builds muscle, and if you're doing it regularly and eating well, you can shed fat (either through bulk/cut cycles or at the same time, albeit more slowly). For instance, see the beginner routine on Fitloop: [https://fitloop.co/routines/bwf-beginner- routine](https://fitloop.co/routines/bwf-beginner-routine)

(I should probably mention that I'm assuming a lot here: specifically, this applies if you're looking to replicate a weightlifting-centric routine.)

</comment></comment><comment><USER8> So, to get a little but off the whole deck/fundraising thing - but how do you compare yourselves to say, Fitocracy. I just started using Fitocracy, and am really enjoying it so far. As much as I hate the word, the "gamification" elements are truly effective - definitely push me to want to workout more and climb up that point ladder.

Other than that - the app looks solid, and nice n simple. My only feedback is the tagline "for people who hate fitness". I am not a massive fan of fitness (hence why I am interested in these apps), but want to become someone that DOESN'T hate fitness - isn't that the entire goal of your company?

Congrats on raising the round and a great execution so far though :)

<comment><AUTHOR> Fitocracy's great as well! But they're more centered in tracking and gamifying.

We take a different "just tell me what to do" approach. Users sign up, enter their stats and choose a goal: strength, weight loss, etc. With that, we generate workouts and plans to help them get there.

We also offer meal plans and personal coaching, because the human aspect matters a lot. That's why I believe most "fitness tracking" startups will fail... people are looking for a plan, not for a pretty dashboard.

</comment></comment><comment><USER9> I'm about to head down the survey route to help validate an idea. Did you target the respondents? Did you use a paid survey service?

<comment><AUTHOR> We simple used Google Docs and pretended the product existed. Here's the original survey:

[https://docs.google.com/forms/d/18Se8QtvIKrGPWd8HEN4ILZz3Yyp...](https://docs.google.com/forms/d/18Se8QtvIKrGPWd8HEN4ILZz3YypiTfGv_4N8oT5pr6k/viewform)

<comment><USER10> How did you get people to complete this survey? Google, Facebook Ads?

<comment><AUTHOR> I posted ads on craiglist advertising free coaching

</comment></comment></comment></comment><comment><USER11> Inspiring post! Thank you!

Your numbers look truly amazing, low CPI and high conversion rate to paying users.

Do you mind sharing what's your sustainability/breakeven point in terms of monthly paying users? :) I guess it is around 25000, which you should be able to reach pretty soon assuming a 50% split marketing/product for the fresh funding.

Best of luck to you.

<comment><AUTHOR> Glad you found it useful! I think it's working because the market is huge (everybody has a "fitness" problem) and it's such a simple product.

Our expenses are at $10k with a 3 people team, some freelancers and a $2k/mo marketing budget. We plan to break even in half a year, if things go right.

My goal so far has been to keep us profitable, as in +revenue and -expenses.

<comment><USER12> What do you typically spend the $2k/month marketing budget on? Is it mostly online advertising?

<comment><USER13> We're putting it on Facebook mobile ads at the moment.

</comment></comment></comment></comment><comment><USER14> What's the plan for the 200k? Are you throwing it all into marketing? Are you paying yourselves a salary?

<comment><AUTHOR> We are a three people team of founders. Two of us live cheaply while traveling, so we keep it very lean, and one of us is living off his savings.

Here's the breakdown of expenses:

\- $5.000/mo for paychecks \- $2.000/mo for marketing \- $800/mo for freelancers \- $500/mo for software and hosting \- $500/mo for operational expenses \- A 10-20% margin for things that come up

At a $10k/mo burn rate currently, and being on track to make $1k on our first month, we only plan to go as low as $100k in our bank's balance.

We are being extremely cautious and saving money for future projects, because we want to avoid raising funds in a need.

<comment><USER15> What is the cost per user for hosting?

<comment><AUTHOR> From my experience with my previous startup, we'd be able to comfortably support 50k actives without exceeding $10k a month in infrastructure.

</comment></comment></comment></comment><comment><USER5> So, I just downloaded the app, and I would love to know how you managed to get this app approved by Apple. In app subscription not using Apple's IAP? It seems to me this won't last long if you ever get a competent reviewer. Either that or I'm missing something?

</comment><comment><USER16> If PG sees your chart without y-axis label on the top of the post, you're dead man :) What is it?

<comment><AUTHOR> Haha, I left it out on purpose! It's the number of signups :)

</comment></comment><comment><USER17> Is the ios app meant to work ? I just get a white screen</comment>


OS.js – A JavaScript web desktop implementation for your browser - <AUTHOR> http://os.js.org/ <comment><USER2> Cool! This is the first time my project has appeared on hackernews.

Thanks for checking it out guys. It-s something I enjoy working on in my spare-time

</comment><comment><USER3> I've seen multiple 'operating systems in Javascript', but this one is exceptionally well made. The only thing missing is a web browser so I can load the OS in the OS (in my OS).

<comment><USER4> You should try [https://www.inevio.com](https://www.inevio.com), really fast and well made JavaScript OS

</comment></comment><comment><USER5> Very impressive. Looks like my debian desktop.

</comment><comment><USER6> Relevant xkcd: [https://xkcd.com/1508/](https://xkcd.com/1508/)</comment>


The wealthiest colleges received $7B in federal subsidies last year - <AUTHOR> https://www.forbes.com/sites/adamandrzejewski/2019/04/10/seven-troubling-facts-on-american-higher-education-you-probably-dont-know/#75bda0d63659 <comment><USER2> Most likely, those funds will be used for running propaganda against the government that issued those funds and the president!

</comment><comment><USER3> That's absolutely ridiculous. Where does that money go? Are the regents skimming? That's a lot of money.</comment>


Occupy protesters "branded" with UV ink - <AUTHOR> http://www.salon.com/2011/11/30/occupy_protesters_branded_with_uv_ink/

<comment><USER2> This is pretty bad. It's hard to tell as the protestor was unable to witness the actual act but it sounds as if was applied with a tool designed to allow the ink to permeate the skin rather than sit atop.

It's a pretty vile act to carry out on someone against their will.

</comment><comment><USER3> I'm sorry, but there really is not much substance here, IMHO. A protester was marked with UV ink after being arrested. The article is literally 4 paragraphs about it, with most of it being the protester retelling the harrowing story of being "violated" by the ink. Maybe there is a significant civil rights violation in place here. I don't know. What I do know is that I didn't get much value from clicking the link, and I doubt many others here will.

<comment><USER4> no, no substance. People are getting branded like cows but we'd rather read about the same ruby vs. python stories. That is substance!</comment></comment>


The Secrets in Guatemala's Bones - <AUTHOR> http://www.nytimes.com/2016/07/03/magazine/the-secrets-in-guatemalas-bones.html?_r=0 <comment><USER2> I visited Guatemala around '93, and it still stands out as having some of the most desperate people I'd seen on our continent. In particular, near the end of the trip a rumor started to circulate that white people were kidnapping babies and selling them on the international organ market.

Mothers who would have been shoving their children in your face to beg for money were literally cowering in doorways, hiding their children behind them. It was eye-opening.

<comment><USER3> Interesting, i've been there 3 or 4 times since 2001, and i spent 3 months there in 2008, and i don't think the quality of life was that bad; it's definitely poor. Adoption was a business and i thought they were going to stop it. Women were turning themselves into baby factories.

<comment><USER2> It probably depends on where you went, how much you went on foot, and to be fair in '93 there were still occasional pogroms of the indigenous population; a rough time.

<comment><USER3> You were there during the civil war. i backpacked around in 2008 and i spent 10 weeks learning Spanish learning Antigua.

<comment><USER2> I have to say, even in '93 Antigua (spent 2 days there) was absolutely amazing. 10 Weeks there must have been absolutely fantastic, and I bet you speak Spanish like a native with that immersion.</comment></comment></comment></comment></comment>


The App of God: Getting 100 Million Downloads is More Psychology Than Miracles - <AUTHOR> http://www.nirandfar.com/2013/07/the-app-of-god-getting-100-million-downloads-is-more-psychology-than-miracles.html

<comment><USER2> When I first decided to download a bible app, this one was the first I tried, based on its name, rating, and popularity.

I eventually replaced it though with QuickBible, which as its name implies, I found to open much faster and pulls up verses almost instantly.

I found that Bible had problems sometimes with wanting to make sure it could sign in, which I didn't see a need for.

QuickBible isn't perfect though. It doesn't have my preferred translation built in as an option (HCSB), and I haven't managed to successfully import it, despite it having a tool that's supposed to be for that purpose.

Still, best I've found so far. If one of you knows of a better one, I'd be interested. Or if you've figured out how to upload HCSB into QuickBible, that'd be great too.

</comment><comment><USER3> Note that there is something at work here that is as important as any of the gamifcation bits. The app is called "Bible" and there are literally hundreds of millions of Christians who read the bible who own a smartphone. So, it inherently is going to get downloaded.

Also, the bible throughout time is among the most purchased, owned, and read book around the world. Phones and tablets are used for reading things, so it makes total sense that when you have a well made app called "Bible" that is free, has no ads, etc. it is going to get a pretty big install base by default.

I'm not saying that the gamifcation stuff isn't working. I just know that being the most popular bible app across many platforms probably accounted for tens of millions of downloads in the first place.

<comment><USER4> Agreed: in this case "Getting 100 Million Downloads is More _About Built-in Audience_ Than Miracles"

</comment></comment><comment><USER5> God found gamification!</comment>