Ask HN: Implementing a graph database using Postgres tables for nodes and edges? - <AUTHOR> After hearing/reading about the negative experiences many people have had with upcoming graph databases, I am wary of jumping into a graph db. But almost any modern application has things that will be suited to a graph representation.
So I am considering a workaround to use a graph structure, but represent the underlying data in a reliable rdbms, in particular postgres.
The approach is: 1. Make two parent tables: node and edge.
2. Make separate tables for all "objects" (like people, places, things, etc.) which would be inherited from node, so they would all have a unique node ID.
3. Make separate tables inherited from edge which would be used to represent the many many relations. So each relation has an edge ID, and each table inherited from edge can be thought of as representing a specific kind of relation (like person lives in place, or person is friends with person).
One thing I have observed so far, is a large number of tables with few columns, but I think that lends itself to the advantage of  easy indexing. There can be a large number of individual queries from the front end, but I believe I can use views to make represent tables with more comprehensive info to reduce the number of queries.
What do you guys think of an approach like this? What am I missing, what is wrong with it? I haven't come across this previously, and so am a bit nervous about the ramifications. Is someone else also doing this? <comment><USER3> Storing the data isn't an issue. It's fairly trivial to come up with a number of very good solutions to describing a graph.

The issue is querying the data, specifically when that involves walking the graph.

The real question then, is how do you want to query the data? If you are willing to make an assumption now that adds a tight constraint on your future work... i.e. "We will only ever perform queries that are at most 1 or 2 hops from the nodes/edges being queried" then perhaps PostgreSQL will work for you.

