A Localization Horror Story: It Could Happen to You - <AUTHOR> http://search.cpan.org/dist/Locale-Maketext/lib/Locale/Maketext/TPJ13.pod?#A_Localization_Horror_Story:_It_Could_Happen_To_You <comment><USER2> When I was in Japan I did proof reading for a Japanese feature phone. A major Japanese brand, actually. That was really comical.

There was an Australian guy for English, an German guy, an Italian lady, and me for French. What they did prior to the meeting is: * translate from Japanese to English by Japanese people with a poor English level (maybe the software engineers actually) * translate from weird English to other languages by translators who had only the strings, absolutely no context.

In the meeting we had all the strings, and one person from the manufacturers who had access to the "super-confidential" unreleased device.

More than half of the translations were off because of lack of context. The French guy actually translated "Garbage day" to something like "Shitty day", apparently he thought that was a way to mark in your calendar that you had a really bad day.

Pretty often we had sentences like "delete one", and invariably one of us had to ask "One what? I need to know if it's masculine/feminine/neutral". Of course they didn't prepare to that, it was too late to change the code, so they made us do ugly things like "%n item(s)".

Also the Australian guy was loosing faith into humanity: \- That sentence, it's completely wrong, it just doesn't mean anything in English. People will just go "WTF?" when they read that \- We're not allowed to change the English strings, they're already validated \- .....

<comment><USER3> I don't know why nobody seems to put information like "warning: this phone's UI in <your local language> is total and utter crap".

Anyway, what you wrote is exactly why I stick to using all software and webservices - OS, text editors, Facebook, et al. - in en_US instead of my native pl_PL. Because translations are always crappy - even for big players. Lack of context is the key here - translated text often feels out of place, because there usually is some overarching idea behind them that isn't communicated to translators. Then there is lack of consistency. Words in original text often have some site-specific meaning, which tends to also be somehow lost in the translation process. For example, on Facebook the word "like" talks about a well-defined thing, not about the dictionary meaning, so it's _totally not ok_ to randomly replace it with synonyms during translation [0].

I realized at some point that I often look at a crapy translation, guess what was the English original, and then in my mind translate to what it should be in the first place. Because for some strange reason I, the user, have the context, and the paid translation team has not. I guess I'm going to put that into my "Translation issues" file in the "Mysteries of capitalism" drawer, right next to "how on Earth multi-milion media companies can't do a movie translation that isn't a total crap" file. I mean, seriously, you're better off looking for pirated subtitles even if you bought the original because pirates at least seem to have watched the movie they're translating.

</rant>

[0] - I wish more translators would use the approach Jehovah's Witnesses used when doing their own Bible translation. Since it was designed to be studied and analyzed, they preferred accuracy over aesthetics - therefore one of the translation rules was "as much as possible, let's have any given word in original text be always represented by the same word in English". Adhering to that single rule would eliminate like half of the "context missing" problems with software translations.

<comment><USER4> You know what multi-million movie has a translation that isn't total crap? _Frozen_. They really put resources into that. You can look up random Disney songs on Youtube in different languages, and then look up the Frozen songs, and you can sort of tell that they've done a better job even if you don't speak the language.

