Hi! I'm wondering how Enchat is different from other open source projects that wrapped messenger.com into a Mac app with electron. What features does it have that these free and open source projects don't have?
Lots of desktop integration features! Custom chat notification bubbles, screenshot taking, file downloads and uploads, resizable font, various keyboard shortcuts, menu bar icon, and more.
Using Elixir here for a couple of months, for an app backend, and even for shell script type of projects. Great language, no surprises, and very responsive community -- really, my biggest wish is for more people to try it, as I think it's still relatively niche. Had no previous Erlang experience. While you don't have to write Erlang code itself, you'll over time become familiar with Erlang/OTP architecture concepts, such as GenServer, ETS, distributed nodes, and so on.
Was very happy to see this recent post from Pinterest [1] as a sign that some of the more "mainstream" teams are starting to look at it.
Also, a repost [2] of some helpful tips if you're just getting started.
I'm assuming the big name products here have carefully measured, A/B tested, etc. every screen and they are at their best (other than Apple Music, which is a whole other creature). That said, product teams should still periodically audit onboarding content, ideally with a set of fresh eyes. Does everything still make sense? Is there a logical flow from A to B?
It would have been interesting to be "a fly on the wall" and see how some of these evolved over time. I suspect some of the oddities initially started with a good set of screens, but then a new piece was later tacked on without a full audit or without the resources to change everything else.
Yes, totally agreed. I would love to see how these flows are performing from a conversion/retention standpoint, in particular the more... perplexing parts.
Not a fan of screen overlay tooltips as in [1]. My first instinct as a user is to get them out of my way, and I do that every time, feeling guilty. And adding a "next" button and going through tooltips one-by-one doesn't make this any better, just more annoying.
Actual games (such as GTA or Cut the Rope) do a great job with onboarding, and apps tend to take the simpler show-everything-in-the-beginning way.
Two alternatives I've tried as an indie dev:
- Gamification, where you ask the user to perform one task, such as "drag X to Y." Only after they performed the action move on to the next prompt, and perhaps not even immediately.
- Utilizing badge counts or "bouncing" animations to indicate some action that needs to be performed. The benefit is that the user can try it on their own time, and you're not rushing them. The downside, though, is that some users may never actually click.
On the flip side, these approaches can add complexity in both code and how you structure your UI.
I like the tooltips better than either of the approaches you've suggested. If I'm confused, I glance at them and then am less confused. If I'm not confused, I just dismiss them, not feeling guilty.
I hate "help" mechanisms that keep popping up in normal operation, because usually I know exactly what I'm doing in normal operation.
You're on point, these help mechanisms should be rare and few, or they would be a nuisance as well.
The problem with forced screen of tooltips in the very beginning is that you haven't had a chance to explore the app yet, and so it's hard to mentally assign importance to them. And later, they're gone.
This is my issue with them. Maybe I do need a tooltip to figure some feature out. But I certainly don't know which one I need yet.
If you bombard me with "Hit the + button to make a new document!" on first launch, of course I'm going to dismiss the tips. It's 2015. Figured that one out on my own.
Better to design an app where functions aren't hidden in secret menus and I can explore without accidentally screwing things up. Is that too much to ask?
I'm reminded of a story in the Book Of Heroic Failures which went something like "Mr Smith, who attempted to pull off the worlds largest single cheque forgery, altered his pay cheque from 14 pounds 8 shillings to 148 million pounds. The fraud was successful right up until the moment he tried to cash it."
The best security for thousands of years has been simple - be a suspicious bastard.
The more formal number ideographs are the original ones, the simpler ones were simplified so numbers aren't as awkward to use.
You can also easily change a one into a ten, for example. Note also that it's not exactly a positional number system like Arabic. E.g. the number 123 would be written 1 hundred 2 ten 3. IIRC you can also easily change a ten into a hundred or thousand, so for larger values with a few zeroes in between you could shift a meaningful place into the zeroes to the left sometimes.
Well, just look at the symbols in his comment. 2 into 3, 4 or 5 is pretty easy looking, as is 1 into 10, 7 or 8. I'm sure you could probably spot more.
Are you on public beta or developer beta? Those instructions appear to be for the public beta program. If you were using the developer beta, I expect you have to reinstall the seed configuration utility (if you don't still have it) from https://developer.apple.com/osx/download/ and use that.
The result of each command will be passed as the first argument to the subsequent command.
d. You get seamless interoperability with Erlang libraries.
:crypto.hash(:md5, "bob") |> Base.encode64
e. Try the Observer tool in iex to visualize various aspects of your running application, including the supervision tree, details on each running OTP process, and much more. Seriously very handy stuff.
:observer.start()
f. If you're using EC2 like I am, Amazon images have a too-old version of Erlang, but it's trivial to compile things yourself:
sudo yum install gcc glibc-devel make ncurses-devel openssl-devel autoconf
wget https://www2.erlang.org/download/otp_src_18.0.tar.gz
tar xvzf otp_src_18.0.tar.gz
cd otp_src_18.0
./configure && make && sudo make install
sudo ln -s /usr/local/bin/escript /usr/bin/escript
sudo ln -s /usr/local/bin/erl /usr/bin/erl
This is always what I thought OOP should be, but could never put my finger on. Effectively, you're calling a chain of "methods" of "objects", but each method lives in its own namespaced module, rather than automatically being assumed to live in the class associated with the data. No "this object implements two interfaces that both define add()" confusion; no objects extended to infinity with extra mix-ins and interfaces just so that more methods could be called on the object rather than having the object passed to utility functions; etc.
And when you do use classes (Structs), there's line-local context-free crystal-clarity between code that expects a generic object expressing one of the class's interfaces (where calls are made on the interface's Protocol module) vs. code that expects that particular class (where calls are made on the class's module, which contains the implementations of the Protocol functions.)
So, pretty much whether everything is being applied right to left vs being applied left to right?
Personally I like chaining because, since I read going right to left, in my head I can go "x goes to y then the result of y goes to z" versus "z is the result of y which is the result of x" (reading it backwards)
Now, if the object on the far left was some kind of
accumulator/container, the
effect of sending something like three "add the number 3" would be
similar to chaining. But even if you mulitply the number 2 by 3, three
separate time, 2 * 3 still equals 6.
In fact, in order to get chaining with keyword messages, you apparently
need to define it, or especially adapt eg: containers to return ^self.
But as should be obvious, I'm not very familiar with Smalltalk. Some
more on the subject: http://blog.3plus4.org/2007/08/30/message-chains/
That's pretty drastic. That nukes the derived data folder of all your Xcode projects. If you work on more than 1, using this to solve a problem in 1 will lead to needing to rebuild all of your projects. That seems a bit extreme for an issue in a single project.