A collection of things that are Turing-complete by accident (2013) - <AUTHOR> http://beza1e1.tuxen.de/articles/accidentally_turing_complete.html <comment><USER2> Missing from the list is Dwarf Fortress: [http://dwarffortresswiki.org/index.php/DF2014:Computing](http://dwarffortresswiki.org/index.php/DF2014:Computing)

Great when you want to try and create a computer while trying to fend off goblin attacks and zombies.

Technically, it's not Turing Complete, as the "tape" is not unlimited, but other Turing Complete games have the same issue.

<comment><USER3> If you limit Turing Complete strictly to systems with unlimited "tape" then no computer would qualify except arguably if you stream data in and out, but even then it's only acceptable if the universe is infinite.

</comment></comment><comment><USER4> The paper where they build logic gates with BGP is fascinating. Thanks for posting this.

"In this paper, we answer computational complexity questions by unveiling a fundamental mapping between BGP configurations and logic circuits. Namely, we describe simple networks containing routers with elementary BGP configurations that simulate logic gates, clocks, and flip-flops, and we show how to interconnect them to simulate arbitrary logic circuits."

</comment><comment><USER5> >Super Mario World

Okay, with some script...

>Here is a video, where a human (not a script!) creates a playable Flappy Bird clone this way.

Wait, what?!

<comment><USER6> Super impressive. I wouldn't count this as being turing complete. You could say that the SNES itself is turing complete. He successfully got a turing complete machine to run arbitrary code. It was the SNES itself running this code he injected, not some rule engine built into the game. This is much different than getting CSS or HTML to run arbitrary code.

<comment><USER7> Still counts since he managed to create the working method to inject the code which allows the game to be Turing complete. A medium with no way of entering or traveling through it isn't really a medium.

</comment></comment></comment><comment><USER8> > The C preprocessor is only Turing-complete, if executed in a loop, which > feeds the output to the input ad infinitum.

I was momentarily confused by this until I realized there shouldnt be any commas in that sentence.

</comment><comment><USER9> Isn't the bug in Super Mario just exposing the underlying system's Turing Completeness?

<comment><USER10> Yeah, I don't think arbitrary code execution counts as the game itself being "Turing complete".

<comment><USER11> On the other hand, what is "Super Mario World" if not the game as it runs on the SNES?

<comment><USER12> Yeah but it's a different kind of fuckup, designing a system with a vulnerability that lets you "escape" into the underlying machine, and designing a system that, per-se, turns out to be Turing-complete.

