Ask HN: Who is the best libertarian hacker you know? - <AUTHOR> To: All talented hackers looking to build a startup with a libertarian mission. CC: All people who know such people (please forward this post).
I recently acquired the domain name judge.me and want to build an online court system, or more precisely, online judging market place (i.e. we build the market place, not the service).
I'm looking for a libertarian technical co-founder. Below I summarize the philosophy of this idea, my background and what I'm looking for in a technical co-founder.
The philosophy behind this idea is that "incentives change the world, technology changes incentives". Specifically, by building a market place for arbitration, we want to incentivize people to not use the government courts, lowering support for a democratic monopoly on justice along the way (but not explicitly). Think of it as building the 21th century equivalent of building the place where common law judges can hold their hearings and judge their cases.
My background is in strategy consulting but I consider myself an economist. I am well read in the relevant complexity theory and philosophy of law to the point where a philosophy of law professor told me my thinking on this topic is worthy of starting a phd. In short, I think I have the "incentives" part covered. I'm also learning Ruby on Rails and the related concepts (OO, MVC, TDD, CRUD, ...) so I can understand and help out the technical co-founder as much as possible.
The ideal technical co-founder loves to "think in technology", i.e. knows and can communicate all consequences and trade-offs in using certain technologies and methodologies. I'm currently leaning to building the site in Ruby on Rails and its related technologies, but ultimately this is to the technical co-founder to decide. Also, the co-founder should have an interest in libertarian thought, so the macro-economic consequences of what we'll be building are clear (and very motivating!) when I explain them (and we discuss them!). Last but not least, this person should not be under any contract that gives away the IP of the work (s)he does for judge.me.
If interested, please leave your contact details below so we can have a Skype video chat about this idea. When we decide to join forces, the goal should be to build a MVP as soon as possible, get feedback from the libertarian community and apply for YCombinator when we start to get traction.
If you know somebody who could be interested, please forward this post.
Hopefully this request will be the start of something beautiful. I honestly believe this idea can change the world and hope you do too.
Kind regards, PJ <comment><USER2> Mondo righteous! I'd love to offer to help, as I am _very_ much a Libertarian (anarcho-capitalist, voluntaryist, market anarchist, whichever term you prefer), but I'm too tied up with projects now.

I'll definitely be a very interested spectator though, and will be rooting you on. I'd love to see this happen.

Edit: shared this link with all my Facebook friends, many of whom are Libertarians and at least a few of whom are hackers.

<comment><USER3> Same here. Loved the idea though!

<comment><AUTHOR> Hi Howard, can I contact you to be a beta user when we launch the MVP?

Thanks!

</comment></comment></comment><comment><USER4> Well, maybe ESR is free... =)

<comment><AUTHOR> Thanks for the tip, I'll ask ESR to consider this idea!

<comment><USER4> You're welcome! Actually I was a bit reluctant to answer "ESR". While he's surely the best libertarian hacker who's work I know of, he's also very high profile and therefore quite possibly busy. Best of luck!

</comment></comment></comment><comment><USER5> I'm almost certain I don't have the time to be a co-founder, but I'd love to contribute.

My email address is in my profile. If you're not inundated with offers, drop me a line.

<comment><AUTHOR> I'm going to shoot you an email right now.

</comment></comment><comment><USER6> PJ -

Would you mind dropping me a line? I am very interested in the idea, and would like to contribute. My contact information is on my user page.

<comment><AUTHOR> Mail sent - Look forward to talking to you!

</comment></comment><comment><USER7> I couldn't get my head around the idea. Can you please give an example case of this service's usage?

<comment><AUTHOR> You have a dispute with someone (small claim, divorce, ...). Instead of going with the gov't court you open an arbitration case on judge.me where you ask some internet user(s) to judge you. You agree to stick to the ruling, if not your public profile will mention that unwillingness and you won't be able to use judge.me again (social coercion) in disputes with anyone who "follows" the judges you ignore.

This is called kritarchy, rule by judges. The basis for this is not "law" by force, but voluntary cooperation so you don't get excluded from the community (subcommunities). The judges are the community leaders, what we today call politicians. The judges themselves compete for the arbitration cases by their price/efficiency/ideology, and whatever "market outcome" is the result of supply and demand becomes the "common law".

I expect most people not to accept certain judges. E.g. I would ignore a ruling by a communist judge that they can use my car and would prefer to be excluded from the communist communities. If the entire world would operate like this you'd get "polycentric law", i.e. instead of battling with promises of how good your ideology is in elections you compete with the results (standard of living) your ideology provides in practice.</comment></comment>


Smalltalk resurgence - <AUTHOR> http://www.cincomsmalltalk.com/userblogs/buck/blogView?showComments=true&printTitle=Smalltalk_resurgence&entry=3393004137 <comment><USER2> I think there's a growing trend towards awareness of multiple languages, and Smalltalk may be seeing a share of that. For whatever reason, developers are starting to be (a little bit) more open to expanding their language horizons.

<comment><USER3> I definitely agree. Nice to see that smalltalk is still being used. I haven't worked with it for over 20 years and predicted it's demise back then even though I thought it was a very powerful and useful language. Fortunately I was wrong.</comment></comment>


The World Beyond Batch: Streaming 101 - <AUTHOR> https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101 <comment><USER2> Serious question, isn't the stream just batch in transit?</comment>


Build a Custom-Printed Circuit Board - <AUTHOR> http://spectrum.ieee.org/geek-life/hands-on/build-a-customprinted-circuit-board <comment><USER2> I can recommend ExpressPCB, PCBExpress, and Sierra Circuits ProtoExpress ( <http://www.protoexpress.com/> ) here. ProtoExpress, in particular, was pretty good in terms of price, specs (minimum trace/space, hole size, ability to do 4-layer boards), and turnaround time. If you want to do something super- simple, ExpressPCB (<http://www.expresspcb.com/>) is a PCB prototyping house that has their own free Windows CAD tool you can use. You can only use designs from that tool with them, but they have at least been around a few years, and should suffice for many simple, low-volume projects.

</comment><comment><USER3> If you're paying $75/each for PCBs, even in hobbyist quantities, you're paying too much. I even wrote a calculator, it is handy!@ <http://www.ladyada.net/library/pcb/costcalc.html>

<comment><USER4> Looks useful -- how about extending the calculator with a four-layer option? That's where things start to get pricy, it seems.

</comment></comment><comment><USER5> Cool! MOSIS (<http://en.wikipedia.org/wiki/MOSIS>) for PCBs.

Although I remember fabricating a couple in the '70s by hand, although not hardly as fancy or with such fine details (you lay out your pattern on the board with stickers and/or a pen of the right sort and then bathe it in an etching solution that removes the copper that's not covered).

I think some people are also doing 2 layer boards using milling machines to remove the copper.

<comment><USER6> Yeah, you can still do pretty well nowadays with photo-etching pre-sensitized boards. Here's Abe Lincoln (and a legitimate circuit) I did a while back: <http://i.imgur.com/PyLyn.jpg>

And PCB isolation routing! I've tried it with broken drill bits as mills and the Eagle to G-code software. It worked ok but I couldn't figure out DIY solder masks.

</comment></comment><comment><USER7> I've had good experiences with Futurlec (<http://futurlec.com/PCBService.shtml>). I believe the PCBs ship from Thailand so don't expect fast delivery (unless you pay for courier service), but the quality for the price is good (and their other stuff is cheap too).

</comment><comment><USER6> BatchPCB is slow, from what I hear. I can recommend barebones PCB (speed) and Gold Phoenix (price). There's lots of fun to be had in board-making; Sparkfun tutorials are a great place to start for learning schematics and layout in Eagle if you're interested.

<comment><USER8> +1 for Gold Phoenix. I've used them before for an order of ~250 4 layer PCBs and their work was pretty good for the price I paid.

