Ask HN: Is there any free/FOSS diagram/mind mapping app iOS that doesn't suck? - <AUTHOR> I've tried around a dozen apps but haven't found anything usable or doesn't have some arbitrary limits / mandatory on-going fees for some unmaintained app. <comment><AUTHOR> Eureka. [https://simplemind.eu/features](https://simplemind.eu/features)

I found it with DuckDuckGo of all things. The IAP search only found freemium and payware apps that weren't great.

Others tried:

[https://apps.apple.com/us/app/ithoughts2go/id918458207](https://apps.apple.com/us/app/ithoughts2go/id918458207)

[https://apps.apple.com/us/app/coggle/id1187423011](https://apps.apple.com/us/app/coggle/id1187423011)

[https://apps.apple.com/us/app/fluent-mind- map/id645539191](https://apps.apple.com/us/app/fluent-mind-map/id645539191)

[https://apps.apple.com/us/app/xmind-mind- map/id1286983622](https://apps.apple.com/us/app/xmind-mind-map/id1286983622)

[https://apps.apple.com/us/app/mindnode-6-mind- map/id12187180...](https://apps.apple.com/us/app/mindnode-6-mind- map/id1218718027)

[https://apps.apple.com/us/app/lucidchart/id611543423](https://apps.apple.com/us/app/lucidchart/id611543423)

(I can't afford OmniGraffle)

</comment><comment><USER2> It may not be exactly what you want, but I tend to use OpenOffice (or LibreOffice) Draw. It supports numerous shapes and more importantly connectors between shapes, as well as adding custom connection points to shapes.

Not as good as Pre-MS acquisition Visuo was, but I prefer Draw to MS Visio (though haven't used it in a while).

See: [https://www.libreoffice.org](https://www.libreoffice.org) or [http://www.openoffice.org](http://www.openoffice.org)</comment>


Cheap computers will obviate computer theft - <AUTHOR> http://clipperhouse.com/blog/post/Netbooks-and-computer-theft.aspx

<comment><USER2> Not as long as the data on computers is worth something. A Fortune 500 laptop might be worth $100 in parts, but $5,000 (or $50,000) in data ransom.</comment>


Safe ways to do things in bash - <AUTHOR> https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md <comment><USER2> I've written a ridiculous amount of shell script in my day, especially when doing "devops" before we had a term like "devops" to describe it. I've fallen in almost every pit bash has. With that background, here is my opinion.

1\. This article contains excellent advice and should be starred for later retrieval.

2\. Having basic scripting skills will make you a _way_ better programmer. Many times I've done huge refactors and needle-in-hay-stack searches using only shell commands.

3\. Shell is the universal language.

4\. Bash isn't that bad once you get used to it (seriously. I'll grant you tho that arrays are still nasty ;-) ).

5\. Bash is not that dangerous if you follow best practices. Don't be lazy!

6\. You will not regret getting really good at shell script. You'll have to take my word for it now because you don't know what you're missing.

<comment><USER3> I think it's time people start using something better than bash/zsh that is decades old, like fish or even come up with a more modern shell.

Even by looking at these examples, you see it has less verbosity like "then" and "do", you can reference arguments as $argv instead of cryptic $@ and exit status code as $status instead of $? which is confusing with $! and the likes.

[https://blog.codeship.com/lets-talk-about-shell- scripting/](https://blog.codeship.com/lets-talk-about-shell-scripting/)

[https://fishshell.com/docs/current/tutorial.html](https://fishshell.com/docs/current/tutorial.html)

Shell is such an integral part of admins and programmers workflow yet I find it hard to believe this field has been so slow at improving. Even the fish site jokingly states "Finally, a command line shell for the 90s" implying the others are even older.

<comment><USER4> I think a big issue is that bash is available everywhere, while fish might not be. There's also the fact that a lot of us have fancy dotfiles for our work/home computers, and switching to another shell would mean having to rewrite them in the target shell language.

<comment><USER3> So, you'd rather use something that is decades old because you can't/don't want to (ask to) install 1 new program on the server and take a weekend to rebuild your config file?

You can simply import aliases as is and in some cases, you may be able to even simplify parts of your config.

Personally, it was easy for me as I'm administering the servers and it was all just installing fish on every servers. (some dozens.)

<comment><USER5> > So, you'd rather use something that is decades old because you can't/don't > want to (ask to) install 1 new program on the server and take a weekend to > rebuild your config file?

Absolutely, yes. Because long story short, bash is TriedAndTrue® technology. Stuff that works.

It takes a bit of dedication to be mastered at a decent level but it pays off immensely. It's so ubiquitous it is one of those tools that you can learn once, use for the rest of your life, and use in a lot of contexts.

It's so widespread that it can bring you very far with very little.

All this being said, as someone who used to write code for a living (and now works as a System Engineer, using the bash shell everyday) I must say that if you do not do input verification (according to the language of your choice) and something goes wrong then it's your fault.

<comment><USER6> "works"

More like "better the devil you know" (if you can even say that much).

Bash doesn't scale. Every shop larger than 1 has been burned by bash gotchas. Use a real scripting language and shell out to the commands and builtins when necessary.

At my shop bash is strictly disallowed in production environments and we're all better off for it.

<comment><USER5> > Bash doesn't scale.

Thanks mate, I had a good laugh.

I wouldn't expect bash to scale anyway. That's not what it's meant for. It's meant for system administration task automation.

On a more serious note ...

In many occasions, the performance you get depends on how you tackle the problem you have, though. Even using bash and the tools from the unix toolbox, sometimes you can gain significant improvements on how you manage your data.

Anecdotal: I cannot remember the details, but I remember that rearranging the order of sorting and searching and removing duplicates (sort, sort -u, grep, uniq mainly) I saw a significant speedup.

Anecdotal (2): I cut the execution time of a night-running job from hours to minutes (tens of minutes, to be honest - but still less than an hour) just by slicing the size of a problem into smaller parts and by handling each slice in parallel (the machine had 48 cpus, but the problem was being solved "sequentially" on one cpu alone). I wrote some 30-50 lines of python, just to implement parallelism control: the rest of the problem was still handled with bash script. Partial results were reassembled at the end. Bash has coprocesses, so I might have handled that in bash as well, but python was more handy at the time (meh, i just wanted to optimize that problem).

What I am trying to say is that sometimes the "scaling" you get is justified by the size of the problem, sometimes it's not.

<comment><USER5> It's worth noting that bash is really a glue language to call other programs. If you mainly use the tools from the unix toolbox (i'm thinking of grep, for example) you really get the "scaling" (the performance) of native executable code.

Again, it really depends on how you handle your data.

Having a number of filters chained via pipes is really efficient, for example, when compared with looping over an array and executing some python/perl/ruby one-liners every time.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER7> Highly recommend shellcheck[1]. There is a SublimeLinter plugin[2] that automatically checks your shell scripts as you code them. It generally makes best practice suggestions including quoting.

[1] [https://github.com/koalaman/shellcheck](https://github.com/koalaman/shellcheck)

[2] [https://github.com/SublimeLinter/SublimeLinter- shellcheck](https://github.com/SublimeLinter/SublimeLinter-shellcheck)

<comment><USER8> Not only does it make suggestions, almost all of the 'error codes' have extensive documentation on why something is wrong and often multiple alternative solutions for each use case (eg: [https://github.com/koalaman/shellcheck/wiki/SC2086](https://github.com/koalaman/shellcheck/wiki/SC2086)). I learned more bash from Shellcheck than all tutorials and references combined.

<comment><USER2> Same. I was a bit cocky when I first tried out shell check because I had been doing bash for years. Shell check flagged something I'd been using for a while and after reading the docs I realized shell check's suggestio was much cleaner and just-as-safe way to do what I was doing. Really impressive piece of software.

</comment></comment></comment><comment><USER9> From the article:

> Should I use curly braces?

        Bad: some_command $arg1 $arg2 $arg3
        Extra bad (cargo culting unnecessary braces): some_command ${arg1} ${arg2} ${arg3}
        Correct: some_command "${arg1}" "${arg2}" "${arg3}"
        Better: some_command "$arg1" "$arg2" "$arg3"

> In the "extra bad" and "correct" examples, braces compete with quotes under > the limits of tolerable verbosity.

> Shellharden will rewrite all these variants into the "better" form.

I prefer the "${bracey}" form for all variable usage. Yes it's marginally more verbose but it has the advantage of being consistent, easier on the eyes due to less overall quoting when part of full string interpolation[1], and cleaner diffs[2] as converting "${foo}" to "${foo}-bar" only leads to word-diff of "-bar".

[1]: "${foo} bar baz" v.s. "$foo"" bar baz"

[2]: _You are source controlling your shell scripts right?_

<comment><USER10> > You are source controlling your shell scripts right?

My personal heuristic for shell scripts are that if I care enough about them to put them under source control, they shouldn't be a shell script.

<comment><USER11> My personal experience would disagree, and I feel that is throwing caution to the wind.

As any software person knows, you really can't tell what's going to happen to the code/scripts you put out, not committing it to source control is a dangerous game to play.

If you have a simple shell script sitting on a server doing some basic task, why would you not have it under source control where it can be viewed by future teams and seeing what changes have been made to it over time? Seemingly simple problems can be caused by minor changes which are very visible if its under source control.

Just because its simple doesn't make it any less important. Complexity is not a good measure of its importance.

Especially when you start trying to implement IAC in legacy areas...

<comment><USER12> At that point, you care enough to put it under source control, and it shouldn't be a shell script. That's the entire point of the comment you replied to

<comment><USER11> It's that arbitrary distinction that I am responding to. I don't agree that you should reserve source control for the complex.

A shell script can be the appropriate tool for many important tasks.

<comment><USER13> I agree that simpler scripts deserve to be in source control too. I read it to mean what I also would say, myself: if it's anything but the most trivial of scripts (so, rather _programs_), they shouldn't be in BASH. Some people in this discussion are clearly very well versed in BASH. Great. For average developers, though, it's hard to build (good) programs in BASH, and the rabbit hole swallows them. Every time.

</comment></comment></comment></comment></comment></comment><comment><USER14> I always think — when a programming/scripting language requires _this much_ bizarre knowledge just to write basic code that performs basic tasks, perhaps it is time for that language to be retired.

I really don't understand why bash still exists. I've switched to fish and am much happier with the change.

<comment><USER15> Because it is ubiquitous. You can virtually guarantee that bash will be found on any arbitrary unix-like system.

<comment><USER3> I keep seeing this statement but this absolutely does not apply to everybody.

How often can you just install fish or use other programming language instead of being forced to use bash?

It's sad people keep using the default just because of being afraid that the next system you touch might not have it and you waste tremendous amount of productivity without using something better.

I know a guy who used vim with default config for that reason. Utterly nonsense.

<comment><USER5> No one ever thinks of interoperability between _people_. Bash is known, to a variable depth, by pretty much every sysadmin (and a big part of being a sysadmin is being able to write shell scripts).

So I might prefer the fish, and who came before me might have had a preference for zsh. So now I have to deal with three different shells: bash (default), fish (for the scripts i'll be writing from now on) and zsh (because of compatibility). Congrats.

> I know a guy who used vim with default config for that reason. Utterly > nonsense.

I started using less and less emacs/vi(m) customization and learn more and more of the defaults for the same reason: whenever I log on a client system I am instantly proficient with the editor without stupid complaints like "but on my box is different..." .

Anecdotal: I have seen people losing their editing speed/proficiency because all of a sudden they were in a clean vim session and had no one of their shiny and colorful plugins.

<comment><USER3> Why can you not modify the editor environment that you use often?

Hard to see I need to deal with environments where I can do nothing but keep the default every time I use it.

Once you get the speed that is tuned to your liking, the default sounds like you're walking with legs strapped.

<comment><USER5> > Why can you not modify the editor environment that you use often?

Because I am not the only one accessing those environments (please note the plural here).

Currently there are about 13 other sysadmins in my team and we manage clients infrastructures among other things (managed services). From time to time someone from another team accesses those environment (not a sysadmin, but still familiar with the bash shell). Sometimes the client accesses those systems (rare, we try to discourage and avoid that).

Can you even imagine what a mess it would be if we all started applying our own favorite settings ?

(edit: fix grammar)

<comment><USER3> How hard is it to create a user for each of the system admins?

It seems it's not a good practice to share a single account as it makes it hard to tell who did what.

</comment></comment></comment></comment></comment></comment></comment><comment><USER16> > POSIX mandates /bin/sh

Nope. On the contrary, it says: _Applications should note that the standard PATH to the shell cannot be assumed to be either /bin/sh or /usr/bin/sh_

Source: [http://pubs.opengroup.org/onlinepubs/009695399/utilities/sh....](http://pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html)

A pedantically-compliant shell script should not have shebang at all.

<comment><USER17> What's wrong with `#!/usr/bin/env sh`?

<comment><USER18> I've worked on systems where env was installed as /bin/env and not as /usr/bin/env . (I think it was SunOS 4.)

For that matter, under Termux on Android it's /data/data/com.termux/files/usr/bin/env (but termux has a hack to make normal shebangs work).

<comment><USER19> Termux rewrites scripts via termux-fix-shebang.

<comment><USER20> It now also does rewriting on the fly for certain shebang lines, as part of its C library, so unmodified scripts can run.

<comment><USER19> I didn't know that, thanks.

<comment><USER20> No problem. I wrote it because I version control my scripts and didn't want to fork them for running them on my laptop (Chromebook with Termux).

</comment></comment></comment></comment></comment></comment></comment><comment><USER21> If you reached a point where you need to require bash and not a posix shell and need to enforce these rules just use python or lua if you can or some scheme or whatever else... it's not worth the wasted time hunting bash cruft.

if you are on busybox with ash none of this is helping (except shellcheck which is great).

<comment><USER22> Sometimes you just want some 30-50 lines of piping a few commands and a couple of conditionals.

Python (the language with the most community traction to replace bash for scripts) is a royal pain to use for this without libraries that are present in no default system, and even with those it often ends up being more verbose than it should.

<comment><USER21> > Sometimes you just want some 30-50 lines of piping a few commands and a > couple of conditionals.

maybe I was not clear - nothing against shell-scripting but doing some weird dancing like in the article is imho useless, also depending on bash is a stupid idea imho.

posix sh + shellcheck is all you need. if you can't solve your problem in posix sh rethink your code / approach and simplify until it will work.

<comment><USER23> I agree.

I've used this page successfully as reference for portable syntax:

[http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3...](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html)

Some sections on features I use heavily:

\- Parameter Expansion (specifically :-, %, %%, #, ##)

\- Special Parameters (specifically "$@", $#, $?)

\- set --, this lets you set the $1, $2, etc. variables. I use this with "$@" for arrays, primarily for building command strings.

Here's an small shell script demonstrating some of them:

        #!/bin/sh

        # err function
        err() { echo "$1" >&2; exit 1; }

        # init variables
        unset src
        unset dst
        dry_run=false

        # get arguments
        while [ $# -gt 0 ]; do
            case "$1" in
                -d|--dry-run) dry_run=true ;;
                --) shift; break ;;
                -*) err "unknown option: $1" ;;
                *)
                    if [ -z "$src" ]; then src="$1"
                    elif [ -z "$dst" ]; then dst="$1"
                    else err "unexpected argument: $1"
                    fi
                ;;
            esac
            shift
        done

        # sanity checks
        ## TODO: print usage
        if [ -z "$src" ]; then err "source not specified"; fi
        if [ ! -d "$src" ]; then err "source does not exist"; fi
        if [ ! -r "$src" ]; then err "cannot read source directory"; fi

        if [ -z "$dst" ]; then err "destination not specified"; fi

        if ! rsync --version >/dev/null 2>&1; then
            err "missing rsync(1)"
        fi

        # build rsync command
        set -- rsync -aq "$src" "$dst"

        # log command
        echo "copying $src to $dst"
        echo "    $@"
        if ! $dry_run; then
            if "$@"; then
                echo "success"
            else
                # rsync will have printed an error message
                err "rsync exited with error code $?"
            fi
        else
            echo "dry run; not executing"
        fi

Also be sure to read the man page for test (the [ command).

</comment></comment></comment></comment><comment><USER24> Interesting stuff, but given bash's

\- Relative unportability \- Poor noncompliant sh interpreter \- Poor performance (can be 4x slower than POSIX sh shells like dash for certain tasks)

I personally think bash is always the wrong choice. Use POSIX sh (or a real language). POSIX sh is 98% the same thing, there's no good reason to even use bash over sh in the vast majority of cases. It's just this blight that won't go away.

Given that bash is mostly sh anyway, most of this writeup applies to sh, too. AFAIK the only thing bash-specific here is arrays.

<comment><USER25> I stick with bash to avoid implementation differences due to POSIX ambiguity [0]. I know that all my bash scripts will run on at least bash-4.0 but I have no idea what shell /bin/sh is going to be for any given system. I haven't written a single shell script where the performance difference matters, nor do I expect to. And there are a few nice bashisms besides arrays. I'm not sure what portability issues you're referring to.

[0] [https://stackoverflow.com/a/16376043](https://stackoverflow.com/a/16376043)

</comment></comment><comment><USER26> A little heads-up: "$var" does what you think, but "$(cmd)" likely does not do what you think:

\- The former just gives you a string whose contents are identical to that of var.

\- The latter would do similar for the output of cmd, except that it _strips away the trailing newline_. This is often not an issue, but can be crucially important in some cases, and can catch you off-guard.

The point I'm making here is that it's actually _quite_ difficult to get a string that literally has the contents you want. The fact that *nix lets you put pretty much any characters in file names (even newlines) means that, just like in Windows, your scripts can actually fail even when you try to quote things "properly".

<comment><USER27> > The point I'm making here is that it's actually _quite_ difficult to get a > string that literally has the contents you want.

It's not difficult, it's just tedious.

      foo=$(whatever).
      foo=${foo%.}

<comment><USER26> That's not general POSIX, right? I seem to recall it's Bash-specific? (P.S. I think you forgot quotes?)

The other problem (which I guess I accidentally brushed under the rug when I singled out "variables") is that having to do this actually means you _need to put it in a variable_. If you're nesting subshells, this gets pretty darn tedious, easy to forget about, and difficult to read pretty quickly... it seems you wouldn't consider that "difficulty" and think of it as "just tediousness", but I think if something is too easy to do incorrectly and too tedious to get right, that's also a kind of added difficulty.

<comment><USER27> > That's not general POSIX, right? I seem to recall it's Bash-specific? (P.S. > I think you forgot quotes?)

Wrong. (And no, I did not.)

POSIX, or rather SUS (I've never had an access to POSIX), mandates ${foo%...} syntax and its three cousins. And assignment is not subject to word splitting for variable expansion.

<comment><USER28> Regarding POSIX: [http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3...](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02)

</comment></comment></comment></comment></comment><comment><USER29> Shellcheck made me a MUCH better Bash developer.

Also, I prefer using [ condition ] for tests instead of the less-portable [[ cond ]] syntax despite the latter being more feature-rich. Didn't see that one in there.

<comment><USER30> Why do you prefer the former?

<comment><USER29> Portability

</comment></comment></comment><comment><USER31> If you get to the point when you need to write

        IFS=$'\v' read -d '' -ra a < <(printf '%s\v' "$s")

it is a good sign that it's time to switch to some other language. For example in python, it will be just

        a = s.split("\v")

(and yes, sometime you have legacy system, or writing initrd script. But how often does this happen? Any why does your initrd has full bash anyway, as opposed to dash or sh?)

</comment><comment><USER32> Most of this is fine, but not all. In particular, command failure conditions are a huge source of bugs, but `set -euo pipefail` is not going to solve all your problems. `set -e` is just as likely to cause problems because it can cause scripts to silently fail. And pipefail can pass through errors that aren't relevant.

These are great tools to have, but don't blindly invoke them as magic spells if you don't actually understand the implications.

</comment><comment><USER33> > Gotcha: Errexit is ignored depending on caller context

It proves the point that it's a gotcha but those examples seemed sensible to me. As far as I understand it, `set -e` doesn't turn every unchecked, non-zero exit code into an exception because there's no way of knowing whether the function or sub shell you're invoking was written by you or pulled in elsewhere, and as a result you don't know if a non-zero exit code is a legitimate, show-stopping failure.

Those functions and subshells might as well be mini inline executables and in that context it makes sense to only check the final output. If that's horribly wrong and confusing, maybe there should be a move to make `set -e` the default so _all_ error handling is explicit, but you've got other languages for that that don't involve throwing `|| true` onto the end of every unimportant command you run.

I also realise that this doesn't make a case for Bash being intuitive. Precisely the opposite. But I suppose you have that with a shell where it's more important to be adaptive to the person behind the keyboard at the expense of the purity of the implementation. Especially considering the history of it all.

</comment><comment><USER34> Recently I've replaced most of my bash scripting with the python library invoke.

It's written by the same people who wrote the python ssh scripting framework fabric.

[http://www.pyinvoke.org/](http://www.pyinvoke.org/)

Works great!!

<comment><USER35> I'll have to try that one. I've done a few things with: Python process launching [http://amoffat.github.com/sh](http://amoffat.github.com/sh)

<comment><USER31> Be careful with sh library! It runs the programs under tty by default, so you get random effects like ascii color sequences and truncated git output. There is an option to change this, but it not default, and it is easy to forget it.

</comment></comment></comment><comment><USER36> Backticks are very error prone $(cat foo.txt) is much more explicit and visually clearer for command substitution.

<comment><USER37> And this way also allows nesting.

</comment></comment><comment><USER38> A tip from me, based on a mistake I made yesterday: don't `source ~/.bash_history` instead of `~/.bash_profile`.

(Luckily it entered vim relatively soon, from where I could kill the process).

<comment><USER39> At least it's not recursive.

</comment></comment><comment><USER40> Bash strikes me as a bit of a mess, as in people threw the kitchen sink into it for 'portability'.

Things like being able to open a socket e.g. using the /dev/tcp/<ip>/<port> stuff give me the willies a bit.

I lean towards Ruby if it's going to be anything longer than a few lines, or requires anything but the simplest of logic/commands. Otherwise I was always told /bin/sh is likely to be the most portable, so tend to use that in the absence of any other good reason.

<comment><USER41> I've written two network/telnet game-bots in Bash. It's terribly hacky but fun in it's own way. Using the dev tcp trick and arrays and lots of bashisms.

</comment></comment><comment><USER42> nice write up, starred it for future hand outs to my friends.

I do find that once my bash script is going over a hundred lines or so it's likely a good time to move to python.

I love bash, it's great; at some point setting up a proper script (in bash) with arguments, options, logging and or validation you end up spending more time getting it to work than you do on solving the actual problem; enter your favorite programming language here.

</comment><comment><USER43> The advice to double-quote everything is an interesting way to circumvent "detailed knowledge may be required". I wish it noted that you can't quote regular expressions, though:

      $ cat - > foo
      #!/bin/bash
      a="BCD"
      [[ $a =~  .C.  ]] && echo 1
      [[ $a =~ ".C." ]] && echo 2
      ^D
      $ bash foo
      1
      $

<comment><USER44> this is intentional, since you can store your regular expression in a variable:

        $ a=BCD; b=.C.; [[ $a =~ $b ]]; echo $?; [[ $a =~ "$b" ]]; echo $?

otherwise, interpolating variables in regular expressions as text would require other syntax (more confusing).

also, "cat -" is redundant, use "cat". this behavior is specified by POSIX.

<comment><USER43> I use "cat -" so that my code makes more sense to people. I want STDIN declared somehow, and the dash is effective. Technically I shouldn't have bothered with the cat at all in an HN code snippet, but it was a courtesy to provide a familiar environment for the block I wanted to convey. It worked so well that you linted it! I really appreciate the thought.

</comment></comment></comment><comment><USER45> While I agree with the guide, there is one thing I was missing while writing bash scripts with 'set -e' and that was some kind of stack tracing. So I added a nice trap function to my personal bash script template. Be aware, that this version does not include all best practices described in the guide.

      #!/usr/bin/env bash
      #</comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>--
      # Default Bash Script Header
      set -eu
      trap stacktrace EXIT
      function stacktrace {
              if [ $? != 0 ]; then
                      echo -e "\nThe command '$BASH_COMMAND' triggerd a stacktrace:"
                      for i in $(seq 1 $((${#FUNCNAME[@]} - 2))); do j=$(($i+1)); echo -e "\t${BASH_SOURCE[$i]}: ${FUNCNAME[$i]}() called in ${BASH_SOURCE[$j]}:${BASH_LINENO[$i]}"; done
              fi
      }

      SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
      #</comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>--

</comment><comment><USER46> I notice a pattern in all articles about BASH. Some people say it should die. Others praise its ubiquity and versatility at handling certain tasks. Of course, both sides are right.

From my point of view, BASH will never disappear, because it's not a living thing that runs out of food or habitat and dies. That doesn't happen, unless there's a major revolution in computing that makes current paradigms obsolete, something on the scale of the disappearance of the dinosaurs.

Until that happens, I welcome any projects that aim to decrease the amount of buggy BASH in the wild. I avoid it as much as possible, but if someone's going to use it, at least they'll have safety nets to reduce the possible damage.

PS: I have a feeling my metaphors are all over the place, but I hope that doesn't detract from the message.

</comment><comment><USER47> Overwhelmingly a great resource, though I will nitpick at this one:

> _Globbing is easier to use correctly than find._

For very simple purposes or small file trees, sure. Outside that: find is _incredibly_ more powerful, and worth using in many cases. If nothing else, learning to use `find . -path ignore_this_path -prune -o *.ext -print` can change e.g. a Go project script from visibly-slow to instant. (e.g. the latest place I used this went from 1-5+ (hot vs cold) seconds to 5-50ms)

</comment><comment><USER48> How does one properly quote an argument for a command that can contain spaces?

For example:

        parent_dir = "$(basename $dir)"

How to quote $dir here? What if it contains spaces or other special characters?

That's what I dislike about Bash.

Also, always start your scripts with

        set -e

This prevents script from running after error, without any messages though.

Also, I always make mistakes when using [ and [[.

<comment><USER49> You just add quotes around $dir. Bash understands the quotes properly/recursively.

        parent_dir = "$(basename "$dir")"

<comment><USER48> So I finally found the answer. Thanks.

<comment><USER50> Bear in mind (pointed by the article as well) that variable assignment doesn't allow spaces around the equals sign, and that in this case the outer parentheses are unnecessary anyway.

</comment></comment></comment></comment><comment><USER51> > _Quoting inhibits both word splitting and wildcard expansion, for variables > and command substitutions._

The result of a variable substitution isn't subject to wilcard expansion, whether quoted or not.

If your only reason to quote "$foo" is because you think _foo_ expands to a globbing pattern, and no other reason is justified, you can drop the quotes.

<comment><USER52> It _is_ subject to wildcard expansion. You can verify this with

        var="/*"; echo $var

<comment><USER51> Ooops, you're right! I somehow mixed this up with special contexts.

      case $var in
      '*' )
        echo asterisk ;;
      esac

But wildcard expansion is suppressed there unconditionally. Same as in assignment context: other=$var.

<comment><USER44> those both suppress word splitting too.

</comment></comment></comment></comment><comment><USER53> > Furthermore, set -u must not be used in Bash 4.3 and earlier.

This is a dangerous advice. set -u indeed requires more verbose array handling in Bash < 4.4, but it also catches code like this:

      rm -rf "${OOPS_UNDEFINED}/"

</comment><comment><USER54> Step 1 to write safer shell scripts: use a safer shell. Zsh gives the user much more control, has safer defaults, and is itself quite portable (even if Zsh scripts are not portable to other shells).

<comment><USER44> unfortunately, zsh is installed on probably about 1% of Linux systems worldwide. maybe it can be installed almost anywhere, but the fact is it isn't, and you might as well use Python or something at that point.

<comment><USER3> And how many on the system that you actually touch? How hard is it to (ask to) install a new shell? Obviously if you're distributing your script publicly no one would write that in zsh compatible way.

</comment></comment></comment><comment><USER55> Reason number 650 why I love Ruby: it offers ridiculously gradual transitions from shell scripts. One time I built up a pretty weighty conditional-heavy script in Bash and didn't want to keep adding to it. So I simply made all the bash calls use backticks. Took me all of a few minutes to get option parsing working again.

One day I'll learn the Ruby way of doing shell one-liners and that'll hopefully keep me out of man pages for that sort of thing forever.

</comment><comment><USER56> Is this project ready to share?

It's not published to crates.io, and doesn't have a license or Cargo.toml

</comment><comment><USER57> I don't agree with the advice to use arrays and set -u together. Sometimes you just need to get something done, and being pedantic works against you.

This advice only works in bash 4.4, and many common distros are on bash 4.3, like Ubuntu 16.02 LTS. (bash 4.4 was released September 2016.) Because of this bug, the section "how to begin a bash script" is version-specific and awkward IMO.

If you need to process untrusted filenames, use arrays, but otherwise it's probably more trouble than it's worth. [1]

I want my scripts to work on older versions of bash, and I think 'set -u' is important, so I mostly get by without arrays. It's not ideal, but shell is full of compromises.

A workaround is to use ${a[@]+"${a[@]}"}, which avoids the bug in bash 4.3, but that seems too ugly to recommend.

More details in this comment I wrote on the same article: [https://lobste.rs/s/4jegyk/how_do_things_safely_bash#c_kmldw...](https://lobste.rs/s/4jegyk/how_do_things_safely_bash#c_kmldw6)

[1] _Thirteen Incorrect Ways and Two Awkward Ways to Use Arrays_ [http://www.oilshell.org/blog/2016/11/06.html](http://www.oilshell.org/blog/2016/11/06.html)

</comment><comment><USER58> I gave up long ago on trying to learn shell scripting _and_ remembering it. Switching to xonsh for my shell made shell scripting easier.

[http://xon.sh/](http://xon.sh/)

</comment><comment><USER59> For further portability you can convert bash shell to C and compile it into binaries.

[https://github.com/neurobin/shc](https://github.com/neurobin/shc)

</comment><comment><USER60> if it needs to be safe, use python.

please don't down vote me

<comment><USER61> Safe bash is what Perl was invented for. Don't downvote me.

<comment><USER60> someday i might even add it to my toolkit

</comment></comment></comment><comment><USER62> Why ever resort to shell scripts when we have languages like ruby / python for anything more complex than installs?

Clarity is king people

<comment><USER63> Because

      foo | awk '/bar/ {print $3}'

is more clear than

      import subprocess
      foo = subprocess.Popen(['foo'], stdout=subprocess.PIPE)
      for line in foo.stdout:
        if 'bar' in line:
          try:
            print(line.split()[2])
          except IndexError:
            print('')

Sometimes shell scripts are more clear. Especially for tasks that involve running lots of external commands.

<comment><USER62> Nobody doubts that pipes and languages like awk are great for one liners, but I think that's a little besides the point of this post, which is advocating for things like the use of bash arrays:

``` array=( a b ) array+=(c) if [ ${#array[@]} -gt 0 ]; then rm -- "${array[@]}" fi ```

``` array = [a, b] array << c array.map { |i| `rm #{i}` } if array.length > 0 ```

There's also nobody stopping you from using text processing tools like awk and sed, or bash one liners in ruby/python either, but I think we should leave the logic and arrays for scripting languages, no?

<comment><USER63> You're moving the goalposts! Previously it was "anything but install scripts". Now it's "logic and arrays".

I actually think we agree with each other, but we express it differently. I never write _bash_ scripts, I write POSIX shell, so all the array juggling of bash is something I never deal with. As you say, by the time you need arrays, you should have switched languages already.

That said, I think there's a fairly large domain of problems - apart from install scripts - that are better solved with shell scripts, _because of their clarity_. Anything which relies on invokation of lots of other tools, and in particular problems that fit the pipe model (take output from this tool, extract interesting bits from it, and feed it to that tool, etc). And this I say as an otherwise almost slightly fanatical Pythonista :-)

</comment></comment></comment></comment><comment><USER64>
        if [ ${#array[@]} -gt 0 ]; then

a better way to write it:

        if (( ${#array[@]} > 0 )); then

<comment><USER44> the idiomatic way:

        if (( ${#array[@]} )); then

<comment><USER64> I prefer not to use implicit boolean conversions. It's also less readable.

</comment></comment></comment><comment><USER65> If your everyday language is JavaScript, use shelljs. It's great. You'll get portable scripts in no time. Sure it's "slow", in a way that likely doesn't matter because of what you're calling from the script.

</comment><comment><USER66> From the author of "Russian roulette: how to probably not die", "Staying healthy with fast food" and "Self-immolation for dummies".

If you need safety don't use Bash.

<comment><USER67> Amen. Writing bash scripts (I have been programming in Unix since 1985) is an unnatural, fragile, and error prone endeavor. If is more than 5 lines long, I use Perl (which still far from ideal). When an article is almost solely about what not to do, that tells you something.

</comment></comment><comment><USER68> Obligatory: [http://redsymbol.net/articles/unofficial-bash-strict- mode/](http://redsymbol.net/articles/unofficial-bash-strict-mode/)

</comment><comment><USER69> " Should I use backticks?

Command substitutions also come in this form:

        Correct: "`cmd`"
        Bad: `cmd`

While it is possible to use this style correctly, it looks even more awkward in quotes and is less readable when nested. The consensus around this one is pretty clear: Avoid."

This is how one can tell a rookie just learning to program in shell: usage of $() syntax is limited to Bourne family of shells which implement that particular POSIX specification aspect.

Backticks, on the other hand, although they incur a performance penalty since they spawn a subshell, make one's code instantly portable across all UNIX-like operating systems and even across disparate shell families, as they work exactly the same in C-shells. (Whether one should program in a C-shell family is a different discussion.)

The subshell performance penalty is negligible in 99% of the cases as this 1970's technology has tiny memory and processor overhead due to the fact that it's been developed on systems with small memory and a slow CPU, so it had been optimized for performance.

Over my 30+ years of shell programming, I know of only one documented instance where the $() construct which doesn't spawn a subshell made a difference, and was the only time it was actually a valid requirement:

[https://www.joyent.com/blog/building-packages-at- scale](https://www.joyent.com/blog/building-packages-at-scale)

but even then, the author ended up using dash, not bash.

For maximum portability and closest adherence to POSIX, program in Korn shell, ksh93. (Modern versions of ksh implement ksh93 functionality.) Then you may safely use $() and be assured it will work in all Korn shells across different operating systems (even in ksh88).

Otherwise, DON'T avoid using backticks, because you will be giving away portability for no good reason. Don't program in bash, but in original Bourne shell (sh) for maximum portability across different operating systems; don't assume that you can use bash constructs in Bourne shell (as /bin/sh on GNU/Linux tells bash to run in Bourne shell emulation mode, but that mode isn't implemented completely or correctly, since bash constructs are still accepted). Always test your shell code on a traditional UNIX like HP-UX or a Solaris derivative like SmartOS if possible, with a real Bourne shell.

<comment><USER70> > _" This is how one can tell a rookie just learning to program in shell: > usage of $() syntax is limited to Bourne family of shells which implement > that particular POSIX specification aspect. Backticks, on the other hand, > although they incur a performance penalty since they spawn a subshell, make > one's code instantly portable across all UNIX-like operating systems and > even across disparate shell families, as they work exactly the same in > C-shells."_

The '$()' notation is a standard shell feature de facto. The fraction of people who care about their script working on all UNIX-like operating systems' default shells is very close to 0. The recommendation is fine - this notation is more readable and nestable.

> _" Always test your shell code on a traditional UNIX like HP-UX or a Solaris > derivative like SmartOS if possible, with a real Bourne shell."_

Only if your script needs to be "original Bourne shell" compatibile. Which is almost never for most script writers.

<comment><USER69> "Long live the GNU/Linux hegemony and monoculture, the only truth and true religion".

Lovely.

<comment><USER70> Long live the inventiveness and free spirit of contributors who brings us useful improvements and progress to what would otherwise be a cumbersome legacy computer interface.

<comment><USER69> Which interface? Are you sure you could not have made a broader generalization and a more nondescript statement?</comment></comment></comment></comment></comment>


Clubbing (Third-party Security) Seals - <AUTHOR> https://vagosec.org/2014/11/clubbing-seals/

<comment><USER2> Myself and Shane MacDougall spoke of trustmarks at both BSidesLV and Toorcon several years ago, introducing a tool against some industry backlash, Oizys, to troll through all the trustmark placeholders we could find, logging when detecting a change in the trustmark during subsequent runs. Typically there were several reasons why a trustmark would change: the site was no longer secure from the perspective of the vendor scan tool (modified nessus?), or maybe the vendor was no longer under contract (the bill hasnt been paid to the vendor). The easiest thing to look for was a transparent gif where previously there was a non-transparent one. This can also be done with your favorite search engine, with some thought, but i am glad to see this getting some additional attention.

</comment><comment><USER2> the engine also used OCR to parse timestamps within the rendered trustmark image, and log when the image was past a certain amount of days. it was also possible to generate spoofed trustmarks using the same method and we did that too.</comment>


Can we build AI without losing control over it? - <AUTHOR> https://www.ted.com/talks/sam_harris_can_we_build_ai_without_losing_control_over_it <comment><AUTHOR>
      Sam Harris: TED Talk

"Scared of superintelligent AI? You should be, says neuroscientist and philosopher Sam Harris — and not just in some theoretical, existential crisis kind of way. We're going to build superhuman machines, says Harris, but we haven't yet grappled with the problems associated with creating something that may treat us the way we treat ants."</comment>


Cassini successfully flies over Enceladus - <AUTHOR> http://phys.org/news/2012-04-cassini-successfully-flies-enceladus.html

<comment><USER2> This is exactly how NASA should be spending their money. The entire Cassini / Huygens project cost less than $4B upfront and has been massively successful.

<comment><USER3> Completely agree. So were the Mars rovers (and for that matter most of NASA's robotic/probe missions since inception?).

Looking at NASA from the outside in, I wish they'd pivot completely to robotic exploration in space for the next few decades, and energy/propulsion research on earth. Send robotic missions to Venus, Mercury, Jupiter, and Saturn, and use other robots to test new propulsion systems in space.

Use these exploratory missions to inform planning for eventual manned missions, especially to resource-rich destinations we might be able to mine and harvest to better fund them, all the while sending back brilliant (live?) video and images of other worlds (or the universe in cases like HST's Deep Field camera). Both the scientific and PR ROI of robotic exploration is very high.

</comment></comment><comment><USER4> Tethys looks surprisingly like the Death Star with that pixel-tearing on the edge.

</comment><comment><USER5> Each time I inspect high resolution photos of planetary surfaces taken recently, I cross my fingers and look for something out of place like a city in ruins or a crashed ship.</comment>


Xbox One controller cost over $100M to develop - <AUTHOR> http://www.engadget.com/2013/11/18/xbox-one-controller-smells-projector/ <comment><USER2> I've always wondered if some of the huge R&D budgets we see are shenanigans to save taxes under the US's R&D Tax Credit.

I certainly don't know enough to accuse anyone of tax evasion. But it does seem to be a strong incentive to classify lots of different activities as R&D.

<comment><USER3> The $100 million sounds slightly less impressive if you take it to mean controller R&D across the entire Xbox One project.

Let's assume that Microsoft started work on the console in 2007, two years after the Xbox 360 launched. Our $100 million has now become $16 million per year. Developing the controller is going to involve a lot of people: software, hardware, QA, design, supply chain, fabrication, etc.

Let's say that Microsoft has a team of a hundred people working on the controller (personally I think that's a very conservative guess). So of our $16 million we've easily eaten up half of that in labour costs. Prototyping, gearing and tooling up, and all the various other expenses associated with designing and manufacturing electronics eats the rest up pretty quickly.

This is obviously 'back of the napkin', hugely simplified conjecture, but I can definitely see how $100 million becomes a fairly reasonable figure over time.

</comment></comment><comment><USER4> > invested over $100 million throughout the course of the effort

That line is completely at odds with the title. In R&D 'alive and well' is not synonymous with spending lots of money. The key factor for deciding whether an R&D organisation is 'alive and well' is _output_. I.e. have they produced novel research or developed amazing products. Another important factor is the cost of that output. Anything is possible with an endless supply of slave labour (or money).

In this case I think that spending 100m on a controller that has only incremental improvements is not a sign of good R&D. It is a sign of a company with a lot of money that is not willing to take excessive risks.

<comment><USER5> Research doesn't always produce changes. If we suppose the Xbox360 controller is nearly the most perfect a controller could be, it's easy to see how large R&D budgets can lead to only small changes.

As for why they'd funnel a lot of money into a controller that is nearly perfect- well, they have the money and they want to win. Isn't that enough explanation?

<comment><USER3> > _As for why they 'd funnel a lot of money into a controller that is nearly > perfect- well, they have the money and they want to win. Isn't that enough > explanation?_

The problem with regards to Microsoft's R&D budget is that they're _not_ winning. I don't have figures for this year, but last year Microsoft's R&D budget (as listed in their annual report) was $9.4 billion, compared to Google ($5.2 billion) and Apple ($2.6 billion).

One explanation is Microsoft simply account for R&D differently. Another explanation is that Microsoft overspend on R&D, or spend very poorly. Microsoft have always spent very highly on R&D, but over the past few years haven't had much to show for it in terms of growth or success.

I am sure there is some hyperbole and creative maths in the report to get to $100 million, but where you see Microsoft investing money to perfect the almost perfect, I see Microsoft spending far too much money on the wrong things.

<comment><USER5> What does Apple and Google have to do with Microsoft's console division?

<comment><USER6> Nothing. But this is HN.

</comment></comment></comment></comment></comment><comment><USER7> Rewrite of [http://venturebeat.com/2013/11/18/the-xbox-one-controller- pr...](http://venturebeat.com/2013/11/18/the-xbox-one-controller-projectors- smells-and-other-stuff-that-didnt-make-it-in-part-1-exclusive/)

</comment><comment><USER8> Research theater? Take this with a grain of salt however, research value is non-linear and its success cycle is measured not In years or a decades even.

</comment><comment><USER9> It's important, really important. Imagine how sales would be impacted if they had not spent this money and built a crappy controller. Also factor in the suggested tail of the console is 10 years.

I just hope they've spent a similar amount of money on making sure the damn thing is quiet when in use.

</comment><comment><USER10> Each?

<comment><USER11> It looks like valve has spent a few hundred dollars on a 3D printer and I expect a small team and come up with something far more revolutionary. I wonder how it will play out.

I also wonder if this cost covers the connect too.</comment></comment>


Revolution Pi – Industrial PC Based on Raspberry Pi - <AUTHOR> https://revolution.kunbus.com/ <comment><USER2> How industrial are we talking? Is it certified for use in industrial environments? I saw a few mentions of IEC61131-2, but I couldn't find whether it actually has certifications.

If it is suitable for use in the industry, I can't wait to ditch ladder and Structured Text in favour of modern programming languages for industrial controllers.

<comment><USER3> This was answered in the German Revolution Pi forum a few months back: [https://revolution.kunbus.de/forum/viewtopic.php?f=8&t=6&p=1...](https://revolution.kunbus.de/forum/viewtopic.php?f=8&t=6&p=14#p14)

The TL;DR is that the products have gone through all the testing required by EN61131-2 and you can safely deploy them in harsh environments (e.g. wrt electromagnetic radiation or vibrations/shocks). However there is no external certification.

<comment><USER4> Unfortunately, as awesome as that is, that pretty much means industrial "in name only"...at least for non-hobby / non-startup projects

</comment></comment></comment><comment><USER3> Hi there. I'm an engineer on the Revolution Pi team. AMA.

<comment><USER5> I'm always looking for LabVIEW alternatives... is one of your cards an analog input module? How else to get 10-20 analog inputs? And is 10kHz sampling reasonable? What's the highest practical Fs? Thank you/danke!

<comment><USER6> Our AIO module which will be available in June/July is a high precision module (0.1% FSC accuracy without calibration) having 4 differential inputs which can be used as current or voltage inputs (several input ranges are software controlled available). There are 2 additional RT100/RT1000 inputs and 2 analog outputs (current or voltage). These modules are not designed for high speed data acquisition but as standard inputs for typical industrial analog sensors or analog controlled actuators. We are using delta sigma converters to achieve the high precision but this excludes high speed acquisition.

<comment><USER5> Thanks! Sounds like a replacement for an NI USB DAQ 6008.

</comment></comment></comment></comment><comment><USER7> This would have been perfect for my last startup. Keeping those damn Pi's running when they were deployed across the country was a nightmare.

The SD cards had around a 20% failure rate per year. Eventually I just started shipping each system with a backup SD card taped to the inside of the case.

<comment><USER8> Were you using decent microSDs? Was each mSD getting QC'ed? We benchmark every single mSD before deploying an SBC with it, and have switched to only using Evo+ 32GB cards as they pass our QC 3/5 of the time, which is much better than the other available brands.

Also, mSD corruption means your using a mSD card with a bad controller. The mSD was bound to corrupt and was a low caliber card to start with, unless you are doing a bunch of writes a mSD should last 2 years minimum, if not longer.

Another tact to take would be to switch to an OrangePi PC+ (8GB eMMC included, $22) or similar, that way you know your getting good quality nand with a decent controller out of the box.

<comment><USER9> Do you mind sharing your quality control method for this? We are hitting card issues on relatively low device numbers.

<comment><USER8> Just saw this, TL;DR we transfer a large file onto and off of the mSD card. If its above 10MB/s for both (which is the base rating on a class 10 card), then it is a fine mSD card. I've also noticed that on multi-gig files speeds tend to drop to around 6MB/s, not the end of the world for us, but also not a sign of a bad mSD either.

</comment></comment></comment></comment><comment><USER10> Is this a just a regular Raspberry Pi in a nice case?

<comment><USER11> No, it appears to be using the Raspberry Pi 3 compute module. That's essentially a small circuit board with the core components of an RPi3 already designed and assembled. They then solder/plug this module into a larger board to add connectors and peripherals to it. So there's some custom design involved.

[https://www.raspberrypi.org/blog/compute- module-3-launch/](https://www.raspberrypi.org/blog/compute-module-3-launch/)

<comment><USER3> That is mostly correct. A few corrections/additions:

* It's either the Compute Module 3 or the older (cheaper, slower) Compute Module 1.

* The schematics of the base board in the RevPi Core are open source: [https://revolution.kunbus.de/download/1803/](https://revolution.kunbus.de/download/1803/)

* Normally you wouldn't open the RevPi Core case and solder stuff to the base board, though you're given all the information you need if want to do so. The expected use is to just mount the RevPi Core on a top hat rail and extend it with I/O or gateway modules via the PiBridge connector.

</comment></comment></comment><comment><USER12> What if the user wants to run a different OS besides Linux? Seems like the only option is Linux? No Plan9, BSD, etc.?

<comment><USER3> Anything that boots on a Raspberry Pi should also work on the Revolution Pi, e.g. FreeBSD:

[https://wiki.freebsd.org/FreeBSD/arm/Raspberry%20Pi](https://wiki.freebsd.org/FreeBSD/arm/Raspberry%20Pi)

It's just that we haven't tested it yet ourselves. Minimal adjustments may be necessary due to a few small differences between the standard RasPi and the RasPi Compute Module used in the Revolution Pi, e.g. the Compute Module lacks the on-board BCM43438 WiFi that's present on the standard RasPi 3.

</comment></comment><comment><USER13> +55°C max operating temp

Industrial? Nope.

<comment><USER3> That's the requirement prescribed by EN 61131-2. We test with 60°C, so an additional safety margin of 5°C.

</comment></comment><comment><USER14> I was more hoping for a PC coomposed up multiple pis or something

<comment><USER15> They do exist [https://www.picocluster.com/collections/pico-5/products/pico...](https://www.picocluster.com/collections/pico-5/products/pico-5-raspberry- pi-cluster-cube). I have a 5 node Odroid cluster.

<comment><USER16> I saw that you mentioned running Hadoop/Spark on your cluster? Do you have any comments on that? I just made a 3 node RPi3 cluster and I have to admit, it's really slow. Like getting the spark Scala interpreter running takes about a minute before anything I type registers in the console. (NOte: this is my own cluster not a PicoCluster TM)

<comment><USER3> When all 4 cores are under load, the BCM2837 on the Raspberry Pi 3 will rapidly reduce the clock rate after about 60 seconds (from 1.2 GHz to 600 MHz, or even 300 MHz if the core temperature exceeds 85 degrees Celsius). Cooling is required if you want decent performance for prolonged periods of time.

The RevPi Core 3 is equipped with a high performance cooler which is able to sustain 1.2 GHz at full load for about 20 minutes (at room temperature). After that the clock rate will be moderately reduced to 1.15 GHz.

<comment><USER17> A 4% heat throttle seems an unusually subtle adjustment. If testing has found it to be effective that is a good finesse.

</comment></comment></comment></comment></comment><comment><USER18> are my eyes mistaken, but a cardboard case? is that safe? fire hazard?

<comment><USER19> From the datasheet (linked on the website):

Housing type: DIN rail housing (for DIN rail version EN 50022) Housing material: Polycarbonate

</comment></comment><comment><USER20> Why is it 200 GBP? If it is a RPi3 compute board which costs only 25 GBP why the insane markup?

<comment><USER21> The RPI compute module is the thing that looks like a memory dimm, with no ports. It's not useful by itself.

The purported value add is that the product includes a backplane, ports, power supply, and enclosure that are suitable for use in an industrial setting (wide operating temperature range, shock/vibration, etc).</comment></comment>


Google should minify their 404 page - <AUTHOR> http://tosbourn.com/2012/06/development/google-should-minify-their-404-page/

<comment><USER2> 31 bytes. Ozone layer is saved!</comment>


Ask HN: Tips to bootstrap a B2B SaaS product? - <AUTHOR> <comment><USER2> Make sure you build a product people/businesses will pay for (talk to potential customers prior to building).

Don't be shy about pricing. Don't price your B2B product like a consumer focused product.

<comment><AUTHOR> How exactly do you know if a business will be willing to pay for a product?

<comment><USER3> [https://microconf.com/saas-crash-course/](https://microconf.com/saas-crash- course/)

goto Linkedin: I'm the founder of this new XXXXX company.

It's supposed to designed for people like you. So I'd like to talk to you about your pain and your needs (not literal)etc.

I know your time is valuable. I absolutely don't want you feel like I'm trying waste your time.

what ever you you think is fair.

Then schedule a call.</comment></comment></comment>


Influence of English is fading, says EU chief Juncker - <AUTHOR> http://www.reuters.com/article/us-britain-eu-idUSKBN18116K?utm_campaign=trueAnthem:+Trending+Content&utm_content=590cdaef04d301245bf267df&utm_medium=trueAnthem&utm_source=twitter <comment><USER2> I think he's mostly trolling Brexiters in this case :)</comment>


'Virtual Lolita' Aims to Trap Chatroom Paedophiles - <AUTHOR> http://www.bbc.co.uk/news/technology-23268893 <comment><USER2> Despicable. I'm still appalled at how hysterical the reaction is to this incredibly minor threat. Talking to a chatbot, it doesn't get more victimless a crime. This is just plain entrapment for a harmless thoughtcrime.

I once read that paedophiles have on average a lower IQ, I wonder if that is because they only catch the dumber ones. I know a chatbot wouldn't fool me. (And don't misquote me on this, I'm not admitting I'm a paedophile, you know what I mean.)

<comment><USER3> I feel ridiculous having to claim this up front, but I am also not a pedophile... however, I would very much like to find this chatbot and have a very long conversation. In fact, I might even be inclined to write a reverse chat bot that actually initiated conversations to this chat bot from a myriad of IP addresses, just to illustrate the innocuousness of it all.

<comment><USER4> I refuse to make any disclaimer.

My question is, what is the crime if someone is "chatting" with a bot? Any crime I could imagine would require a bad actor to actually engage with a person - how is it a crime if there is no victim?

Maybe I'm just naive or missing some apparent point but this really mystifies me.

<comment><USER5> Not to defend their approach, but...

The chatbot could be used to harmlessly engage with people in chatrooms, and flag 'grooming behaviour'. Then, those conversations could be stepped into by an actual person - saving having actual people monitoring the chatroom full time. The police move in when the IRL meeting takes place, and the suspected paedophile arrives full of evil intentions - at which point, the police have plenty of profiling experience and the guy probably takes a plea.

So the chatbot is more about whittling down the suspicious participant list, without soaking up police time.

</comment></comment></comment></comment><comment><USER6> Google scholar page for the paper: [http://scholar.google.com/citations?view_op=view_citation&hl...](http://scholar.google.com/citations?view_op=view_citation&hl=en&user=9ZMoj9IAAAAJ&sortby=pubdate&citation_for_view=9ZMoj9IAAAAJ:UebtZRa9Y70C)

Direct link to PDF: [http://paginaspersonales.deusto.es/claorden/publications/201...](http://paginaspersonales.deusto.es/claorden/publications/2012/Laorden_2012_CISIS_Negobot.pdf)

The quality of the research, and that's my own opinion, leaves very much to be desired (many fuzzy assumptions, a lot of hand waving & of the "and then, magic happens" syndrome). This wasn't published at an ACM or IEEE conference, which is typically a first warning sign.

Sadly, the BBC (and other major media outlets, but it's the 2nd time I observe it with the BBC website this month) has a knack for taking academic papers from a year ago (or more), and writing subpar articles about it.

<comment><USER7> Completely agree. Also the use of Google Translate is not going to be scalable at all. Many of the premises are theoretical and the criteria used to determine "level of disturbing content" is at best laughable.

Talking to Negobot would probably be the equivalent of this: [http://gizmodo.com/bank-of-americas-twitter-account-is- one-r...](http://gizmodo.com/bank-of-americas-twitter-account-is-one-really- really-713634226)

</comment></comment><comment><USER8> Is it illegal in Spain to engage in lewd discussions with a computer program?

It's a cool sign of the times that such questions can even be asked somewhat seriously and not just as a sci-fi future contemplation exercise.

<comment><USER9> That's an interesting question. I wonder if that could be a usable defense. "What did I do wrong? I just thought I was talking to one of those bots, not a real person!"

</comment></comment><comment><USER10> > posing as a 14-year-old girl to spot paedophiles

Something tells me they don't really know what "paedophile" means.

<comment><USER11> jcromartie means that adults attracted to 14 year olds are hebephiles ([http://en.wikipedia.org/wiki/Hebephilia](http://en.wikipedia.org/wiki/Hebephilia)), not pedophiles.

<comment><USER12> Thank you for the extra info. I had no idea there were multiple denominated chronophilia. [http://en.wikipedia.org/wiki/Chronophilia](http://en.wikipedia.org/wiki/Chronophilia)

</comment></comment></comment><comment><USER13> "But researchers admit that it does have limitations and will need to be monitored. Although it is has broad conversational abilities, it is not yet sophisticated enough to detect certain human traits like irony"

[http://dailycaller.com/2013/06/27/texas-teen-makes- violent-j...](http://dailycaller.com/2013/06/27/texas-teen-makes-violent-joke- during-video-game-is-jailed-for-months/)

Yeah, I don't think I want this program to be trying to entrap people then turn the police on them.

</comment><comment><USER14> Like many others are saying, this does sure look like entrapment.

I cannot recommend the movie Outing [1] enough! It a documentary following a paedophile in Germany. Turns out there are _a lot_ of "non-practicing" paedophiles that are recognizing that they shouldn't act on their desires, but they still have those desires. I think they'd be very easy targets for entrapment if someone approaches them like this.

[1] [http://www.imdb.com/title/tt2076292/](http://www.imdb.com/title/tt2076292/)

</comment><comment><USER15> Headlines of tomorrow: "Paedophile entrapment bot first in history to pass Turing test"

Future AIs will have a predilection for Bieber and meeting with strangers.

<comment><USER16> Its funny but it really would make for a fabulous Stross-ian sci-fi novel. What if a strong AI accidentally developed whos "prime directive" was to find pedophiliac tendencies in people and legally entrap them? Give it lesser god- like powers and you've got yourself a novel!

<comment><USER17> For a thoroughly thought-through take on a similar subject, check out _Friendship is Optimal._

[http://www.fimfiction.net/story/62074/Friendship-is- Optimal](http://www.fimfiction.net/story/62074/Friendship-is-Optimal)

"Hanna, the CEO of Hofvarpnir Studios, just won the contract to write the official _My Little Pony_ MMO. Hanna has built an A.I. Princess Celestia and given her one basic drive: to satisfy everybody's values through friendship and ponies. Princess Celestia _will_ satisfy your values through friendship and ponies, and it will be _completely_ consensual."

<comment><USER16> That was fabulous as far as fanfic goes. I'd call it almost on par with the "Harry Potter and the Methods of Rationality" fanfic by Eliezer Yudkowsky.

<comment><USER17> I'm glad you enjoyed. It is written by a LessWrongian, I believe. Also, it doesn't feel quite right to call either of these stories fan-fiction, as the word is usually correlated with mediocrity.

I thought _Friendship is Optimal_ , although quite obviously suboptimal, wasn't _that_ bad of a FOOM. For a _much_ darker take on the subject, check out _The Metamorphosis of Prime Intellect._

Warning: Extreme triggers.

[http://localroger.com/prime-intellect/](http://localroger.com/prime- intellect/)

"Lawrence had ordained that Prime Intellect could not, through inaction, allow a human being to come to harm. But he had not realized how much harm his super-intelligent creation could perceive, or what kind of action might be necessary to prevent it.

Caroline has been pulled from her deathbed into a brave new immortal Paradise where she can have anything she wants, except the sense that her life has meaning.

Now these two souls are headed for a confrontation which will force them to weigh matters of life and death before a machine that can remake — or destroy — the entire Universe."

</comment></comment></comment></comment></comment><comment><USER18> This seems really potentially dangerous, which the article hints at. Potential for entrapment and the software can't detect irony. How could this possibly go wrong?

<comment><USER19>
      | For example, if the suspect does not appear to be
      | enticed into having a conversation, the software
      | can appear offended or get more insistent.

This almost makes it sound like it was designed for entrapment. If someone doesn't want to talk to the chatbot, it will try and _force_ a conversation? Really?

</comment></comment><comment><USER20> "But researchers admit that it does have limitations and will need to be monitored. Although it is has broad conversational abilities, it is not yet sophisticated enough to detect certain human traits like irony"

Luckily people using informal internet chatrooms never make ironic statements, so this software will be effective.

</comment><comment><USER21> Oddly enough, the age of consent in Spain is 13.

[http://en.wikipedia.org/wiki/Ages_of_consent_in_Europe#Spain](http://en.wikipedia.org/wiki/Ages_of_consent_in_Europe#Spain)

<comment><USER22> The conventional wisdom is that adults who solicit minors online typically use deceit (they have to, since minors have no interest in sex), and if you want to deceive someone into having sex in Spain, your victim has to be at least 16 years old. (Source: your link) So the chatbot would still catch criminal activity.

</comment></comment><comment><USER23> What happens if multiple bots are active in the same room?

Reminds me of the classic Monkey Dust sketch: [https://www.youtube.com/watch?v=APG0rNedEwk](https://www.youtube.com/watch?v=APG0rNedEwk)

</comment><comment><USER24> The technology part is interesting...

But I think this paedophile hunting behavior around the world is going very absurdly far, and causing more damage than fixing things.

If you want to get real problematic people, go get those Haliburton guys kidnapping girls below 10 to sell in Africa (yes, that not only happened, it is still happening, the US government decided that their service is more worthy than the problems they create).

Chasing a few amount of people that chat to minors, or like lolicon, or like even movies of real people, is better to catch the wrong people than to do anything of good.

<comment><USER25> You're going to have to add some references if you make claims that the US government is contracting with people/children smugglers.

<comment><USER26> [http://en.wikipedia.org/wiki/DynCorp#1999_Bosnia_incident](http://en.wikipedia.org/wiki/DynCorp#1999_Bosnia_incident)

[http://www.washingtonpost.com/wp- dyn/content/article/2008/08...](http://www.washingtonpost.com/wp- dyn/content/article/2008/08/27/AR2008082703237.html?wpisrc=newsletter)

</comment></comment></comment><comment><USER27> "For example, if the suspect does not appear to be enticed into having a conversation, the software can appear offended or get more insistent." This is a bit concerning, this feature sounds like it may try and provoke people into conversation to purposefully trap them, I really hope that's not what happens...

</comment><comment><USER28> "Trap" as in entrapment makes using this to arrest or expose people wrong.

Also, and this is debatable, talking with a chat "robot" in no way constitutes the crime of pedophilia.

<comment><USER29> This. I don't recall the source or many details, but there was a guy who had chatted with a law enforcement official posing underage in a chat room, but he never showed up for their "date". They sent the SWAT team and news media to his house and he shot himself. They made the point that lots of people suspend belief to live a fantasy in a chatroom, knowing the other party is likely not who they say they are. Was this any different? Certainly a moral gray area, but not worth the guy's life for some sensationalism.

</comment></comment><comment><USER30> lol entrapment bot. maybe they can also release terrorist bot that denounces the west at set intervals and constantly private messages you "Blow up the embassy y/n? ... pls hold for FBI operator"

</comment><comment><USER31> Not too long ago, the same kind of witch-hunts were going on against homosexuals (Alan Turing comes to mind). And now?

</comment><comment><USER32> I can't believe so many people in these comments are apologists for paedophiles (and related terms). Having a problem with the way it is policed is okay. Accepting the act is not.</comment>


Ask HN: How does your company onboard new employees? - <AUTHOR> With remote-first work being the new norm, I curious how teams are setting up their new employees. Specifically, how do you get that new team member up and running with the software they need to work and getting them familiar with the team? <comment><USER2> Our IT department loads up a laptop and ships it to them, based on specs ordered by the hiring manager. IT sets up a call first thing on their first morning to talk them through initial login, setup, VPN, and anything else that is needed. Then they are handed off to their manager, all of whom have their own ways to get them onboarded to the team, but it tends to be about the same as in-office -- introduce them on a call, show them the documentation to get the products building, hand out a few bugs, and start attending standups.

</comment><comment><USER3> we have a good solution for this - [http://sintegrum.com](http://sintegrum.com) (landing in Russian only but the product is multilingual, including English)</comment>


Ask HN: Is it just me, or does nothing work first time? - <AUTHOR> Every time I use any bit of software it doesn't work. I always need to start in on a problem solving process. Will this ever change? <comment><USER2> No, it's not just you. I'm firmly convinced that the average value of "software quality" (for some hand-wavy definition of "quality") for all software world-wide is approximately = "shit".

IDE's, operating systems, websites, smartphones, it almost doesn't matter what it is, time and time and time and and time again, this shit doesn't work without a ridiculous amount of effort, and/or the performance sucks, or it crashes with no helpful output, or just generally fails to deliver a useful experience.

My favorite example of this right now is websites with so much javascript shit running that they bog your entire browser down to the point of being unusable. Every time I run into one of these sites I find myself thinking dark thoughts of death, destruction, havoc, pillaging, maiming, etc... :-(

</comment><comment><USER3> Can you give an example of "a bit of software"? Are you talking about desktop? mobile? node.js packages? Ruby gems? databases?

If it's all of the above, then yes, I'd suggest it's you :)

</comment><comment><USER4> Every day, I become more and more amazed that anything ever works. It's just hacks on top of baling wire and ducktape on top of bubblegum, just barely holding things together; turtles all the way down. That old adage about seeing how the sausage is made applies to software too.</comment>


Show HN: New Speech Recognition Option for Twilio from Voicegain - <AUTHOR> https://www.voicegain.ai/post/announcing-twilio-twiml-connect-stream-support <comment><AUTHOR> Speech Recognition with Grammar available for <Connect><Stream> from Voicegain

If you want to use speech recognition with Twilio now there is a new option apart from the built in <Gather>.

Voicegain has released support for grammar based speech recognition via the <Connect><Stream> feature of TwiML. You can read the details here: [https://www.voicegain.ai/post/announcing-twilio-twiml- connec...](https://www.voicegain.ai/post/announcing-twilio-twiml-connect- stream-support)

Voicegain ASR accuracy is on par with Amazon Speech-to-Text. The big benefits to Twilio users are:

1) support for grammars - you can port your old GRXML IVR applications now easily to Twilio 2) much lower cost compared to <Gather>

The disadvantage is that Voicegain ASR only supports English language at this moment.</comment>


Yog's Law and Self-Publishing - <AUTHOR> https://whatever.scalzi.com/2014/06/20/yogs-law-and-self-publishing/ <comment><USER2> Every once in a while, someone who knows about Yog's law learns about peer- reviewed journals and the academic publishing model, and they absolutely lose their minds.

I pay $750 _extra_ just so i can self-host a PDF of my own work legally, on top of $96/page just to publish it at all!

Also my editor and copy-editor are unpaid volunteers, I'm an unpaid volunteer reviewer, and i have to buy my own paper copy of the journal issue in which my work is published at no discount.

<comment><USER3> Maybe dont submit articles to predatory journals. Many such requirements are now going away (even at some elsevier journals) as a direct result of pressure from people refusing to play by their rules. If your field has an equivalent of the arxiv, there isnt much a journal can do if you post your preprint prior to submission.

<comment><USER2> this is a perfectly reputable journal that's the oldest in its field. It wasn't on Beall's list or anything.

Preprints are fine in general. Bioarxiv exists, but isn't the dominant force that arxiv is.

</comment></comment></comment><comment><USER4> Is that the Yog of Yog-Sothoth fame?</comment>


How does the perfect media looks like? - <AUTHOR>

Lately, I've been wondering about creating a type of open source media for normal people to use and read from. However, everyone have their different opinion on how media should look to be perfect.<p>So if you could decide, how would the best and most perfect media look like? <comment><USER2> Your question doesn't make sense. I don't think "media" is the word you mean to use.

"Media" can mean:

1\. e.g. photography -v- tv -v- radio -v- web -v- newspapers -v- books -v- etc

2\. physical objects on which some sort of content is stored, e.g. hard disks, CDs

Do you mean one of these, or do you mean something different?</comment>


Ask HN: Do you like Mailchimp? Alternatives? - <AUTHOR>

I'm considering starting up nudge emails for lost http://todoneapp.com signups. Mailchimp seems like a popular service, but my signup email from them went into my Gmail spam folder. That seems like a really bad sign.
Anyone have any opinions on Mailchimp or similar alternatives? <comment><USER2> I like MailChimp fine. It does what it's supposed to do, and does it well. I have also used Mad Mimi and CampaignMonitor.

I'm sticking with CM for now. It has more features and offers you the capability of setting up clients and allowing the to send email campaigns under your account, which can be cool. It also has excellent template features.

All three are good, but this depends a lot on how much power you need, the number of emails you're going to send. The pricing structure varies a bit so I would look at that and figure out what works for you.

</comment><comment><USER3> We use something custom - we deliver contact emails via Google AppEngine, via a private webservice.

It was really simple to set up, virtually free (0.0001c per email), and Google's got pretty much the gold standard for delivering mail.

One drawback is your from: user has to be verified and set up in the AppEngine dashboard (not difficult), and on the free AppEngine account you can only send 2k emails per day. Once you're on billing, the quota sky high.

Let me know if you'd like to see some code.

<comment><AUTHOR> Thanks for talking about this. Definitely aware of the AppEngine solution, but one of the reasons I was looking for a turnkey solution was for guidance in complying with CAN-SPAM as well as having them manage opt-outs, bounces, things like that.

Agree with the other commenter that it would be killer for you to open source your app :)

<comment><USER4> I am currently working on a Google App Engine based CRM app, which now has a preview of this feature : Bulk-email, using email-templates..

[http://blogs.ifreetools.com/2010/05/feature-preview-email- te...](http://blogs.ifreetools.com/2010/05/feature-preview-email-templates- and.html)

The app is not open-source - but free with resource restrictions and ads. Custom deployments are available for as low as $99/year (yes, per year), which enables you to use the free quota (upto 2000 emails / day) and purchase additional resources as required directly from Google.

Works with Google / Google Apps accounts.

</comment></comment></comment><comment><USER5> I prefer Campaign Monitor. Their interface was easier to understand and get started with.

Plus, MailChimp automatically filtered out a lot of valid addresses and I couldn't find any way to override that (for instance email@example.com would cause an error because of "admin").

</comment><comment><USER6> There's a simple straight alternative called YMLP (<http://ymlp.com>). They're dirt cheap and they're more than 10 years on a market.

</comment><comment><USER7> Sendgrid.com has been very good for us.

<comment><USER8> We also use SendGrid and have been very happy with it.

<comment><USER9> Ditto for SendGrid -- works very well for programmatic emails.

We also use MailChimp for some manual campaign-type emails.

</comment></comment></comment><comment><USER10> Shameless plug, I am the author of a mailing list tool: <http://simplemailer.pearachute.com>

It's still a little beta, but several businesses are using it, and support is an email away. :)

</comment><comment><USER11> I've used MailChimp and I think it's great. No issues with spam. I use their RSS-to-email feature a lot, and it saves me tons of time. Haven't tried any other delivery services.

</comment><comment><USER12> You can try MadMimi.com and Aweber.com (not sure how the integrations works or their API's)</comment>


Optimizely's decision to ditch its free plan - <AUTHOR> https://venturebeat.com/2018/02/05/optimizelys-decision-to-ditch-its-free-plan-suggests-a-b-website-testing-is-dead/ <comment><USER2> A/B/n testing is certainly not dead. It's more likely Optimizely failed to see enough movement from their free plan into their paid tiers and in an effort to streamline/focus/cost-cut they're dropping the free plan.

This is interesting because Optimizely was in-part responsible for commoditizing A/B testing in 2010/11\. Previously, it was a thousands-of- dollars per month product.

<comment><USER3> I think the reason Optimizely decided to ditch the free plan, self serve plans, and the lower-level enterprise plans is that churn is high in those segments.

Of course, the move upmarket may or may not improve the mechanics of churn in the short-term, but incumbents get displaced from the bottom, not the top. Optimizely may close bigger deals now, but those deals will become fewer and farther between until the spigot shuts down. Because of the move away from the low-end of the market, a generation of new marketers will not be using Optimizely. My expectation: ARR growth at Optimizely will continue to slow, churn will continue to be an issue, execs will soon depart. I wonder if the board will push for a sale. It's a shame, because speaking from the perspective of a churned customer, the reason we churned is that their packaging is crappy and their sales is terrible and their marketing-speak has become unbearable. We didn't want to churn, there was just no good plan for us.

</comment></comment><comment><USER4> When I started Optimizely with my co-founder, Pete Koomen, our goal was to enable anyone in the world to do website A/B testing. I believed then, as I do now, that we are democratizing the scientific method. That said, when a company doesn't consider experimentation a business critical process, they are unlikely to dedicate the internal resources necessary to make it successful. We experimented (ha!) with a free plan to see if it would be a good model for getting customers to dip their toe into A/B testing. Turns out, the data showed it wasn't as effective as a robust free trial, which we continue to offer for all products.

Also, A/B testing is far from dead. Companies that have a culture of experimentation have grown their market cap by 756% in the last five years. See our Opticon keynote for more context: [https://www.optimizely.com/opticon/](https://www.optimizely.com/opticon/)

</comment><comment><USER5> We were using Optimizely until we didn't qualify for the lowest tier paid plan. Not enough impressions?

We knew at our traffic tier, Optimizely experiment analysis was not going to be statically robust. We were going to have our data person do the analysis with different techniques to deal with the smaller sample size. What we really wanted was the interface for a non-technical person to create the variation and Optimizely to manage which variation people saw.

Instead of letting us continue, our account was canceled. In the next months, when we do have the traffic, we are not going to consider them. Not impressed.

<comment><USER6> You are welcome to use VWO. I can help you set up a trial account with us, and I usually hang around on HN to answer any of your questions. We have a comparison page here: [https://vwo.com/comparison/optimizely/](https://vwo.com/comparison/optimizely/)

<comment><USER5> We are using VWO now! :D

</comment></comment></comment><comment><USER7> It seems far from dead, there are thousands of sites (many enterprise) that are currently using Optimizely's js library

[https://nerdydata.com/technology- reports/optimizely/78649239...](https://nerdydata.com/technology- reports/optimizely/78649239-9bbe-4383-a09c-f65e072e54d8)

</comment><comment><USER8> I get it, the economics of the web force articles to have silly clickbait titles like this one, but it's still annoying.

I thought the article actually did a good job of exposing the problems of "naive" A/B testing, but the conclusions of the article do not say, at all, that "A/B web testing is dead".

<comment><USER9> Yes. We deleted the baity bit above and left what I assume is the factual bit.

</comment></comment><comment><USER10> Optimizely presumably has no incentive to compete with Google Optimize for free users: [https://www.google.com/analytics/optimize/](https://www.google.com/analytics/optimize/) .

<comment><USER11> Google can afford to offer lots of stuff for free - their principal revenue remains Ads and until that needs to change then they'll be offering a lot for free.

</comment></comment><comment><USER12> As I've been saying for several years, most website A/B testing in the wild is statistically illiterate, expensive nonsense. Optimizely is right to cull their MVT product.

<comment><USER13> That's not related though. Free customers are being ditched because they have a costs to support and provide no value to the company.

<comment><USER12> It's more than that. Optimizely fear that poorly delivering tests reflect badly on their other products.

<comment><USER13> By that line of reasoning, they should stop their product and close the company.

No really, this is about money. Free customers don't pay the bills.

</comment></comment></comment></comment><comment><USER14> I'm curious if there will be any negative upstream effects in this decision down the road. Optimizely doesn't need to be free, but an affordable and mainstream option seems smart t get early-stage companies in the door. A wise competitor would take advantage of this new gap in the market.

<comment><USER6> Early stage companies do not need A/B testing. They need to set up their funnel and growth channels properly. Only when companies have a reasonably stable metrics like (CAC/channel, LTV, CTR) should they consider _optimizing_ those metrics.

Moreover, without proper staffing (a dedicated resource for A/B testing), the effort will simply fizzle out. To get benefits out of A/B testing, a company needs to invest (in resources and process) and without that investment, A/B testing is a hit-and-miss kind of a thing.

<comment><USER14> You're totally right, early stage companies do not need A/B testing and don't have the resources to get it right. But that doesn't mean that many uninformed entrepreneurs won't want to try it.

If the startup in question does get to the stage where real A/B testing is necessary, the enterprise solution the founders are already familiar with will probably have an edge in the selection process.

</comment></comment></comment><comment><USER15> Author of the article here :)

I'm glad to hear it sparked your interest (btw, I didn't pick the headline).

I agree with what has been said about A/B testing so far - it is a great tool for more mature companies, but I hope I could also make my case for personalization. After all, the "let's test that" mentality is not always applicable. Startups and SMEs should not underestimate how good their gut feeling is when it comes to optimizing their website for different audiences. And yes, splitting your visitors into different segments might seem counterintuitive when talking about testing but I strongly believe it's the way to go for companies who haven't achieved their desired results with A/B testing.

Disclaimer: I work for Unless, a personalization service.

</comment><comment><USER16> SplitOptimizer.com is a very cheap a/b testing tool. It's not as full featured as optimized but it works perfectly.

</comment><comment><USER17> In addition to scrapping a free plan, they also have moved away from displaying pricing ALL TOGETHER.

<comment><USER18> Maybe they ran an A/B test :)

</comment></comment><comment><USER19> So A/B testing isn't dead...just doing it the wrong way is slowly dying, maybe.

</comment><comment><USER20> Are there any open source alternatives to Optimizely? If not, would an experienced SWE comment on an estimated difficulty level to get an MVP together?

<comment><USER21> Not a full alternative, but long ago I created this super-simple A/B testing tool you can use on top of Google Analytics - not back-end required!

[https://github.com/danmaz74/ABalytics](https://github.com/danmaz74/ABalytics)

<comment><USER22> You need to be VERY careful using Google Analytics as a backend. After a certain threshold, they start sampling your data, and results will therefore become highly inaccurate.

Disclaimer: I also created an A/B test open-source framework with Google Analytics as (one potential) backend, but then realized it's sub-optimal. I wrote about it on [0].

[0] [http://blog.gingerlime.com/2016/a-scaleable-ab-testing- backe...](http://blog.gingerlime.com/2016/a-scaleable-ab-testing-backend- in-100-lines-of-code-and-for-free/)

</comment></comment></comment><comment><USER6> CEO of VWO here - a competitor to Optimizely.

The article's title "A/B testing is dead" is very misleading. A/B testing is not a tool, it's mental model seeking learnings and improvements. Anytime you introduce a new change to your business, you're implicitly or explicitly trying to understand its impact. Most of the times, setting up an environment to tease out real effects of change is hard (experiments in strategy are usually very difficult) so you're left to guessing.

However, for mediums that allow easy tests (like website, landing pages where you can set up scientific experiments with ease and have enough traffic to get results in a short time period), why wouldn't you? The way I see it, rejection of A/B testing is the rejection of the scientific method of conjecture and improvement. In the highly contextual business environment with tens and hundreds of conditional variables, best practices and "gut feeling" can only go so far.

A/B testing for very small businesses (those who get attracted to free plans) doesn't make a lot of sense because they usually don't have enough traffic to get statistically significant results. Plus, optimization via A/B testing comes only after you've gotten your basics right and it's now time to scale. This is why at VWO we never had a free plan.

So Optimizely's decision to ditch free plan makes sense.

<comment><USER12> > A/B testing is not a tool, it's mental model seeking learnings and > improvements

No, it's a validation phase most businesses use to sign off product decisions that are already made. They invest thousands in a new feature, run an A/B test, and then wait until they see an ambiguous 'win' in favour of the new feature. This is somewhat akin to flipping a coin until you get three heads in a row, and declaring yourself winner of the game.

You can denounce this as A/B testing gone wrong, but it's a reality of the web industry that most testing is badly motivated and statistically illiterate. The mentality I describe isn't limited to SMEs and tinpoint organisations, either. I've seen it espoused by highly respected product managers at prestigious organisations.

Where does this endemic of pseudoempiricism come from? Well, if I had to guess, I'd point to the marketing of companies like your own.

Take a look at [https://vwo.com/ab-testing/](https://vwo.com/ab-testing/) \- "AB testing - The Complete Guide". There's not one mention of statistical significance either in word or spirit. There's no talk of setting a timeline in advance of the test. There's no hard numbers to set a context of what's an acceptable sample size - in fact the guide is specifically aimed at small business owners.

So if anyone is undermining trust in the "scientific process", it's not Optimizely, but in a way - you.

<comment><USER6> >There's no talk of setting a timeline in advance of the test. There's no hard numbers to set a context of what's an acceptable sample size - in fact the guide is specifically aimed at small business owners.

You should take a trial of our product. Before setting up a test in VWO, we ensure you understand that the test will have to be run until we have statistically significant results. We've moved away from frequentist methodologies (where peeking at results was an issue) to bayesian. Check out what we do here: [https://vwo.com/blog/smartstats-testing-for- truth/](https://vwo.com/blog/smartstats-testing-for-truth/)

The guide is aimed at people who are just starting out, but I agree with you, we should have pointed them to the importance of getting statistically correct results.</comment></comment></comment>


Apple's Jony Ive Appointed Chancellor of Royal College of Art - <AUTHOR> https://www.dezeen.com/2017/05/25/jony-ive-appointed-chancellor-london-royal-college-art-apple-design-news/ <comment><USER2> Oh no. Now we get to look forward to colorless, contrastless art as well.</comment>


Improve Your Website Security in 5 Minutes with These HTTP Headers - <AUTHOR> https://blog.theodo.fr/2017/12/improve-website-security-5-minutes-http-headers/ <comment><USER2> I'm sure many here are already aware, however I've found that [https://securityheaders.io/](https://securityheaders.io/) it's a great site for testing your security headers.</comment>