</comment></comment></comment></comment><comment><USER13> Also TypeScript Type System: [https://github.com/Microsoft/TypeScript/issues/14833](https://github.com/Microsoft/TypeScript/issues/14833)

</comment><comment><USER14> A nice reminder that not all Turing-Complete things were created equal. Programming anything using these is a nightmare.

(Except maybe the template / type system examples - I hear that's a lot like programming in Haskell)

<comment><USER15> C++ templates are like programming in Haskell _without a type system_ \- all of the pain, none of the gain.

</comment></comment><comment><USER16> It would actually be more interesting if someone made a list of useful systems that _cannot_ perform general computation. Some examples:

(0) Parsers for context-free grammars

(1) Relational algebra, and the subset of SQL that maps to it

(2) Hindley-Milner type inference

</comment><comment><USER17> Someone wrote an article demonstrating that Magic: The Gathering is Turing Complete: [https://www.toothycat.net/~hologram/Turing/HowItWorks.html](https://www.toothycat.net/~hologram/Turing/HowItWorks.html)

</comment><comment><USER18> Another missing is the X86 mov instructor.

[https://github.com/xoreaxeaxeax/movfuscator](https://github.com/xoreaxeaxeax/movfuscator)

</comment><comment><USER19> It's very cool how such a level of computational power is so seemingly easy to reach. I guess it's not surprising if you consider how simple Turing machines themselves are, but I'm always amazed that this is really enough.

<comment><USER20> The problem is exactly reverse: From a security and anaysis point of view, you want languages that do the job with the _least possible power_. And those are surprisingly hard to find.

You start with simple and not too-powerful languages (rules systems, regexes, parsing stuff), note they are insufficient for some real-word use case, add one or two features, and bam!, that mess becomes turing complete.

<comment><USER21> Strongly agree. With more constraints in the language, one gains greater power to reason. This is what the Ethereum creators are learning the hard way. I also think folks would be surprised with how much can be accomplished without Turing completeness. For example, merge sort can be implemented as a simple functional unfold, or "primitive corecursion" in a total language.

<comment><USER22> This is a very common misconception. While Turing complete computational models "suffer" from the halting problem that makes arbitrary "reasoning" uncomputable, that is 1. not quite the problem that makes reasoning hard, and 2. that does not mean that reasoning in weaker models is _feasible_.

1\. What makes reasoning hard is not quite the halting theorem as normally stated, but a generalization of it that's sometimes called "bounded halting", and was used in the proof of the time-hierarchy theorem, possibly the most important theorem in theoretical computer science. Bounded halting _roughly_ states that it's impossible to know in under N steps whether an arbitrary program P would halt when operating on input X in fewer than N steps. A simple corollary also shows the impossibility of generalizing the program's operation from one input to another. In short, this theorem means that it's impossible to know what a program would do for any input any faster than running it for every input. It can roughly be stated as saying that the verification or "reasoning" complexity for a program with a state space S of size |S| is θ(|S|) (where theta is like big-O, except it roughly means "no more and no less than", whereas big-O means "no more than"). Most importantly, _this theorem does not require the programming model to be Turing complete_. For example, it applies directly -- using the same proof -- to programming models that only allow primitive recursive functions.

2\. Even the simplest computational model -- the barely useful finite-state machine -- is already too complicated for arbitrary reasoning. Its verification complexity also happens to be θ(|S|) (but with a different proof than that of the bounded halting theorem), where |S| is usually _at least_ exponential in the size of the program. In general it can _very_ easily be shown that if your programming languages has nothing more than boolean variables and the ability to write loops of length of no more than 2 or, alternatively, it has subroutines even if they cannot be recursive and there are no first-class subroutines -- reasoning is also infeasible (it's PSPACE- complete) and you might as well be Turing complete, as that won't make the worst-case any harder in practice (it makes no difference if the worst case is truly infinite or "just" much longer than the expected lifespan of the universe). The above fact means it is provably impossible to create a programming language -- no matter how limited -- where every program would be easily verifiable. To make a language feasibly verifiable in all/most cases, its state space must grow slowly (polynomially) with program size; this means that not only must the programming model be weak (basically just FSM), but the language exceptionally inexpressive. Regular expressions are pretty much the farthest we can go, and even then some simple questions about regexps are infeasible (such as whether two regexps are equivalent; I believe that problem is PSPACE complete, even though there are heuristic algorithms that work in many instances).

For further discussion and complete results, see my post: [https://pron.github.io/posts/correctness-and- complexity](https://pron.github.io/posts/correctness-and-complexity)

<comment><USER23> You're not wrong when it comes to the theoretical, general case. However, you shouldn't forget that in practice, we're not interested in _every_ possible problem instance. A weaker model often allows for better heuristics.

Take SAT solvers, for example. Since propositional logic encoded in CNF is so restrictive, we can find and implement relatively simple heuristics that solve huge, real-world problem instances in a reasonable time. The same propositional formula can also be represented by a C program which is much, much smaller [1], yet the best heuristic to determine whether the C program outputs 1 for any of its possible inputs, might be to run it once for each input combination (which would take longer than the age of the universe for even 10k variables).

[1] "Proof": the CNF is typically generated from a hand-written program in a practical programming language; therefore, the program represents the propositional formula.

<comment><USER22> > A weaker model often allows for better heuristics.

Do you have any evidence for that? I have not seen this claim made anywhere. The reason is that heuristics apply in cases where the problem at hand can be stated in terms of a lower-complexity problem, and that happens regardless of model. Is there empirical data showing this is happens more often in restricted models? Intuitively, I see no reason why it should.

> Take SAT solvers, for example.

SAT is NP-complete, which is (well, we don't know for sure, but that's the working hypothesis) _much_ easier than even verification of FSMs (PSPACE- complete). We don't have any similar working heuristics for, say, TQBF (PSPACE-complete), and even SAT solvers fail often.

> yet the best heuristic to determine whether the C program outputs 1 for any > of its possible inputs, might be to run it once for each input combination > (which would take longer than the age of the universe for even 10k > variables).

Most autoamtic software verification doesn't work like that at all, but through a process called abstract interpretation which can conservatively project the problem onto a much smaller state space (that is basically one way to look at how type systems work). The beauty of SAT solvers is that they require no such semantic approximations, and appear to work on arbitrarily difficult problems (except when they don't). So far, they work by magic -- we don't know why they're so effective in practice. But the hope of finding such a general algorithm that happens to work on many real-world instances of problems that are _at least_ PSPACE- or 2EXP-hard problems are not great. It all comes down to studying special cases, and I don't see a particularly good reason (and I haven't encountered any research to that effect) for how to make such "good" instances more likely using some restricted language.

<comment><USER23> > _Is there empirical data showing this is happens more often in restricted > models?_

Are you asking for studies? How would you even rigorously define the hypothesis?

> _SAT is NP-complete, which is [...] much easier than even verification of > FSMs (PSPACE-complete)._

So? How does that invalidate my example?

> _The beauty of SAT solvers is that they require no such semantic > approximations, and appear to work on arbitrarily difficult problems (except > when they don 't). So far, they work by magic -- we don't know why they're > so effective in practice._

But that's the point! For real-world problem instances, you'll find that automatically SAT solving a CNF model works much better than applying an automatic theorem prover to the C program that generated the CNF model. That's because in practice, it's easier to design heuristics that work on a propositional formula than it is to design heuristics that work on CNF- generating C programs. If that were not true, then we wouldn't need SAT solver – we'd just run the automatic theorem provers on the C programs that generate the CNF model.

> _I don 't see a particularly good reason (and I haven't encountered any > research to that effect) for how to make such "good" instances more likely > using some restricted language._

And yet it works extremely well in the case of the CNF-generating program vs. SAT solving the generated CNF model. That is a pretty strong argument, you cannot just dismiss it because PSPACE harder then NP.

<comment><USER22> > Are you asking for studies? How would you even rigorously define the > hypothesis?

Preferably studies, but even intuition would do at this point. You don't need to rigorously define the hypothesis, just demonstrate which kinds of patterns susceptible to commonly applied automated reasoning occur more frequently when the same application is written in a TC or non-TC language. The thing is that it's often easy to recognize special cases even in TC languages (e.g., deducing that a function is total in a TC language is easy in those cases where the function resembles those used in non-TC languages).

I'm not saying languages can't make verification easier. For example, recognizing a terminating loop may be a bit easier in a language with `for` loops than in a language that only has a `goto` construct, and a language with less/no aliasing makes local reasoning much easier; I'm saying that that help does not stem from restricting the computational model (just as removing `goto` does not reduce the computational power). Turing-completeness in itself is a red herring when it comes to the question of how languages can help verification.

But I don't understand even the general line of your argument. Even supposing that SATing a CNF formula automatically generated from C is easier than other approaches (it isn't), this does not show that writing CNF directly is more advantageous than writing C. After all, a simple mechanical translation exists, so why should I write CNF formulas if writing equivalent C code is easier?

> you'll find that automatically SAT solving a CNF model works much better > than applying an automatic theorem prover to the C program that generated > the CNF model.

It doesn't, though. Many automatic problems are easier to verify using abstract interpretation than SMT.

> So? How does that invalidate my example?

That a magical 50-year-old algorithm that no one understands to this day happens to exist for the very simplest of intractable problems does not mean that we can hope for similar success for much, much harder problems. When it comes to program verification, SAT (used in SMT) is effective only in a very controlled and limited way (I know because I use formal verification). No one believes SMT solvers could be extended to verify full programs.

<comment><USER23> > _but even intuition would do at this point._

Maybe this example helps: I should be easier to write analysis heuristics for a language that only allows loops of the form "for i = 1...n" than for one which also has while-loops, gotos, and unrestricted C-style loops. Maybe not from a theoretical point of view – after all, both languages are equally Turing-complete – but from a practical one, since there are more language constructs that have to be covered by the analysis. Sure, you can mechanically translate all loops from the second language to "for i = 1...n" loops, but that transformation is not trivial and has to be implemented first.

> _But I don 't understand even the general line of your argument. Even > supposing that SATing a CNF formula automatically generated from C is easier > than other approaches (it isn't), this does not show that writing CNF > directly is more advantageous than writing C. After all, a simple mechanical > translation exists, so why should I write CNF formulas if writing equivalent > C code is easier?_

My point isn't that we should hand-write CNF formulas. What I'm saying is, that automatically solving CNF formulas is easier than automatically solving a C program that expresses the same thing.

Example: a Sudoku solver. Given a partially filled 9x9 matrix,

* ) Program 1 takes as input an assignment for the unfilled fields (free variables). It outputs yes/no indicating whether the input satisfies the Sudoku rules.

* ) Program 2 generates a CNF instance which encodes the Sudoku rules and the partially filled matrix. The variables represent the unfilled fields.