<comment><USER4> You can do recursive graph queries with PostgreSQL: [http://www.postgresql.org/docs/9.5/static/queries- with.html](http://www.postgresql.org/docs/9.5/static/queries-with.html)

<comment><USER3> Agreed.

For shallow or narrow queries of the graph this is the way to go.

But for deep and broad queries, if you want to perform some valuable analysis that involves traversing the graph some non-trivial distance from the point of origin, that's where PostgreSQL is going to let you down and you would probably be better off picking a more appropriate tool.

Same question though: How do you want to query your graph, and are you willing to limit yourself to not querying it in a certain way?

<comment><USER5> I'm pretty sure you can get comparable performance from a graph in SQL if you make sure you have covering indexes for the Node ids and the edges/adjacency list table.

This may be implementation-dependent but in theory, it's solid. I'm not sure what else a graph database would be able to do to beat an indexed adjacency list.

</comment></comment></comment></comment><comment><USER6> The boring answer is that it depends on your data and what you need to do with it. Insights like "all data structures are graphs!" are dangerous - it can actually add vagueness that might prevent more useful understanding of your problem. Excessively generic handling of data often ends in pain when it comes to the real world (performance and complexity) compared to domain specific approaches.

If you have multi GB graphs and need to run intensive classic graph analysis algorithms then a lot of that can come optimised out of the box with a dedicated graph db. They will still leave you with plenty of hard problems.

However, if you have small graphs or only need conventional crud operations then using a new and unfamiliar graph db would probably be insane.

If your case is the latter and postgres is your comfort zone and you can get a working solution quickly, I would be tempted to prototype along the lines you suggest. When you start getting performance problems or need graph analysis, you can then make a better decision whether a graphdb or restructuring your relational db will solve it the best.

<comment><AUTHOR> Thanks, that was almost the same reasoning I used to settle on this approach.

I definitely need acid transactions, and also some graph capability - <USER2> may or may not grow in the future. More pertinently, the kind of representation I was attempting led to a very normalized design anyway, and I think it also lends itself to all but the most sophisticated of graph functionalities! But I am only just starting, so hopefully it works out well.

</comment></comment><comment><USER7> The PostgreSQL Conference 2011 :"Trees and Graphs in the database" [https://www.pgcon.org/2011/schedule/events/357.en.html](https://www.pgcon.org/2011/schedule/events/357.en.html)

* Trees in the database - Slides: [http://www.slideshare.net/quipo/trees-in-the-database-advanc...](http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures)

* Graphs in the database - Slides : [http://www.slideshare.net/quipo/rdbms-in-the-social-networks...](http://www.slideshare.net/quipo/rdbms-in-the-social-networks-age)

<comment><AUTHOR> Thanks for the links. Glad to know there are more experienced people pursuing this seriously!

</comment></comment><comment><USER8> I am a huge fan of the Tinkerpop Stack ([http://tinkerpop.incubator.apache.org](http://tinkerpop.incubator.apache.org)) -- they have written a common set of interfaces for graph databases. There is an implementation that can use Postgres as its storage engine ([https://github.com/pietermartin/sqlg](https://github.com/pietermartin/sqlg)), there is one that can use ElasticSearch, I even seen one that uses MongoDB. Check it out

<comment><AUTHOR> This made my day! Thanks, I will check it!

</comment></comment><comment><USER9> This sounds broadly sensible. It's basically a classic normalised relational design, which is as perfect as alligators or sewing needles, but with extracted supertables for nodes and edges.

I would challenge the idea that you need these supertables, though. What those allow you to do is to write graph queries which are generic (polymorphic?) over multiple kinds of node and edge. So as well as "find me all the people who are friends with my friends", you can write "find me all the people who are friends with my friends, or who have been to a place i've been, or who own a thing i own" without using a union. Do you actually need to write queries like that?

There are two downsides to the supertables. Firstly, more complexity, although it's a minor, or at least constant-factor, amount. Secondly, a loss of type safety. If your edges are defined in a supertable, then the columns which point to the ends of the edge have to be foreign keys to the node supertable. That means they can be any type of node; there's no way to constrain particular kinds of edge to connecting particular kinds of node. That seems like a considerable drawback to me.

<comment><AUTHOR> True, as I was designing the tables, I was surprised to notice how normalized it looked.

The generic kind of queries you mention: actually, yes, I think I will need them.

Your second point on downsides is something I have/had to think about, thanks for raising it. I had some vague premonitions on those lines, but you helped make it concrete. The problem can be avoided by not making meaningless connections, but that's not a real solution. It won't be a preventive, but it could help to audit relationships - by having a script list out which tables FKs originate from.

Since I started writing this post, I have had two ideas on how to address this, it'd be great to have your opinion on them - I'm thinking out loud here.

1\. Use referential integrity. Since each relationship/edge will be in its own inherited table, one could impose a constraint that each column_in_the_specific_edge_table REFERENCES another_column_in_a_specific_node_table. Like the columns in the person_lives_in_place relationship table must reference columns in the person table and the place table - each of which is also its own inherited node table.

2\. More convoluted and a bit cumbersome, but if the previous/simpler approach is insufficient, one could create data types corresponding to each node type. And impose that as a type constraint on the edge tables.

But maybe the 1st option could actually work...what do you think?

</comment></comment><comment> t-rav Why re-invent the wheel ! All you need to do is properly understand your tool of choice. I have used Neo4j extensively for years and have had great results. Our biggest hurdle was understanding how to model the data for a graph properly. Get this right and everything falls into place. The one thing you are going to need is a good visualisation tool, so be prepared to roll one of these too :)

</comment><comment><USER10> I was also wondering about the same thing:

Implementing a graph on top of a RDBMS is trivial, and if the semantics are correct (the same as the ones exposed by a graph db?), then I'm not sure why would people want to use a proper graph db.

I thought that probably it'd be an issue of performance: the "right tool for the job" that "does one thing and does it well" probably is leaner and more efficient. After all, unlike a trivial implementation, getting a graph on a RDBMS to perform well might not be that simple after all (still, your idea of inheriting tables might make things more flexible and maybe more efficient)

But then, when looking up some Neo4j benchmarks, the numbers seems to not be good at all:

[http://baach.de/Members/jhb/neo4j-performance-compared-to- my...](http://baach.de/Members/jhb/neo4j-performance-compared-to-mysql)

I'd like to hear from someone that used Neo4j (also, other graph databases are interesting) in production, and benchmarked it against a RDBMS prototype, finding the former as the better solution of the two.

<comment><USER11> While the author admits that the documentation advises to use the traversal API (which gives the best performance) he goes with cypher over the REST interface which would never match a direct db connection. It's a fundamental flaw in his comparison.

<comment><USER10> I noticed that, but he's doing a single REST query for every timing:

[https://github.com/jhb/neo4j-experiements/blob/master/query_...](https://github.com/jhb/neo4j-experiements/blob/master/query_friends_neo4j_rest.py#L24)

There's no way that a single HTTP request is responsible for a difference in hundreds of seconds

(his benchmark code isn't really sound, but I don't see how this can affect a difference so striking)

</comment></comment></comment><comment><USER12> I've done this a few times. First, see the list of PostgreSQL-based extensions and tools listed by other folks below; they're all good things to look at before you implement something from scratch. Regardless, this is probably a good approach if you are using Postgres anyway and just need a graph for part of your application.

For short graph traversals, recursive queries and joins perform surprisingly well, even when compared against dedicated graph databases -- at least, the open source ones I've been able to try, including neo4j. The ones I've tried perform better than Postgres mostly when you get more than two hops away -- but then at least Neo and the MySQL thing tend to suffer if the data set doesn't fit in memory.

I had at least one project which reverted from a dedicated graph database to Postgres specifically because it needed decent on-disk performance (2TB per shard).

Anyway, to your question: you could build a PostgreSQL database like that, but why would you? If you have distinct types of entities (person vs. furniture vs. town), why would you denormalize them into generic node interitance? Having a completely abstracted database with one big table called "things" and another big table called "relationships" seems really attractive before you actually do it. Then it starts to suck.

Relational databases are designed to perform well, and to be easy to query, with "normalized" databases in which different types of entities are represented by different tables and relationships are defined by foreign keys. The further you get away from that model, the harder the database gets to use.

This is one of the problems with using graph concepts for questions which are not, fundamentally, graphs. Yes, you can define people's nationality as a graph from location to nation, but that makes it pretty hard to do voter registration stats. Graphs are a great tool for answering many important questions, but they are not a great tool for answering _all_ questions.

Now, if you are answering an actual graphing question (i.e. show me everyone who shares something in common with me via at least two links within 3 hops), then proceed. But figure out what kinds of questions you specifically want to answer before you get too far.

<comment><AUTHOR> I noticed the same - the "explosion of tables" when I was doing the actual designing. But, almost accidentally, it also turned out that the tables were almost all either 5NF or 6NF. So I thought this is just a highly normalized setup anyway - something traditional databases are supposed to be designed for.

The list of Postgres-basd extensions mentioned in this thread turned out quite relevant actually! I'm still going through them all, seeing if I can reuse something..

Many thanks for the inputs, quite helpful.

</comment></comment><comment><USER7> some alternatives to check :

* RDFLib Store for PostgreSQL ( [https://github.com/RDFLib/rdflib-sqlalchemy](https://github.com/RDFLib/rdflib-sqlalchemy) )

* Sparqlify is a SPARQL-SQL rewriter that enables one to define RDF views on relational databases and query them with SPARQL. ( PostgreSQL supported [http://aksw.org/Projects/Sparqlify.html](http://aksw.org/Projects/Sparqlify.html) )

* PostgreSQL-Neo4j Foreign Data Wrappers [https://github.com/nuko-yokohama/neo4j_fdw](https://github.com/nuko-yokohama/neo4j_fdw)

* PgRouting (network ) [http://docs.pgrouting.org/dev/doc/src/tutorial/analytics.htm...](http://docs.pgrouting.org/dev/doc/src/tutorial/analytics.html#graph-analytics)

<comment><AUTHOR> Thank you so much for this list. I am looking into these... Maybe there's something I can reuse, but at the very least I can get some inspiration from checking them out.

</comment></comment><comment><USER13> I think you want to google "triple store" because that is effectively what you are trying to do AIUI. Triple stores are the persistence strategy of choice for RDF and other Semantic-Web-type applications.

Each row in a triple store stores a relationship between 2 objects, with unique IDs for the subject, the relationship type, and the object. The IDs could refer to other tables that store entity and relationship details.

There are specialised triple store DBMSs, but implementing one in PostgreSQL should be pretty easy.

</comment><comment><USER14> If directed acyclic is sufficient for your use case, you can use this approach, which has worked perfectly for me in the past: [http://www.codeproject.com/Articles/22824/A-Model-to- Represe...](http://www.codeproject.com/Articles/22824/A-Model-to-Represent- Directed-Acyclic-Graphs-DAG-o)

<comment><USER15> This is a really interesting approach, thanks! I have a relational-to-graph problem that can be done as a DAG, and I was planning on using Postgres as a source of truth and mirroring out the data to Neo4J just for queries, but I think I might try this instead.

</comment></comment><comment><USER16> I use Neo4J and I'm curious what negative experiences you are referring to, and what benefit this might have over that. The biggest problem I foresee is querying and possibly data integrity. Querying since doing any kind of graph traversal would probably require writing hacks in software, and data integrity for much of the same reason. It may be easy to ensure a basic relationship but beyond that I would think it would be more difficult.

<comment><USER17> I was never able to use Neo4J as a first level database on a busy website. Simple traversals were just too slow. I ended up maintaining a simple in- memory structure on a pair of machines behind a load balancer with all writes going to sql and then propagated to the graph instances. I realise this introduces issues around read-your-writes etc, but good enough for my use case.

</comment></comment><comment><USER18> I've done this a few times. Depending on the size/density of your data, it can be fine. If you have billions of entities and/or highly dense relations, it's not very efficient though.

I didn't use table inheritance, and I don't distinguish relationships at the query stage, so if that's core to your method you should think about it. I assume with that setup it'd be easier to take advantage of partial indexes though.

Recursive queries work but if the intermediate tables gets large it explodes fast. You can't use aggregates in the recursive function either (e.g. to count number of leaf nodes in a tree), you have to apply them at the end, in which case the intermediate table has to be large...

I've had decent experience so far with GIN indexes and @> operators on an ARRAY[] column adjacency list. In my case I stored "ancestors" so I could select by object id and get all ancestors, or use `ancestors @> ARRAY[parent_id]` to select all object ids as descendants.

Of course, if you don't need any "self" relationships, then none of the really complicated stuff matters...

<comment><AUTHOR> Thanks for the feedback.

Indeed, one of the reasons behind inheriting tables was to use partial indexes - which should help with performance. Another was ease scaling out, if needed.

Using the @> operators on array columns is something I also looked into, mainly for materialized paths - I expect them to remain static, so no expensive updates to the paths/arrays. But actually, I don't think I will need many self relationships - that was the third reason for using inherited tables, so I could split entities into separate groups.

Of course, I have no idea how any of it will work out, since this was just a semi-serious line of inquiry initially, and everything was conceptual so far, except the feedback of experienced people such as yourself, on this thread - which has led me to pursue this seriously and actually try to build it out. After reading the responses on this thread, I now think it will be worth the effort.

</comment></comment><comment><USER19> I had a similar challenge and ended up using ElasticSearch in a thoroughly denormalized data format Allowed me the flexibility of stateful (contextual) queries etc. Bit of a hack, but served my purpose. Hope that helps.

<comment><AUTHOR> Yes, it might be a hack [actually I don't think it is], but it should offer some powerful functionalities...

</comment></comment><comment><USER20> A lot of the early academic RDF graph databases used this approach. However, performance was no where near to what is required. This let to for the SPARQL/RDF graph databases to now a whole set of independently developed stores. Some on top of existing solutions e.g. Oracle semnet, Virtuoso and DB2 sparql. More on their own solid foundations.

You could test out 3 or 4 different SPARQL solutions in the time that it would take you to develop something graph like on your own.

On the other hand, cutting edge approaches, actually take a graph representation of data and lay it out in a relational manner. [http://ercim- news.ercim.eu/en96/special/monetdb-rdf-discover...](http://ercim- news.ercim.eu/en96/special/monetdb-rdf-discovering-and-exploiting-the- emergent-schema-of-rdf-data) giving the best of both worlds.

In short you can build something yourself. But don't expect that it will be better than something build and supported by someone else.

So investigate the competition: BlazeGraph, Virtuoso, StarDog, Oracle 12c EE/semnet, DB9, Dydra before deciding to build your own. Building your own because its fun to do is great, but unless it pays your bills not a good idea for production environment.

PS. The edge table (EAV) is the major problem, it leads to a lot of self joins and difficult exercises for the query planner.

You can improve a lot on this if you can put "different" edges into different tables or partitions.

Triple stores with support for JSON-LD framing such as Dydra can also make it easier to have a front-end on top of your DB without extensive middle layer code.

A store like StarDog and BlazeGraph on the other hand gives you a lot of flexibility by both supporting SPARQL and TinkerPop. (both cluster and scale out, although BlazeGraph has GPL option. StarDog is only Commercial)

<comment><USER21> edge is not stored as IAV the table hierarchy is:

> Node <\- Entities

> Edge <\- M2M

which is strange since an edge is already a M2M.

Thanks for the monetdb link.

<comment><USER20> Ah ok, so in RDF terms each predicate gets its own table, which makes sense. Then you have a subject foreign key relation ship and a object foreign key relation ship to the node tables.

That would be better than one big table in performance, which was a major problem in the RDF on SQL databases.

Of course those accepted any graph, if one constrains the number of possible predicates/relations then this solution could more efficient.

</comment></comment></comment><comment><USER22> [https://www.facebook.com/notes/facebook-engineering/tao- the-...](https://www.facebook.com/notes/facebook-engineering/tao-the-power-of- the-graph/10151525983993920)

<comment><USER23> I am a fan of this APIs base approach.

It is trivial to implement these APIs on top of simple SQL. I did that in a few days in both Python and go.

</comment></comment><comment><USER24> No-one seems to have yet mentioned Facebook's TAO paper, which describes scaling basically this approach to 1 billion reads per second. [https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/re...](https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/data- store/tao-facebook-distributed-datastore-atc-2013.pdf)

The nice thing about your approach is that you can shard your objects by their id and your edges by their "from" id, and have all lookups go to one box when you shard. Throw in some caching and it scales to multiple boxes really well.

<comment><AUTHOR> You said it!

Actually, Facebook's TAO was an early inspiration for me as well, but it is really customized and complex too, so probably not something for a tiny team. But the concepts from TAO are applicable to many similar scenarios.

</comment></comment><comment><USER25> One technique you might look into is "Materialized Path":

* usually one single query to fetch an entire tree or subtree * more work on reconstructing tree from query result * requires prefix pattern matching operator, e.g. "like" from RDBMS

<comment><AUTHOR> Thanks! That's a useful technique..

</comment></comment><comment><USER26> Dropbox does something similar called Edgestore which is built on top of MySQL: [https://www.youtube.com/watch?v=VZ-zJEWi- Vo](https://www.youtube.com/watch?v=VZ-zJEWi-Vo)

<comment><USER17> Facebook as well with TAO [https://www.facebook.com/notes/facebook- engineering/tao-the-...](https://www.facebook.com/notes/facebook- engineering/tao-the-power-of-the-graph/10151525983993920) I think they presented it at one of the @scale conferences.

</comment></comment><comment><USER21> Building a graph database is time consuming. Why are you putting edge's children (person, place, friend) in a separate table instead of using a json field? Do you plan to query the person, place, friend table directly? You need to benchmark the different queries.

My understanding is that big5 and others do not use graphdb for all their stuff since they are not as good as rdbms to do queries with a single hop or JOIN. They embrace microservices and maintain a graphdb (in memory, persistent or distributed) to answer domain specific queries. That approach is similar to your schema except that graph queries run on a single node without superfluous network roundtrips.

It would be nice to be able to use a single database for all data related stuff to have atomic writes and simpler architecture. That's what multi-model databases are tackling have a look at OrientDB and ArangoDB [1].

Also, Tinkerpop, already mentioned in the thread, is a ready-to-scale graphdb with much love I recommend you have a look at Tales of the Tinkerpop [2].

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

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

<comment><AUTHOR> Of course, JSON is a good way to store ad hoc, or new relations which haven't yet been structured. But for frequently occurring relations, I'm preferring separate tables instead of JSON for ease of querying and joins. If number of relationships are large, querying within a long JSON field is not the best approach.

Multi model db's are a good idea indeed. They were the first things I had considered, and extensively so - both OrientDB and ArangoDB. I came back to traditional solutions simply for practical reasons of maturity, and ease of finding professional support.

Someone here mentioned about a Tinkerpop implementation that uses Postgres as the storage engine, I think that might offer the best of both worlds, but I am yet to look into it.

</comment></comment><comment><USER27> I've done this before with MySQL in 2011 after throwing my hands in the air with two different graph DBs.

By far the most productive thing I did. People will say that you need recursive queries, etc, but I found most of the time just keeping the query set in the application layer was easy enough and super fast. Scaling it was easier too because there are lots of articles on scaling the MySQL / Postgres.

<comment><AUTHOR> Agreed, my reasons for coming back to Postgres are quite similar. In general, one only needs to go a few layers in the graph. Recursive queries are needed for specific use cases. Even then, querying from the app, like you said, and/or building materialized views and materialized paths are very good ways of working around this, as long as the query is anticipated in advance and the view/path built before the query. So that reduces the real use of graph db's to an even smaller subset - complex ad hoc graph queries.

</comment></comment><comment><USER28> I'd do the same. I think this book is still relevant: [http://www.amazon.com/SQL-Antipatterns-Programming- Pragmatic...](http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic- Programmers/dp/1934356557)

</comment><comment><USER29> If you want to help hack on this, I've written a Postgres backend for the graph database Cayley that's fairly fast and about to merge (for use on a prod feature): [https://github.com/google/cayley/pull/289](https://github.com/google/cayley/pull/289)

For traversals, it tries its level best to let Postgres create the appropriate JOINs, which Postgres does well... most of the time anyway. In doing this, I learned really fast how many weird semantic corners of bog-standard SQL are, and the optimization choices Postgres makes based on the way you formulate the query.

Ping me on that PR! And/or join #cayley on Freenode

<comment><AUTHOR> Thanks for sharing this! I would love to help with this - once I have gotten up to speed on various things by building a graph on Postgres myself.

</comment></comment><comment><USER30> What are you actually trying to do? If you just need some queries on a small amount of read-only data, objects in memory (in a dedicated process, perhaps) are a perfectly sane approach, and much faster than ping-ponging queries with any database.

</comment><comment><USER31> I believe Redis and Hyperdex have constructs such as bitarrays and sets that can be easily used for representing and querying graphs/hypergraphs. For Redis there are some success stories and even ready to use extensions.

</comment><comment><USER32> I don't know much about this but Joe Celko has a whole book on representing trees in SQL: [http://www.amazon.co.uk/Hierarchies-Smarties-Kaufmann- Manage...](http://www.amazon.co.uk/Hierarchies-Smarties-Kaufmann-Management- Systems/dp/0123877334/)

The obvious first question would be: why are you representing your data as a graph? Can you represent it better as sets of predicates (ie: relations)?

Using views should not reduce the number of queries: a view is just a query with a name. If you can do it by combining views you can do it by combining queries.

</comment><comment><USER33> I would love to see a SQLite extension to support graphs...

</comment><comment><USER34> This is fairly timely as I'm investigating possibilities for our data model and graphdb just popped up on my radar. Are gdb good for modeling multiple types of products? Let's say v1 of product has attributes a, b, c but v2 now adds x, y, z and removes a. Would that be 2 separate nodes?

I too am interested in understanding the downsides of a gdb (seeing some refs to performance but nothing concrete).

<comment><AUTHOR> Graph db's are a very good idea. Its just that the solutions in the market are not very mature yet, and the community is not very large yet. Most of the downsides stem from these two facts.

So unless the solution you're building has a specific need for graph queries - in particular, complex, realtime and ad hoc graph queries, a traditional solution is a safer bet.

You can make v1 and v2 two separate nodes, if you need information of both of them. In this case you just link each version to its attributes. If you want the "latest" marked separately, you can have three nodes - one for "current", and the other two for the individual iterations. So initially "current" would link to a,b,c and later link x,y,z, and remove a. Or, you can have two nodes - current and previous iteration, and store the version number of the latest iteration as a field within the "current" node.

</comment></comment><comment><USER35> Do you have a gist that implements this approach?

</comment><comment><USER36> I met with Kyle Kingsbury (Aphyr of Call Me Maybe the Jepsen database testing series) out in Berlin and I recall him mentioning at one point that Postgres was a good generic database especially with the JSON blob storage. So I am wondering if making the extensions you propose might not be worth it cause it will come with all that extra overhead.

I do however recommend exploring and even building your own graph database, it is a great learning exercise. But don't fool yourself by doing it on top of Postgres, actually jump in and become immersed. I built [http://gunDB.io/](http://gunDB.io/) to scratch a similar itch, I wanted an easy graph database with realtime updates like Firebase. I would love to hear your feedback, or even have you contribute.</comment>


Ask HN: Who is attending SXSW? - <AUTHOR>

Who is attending SXSW? <comment><USER2> <http://www.isxgoing.com>

<comment><USER3> bug report: <http://drktd.com/574Y></comment></comment>


Does an iPod Help You Concentrate? (And Other Questions About Attention) - <AUTHOR> http://tierneylab.blogs.nytimes.com/2009/05/07/does-an-ipod-help-you-concentrate-and-other-questions-about-attention/?hp <comment><USER2> An iPod doesn't help me concentrate, but sometimes music does. Techno sometimes helps me too, but it has to be techno I've heard before. New stimuli will distract me.

Interestingly, a walk around the block can do wonders for my concentration too. This fails horribly if something really catches my eye though. Girls are bad like that :)

<comment><USER3>
      An iPod doesn't help me concentrate, but sometimes music does.

I've noticed lately that listening to music with headphones helps me focus more than listening to it through speakers. I'm assuming this is because the headphones make the music the only thing I hear, where as with speakers the music is just another thing I hear.

      (...) but it has to be techno I've heard before (...)

Definitely, you want the music to set the rhythm for what you're doing but not to take center stage. I don't listen to techno, but I find instrumental funk is great for this (Beastie Boys' "The In Sound from Way Out" and Forbidden Ensemble's "Porno Soundtracks" are my favorites, not that anyone asked).

<comment><USER2>
        I've noticed lately that listening to music with headphones helps me focus more than listening to it through speakers. I'm assuming this is because the headphones make the music the only thing I hear, where as with speakers the music is just another thing I hear.

I couldn't agree more! My hypothesis is that it sort of seals me off in my own little world.

</comment></comment></comment><comment><USER4> The days I forget my iPod are horrible, unproductive days.

I think that has to do with my noisyish work environment more than anything, since I can code at home with or without music. Though it may also be related to the way working at work works (sit at your desk and produce stuff for the next 9 hours)...

But as far as music goes, I'll listen to anything I like and know. Anything new is distracting until I've heard it a few times, but that's about it.

</comment><comment><USER5> Music with lyrics = distraction. Instrumental movie soundtracks work for me.

<comment><USER6> Same for me. I can handle some Pink Floyd and other really familiar music, but mostly it's Apocalyptica (metal on chellos) or soundtracks. I recently started listening to the Lord of the Rings soundtracks, but the track where the orcs are slaving away under Isengard is depressing to work to.

</comment></comment><comment><USER7> iPods destroy my productivity because all I have on them are audiobooks and NPR podcasts. It's very hard to listen to a good episode of This American Life and get anything done.

</comment><comment><USER8> I can't even concentrate with Hacker News on my RSS feed... I don't know how I could cope with an iPod!

</comment><comment><USER9> I find it difficult to code without some sort of music playing in my ears, normally because it helps block out any distractions around me.

For the past few months I've been listening to SomaFM ( <http://soma.fm/> ) almost non-stop. It's listener supported commercial free radio so there's no annoying ads to interrupt you, just a constant stream of the genre of your choice. Works for me anyway!

</comment><comment><USER10> I never go anywhere without my iPod and my Mindfold <http://www.mindfold.com/>, one to shut out sound and one to shut out light.</comment>


Ask HN: Dev? Designer? Copywriter? - <AUTHOR>

I am always on the lookout for talented folks who have freelance availability.<p>If that's you, would you mind adding yourself here? https://docs.google.com/forms/d/1wRyoIywm46zfIbqrzinwh8mmePOR--J_8nK-iF3hKD8/viewform <comment><AUTHOR> Clickable: [https://docs.google.com/forms/d/1wRyoIywm46zfIbqrzinwh8mmePO...](https://docs.google.com/forms/d/1wRyoIywm46zfIbqrzinwh8mmePOR --J_8nK-iF3hKD8/viewform)</comment>


Apple removes compromised CNNIC root certificates and fixes Logjam in iOS 8.4 - <AUTHOR> https://support.apple.com/en-us/HT204941

<comment><USER2> Interesting how it took them over 3 months. Mozilla and Google revoked their certs almost immediately

[https://blog.mozilla.org/security/2015/03/23/revoking- trust-...](https://blog.mozilla.org/security/2015/03/23/revoking-trust-in-one- cnnic-intermediate-certificate/)

[http://googleonlinesecurity.blogspot.com/2015/03/maintaining...](http://googleonlinesecurity.blogspot.com/2015/03/maintaining- digital-certificate-security.html)

<comment><AUTHOR> The last update was iOS 8.3 on April 8, 2015. Maybe there wasn't enough time to decide then.</comment></comment>


Some screencasts I'd like to see - <AUTHOR> http://jamesabbottdd.com/programmers-way/some-screencasts-id-like-to-see

<comment><AUTHOR> I am particularly interested in the last item on his wish-list: Pry on Steroids: Interactive Ruby Development. Does anyone develop this way?

I'll admit that I am new to ruby and coming from Python I immediately fell in love with pry and was wondering if there was anyone out there who utilizes such a work-flow involving some sort of REPL. I have been having a hard-time figuring out a way to do this with pry in rails.</comment>


A very common grammatical mistake that programmers make - <AUTHOR> https://opkode.com/blog/common-grammatical-mistake-programmers-make/

<comment><USER2> Too late!

[http://dictionary.reference.com/browse/setup?s=t](http://dictionary.reference.com/browse/setup?s=t)

      set up
      verb (adverb, mainly transitive)
       ....
       3. to build or construct: to set up a shed
      Collins, 2012

I've slowly moved from prescriptivist to descriptivist, and if you want to keep your sanity, I suggest you do too, because linguistic history has shown that people use words the way they want and will keep doing so regardless of any interventions.

edit: To clarify - the author says:

      I ask you to set something up for me. I don't ask you to setup something for me.

I think the genesis of this expression was "to set up <sthg>" -> "set up <sthg>" -> "setup_sthg". The "to set <sthg> up" form /is/ probably more correct in the prescriptivist sense, but my take is that this isn't really a mistake, it's intentional. "setTestClassUp" sucks because it spreads the logical units of the identifier all over the place. I want the verb in the beginning and the noun after.

<comment><USER3> lolz bt dnt u thnk tht ths shit is ugly?

<comment><USER4> In my experience, the only people who send text messages this way are the parents of children who have a cell phone. Text abbreviations were used at a time when typing on a phone was difficult, but now that we can use our thumbs to type (or swipe) fully expanded words on a virtual qwerty keyboard, most people have abandoned the kind of spelling you're displaying.

<comment><USER5> My co-workers' (ranging in age from 18 to upper-50s) txt's beg to differ.

</comment></comment></comment></comment><comment><USER6> Besides the obvious "who cares" there is another criticism here. It is not that difficult to think of that as the setup method, wherein the noun applies. That is, if you want to know what the setup is for an object, the setup method is a good place to look.

Sadly, this does mean that to set up the object, you have to execute the setup method. Which, I'll grant is odd. But seems fine.

<comment><USER7> Nitpick (which seems appropriate for a what is fundamentally a nitpick-y thread): in "the setup method", that's actually the _adjective_ variant, rather than the noun. The article points out that the adjective is also one word.

</comment></comment><comment><USER8> But we're writing code, not a grammatically correct english essay. If incorrect grammar leads to shorter and simpler variable names that other programmers understand, then it should be encouraged.

<comment><USER9> To some extent, this is true in the real world - it often feels like completely correct english is a lost cause. Many of our grammar rules have been replaced over time as our language has evolved.

I was upset when I learned some people didn't have to spend years in school trying to figure out all how to correctly sound out words in their language.

At least we have a large vocabulary to pull from.

<comment><USER10> What is completely correct language? That was always a lost cause; it's not how people work.

</comment></comment></comment><comment><USER11> Who says the criteria for separating parts of programming language identifiers need be dictated by whether the words are separated by spaces in English?

The "mistakes" here are all examples of phrasal verbs:

[http://en.wikipedia.org/wiki/Phrasal_verb](http://en.wikipedia.org/wiki/Phrasal_verb)

The central characteristic of these constructions is that the verb+preposition form "a single semantic unit".

That would seem to be a perfectly reasonable justification for _not_ introducing underscores.

<comment><USER12> > Who says the criteria for separating parts of programming language > identifiers need be dictated by whether the words are separated by spaces in > English?

Many coding standards specify different presentation for single-word vs multi- word identifiers, except in languages where the syntax would prevent this (e.g., snake-, Pascal-, or camel-case presentation of multi-word identifiers.)

All the examples are phrasal verbs, presented as single words in identifiers that are using snake_case or camelCase to distinguish multiple words in the identifier, and so are incorrect.

The only times I can see this being anything more than a mild aesthetic issue (though still a _real_ issue that, while perhaps not the most critical to address, is worth being aware of and avoiding) is if it is in a language where, e.g., properties and methods share a single namespace, and coding standards dictate that properties use noun-based names and methods use verb- based names. In that case, using a single-word noun in an identifier when you intend a phrasal verb is a substantive error (most particularly when that semantic unit is the whole of the identifier).

</comment></comment><comment><USER13> > _I ask you to set something up for me. I don 't ask you to setup something > for me._

"Please set up a meeting with Kevin for me" sounds more natural to me than "Please set a meeting with Kevin up for me."

<comment><USER14> That's called a heavy NP shift[1]. Since "A meeting with Kevin" is "heavy" (which is a fuzzy line, but one which native speakers know intuitively), the phrasal preposition gets "shifted" closer to the verb.

An example (pronouns almost never qualify as "heavy"):

Good:

• Please set him up

Weird sounding:

• *Please set up him

[1] [http://en.wikipedia.org/wiki/Heavy_NP_shift](http://en.wikipedia.org/wiki/Heavy_NP_shift)

</comment></comment><comment><USER15> This really became more intuitive to me after studying German, where the idea of separable verbs was made explicit.

I don't think things should be named "setInstanceUp" or anything like that, but you could see how "setUpInstance" could mean something different than "setupInstance" (an instance of a setup, I suppose).

Same with "signup" versus "sign up", login/logout/etc. There are a lot of examples of these things where people confuse the verb and the noun, and the word split can be the most concise indication of which is which.

<comment><USER16> I would use "InitializeInstance" or "InitInstance" rather than "setUpInstance" anyway...

</comment></comment><comment><USER17> Since grammar is just an attempt to generalize observations about usage (descriptivist), when you attempt to correct someone's grammar you are really saying "the prestige way to say this is ..., and you look foolish saying it the other way". In this case it is the author of the blog that looks foolish, since he is going in the face of the vast, vast majority of the community and he does not bring with him higher social status.

This is all a long winded way of saying the author of this blog post must be completely insufferable in real life.

<comment><AUTHOR> Thanks :)

</comment></comment><comment><USER18> Oh joy, another programmer trying to convince others that the rules of English grammar can be solved logically.

Ideas like "setup" and "teardown" have grown to describe important verbs in their own right. Why argue that the original form (verb + preposition) should not be allowed to merge, when it's clear that they already are doing so? For no particular reason, other than maintaining a status quo? That's a little ridiculous.

PS: Same logic applies to "login" and "logout".

<comment><USER19> Every English style guide that I've read stresses the importance of consistency. If you want to use "setup", "login", etc., go right ahead. But be consistent: use the words "setupping" and "loginning", rather than "setting up" and "logging in".

</comment></comment><comment><USER20> The one that makes me want to gouge my eyes is "performant", the word that isn't.

<comment><USER21> I find not using declension to sound hip a bit jarring:

Total spend (instead of budget, expense) Compute power (instead of computing power)

Maybe it's just me and maybe they are grammatically correct but it just seems like trying to sound in-clique..

</comment></comment><comment><USER22> Nope, every single one of the examples of being used "incorrectly" were being used correctly and also point to the general trend in all languages towards simplicity and regularity. More specifically these are all covered under well known morphological mechanisms that drive English word formation.

For example, in English, verbs and nouns have an unusually close relationship, it's trivial and natural to verb nouns, especially when the verbed noun is obvious. This is an example of derivational morphology, and there's all kinds of ways of doing this in different languages.

In English, among other neologistic processes, there's also a process to compound common noun phrases. These days, compounding nouns usually skips several medial steps (like hyphenation) because everybody knows that in a couple generations we're just not going to bother with the hyphen and we skip all that stupidity. A thousand years of English has showed us that this is the pattern.

Verbing a compounded noun is not only correct, it's actually how English works.

What happens in this specific case, is that these are all examples of incompletely verbed nouns. You don't say "setupping" you say "setting up" and that's because the phrasal verb form is still in common use. Once it goes away, we'll all be saying "setupping" and a few internet grammar nazis who are caught in a linguistic time warp that's literally decades behind every other person around them will get all hot and bothered that people are participating in these completely natural linguistic processes.

Verbing weirds language.

<comment><USER19> > _Once it goes away, we 'll all be saying "setupping"_

Where is the evidence supporting the belief that we'll all be saying "setupping"? Not once have I ever heard anyone use the words "setupping", "loginning", etc.

I posit that the use of "setup", "login", etc. as verbs is simply the result of people not knowing how to spell. In other words, it's a change that's driven by (poor) writing, not speaking.

I think it's far more likely that people will start writing "settingup" than they'll start saying "setupping".

<comment><USER22> Everything you described is how languages _actually_ evolve. There's pitifully few grammatical construct or morphological mechanisms in English where settingup would become a word, but there are several that trivially lead to setupping (or 'setuping')

Something linguists stopped doing a very long time ago is trying to logically set rules for how a language _should_ evolve and started observing how they _actually_ evolve.

[https://www.google.com/webhp?sourceid=chrome- instant&ion=1&e...](https://www.google.com/webhp?sourceid=chrome- instant&ion=1&espv=2&ie=UTF-8#q=%22setupping%22)

[https://www.google.com/webhp?sourceid=chrome- instant&ion=1&e...](https://www.google.com/webhp?sourceid=chrome- instant&ion=1&espv=2&ie=UTF-8#q=%22setuping%22)

[https://www.google.com/webhp?sourceid=chrome- instant&ion=1&e...](https://www.google.com/webhp?sourceid=chrome- instant&ion=1&espv=2&ie=UTF-8#q=%22setingup%22)

</comment></comment></comment><comment><USER23> I winced as soon as I saw the examples --- these things bug me too. :)

There are quite a lot of sites with buttons labelled "login" or "logout" (HN is one!) which I always thought should read "log in" and "log out".

I suppose the language is heading this way though, so I'm sure we'll consider these things to be grammatically correct eventually, if we don't already.

</comment><comment><USER24> Heh, I think a far more egregious error is having the word "instance" appended redundantly in a method name.

obj.SetUp() or obj.Setup() I'm indifferent to, but (mostly) there's no additional info gained by appending "instance" to it.

I say mostly because sometimes code could pass bound instance methods around for others to invoke alongside other functions.

</comment><comment><USER25> "Up", "down", and "over" aren't adverbs. Frequently they're prepositions, but in verbs like "set up" they're just part of the verb itself, since "set up" can't be understood by the meanings of "set" and "up". (See [http://en.wikipedia.org/wiki/Phrasal_verb](http://en.wikipedia.org/wiki/Phrasal_verb) for more info).

And also: what on earth is the author proposing the methods be named then? Rename "setupInstance" to "setInstanceUp"? In what way is that clearer or more readable? And really, "setup" and the like have become verbs through usage already. Which would you be more likely to say?

1\. Can you set a new user up for me?

2\. Can you setup a new user for me?

For me, #1 sounds awkward, #2 sounds more natural. Similarly for cleanup, teardown, and other common computer tasks.

<comment><USER26> setUpInstance vs. setupInstance. Because "setup" is a noun, setupInstance looks like it could return a setup's instance. setUpInstance looks like it performs an action.

<comment><USER27> Or, setUpInstance looks like it's the setter for an upInstance variable, whereas setupInstance has an obvious connection to the "setup" action even if it's grammatically incorrect.

<comment><USER26> Haha, very true. That is one reason I like underscores: you can distinguish between setup_instance, set_up_instance, and set_upinstance. Or maybe set_up_upinstance. In context, it probably wouldn't matter unless you have both "setup" and "upinstance" types running around.

</comment></comment></comment></comment><comment><USER28> Ahhh not me! Every time I inform someone about this grammatical difference I get a warm smug feeling inside.

</comment><comment><USER29> I was thinking the article would be about the incorrect singularization of the word 'data'. It's a curious case. When I hear people say "these data are...", I can't help but think it's pompous. Even though I know their usage is correct!

</comment><comment><USER30> Pedantism is important and valuable.

</comment><comment><USER31> If it's not grammatical, why does it compile? My compiler rejects lots of errors, but not this.

Maybe the problem is that the OP thinks that the rules of English apply to computer languages.

</comment><comment><USER32> setUpDog("what's")

</comment><comment><USER32> Someone set us up the bomb.

</comment><comment><USER33> Oh, who gives a fuck?

"Set up", "clean up", and "tear down" are used all the time in modern English, without interposing the direct object between the words, e.g.:

"Let's set up camp here."

"Clean up your room."

"Mr. Gorbachev, tear down this wall!"

So maybe if we were following the rules of CamelCase strictly, it would be setUpTestCase() or similar, but ultimately as long as what is meant is clear IT DOESN'T MATTER.

<comment><USER34> Does setupTestCase() return a setup test case, or does it set up a test case? Putting a little thought into clarity of naming can save a lot of repeated effort reading the code in the future. Little things add up.

<comment><USER35> Context matters. TestCase.setupTestCase() sets the test case up, while TestCase TestHarness.setupTestCase() returns the setup test case.

A better name for the former would be TestCase.Setup(), and a better name for the latter would be GetSetupTestCase().</comment></comment></comment>


How to Remap Keys on Mac OS X for Extra Productivity - <AUTHOR> http://palmer.im/2013/01/remap-keys-os-x-mountain-lion/

<comment><USER2> If you aren't using caps lock as your control key, I feel sorry for your poor little finger. That being said, if you want more convenient keyboard shortcuts(or just more) control is your friend. It isn't used very much for mac os x applications and even in developer oriented ones you usually can work around conflicts pretty easily.

For a lot of these shortcuts I don't really see the point as you want your hands on the home row almost all the time.

<comment><USER3> I have caps set to escape, for vim ;)

<comment><USER4> I map it to both - quick tap for ESC and hold for Ctrl. [http://stevelosh.com/blog/2012/10/a-modern-space- cadet/#cont...](http://stevelosh.com/blog/2012/10/a-modern-space- cadet/#controlescape)</comment></comment></comment>


Pine64 November Update – ANSI Pinebook Pro and PinePhone Preorder - <AUTHOR> https://www.pine64.org/2019/11/05/brave-heart-edition-pinephones/ <comment><USER2> > We make no profit from selling these units. If you think that a minor > dissatisfaction, such as a dead pixel, will prompt you to file a PayPal > dispute then please do not purchase the Pinebook Pro. Thank you.

This just sounds unsustainable

<comment><USER3> Well, personally I would prefer them to make profit. I would be willing to pay a bit more since the product seems quite interesting - not actually in the current state, but what the product could be if the business actually flourishes.

Better would be something like "Disclaimer: the product can have up to 10 dead pixels which are not covered by warranty."

<comment><USER4> I hear what you're saying, but to be clear, Pine Microsystems is not operating a pizza shop. It is much more like a hackerspace or community workshop then a merchant. They offer a direct-from-manufacturer business model, where a non- membership based community of interested stakeholders directly contribute to most if not all of the products. Check out the engineering blog posts.

If you are looking for a turnkey solution, not all of Pine64's offerings are able meet your needs (but do snag a $1.99 CH340 Serial console.) and if you preorder the "Braveheart" phone, there is no stable off the shelf OS prepared for it. You cannot buy this and mail it to ahead your hotel and give a demonstration to the board by next Thursday.

That said, and I don't think this is superlative at all, Pine64's efforts currently exemplify the internet dream of a "Global Village" economy.

</comment></comment></comment><comment><USER5> Incase you're ordering the PinePhone & looking forward to jump on Linux development; check out Ubuntu Touch by UBPorts[1].

UBPorts community have done a commendable job in continuing Ubuntu Touch development after canonical left it. Even Nexus 4 receives regular updates, albeit old kernel due to libHybris

Ubuntu Touch is the most accessible Linux phone now because of their support to older available devices. Unfortunately, they don't get enough attention as Purism or PostmarketOS gets.

Hopefully, PinePhone should change it.

[1]:[https://forums.ubports.com/topic/2403/pinephone](https://forums.ubports.com/topic/2403/pinephone)

<comment><USER6> > Unfortunately, they don't get enough attention as Purism or PostmarketOS > gets.

I didn't know of this project, however my first thought at putting the ideas "ubuntu" and "phone" together would be: another phone that doesn't respect you.

This comes from the way ubuntu forces stuff you might not want, like the amazon app, telemetry and stuff like snap.

I might be thinking unfairly.

(meanwhile purism takes great pain to think of the user compassionately via GPL)

<comment><USER7> Amazon searches were a huge mistake of theirs, but they don't force anything, you don't have to use snap or submit telemetry. Much bigger problem with Canonical is they think it's okay to have some tightly integrated bits and pieces that are proprietary and not to contribute some fixes upstream.

<comment><USER6> > you don't have to use snap

I have to disagree. My experience trying to disable or remove snap led me to believe they designed it to be hard.

</comment></comment></comment></comment><comment><USER8> Any real, day-to-day usage feedback on the PineBook Pro? I've looked around on their forum + reddit, and outside of a couple of reviews (mainly only a day or so into ownership), I haven't found much. This one seems to be the most in- depth so far: [http://students.engr.scu.edu/~sschaeck/misc/pinebookpro.html](http://students.engr.scu.edu/~sschaeck/misc/pinebookpro.html)

<comment><USER9> Yes. I have one. It's a $199 laptop. It is nowhere near as nice hardware wise as the Macs I use. It works, but everything's slow and clunky.

<comment><USER8> Yeah, I'm not expecting a ton given the price point, I have my "real" machines for work.I would like an open and functional option for traveling, conferences etc though. Maybe it is because of delivery timelines or something, but I don't see many people reviewing these outside of initial unboxing type details...

<comment><USER4> This is a new product launch, the current users are reporting on the earliest units. The first normal pre-order batch should be shipping this week, and then I believe there are 2 more batches to be shipped until after the Chinese new year. The current preorder is the last for these units for several months.

The Pinebook Pro specs compare to a somewhat powerful 6-core arm SBC: 5V power input, easy to charge off a solar panel on your boat, IPS LCD panel, MALI gpu, 4gb Ram (SoC is maxed out, this could be upgradable: Original $99 Pinebook upgrade kits are coming in Q1 2020), 64GB MMC, wifi, no ethernet (use $9 dongle, case too thin), USB-C, a UART accessible from the headphone jack with a $7 dongle breakout thingy, optional $7 M.2 NVME daughter board. This is a (almost) fully opensource chromebook with a magnesium shell, and hardware privacy switches. 2 blobs afiak for Mali GPU and Bluetooth/wifi module. Hackable. Inexpensive accessories already exist with good availability. Replacement parts available, BSD according to the wiki.

Personally, I like reasonably powered home computing devices, I just put the stuff with all the fans in the closet. Maybe doing a huge compilation or git merge on the Pinebook hardware is gonna be slow. Full video and smartphone graphics should be fine. Connecting your Pinebook to a Pine64 cluster for big jobs is something you can do today and sounds like a summer project.

This client hardware seems pretty decent for two large bills. A specced Librem 15 is $2000 and could be eye watering if it falls off your boat again.

</comment></comment></comment></comment><comment><USER10> About the PineTime

> Since this is a community driven side-project, we have started considering > making the dev-kits available to everyone in the store.

That would be awesome. I've been looking for an open watch to play with recently. I hope they go forward with that idea.

<comment><USER11> Battery life seems promising too! (They aim for 10 days.)

This might actually turn out more useful than many of the boutique smartwatches.

</comment></comment><comment><USER12> I would like to order both a PinePhone and a PineTime (plus a couple more for friends), but I have no idea if they will be available for order/shipping at the same time[1].

And ideally, I would like a pineTime as well. I would like to write a program to alert me when I'm forgetting my phone while travelling, for instance :)

[1] Asked here: [https://forum.pine64.org/showthread.php?tid=8158&pid=51528#p...](https://forum.pine64.org/showthread.php?tid=8158&pid=51528#pid51528)

<comment><USER13> Yeah. Hoping they do produce more PineTime dev kits, as Go can now be compiled directly for it (via TinyGo) and a friend has a good project in mind it would suit.

</comment></comment><comment><USER14> Got my Pinebook Pro preorder in. Will order a PinePhone when it opens as well. Using both as a way to test the waters of using Linux as my daily "consumer PC" replacement, since the price makes it fairly painless to do so.

<comment><USER4> Don't forget about the open source community designed PineTime! (est price: $25)

They are also developing an open source tablet, PineTab. They already have several full lines of SBC Raspberry Pi killers as well. Several are designated LTS Long Term Support with guaranteed availability (See offer for details, restrictions apply, Pine64 can not be held responsible for any sweet hacks or enjoyable Sundays caused by its devices. Hack Responsibly.)

<comment><USER15> However, from what I can see [1] there is just some prototype hardware and some datasheets, is there an SDK somewhere? Or at least a toolchain?

[1] [https://wiki.pine64.org/index.php/PineTime](https://wiki.pine64.org/index.php/PineTime)

<comment><USER16> No, your job is to write the SDK. Eventually someone will write one and then you can go to the next level.

Note that they have carefully looked for the type of people who will write a sdk for it, and ensured they have a pinetime. Thus in a few months/years I expect to see a couple different SDKs come out. Once there is a useful SDK with a useful app ready for release they will start selling hardware to anyone with it. Until then they will only make the pinetime hardware available to the type of person who is likely to take what currently exists and move it up a level. (note that the first set of hardware has shipped, they might or might not make a second round for more developers)

</comment></comment></comment></comment><comment><USER17> I'm very interested in these machines. Hopefully someone will post a review of them on HN once available. I'm especially interested in hearing how the trackpad is, considering people on HN are always complaining about Linux and trackpads.

I wish the site had better photographs. The keyboard pictures are awful, and the Javascript they use to show the pictures prevents me from zooming in to see any detail.

<comment><USER18> On the Pinebook Pro, the trackpad and keyboard aren't great. I'm hesitant to say horrible, but it is a very cheap machine so you get what you pay for. I have one of the ISO keyboard "batch 2" machines. I got it last week and the keyboard issues have made it largely unusable for me.

Ignoring the trackpad, the keyboard will sometimes refuse to register keypresses or will repeat keys. This is particularly problematic when you type fast (like a password). On mine, the tab key also gets stuck rather often. The trackpad doesn't have much control for fine movements, which makes resizing windows... interesting. And the trackpad frequently activates spontaneously which causes cursors to move around.

Aside from a small issue I had with a loose bezel, the rest of the machine is very nice. It is a good sized (14"), very sturdy design. The screen is pretty good too. Maybe if the keyboard and trackpad firmware gets fixed, then it could be a usable machine.

<comment><USER19> Is the keyboard better than the XP's 13? I hate typing in that thing. I miss my 2015 MacBook w Ubuntu, the hardware was so incredible

<comment><USER20> I haven't used the XPS 13 so I can't compare them but while the keyboard the PBP is cheap it isn't _bad_. The touchpad on the other hand makes me want to stab someone every time it misses a two finger right click.

I've been eyeing the 2018 Matebook X Pro as a replacement work laptop, everything I've heard about it has been overwhelmingly positive.

<comment><USER18> I'm glad your keyboard is working out better for you. Mine is just so inconsistent, but part of that is the touchpad too. Maybe I would have a different opinion if I just disabled the touchpad completely (and if my tab- key would stop sticking).

But I do think it highlights one of the issues you'll have with any low-cost machine — quality control. There just isn't enough of a margin to assure a standard level of quality. Now, this is admittedly a pre-production batch, so perhaps some of these issues with quality will be worked out, but given the cost, I'm not too confident.

</comment></comment></comment></comment></comment><comment><USER21> Does anyone know if the Pinephone will be able to work on Verizon's network? I am very interested in getting a Pinephone to try out and maybe make some apps for but I don't want to buy another SIM and plan from somewhere else.

<comment><USER14> The chip in the phone is an approved module for Verizon, so theoretically, it can, and the bands needed are supported. Whether or not your Verizon customer service rep will activate the phone is an entirely different question that we'll only find out once we have them in hands and give it a shot.

[https://opendevelopment.verizonwireless.com/design-and- build...](https://opendevelopment.verizonwireless.com/design-and- build/approved-modules/module/8959)

<comment><USER21> Awesome! I already have an activated Verizon SIM so hopefully it'll just work with the Pinephone. If not maybe I can just pick up something from Ting.

</comment></comment></comment><comment><USER4> I have been clamoring for this product for _years_. If this looks good to you, check out their other offerings. They are extremely compelling. Also, the $1.99 serial console is very nice.

</comment><comment><USER22> Does anyone know who are the people behind Pine64? Where is the company based/incorporated.

I couldn't find any info on the website.

<comment><USER23> The blog and an interview [1] have been by Lukasz Erecinski. Although Wikipedia mentions TL Lim:

> Although the original Kickstarter page mentioned a company called "Pine64 > Inc.", all devices are manufactured and sold by Pine Microsystems Inc. based > in Fremont, California. Its founder is TL Lim, the inventor of the PopBox > and Popcorn Hour series of media players sold under the Syabas and Cloud > Media brands.

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

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

</comment></comment><comment><USER24> Really cant wait to get my hands on a pinephone, it looks absolutely amazing. Hopefully I will be quick enough to get a BraveHeart model for christmas, I would rather not test my technical skills with assembling the developer edition.

Hardware switches for almost everything and open source software :D

<comment><USER25> > Hardware switches for almost everything and open source software :D

I just flipped through the various pinephone PDFs linked from the November update and saw no evidence of hardware kill switches. Maybe they're buried in the schematics, but the exploded phone diagram has nothing for them.

Can you link where you saw mention/proof of this?

<comment><USER24> [https://www.pine64.org/2019/09/05/september-update-the- pinep...](https://www.pine64.org/2019/09/05/september-update-the-pinephone-is- real-shipping-soon/)

>The detachable back panel – which covers the privacy switches, pogo pins and the removable battery – is made of a durable soft-touch plastic.

[https://wiki.pine64.org/index.php/PinePhone](https://wiki.pine64.org/index.php/PinePhone)

> Privacy Switches: LTE (include GPS), Wifi/BT, Mic, and Camera

edit: You can see them at the first link (picture "PinePhone mainboard + daughterboard (prototype) "), its the little switches above the sdcard reader

<comment><USER25> Thanks.

Well, I guess that's better than nothing.

I can't see myself removing the battery cover and flipping dip switches every time I want to utilize GPS and cellular networks, and again when I'm done, though.

But it does let them check the "hw kill switches" box...

<comment><USER24> I mean i think its about what you expect of the device. Many users would likely be unhappy with having the buttons pressable on the outside due do being prone to an accidental disable-able. Its a fringe feature. Having the option to reversibly disable these components is exactly what i am looking for. So while I will be unlikely to use GPS and LTE or the simcard for that matter, I am not sure about WIFI, cam and microphone yet. Either way, It sure as hell beats soldering them off. Hopefully the cover is also as easily removable as promised. But even if not, i would still get one if all killswitches were 0 Ohm resistors.

I think just posting the link here gave the wrong impression. Its an open Linux phone with HW-Killswitches. If that sentence on its own doesnt have you grin like a kid on Christmas, its likely not yet the device for you. But as was often said when talking about the Pinephone, its a start. At this point the target demographic is still developers not people who are looking for an open source replacement of their current smartphone. Its why the batch is called "brave heart". While there are operating systems booting on it already, the expectations Pine set when the developers edition came out were rather low.

<comment><USER25> > Many users would likely be unhappy with having the buttons pressable on the > outside due do being prone to an accidental disable-able

The Purism Librem 5 addressed this while still having the kill switches easily accessible externally, with recessed switch bosses appropriate for regular external use.

On the Pinephone it looks more like an afterthought to try get some feature parity with the L5.

I'm excited to see more Linux phones on the market with non-android user space. But it's about 15 years too late for me to jump to buy anything running Linux without actually wanting to daily drive the end result, like back in the Zaurus days (I had three different models). I basically don't use a smartphone because of the current situation, not since my Nokia N9 broke, and that Linux phone was incredibly disappointing on the hackability and security/privacy fronts, though I did enjoy using it.

<comment><USER24> The Librem 5 is another price point and I think its trying to achieve another goal. I dont think they are in any real competition. For the pinephone, if one of your main goals is the final pricepoint, how much % of your devices cost (and development time) are you going to invest into a (unfortunately) niche feature? And are you risking the robustness of your phone for it? I think the way its done is the cheapest, yet still functional way, which this phone is all about.

The Pinephone is at its core a proof of concept made cheaply available to jump start development for open source linux smartphones. Once its shown to be working we can talk about every day competitors to existing smartphones, but thats at least a generation away. Librem is trying to achieve this to begin with by marketing it to privacy and security conscious users. I am really curious if that will succeed, but i fear people will expect it to match the comfort of their current smartphones at that price, which is a really difficult thing to do. Looking at history, it took a while till Linux became a realistic option as an OS for a home computer for people who dont consider them self geeks. The pinephone isnt reaching for the moon but makes the first step.

To the other point, this will be my first smartphone as well and is intended for daily use, just not with GPS, LTE and SMS.

</comment></comment></comment></comment></comment></comment></comment><comment><USER26> As a dissatisfied customer, I bought a bought a bunch of A64-LTS with Poe, eMMC and battery holders.

Turns out their eMMCs are defective. Here's what's happening:

The eMMCs ignore the first read instruction, and then work from the second one on. On Linux boot, initrd makes a read request that never returns, and hangs.

If you boot off of a mSD, it woris well. You can still mount the eMMC, but you cant boot with them.

I did receiver a report that someone found a bootable (doesn't ignore first read) eMMC. But that was 1.

(Disclosure, I opened a PayPal dispute and sent back the eMMCs of my own expense. But the never responded so I got all $293 back. This goes along with 0 communication even when I was trying to do the right thing. I'm also trying to start a hardware business, and chose this platform because of no embedded radios, etc, and 1gigE on its own SPI bus.)

Tldr. Defective hardware, don't buy.

<comment><USER27> I didnt find anything about this in the Pine Forum or via google, just this thread on Armbian

[https://forum.armbian.com/topic/7783-cant-install- pine-a64-l...](https://forum.armbian.com/topic/7783-cant-install-pine-a64-lts- to-emmc/)

Do you have any more information or a link where to follow up on this? Skimming the threads in the forum

[https://forum.pine64.org/forumdisplay.php?fid=67](https://forum.pine64.org/forumdisplay.php?fid=67)

has more then one person saying that they managed to boot from the EMMC.

edit: nevermind found it

[https://www.reddit.com/r/PINE64official/comments/df6yxz/pine...](https://www.reddit.com/r/PINE64official/comments/df6yxz/pine_a64lts_isnt_able_to_boot_from_emmc/)

edit2: Are you sure you didnt run into a problem with Armbian? Did you test it with any other OS? There seem to be more people who had an issue which sounds similar, not being able to boot from EMMC but from SDCard with armbian.

[https://bugzilla.redhat.com/show_bug.cgi?id=1745265](https://bugzilla.redhat.com/show_bug.cgi?id=1745265)

<comment><USER26> Sorry got busy in the interim.

Yes, I tried eMMC boot on every emmc capable OS that the Pine-fork of Etcher suggested. And I also tried openBSD as well on suggestion from freenode #pine64 user, to no avail.

I then was able to order a usb3->eMMC adapter, and was able to debug the USB and determine my assertions were correct: those eMMC chips ignored the first read operation.

I didn't have a jtag for the allwinner chips, but I also did have a serial console. I'd like to say I went above and beyond for testing what I'm defining as defective merchandise.

Now, the A64-LTS, the rtc batery holder, and the POE injecters are pretty darn good. I was just hoping for better overall performance with using eMMC.

<comment><USER27> Thanks for the detailed reports, thats really a shame.

</comment></comment></comment></comment><comment><USER28> Any idea of the expected price?

<comment><USER12> USD $150 [1]

[1]: [https://wiki.pine64.org/index.php/PinePhone](https://wiki.pine64.org/index.php/PinePhone)

<comment><USER28> No shit. Good price. Thanks!

</comment></comment></comment><comment><USER29> lol @ q3 cpm & cpm1a screenshot on that Pinebook Pro image...</comment>


Show HN: Summon the Warrior - <AUTHOR>

I'm interested in any input or insights on the website, but in particular the concept.
The website is called Summon the Warrior and it's eyes-open self-hypnosis scripts and audio sessions.
Website: http://summonthewarrior.com/ <comment><USER2> I liked the design and just bought a warrior script+audio. I will give it a try and send you the review.

<comment><AUTHOR> Thank you :)

It's still in the experimental MVP stage, but I hope you enjoy it.

<comment><USER2> I just listened to the audio. I practice positive affirmations myself and your scripts associate a visual+auditory elements to the affirmations, which is great. I think I will have to make a habit of listening to them daily.

</comment></comment></comment><comment><AUTHOR> Clickable: <http://summonthewarrior.com/>

</comment><comment><USER3> Love the design.

<comment><AUTHOR> Thanks you. I felt it was important to convey the energy and possibilities of it.</comment></comment>


Teaching boys and girls separately - <AUTHOR> http://www.nytimes.com/2008/03/02/magazine/02sex3-t.html?ex=1362027600&en=2c738e5956dd2eeb&ei=5090&partner=rssuserland&emc=rss&pagewanted=all

<comment><USER2> Good skeptical analysis:

<http://reason.com/blog/show/125292.html>

"Giedd suggests a thought experiment: Imagine trying to assign a population of students to the boys' and girls' locker rooms based solely on height. As boys tend to be taller than girls, one would assign the tallest 50 percent of the students to the boys' locker room and the shortest 50 percent of the students to the girls' locker room. What would happen? While you'd end up with a better-than-random sort, the results would be abysmal, with unacceptably large percentages of students in the wrong place. Giedd suggests the same is true when educators use gender alone to assign educational experiences for kids. Yes, you'll get more students who favor cooperative learning in the girls' room, and more students who enjoy competitive learning in the boys', but you won't do very well. Says Giedd, "There are just too many exceptions to the rule.""

Of course, given that public schools often use the "one size fits all" criteria to sort educational experiences, perhaps gender sorting is a step up (and one that bureaucracies can understand).

<comment><USER3> I agree! It's interesting but he doesn't seem to realize what his alternative in this thought experiment is. It's a co-ed locker room!

<comment><USER3> Can't help it but here's another thought. He thought experiment is upside down! The subject of discussion is whether it makes sense to try to figure out person's traits or abilities based on his/her gender. He is talking about how hard it is to figure out person's gender based on the height (or a trait). Totally opposite! The right question should be: can you estimate person's height based on gender? The result would be much more positive.

</comment></comment></comment><comment><USER4> Interesting stuff. I wonder, though:

> 62\. In Why Gender Matters, Dr. Sax explains that "anomalous males" -- boys > who like to read, who don't enjoy competitive sports or rough-and-tumble > play, and who don't have a lot of close male friends -- should be firmly > disciplined, should spend as much time as possible with "normal males," and > should be made to play competitive sports.

Source: [http://www.aclu.org/pdfs/womensrights/20060801seldencomplain...](http://www.aclu.org/pdfs/womensrights/20060801seldencomplaint.pdf)

<comment><USER5> As an "anomalous male" according to that definition, I'm pretty sure that would have made me hate everything and go on a killing spree. Certainly wouldn't have helped me learn.

</comment></comment><comment><USER6> My high school created a separate CS class for girls (girls could be in the "boys" CS class, but not vice-versa). It was a flop by all accounts.

</comment><comment><USER7> I have met men who where schooled in boys-only schools. Without exception (so far), their social skills are very low. Particularly with women, unsurprisingly.

<comment><USER8> One of the most charismatic persons I know was educated in a boys-only school. He's married now, but he definitely has _no_ problems talking with women. Many boys from boy-only schools tend to hang out around girl-only schools so that actually ameliorate the effect.

I personally feel co-education is the way to go but just pointing out it's not a general rule.

</comment></comment><comment><USER9> What's next, age segregation?</comment>


Show HN: Writing Race - <AUTHOR> https://writing-race.withtada.com <comment><AUTHOR> I created this writing-race thingy as a cool way to write faster.

It's a real-time race where you challenge another writer for a specific number of words. The one who finishes the words-count faster will win!

Do you think it'd be useful?</comment>


Kaspersky CEO hits back at US cyber espionage claims - <AUTHOR> http://www.theaustralian.com.au/business/technology/eugene-kaspersky-hits-back-at-us-cyber-espionage-claims/news-story/35354e313eab7fc62b0a8ada1fc04991 <comment><USER2> It may be true that there is currently no backdoor. But having US gov't agencies run root software that can be remotely updated by organizations under the control of a potentially hostile government seems like a big liability if conflicts escalate.</comment>


Show HN: Story with Dynamic Soundtrack - <AUTHOR> https://thingsinjars.com/lab/kyral/ <comment><AUTHOR> I've been experimenting with the idea of having background music for stories.

Each section is marked up with a set of tracks that can be played through the section and as you scroll through the text, IntersectionObservers are triggered to queue them to start playing at the next appropriate point.

Some people I've tried this on like listening to background music while reading, some need complete silence so I'm having a hard time deciding whether this is a useful or not.</comment>


24 Pull Requests - Giving gifts of code back for Christmas - <AUTHOR> http://24pullrequests.com/?

<comment><USER2> Eh, pull requests can actually create a lot of work for an OSS project, especially if they are not very good. So make sure the project wants your help, you understand what they want, and opt for quality over the number of pull requests.

<comment><USER3> My two most recent pull requests were for README's that were out of date with the code (e.g. CLI options that were removed, examples code that doesn't work). These are just as helpful.

</comment></comment><comment><AUTHOR> We're doing 24 Pull requests again this year, last year 881 developers submitted 3210 pull requests to 1521 different open source projects, which was a great success.

Comment thread from last year: [https://news.ycombinator.com/item?id=4853864](https://news.ycombinator.com/item?id=4853864)

</comment><comment><USER4> I think more people might take part if it was less intense. It's going to be hard to learn multiple code bases and submit a meaningful pull request every day if you're full-time employed. 12 days of Christmas, 12 pull requests!

<comment><USER3> As I've stated elsewhere, I've come across a ton of out-of-date documentation on projects. Just submitting a one or two line change to a README that has wrong information is helpful. For example:

[https://github.com/trek/grunt-neuter/pull/41](https://github.com/trek/grunt- neuter/pull/41)

or

[https://github.com/sakatam/grunt- webmake/pull/1](https://github.com/sakatam/grunt-webmake/pull/1)

Another thing that I've found severely lacking is examples of complex data setups in ember-data. I'm currently working on a complex app in Ember, but don't have the outside time to boil my misgivings into examples (yet).

<comment><USER4> Yeah, but you still need to learn how the project works to update the docs. If you're a contributor 8 different projects already, then it might not be too unrealistic to submit 3 pull requests for each over the course of 24 days. But if somebody already knows their way around 8 open source projects then this initiative probably isn't aimed at them.

</comment></comment></comment><comment><USER5> For easy, and just as meaningful contributions update your favorite projects README file.

Many times the README is outdated, confusing, or missing a necessary example. It helps a lot of people when starting out with a project.

</comment><comment><USER6> I need help with my project

[https://github.com/brickcap/wrinqle](https://github.com/brickcap/wrinqle)

The goal of wrinqle is to provide an easy way to facilitate communication between web sockets connected to the same server.

I am new to erlang development.I need someone to review my code and help me in writing unit tests for gen_events.

Side note: I wish 24pullrequests allowed more than 200 characters :(

Any way very nice website. Thanks.

</comment><comment><USER7> If you're interested in interactive education please check out Quill.

[http://www.quill.org](http://www.quill.org) [https://github.com/empirical- org/quill](https://github.com/empirical-org/quill)

Quill provides personalized grammar lessons. Students using Quill proofread passages and write sentences. Quill is a free tool and features 42 CCSS lessons. We are a nonprofit organization, and 1,000 students have completed a lesson in Quill.

</comment><comment><USER8> A plea to the site developers: on the "Suggest a Project" page, please expand the whitelist of allowed programming languages in the mandatory "Main language" field. It is currently impossible to suggest any project whose main language is, for example, D, Nimrod, or Rust.

I would suggest reusing Github's own master list of languages, as displayed in the "Other: Languages" dropdown on [https://github.com/trending](https://github.com/trending) .

<comment><USER9> Good idea for a pull request: [https://github.com/andrew/24pullrequests](https://github.com/andrew/24pullrequests)

<comment><USER8> Done: [https://github.com/andrew/24pullrequests/pull/336](https://github.com/andrew/24pullrequests/pull/336)

Does that count as my first day of contributions? :)

</comment></comment></comment><comment> k-mcgrady Just signed up. I've only made a couple of very minor contributions to OSS projects before and want to contribute more. This seems like a good place to start and the fact that it's actually suggested projects based on my known languages is helpful.</comment>


$100 Linux wall-wart launches - <AUTHOR> http://linuxdevices.com/news/NS9634061300.html <comment><USER2> I'd just like to point out how exciting this actually is, because it seems like the reviewers mentioned it but missed the point.

This isn't some vaporware product that some company is geewizzing us with that will likely never get released. The greatness here is that its _completely open_. Not "going to be open when we're done with it". You can download the schematic _now_. You can get a dev kit _built by someone else_ now.

For $99 you can start automating your lavalamps right away. The internet of things starts with the plugs. Tres cool.

<comment><USER3> How will it help me automate my lavalamps? It plugs into a wall socket, but it isn't a wall socket.

It's no different from a hacked Linksys WRT54G or any hacked Linux powered home NAS, except in shape and openness.

And openness isn't a great distinction compared to a hacked Linux powered device, since their closedness has been worked around.

I don't see it as especially exciting - it has no ethernet-over-mains or wireless or switching or any other tech that makes it inherently geared towards home automation, it's just another linux powered print/disk/ssh/web server, isn't it?

<comment><USER2> Its open. That's the greatness. The dev kit is a little lacking but already it has GPIO pins if you wanted to do a relay and a usb port for a $20 spark-fun "usb-whacker" if you're too lazy for gpio.

The point is that with the schematic and the backing of Marvell, it will be easy for relatively small players to add cool innovative features with custom builds. Every time I find a place to buy a WRT54G, its different inside and takes a lot of googling and fiddling to get any linux at all on its _tiny_ flash.

The Linksys WRT54G or any hacked Linux powered home NAS are finished products. This is an exciting beginning.

Note: I actually chose lavalamps as an example while looking at the little usb lavalamp on my desk and thinking about writing a tiny web app for this little box so that I could plug it into the usb port and have a "computer free web enabled lava lamp" anywhere in the house. The simple (usb to) serial commands to make the lamp come on and change colors would be super easy with this little device.

</comment></comment></comment><comment><USER4> If you don't feel like parsing the article:

It's a tiny linux server that plugs directly into the wall like a night-light called the SheevaPlug.

It has:

512MB of DRAM

512MB flash storage

gigabit ethernet

USB 2.0

1.2GHz CPU

Nice little device - I'd love to see how folks plan to use it.

<comment><USER5> It'd be great if it was significantly cheaper, with much lower specs: <128mb RAM, 100mb ethernet, ~300mhz CPU, etc.

As is it's ridiculously overpowered for it's niche, and at $99 it's too expensive to be 'throwaway'.

<comment><USER6> Those specs are pretty similar to a hackable wireless router or a Gumstix. There are plenty of slow embedded devices available already; I like this one _because_ it is powerful.

</comment></comment></comment><comment><USER7> I read that as Wal-Mart launching a $100 Linux-based PC.

</comment><comment><USER8> This is a classic case of a potentially disruptive technology, by targeting a different market from PCs.

I can't see Microsoft or Intel being able to compete in this low-power, low- margin space, but as this device gets more powerful, and even cheaper, it could creep up into their spaces.

</comment><comment><USER9> <http://www.bash.org/?5273>

</comment><comment><USER10> Where is the Wifi? This thing is great, and I have an awesome application for it, but it needs to connect to my home wireless network. ;)

<comment><USER11> There is USB Host so there is always the option of a USB based Wifi card. Not fast but possible.

<comment><USER12> Why "not fast"? USB 2.0 is 480Mbps, 802.11g is 54Mbps.

<comment><USER11> I was speaking from general experience with USB wifi cards. Maybe the hardware just sucked and not the standard. :)

</comment></comment></comment></comment><comment><USER13> Too bad it doesn't natively support homeplug networking:

<http://www.homeplug.org/home>

</comment><comment><USER14> if you'd teleport that thing back two decades you'd be burned at the stake for witchcraft. Simply amazing, that kind of tech in such a package. I'm pretty sure they could make a it lot smaller and cheaper still if the demand is there.

<comment><USER15> No you wouldn't. Go back two decades nobody will be able to tell that the GbE and USB2 actually work -- or even know what you're talking about if you tell them what those two sockets are for -- so the reaction you'd get would probably be along the lines of "ok... so you have a $100 box which plugs into the wall and lights up a red LED?"

<comment><USER16> There's a decent chance that the GbE can fall back to 10Mbps ethernet, just as it can certainly fall back to 100Mbps ethernet. The 10Mbps Ethernet standard was released in 1982 ([http://www.infoworld.com/article/03/05/09/19FEether.sb2_1.ht...](http://www.infoworld.com/article/03/05/09/19FEether.sb2_1.html)), so I'm going to guess that by 1989 there must have been at least one 10Mbps card.

Edit: It occured to me I should check the timeline on 100Mbps ethernet. According to <http://www.broadcom.com/company/timeline/> , the first 100Mbps ethernet product was shipped in 1994, so we're definitely looking at 10Mbps. (Note even if that's off one way or the other by a year or two it doesn't matter for this discussion.)

USB will be a problem, because they'll have to reverse-engineer the protocol, but I'm sure with work they could get it to fall back to a USB1 speed that they could figure out how to work with. The problem there isn't so much the USB as figuring out how to send keyboard events, but even then I bet they could figure it out pretty quickly since I'd lay money the USB keyboard standard is deliberately as close to the old keyboard standards as possible.

However, you are grotesquely underestimating the people of 1989 if you think they're going to be shocked by the idea of a "faster serial port with some defined standards for devices", and you're just factually wrong that they'll be confused by an ethernet port. RS-232 serial ports date back to _1969_ , and survived into the mid-to-late 1990s, for instance.

This is another one of those "there really isn't anything new in computing under the sun" things. It's hard to name an idea that someone from 1989 wouldn't have heard of or understand, they just lack the hardware to experiment with it for $200 1989 dollars.

Have more respect for your predecessors. They were not stupid. They just had much more expensive cycles.

<comment><USER17> You'd have trouble with speed autonegotiation, though. That wasn't developed until 1995 and GigE won't work at all with peers that don't support it.

<comment><USER16> Thank you, good point. Looking at the protocol on Wikipedia (<http://en.wikipedia.org/wiki/Autonegotiation>) it looks very reverse- engineerable with not much work, but yeah, it won't work out of the box.

</comment></comment></comment></comment></comment><comment><USER18> I searched all those product sites and couldn't find any detailed technical specs. The question that interests me is how can I run Debian/Ubuntu on it.

Other than that, the idea is awsome. I've been waiting for somethinng like this for years.

<comment><USER13> [http://www.marvell.com/files/products/embedded_processors/de...](http://www.marvell.com/files/products/embedded_processors/developer/kirkwood/SheevaPlug_DocumentationPackage.zip)

It has instructions on how to install a stripped down ubuntu 9.04 jaunty image onto it.

</comment></comment><comment><USER19> Mhhm add another network connection, install Tor , privoxy and perhaps some other network encryption / clean up tools. Config with sensible defaults et voila: nice userfriendly device to overcome data retention.

</comment><comment><USER20> Very cool. I would love to see this market converge with the Arduino scene to create some very novel uses for interaction. Heck, maybe this is the sort of device that could help launch the "Smart Grid" everyone's getting so worked up about.</comment>


Ask HN: Review my Startup - GitMac: Git, made easy - <AUTHOR> http://gitmacapp.com/ As a long time reader(lurker) of HN, I am excited to finally have something to share with everyone.
After migrating from Subversion (and the excellent Versions SVN client) - to Git, there wasn't an OSX app that made it easy to work with checkouts without using the command line (as much). So we decided to make one.
http://gitmacapp.com/
The product is basically at alpha/pre-beta stage, so any feedback would be very much appreciated. Thanks so much. <comment><USER3> I am very curious to see if something like this gains traction, mostly because I wonder how many developers work like I do.

While I appreciate having repository support in an IDE (Eclipse and TextMate), I still find myself using the command-line most of the time (for Mercurial in my case). It would never occur to me to look for a Mercurial UI. It's just so easy to do this stuff from the command line.

<comment><AUTHOR> Yeah it is definitely a niche product. It's mostly targeted at developers who want a simple one-click way to do the most common actions with local checkouts - add, rm, commit, etc. Or people migrating from a "traditional" VCS, that aren't quite familiar with git commands yet.

"Advanced" functionality - merging, rebase, etc - was purposely left out because that most likely to be done at the command line no matter what.

<comment><USER4> This looks awesome! While I will always prefer a command-line interface over a GUI for tools like this, it's SO important to have really elegant GUI tools for everybody else.

Git is great. The git command-line tools allow you do do all sorts of SCM gymanstics, but are hard to use if you're a designer just trying to commit the latest CSS file and push it out to your integration server.

It would be really awesome if it were possible to have the app call out to shell scripts to perform certain gestures. Many development teams have custom scripts for their workflow, and it would be great if this GUI could easily let folks use that workflow without touching the command-line.

<comment><AUTHOR> Thank for the feedback. That is exactly the void we are trying to fill! Git is awesome, but the functionality can be overwhelming for people at times.

As for the scripting, are you talking about integrating with git hooks, or just plain scripts? I would love to hear more about your idea, email me at firstname.lastname@example.com

</comment></comment></comment></comment><comment><USER5> Looks interesting. I develop on Windows, Mac and Linux platforms. My desktop is Windows+Mac, and I'm currently using TortoiseGit on Windows and GitX on Mac, plus the command-line where necessary or more convenient. I haven't done too much Mac development in the last few months, so this is from memory - <USER2> situation may have changed since.

I would guess GitX is your main competition. GitX is perfectly friendly, and quite useful for staging and making commits on a single development branch, but doesn't exactly have great coverage of the other features of git that I use, so I end up resorting to command-line relatively often. Good for me I'm sure, but it hampers my workflow a little, especially if I have to start diving through docs when I know what I want to do, but need to look up the arguments to do it.

With that said, I'd welcome a more complete Mac Git GUI, and I look forward to tracking your progress, and evaluating your product when possible. Best of luck.

<comment><AUTHOR> Yep, you are spot on. GitX is the best OSX app for Git right now. Though last time I checked the barrier of entry was a little high because there were lots of forks with different features.

For the initial release, we are purposefully not including some of the more "advanced" features, until we get feedback on what's most valuable to our users.

Which tasks are most likely to drive you to the command line?

</comment></comment><comment><AUTHOR> As a longtime HN reader(cough, lurker) I am excited to finally have something to share with everyone.

The reasoning behind GitMac was after migrating from Subversion (and the excellent Versions client) - to Git, there wasn't an OSX app that made it easy to work with checkouts without using the command line (as much). So we decided to make one.

The product is basically in Alpha/pre-Beta stage, so any feedback is very much appreciated. Thanks so much.

</comment><comment><USER6> My suggestions:

figure out a way to integrate it with xcode. The lack of git support is the main reason I still use vim for all of my non-cocoa development.

If this is already done, then congrats, I'm one of your early adopters.

Edit: realized I can't actually try it NOW.

<comment><AUTHOR> Yeah, we are in "pre" Beta state, just taking registrations right now.

As far as Xcode integrations go, I think Xcode 4 actually has Git integrated baked in.

<comment><AUTHOR> Forgot to add, of course, you can open any file/doc in XCode/Textmate/app-of- choice directly from gitmac.

</comment></comment></comment><comment><USER7> This is exactly the kind of program I was looking for a few months ago when I first started doing all of my development on my Mac.

Looking forward to testing this out. Any idea of when you will be ready to release the beta?

<comment><AUTHOR> We are shooting for a October/November Beta Release.

</comment></comment><comment><USER8> G5 owner, here. Is Gitmac UB or Intel only?

And yes, I should have replied to the OP.

<comment><AUTHOR> It's Intel-only, sorry.

10.5 are both 10.6 supported though.

<comment><USER8> Thanks.</comment></comment></comment>


Apollo 11 source code released on GitHub - <AUTHOR> http://qz.com/726338/the-code-that-took-america-to-the-moon-was-just-published-to-github-and-its-like-a-1960s-time-capsule/ <comment><USER2> That code is on GitHub for at least 7 years: [https://github.com/avtobiff/virtualagc/tree/master/Luminary0...](https://github.com/avtobiff/virtualagc/tree/master/Luminary099) (and even longer on Virtual AGC website: [http://www.ibiblio.org/apollo/](http://www.ibiblio.org/apollo/))

</comment><comment><USER3> dupe, prev. discussion: [https://news.ycombinator.com/item?id=12048945](https://news.ycombinator.com/item?id=12048945)</comment>