Even relatively obscure languages like Dutch where they usually just watch English-language movies: [https://www.youtube.com/watch?v=yOueN0sV2SY](https://www.youtube.com/watch?v=yOueN0sV2SY)

<comment><USER3> I agree. Frozen, and other Pixar/Disney/Dreamworks children movies (like Shrek) tend to be of awesome quality in all languages. But I attribute this to the fact that those movies are not _translated_ \- they're being _localized_ , which by definition requires much more work and paying much closer attention.

<comment><USER5> The Latin American Spanish localization of Dreamworks's Shrek is a great example.

They brought in Eugenio Derbez, a Mexican comedian, to voice Donkey (voiced in English by Eddie Murphy). Donkey in particular speaks in colloquialisms and pop culture references with wordplay, so Derbez wrote a bunch of new lines and jokes that referenced Latin American colloquialisms and pop culture.

Children learn different fairy tales in different countries, so they also managed to change the identity of some of the characters without changing their appearances (and without altering video at all, just audio).

<comment><USER6> @daxelrod: Wow, thanks for that. Quite interesting. I always wondered about how that was done and if it was a direct conversion of sorts but I guess it's not. Very interesting.

I just have to ask: How do you know this?

<comment><USER5> All of this information comes from the teacher of a Spanish class I took (we watched the Latin American version of Shrek in the class). I wish I had some more tangible sources to cite.

EDIT: [http://www.imdb.com/name/nm0220240/otherworks](http://www.imdb.com/name/nm0220240/otherworks): "Jeffrey Katzenberg and Dreamworks allowed [Eugenio Derbez] not only to dub Donkey's voice, but to translate and adapt the script of "Shrek" and "Shrek 2" to make it more appealing to Latin America"

I also remember that the Gingerbread Man was one of the characters who was altered, but I don't remember the name of the Latin American replacement.

<comment><USER7> Gingerbread Man is translated as "El Hombre de Jengibre", which was previously unknown to Spanish speaking children.

What was relocalized was the Muffin Man nursery rhyme ([http://en.wikipedia.org/wiki/The_Muffin_Man](http://en.wikipedia.org/wiki/The_Muffin_Man)), which was substituted by Pinpon's ronda song:

Pinpon is a puppet very handsome and made out of cardboard. He washes his little face with soap and water. He untangles his hair with an ivory comb. And in spite of the hair pulling he cries not nor even winces.

<comment><USER5> Ah! Thank you, you're absolutely right, I misremembered the character.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER8> As far as I can tell, the best tool for localisation almost nobody is using is [http://www.grammaticalframework.org/](http://www.grammaticalframework.org/). Licensing is a mix of GPL, BSD and MIT pieces.

It's a high-level functional programming language with a dependent type system specialised for operating on language ASTs. It's resource library, to quote "covers the morphology and basic syntax of currently 29 languages: Afrikaans, Bulgarian, Catalan, Chinese, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hindi, Japanese, Italian, Latvian, Maltese, Nepali, Norwegian bokmål, Persian, Polish, Punjabi, Romanian, Russian, Sindhi, Spanish, Swedish, Thai, Urdu."

In essence, once it has the language-independent AST, it can produce output in all its supported languages with the correct tenses, genders, inflections, etc.

It also seems to have tools for assisted parsing, so you could have an english document and interactively parse it into the correct AST. In addition, the text can be parameterised semantically, so if you changed the gender of a person, that could propagate to all the correct locations and update the translations as required.

While it seems the upfront cost may be quite high in having to learn such a complex system, I think the benefits of having reproducible, high-quality outputs into n languages for free could make this highly advantageous in many applications.

<comment><USER9> I'm very skeptical that this would work outside of toy examples, though it depends on what is meant by language-independent AST.

For example, the best way to translate Spanish "X dió un golpe a Y" would be "X hit Y". But my naive idea of what the AST for the Spanish sentence would look like would be something like `(GIVE (X HIT Y)`, which when naively transduced to English would be the "X gave a hit to Y", which is either unidiomatic or means the wrong thing altogether. In order to avoid this problem, the AST would have to be a more abstract representation of the semantics. And coming up with a sufficiently expressive, tractable, and neutral representation of natural language semantics is an unsolved problem that people are still devoting their whole careers to.

I was briefly involved in a very early stage startup that was considering using systems like this for better machine translation. We ran into problems like the above, and also: ambiguity, and the fact that the hand-written grammars and semantic representation systems were just very brittle and incomplete.

<comment><USER10> > which when naively transduced to English would be the "X gave a hit to Y", > which is either unidiomatic or means the wrong thing altogether

What's interesting, is that there are dialects of English (Hiberno-English spoken in Ireland) where "X gave Y a hit" would be a way to say "X hit Y". :)

<comment><USER11> While in others, it would make X a drug dealer.

<comment><USER12> Or a mate. A mate lets his mate toke.

</comment></comment></comment></comment></comment><comment><USER13> Side note: as you might expect, Wikipedia's internationalization is the only system that attempts to do quantities and other formatting correctly for _every goddamn language on the planet_ , but is considerably easier for translators to work with than the OP's examples (sorry, Sean ;)

I did some work on bringing it to JavaScript and making it HTML-aware, and since then Santhosh Thottingal has vastly extended it and it's become pervasive at Wikipedia. More projects should use it, or at least learn from it.

Demo: [http://thottingal.in/projects/js/jquery.i18n/demo/](http://thottingal.in/projects/js/jquery.i18n/demo/)

Github: [https://github.com/wikimedia/jquery.i18n](https://github.com/wikimedia/jquery.i18n)

<comment><USER14> The Russian demo does not work. Must be 1 котёнок, 2 котёнка.

<comment><USER15> Ironically, this is exactly the case described in the article, and even the article got it slightly wrong. The rules in pseudocode - for this specific sentence! - are as follows:

      if ((n % 10 == 1) && (n % 100 != 11)) {
          // singular nominative  (not accusative as article says) - 1 котенок, 101 котенок, 301 котенок
      } else if (n % 10 >= 2 && n % 10 <= 4 && n % 100 <12 && n % 100 > 14) {
          // singular genitive: 2 котенка, 43 котенка, 1024 котенка
      } else {
          // all other cases plural genitive: 5 котят, 11 котят, 212 котят
      }

But this is true only for this sentence because kittens here are the subject, not the object: with Russian verb "есть" (to be, to exist) the literal translation would be "Kitten/Kittens exists/exist belonging to Harry".

Once the declension of the numbered subject(s) turns to accusative: "Гарри гладит 1 котенка" ("Harry pets one kitten"), the rules become much simpler:

      if ((n % 10 == 1) && (n % 100 != 11)) {
          // singular accusative - 1 котенка, 101 котенка, 301 котенка
      } else {
          // all other cases plural genitive: 2 котят, 43 котят, 5 котят, 11 котят, 212 котят
      }

</comment></comment></comment><comment><USER16> Slightly OT, mi favourite localization error was in Ubuntu when they had that nice netbook interface (that later would become Unity). The network icon label was "Rojo" in the Spanish localization, that is the word for "red" color. What?

Well, if you translate "Net" to Spanish you get "Red"; and if you translate that again (by mistake), you get "Rojo". There you are :)

<comment><USER17> OT means Out of Topic? In french we say HS (for Hors Sujet).

<comment><USER18> I'm really surprised that this is the first time you've seen "OT" being used. I can only presume it's because you don't normally ready English websites/discussion boards but I still find it intriguing that you've never encountered it before.

In Sweden we use "OT" as well but it's referring to "Off Topic" and not something Swedish.

<comment><USER17> I read mostly english websites/discussion boards (reddit, HN) and I know a bunch of abbreviations (IIRC, INB4, AFAIK, QED, IFF, ST...) but I don't remember seeing OT. Learning new stuff everyday :D

</comment></comment></comment></comment><comment><USER14> Article is from 1998 and very much out of date. Read: [http://blogs.perl.org/users/aristotle/2011/04/stop-using- mak...](http://blogs.perl.org/users/aristotle/2011/04/stop-using- maketext.html)

<comment><USER19> Should be reflected in the title, if possible, neh?

<comment><USER20> Cool example, but I think "ne" is the "correct" way to romanize ね.

<comment><USER21> Could also be from German, although this would also be written ne instead of neh. People from the northern part of Germany use this in pretty much the same way it is used in Japanese (at least according to what I know with my limited knowledge of Japanese) I always thought of this as a strange quirk that the same language construct can evolve in two unrelated languages. It's just like parallel evolution in biology.

<comment><USER22> There's also Brazilian Portuguese "né", which is an end-of-sentence tag with _exactly_ the same meaning. It's a contraction of "não é" ('isn't it') and is used in a way akin to German "nicht wahr".

<comment><USER23> Also "isso" which in German is colloquial for "Ist so" and means "That's it" or "Exactly". When in Brazil I always found it funny that they use "isso", short for "isso mesmo", in much the same way.

<comment><USER22> It's funny to think that the conversation fragment

\- ... Né?

\- Isso.

could happen in either Brazil or Germany with the same meaning. :-)

</comment></comment></comment></comment></comment></comment></comment><comment><USER24> It made me remember the Norwegian customer I had.

I needed to write Norwegian localization strings in a YAML file which did not work for some reason.

After 4 hours of debugging, the problem was;

In YAML, the "no:" string (for "norwegian") defined in a YAML file was parsed as a boolean, and this makes the application broke..

<comment><USER25> Yeah, I've run into that, also. Really annoying. I had to quote all of the "no": strings. Looked ugly, but what can you do?

</comment></comment><comment><USER26> In order to avoid these pitfalls, usually I get out of "sentence" mode to "label" mode. For instance: "Directories scanned: 12". Probably not well suited for all cases, but usually good enough for mine, though actually I only have to support pt-BR, es-ES and en-US so maybe that's not saying much.

<comment><USER27> Exactly. All this work, or just restructure the message. It should be acceptable in most languages, because charts and spreadsheets aren't going to have per cell labels. And it has the benefit of being easier to read and parse.

Also, it's a really terrible style to use first person in an app unless it's actually sentient. Otherwise it's annoyingly like Clippy, or just plain obnoxious and presumptive.

<comment><USER3> > _Also, it 's a really terrible style to use first person in an app unless > it's actually sentient. Otherwise it's annoyingly like Clippy, or just plain > obnoxious and presumptive._

I agree, though I found another nice use case, well demonstrated by Bret Victor[0][1]. I played around with it for a while and I find that describing what something will happen in a normal sentence, parts of which you can tweak, is a pretty good way of doing options pages.

[0] - [http://worrydream.com/#!/TenBrighterIdeas](http://worrydream.com/#!/TenBrighterIdeas) [1] - [http://worrydream.com/Tangle/](http://worrydream.com/Tangle/)

</comment></comment></comment><comment><USER28> Kudos to the author of the article for his perseverance in decorating message to fit grammar. I'd go another way, just using more formal and dry format:

        Number of scanned directories: %g
        Number of found files: %g

That solves the problem with Slavic languages at least. Italian aversion to 0 may be mitigated with printing 'none', I guess. Please correct me if this form does not fit other languages.

<comment><USER29> Just scanned the comments to see if anyone would suggest that :) Being the lazy type, that's the first thought I had reading the article. Perhaps it's not appropriate for all target audiences and all target languages but many times you can find a much easier solution by going about it in a totally different way.

</comment></comment><comment><USER30> Funny how Slovene seems to tick all the complications checkboxes :D We have 4 grammatical numbers (singular, dual, plural for 3 and 4, plural for 5 and above), they repeat at mod 100 (so 101 is singular, 102 dual,…), it's an inflectional language with 3 grammatical genders, sentence should take a different form depending on whether the user is male or female,…

<comment><USER31> I was just trying to think of how it would work out in Polish....

directory is "katalog" in Polish, and it would be:

1 katalog

2 katalogi

3 katalogi

4 katalogi

5 katalogów

6 katalogów

....(it doesn't change for any number greater than 5)

But if you wanted to say "X files were found in Y directories" then you would have to say:

....1 katalogu

....2 katalogach

....3 katalogach

....1000 katalogów

(for 1001 even I am not sure if you should say katalogów or katalogach, both sound correct to me)

...and again, the whole thing changes depending on the speaker being male/female + singular/plural("I have found"/"we have found").

Compared to the grammar of Slavic languages, English is super easy.

<comment><USER32> ICU's messageformat solves this easily. One project that supports ICU's messageformat is L10ns [http://l10ns.org](http://l10ns.org)

<comment><USER33> This looks quite nice and powerful and indeed an elegant way of solving the problem with multiple plural forms in a string. The only concern I have with that syntax is that it's yet another DSL, or markup language and translators need to know it, or could get it wrong. Granted, a program for helping translators might do automatic linting (much as Qt's Linguist already warns if you omit placeholders from the translated phrase that are there in the original).

Another thing is that the mini-language grows complex enough that the resulting text can be quite hard to read and understand:

        {people, plural, offset:1 =0{No one went.} =1{{user1} went.} =2{{user1} and {user2} went}.} other{{user1} and # others went}}.

is just a single (or two) placeholder and it takes a while to even parse how it's supposed to work.

<comment><USER3> Well, if we're going to introduce that level of complexity into a DSL, why not go full Turing-Complete and write it in code?

        (case (length folks) (0 "No one went.")
                             (1 ((elt 0 folks) " user went."))
                             (2 ((elt 0 folks) " and " (elt 1 folks) " went."))
                             (otherwise ((elt 0 folks) " and " (length folks) " others went.")))

You can wrap that in a lambda that concatenates resulting strings and voilà, you have "smart" string tables. And it's not a problem to make it even more DSL-y and translator friendly.

<comment><USER33> And then you have the exact same problem as if you'd write that logic in your source code. Just with half a dozen layers of abstraction, a more cumbersome way of displaying strings in your application and another programming language on top. I'd say that's not a net positive.

<comment><USER3> I disagree. That logic has to go somewhere anyway - you can't skip it because it's inherent in the problem of displaying a proper message. So you could at least write it in an expressive language instead of encoding it into what looks almost as readable as regular expressions.

<comment><USER34> Now you need to find a translator who knows Lisp

<comment><USER3> No you don't, in much the same way that you don't need a translator that "knows JSON or XML". Just don't tell them it's Lisp. That's how you do DSLs.

Also, I advocate closer work between translators and developers. Let the translators give the text and explain corner cases to someone who can code up the logic.

BTW. Lisp is only hard for people who acquired this stupid meme that "Lisp is weird/for crazy people". You'd be hard-pressed to find something which is simpler in terms of syntax and readability.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER35> The two Turkish letters dotted and dotless i are often confused by users of poorly localised software. Wikipedia links to a murder case allegedly caused by this: [http://en.wikipedia.org/wiki/Dotted_and_dotless_I](http://en.wikipedia.org/wiki/Dotted_and_dotless_I)

A real horror story.

(Less seriously, Unicode has counterintuitive case-changing behaviours with those letters. If you are working outside the Turkish locale and uppercase a dotless I and then lowercase it, it gains a dot. I am curious about this design decision, since it seems like a basic error in operating a the level of glyphs rather than symbols. Or maybe the opposite.)

<comment><USER20> Upper and lower casing can't be assumed to be inverse; there are plenty of other cases where they will change (e.g. precomposed characters that don't have a precomposed upper case). The correct lower-casing of "I" in English is definitely "i"; the correct upper-casing of "ı" in English is maybe a wrong question, because it just isn't an English letter, so I guess you could argue for leaving it unchanged, but converting it to "I" is probably what the person who wrote "ı" would want to happen when it was upper-cased. Maybe?

<comment><USER35> With Unicode, why aren't the two Turkish Is just treated as if they have nothing to do with the normal Latin I? The fact that the glyph for uppercase dotless I resembles the glyph for uppercase Latin I should be irrelevant, surely. It's a kind of typographic false friend situation.

Maybe there's a missing level of indirection in Unicode that prevents it from doing this, but I can't see how there could be.

<comment><USER20> One answer is that unicode had to import existing documents; I suspect that a lot of documents are written in a Turkish codepage that would have been an 8-bit encoding with the lower half as ASCII, that wouldn't have bothered with a different codepoint for "Turkish" I. As I said, you can't rely on upper/lowercasing roundtripping correctly in general.

(I was about to give the example of ß, which is usually uppercased to SS. But interestingly Unicode has now adopted a codepoint for the (disputed, and currently lacking a typographic consensus) capital version, ẞ. So maybe a codepoint for "uppercase Turkish I" is on the way. Turkish users will still expect to be able to lowercase "I" to a dotless lowercase i though, since a lot of existing documents will have "I"s in)

<comment><USER35> I did a bit of research on this and you're right, legacy encodings are one problem. More seriously there seems to be no established way to manage multilingual text which includes homoglyphs (say by using colour coding) so you would really be replacing one problem with another.

It does seem like this Turkish I problem is the most conspicuous situation, maybe unique, where changing locale changes the behaviour of toupper/tolower. Unicode, on the other hand, has many homoglyphs and duplicate characters which all need to be dealt with.

[http://en.m.wikipedia.org/wiki/Homoglyph](http://en.m.wikipedia.org/wiki/Homoglyph) [http://en.m.wikipedia.org/wiki/Duplicate_characters_in_Unico...](http://en.m.wikipedia.org/wiki/Duplicate_characters_in_Unicode)

</comment></comment></comment></comment></comment><comment><USER36> Just in case people are wondering about the horror story: use ngettext which is a function in the gettext library.

<comment><USER37> Indeed, this is a solved problem. Use ngettext, see its page for all different language variations (even the Slovenian four different forms) [https://www.gnu.org/software/gettext/manual/html_node/Plural...](https://www.gnu.org/software/gettext/manual/html_node/Plural- forms.html)

<comment><USER38> How does ngettext handle "Your query matched %g files in %g directories"?

<comment><USER14> With reordering syntax.

[https://www.gnu.org/software/gettext/manual/html_node/c_002d...](https://www.gnu.org/software/gettext/manual/html_node/c_002dformat.html#c_002dformat)

<comment><USER39> This only addresses the ordering of parameters, not the fact that you need two different counters.

</comment></comment></comment></comment></comment><comment><USER40> Interesting, but I am wondering if it is really worth going through all this trouble, just to support a few edge cases.

Personally, I usually don't even notice small mistakes like "1 directories" (or similar mistakes in my native language). Sometimes I will see the correct version somewhere and think "Oh, nice that they thought of that" but I definitely don't expect it.

Are the possible returns of having a "perfect" translation really high enough to justify investing in a much more complex system? I am sure translators who can code functions instead of just putting values into an Excel table will come at quite a premium as well...

<comment><USER41> You may not notice it. But there are other people who do.

That is the difference between a very well designed product or a product, which just does the job.

That is the reason why engineers should not design interfaces. That should be left to UI/UX experts. Just the other day, I as an engineer myself, complained to another that his product does the job nicely and looks OK. But it was missing this little twist of a finished product that I'd really like to use. Because the interface was designed how I would have done it myself, because lack of UI/UX knowledge.

<comment><USER40> Of course, I'm sure there are people who notice this. My question was whether something like this makes enough of a difference to justify the investment.

As a developer you only have a limited amount of funds and time to spend on your product. Your goal is to invest these in a way that gives you the biggest returns. Of course it's great to not just have a translation that "does the job" and if you can do better you definitely should. But if that you takes a lot of work and only has a negligible effect on your sales, shouldn't you be prioritizing other things?

<comment><USER42> We have 100s of thousands to millions of pageviews per day in 10s of languages on the various pages of our site. The site grows from A/B testing and I have to say that many of these small things do add up over time (they add up to measurable conversion in the funnel). There is the odd one that surprisingly does nothing or does worse but generally, paying attention to language details did prove effective for us. I work on this stuff everyday in a small team where we know more than 30 languages between us and sometimes just two or three of these small changes more than pay for our annual wages in just a month.

</comment></comment></comment></comment><comment><USER43> Huh. I actually took a stab at solving this problem using language generation with my final year [project]([https://github.com/Zarkonnen/A-Natural-Language- Generator-fo...](https://github.com/Zarkonnen/A-Natural-Language-Generator- for-Software-Translation)) at university.

</comment><comment><USER44> Another thing:

"Are you sure you want to quit?" in Slavic language will have gender of the user embedded. You need to know it to adress user correctly.

You can do stilted "To the person that uses this program - are you sure you want to quit?", but that's insane. So everybody just use male version.

<comment><USER45> I don't know, in Russian either "ты" (singular/informal) or "вы" (plural/formal) works fine for both genders. Now, for your example, Google translated result is "Вы уверены, что хотите выйти?" which seems fine to me!

<comment><USER44> "Wy" (plural you) don't work for single person in Polish, it sounds like "communist-speach" to us (almost like you called people "tovarishch") :) It was only used by soviet puppet politicians during communism (as carbon copy of Russian expression).

So it needs "Ty" (singular you), and with singular you "sure" translates to "pewien" for male recipients and "pewna" for female.

In Polish it should be "Jesteś pewny(or pewien)/pewna, że chcesz wyjść?"

So, it's Polish-specific, not Slavic-specific as I thought.

<comment><USER46> How is that typically handled in software? I can also imagine non-software examples where this might be hard (A sign reading "Warning: you are entering a restricted area", etc.)

<comment><USER44> I explained poorly, verbs in second person are gender agnostic, adjectives are gender-dependent.

The "restriced area" is funny, standard version is "Nieuprawnionym wstęp wzbroniony" ~ "For non-priviledged-ones entry is forbidden", it's plural noun made from adjective, in nominative it would be different for male and mixed/female groups (uprawnieni/uprawnione), but fortunately in plural in dative case it's "uprawnionym" for both genders so it works out OK. I guess it's common and maybe that's why the dative case works that way?

In most dialogs in software adjectives are the problem, especially "are you sure". Usually software that don't know your gender for other reasons just use male version.

In non-software world in formal documents it's often written like "he/she" in every gender-dependent place, often with passive voice to cut the amount of "/".

</comment></comment></comment></comment></comment><comment><USER47> Also, if you 'localize' something using Google Translate[1], _please_ let the user choose language somewhere in the app.

For example, the Hostelworld ios app[2] requires the user to change language _for the entire device_. As something of a language perfectionist it leaves the app virtually useless.

[1] Translating to English from other languages works fine for me.

[2] [https://itunes.apple.com/us/app/hostelworld.com-hostels- budg...](https://itunes.apple.com/us/app/hostelworld.com-hostels- budget/id348890820)

<comment><USER48> I wanted to do that on one Android app, but apparently it's impossible to implement with Android's built-in localization features.

</comment></comment><comment><USER49> I created Localize.js ([https://localizejs.com](https://localizejs.com)), a localization SaaS.

Pluralization is a challenge, but we're able to solve this with some pretty simple HTML tags.

For example:

<div>I have <var pluralize="3">3</var> dogs!</div>

Localize.js identifies the <var> tag with the pluralize attribute, and pluralizes the phrase to any language (including languages like Arabic which can have 6 different plural forms).

<comment><USER50> Huh. Localize.js sounds really cool. Fantastic idea.

Can you explain your example a little more? What would translators see in this case for Arabic; would they need to provide three translations? And if there were two variables, nine translations?

"Localization" also implies a lot more than just translation. Does Localize.js handle work like culture-specific number and date formatting? Different collation of records for different languages? How does it identify application-generated text versus user data (eg. on a blog, does it translate blog comments entered by readers, or just text like "Please enter a comment below")?

<comment><USER49> > What would translators see in this case for Arabic

The Arabic translator would have to provide 6 different translations, one translation for each plural form.

> And if there were two variables, nine translations?

We currently only allow for pluralization based on one variable per phrase. We're hoping address this soon.

> Does Localize.js handle work like culture-specific number and date > formatting?

We usually recommend libraries like moment.js to handle date localization. They do a fantastic job at localizing dates.

> How does it identify application-generated text versus user data

We provide a set of HTML markers that you can use to indicate to Localize.js that certain text should be translated. For example...

<div class="blog-comments" _notranslate_ > [...] </div>

[https://localizejs.com/docs/usage/variables](https://localizejs.com/docs/usage/variables)

</comment></comment></comment><comment><USER51> Now, I don't know the state of the gettext utilities in 1999, but the arguments don't seem to hold up anymore (as others commented).

It just surprises me how many times gettext is discarded as "not solving the problem" while it gets many things right.

It feels like the lack of knowledge about the complexity of i18n/l10n and about gettext are often the real issues.

</comment><comment><USER20> I've long found that "externalized" translations in po files (or any equivalent) are more trouble than they're worth, for exactly this reason. Translations need to be functions, so they need to be written in a format that's good for writing functions - i.e. a programming language. What we want is a MessageSource interface, and a bunch of language-specific implementations.

Fortunately I work in Scala, so it's very easy to have an "embedded DSL" that's ordinary, first-class code but not much harder for non-technical translators to read or write than the .po format; we can write helpers for grammatical case or numbers or similar. But having the full power of a programming languages there means that when you hit a case you haven't thought of (and you will), you can fall back to just an if/else.

</comment><comment><USER52> For websites, [http://l20n.org](http://l20n.org) seems the most natural version so far. Or is there something better?

<comment><USER32> You might want to checkout [http://l10ns.org](http://l10ns.org)

</comment></comment><comment><USER53> I dont agree with the article. The author goes about manually implementing localisations, and eventually throwing out GnuGetText. But it DOES have excellent plural support, and a header in your PO file allows chinese to use "nplurals=1; plural=0;" for example: [http://localization- guide.readthedocs.org/en/latest/l10n/plu...](http://localization- guide.readthedocs.org/en/latest/l10n/pluralforms.html)

Or use plurals as such: [https://www.gnu.org/software/gettext/manual/html_node/Transl...](https://www.gnu.org/software/gettext/manual/html_node/Translating- plural-forms.html)

</comment><comment><USER54> And remember the Turkey Test [1].

[1]: [http://stackoverflow.com/a/797043/60188](http://stackoverflow.com/a/797043/60188)

</comment><comment><USER55> People here are talking about complicated, difficult solutions, like using a library to create text in multiple languages from an AST(!)

I think the moral of the post is simple: don't try to generate natural language. It won't sound natural. Just keep it basic.

"Directories scanned: %d" "Directories matched: %d" "Files matched: %d"

...will localize just fine

<comment><USER56> That might be ok for technical people who are used to this kind of "machine speak", but for end users it's often not acceptable. Consider the difference between:

        Purchased credits: %d.
        Remaining credits: %d.
        Buy more : 5 [link] / 10 [link] / 20 [link].

and

       You have purchased a total of %d credits and have used %d of them so far. You can buy [drowdownlist] additional credits by clicking here [link].

Which one do you think will have the highest conversion rate?

</comment></comment><comment><USER32> Please checkout [http://l10ns.org](http://l10ns.org) It handles the pluralization case pretty well. It uses ICU's messageformat which is a markup for defining plural formatting [http://l10ns.org/docs.html#pluralformat](http://l10ns.org/docs.html#pluralformat)

</comment><comment><USER57> Qt takes care of that in a really nice way.

You write tr("I scanned %1 directory.", "", count) and it takes cares of applying the correct translation with the right plurals depending on the number.

[http://doc.qt.digia.com/4.2/qobject.html#tr](http://doc.qt.digia.com/4.2/qobject.html#tr)

<comment><USER58> How does that deal with the case where it should translate to "I didn't scan any directories"? According to the documentation, "In the translated version the variables must still appear." [http://doc.qt.digia.com/4.2/linguist- translators.html](http://doc.qt.digia.com/4.2/linguist-translators.html)

</comment></comment><comment><USER59> We version (localize) projects all the time, so I thought reasonable logic for seeing whether a string is empty is to check whether its trimmed length was greater than two, allowing for two stray characters that show up all the time in content. For example, someone who's not sure how to translate something would type "??" in a field. So, {if $slide.title|length>2} ... This worked for 4-5 languages.

Then our Chinese (Mandarin) division called and asked me to look into buggy behavior with their translations. Turns out a whole sentence got translated to ... two characters, and wasn't showing up.

</comment><comment><USER60> Previous discussion - [https://news.ycombinator.com/item?id=2095334](https://news.ycombinator.com/item?id=2095334)

</comment><comment><USER3> I once suggested an idea that maybe instead of strings in tables one could use something better suited for the task at hand like, say, code? Maybe let the tables store not only strings but functions as well, so that you could handle the more complex cases directly?

I remember being hit in the head by gettext manual and told something about translators not knowing how to code.

Heck, I still think it's a neater idea than gettext.

</comment><comment><USER61> I wonder if Lojban[1] could serve as an unambiguous, largely-context- independent way to store representations of the central concepts, which can then be translated into natural human language.

[1] "a constructed, syntactically unambiguous human language based on predicate logic", [http://en.wikipedia.org/wiki/Lojban](http://en.wikipedia.org/wiki/Lojban)

</comment><comment><USER62> I saw most of this coming. I have studied a little Ancient Greek which has the same problem of the Arabic, and Polish which is similar to the Russian, and now I am living in Italy. I guess it is one of those things though as programmers that we just forget about too much, and just expect translation to a mechanical process in the last stage of the development cycle.

</comment><comment><USER63> iOS localization handles this with its stringsdict format:

[https://developer.apple.com/library/ios/documentation/MacOSX...](https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/StringsdictFileFormat/StringsdictFileFormat.html)

</comment><comment><USER64> What if the text wasn't a sentence?

<comment><USER14> If the text is not a whole sentence or paragraph, it cannot be accurately translated anymore into a number of languages with different word order.

As a programmer with i18n responsibilities, you learn to identify and fix fragmented text problems first.

</comment></comment><comment><USER65> Having quite well in mind the most common problems with localization I tend to use strings like this:

Directory searched: 10. Files found: 0.

They are not shiny but a direct translation is OK in Italian and it could be OK in the other languages of the post (Chinese, Arabic and Russian).

</comment><comment><USER66> I wonder if it isn't better to generate the messages as an AST, and have a language generator, the back-end of a compiler really, that generates strings for each language. I'm sure there will be less edge cases that way.

/edit: wow, downvotes.

<comment><USER66> This compiles to "He likes 2 green cats" in English.

The representation makes no assumption of SVO order, the grammatical category of numbers, and what cases and tenses are available.

        (OPRESENT ((OSUBJECT (OPRONOUN (3, 0))) ((OVERB, "like") OMUL (2, (OCAST (OATTR (OCOLOR "brown")), (ONOUN (OANIMAL, "cat")))))))

I'm sure someone smart will tell me what assumption I made that's invalid in some language I do not know, but this already is better, and simpler, and more correct than a lot of text-mapping based internalizations I've seen.

And I will be able to correct my S-expr to get rid of more assumptions, and I will just make it longer perhaps, but I won't need to write all the convoluted code prevalent in the article.

Also, with AST-based representation you can add whatever context you need. For example, were I to have used "pig" instead of "cat", this would have already worked fine, since we have (OANIMAL, "pig") and not (OPERSON, "pig"). This is trivial, but you can add whatever amount of context required.

<comment><USER22> Now I'm just wondering about the lexicon since the primitive tokens are things like "like". One potential problem is when two languages don't have words with enough semantic overlap to be comfortable using one as a translation for another. Another potential problem is when

An analogy to my other comment on AST translation: in English you "like doing something" but in German you "do something gladly" (and again in English you "like a person" but in German you can "have a person dear", akin to English "hold dear"). If we expect that the AST can produce a translation using the single verb "like", we may be in for trouble if the target language doesn't do that (although maybe code can be written that uses the AST and that's aware of this complexity as part of the realization of the translation).

Another example could come from the problem of describing states of being or perception, like "I'm cold", "I'm tired", "I'm hungry", "I'm thirsty", "I'm sick", etc. In English we really like using "to be" plus adjectives for such situations, but other languages have other preferred strategies. For example Latin has specialized verbs for the actions of (at least) being hungry, thirsty, or sick (like esurio, sitio, aegroto); in Romance languages people often "have" hunger or thirst (Spanish "tengo hambre", lit. 'I have hunger'; Portuguese "estou com fome", lit. 'I am with hunger'); in German it is cold "to" a person ("mir ist kalt", not "ich bin kalt" 'I am a cold person').

If you imagine having your AST start with Latin, you may have a challenging story about how you could get from "sitisne?" to "are you thirsty?" "¿tienes sed?" "está com sede?" and "hast du durst?" \-- not to deny that it may be achievable with enough work.

</comment></comment></comment><comment><USER67> This is by far my favorite bit of documentation. I have to go look it up every time a manager or client starts asking for localization to justify my high estimates on how long it'll take.

</comment><comment><USER68> So the solution is to design and implement your interface in a Slavic language (presumably most complex, as we found so far) and translate down to other languages with less demanding rules?

<comment><USER61> Could be a perfect use for Lojban.

</comment></comment><comment><USER69> The L20n library handles all these cases: [https://news.ycombinator.com/item?id=8892273](https://news.ycombinator.com/item?id=8892273)

</comment><comment><USER70> _Edit:_ Disregard, turns out things have improved

> The %g slots are in an order reverse to what they are in English. You wonder > how you'll get gettext to handle that.

I learned C/++ after C# and this is one thing that _really_ got to me. String interpolation in C++ is extremely primitive, which would be fine only if more recent iterations of stdlib had something that wasn't so completely incompetent.

 _For those who don 't use .Net, the Italian translation would have been: "In {1:g} directories contains {0:g} files match your query." It doesn't solve all the problems, but being able to specify indices in your template string does solve many._

<comment><USER14> The article is outdated. Gettext does have reordering syntax.

[https://www.gnu.org/software/gettext/manual/html_node/c_002d...](https://www.gnu.org/software/gettext/manual/html_node/c_002dformat.html#c_002dformat)

<comment><USER33> Makes me wonder why anyone would ever design a translation system that _doesn 't_ have the ability to reorder placeholders from the very first version. Perhaps if the author doesn't know anything about languages andn their differences, but in that case they probably shouldn't write such a library ...

</comment></comment></comment><comment><USER71> I don't know If I am simplifying to much but this seems something handlebars could solve in a minute! Every translation could just be a template.

</comment><comment><USER72> I loved the irony of

> [\xE9 is e-acute in Latin-1. Some pod renderers would scream if I used the > actual character here. -- SB]

</comment><comment><USER73> This just shows the beauty of the Unix way of doing things. Simply:

12 10 4

works in all locales. :-)

<comment><USER33> Until you can display negative numbers¹. Or have native numerals². Or need to know what the numbers even mean. :-)

__________

¹ I tend to set my minus sign to U+2212 to catch errors in code where we just use ToString() instead of ToString(CultureInfo.InvariantCulture). Almost as much fun as putting a Unicode character into your user name that isn't representable in the current legacy codepage on Windows.

² ۱۲ ۱۰ ۴ probably won't work as input to the application trying to parse that line ;)

<comment><USER74> How do you change your negative sign on a unixoid? The only reference to negative signs in locale(5) is under LC_MONETARY.

</comment></comment></comment><comment><USER75> suddenly love my language (Turkish) although there are special characters. 1 elma (apple) 2 elma 3 elma . . 10 elma

</comment><comment><USER76> I love this article, and used t send it to none-technical people all the time. <3 Sean Burke, the author

</comment><comment><USER77> That is so, so awesome.

</comment><comment><USER78> This happens when you are a perfectionist.

</comment><comment><USER79> TL;DR - when you are facing a localization problem - you have to parametrize the units of measurements in your text.</comment>


How China's winemakers succeeded (without stealing) - <AUTHOR> https://theconversation.com/how-chinas-winemakers-succeeded-without-stealing-94604 <comment><USER2> TL;DR - "While it's unlikely Chinese winemakers will be threatening their French peers anytime soon, they are now decidedly on the world's wine map."</comment>


Show How, Don't Tell What - A Management Style - <AUTHOR> http://tomayko.com/writings/management-style <comment><USER2> > dispensable

Now that's not a positive feeling is it? I'm not 100% convinced this is an OK thing to pursue. There are lot of work-places where being dispensable isn't a good thing.

</comment><comment><USER3> Wonderfully articulated. So thankful this is out there. I <3 github.

</comment><comment><USER4> Nice note on how to lead the team lead themselves... Things do get tricky though when in consulting/custom app delivery environments, where you have more factors to take care of...

</comment><comment><USER5> Decentralized control strengthens the whole thing. Nice article!

</comment><comment><USER6> Wow, that's totally mind-blowing management :) Will have to acquire that ASAP.

</comment><comment><USER7> Nice article man! Thanks for share it!

</comment><comment><USER8> love it</comment>


Move over, Doogie Howser; here comes Engineer Biswas - <AUTHOR> http://mytown.mercurynews.com/archives/sunnyvalesun/04.29.98/SanjitBiswas.html

<comment><USER2> 1) This is from 1998.

2) I didn't realize until I googled _Sanjit Biswas_ that he was one of the cofounders of Meraki. Great story. I guess he won't need to go do R&D, after all.</comment>


Nobel prize winning scientist Prof Michael Levitt: lockdown is a "huge mistake" - <AUTHOR> https://www.youtube.com/watch?v=bl-sZdfLcEk <comment><USER2> Let me fix that headline for you: A guy who won an award for some work gives his opinion about some other thing.

Congrats, dude. You've got an opinion. Enjoy your freedom of speech.

<comment><USER3> >Michael Levitt is a biophysicist and a professor of structural biology at Stanford University, a position he has held since 1987. Levitt received the 2013 Nobel Prize in Chemistry, together with Martin Karplus and Arieh Warshel, for "the development of multiscale models for complex chemical systems"

"Some guy."

<comment><USER4> does knowledge of biochemistry give you knowledge of epidemiology? it might look related, but it's not.</comment></comment></comment>


Man made structure the size of a 747 Airplane found at bottom of lake in Israel - <AUTHOR> http://www.cnn.com/2013/04/19/world/meast/israel-ancient-structure-mystery/index.html?eref=igoogledmn_topstories

<comment><USER2> A pile of ballast stones maybe.</comment>


Class Action Credit Card Skimmers Device at Gas Pump in Florida - <AUTHOR> http://www.gasstationfraud.com/ <comment><AUTHOR> When faced with a credit card skimming lawsuit, the best thing you can do is seek the services of a professional lawyer to ensure that you do not suffer any financial loss due to fraudulent transactions and to protect your credit history.

[http://www.gasstationfraud.com/](http://www.gasstationfraud.com/)

</comment><comment><USER2> This looks like spam.</comment>


A password hash storage scheme that prevents efficient password cracking - <AUTHOR> https://github.com/PolyPasswordHasher/PolyPasswordHasher <comment><USER2> I'm curious what threat model this protects against that isn't also trivially covered by bcrypting hashes and then encrypting them with a symmetric key that has to be provided to the system at boot time by a human or keywhiz or similar. It seems they're trying to protect against an attacker who has DB access but not RAM access, which is a very important vector to consider but this seems to be an overly complex way to handle that.

<comment><USER3> > boot time by a human

From the paper:

> The server will restart periodically. All data kept in memory is lost at > this point and the server must restart _using only the data on disk_ – which > is attacker visible.

So I guess your solution is correct and trivial but the author's solution doesn't use data from outside, not even a user provided symmetric key.

<comment><USER2> It does use data provided from outside: you either need to provide enough valid passwords for it to recreate the secret, or leak data from the stored secrets, as described here:

[https://github.com/PolyPasswordHasher/PolyPasswordHasher#if-...](https://github.com/PolyPasswordHasher/PolyPasswordHasher#if- the-attacker-cant-check-individual-accounts-how-does-the-server-check-the- first-account-after-rebooting)

<comment><USER3> They leak data but their threat model involves that the attacker can get this leaked data too (they leak it to the hard disk?).

>provide enough passwords

Why don't they just store some dummy users' (with zero privileges) credentials directly on the hard drive? They simply can provide valid passwords from it after reboot and your attacker can have these passwords since they can't do anything with them. Maybe their leak strategy involves something like this?

</comment></comment></comment></comment><comment><USER4> The reason I had difficulty using scrypt is because I didn't want to DoS my own server. Script asks you to choose a "work factor," and the higher the work faster, the harder it is to reverse the hash. Trouble is, if you set it too high, it's a bit painful to change it later. If you make a computationally difficult hashing scheme, then a lot of simultaneous logins can therefore force your server to use all of its CPU.

Does this suffer from the same issue?

It isn't necessarily an important issue. Maybe nobody will figure out they can take down your service that way. Maybe rate limiting is enough. Maybe you can solve it by having servers dedicated to hashing.

I was just curious about the performance characteristics:

 _Suppose that three people have passwords that are each randomly chosen and 6 characters long. A typical laptop can crack those passwords in about 1 hour. If you take the same passwords and protect them with PolyPasswordHasher, every computer on the planet working together cannot crack the password in 1 hour. In fact, to search the key space, it would take every computer on the planet longer than the universe is estimated to have existed._

The contradiction is that if users can log in to your service quickly, then they can try a lot of passwords quickly. So is this more expensive than scrypt?

If an attacker has read-only disk access, they can swipe any unencrypted data. Scrypt protects you from this, and it's straightforward about the requirements and computation costs.

In practice, what kind of CPU usage would a PolyPasswordHasher scheme need?

<comment><USER5> Online DoS shouldn't _really_ be a problem, since you should be rate limiting logins on a per-IP basis to prevent online brute-force anyway. Of course, typically nobody does that.

'Server relief' is dumb... correctly implementing a 'hashcash'-like scheme to prevent excessive CPU resource commitment is non-trivial. It will require either persistent pre-login server state, and/or cryptographic IP/session binding, both of which open up a second DoS vector.

Implementing Scrypt etc in the browser doesn't completely prevent DoS, and sacrifices your ability as an operator to ensure passwords are being appropriately salted and munged (because of third party clients, unauthorised API users etc). Plus, attackers can just start using malicious webpages or botnets to crowdsource their hashing efforts which, because it scales horizontally, could actually _speed things up_ for an attacker if you're server isnt doing any rate-limiting on the final hash+authentication stage.

<comment><USER6> Limiting logins per IP address is a luxury that cannot be afforded by developers of applications targetting some Eastern countries or which are expected to be primarily used by mobile devices, due to pervasive usage of NAT and shared IP addresses. You are simply trading one form of DoS for another :/.

<comment><USER7> Seems like it should be possible to rate limit _failed_ logins, and of course failed logins on a per-account basis.

<comment><USER8> Either way, how are you going to rate-limit failed logins while at the same time not allowing a DDOS of a user login? If I am using a botnet to keep trying passwords for Sarah Palin, how are you going to know when the real Sarah Palin logs in from a new computer? Sarah Palin will never be able to log in again from a new computer, unless she uses a key from her old one.

<comment><USER9> I would assume that you'd simply do (increasing) timed lockout periods by user/ip combination.

At some point you have to accept that administrators will need to do some work, and if 200 IPs are trying to log into the same account 5 times every 15 minutes you should probably email the user and lock the account.

</comment></comment></comment></comment></comment></comment><comment><USER10> I haven't read the full paper, so I don't have a complete understanding of this scheme...

But what stops a malicious attacker from registering a bunch of dummy accounts, and then using the known passwords to reconstruct the Shamir Secret?

<comment><USER11> Similarly what do you do for the first couple of users that need to legitimately login but you don't know the secret yet?

(I also haven't read the paper, but the concept is intriguing).

<comment><USER12> There is the option to "leak" a portion of the users' salted hashes, so that the users can be verified upon reboot. This leaked information harms overall security but, even with this option, the scheme is still better than regular salted-hashes.

</comment></comment></comment><comment><USER13> [https://password-hashing.net/](https://password-hashing.net/)

<comment><USER14> This is a very solid point. We already had an open cryptographic competition to select a password hashing standard, and we have a winner: Argon2 is being developed as a new standardised password hash (i.e. slow-hash).

If you're going to introduce a new one, it should go through at least the same level of cryptanalytic scrutiny before anyone uses it.

<comment><AUTHOR> This is not a password hashing algorithm, but storage scheme. It's purpose is orthogonal to Argon2.

<comment><USER15> Complementary?

</comment></comment></comment></comment><comment><USER16> This seems useless to me because of the well-known tendency for people to use the same username and password on multiple systems. A hacker need simply try a series of known username and password combinations until they have generated enough successes to crack the system.

</comment><comment><USER17> Are incorrectly stored passwords really the problem with a lot of the last few major security breaches? For instance, I read that Sony hack was an act of social engineering. Anthem was hacked via phishing attack. Ashley Madison hackers got in via SQL injection. I guess is all of this complexity really worth it for an average company when it doesn't even seem to be the root of the problem.

<comment><USER18> It's not really about keeping people from breaking into _your_ site, but rather keeping them from using the data they get from your site to break into _other_ sites.

Basically, a lot of people will use the same credentials on both (for example) Ashley Madison and their bank. If AM does a bad job storing their passwords, then an SQL injection there can be used to reconstruct the users' passwords and then log into many of their banks.

<comment><USER19> HSM are freely around for Ashley Madison to buy with their multi millions that are optimized for hi speed crypto functions with physical keys that can't be extracted by a remote attacker stealing the db. Since they don't bother to use easily found current solutions don't see why any of these corps with massive breaches would bother to use this beta software solution either.

</comment></comment></comment><comment><USER20> It seems to me that after a new reboot it's impossible to register new accounts, or change any passwords because the server does not yet know the "line".

You would need enough logins for it to calculate the true line before it could create any new passwords.

</comment><comment><USER21> What's wrong with PBKDF2?

<comment><USER22> Plenty, PBKDF2 is ASIC friendly and not memory hard, things addressed by better schemes...

</comment></comment><comment><USER23> It doesn't look like an improvement to me.

During normal operation it has a black box that validates passwords quickly. The PloyPasswordHash is the key to how it does it - but really it doesn't matter. All that matters is a password (or a hash of it) goes in, the blackbox maybe reads some data from the (effectively public) password database, and a yes/no comes out at the cost of stuff all CPU time.

The point is - if you can reproduce the blackbox once per GPU node on a password cracker it's no better than any other scheme.

So the security of the scheme rests on the attacker not being able to reproduce the blackbox. If it were a real blackbox sitting somewhere secure then maybe - but it's not. They make a large point of saying this scheme has no secret hardware sauce - is it's just software, in reality just another process running on the web server. If you managed to get a copy of the memory image of that process it's game over. But we can't use that weakness to attack it because it is acknowledged in the paper.

During normal operation the blackbox creates it's secrets by effectively combining a _lot_ of passwords (say N) from users. Thus you need N valid passwords before you can crack one. I think they achieved that, and it does indeed make the it near impossible to recreate the blackbox by brute force - if all you have is the public password data base and a copy of the code.

But it's not that simple. Firstly they acknowledge a naive implementation doesn't work because an attacker can just create N accounts and feed the passwords to the blackbox so it can initialise itself. In addition there is a bootstrap problem - no user can validate their password until N password have been gathered by having N attempted logins.

They get around that by having N (or close to N) special accounts which they call protector accounts. These accounts are presumably created by the server admin and thus can be trusted. They are used for both bootstrapping (implying they are available at boot time) and preventing the flood attack (by insisting some of the special accounts must be part of the N).

And so we get to the real issue: the passwords for those accounts must be entered when the machine boots. Effectively they are the secret the blackbox needs to do it's stuff. Replacing the PolyPasswordHash with a process that demands a single secure password be entered when the machine boots would work just as well. Eg, that password is an extra salt fed to a cryptographic hash along with the password word and on disk salt, and the result must match the hash stored on disk. Without knowing that salt there is no way to validate the passwords.

Sure entering N passwords isn't hard, but would you enter N passwords when there is a method offering equivalent security when you enter just one? And even that isn't the real issue - the real issue is fuck all corporations on the planet have employees willing to be woken up a 2 AM in the morning when a server boots to enter just one password.</comment>


Ask HN: Freelancers...what PM tool do you use? - <AUTHOR>

What project management tools and are you freelancers on HN use? Also how do you manage your client conversations because I have 1 client that sends me around 4-5 emails every day and my inbox gets cluttered. <comment><USER2> I run a small bespoke software development company with 2-3 employees and 3-4 clients. It sounds incredibly small, but nevertheless I was getting overwhelmed.

I evaluated various options and settled on liquidplanner, I don't regret it.

\- I can enter that some employees only work a certain number of hrs e.g. Mon/Tue/Wed 3 hrs, Thurs/Fri 8 hrs. If I say a task takes "20 hrs" then it takens the availability into account in the planning.

\- Range estimates for tasks, i.e. "this task will take between 4 hrs and 2 days".

\- I prefer the ability to update a task with "I did X hrs already, I now prodict Y-Z hrs to go", as opposed to saying "50% through the task, which was originally predicted to be X hrs.". As you go through a task, your understanding of it changes. I think updating the past/future hrs more closely fits how you work.

\- With many tools you can drag task bars to the left/right in the Gannt to make them earlier/later. I don't know why you'd want to do this? With LP you just specify how long it'll take and who's doing it, and its priority relative to other tasks, and LP tells you when you'll be doing it.

\- I often have the problem that employees claim they're "finished" and having nothing to do. I send emails around with bullet points but they still seem to get confused. With LP there is a section they can log into at any time called "my work" which shows them an up-to-date view of all their tasks, extracted from the Gantt, in order of priority.

\- My clients sometimes feel they don't know what's going on (if we're programming some back-end stuff, for instance). They get a better feeling when they see their Gantt. They can log in and do that. But I don't want my customers seeing each other, so they only see their Gantt. Nevertheless, the reality is that resources (e.g. me) are shared, so they're not actually independent projects/sheets. LP knows that I do task X before task Y, and task X might appear on one customer's portal and task Y on another's.

\- What tasks and employees should I be concerned about, in terms of them delaying the project? I can select any task and selects its critical path. Because resources are shared between projects and clients, it can accurately tell me that in order to get customer Y project done on time, I have to finish tasks for customer X (or re-arrange them.)

</comment><comment><USER3> This may be a _very_ unpopular opinion, but: I feel like modern technology has made the 'cluttered' inbox and 'managing emails' more of an imagined problem than real one. I use gmail, and I have a few rules for tags, and use tags for things that need a further follow-up, but I rely _very_ heavily on its fabulous search and threading abilities.

I think there is a mindset that a neat inbox is a neat life or something like that, but I've usually treated organizing only as a way to make my tasks and tools easier/faster/more accessible. Mail is a problem that, regardless of volume, isn't overly concerning to me.

With gmail in particular there is also the archive vs inbox, but it's largely the same thing.

</comment><comment><USER4> I will recommend you <http://www.redmine.org/>. we are using this amazing tool for our projects (3 of them) our clients, PM, and developers can take advantage of it. It is a powerful communication tool.

</comment><comment><USER5> Trello

<comment><AUTHOR> That is just a planning board...how do you deal with everything else like time tracking and client management...or you just use other apps for each specific role

<comment><USER6> Harvest has a time tracking extension/plugin for Trello. I believe there are others

</comment></comment></comment><comment><USER7> Podio

</comment><comment><USER8> Your problem's cause is rooted in a a basic economic principle, supply and demand. When you quickly reply to each email, you become a cheap resource for help, undermining the usefulness of the client thinking through problems themselves, or perhaps thinking through their problems a bit longer before sending another email.

The solution? Delay your responses by 1-2 hours. Decreasing the supply on your side will serve to increase the "cost" of each interaction, since they have to wait for reply. You'll find the emails stop sounding as frantic and disorganized/incomplete, and not as many are sent.

<comment><USER9> Great point - I didn't even think of this. To add, I would reply to them once or twice a day, in one condensed email that addresses all of their emails. Also - I use Gmail for my business account so I can easily click on the 'Move To.." -> "Label" button, effectively archiving and organizing it at the same time.</comment></comment>


Show HN: App that protects you from getting hacked remotely (and it's super fun) - <AUTHOR> http://glitchi.me

<comment><USER2> 'Every friend in glitchi has a public and a private key. You "lock" the message with your friend's public key and send it their way. Once they receive it, they can "unlock" and the message with their private key.'

Well, if your target user are teenage girl, ladies, or celebrity who love sharing their boobs. i think it's to much complicated for them.

<comment><AUTHOR> We have implemented public - private key encryption without adding friction. It is behind the scenes. Our goal with glitchi is to make sure your information stays between you and your loved ones. The system is designed such that no body else has access to it.

</comment></comment><comment><USER3> First you mention the "celebrity hacks" and then you say "If our servers get hacked, your messages and photos are not accessible".

As far as I know, hacking servers was not involved in the "celebrity hacks".

<comment><AUTHOR> We are eliminating all possibilities of remote hacking. Including social engineering, which was how the celebrity hack happened.

</comment></comment><comment><USER4> Differences to Threema? [https://threema.ch](https://threema.ch)

<comment><AUTHOR> simple to get started, focus on overall experience and fun without security getting in the way. An app for regular users :-)

</comment></comment><comment><AUTHOR> Hey guys! We created this app in response to the celebrity hack of 2014.

<comment><USER5> I like the design of the website and the concept of the app sounds great.

My only real criticism is I feel like the "what is glitchi" tab should give a better description of what glitchi is. Once I scrolled through the "how it works" tab I understood more fully, but was mildly annoyed at first that I didn't know what your app did right away.

<comment><AUTHOR> thank you for the feedback.</comment></comment></comment>


Prisma transforms your photos into artworks using the styles of famous artists - <AUTHOR> https://techcrunch.com/2016/06/24/prisma-uses-ai-to-turn-your-photos-into-graphic-novel-fodder-double-quick/ <comment><USER2> This is the style transfer neural net stuff much like Dreamscope - [https://dreamscopeapp.com](https://dreamscopeapp.com) \- I guess.

(Custom filters with the colour matching option in the latest update leads to some spectacular results.)</comment>


TypeScript: Vote for Experimental Support of Optional Chaining - <AUTHOR> https://github.com/Microsoft/TypeScript/issues/30167 <comment><USER2> Clarification: TS team is aware of this feature desire and has a plan to support it (their plan is hinged on an existing standard that is still being locked down for JS; details in [https://github.com/Microsoft/TypeScript/issues/16](https://github.com/Microsoft/TypeScript/issues/16)).

No real benefit in voting on it now, other than to express your added desire for a thing the TS team already knows people want.

</comment><comment><USER3> Language design should not be determined by "votes".

<comment><USER2> Wellllllll....

Languages are used by people. So it depends, a lot, on the goals of the stewards of a language. Votes can be a useful signal for whether or not people are going to care about your language enough to adopt it.

... but it's absolutely true that voters can vote for the moon and then skip off blissfully, never having to worry about how you implement the Apollo project.

<comment><USER4> Yeah, votes aren't _useless_. Obviously you shouldn't just go implement the things that get the most votes without question and ignore everything else. However, if there's two things I think I should implement and the community is much more excited about one than the other, I should probably do that one first. If something gets a whole bunch of votes and I think it's a bad idea that means I need to actually take the time to explain why it's bad rather than just leaving it languishing in the backlog. If I think something's going to be great but it doesn't have a lot of votes, it means that I need to put more work into explaining why it's useful than I might otherwise.

</comment></comment></comment><comment><USER5> It's been years since this proposal and everyone keeps arguing over semantics yet I don't see any semantics being changed. So what's the holdup? I understand constraints and external factors/dependencies but this seems like such a trivial change that it boggles me we don't have this as a standard feature yet.

</comment><comment><USER6> Interesting. I think I saw this in Swift? Or c#? I guess in Python this is where EAFP comes in.

I definitely hate chains of guards to get at a nested property.

<comment><USER7> C# has it.

<comment><USER8> Yep, they're called _null conditional operators_ [1].

[1]: [https://docs.microsoft.com/en-us/dotnet/csharp/language- refe...](https://docs.microsoft.com/en-us/dotnet/csharp/language- reference/operators/null-conditional-operators)</comment></comment></comment>


Who vacuums at 12:31 am? - <AUTHOR>

Answer: My neighbor does. <comment><USER2> I do too neighbor!</comment>


Ingres will announce a new open source database platform on Nov.18th. - <AUTHOR> http://blog.internetnews.com/skerner/2008/11/new-open-source-ingres-databas.html

<comment><USER2> I used to use Ingres, back in the day, and it had some fantastic technology. It's too bad their marketing folks weren't as effective as Oracle's...</comment>


Draw on this Website - <AUTHOR> https://drawonthiswebsite.com <comment><USER2> Not sure what I expected but the first thing I noticed is that I have to pay 99cents for the marker. So no thanks</comment>


The Polygons of Another World: Atari Jaguar - <AUTHOR> http://fabiensanglard.net/another_world_polygons_Jaguar/index.html <comment><USER3> I'm a former Jaguar developer too, and reading the article was a strange experience, remembering things from ages ago. I'd forgotten most of the details, as well as how it felt.

Also the Atari ST mention. I'm getting all sorts of 80s and 90s flashbacks from that story, of what it "felt" like to program on those machines.

All those _fiendishly clever_ timing and register hacks to make the video and audio hardware do things it wasn't designed to do, well outside their design parameters, and other tricks to make 8-bit and 16-bit machines generally do things nobody thought possible, until it was.

That feeling is something I miss a bit, as it's difficult to find tricks that make the "impossible" possible on modern hardware.

[Edit: I suppose Spectre and friends qualify :-)]

<comment><USER4> The stories of the ST (AMY chip [http://www.atarimuseum.com/computers/8bits/XL/ASG/Chips/AMY/](http://www.atarimuseum.com/computers/8bits/XL/ASG/Chips/AMY/)), STE botched launch ([https://www.youtube.com/watch?v=oarR61SeY8E](https://www.youtube.com/watch?v=oarR61SeY8E)), Falcon ([https://www.youtube.com/watch?v=cBTXGgb__y4](https://www.youtube.com/watch?v=cBTXGgb__y4)), Lynx ([https://www.mentalfloss.com/uk/games/36270/atari-lynx-the- wo...](https://www.mentalfloss.com/uk/games/36270/atari-lynx-the-worlds-first- colour-handheld-games-console)) and Jaguar (see other comments in this thread) all make great stories!

Some of the stuff that were done on the machines is jaw dropping - <USER2> raytracing on the Falcon for instance: [https://www.youtube.com/watch?v=_cKRZ8QgH5o](https://www.youtube.com/watch?v=_cKRZ8QgH5o)

Doom on the Atari ST (not Wolfenstein, more sophisticated with heightmaps, lighting, 64 colours etc): [https://www.youtube.com/watch?v=QCvx2O5M69E](https://www.youtube.com/watch?v=QCvx2O5M69E)

Complex texturemapping on Atari ST: [https://www.youtube.com/watch?v=gHwUchzEG8k](https://www.youtube.com/watch?v=gHwUchzEG8k)

Polygon landscapes on the Lynx: [https://www.youtube.com/watch?v=DPexnRsNJDs](https://www.youtube.com/watch?v=DPexnRsNJDs)

<comment><USER5> You forgot stock 16MHz 1992 Falcon Quake 2 engine [https://www.youtube.com/watch?v=WpwlZgQPCpk](https://www.youtube.com/watch?v=WpwlZgQPCpk)

</comment></comment></comment><comment><USER6> As a former Jaguar developer, I'm getting PTSD just looking at the diagram with the four different CPUs, all on the same memory bus in constant contention, all with their own unique machine instruction set.

<comment><USER7> I didn't know much about this, but was surprised to read _"a Motorola 68000 […] running at 14Mhz […] two 32-bit RISC processors running at 26.59 MHz"_

I wondered how those could share a bus, with that weird 1: 1.899 ratio between CPU frequencies. I think [https://en.wikipedia.org/wiki/Atari_Jaguar#Processors](https://en.wikipedia.org/wiki/Atari_Jaguar#Processors) answers that. It says the 68000 ran slightly slower, at 13.295 MHz. That makes the other clocks exactly twice as fast.

<comment><USER8> Devices can exchange data across clock domains.

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

[http://ai.eecs.umich.edu/people/conway/VLSI/VLSIText/PP-V3/2...](http://ai.eecs.umich.edu/people/conway/VLSI/VLSIText/PP-V3/2s/V3.Ch7-2s.PDF)

<comment><USER9> Yeah, but it's weird for devices in different clock domains of the time to share a classic parallel system bus. They "can" theoretically, but practically they didn't because of the latency that cross domain clocking imposed.

</comment></comment></comment></comment><comment><USER10> I find the Amiga graphics are the nicest, then the Jaguar, then the 3DO's are so terrible and overwrought I never would have liked this game if this was the first version I played.

Nostalgia? Maybe. But I find the minimalist polygon graphics of the original a big part of what made Another World a big hit. At least to me. In my mind this is related to the concept of "closure" as described in "Understanding Comics": the more abstract, more symbolic the graphics, the more my mental processor can give it hyperrealistic meaning in my mind; conversely, the more detailed the graphics, the less interesting they become and the less room for my mind to "complete" them. The beast as a black outline with eyes and fangs is terrific (and terrifying). The beast as a more detailed rendition would probably just look silly.

Plus, you know, the polygon graphics look _objectively_ cool ;)

<comment><USER11> I was an Amiga user, and I certainly can see why you prefer it, but the Jaguar ones look great as well (something I'd never have admitted to back in my Amiga days when Atari was "the enemy") - it feels like pixel art made for the resolution.

The problem with the 3DO one to me is that it looks like it was just downsampled from a high resolution image rather than was being drawn for the resolution it was rendered at.

<comment><USER12> > back in my Amiga days when Atari was "the enemy"

To the best of my recollection that was the first major fanboi war in computers, also amplified by the advent of pre-internet online community in the form of BBSs (Bulletin Board Systems). I fondly remember accessing GEnie[0] from my trusty Atari 1040ST (my first home computer, since it had midi builtin).

However, I have to admit, the whole fanboi thing struck me as silly, since Amiga's were graphically superior, while Atari ended up attracting midi developers and users. Not until much later did I realize, that in marketing terms, a fanboi war may very well benefit both sides. So while I still shake my head at fanboi posts, I also see why manufacturers like those wars.

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

<comment><USER13> _To the best of my recollection that was the first major fanboi war in computers, ..._

Definitely not the first major one! I fondly remember endless back and forth discussions between proponents of the magnificent Commodore 64 and adherents of the despicable ZX Spectrum.

<comment><USER14> So close but deeply wrong. The Spectrum was the path of goodness and light and the C64 was the route to beige coloured damnation.

<comment><USER10> I disliked the Speccy back then: I owned a C64 and my friend a Sinclair (which was a Spectrum clone if I remember correctly) and back then I thought the C64 was so much better: better sound, better colors, less "artifacts" in color graphics...

... now I see the Spectrum and I have a newfound respect for it. It was technically inferior but there was a certain grace in how game devs worked around its limitations and weird color palette. And the graphics were crisper than I remembered.

<comment><USER11> Sinclair Research (after sir Clive Sinclair, the founder) was the developer and original owner of Spectrum. The classic Spectrum models are either from Sinclair or a version developed by Timex (who also did a lot of the Spectrum manufacturing, I think) under license.

There were a number of clones too, but Sinclair is the real deal and Timex Sinclair was officially licensed.

Later the Spectrum was sold to Amstrad - at which point you got the Spectrum models that looks like Amstrad computers.

</comment></comment></comment></comment></comment></comment></comment><comment><USER15> The link skips over the part explaining that this is part of a series about how Another World was implemented on many platforms: [http://fabiensanglard.net/](http://fabiensanglard.net/)

Also, in this video [https://www.youtube.com/watch?v=tiq0OL8rzso&t=2m](https://www.youtube.com/watch?v=tiq0OL8rzso&t=2m) the person who implemented the SNES version tells the story first-hand.

</comment><comment><USER16> Funny how Sony did a similar thing (and had similar problems) with the Cell architecture of the PS3.

The developers who took the time to really target the platform (Naughty Dog? Kojima Productions?) managed to extract a lot of performance from it, and PS3 really felt like something from the future for the time, but it made developing and porting to the platform much harder.

(The difference is that the Cell architecture was more like cluster architecture, just focused on multiprocessing, while this Jaguar seem to have unique components each with unique quirks)

<comment><USER17> It's more analogous to the PS2 and it's pipeline of arcane custom chips. All of them had their own flavor of assembly, including a few chips that handled 2 opcodes per line, each operation with different cycle latencies. These chips had to be driven by the DMA and synchronized with double buffers, to ensure you had a decent fillrate of polygons. The CPU had a 'scratchpad' which you could access in 1 cycle (as opposed to 30-200 from main memory depending on cache misses), and would also be piped in by the DMA. Also, one of its vector processors was accessible (slowly) directly from the main CPU as a coprocessor (the so-called macro mode), but could also be driven by the DMA (micro-mode). The main processor and the input/output processor were two flavors of MIPS, the latter being the same as the PS1 presumably to provide emulation.

I'm certain the PS2 architecture was written by a mad genius - and it took one to use it's system to the max. If it wasn't for popularity the PS1, it might have gone the way of the 3DO. The PS3 was a dream to work with in comparison.

</comment></comment><comment><USER3> On the Jaguar, I was employed to write a custom engine for a 3d fighting and exploring game with some unusual art: [https://en.wikipedia.org/wiki/Legions_of_the_Undead](https://en.wikipedia.org/wiki/Legions_of_the_Undead)

My approach to squeezing the most out of the Jaguar was to start by getting a fairly complex fused tiled-polygon-and-texture rendering algorithm working on the 68000 first, written mostly in C++ for GCC, with some of the classes generated in Lisp.

To get all the geometry and other details right and focused on feeding calls to a texture-scan-line inner loop.

Then to switch the inner part to a fast, asynchronous command pipe, pushing commands to the GPU/blitter et al. which would read and execute those as fast as possible. And then as needed optimise any bottlenecks on the 68000 using assembly.

The idea was to keep the GPU/blitter as busy as possible filling pixels from simple texture-line commands, with minimal logic to fetch and setup each new blit (i.e. no higher level geometry calculations during which the texturing would be idle), while the 68000 ran in parallel generating those commands and doing the higher level geometry, which was quite complex in our game.

I got everything running just right on the 68000 for a nice demo, with the graphics and maps we had ready by then. It was visually perfect, and play speed was just about usable but not _smooth_ like we were aiming for.

Unfortunately perhaps, that's when Atari called my boss in to do a milestone demo, so that version was shown.

When my boss returned, I was told whichever Tramiel was head of Atari at the time was "angry" as the game looked "too slow", and the project was cancelled. :-(

Just as I was getting the GPU/blitter accelerated mode working, which was projected to be 2 weeks work (since everything up to that point had been aimed at this).

I never did get to complete or show off the fast version. So close!

Atari was in trouble and collapsed very soon after, so maybe that wasn't the real reason.

We then started moving the project to the Fujitsu FM Towns: [https://en.wikipedia.org/wiki/FM_Towns](https://en.wikipedia.org/wiki/FM_Towns)

And then the PC using DJGPP.

The geometry, texturing and physics systems could be moved over because they were mostly GCC-compatible C++. (At the time different C++ compilers accepted different dialects.)

But all the effort around optimising the engine around pushing pixels as fast as possible out of the Jaguar's hardware subsystems had to be abandoned.

Fortunately the pipeline architecture translated quite well to x86 texturing, first using awesome integer register tricks (very few registers on x86, but because you could address individual bytes and words inside dword registers you could "vectorise" some of the texturing and address arithmetic); later the FPU became faster.

This was in the days of Doom, Quake and Descent, when extremely hand-optimised assembly software rendering was normal on PCs, and consoles had very strange "not quite right for 3D" blitters. (Ask about the Sega Saturn sometime.) GPUs as we now know them were just starting to be created for PCs, and Microsoft launched DirectX a year or so later.

\--

The Jaguar's CRY colour space was not great. We had a very large graphics asset pipeline at the time, derived from hundreds or thousands of photos of real physical models made by the artists (a very different look than drawing), and all of it had to be scaled, alpha-clipped and quantized into CRY, which was not kind to the colours. Adequate, but not great use of the colour bits available.

Somewhere I'm pretty sure I still have a "pnmtocry" executable in Linux a.out format :-)

<comment><USER18> I just wanted to say that I enjoyed this comment _so much_. As a Jag owner at the time I remember being taken by the production shots of that game that popped up in magazines, and couldn't wait to see it in motion. The craftiness necessary to pull off a compelling rendering pipeline on the hardware of that time period, combined with the aesthetic directions the constraints pushed designs in, still inspires me. (And somewhat indirectly led me down my own career path.) Thanks!

<comment><USER3> Hey, thanks for the uplifting comment!

If we had published on the Jaguar, maybe that would have led to a whole different career for me too :-)

It's lovely to think someone outside the company enjoyed it. Because it was never published, it felt like multiple years put into something that just disappeared, and I didn't get much feedback from outside the company. That happened with the next game I worked on too, Mr Tank, which was more technically advanced and a lot of fun to play in the demos.

</comment></comment></comment><comment><USER19> The color space is probably one of the stranger things I've seen. I wonder what led the designers to choose that scheme. I'd love to see the design considerations for this whole system.

<comment><USER20> It's not _conceptually_ that different from YUV[1], the color spaces used by PAL television and most JPEG images. I can't speak to the Jaguar, but both of those decisions were motivated by the desire to completely separate the luminance/brightness dimension from the 2 color dimensions. For PAL this was to maintain compatibility with black and white televisions during the slow adoption of color, for JPEG it's a compression trick since the chroma channels can be downscaled more than the grayscale without humans noticing as readily.

In any case I'd argue the ability to reason about this space is a bit more natural than RGB (and a bit less than HSV) too.

But I'm sure there were some other specific requirements they were trying to satisfy...

[1] - [https://en.wikipedia.org/wiki/YUV](https://en.wikipedia.org/wiki/YUV)

<comment><USER21> YCbCr (often called YUV for... reasons) and 4:2:0 chroma subsampling (half the vertical resolution for each plane of color information as for the brightness) are still the dominant color encoding used for digital video, HDTV, Blu-ray, etc.

The "CRY" model used by the Jaguar is fairly different than (though as you say, related conceptually in its separation of brightness/darkness information, of course). I think it basically just arose from a combination of big focus on smooth shading while keeping the color values workably small and fast to calculate on.

</comment></comment></comment><comment><USER22> The URL links to the #back_1 anchor/id and ends up half a page down.

</comment><comment><USER23> Are there any particularly good interviews with Jaguar developers? I love getting into all the tiny nerdy details of old game systems.

<comment><USER24> Maybe someone could interview drcode from the top comment!

<comment><USER6> It's been done: [https://www.stitcher.com/podcast/the-atari-jaguar-game-by- ga...](https://www.stitcher.com/podcast/the-atari-jaguar-game-by-game- podcast/e/55849591)

</comment></comment></comment><comment><USER5> >Three years later, with the Jaguar project ahead of schedule, Atari decided to abandon the Panther and released its 64-bit machine in November 1993

so ahead of schedule they released Broken hardware (for example SRAM scratchpad was supposed to be cache, but that didnt work) with Broken SDK on top (generated code had tendency of randomly crashing).

</comment><comment><USER25> If you want to see how the gameplay looks, check it out: [https://www.youtube.com/watch?v=wjMf_bEfqIc](https://www.youtube.com/watch?v=wjMf_bEfqIc)

This is the PC port so I'm not sure if it looks exactly the same as the original...

<comment><USER26> That's the 20th Anniversary edition; it has been graphically enhanced from the original. In that linked video, you can see at 3:22 where the player, probably by mistake, switches back and forth between the original graphics and the enhanced version, but just for a second.

</comment></comment><comment><USER27> amiga graphic ages the best.

3DO is nasty looking

</comment><comment><USER28> I love this series, it's just so comfy (and informative) to read.

<comment><USER29> Thanks!

<comment><USER30> I agree with the parent post.

One really interesting game to analyse technically would be Bioforge. Golden era MSDOS game that used some not seen before tech.</comment></comment></comment>


Ask HN: Is there space for a technology matchmaker? - <AUTHOR> I've been a programmer my whole life, so I've been asked hundreds of times through the years if I (or someone else I know) can help create a new tech product. In the old days it was just, "I need a website" and it has become, "I need an app."
Depending on the person's budget, time, risk tolerance, and desire for an MVP, I direct them to freelancers I know, agencies I've worked with, cheap tools I've used, or even people who could be a co-founder. Basically people or things I trust and that I know will meet their needs.
So instead of saying, "go find someone on ODesk," I say, "call Joe, he will take good care of you."
My question to those of you who have started a technology-based business or are looking to start one... if I take this thing I do on the side to help others, and make it a real business, would it be valuable to you? Any reasons why it would or wouldn't?
Thank you, I appreciate your time and welcome any and all feedback (positive or negative). <comment><USER2> Aline Lerner, an engineer turned technical recruiter, wrote a blog post about it here:

[http://blog.alinelerner.com/if-youre-an-engineer-who- wants-t...](http://blog.alinelerner.com/if-youre-an-engineer-who-wants-to- start-a-recruiting-business-read-this-first/)

<comment><AUTHOR> Wow, that was insanely informative, thank you.

I especially liked how honest she was about the difficulty with finding engineers. Something I didn't think about.

Since I'm hoping to focus on more independent people (freelancers and agencies) as opposed to employees, hopefully I won't need to keep finding new engineers as regularly. But I could definitely see where I say, "you need agency X or y" and both are too busy to take on a project. Definitely wasn't thinking about that potential headache.

<comment><USER2> Aline is one of the most helpful people I've met. I'd encourage you to contact her if you're seriously considering this, she may be able to point you in the right direction.

</comment></comment></comment><comment><USER3> I believe what you are talking about in general called a professional referral service (it's used in legal firms). It's not used in tech as much because its broken down into two parts:

If you are talking about referring individuals for work, you'd be called a recruiter.

If you are talking about giving people advice on what tools and agencies are good, you are a consultant.

You can make money as a consultant and a recruiter. Consultant and recruiting agencies are big business.

<comment><AUTHOR> That explains why I couldn't find anyone doing this is because I was using the wrong terminology!

I think you're right in that what I want to do is very similar to a consultant. But I'd like to do it on the individual level too (a la a recruiter). The one difference from a traditional recruiter is that I'd provide additional value. The folks I'm recommending are vetted by me. And I'm totally open to the possibility that recruiters also vet candidates, just with my limited experience of getting messages on LinkedIn, they usually just want me to interview so the company can decide if I know my stuff.

My end goal is to help the people who say, "I know I need someone to do X, but who?"</comment></comment>