Program 1 and the output of program 2 are equivalent in the sense that they encode the same problem instance, but the CNF generated by program 2 is in a much more restricted language than program 1. You can write a decent (although not state-of-the-art) CNF parser and SAT solver in a few 100 lines of code, but you will be hard-pressed to write even the parser for a general C program in that space, let alone something that can understand C's semantics, an automatic solver using abstract interpretation, and some heuristics to speed things up (only those heuristics are allowed to be somewhat tailored to this type of problem, everything else has to be general-purpose – just like the SAT solver, which is general purpose and has a few heuristics that speed up many practical instances).

<comment><USER22> > It should be easier to write analysis heuristics for a language that

Quite possibly, and that's exactly what I said. Languages may assist formal reasoning (although _how_ is not always clear[1] and your example may or may not be valid -- the transformation in the well-behaved cases may be quite easy; compilers and static analyzers do such analysis all the time), but that's not due to a weakening of the computational model.

> What I'm saying is, that automatically solving CNF formulas is easier than > automatically solving a C program that expresses the same thing.

Right, but as the transformation is mechanical, there is no reason to prefer one language over the other. They're equivalent -- in this particular scenario -- from both a theoretical and a practical point of view. Static analyzers commonly perform transformations -- from the programming language to SMT-LIB and/or using abstract interpretation.

> but you will be hard-pressed to write even the parser for a general C > program in that space

Writing a compiler for Pascal is much harder than writing an assembler. That's not an argument for writing assembly by hand over writing Pascal.

[1]: One example is a pure-functional language like Haskell vs. an imperative one like Java. Well-behaved Haskell allows for equational reasoning while Java "only" allows for assertional reasoning, but the common use of higher-order functions makes some automatic reasoning methods much harder than the familiar and powerful assertional reasoning approaches.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER24> That Minecraft CPU video from the article was amazing. It never would have even occurred to me to make such a thing.

<comment><USER25> With the advent of pistons in the game, people have even added hard drives[0] by using a loop of glass (non conductive) and other blocks (conductive).