+1 for Eagle as well. They have (had? I haven't checked in a while) a free version which is fantastic for beginners and to just toy around.</comment></comment>


Luck and Entrepreneurship: A tale of two startups - <AUTHOR> http://founderdating.com/entrepreneurship-and-luck/

<comment><USER2> I think a bunch of things that people often classify as "luck" should really be looked at as timing issues.

Part of building a business is understanding market conditions and competition. I get that things can come completely out of left field, but there are different degrees to which you can monitor competition and how receptive people will be to your product or service. It's dangerous (and potentially fatal) to be head down building your product and ignoring looming threats.

<comment><USER3> > I think a bunch of things that people often classify as "luck" should really > be looked at as timing issues.

I think there's some Venn Diagramming to be done here. Luck doesn't mean that something is impossible to react to; it simply means that you're not the instigating agent of the event. There's a very large set of categories that are luck, and some of those are timing issues.

</comment></comment><comment><USER4> I had the misfortune of starting work on a travel startup a week before 9-11. Oh well.

<comment><USER5> Too bad, but probably better than a year before 9-11. At least you got to fail fast rather than slow.

</comment></comment><comment><USER6> > _Marc Andreessen, an investor in TipMobile, summed up our situation this > way: "There's very little difference between being early, late, or just > plain wrong." While that may sound harsh, I think there is some wisdom > encoded into that view of the world. Markets can be fickle, after all, and > so if a market shifts on you and leaves your current product out of fit, > then it's your responsibility as an entrepreneur to adapt to the new > conditions and tailor your company to survive in whatever environment you > find yourself in._

Yes, yes, yes. I can't emphasize this enough. Too often we glorify these startup "unicorns" for their apparent innate "ability" to time the market. The latter part of this statement is the secret sauce.

</comment><comment><USER7> I think timing is a better word for "luck" typically, even in the examples given here. Sometimes you can control that, usually you can't...</comment>


Ask HN: How to continue learning English after coming to America? - <AUTHOR> Hi, i am Chinese student in San Francisco, though I have learned English for more than ten years in China and relative good score on TOEFL, I still have great difficulty in listening and speak here, I find the way people speak is different from what I learned. People here speak much more quickly, not clearly, and with various accent and phrases I never heard before. I find I still need to learn much more, So I wonder do you know any methods or tools to deal with this problem? Any ways promote continued learning? <comment><USER2> It depends on your goal. To improve your listening skills for conversation, you'll have to engage in conversation and it will improve over time. It is normal to not be able to catch everything. Politely asking people to repeat themselves is perfectly fine.

One trick I use is to repeat what I thought I heard so the speaker can correct me. As opposed to just saying "what?" I would ask, "The cat was rolling weird?" This might get corrected to "The `Cart` was rolling". I find people will emphasis the word you're having trouble with.

I too had a decent TOEFL score(108/120), but I quickly realized that I could think of words in my head but not pronounce it. I still struggle with this and I get corrected all the time. Eg: My "bear" "beer" and "bare" sounds almost the same.

Reading books and articles helps with learning new words and keeping your vocabulary. Colleges generally have "writing centers" for help with formal writing. These people also help you with conversation and are generally happy to talk to you. I've also utilized places like #english on freenode.net sometimes.

Mimicry also helps. If you hear someone talk fluently, you should mentally commit that to memory. Some native speakers aren't good role model to mimic. So you want to actively make sure you're not copying wrong model. Most of this is initial work. Once you get to a thresh hold, you'll have easier time more or less.

</comment><comment><USER3> It looks like you have a good grasp of English grammar. It's now time to improve your verbal skills.

It's been shown that the best way to become fluent in a new language is to speak it as much as possible. So, what this means is that , you need to get into conversations with people where you are forced to speak English. Find people to talk to where ever you go. If I were you I would find meet ups on subjects you are interested in and once there start conversations.

Don't be afraid to talk to people because you have trouble communicating with them. The more you do it the better your language skills will get. People can be very helpful so if you don't understand don't be afraid to as for help. I guarantee that within the next year you will have a good handle of the language if you force yourself to use it.

Don't fall into the trap of speaking to only people that speak your language. Ultimately it keeps you from advancing with your dominance of English.

</comment><comment><USER4> The BBC World Service is aimed at people who don't have English as a first language. They have a lot of broadcast and podcast material.

[http://www.bbc.co.uk/worldserviceradio](http://www.bbc.co.uk/worldserviceradio)

[http://www.bbc.co.uk/worldserviceradio/programmes](http://www.bbc.co.uk/worldserviceradio/programmes)

[http://www.bbc.co.uk/podcasts/worldserviceradio](http://www.bbc.co.uk/podcasts/worldserviceradio)

</comment><comment><USER5> Probably a number of options for continuing to learn more conversational English. Here's one: [https://www.myenglishcoaches.com](https://www.myenglishcoaches.com)

</comment><comment><USER6> I'd suggest listening to podcasts and watching video content like movies tv shows and stuff.

Don't think of it as "learning" just find something you are interested in and get in the habit of listening.

Podcasts helped me a lot. I got used to listening to some every week and it was content I was interested in anyway so I wanted to learn to understand what they say.</comment>


On the matter of strlcpy/strlcat acceptance by industry - <AUTHOR> http://marc.info/?l=openbsd-tech&m=138733933417096&w=2 <comment><USER2> For a bit of historical context, this is Drepper's 'rationale' for not accepting a patch for strlcpy in glibc: [http://www.sourceware.org/ml/libc- alpha/2000-08/msg00053.htm...](http://www.sourceware.org/ml/libc- alpha/2000-08/msg00053.html)

<comment><USER3> Ah, there's some classic Drepper. It's so easy when you get to vet every line of source and never have to worry about inexperienced or careless programmers.

Personally I much prefer APIs that will fail safe until you know you need the performance of a less safe one, and can spend the time auditing the code.

<comment><USER4> These APIs do _not_ "fail safe"; as Kaz Kylheku points out in his reply to Ulrich on that list:

> These words make sense. The problem with strlcat and strlcpy is that they > assume that it's okay to arbitrarily discard data for the sake of preventing > a buffer overflow. The buffer overflow may be prevented, but because data > may have been discarded, the program is still incorrect. This is roughly > analogous to clamping floating point overflow to DBL_MAX and merrily > continuing in the calculation. ;)

This is still a bug in your program, and it can still specifically be a security risk; if you want to cap a buffer, you need to fail the operation, not just silently discard some of the data.

Further down-thread, here is Ulrich's (I will argue 100% correct) rant:

> Dammit, it is not safe. It hides bugs in programs. If a string is too long > for an allocated memory block the copying must not simply silently stop. > Instead the program must reallocate or signal an error. I can construct you > cases where the use of these stupid functions is creating new security > problem.

I realize it is fun (and sadly part of the zeitgeist at this point) to rag on Ulrich, but a lot of the things he's said over the years have been quite insightful, and you should at least read the full conversation before judging him.

<comment><USER2> You think that

      *((char *) mempcpy (dst, src, n)) = '\0';

is a good solution then?

Also, I don't know where this 'srlcpy silently fails' meme comes from. It's your responsibility to check the return value. It only 'silently fails' if you don't check. You can argue about whether it is a good idea or not to make client code responsible for that kind of thing but it is the C philosophy. If you think string copy functions should call abort on failure then, like Theo says in the OP, implement that and submit patches to all those projects using strcpy.

<comment><USER4> The reality is that both strcpy and strlcpy require the person using the API to use it correctly in order to not end up with a buggy program; but, in the real world, people hype strlcpy as being fundamentally safer than strcpy, and so if you actually look into how people use strlcpy no one ever checks its return value (even projects like OpenSSH).

For more on this (and a specific ludicrous example from OpenSSH where someone spent the time to write a comment above the strlcpy about truncation and yet still didn't actually bother to check the return value of the function), please see this response I made to someone else:

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

</comment></comment></comment></comment></comment><comment><USER5> strl(cpy|cat)() is quite dangerous to just use blindly as a full replacement for other (mem|str)*(cpy|cat) functions. strlcpy's return value is the length of the source string. So say you have a big 20MB XML document, and as you are scanning along, you use strlcpy() to store a node name or value into another string. Even though you only ask it to copy five bytes, it goes ahead and runs over the rest of the 20MB document simply for a return value you don't (in this case) care about. If you keep doing this over the entire document, your parser will end up with quadratic overhead.

strlcat() has the same overhead issue, and its return value is downright cryptic: it is strlen(source) + min(length, strlen(target)).

When it tries to compute strlen(), ignoring your requested length parameter, this means it will access out-of-bounds memory if that string is not properly null-terminated.

And if you're absolutely paranoid about security, these functions not having both source size and target size parameters gives you a second way to go out- of-bounds.

Overall, they're okay functions, but you can easily do a lot better. And since these aren't universally available, if you're going to declare your own cpy/cat functions, you may as well use a better implementation than strl.

<comment><USER6> > strl(cpy|cat)() is quite dangerous to just use blindly

Very true; people have caused serious issues by blindly doing things (supposedly making things secure or else), without bothering to understand what they're doing. However, for the specific (and reasonably common) scenario of dealing with proper C strings, the strl* functions are very simple and easy to use correctly, and their use is easy to audit.

> So say you have a big 20MB XML document, and as you are scanning along, you > use strlcpy() to store a node name or value into another string. [..] If you > keep doing this over the entire document, your parser will end up with > quadratic overhead.

Right. It is going to be ridiculously slow (and that should be obvious). But this isn't the common scenario that strl* family of functions were designed for (and which a lot of people get wrong with standard C string functions). But chances are in code like this C strings' shortcomings would be problematic anyway.

> strlcat() [..] its return value is downright cryptic: it is strlen(source) + > min(length, strlen(target)).

Sorry but that is just wrong.

> When it tries to compute strlen(), ignoring your requested length parameter, > this means it will access out-of-bounds memory if that string is not > properly null-terminated.

It's not "requested length", it's "this many bytes fit in my buffer". These functions are not supposed to validate your input any more than are they supposed to check the validity of your pointers, intent, etc. If you're passing a pointer to something that is not a string (if you don't have a NUL terminator, your array by definition does not contain a string), you have a problem that you shouldn't hope _string_ handling functions to magically cope with.

> if you're absolutely paranoid about security, these functions not having > both source size and target size parameters gives you a second way to go > out-of-bounds.

Target size ought to be enough for simple code dealing with actual _strings_. But if what you're dealing with isn't a string (and you need extra reassurances because you're not sure what it is), then how are you going to compute the source size? But if you can just compute the source size, then you can make sure what you have is a real string.

<comment><USER5> > But this isn't the common scenario that strl* family of functions were > designed for

I will give you that. They definitely weren't designed for this scenario. But in practice, people tend to ignore the return value (which is using the functions incorrectly), and if you were used to strncpy (which has its own performance problems), you might wrongly assume that you could use these to pull substrings out as well.

The regrettable part is that it's easy to combine overflow detection with substring copy functionality at the same time.

> Sorry but that is just wrong.

Sorry, but it is not wrong.

See the actual implementation source: [http://www.openbsd.org/cgi- bin/cvsweb/src/lib/libc/string/st...](http://www.openbsd.org/cgi- bin/cvsweb/src/lib/libc/string/strlcat.c?rev=1.13)

"Returns strlen(src) + MIN(siz, strlen(initial dst))."

Even the official man page says the return value is confusing: "While this may seem somewhat confusing, it was done to make truncation detection simple."

I mean no disrespect, but you're proving my point. Even most proponents of these functions do not understand all of the nuances in how they work. That's a real problem, as if you don't understand strlcat's return value, you can't use it safely. The functionality is too specialized to be general purpose functions.

> It's not "requested length", it's "this many bytes fit in my buffer"

Yes. Sorry if my wording was poor, I'm not really good at explaining things.

> These functions are not supposed to validate your input any more than are > they supposed to check the validity of your pointers, intent, etc.

Exactly. They're useful functions for certain purposes. My only point is that they are by no means perfect. There are many use cases where they are not appropriate. Unfortunately people tend to either praise this family as the solution to C memory safety problems, or they dismiss them entirely.

Absolutely use them when they're appropriate, but don't simply use them everywhere and think you're making your program safer. There's performance implications, out-of-bounds memory violations, security issues raised by truncating values without catching it, etc. These are all the programmer's fault for misusing the functions, of course, but safer and/or more versatile functions can be made.

<comment><USER6> > But in practice, people tend to ignore the return value (which is using the > functions incorrectly)

That might be true. It would be very interesting to see some statistics. However, with these functions, it is _very_ easy to check whether the truncation detection is being done or not. Grep is mostly enough, but it can even be automated for most cases.

Also, that is hardly an argument against these functions: any string utility function will inevitably have to deal with errors somehow (or worse, ignore them and continue!).

> if you were used to strncpy (which has its own performance problems), you > might wrongly assume that you could use these to pull substrings out as > well.

Yes, and sadly I've seen something like that (and worse) in the wild. These are easy to spot though.

> Sorry, but it is not wrong. > > See the actual implementation source: > [http://www.openbsd.org/cgi- > bin/cvsweb/src/lib/libc/string/st...](http://www.openbsd.org/cgi- > bin/cvsweb/src/lib/libc/string/st..). > > "Returns strlen(src) + MIN(siz, > strlen(initial dst))."

Interesting. You're right about the code and its return value. However, the current manual documents it a little bit differently; the weird return value for the case when the initial destination string is _not_ a string is never mentioned (but the fact that NUL-termination won't occur in this case is there). So in practice you can forget the MIN() and say it is strlen(dst) + strlen(src). From my perspective it makes all the sense, because, going back to what I've argued before, a string handling function should at least be allowed to assume you're giving it strings to work with; it's not there to validate your input or check pointers, etc.

> Even the official man page says the return value is confusing: "While this > may seem somewhat confusing, it was done to make truncation detection > simple."

You quoted a line that is not describing the corner-case return value mentioned above. It is describing the fact that the return value is (assuming actual strings are processed!) the total length of the string that would result from the operation if the destination buffer was large enough to hold it without truncation. There is nothing confusing about that. Perhaps the author initially thought it would be confusing for people who expect it to resemble functions such as read() that return the number of characters _actually_ given to you. But there is nothing to be confused for, and the official man page has been simplified to reflect that:

      commit: http://marc.info/?l=openbsd-cvs&m=133338810915771&w=2
      current version: http://mdoc.su/o/strlcat

> I mean no disrespect, but you're proving my point. Even most proponents of > these functions do not understand all of the nuances in how they work. > That's a real problem, as if you don't understand strlcat's return value, > you can't use it safely.

The correct way to detect truncation with strlcpy and strlcat has always been exactly the same, and documented:

      if (strlcat(dst, src, dstsize) >= dstsize) { /* truncated */ }

The fact that I wasn't aware of a corner-case scenario where dst does not contain a string to begin with has in no way impeded my ability to type the above line correctly. The branch will still be taken if the string would be too large for the buffer, but your code is broken and strlcat cannot fix it for you.

> The functionality is too specialized to be general purpose functions

Yes, they perform a very specific function; they are not _Perl_. Yet these are "general purpose" enough that the less secure variants (and not only these as of C11) were introduced in the C standard, and are used everywhere. These functions are convenient, available everywhere, and recognized by any C programmer, and that is why they are used. The OpenBSD functions came to be because of the widespread (mis)use of the C functions, to make it easier to do it right.

> Exactly. They're useful functions for certain purposes. My only point is > that they are by no means perfect. There are many use cases where they are > not appropriate. Unfortunately people tend to either praise this family as > the solution to C memory safety problems, or they dismiss them entirely.

Good to know we are in agreement. :-) Perhaps I interpreted you too strongly when you said one may as well use another implementation; to me that sounded like a suggestion to dismiss these entirely.

> These are all the programmer's fault for misusing the functions, of course, > but safer and/or more versatile functions can be made.

I would be interested in a concrete example. More versatile? Yes, that is easy. Safer? Well I'm not so sure about that. Perhaps by trading some correctness. Perhaps in some non-critical user-land application where unbounded allocations are OK and aborting on memory exhaustion is "safe". Simpler and safer? Almost definitely not, but please show me I'm wrong :-)

<comment><USER5> > The fact that I wasn't aware of a corner-case scenario where dst does not > contain a string to begin with has in no way impeded my ability to type the > above line correctly.

True. And again I was hesitant to say that, so I hope you didn't take any offense. These functions surprised me as well at first (I was personally bitten by that strlcpy() running full strlen(source) issue in my own XML parser.)

> I would be interested in a concrete example.

Well I don't really have a super-secure version. Honestly 99% of string stuff I do is using a C++ library that keeps track of the allocation size (and also has small-string optimization.)

What I came up with in place of strlcpy/cat, which worked better for my own purposes, is below, which I call strmcpy/cat:

      //return = strlen(target)
      unsigned strmcpy(char *target, const char *source, unsigned length) {
        const char *origin = target;
        if(length) { while(*source && --length) *target++ = *source++; *target = 0; }
        return target - origin;
      }

      //return = strlen(target)
      unsigned strmcat(char *target, const char *source, unsigned length) {
        const char *origin = target;
        while(*target && length) target++, length--;
        return (target - origin) + strmcpy(target, source, length);
      }

Truncation is detected by seeing if source[strmcpy/cat(...)] != 0, and very easy to wrap with another function. And in general, I find strcat functions kind of unpleasant (eg Schlemel the painter), so for that a strpcpy() that writes to a pointer will let you chain those, eg:

      void strpcpy(char *&target, const char *source, unsigned &length) {
        unsigned offset = strmcpy(target, source, length);
        target += offset, length -= offset;
      }

Now I am sure you can point out a myriad of serious problems with these functions, just as I have for strlcpy/cat.

Hell they're probably much worse than strl, but they work for me at least. If nothing else, they are at least easier to read =)

Full info on these functions is at the bottom of this dead article: [http://web.archive.org/web/20130121234920/http://byuu.org/ar...](http://web.archive.org/web/20130121234920/http://byuu.org/articles/programming/strcpycat)

</comment></comment></comment></comment></comment><comment><USER7> Strlcpy and strlcat _are_ stupid.

Strcpy_s and strcat_s for the win :) They have much better error semantics, do the right thing upon failure (set dst[0] to '\0' if dst is not NULL and return an error code), and if you are working with C++ in Visual Studio, come with template specializations that can infer the length of the destination string. Which is really handy when the compiler substitutes strcpy and strcat calls with calls to strcpy_s and strcat_s with the appropriate implied length :)

<comment><USER8> I am entirely uncertain of why this was downmodded. The _s functions are part of the C standard (Annex K), and truly are better replacements for their counterparts. It's unfortunate that the glibc maintainers have shown so little interest in implementing this (optional, to be fair) part of the standard.

<comment><USER9> Because the argument why they are "stupid" is missing entirely. Much of the second paragraph was edited in later.

</comment></comment></comment><comment><USER10> something i find more important than how much people use strlcpy, snprintf etc in terms of safety and easy of use of strings in C is the lack of good implementation of library functions that give you the string length upfront so you can safely make an allocation of the right size to use such a function with.... coupling that with the fantastic level of brokeness of wchar_t*/wcs functions on the Apple platforms and the poor consistency of the Android NDK (%S, %ls... can't remember) and Microsoft's general lack of respect for the standard and desire to encourage their own brand of 'safe' functions and deprecation I find working with strings in a useful way in C to be an enormous pain when it really shouldn't be.

This should be embarassing when 'script kiddie' languages like Python, Ruby, JavaScript and co. do a fantastically better job. It has nothing to do with the level of abstraction and everything to do with poor implementation of the standard library on /every platform/.

And I am supposed to trust 3rd party libraries when these giants make mistakes with both trivial, yet highly important functionality? It makes me cynical that they want to force me to use their NSStrings, Java string or Platform::String^ crap, which I really don't like to trust because they are bad in their own ways too... how can I trust these people with my strings?

C and C++ are ridiculously cross platform and utilitarian, but this area is definitely one of the weakest imo :/

Still, I don't advocate rolling your own, but making things work safely and nicely across platforms is a pain in the arse

<comment><USER11> What makes python strings fantastic and java strings crap?

<comment><USER10> i think java strings are pretty fantastic too... its the C string library function implementations which are crap.

i don't like introducing any dependency when I shouldn't have to - using Java strings on Android is not something I've yet had to do but I suspect I will if I want good working functionality because the wcs* functions in the C stdlib in the NDK are crap.

there are a number of performance and aesthetic reasons for not wanting to use java strings as well but they are largely irrelevant imo...

</comment></comment></comment><comment><USER12> The non-standard strlcpy can easily be replaced with the standard snprintf. Both can, and almost certainly should, be replaced by a library that takes care of memory allocation for strings. Even a simple one will obliterate all of the problems that the usual style of C string handling has.

([http://blog.liw.fi/posts/strncpy/](http://blog.liw.fi/posts/strncpy/) is my rant about this. Others have made the point better, of course.)

<comment><USER13> I agree. C++ solved this problem many years ago. The solution is standard and safe to use everywhere on all platforms.

        std::string

<comment><USER14> Exactly, and it's actually MORE efficient than raw C string handling. Even in C the solution is to give up and use a string handling library that will do a reallocation on append, not risk truncation.

</comment></comment></comment><comment><USER15> Using strlcpy is like suppressing the "Division By Zero" exception and have divisions to return a fake value just to let the program run.

In some case this could be even useful, but it's for legacy and sloppy programs that no one bother to really fix.

For anything that requires some minimal level of quality the best option is to make the program to intentionally crash if a buffer overflow condition is detect. Exactly like a "Division By Zero".

<comment><USER6> For anything that requires some minimal level of robustness, the best option is not to make the program crash when a string is too long to fit in a buffer. This is not a buffer overflow condition. This is not at all like Division By Zero.

EDIT: In your world the kernel could panic because someone tried to open() too long a filename. Or should the application trying to open the file crash instead? And an IRC server would crash because my client sent a message with 513 characters.

I would rather detect these conditions and do the right thing.

</comment></comment><comment><USER16> Sounds a lot like Theo is making the assumption that most programmers care about security, when in fact, they're probably primarily interested in creating code that works, and making it secure later.

It doesn't matter what function you use to copy strings. Hell, you can use strcpy in a way that avoids buffer overflows! If your application is poorly designed, it will be insecure. In this case what we're talking is not doing bounds checking on input before copying data, which will always end up fucking you in one way or another, regardless of what function you use.

Going on and on over this function vs that function is a distraction from the bigger problem, which is the overall poor design of many applications.

<comment><USER6> > Theo is making the assumption that most programmers care about security, > when in fact, they're probably primarily interested in creating code that > works, and making it secure later.

Insecure software is broken software; it doesn't work correctly (unless insecurity is an intended feature, such as in a backdoor).

> It doesn't matter what function you use to copy strings.

Technically you're right, you can even roll your own loop. However, the purpose of library functions is to make your (and your users' & co- developers') life easier. The strl* functions provide a simple idiom that _just_ _works_ , and it takes _less_ effort than doing arithmetic prior to strcpy/cat calls. It makes it easy for everyone to check that it does indeed work.

> In this case what we're talking is not doing bounds checking on input before > copying data, which will always end up fucking you in one way or another, > regardless of what function you use.

The strl* functions are all about _doing_ bounds checking in a simple and compact way while copying data, and they inform you in case the input was too large. They're all about replacing broken (or entirely missing!) hand-rolled bounds checking that you'd write before every strcpy/strcat.

Why don't you try audit code that uses strlcat & strlcpy? Grep for these and check that every invocation is correct. Now do the same for code using strcat, strncpy, and strcpy. Check all the arithmetic (which may take up goodness knows how many lines, spread all over the place, in loops, etc.). After a few hundred of these, you should begin to understand why strlcpy and strlcat exist.

People have done such massive audits before. And misuse of the standard string functions has indeed caused many many bugs. The secure alternatives weren't invented just for the heck of it; there's actual history behind it.

<comment><USER16> Yes, I understand why these functions exist. That's my whole point: we shouldn't be nit-picking these functions in regards to security, because simply using them does not make your program secure. You have to actually design for security, not just use strlcpy and believe somehow you have produced secure code. At the same time, just because someone has strcpy in their code, does not mean their code is not secure. So this whole discussion is pointless, is what i'm saying :)

<comment><USER6> Yes it's pointless if people continue to miss the point regarding auditability, and the fact that harder-to-use functions that are also harder to audit are more like to end up used wrong.

I realize that many out here don't care about auditability, and never spend hours systematically going through hundreds or thousands of invocations in other people's code, checking for correctness of exactly the kind of code that historically has caused lots of easy-to-exploit security problems. I realize that most people here would probably trust themselves to be able to use strcpy, strncpy, and strcat correctly; I would trust myself too. But that is not the point. With the right idioms, I make it easier for other people to verify the correctness of my code, so they don't need to depend on blind trust.

And to be honest, it doesn't take a whole lot of "design" to use strlcat correctly; it is _simple_. Yes you _can_ misuse it, but I would hold it very likely that most people who actually learn about it, check the manual, and decide to use it, are going to use it correctly.

<comment><USER16> _> I would hold it very likely that most people who actually learn about it, check the manual, and decide to use it, are going to use it correctly._

You don't think that's dangerous? If your method of auditing code is skipping all the strlcpy's because you assume it's being used correctly, you're going to miss the one or two times it's not, and end up with vulnerabilities.

I haven't needed to audit code professionally, but when I do it personally, I don't look for common pitfalls in function use - I look for general scenarios that are dangerous, like working with potentially tainted data. So when I talk about design security, I don't mean what function you use, I mean how it fits into the broader scheme of what the application is trying to do.

<comment><USER6> > If your method of auditing code is skipping all the strlcpy's because you > assume it's being used correctly

That is not at all what I have said, how did you come up with that? I've been arguing that the idiomatic use of strlcpy is easier to audit than any use of strcpy.

> I haven't needed to audit code professionally, but when I do it personally, > I don't look for common pitfalls in function use - I look for general > scenarios that are dangerous, like working with potentially tainted data. So > when I talk about design security, I don't mean what function you use, I > mean how it fits into the broader scheme of what the application is trying > to do.

What you're doing isn't wrong, but looking for common pitfalls is a very easy way to get a baseline assesment of code quality. You'd be surprised at the amount of problems you can find just by looking for arithmetic overflows near memory allocation, misuse of realloc, and the string handling functions. And if the search turns out lots of such problems, trying to understand the design and "broader scheme" is not very useful (at least for me, because at this point I would've decided the software in its current state is simply not good enough for me).

There's another reason to look for common pitfalls: you have something very concrete to focus on. You can work mechanically. You can work with grep. It really does make a huge difference. And let's not forget: these common pitfalls are common. And commonly, they are exploitable. And they are the things many attackers would also initially look for.

If you "just look" trying to find potential security issues in design or otherwise, but are not looking for anything very specific, you can't be anywhere near as focused, and it will take more time to usefully process the code. If it takes a lot of time, focus is going to get worse with the degrading attention span.. it'll be harder (at least for me) to be certain that the review has actually been thorough and has managed to flag things that need attention.

Oh I do look at the broader design of software, but only after getting the low hanging fruit out of the way.

</comment></comment></comment></comment></comment></comment><comment><USER14> Everything about this post by deraadt is wrong.

First of all, all of those software projects rolling their own implementation should consider libbsd (installed on my system as a dependency of the Samba client libs, so it should be on most desktop Linux distros already)

[http://libbsd.freedesktop.org/wiki/](http://libbsd.freedesktop.org/wiki/)

Secondly, it's fallacious to point out that lots of people already use these functions and therefore it must be sane and should be encouraged. People used gets() for decades.

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

Thirdly, strlcat and srlcpy _are awful_. The fact that people have already moved from awful to _maybe slightly less awful_ variants actually means they have some will to improve their code, which should be encouraged. strl* should not be encouraged. You should be strung up (pun intended) if you're not using a modern string handling library in 2014.

<comment><USER17> Please add links/references to your preferred string handling library of 2014.

</comment></comment><comment><USER18> _You probably all know about the mainstream users of these functions, like the Linux kernel, or MacOS, or the other BSD 's, and Solaris._

In fact the Linux kernel uses both strcpy and strlcpy -- strcpy is used more often. Sometimes strlcpy makes more sense than strcpy, other times not. It's not a popularity contest.

</comment><comment><USER19> Again, it's a matter of how you treat strings. Using the standard library functions to deal with strings is lazy, and eventually will cause problems(tm) in the future. It's better to be proactive about it and roll your own functions to deal with it. At worst, you've wasted extra time reimplementing a library function.</comment>


Dear AI startups: Your ML models are dying quietly - <AUTHOR> https://sanau.co/ML-models-are-dying-quietly <comment><USER2> I don't see how this has anything to do with AI or ML. It's a great description of why you might want to prefer strongly typed languages, avoid "the data _is_ the schema" key-value monstrosities like mongodb, and maybe think about writing some sanity-check-tests that need to pass before deployment, though.

No system should ever fail silently if a required field suddenly goes missing or has the wrong type/unit.

<comment><USER3> The problem with numerical programming is that all data is the same type. If you access wrong row, multiply across wrong axis, function uses wrong parameters, it's semantically wrong, but it can still work and system can learn something.

<comment><USER4> Isn't there a typesystem that can help with this?

E.g., give rows a type, give columns a type, and then if you multiply two matrices, see if the type of the columns of the first matrix and the type of the rows of the second matrix match.

Also, the typesystem could use units, just as they are used in physics.

<comment><USER3> You would like to have 'unit system' that would keep track of the units of measure in general and the ability to use concepts like dimensional homogeneity to avoid semantic errors while programming. Alas, they don't exist as far as I know.

<comment><USER5> F# has units of measure. A frontend is (usually) not F#, but even for a more loosely typed system such as your typical web frontend, it should be possible to represent scalars as tuples of a number and an identifier. Eg. { qty: 12, unit: "kgs" }.

</comment></comment></comment></comment></comment><comment><USER6> There's definitely a lot of opportunities for technical debt in machine learning projects that don't exist in usual software development, which makes careful design decisions even more important. Reminds me of this paper, which talks about these issues and ways to avoid them: [https://research.google.com/pubs/archive/43146.pdf](https://research.google.com/pubs/archive/43146.pdf)

<comment><AUTHOR> That's true! Thanks for sharing the paper. We'll take a look

</comment></comment><comment><AUTHOR> Hey HN, this is an article we wrote about things to watch out for as you develop your machine learning models and deploy them on production.

We realize that it's really important for data science, product management and engineering teams to discuss and ideally monitor any new or any changes in data capture and processing that feeds into a machine learning model.

<comment><USER7> In this article, we showed a scenario where a small change to the front-facing interface could dramatically reduce the accuracy/performance of a machine learning model powering the application

</comment></comment><comment><USER8> This has nothing to do with startups, or established companies. Any time the distribution of your data changes, your models need to be retrained. The model can degrade even if the input data improves, e.g., if your geolocation feed had a high error rate before but has suddenly gotten much better you need to retrain the models.

</comment><comment><USER9> The domain is flagged as malicious by ESET:

[https://www.virustotal.com/#/url/e4accf1e046c8266168b9038763...](https://www.virustotal.com/#/url/e4accf1e046c8266168b903876384f193b6457a5ff9bfecc72d47a08d1d397f7/detection)

</comment><comment><USER10> Is it common for an ML model to be designed to make product recommendations based on name and email, as in the example? That seems... problematic.

<comment><USER11> I figured that it was just for illustration, because the author couldn't think of a better example. Some real-life examples that turn up stupidly often:

1\. The model uses click-through data as an input. Your frontend engineer moves the UI element being clicked upon to a different portion of the page for a certain category of results. This changes the baseline click-through rate. The model assumed this feature had a constant baseline across all results, so the new feature value now needs to be scaled to account for the different user behavior. Nobody thinks to do this.

2\. The frontend engineer removes a seemingly-wasted HTTP fetch to reduce latency. This fetch was actually being used to calibrate latency across different datacenters, and was a crucial input to a data pipeline to a system of servers (feeding the ML model) that the frontend team didn't control and wasn't aware of.

3\. The frontend engineer accidentally triggers a browser bug in IE7 (gimme a break, it was 9 years ago) that prevents clicks from registering when RTL text is mixed with LTR. Click-through rates decline precipitously in Arabic- speaking nations. This is interpreted by an ML model as all results being poorly performing in Arabic countries, so it promptly starts cycling through results, killing ones that had shown up before with no clicks.

4\. A fiber cable is cut across the Pacific. This results in high latency for all Chinese users, which makes them abandon their sessions. A ML model interprets this as Chinese people being less interested in the news headlines of that day.

5\. A ML model for detecting abusive traffic uses spikes in the volume of searches for any one single query over short periods of time as a signal. Michael Jackson dies. The model flags everyone searching for him as a bot.

6\. A ML model for search suggestions uses follow-up queries as a signal. The NYTimes crossword puzzle comes out. Everybody goes down the list of clues and Googles them. Suddenly, [houston baseball player] suggests [bird sound] as related.

<comment><USER7> Thanks nostrademons, these are great examples. You're right, name and email are just for illustration. Would you mind if we use your feedback and some of your examples to improve the article? If yes, should we credit your HN account?

<comment><USER11> I'd actually rather that you keep them general (eg. just talk about clickthrough data or changing latency conditions) and don't credit my account. The past employer in question is relatively easy to lookup from my past comment history, and while there's nothing really confidential in the examples, stories about how they do things or how things go wrong tend to blow up in the news, and they like the publicity only when it's positive.

<comment><USER7> Ok, sounds good. we'll keep it generic and won't mention the source. Thank you for sharing! We think this is something AI companies can benefit from in the future.

</comment></comment></comment></comment></comment><comment><USER12> It's not really specific to machine learning - everything in big corporate pre-ML reporting, data analytics, business intelligence and management information systems domain (which is a mainstream field of IT systems with decades of history and lots and lots of systems experience) have the same issues. Any pipeline of business data collection and analysis tends to be reliant of lots and lots of factors external to that system, and dependent on particular details of every business process involved.

It's just well-known things being rediscovered because people are treating this as a new field - but everything mentioned in this article would be the same for company tracking some other sales efficiency metric twenty years ago, except that the "change in front end framework" would be "change in preorder sales reporting templates", causing very similar problems in your data analysis.

</comment><comment><USER13> Sanau seems like a new version of Sagemaker [https://aws.amazon.com/sagemaker/](https://aws.amazon.com/sagemaker/) where you write code in Jupyter and it auto converts to endpoints.

I've used these solutions, but while Jupyter is amazing (my startup [https://kyso.io](https://kyso.io) started as a way to share notebooks) I'm not sure if deducing which cells to convert into an endpoint is the way to go - especially since you will need to also host model files and extra data?

<comment><USER14> Your startup looks quite interesting and I can actually see potential for commercial usage. How's the growth rate been?

<comment><USER13> Its awesome - we've recently launched a team version [https://kyso.io/for- teams](https://kyso.io/for-teams) and our beta users seem to love it

</comment></comment></comment><comment><USER15> It's not just data format changes; model accuracy can be impacted by changes in the distributions of values, even if their types remain the same.

That's why production ML systems should monitor for data drift, model accuracy, and a host of other factors that may not be obvious at first. That's part of what TensorFlow Extended does.

See also: "What's your ML Test Score? A rubric for ML production systems" [https://ai.google/research/pubs/pub45742](https://ai.google/research/pubs/pub45742)

</comment><comment><USER16> When you deploy a machine learning model, you need to monitor it's performance in production.

If the model's ROC-AUC falls by 0.1, the mean/s.d. of one of it's inputs changes by more than 50% or the number of N.a.s for an input increases suddenly or if the monitoring report dies, then the model owner should get an alert quickly.

</comment><comment><USER17> "Data pipelines die quietly" is a more appropriate name for the article based on the example. And its true, all data pipelines need counters monitored continuously. A simple <number of records that didnt parse> metric on grafana would prevent this error.

</comment><comment><USER18> Sounds like you should manage your metrics and refine your model using false detection/classifications (which you should try to catch and measure).

</comment><comment><USER19> Garbage in, garbage out. This has nothing to do with ML models.

</comment><comment><USER20> That article could be a good example of modern spam.

</comment><comment><USER21> boring story. cannot believe it goes on one of today's hottest.</comment>


Crate. Web-based file sharing done incredibly easy. - <AUTHOR> http://thenextweb.com/apps/2011/02/04/crate-web-based-file-sharing-done-incredibly-easy/ <comment><USER2> The files are hosted on AWS S3 (despite the fact that their domain is "cdn.lts.cr", they're not using CloudFront), so assuming a cost of $0.14/GB (too lazy to calculate it including S3's various pricing ranges that come into play when more data is being stored), and completely ignoring facts such as cost of hosting the site, and the time factor of creating and managing the site...

Also assuming that _all_ free users use _all_ of their 200mb, and _all_ pro users use _all_ of their 10gb...

They need a free-to-pro conversation rate of 0.37% to break even on the S3 costs, i.e. one pro account for every 271 free accounts.

Alternatively assuming that all users will use 50% of their 200mb or 10gb, then that's a conversation rate of 0.17%, or one pro account for every 593 free accounts.

My guess is that, if we ignore people who try it out and then decide not to use the service, chances are that, of the people who stick around (i.e. the people who will actually store more than one test file), quite a decent number will move to the pro account. So yeah, I can see how they are making a profit, seems like it could turn into a nice (and really easy maintenance) little cash cow.

On a seperate topic, would be amazing if someone created an open source version of this as a front-end for S3 - though I'm far too lazy to do it myself.

edit: I see the creators are reading this thread, so here's a direct query. Any chance you'd create an account for maybe a few dollars a month (less than pro) that you provide no storage for, and that gets hooked up to an S3 (or S3+CloudFront) account of the user's chosing?

</comment><comment><USER3> Sweet. I've been waiting for somebody to make a service that let me upload files to the cloud.

Especially since it's Simple.

Now if only somebody would come out with a service to shorten all these links I have laying around I'll be set.

<comment><USER4> haha my thoughts exactly

</comment></comment><comment><USER5>
      Oh, and Crate is already profitable. No worries about losing your stuff because the business tanks.

That's helpful, but not a guarantee.

The site seems a little too bare to trust with my credit card, though the free version sounds really great. It seems like it's missing something. Like a weekend project that still has some details to flesh out.

<comment><AUTHOR> What could we add to change your mind?

<comment><USER6> I'd like to be able to change my password. Am I missing something?

<comment><USER2> <http://letscrate.com/settings> lets me do that (linked to from <http://letscrate.com/home>)

</comment></comment></comment></comment><comment><USER7> It's like a box you can drop stuff in

<comment><USER8> If only someone had thought of that before, eh?

</comment></comment><comment><USER9> I was introduced to <http://min.us> and have been hooked.

<comment><USER8> Minus is more than photos? Honest question. I knew it was a crazy nice photo sharing app but other file types?

<comment><USER9> anything. try it. haha

</comment></comment></comment><comment><USER10> This brought back fond memories of drop.io. There was "ridiculously easy * sharing". Crate does look a nice replacement, Although they offer far less storage and features, it seems like a viable answer to many people's problems. However, the same feature set is covered by Dropbox' Public Folder, or am I missing something?

</comment><comment><USER11> How is this any different from dropbox or tons of other file hosting sites out there?

<comment><USER12> You have to download dropbox.

<comment><USER13> You don't _have_ to, though it's geared towards that. You can use it entirely through the web interface if you want, manually uploading and downloading files.

</comment></comment></comment><comment><USER14> And how is drag n drop easier than having an upload button? I don't want to open explorer, find my file there, resize the window and drag with the mouse. Clicking on "upload" button and locating my file is much easier.

<comment><USER15> scp at the command line is easier still, especially if you define an alias in your .ssh/config file. Do any of the "cloud" file storage services support scp/sftp access?

<comment><USER16> mftexpress offers support for ftps and sftp as well as web based file transfers over https. <http://www.jscape.com/services/mftexpress/>

</comment></comment></comment><comment><USER17> In 3 bullets, why should I switch from Dropbox?

</comment><comment><USER18> Does anyone know what technique they're using to get the drag and drop uploads working in Webkit?

<comment><USER19> From the Pastie above, it looks like they are using this:

[http://developer.apple.com/library/safari/#documentation/app...](http://developer.apple.com/library/safari/#documentation/appleapplications/Conceptual/SafariJSProgTopics/Tasks/DragAndDrop.html)

</comment></comment><comment><USER20> Will take a lot to get me to make the switch from Dropbox. I also use Cloud app (<http://getcloudapp.com>) and like it.

<comment><USER8> My sole issue with CloudApp is that linked files are embedded on a page. I freaking hate that.

<comment><USER21> Same. So frustrating. Maybe I'll try to hack together a similar dropzone for Min.us or Crate.

</comment></comment></comment><comment><USER22> I prefer <http://ge.tt/>. Short URL, simple layout, no sign up needed, lots of bandwidth and storage, no BS.

</comment><comment><USER23> Remembers me of drop.io (sadly not arround anymore)

</comment><comment><USER24> Don't you mean: 'incredibly easily'?</comment>


Computing Needs Time - <AUTHOR> http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-30.html "This paper considers the orchestration of computing with physical processes. It argues that to realize its full potential, the core abstractions of computing need to be rethought to incorporate essential properties of the physical systems, most particularly the passage of time. It makes a case that the solution cannot be simply overlaid on existing abstractions, and outlines a number of promising approaches being pursued. The emphasis needs to be on repeatable behavior rather than on performance optimization." <comment><USER2> A succinct summary of a vague sense of "wrongness" that I have experienced for a while now...

With computing progressing more-or-less along moore's law, responsiveness and speed seem to stay steady or get worse - and this can't all be explained by the "extra" functionality provided... Vista anyone?

While the paper gives hope that it is up on the radar, I suspect it may be some time before we see any widespread adoption of the ideas - we're talking a paradigm shift in an ego-centric industry...

However, a great find! Definitely something to chew over...</comment>


Uncleftish Beholding: English minus the non-Germanic words (1998) - <AUTHOR> https://groups.google.com/forum/#!msg/alt.language.artificial/ZL4e3fD7eW0/_7p8bKwLJWkJ <comment><USER2> The reason it seems funny to see the word "stuff" in a scientific essay is that it's very much _not_ a French-derived word. French-speaking people ruled England for a while starting in the year 1066, and quite quickly in that region the use of French-derived English words became seen as a sign of high class. That sort of thing, once strongly established, becomes self- perpetuating.

That's why, even today, a police officer might say in court, "I observed the individual in the vicinity of the canine" whereas among family the officer might be much more likely to say, "I saw the man near the dog."

The first sentence is full of French. The second, Anglo-Saxon.

It's the same reason we eat beef and pork, but raise cows and pigs. The people eating the meat were upper class and thus used the French-derived words; the people taking care of the animals used Anglo-Saxon.

<comment><USER3> The Google etymology thing (I didn't even know it existed - just search for "stuff etymology" and you get a nice little graph) tells me that the word "stuff" came to English from Greek ( _stuphein_ ) via Old French ( _estoffe_ ). So maybe it is not correct to say it's not a French-derived word?

But it's also present in German- _stoff_ means something like "material". Amusingly, there's a wikipedia article titled "List of stoffs". The elements have names like _Wasserstoff_ = water stuff = hydrogen. In the attached essay (which claims to be written without German derivatives), it seems strange to prefer "waterstuff" to the very Greek "hydrogen"... ?

<comment><USER4> For some reason this discussion sent me off to try and find the origin of "loons" and "quines" \- the terms for "boys" and "girls" in the dialect of Scots English I am familiar with.

"Quine" seems to be based on "quean" but "loon" seems a mystery!

NB Referring to someone as a "loonie" is not derogatory - but just means they are a young boy :-)

<comment><USER5> "Loon" and "Quine" aren't even Scots English, I suspect you'd get funny looks if you used either in Edinburgh or Glasgow. Each are very much "Doric" (the dialect of Aberdeen\shire) words.

edit: I recognise your name from another post and remember that you're from Scotland so you probaby know this already :)

</comment></comment></comment></comment><comment><USER6> While English is a Germanic language, 41% of English words (ranked by frequency) come from French, making French the largest source of words in English, not German (which comes in at about 35%).

Of course, removing all non-French words would be worse since English pronouns, prepositions and conjunctions are mostly German derived. According to Wikipedia, 97% of the top 100 words in English are German derived. The loss of German would leave little to "glue" a sentence together.

[http://en.wikipedia.org/wiki/English_language#Word_origins](http://en.wikipedia.org/wiki/English_language#Word_origins)

<comment><USER7> How much is 97% of 100, approximately?

<comment><USER8> About 95.

<comment><USER9> That's about 97% accurate!

</comment></comment></comment></comment><comment><USER10> Last September I spent a little time going through Beowulf and pulling out words we no longer use but are still active in modern Swedish. I got to 100 very quickly. I can't speak so much for German, having only a basic grasp, but to me it looks like Scandinavian languages are closer to Old English now than Modern German. That might give a picture of how English would otherwise look without a Norman conquest (or if the Normans had retained their Norse language).[0]

For info, if you hadn't heard yet, Tolkien's Beowulf translation is due out on the 22nd of May. Scholars say it is likely to just be his working translation and teaching notes, unlikely to rival Heaney's efforts. I think everyone interested will want to see it though. Myself included. [1]

[0] [http://lukespear.co.uk/2013/09/old-english-vs-modern- swedish...](http://lukespear.co.uk/2013/09/old-english-vs-modern-swedish-via- beowulf-and-heaney/)

[1] [http://www.tolkienbeowulf.com/](http://www.tolkienbeowulf.com/)

<comment><USER11> >That might give a picture of how English would otherwise look without a Norman conquest

Wouldn't that be Icelandic, or Faroese?

<comment><USER10> Sure, but perhaps the development of the Scandinavian languages would be closer to the most likely outcome (speculation), with their general European influences, rather than the wider, and better preserved Nordic variants.

There's a brief comparison of Old Norse and Old English in the blog post mentioned, if interested. They were very similar, almost mutually intelligible, and so only major outside influences would have caused their divergence (as has happened). Without those influences, though, who knows, maybe Icelanders and the Germanic-British could still converse in their own tongues.

</comment></comment></comment><comment><USER12> It's pretty amazing how either conquests or preferences of the aristocracy shaped languages. Being a fluent Russian speaker, I had a chance to interact with a person from Serbia without a translator, who did not speak Russian.

The experience was eye opening in how languages evolved. Though the two started from a common ancestor language, Russian had become extremely "polluted" (using the term loosely) with foreign words for the most basic things. For example the word for Army is now derived from Army, whereas Serbian is using the word "wojsko" (not sure of actual spelling, transliterating), which is very close to what I would consider old Russian or proto-Slavic.

<comment><USER13> A verse from a danish satirical poem referring to the 17th and 18th century that has since become a sort of proverb:

        Every learned man
        Only latin wrote
        To the ladies French, German to his dog
        and Danish to his servant he spoke.

(The original, quite more poetic than my translation: [http://www.nomos- dk.dk/skraep/1807_1848/wilster.html](http://www.nomos- dk.dk/skraep/1807_1848/wilster.html))

<comment><USER14> It is a variation of a quote originally misattributed to Charles V:

[http://en.wikiquote.org/wiki/Charles_V,_Holy_Roman_Emperor](http://en.wikiquote.org/wiki/Charles_V,_Holy_Roman_Emperor)

</comment></comment></comment><comment><USER15> I wonder why 5th century invaders (Anglo-Saxons) are considered native while 11th century invaders (Normans) are not.

Nor for that mater are 1st century invaders (Romans)

Indeed, if Normans are considered an intrusion into a formerly pure Britain, one would think that the Doomsday book would be the considered the beginning of illegitimacy rather than the other way around.

<comment><USER16> Depends on who you ask. I doubt that the Scots or the Welsh or even the Cornish would consider the Anglo-Saxons to be the 'natives'. Fortunately hardly anyone in Britain actually thinks in terms of racial or ethnic purity.

There definitely _is_ a sense in which French and Latinate words are considered more upper-class, clever, fancy or polite - my favourite example is how referring to someone as 'fat' is considered rude whereas 'obese' is not, with the only difference being that one word is Germanic and the other Latinate.

<comment><USER17> Spot on. Only the BNP and UKIP are fascinated by ethnic purity and luckily they have a limited number of uneducated bigoted followers.

There was an interesting DNA study that I read on the BBC website some time ago about the Welsh (Celts of Breten) being 'true Britons' [1]

The Celts of Breten are the usually named as the true 'indigenous' Britons [2], but you wouldn't be able to find a 'pure' one if you tried. But the origins of the Celts are also suspected to be of mainland European descent as well. [3][4][5]

The real true Britons, who more than likely crossed the land bridge during the last ice age left no trace of themselves [6].

After the Celts the Saxons, Jutes, Angles, Danes, Romans and Normans were all additions to the melting pot. More recently, immigration after the WWII of workers from ex-Empire countries (now nearly all Commonwealth) have added to that vibrant mix.

1000 years later and our DNA is a good healthy mix. I think that was nature's design in the first place right?

[1] [http://news.bbc.co.uk/2/hi/wales/2076470.stm](http://news.bbc.co.uk/2/hi/wales/2076470.stm)

[2] [http://en.wikipedia.org/wiki/Nick_Griffin#Policies_and_views](http://en.wikipedia.org/wiki/Nick_Griffin#Policies_and_views)

[3] [http://en.wikipedia.org/wiki/Britons_(Celtic_people)](http://en.wikipedia.org/wiki/Britons_\(Celtic_people\))

[4] [http://en.wikipedia.org/wiki/Celts#Origins](http://en.wikipedia.org/wiki/Celts#Origins)

[5] [http://www.bbc.co.uk/history/ancient/british_prehistory/iron...](http://www.bbc.co.uk/history/ancient/british_prehistory/iron_01.shtml)

[6] [http://www.bbc.co.uk/history/ancient/british_prehistory/peop...](http://www.bbc.co.uk/history/ancient/british_prehistory/peoples_01.shtml#two)

<comment><USER14> One of our neighbours supports the BNP. Given that both my ex and I are immigrants, and she is black, this has given rise to some amusing conversations now and again.

When the subject of repatriation came up (for people not familiar with British politics, the BNP wants to repatriate anyone that's not of white-British descent), my ex immediately asked "so you will go back to Germany and give England back to the Welsh?" (aiming to make a point rather than accuracy)

But somehow, of course, they wanted to draw the timeline on how long your family needed to have been in Britain just far enough back to ensure there'd be no brown-skinned people.

(My impression is that they're not really all that racist when actually pressed for details; they've just been talked into believing in some mysterious group of "others" that steal their jobs and take their women, but somehow whoever they get to know cease to be part of this "others", regardless of race - they actually have quite a few friends that are both immigrants and black, asian etc.)

<comment><USER17> > somehow whoever they get to know cease to be part of this "others", > regardless of race

I think you are spot on here. There is this notion that "other" people are causing Britain's problems (this applies in any other country). It gives them someone to blame.

In fact politicians are happy to seed these kinds of blame shifting, because more than often the country is screwed because of their policies. Furthermore, the country is screwed because as a collective, we've let our country and the system fester and rot.

Hence, we blame others rather than looking inwardly. On a more micro level we can see this kind of blame culture in our development teams, or even with ourselves when we suffer poor health.

We need to care for our system together. One of the reasons I dislike politics is that it is divisive and blame focused.

</comment></comment></comment></comment></comment><comment><AUTHOR> I've been so happy to submit this! I read all the comments and learned a lot of stuff. Thanks to all commentators thus.

A very similar situation can be observed in Turkish: Turks went to Europe and Middle East in 4th century, the ones that went to Europe eventually died, and the ones that went to Middle East and formed empires, including the rather long lived and glorious Ottoman Empire. While they were busy becoming more Muslim and more Arabic, learning _fancy_ Arabic and Persian words, borrowing their alphabet and elevating this new Ottoman language to be the language of the palace, and the language of art, whereas the public spoke their own languages (lots of ethnicities were within the umbrella of Ottomans); Renaissance and The French Revolution happened, which eventually got Ottomans to love and behold Europe, mainly France, and borrow their words and lifestyle. In 19th century, Ottoman language was such a travesty, the first lessons of an under-graduate History course in Turkey now teaches the language, albeit Turkey directly descended from Ottomans not even a century ago. Together with the Kemalist revolution did start a movement of linguistic purism, along which the Turkish language was greatly stripped from what made it Ottoman, and the result was an easy-to-learn, simple and consistent language.

Still, though, it'd bear the same effect with "Uncleftish Beholding" to the average Turkishman, a text where only Turkic-rooted words were used, as still there are lots of words in the language that come from Arabic, French, English and Latin. Also, it'd be a bother for the average Turkishman to communicate with a Middle-Asian Turk of modern times, language of whom is closer to pre- Islam Turkic languages.

It is fun to play games with language, watch it grow and find out about how it came to be the language it is today.

</comment><comment><USER18> Some errors:

"to give rise to the rest": "rest" is latin

"ordinary waterstuff": "ordinary" is latin too.

<comment><USER19> "der Rest" is German, and so is "ordinär".

<comment><USER14> But "ordinär" in modern German comes from French "ordinaire", which comes from Latin.

<comment><USER20> And Kluge agrees with my intuition that modern German "Rest" also comes from Latin (restare, 'to remain').

</comment></comment></comment></comment><comment><USER21> This was thoroughly entertaining, recognizing each word's meaning is like solving a small puzzle. Like recognizing English words written in katakana. Some words were taken directly from German, like waterstuff (== Wasserstoff), sourstuff (== Sauerstoff). Bernstone for amber/ēlektron is my favorite.

</comment><comment><USER22> [http://en.wikipedia.org/wiki/Linguistic_purism_in_English](http://en.wikipedia.org/wiki/Linguistic_purism_in_English)

</comment><comment><USER23> There's a whole wiki devoted to this idea: anglish.wikia.com

A good example of it related to OP is [http://anglish.wikia.com/wiki/Roomlore](http://anglish.wikia.com/wiki/Roomlore)

</comment><comment><USER24> I'm reminded of the first time I read novels like _A Clockwork Orange_ , or Greg Bear's _Queen of Angels_ , where the fictional world's slang is used, but not explained.

<comment><USER25> The youth slang in Clockwork Orange is derived from Russian. I always assumed that, the book having been written during the Cold War, this was the obvious 'alternative vision' to our own world were American cultural influence predominates amongst the young.

</comment></comment><comment><USER26> As a Greek, I always admired Zolota's speeches, which are the exercise in reverse.

Speeches Two of his speeches in English are considered to be historic and notable because they contained mainly terms of Greek origin. Here are the texts:

1957 I always wished to address this Assembly in Greek, but realized that it would have been indeed "Greek" to all present in this room. I found out, however, that I could make my address in Greek which would still be English to everybody. With your permission, Mr. Chairman, l shall do it now, using with the exception of articles and prepositions, only Greek words.

Kyrie, I eulogize the archons of the Panethnic Numismatic Thesaurus and the Ecumenical Trapeza for the orthodoxy of their axioms, methods and policies, although there is an episode of cacophony of the Trapeza with Hellas. With enthusiasm we dialogue and synagonize at the synods of our didymous organizations in which polymorphous economic ideas and dogmas are analyzed and synthesized. Our critical problems such as the numismatic plethora generate some agony and melancholy. This phenomenon is characteristic of our epoch. But, to my thesis, we have the dynamism to program therapeutic practices as a prophylaxis from chaos and catastrophe. In parallel, a Panethnic unhypocritical economic synergy and harmonization in a democratic climate is basic. I apologize for my eccentric monologue. I emphasize my euharistia to you, Kyrie to the eugenic and generous American Ethnos and to the organizers and protagonists of his Amphictyony and the gastronomic symposia.

1959[edit] Kyrie, it is Zeus' anathema on our epoch for the dynamism of our economies and the heresy of our economic methods and policies that we should agonize the Scylla of numismatic plethora and the Charybdis of economic anaemia. It is not my idiosyncrasy to be ironic or sarcastic, but my diagnosis would be that politicians are rather cryptoplethorists. Although they emphatically stigmatize numismatic plethora, they energize it through their tactics and practices. Our policies have to be based more on economic and less on political criteria. Our gnomon has to be a metron between political, strategic and philanthropic scopes. Political magic has always been anti- economic. In an epoch characterized by monopolies, oligopolies, monopsonies, monopolistic antagonism and polymorphous inelasticities, our policies have to be more orthological. But this should not be metamorphosed into plethorophobia, which is endemic among academic economists. Numismatic symmetry should not hyper-antagonize economic acme. A greater harmonization between the practices of the economic and numismatic archons is basic. Parallel to this, we have to synchronize and harmonize more and more our economic and numismatic policies panethnically. These scopes are more practicable now, when the prognostics of the political and economic barometer are halcyonic. The history of our didymus organizations in this sphere has been didactic and their gnostic practices will always be a tonic to the polyonymous and idiomorphous ethnical economies. The genesis of the programmed organization will dynamize these policies. Therefore, I sympathize, although not without criticism on one or two themes, with the apostles and the hierarchy of our organs in their zeal to program orthodox economic and numismatic policies, although I have some logomachy with them. I apologize for having tyrannized you with my Hellenic phraseology. In my epilogue, I emphasize my eulogy to the philoxenous autochthons of this cosmopolitan metropolis and my encomium to you, Kyrie, and the stenographers.

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

<comment><USER27> The Avalon movie theater in NW Washington, DC, has a "Panorama of Greek Cinema", which has always amused me because the only capitalized word that does not derive from Greek is "Greek".

</comment></comment><comment><USER28> I'd love to have a way to do this automatically with my text .. anyone know of a good way to do this, maybe there are some already-established dictionaries which remove the non-Germanic words out there, somehow?

<comment> pseudonom- I made a little website to do this a few months ago:

[http://angler.herokuapp.com/](http://angler.herokuapp.com/)

</comment></comment><comment> pseudonom- Ha. I made a little website to automatically suggest Anglo-Saxon words a few months ago:

[http://angler.herokuapp.com/](http://angler.herokuapp.com/)

<comment><USER29> This is interesting, I wrote a few samples describing my life and things I own and it suggested no words. Then I pretended that I was starting a school writing, and it found many.

</comment></comment><comment><USER30> Germans love to make long words: [http://german.about.com/library/blwort_long.htm](http://german.about.com/library/blwort_long.htm)</comment>


Our Favorite Scammers - <AUTHOR> http://www.head-fi.org/t/701900/schiit-happened-the-story-of-the-worlds-most-improbable-start-up/5130#post_11289247 <comment><USER2> Schiit Happened is one of the best HW startup book I ever read, so many gems inside. Somebody extract the chapters from the forums and created pdf out of it (with permission of author) and you can download it from here: [https://mega.co.nz/#!RU0SVD5I!9Dn7tK_tXDvjoRCfJ7vV5JFn43-lu1...](https://mega.co.nz/#!RU0SVD5I!9Dn7tK_tXDvjoRCfJ7vV5JFn43-lu1avhxivLnbMWqE)

<comment><USER3> Is the linked story in that book? The chapters don't line up.

<comment><AUTHOR> The three newest chapters form a new book, starting again at chapter 1. The linked story is from the new book, the pdf is the old book.

</comment></comment></comment><comment><USER4> It's good to see a business sharing stories of having been scammed - a lot of times start-ups are so involved in the process of growing the business and making sales that they forget to remember to train their sales team to have good operational security.

A start-up that I worked for got taken for over $100K by a scam artist who, believe it or not, used a picture of a famous middle-eastern leader on a fake driver license to open an account - I'm not kidding. The guy was instantly recognizable from any recent TV news story, and yet the scam artist pasted that picture onto a drivers license (that had otherwise legit information on it) and faxed that in when he opened an account. After opening the account, the scam artist then filed a change of address, which shifted the shipping destination from a swanky neighborhood full of mansions (where the scam artist had stolen an identity from) to a dilapidated building in a really bad part of town. The operations team didn't catch any of this, and shipped the merchandise.

They were only able to get the feds to catch the guy when he showed up and tried to pull off a second heist a few months later.

<comment><USER5> I suspect the photo was a kind of test to see if the target was asleep at the wheel. If the photo had been instantly recognized, the scammer would have simply moved on in search of softer targets.

<comment><USER4> The irony of it was that they already had a whale on the hook. The person whose identity that they had stolen was someone with an incredible net worth. They actually had direct access to his bank account and funded the account on our side with an ACH transfer. The bank reversed the transfer once the guy figured out his account had been hit, but by then it was too late on our side and the goods had already gone out the door.

I have no idea why they used that picture - they took a template driver license, populated it with the guy's personal information, pasted the picture on it, then faxed it to us. I suppose they figured it would be so grainy from the fax that it wouldn't be obvious, or maybe they just did it for the lulz.

</comment></comment></comment><comment><USER6> Great post, and something not many people consider when starting a startup.

This happens with any mid-high ticket item you sell, unfortunately. I ran a hosting company for 6 years and we had rampant fraud even back then. The "tells" were often the same--high-$ orders submitted by someone who hadn't talked to you first, etc.

I do remember a couple of gems from my time running the company. Once, I had a friend who lived in the UK at the time call during UK business hours to verify that a customer had actually placed a large order. (This was back >10 years ago when calling the UK from the US was quite expensive--it was easier and cheaper to have my friend call!) It turned out the order was for real, and we got a happy new customer.

On the flip side, we had a customer order and pay for a server for 6 months with no usage. Suddenly he started using it--for spam! Usually when this happens it means the server has been hacked. Not in this case, however. The dude was a bona fide spammer wanted by the FBI. We seized the server, called the FBI and reported it.

The guy had the nerve to then charge back ALL of his 6 months of hosting through Amex. (Turns out that was part of the scam--Amex allows you to charge back exactly 6 months of purchases.) We filed a counterclaim with Amex, but they sided with him (any merchant who accepts Amex will not be surprised by that story.) We contacted Amex directly letting them know their card holder was a spammer, but he charged tens of thousands of dollars a month on the card and we got nowhere. I suspect in this day and age of social media, we would have gotten a lot farther with it.

Years later, I heard Microsoft, of all companies, finally tracked him down and got him arrested: [http://www.nbcnews.com/id/18955115/ns/technology_and_science...](http://www.nbcnews.com/id/18955115/ns/technology_and_science- security/t/one-worlds-top-spammers-held-seattle/) He had the nerve to use his real address with us, too, which I hope helped the FBI's case. I have the dubious honor of having talked to him on the phone when he was spitting mad after we shut his server down.

There are some real whackjobs out there. Unfortunately, you'll often meet them when you run an online business.

</comment><comment><USER7> "No processor, no matter how good, and no matter how iron-clad their policies may seem, will take 100% liability for scammers. Yes, even PayPal, with their "100% guarantee against fraud." This is the reality. There's a lot of fine print for them to hide behind."

My experience having a merchant account that accepted credit cards was that payment processors accept absolutely NO liability. The merchant pays 2-3% (more for AMEX) and is usually on the hook for 100% of the fraud.

<comment><USER8> Exactly. If there is a chargeback, it's a chargeback. That comes straight out of your merchant account, you don't get paid.

Further, your monthly fees and percentage may go up if your chargeback rate is not kept at a reasonable rate... IIRC there is a fairly direct relationship there. If you can manage to be a low-chargeback account, you can negotiate better deals.

</comment></comment><comment><AUTHOR> Schiit is probably my favorite start up of all time, and it is great that they're writing about it, and I suggest everyone read the entirety of the Book of Schiit.

The Book of Schiit TOC is here: [http://www.head-fi.org/t/701900/schiit- happened-the-story-of...](http://www.head-fi.org/t/701900/schiit-happened-the- story-of-the-worlds-most-improbable-start-up#post_10194517)

Disclaimer: I have a Schiit Bifrost Uber USB and Schiit Asgard 2 on my desk. They are amazing, worth every penny.

</comment><comment><USER9> Just finished the book, and yes it's probably one of the most inspirational books on startups out there. Getting too technical at times, then too businessy...

Got me thinking that this is a kind of an open-source business. Apart from financials pretty much everything else is done openly through this "ongoing book": R&D, production issues, sales, customer support. Kudos to this guy and a big thank you for sharing all this.

(Though I still don't get the reasoning behind the name of the company. I honestly wouldn't have bought anything from them if not this brilliant book.)

<comment><USER10> I can't say I understand the name either; I think it may have been a mistake. But I am a happy owner of a Schiit amp and DAC, and I absolutely love their startup tales, so they could call the company "Horse Fuckers Ltd." for all I care.

<comment><USER9> The name you give is a statement of a kind. Like it or not it's your attitude towards your own products and your customers too. Schiit was meant to be cheap but great quality, so I could interpret it as "somewhat sophisticated shit", hence the unusual spelling. I know, it was meant to be funny and slightly controlversial, but you always have a wide choice of names that meet both criteria. And what you choose in the end is your statement.

</comment></comment></comment><comment><USER9> Why isn't there a centralized black list of addresses that are known to have received fraudulent orders? Just like with IP addresses that are known to have spammed.

<comment><AUTHOR> Dynamic IPs, proxies, (purposely or accidental) open APs, stolen phones, etc.

<comment><USER11> He's referring to physical addresses, not "IP" addresses.

</comment></comment></comment><comment><USER12> Not to be spammy or anything, but since I had a great response to helping out four different teams with fraud detection, I'll drop this here:

If anyone experiences things like this, or are wary of it happening to your business/startup/whatever, and would like some advice on how to either avoid it or identify it, my email's in my profile.

I wrote the book.

</comment><comment><USER13> So how do you prove yourself if ID is no longer accepted? It does happen that I travel to somewhere and need various stuff stat. Especially if it's a consulting gig stretching to months. You can't prepare for everything, hell, sometimes you can't prepare for anything, it's just put down the phone, throw clothes in the suitcase, airport, next you can breathe a little you are on another continent. Crazy life.

Obviously, I only have a Canadian credit card. In the past, this was settled via a quick passport and/or credit card scan. And I understand you guys... but please understand me as well.

<comment><USER14> Do you buy lots of high end audiophile stuff on very short notice for consulting gigs? If so it seems like cultivating a personal relationship with your vendors would probably pay out in spades. If not, I'm not quite sure what your problem is unless you need high end audio gear in every hotel room you visit?

<comment><USER13> No, but I suspect if high end audio gear dealers rule ID scans out then others will too.</comment></comment></comment>


Adventure in Prolog - <AUTHOR> http://www.amzi.com/AdventureInProlog/index.php <comment><USER2> I wish I had come across this book when learning prolog for my "Intro to AI" class. Far more useful than the nearly insane Grad Student that "taught" us the language. I learned more about how broken the human mind can become than I ever did about prolog or AI concepts.

<comment><USER3> You can't just not tell us more. How was his mind "broken".

<comment><USER2> One strange dude. His shoelace came untied once in class, so he tied it around his pant leg to "show it who's boss." The whole experience was simply strange. We agreed as a class that exposure to pure logic must have rewired his mind to give the illogical processes priority over everything else.

<comment><USER3> Hmm. This is one of those cases where I want to know more, but I know that knowing more would only depress me. It's scary knowing you or a loved one could turn out like this. I hope he's better now.

<comment><USER2> I don't think he was "broken" so severely that he couldn't function. But there were definitely some cracks in his psyche. Made for a slightly confusing course. As I recall he still finished his post-graduate research, and is presumably and hopefully now a productive member of society. (Though there are many of my fellow alumni from that timeframe that aren't working in anything related to our fields, having the benefit of graduating during the dot-bomb fallout and the Enron/AA mess. Our "career fairs" that year were... entertainingly silent, to say the least.)

</comment></comment></comment></comment></comment><comment><USER4> This is really excellent. I've always wanted to learn prolog and surprisingly not been able to find a good way. This resource is clear to the point of being boring, which is precisely what I needed. {Add statement about how in the good ole days people understood how to write programming tutorials.}

</comment><comment><USER5> I must admit that the first sentence greeting the reader being "This document ("Work") is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties." is a bit off- putting.

<comment><USER6> You're right. That's left over from it's original publication as a hardcover with Springer Verlag. It's not necessary anymore. I'll take it off.

</comment></comment><comment><USER7> I guess I can stop lending out my hardcopy now.

</comment><comment><USER8> _Very_ cool. I challenge the overachieving Clojurian to port it to core.logic :D

</comment><comment><USER9> My first thought was that this was the original Adventure game coded in Prolog :S

<comment><USER6> That's what inspired it, see the Preface.

</comment></comment><comment><USER10> oldie but goodie.</comment>


10 Levels of Intimacy in Communication - onreact-com http://pleaseenjoy.com/project.php?cat=4&subcat=&pid=136&navpoint=0

<comment><AUTHOR> I think it's hard to say whether texting or IM'ing is more intimate. There's definitely something more personal about getting a message directly on my phone; but it's true that the back and forth interaction is less.

(This line will probably disappear entirely as phones become more sophisticated)

<comment> onreact-com Yeah, agreed. I rather think the main message of this graphic is to show how far away we're by now from each other. So the details whether texting or IM is more intimate are not crucial.</comment></comment>


Ask HN:WHich testing framework should I use as a Rails beginner? - <AUTHOR>

My question is for TDD which testing framework will be easier to pickup for a beginner? I find RSpec a bit hard to grasp. <comment><USER2> None of it is going to come easy. Especially if you have no programming background. I am in the same position as you right now. I know HTML and CSS but the real programming has come a little bit slower. My two cents: skip TDD off the bat. Concentrate on building small apps and following tutorials to do so. Have you checked out rails for zombies? I was actually wondering some similar things about TDD myself and asked this question earlier today:

<http://news.ycombinator.com/item?id=4376527>

Just keep in mind, learning Rails isn't going to be something you can do in just a couple or even a few months. To become good at it you'll have to practice day in and day out for years. But the good thing about it is, you will be able to deploy simple apps with minimal knowledge very soon which is fun!

My favorite tutorial thus far has been Michael Hartl's at <http://ruby.railstutorial.org/ruby-on-rails-tutorial-book>

It's long but it's very informative and walks you through rspec if you do decide to use that. Best of luck!

<comment><AUTHOR> I absolutely agree with you on Michael Hartl's tutorial. Now I am going through Rails for Zombies. I am searching for some open source rails apps which will give me a simple framework to start with.

<comment><USER2> When you say sample framework, I assume you want a minimal sample application to start from? What kind, specifically were you looking for? There are blog apps, to-do list apps, micro-blogs, etc that are all pretty simply...

<comment><AUTHOR> I am looking for an app where the app will have users where users can be searched according to zip code or state. Users can create their profile with their expertise and people can rate their services etc.

<comment><USER3> You should take a look at Railscasts.

Given what you're looking to do: Geocoding gem: <http://railscasts.com/episodes/273-geocoder> Devise gem: <http://railscasts.com/episodes/209-devise-revised>

The former uses the google maps api to handle geocoding but you could use it as well to figure out the distance between two points. You could also use the great circle formula yourself if you know the lat and long of both points (<http://en.wikipedia.org/wiki/Great-circle_distance>).

The latter is one of his pro episodes but if you don't mind watching semi- dated material and picking up the rest from docs you could watch the original episode.

I find the railscasts to be extremely helpful when it comes to understanding both what's available to the rails community (lots of gem coverage) and unique ways to deal with common problems.

<comment><AUTHOR> Thanks timo614. This is a very helpful piece of information. Will be subscribing to railscast soon.

</comment></comment></comment></comment></comment></comment><comment><USER4> My advice would be to use the included test frameworks if RSpec isn't a fit. Anything besides those two options will be likely to be less documented (or more rough) than appropriate for a beginner.

<comment><AUTHOR> Great suggestion. Thanks

</comment></comment><comment><USER5> I learnt RSpec and Cucumber with the RSpec book, it's great

<comment><USER5> <http://pragprog.com/book/achbd/the-rspec-book></comment></comment>