[0] [https://youtu.be/q7clz1TPK8o](https://youtu.be/q7clz1TPK8o)

<comment><USER26> More accurately, delay line memory

<comment><USER27> It's not a delay line though. It's linear access, sure, but you can decide when and if to step it.

<comment><USER26> Shame on me for not watching the video then. I (rather short sightedly) though you were referring to a separate implementation that WAS delay line.

That's a significant improvement then

</comment></comment></comment></comment></comment><comment><USER28> Here is the current world record for Super Mario World (Kill Bowser) that was recently set. He does reprogram the game (includes explanation)

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

</comment><comment><USER29> Redstone in Minecraft could be added to the list.

</comment><comment> blubb-fish looks like a really cool - yet expensive - hobby!</comment>


Why strace doesn't work in Docker - <AUTHOR> https://jvns.ca/blog/2020/04/29/why-strace-doesnt-work-in-docker/ <comment><USER2> Interesting. And quite annoying that Docker would disable _ptrace(2)_ within its containers by default.

<comment><USER3> It doesn't if you are running Linux 4.8 or above

<comment><USER2> Interesting. Is this a change in Docker, or a change in the 4.8 kernel? Any idea why?

<comment><USER3> Docker detects a different kernel, and that's a result of what I assume is a bug in Linux prior to 4.8 where you could get around a seccomp filter I believe.</comment></comment></comment></comment>


Ask HN: What are the best books on everything about VC and startup funding - <AUTHOR>

Need to recommend as resource to startups I am consulting. My knowledge is gathered over the years from Internet. What are some of the books you would recommend for a new & budding entrepreneurs looking for a primer on topics - angelist, accelerators, angel funding, VC funding, termsheets, market evaluation, convertible notes, etc etc. A all reference guide, may not deeply cover each of these topics. <comment><AUTHOR> Sorry, in topics I wrongly put "angelists" it should be "angels"</comment>


Gi Bike: The light, full-size, electric, folding bike - <AUTHOR> https://www.kickstarter.com/projects/227461008/gi-bike-the-light-full-size-electric-folding-bike

<comment><USER2> I want this but for that backer tiers you are now competing with other forms of green commuter transportation. (e.g. high performance bicycles, electric scooters, etc.)

The price for being an early adopter I guess.

</comment><comment><USER3> Where I live the two objects most likely to be stolen are bikes and handys... I want an electric bike but the only sort I will consider buying is one which looks old and beat-down and blends in with the crowd.</comment>


Thousands of Industrial Systems Unwittingly Hooked Up to Internet - <AUTHOR> http://blogs.scientificamerican.com/observations/2012/01/24/thousands-of-industrial-systems-unwittingly-hooked-up-to-internet/ <comment><USER2> One of the companies I worked for had control systems where the vendor hooked them up to the internet so that they could provide support if the need arose. They were disconnected, the vendor complained that they wouldn't be able to provide support then. So a specific network was created, these systems put on that network, and then a single firewall/router was configured that could be used with an SSH session to connect to this isolated network.

Its a lot simpler for folks to just connect them to the internet.

And while 10,000 seems like a lot, there are billions of these systems out there. Of course the article would not sound great if someone said .01% of the Industrial Systems installed are connected to the Internet.

</comment><comment><USER3> The central claim by the researcher is dubious: that its easy by a lone attacker to find a 'vulnerable' ICS.

If so, why aren't ICS sabotaged all the time?

</comment><comment><USER4> > If … this many systems have been online without the knowledge of the people > in charge…

...then they aren't in charge. I'm being flip, but do we really need a Fukushima size hacker-induced failure to wake people up.

<comment><USER5> _do we really need a Fukushima size hacker-induced failure to wake people up._

There's no incentive to install the systems correctly or to ensure that they remain secure. It isn't illegal to operate a vulnerable system. A Fukushima- like event won't make a difference. The specter of preemptive financial penalties might give pause, but an accounting after the fact? That only matters _if_ something goes awry.

<comment><USER6> "Criminal negligence" really is a category of crime. If damage is done or lives lost because you failed to take obvious or reasonable measures to avoid it, you can be held criminally responsible for the result. <http://en.wikipedia.org/wiki/Criminal_negligence>

<comment><USER5> _If damage is done...you can be held criminally responsible_

I was very careful to condition my statement. _If_ something happens, then there is a probability of penalty. The current system conditions operators to gamble. The perceived risk of something bad happening is low. So, it doesn't matter what, if any, penalty may be associated with shirking responsibility. Without the risk of damage dramatically increasing or criminalizing the cause rather than the result, the behavior will not change.</comment></comment></comment></comment>


ELIZA researcher stumbles on ITS - <AUTHOR> http://shrager.org/eliza/ <comment><USER2> Cool story. Wrong url. Should be [http://elizagen.org](http://elizagen.org)</comment>


F.lux – It makes the color of your computer's display adapt to the time of day - <AUTHOR> https://justgetflux.com/

<comment><USER2> This is a great tool. One of the first things I install when configuring new OS. I recommended it to my friends and while some of them were skeptical at first they are using it since then.

Linux version of f.lux is called redshift. There is also app made for android but I never used it much.

</comment><comment><USER3> I used this for a couple of months, and then removed it as I found it mostly annoying. I'd much rather have a little utility to manually adjust the tone of my display.</comment>


All targets are moving targets - <AUTHOR> http://www.jacquesmattheij.com/they-are-all-moving-targets

<comment><USER2> Something I've observed as a programmer for the last 20 years: there will always be people who don't want to move on, feel like it's too tiresome to learn something new, and feel like their technology is all they'll ever need to know. It's striking how they'll have heated arguments defending their old dying techniques until their death or retirement. Throw a rock and you can hit such a person, just be sure it's not you. There's a funny and insightful book called Somebody Moved My Cheese, which covers this aspect of the ever changing world. The book only takes an hour or so to read and is quite charming.

<comment><USER3> There's an inverse curve to being the dinosaur who doesn't want to change. When your technology is phasing out its hard to find work, but when the technology is old and crufty and you're one of the few people who know it then you are in demand again.

<comment><USER4> If you're planning on riding that curve, pick your obsoleting technologies very, very carefully. There's plenty of old tech out there which is just plain dead.

</comment></comment></comment><comment><USER5> I agree with the premise and it's a smart article, but the outcomes aren't mutually exclusive. You can recognize imminent change and thus plan for the future while still suing to protect a revenue stream. If it makes economic (both directly or indirectly) sense to sue, people will sue - regardless of future innovations they may or may not have in the pipeline.</comment>


Space and the Y Axis - <AUTHOR> http://www.cleverthingstosay.com/2010/01/28/space-and-the-y-axis/ <comment><USER2> "The enemy's gate is down!"</comment>


Show HN: PHP does Meta Programming too - <AUTHOR> https://gist.github.com/1180947

<comment><USER2> Is it too late to explain to the PHP designers that PHP is a _huge success_ , and that much of the reason for its success is that, for all its faults, it is not over-designed?

I guess the Java envy is strong. But why would I want to read and write ersatz Java, or ersatz Ruby, when I could use the real thing?

<comment><USER3> PHP is neither ersatz Java nor ersatz Ruby, and traits are clearly not in "over design" territory. I can understand people not liking the language but then why do you keep coming back complaining that they add user-requested features to it ... You complain that it damage PHP's simplicity but the truth is that if you don't want to use it, don't use it. NOTHING is forcing you to use it, it uses its own keywords so it won't confuse you or change existing code ... And if someone somewhere wants to use it to do meta programming, I don't see how that affects anyone else's approach to php.

<comment><USER2> _NOTHING is forcing you to use it_

This is the perennial argument of the feature addict, but it isn't really true.

I suppose you can ignore core language features if you never read or fix any code but your own. But in a few years this new stuff is likely to start cropping up in the source code of Drupal modules and Wordpress themes and the PHP frameworks, and if that happens there will be little choice but to deal with it.

The bigger problem is PHP contributor resources. When you add a core feature, that feature needs to be supported forever. The time you spend supporting it is time you could have spent fixing other things. Worse, the effect is nonlinear: Each new feature potentially interacts with all existing features, increasing your surface area for bugs. In extreme cases, you approach an event horizon where you can no longer ship anything.

The painful thing about the latter effect is that it happens even if the new feature almost never gets used. One might end up doing 20% more QA and maintenance to support 0.1% of one's customers.

You are absolutely right in one sense: If one simply abandons PHP altogether one need never deal with it again. The thought has occurred to me. Pity about the hundreds of thousands of existing customers, though.

<comment><USER3> Then I don't understand why you complain about traits, since they are actually _reducing_ the amount of support and code replication everywhere (unless the code using traits is a piece of crap to start with, but then you probably shouldn't depend on that).

Not adding painfully needed features such as traits and closures (which got similar comments before that) just because it would make life harder for those who don't enjoy/want to code in php anymore would in my opinion be a bad thing.

</comment></comment></comment></comment><comment><USER4> I have one foot in each of the PHP and Ruby camps.

As a bit of an exercise I went through and did the equivalent in Ruby (implement a class, test adding properties and methods) just to see how it'd look: <https://gist.github.com/1183334> (Slimmed down versions of both came to 118 and 50 lines for PHP and Ruby respectively.)

I'm happy Traits are coming to PHP, but given I haven't yet been able to use any _PHP 5.3_ features in any production environment outside of hobby projects, I'm awfully glum about the prospect of being able to make use of them any time in the next couple of years.

<comment><USER5> coming from a lisp background, and now working on a 'mid-sized' php CMS, i've been pretty happy with the reflection and other features (dunno if they are 5.3 or not) like closures to build something which has around methods, reflectioning on the docstrings to generate a REST api, etc...

good fun indeed, you still have to be aware of a lot of php quirks though to make your code secure.

<comment><USER6> Closures are new in 5.4, but the reflection api has been there since 5. Indeed, PHP may not be pretty, but it's really good at hacking stuff together that just works. A lot like shell scripting, although much more maintainable.

My biggest beef with PHP is that there is such a chasm between the procedural style at the object oriented one. This is mostly caused by PHP adopting a static class model (a really odd choice for an otherwise highly dynamic language). On the plus side, this tends to cause fewer surprises than you see in languages with a more dynamic object model.

<comment><USER3> Closures came with 5.3

<comment><USER6> Sorry, you're quite right.

</comment></comment></comment></comment></comment><comment><USER7> Thanks! Didn't know about traits [ <http://php.net/manual/en/language.oop5.traits.php> ].

<comment><USER8> I've started collecting some useful methods from classes and am turning them into traits. You can see the work-in-progress here: <https://github.com/dave1010/php-traits>

</comment></comment><comment><USER9> I heard about this recently too. All to avoid the design error of not allowing multiple inheritance, along with other design errors of not having a proper OOP system such as Python's, Ruby's, Perl's, or CLOS. I work with PHP pretty frequently and I like the language for what it does well, I might even use Traits when 5.4 is the new 5.2, I just can't get excited about features other languages have had for a long time. (I guess I've become a Lisp snob or something even though I don't use Lisp all that often. [ see <http://news.ycombinator.com/item?id=941740>; I'm more or less in agreement with jerf.])

<comment><USER10> I'm a perl advocate, but isn't saying it has a "proper" object system pushing it a bit? Perhaps you're talking about Moose?

<comment><USER9> Yeah, I was thinking of Moose. Since I said CLOS I should have said Moose to be consistent!

</comment></comment></comment><comment><USER11> nice I think theres room for a small improvement. change $this->{$property} to $this->properties[$property]

see my fork.

</comment><comment><USER12> This is awful.

</comment><comment><USER13> Oh god, no! If they rather fixed the eye-stinging bugs instead of creating other hundreds of them.

<comment><USER14> I work with PHP daily and do not know of what you speak. Haters be hatin', but your 'eye-stinging bugs' are unknown to me. Care to provide some examples?

You are probably referring to the mountains of crappy PHP code? About the inconsistent order of 'haystack' and 'needle', or the lack of a common policy on whether or not to use a underscore as separator? Those are valid complaints, but no argument against improvement of the language. On the contrary, I would say.

<comment><USER15> I think he's referring to bugs such as breaking crypt() when using an md5 hash as a salt, and other things of that nature.

<comment><USER6> That was fixed pretty fast though (Notwithstanding that it shouldn't have happened in the first place, but hey)

<comment><USER15> Sure, but when a bug like that occurs it gets "mainstream" press and PHP haters everywhere add it as part of the book of "Ugh, PHP Y U So Horrible?"

<comment><USER15> downvoters: If you disagree, at least tell me why...</comment></comment></comment></comment></comment></comment>


Show HN: Hackers.tv – Tutorial Videos for Beginners - <AUTHOR> http://www.hackers.tv/

<comment><AUTHOR> Hey everyone, i was working on this days in www.Hackers.tv the idea is to collect the best Tutorial for Beginners, i am looking for really good tutorials, could you recommend anyone?

I built this because i am trying to learn for myself and many of the tutorials are paid tutorials on Udemy, Lynda and others... and the only way to find the free ones is searching on Youtube. Thanks for your feedback!</comment>


CVE-2019-8912: Use After Free Vuln in All Linux Kernels Up to 4.20.10 - <AUTHOR> https://nvd.nist.gov/vuln/detail/CVE-2019-8912 <comment><USER2> Dup. [https://news.ycombinator.com/item?id=19210727](https://news.ycombinator.com/item?id=19210727)

<comment><USER3> Yeah but this link is better.

</comment></comment><comment><USER4> Can Rust prevent such bugs?

<comment><USER5> Yes.

The bug itself is a classic case of faulty management of ownership. The Rust compiler won't compile such code.

</comment></comment><comment><USER6> This appears to have been discovered by the syzkaller fuzzer.

</comment><comment><USER7> > In the Linux kernel through 4.20.11

Perhaps mods should update the title for the benefit of those who only browse headlines?</comment>


Proof of 'God particle' found - <AUTHOR> http://hosted.ap.org/dynamic/stories/E/EU_SWITZERLAND_GOD_PARTICLE?SITE=AP&SECTION=HOME&TEMPLATE=DEFAULT&CTIME=2012-07-02-09-27-46

<comment><USER2> 99.99% sure they found it is good enough for me</comment>


Ask: What is most significant pillar of your Startup? Team, Product or Market? - <AUTHOR> <comment><USER2> The tech stars folks think team is most important: [https://www.codementor.io/startups/tutorial/investors- look-s...](https://www.codementor.io/startups/tutorial/investors-look-startup- projects-open-qa-techstars-founder-david-cohen)</comment>


Replacing MailChimp, Disqus, and HubSpot with a Simple CRUD - <AUTHOR> https://volument.com/blog/the-power-of-simple-crud <comment><AUTHOR> > SAAS industry has fooled us to believe their products are amazing and take > years to build. Not true at all. It didn't take us long to replace them with > a simple CRUD. Better yet: our unified system is way more powerful.

Nice.</comment>


A list of queueing libraries - <AUTHOR> http://queues.io/ <comment><USER2> He didn't mention IBM WebSphere MQ or Oracle Tuxedo that have being used in complex scenarios before the products in the list.

I would add my implementations and resources, even if they were for educational purposes:

i) Persisting Native Python Queues: [http://blog.databigbang.com/persisting- native-python-queues/](http://blog.databigbang.com/persisting-native-python- queues/)

ii) Adding Acknowledgement Semantics to a Persistent Queue: [http://blog.databigbang.com/adding-acknowledgement- semantics...](http://blog.databigbang.com/adding-acknowledgement-semantics-to- a-persistent-queue/)

iii) Esoteric Queue Scheduling Disciplines (an essay about a new kind of queue): [http://blog.databigbang.com/esoteric-queue-scheduling- discip...](http://blog.databigbang.com/esoteric-queue-scheduling-disciplines/)

iv) Using Queues in Web Crawling and Analysis Infrastructure (just informative): [http://blog.databigbang.com/using-queues-in-web-crawling- and...](http://blog.databigbang.com/using-queues-in-web-crawling-and-analysis- infrastructure/)

</comment><comment><USER3> No Celery, no RabbitMQ, but 0mq, i don't know if i should take this seriously..

Just putting some google search hits on a dedicated website, aren't we?

</comment><comment><USER4> I've always found having to deal with background workers a pain in the butt. Not only do you have to set up additional servers (queue and worker servers), but also you run into problems as a result of your own naivety--such as not using a connection pool for workers so the startup time is too slow, or using a library that doesn't handle timeouts. Also, I find that I have little visibility into the queuing throughput, or if I chain jobs for workers (result of one worker goes to another worker), I have no idea if the data made it all the way through.

Does anyone else find it a pain, or just me?

Also, has anyone ever tried workers as a service, like iron.io? Are there others, and was it worth it?

<comment><USER5> Amazon Simple Workflow might help: [http://aws.amazon.com/swf/](http://aws.amazon.com/swf/)

Personally, I use queue_classic + postgres triggers to keep track of each of the job history. So I have a history of all the jobs, when they started, when they finished, the data in each job, etc.

But yes, it's a pain.

[http://torquebox.org/](http://torquebox.org/) is supposed to help with the pain of managing background jobs (and lots of other things) for Rails applications.

</comment></comment><comment><USER6> Here are more: [https://en.wikipedia.org/wiki/Message_queue#See_also](https://en.wikipedia.org/wiki/Message_queue#See_also)

[http://web2.uwindsor.ca/math/hlynka/qsoft.html](http://web2.uwindsor.ca/math/hlynka/qsoft.html)

Man, wish I had time to help you complete it, I have crawled the web thoroughly harvesting all worthy message queues, but my bookmarks are so unorganized because I used to have all important stuff in Chrome, which really has ZERO support in organizing things. Once you bookmark something, it's gone, except it's in your bookmark bar.

Then I switched to Firefox, which has better support for organizing things, starting with Tab-Groups, Tags for Bookmarks etc. unfortunately it's not helping to organize bookmarks too. Importing all chrome bookmarks leaves me with an unmanageable task of sorting things.

<comment><AUTHOR> I had the same problem and that's why I've created this page. If you'll find something useful in your bookmarks, I'm open for any contribution, just send PR or create issue. Thanks!

</comment></comment><comment><USER7> What about HornetQ[1]? Qpid[2]? OpenMQ[3]? OpenJMS[4]? JORAM[5]?

[1]: [http://www.jboss.org/hornetq](http://www.jboss.org/hornetq)

[2]: [http://qpid.apache.org/](http://qpid.apache.org/)

[3]: [http://mq.java.net/](http://mq.java.net/)

[4]: [http://openjms.sourceforge.net](http://openjms.sourceforge.net)

[5]: [http://joram.ow2.org/](http://joram.ow2.org/)

</comment><comment><USER8> I like the idea of having a page listing all libraries regarding a certain topic. What's the advantage of a github + Rails solution has over a wiki page?

<comment><USER9> I'm not too familiar with Rails, but it looks like this is actually a static site generated with Ruby and hosted on s3.

</comment></comment><comment><USER10> I'd put redis up there too, with their blocking pop and pub/sub it's really usable as a queue.

</comment><comment><USER11> You should add RQ in there! [http://www.slideshare.net/sylvinus/why-and-how- pricing-assis...](http://www.slideshare.net/sylvinus/why-and-how-pricing- assistant-migrated-from-celery-to-rq-parispy-2)

</comment><comment><USER12> More useful than a comprehensive list of all queuing libraries would be a comparison of the best ones with tl;dr summaries of how each works, pros & cons of each approach, and some consistent benchmarks.

</comment><comment><USER13> I've always liked beanstalkd, unfortunately it still has no authentication support so you're unlikely to see it catch on in the PaaS environments any time soon (unless someone hooks SASL into it).

</comment><comment><USER14> For this to be useful it really needs to be groupable by programming language.

And why it needs it's own domain/website instead of just a wiki page somewhere I do not understand.

</comment><comment><USER15> Looks like this is getting updated, so... No ActiveMQ?

<comment><USER15> Also, MSMQ while I'm at it.

<comment><USER16> IBM WebSphere MQ

</comment></comment></comment><comment><USER17> I think OP's motivation may involve [http://xkcd.com/853](http://xkcd.com/853).

</comment><comment><USER18> no [http://www.celeryproject.org/](http://www.celeryproject.org/)?

<comment><AUTHOR> It was never on my radar. I'll search around for some resources about it. Thanks.

Site is open sourced, feel free to send PR with missing things - [https://github.com/strzalek/queues.io](https://github.com/strzalek/queues.io)

</comment></comment><comment><USER19> I hate to be the one that says this, but MSMQ is missing.

</comment><comment><USER20> Doesnt specify which language lib is coded in.</comment>


Show HN: Unofficial Facebook Messenger app - <AUTHOR> https://github.com/sindresorhus/caprine <comment><USER2> Why would someone use this over the official Facebook Messenger app?

<comment><USER3> I don't think he's trying to sell this as something that's better. He could be showing his project probably to receive comments/feedback/critique.</comment></comment>


The laser light that could cut cyclist deaths - <AUTHOR> http://edition.cnn.com/2013/09/13/tech/the-laser-light-that-could-cyclist/index.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+rss%2Fedition_technology+%28RSS%3A+Technology%29 <comment><USER2> There was a previous discussion of this, I'll see if I can find it. Main issues were that laser was of an illegal wattage, and the drivers look in their rear view mirrors for lights at mirror level, not on the floor/road.

Looks good but in the real world has limited use. If the road has bright streetlights then the laser is nearly invisible on the ground, and if the driver can see the laser beam directly, well that is a serious danger.

</comment><comment><USER2> Previous discussion of the light [https://news.ycombinator.com/item?id=4842109](https://news.ycombinator.com/item?id=4842109)</comment>


World's oldest person Emma Morano dies at 117 - <AUTHOR> http://www.bbc.com/news/world-europe-39610937 <comment><USER3> My grandpa who still legally drives turned 100 last year. He loves to eat meat (rare to raw), rich foods, and wanted to share with me his stash of liver pate in the refrigerator on my last visit. When I asked him about how he could hook me up to connections while he bragged about his successes he replied "They're all dead!!!". He's said that happiness is a racket and myth; that success is different for each person; that you should never say you are sorry; that you should put your track shoes on early, run like hell, and never look back. There's more. But I think, the long-lived, are not the best sources of information on how to live long.

<comment><USER4> You're not wrong, but I bet their genes are.

<comment><USER5> It's a simple two-step process:

1\. Have good genes.

2\. Don't have bad genes.

If I can do it, everybody can!

</comment></comment></comment><comment><USER6> Her diet of only 3 eggs and some biscuits a day, made me wonder if any of her longevity can be credited to having a severely calorie restricted diet [0]. Assuming that's true that means she was probably ingesting 600 calories a day or less.

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

<comment><USER7> I doubt it. In my experience the elderly tend to have weird diets, especially towards the end. I'm guessing it's due to a bunch of factors: trouble chewing/swallowing means eating is more of an ordeal, reduced need for calories because of reduced physical activity, and reduced sense of taste and smell makes eating unrewarding. My great grandmother spent her last year or two subsisting almost entirely on Kit Kat bars. We used to joke she could have appeared in a commercial for them, implying the Kit Kat bars were the reason for her longevity (she was 98).

<comment><USER8> She ate this way for 90 years so it sounds like her motivation wasn't lack of teeth or being old. I'd suggest reading the article before making conclusions.

<comment><USER9> The article doesn't say this at all. It says that she used to eat more eggs - 3 raw, plus an omelette at lunch and chicken at dinner. She had cut down to 2 raw eggs a day and had added in some biscuits.

The poster could easily be correct.

<comment><USER8> It seems you are also having trouble reading the article so let me paste a quote directly from the article to help you:

"But it was also down to a rather unusual diet of three eggs - two raw - <USER2> day for more than 90 years."

I'm not sure how else to interpret this statement.

<comment><USER9> You should read further. It goes on to say the rest:

It was a regime she took up as a young woman, after the doctor diagnosed her with anaemia shortly after World War One. She had cut down to just two eggs a day, and a few biscuits recently. Her doctor of 27 years, Carlo Bava, had told AFP news agency that she rarely ate vegetables or fruit. "When I met her, she ate three eggs per day, two raw in the morning and then an omelette at noon, and chicken at dinner."

I did misquote the number of eggs, but not the fact that she had cut down on the amount she was eating.

</comment></comment></comment></comment></comment></comment><comment><USER10> Imagine being a person so old that all people on earth ~7 billion people are younger than you.

<comment><USER11> Well, at some point in time, _everyone_ was once so young that everyone else in the world was older than them.

<comment><USER12> Ok, but very few people are ever older than everyone else.

<comment><USER13> Statistically there has to be one at any point in time :)

</comment></comment></comment></comment><comment><USER14> 117\. I can't even imagine that span of time. Seeing fashion change must annoy you. "Damn hipsters, we did that in the 20s!"

<comment><USER15> I think you withdraw after a time and become deeply cynically. For her trump, stalin, mao, the duce, hitler, the italian king.. it must all look like endless repetitions of the same boring theme, broken by endless promises of learning from past mistakes. All your friends are gone- only you - the relic dwell on. Even your sons and daugthers are dead. The lonesome george of mankind.

One of my ancestors comes from a Italian mountain village near Lago di Garda. Those villages are very poor, but also fascinating. They did a study on longevity and health - in which they found that farmers whos field would run up the mountain and down the mountain lived longer then farmers who fields did not have such height difference.

<comment><USER16> Mao - 40,000,000 [http://necrometrics.com/20c5m.htm#Mao](http://necrometrics.com/20c5m.htm#Mao)

Stalin - 20,000,000 [http://necrometrics.com/20c5m.htm#Stalin](http://necrometrics.com/20c5m.htm#Stalin)

Hitler - [https://en.wikipedia.org/wiki/The_Holocaust#Victims_enumerat...](https://en.wikipedia.org/wiki/The_Holocaust#Victims_enumerated)

Trump?

Yea, I'm sure she thinks Trump is as bad as the 20th century's most brutal dictators.

I'm sure she doesn't think the millennial's who think this are embarrassingly and shamefully naive and exaggerating, if the word exaggerating even captures the absurdity well enough.

<comment><USER17> The parent you're replying to did not draw conclusions, merely talked about patterns. Kinda like I see a pattern in you, within 48 hours, defending climate change denial, religious oppression and now Trump.

Humans do that - they look at the world and see patterns all the time. Some people are worse at it than others.

<comment><USER18> The weak "you've stated opinions of the wrong tribe in other discussions, therefore nobody should believe you" character attacks are a boring waste of time. Please respond to the comment at hand; digging through post history to find character attack material really isn't great on multiple levels.

<comment><USER17> I didn't say "nobody should believe" the poster, I said I'm seeing a pattern. And I didn't have to dig deep, it's quite literally the last three comments the poster made.

When I'm replying to someone, I very often look at their other comments. It gives me more context about who they are, how they think, and more often than not leads me to other interesting articles. It's an exercise I recommend.

<comment><USER19> Absolutely fair - but to bring up their past comments in a debate you're having with them is extremely tacky, in my opinion.

Part of the reason discourse on this website is considered so much better than reddit is that it's generally considered poor form to dig through users past comments.

</comment></comment></comment></comment></comment></comment></comment><comment><USER20> Fun fact: The population of the world grew ~5x in her lifetime, from ~1.6B to ~7.5B.

<comment><USER21> Terrifying

</comment></comment><comment><USER22> So I'm guessing this means we are officially out of people who were alive before 1900.

<comment><USER23> Given that it is 2017 I'd say that's a pretty good guess.

</comment></comment><comment><USER24> It's crazy to think how different the world looks today than it did 117 years ago.

It's even crazier to speculate what it will look like in 117 more.

<comment><USER25> At least we know that Halley's comet passes Earth that year (2134).

</comment></comment><comment><USER26> And that's the last of the 19th century people.

<comment><USER27> Technically, the new oldest person was born in the nineteenth century: Jamaican Violet Brown, who was born on March 10, 1900. And presumably, there may be others alive who were born before the twentieth century began 1/1/1901.

<comment><USER28> Yeah, we all remember the worldwide celebrations at the turn of the last century, 2001-01-01.

<comment><USER27> Some people who had to work 1/1/00 or were on call (e.g. for Y2K) did in fact celebrate the _technical_ new millenium a year later. Probably a few pedants did too.

</comment></comment></comment></comment><comment><USER29> How would you calculate the average time between deaths of the currently oldest person, assuming a constant population and constant max age?

<comment><USER30> [https://math.stackexchange.com/questions/349155/how-often- do...](https://math.stackexchange.com/questions/349155/how-often-does-it- happen-that-the-oldest-person-alive-dies)

<comment><USER31> That's a rabbit hole I'll be digging up now. It was quite interesting. There should be a dedicated website for such obscure things. Reddit helps but doesn't cover a lot of ground.

</comment></comment></comment><comment><USER32> The world's oldest person is dead. Long live the world's oldest person.

<comment><USER33> This is pretty solid, and actually makes more intuitive sense than the King version.

<comment><USER34> I'd say it makes very little sense. You can say "long live the world's oldest person" all you want; everyone realizes it's not going to happen.

<comment><USER35> that's the point.

</comment></comment></comment></comment><comment><USER36> The world's now oldest person Saro Dursun - born 1899 june 01 - lives in Västerås Sweden.

Public record of age: [https://www.ratsit.se/18990601-Saro_Dursun_Vasteras/qEQWdEbn...](https://www.ratsit.se/18990601-Saro_Dursun_Vasteras/qEQWdEbn2DOKjdDtknCxSpTL76FroMz0ht50iQNqjKE)

<comment><USER37> Now I'm confused. Emma Morano who was the oldest person alive, was born in 29 November 1899 according to the article. Is the article wrong?

<comment><USER38> No, Saro Dursun is a fraudster. I don't remember all the details but she Imigrated to Sweden in the 60/70s with another persons papers stating she was 65+ when she was in fact 40-something. 65 is the retirement age in Sweden...

</comment></comment></comment><comment><USER39> She didn't leave her apartment since she was 97. That is truly amazing. I can't stand mine for more than a couple days.

<comment><USER40> It sounds like she spent 15-17 by herself too (article says she only recently got care). I can't imagine what that isolation would be like.

<comment><USER41> It is liberating.

</comment></comment></comment><comment><USER42> "World's oldest person" sounds like such a depressing title to have. Most people don't hold the title for even a year, with Jeanne Calment being the exception.

<comment><USER43> It is one I would not mind having. Sure your future life expectancy is not great, but the journey getting there is not bad.

</comment></comment><comment><USER44> Damn, she was able to see the first flight of an airplane (1903), and the first successful return and relaunch of a rocket (2017) within one lifetime.

<comment><USER45> >>Damn, she was able to see the first flight of an airplane (1903)

Well, no... She was alive during it, but remember they didn't have television back then. ;)

<comment><USER46> Also, she was four.

</comment></comment></comment><comment><USER47> Dang 117 years. I remember reading an article about her birthday last year. Rest in peace.

</comment><comment><USER48> One more datapoint for the cliff at 120. No supercentennials are able to pass that age...

<comment><USER49> Except Jeanne Calment, who made it to 122

<comment><USER48> The cliff is obviously with some statistical error.

</comment></comment></comment><comment><USER50> World's former oldest person _

</comment><comment><USER51> You know this headline shows up every year or so - dying seems to be something that world's oldest people keep doing - it's probably time we stopped being surprised ...

<comment><USER52> I do know that people keep dieing. I haven't seen anyone surprised about this though. Is that really a thing that happens often enough that you need to call a stop to it?

</comment></comment><comment><USER53> Trying to understand why someone lived this long is something of a pointless endeavor. It is random chance, plus a little genetics. If genes double your odds of making it past 100, then that is still 2% odds for people reaching that age now. By 117, with ~50%+ yearly mortality past 110, well, the odds are not good whatever your diet and past lifestyle might have been.

Running around analyzing the genetics of supercentenarians isn't really all that useful from the point of view of making people live longer. Doubling a tiny chance is still a tiny chance, and their longevity has a lot more to do with randomness than with anything else.

Perhaps more interesting is asking why these people die, what are the causes. Different ages are characterized by a different prevalence of disease; cancer hits a maximum mortality rate and then fades as a major cause in the oldest old, for example. From the few autopsies performed, supercentenarians appear to predominantly die of senile systemic amyloidosis, a clogging of the cardiovascular system with misfolded transthyretin that appears to play a lesser role in heart failure in younger old age.

If we want to ask why human life span seems to have a rough upper limit (though 50%+ yearly mortality for any combination of causes is going to look a lot like a hard limit when stretched over 20 years), then this form of amyloidosis seems to be one of the places to look.

Interestingly, this form of amyloidosis has an inherited version that shows up in young people, so despite the institutional reluctance to work on medicine to treat the causes of aging, there are actually a number of therapies in development and trials, some of which can selectively remove this form of amyloid. At some point the research community will wake up to this form of amyloid being a contributing cause of heart failure (a process underway judging by recent papers on the topic), at which point we might well see a leap in the observed upper limit to human life in the decades following more widespread use.

<comment><USER52> _It is random chance, plus a little genetics._

Looking at the top 43 oldest people alive [1] I can see that 20 of them are from Japan. That's almost 50%! While not conclusive proof, I think it at the very least heavily suggests that living long isn't about random chance. Whatever is going on in Japan seems to be working very well.

\--

[1] [http://www.grg.org/SC/WorldSCRankingsList.html](http://www.grg.org/SC/WorldSCRankingsList.html)

<comment><USER54> Japan has a higher standard of living.

<comment><USER55> Japan didn't 70+ years ago.

<comment><USER54> Actually they got pretty wealthy pretty quickly after the war.

<comment><USER55> Yeah but they spent the first 40 years of their life with a lower standard.</comment></comment></comment></comment></comment></comment>


Dutch Court Rules WiFi Hacking Not a Criminal Offense - <AUTHOR> http://yro.slashdot.org/story/11/03/19/0152226/Dutch-Court-Rules-WiFi-Hacking-Not-a-Criminal-Offense

<comment><USER2> I've used to do that, not to gain anything, but rather I was curious as to who my neighbors are. So I met this guy at the elevator, whose facebook page I've seen using firesheep. I said to him "So your name is Eduardo, right?" which scared him a little bit, but then I invited him over for a beer and explained everything and showed him how to use VPN to protect his traffic.

However, I would rather prefer it to be impossible for anyone to hack your traffic over wifi, because it would make everyone's life easier and safer.

</comment><comment><USER3> i didnt even know u could do that. just wait untill their wifi is hacked we see wat they say...</comment>


Ask HN: How to get a general tech background? - <AUTHOR>

I have been in the IT industry for years as a non-technical, BA, PM and now manager. While I understand things at a really general level, I still struggle with basic technical knowledge gaps. What would be the best way to approach self-directed learning for overall IT development, from infrastructure/networking through basic programming languages and approaches through web technologies. Just something to have a comprehensive, if not super deep, understanding of the whole picture. Is it better to start from the foundations of infrastructure or move from understanding applications (object-oriented design, java..etc) and then onto how things work together? <comment><USER2> If you want to get your feet wet, spin up a virtual machine with something you want to get to know, and do stuff with it. Build things manually and learn how they all fit together, then try to repeat the process with automation. Through that, you can build a development environment that you know in and out, which you can then build upon using whatever technology/framework/language you decide on using.</comment>


Recovering Censored Text Using Photoshop and JavaScript - <AUTHOR> http://tlrobinson.net/blog/?p=52

<comment><USER2> This is some really slick hacking.</comment>