Audible.com: a Poor Example of Usability

I’m a subscriber of Audible, an Amazon company, where you pay monthly fee in exchange for a pleasant purchasing experience of audio books. I like listening to the audio books while on the go or lying in bed. My smartphone is always by my side, and Audible created a free application for downloading and listening.

As an extra free bonus, Audible’s subscribers can download morning editions of The Wall Street Journal – listen to the latest news and editorials while commuting to/from work or getting to sleep. Nice! This is how the UI looks on my iPhone.

photo (5)

What would you do if today’s edition of WSJ is not shown in this list? The first reflex should be to refresh the list. Any truck driver from Alabama knows that applications that get content from servers should have this curved arrow to refresh the screen. I thought so too. But the Refresh button was nowhere in the vicinities. After multiple clicks I found the Settings screen, where UI designers have hidden the Refresh button. Why on earth would they do this? There were plenty of real estate on the main view toolbars!

photo (3)

Don’t get me wrong. Audible’s UI designers are not hopeless. They knew that many people would be having troubles finding the Refresh button, so they came up with an unusual solution. They’ve added an explanation of where the Refresh button is in the FAQ section of the app.
Needless to say, that the FAQ itself is hidden under the Settings icon. Well, as Sheryl Crow sang, “No one said it would be easy But no one said it’d be this hard”. But if you’ll find the FAQ, the first item there is “How do I Refresh Library” (ignore the fact that it reads “How to I” – this blog is not about QA). Well, if I get to this screen, the FAQ is sitting right under the “Refresh Library” anyway.

photo (4)

Hopefully, our Alabama truck driver won’t get into an accident while trying to find this well hidden feature. Anyway, as of October of 2013, the iPhone’s version of Audible app leads in my unofficial competition for the worst UI decision.

P.S. See that “Download All” button on the top image? Good luck on canceling dozens of downloads after clicking on it!

Finally, a language without protected variables

When I started to learn the soon-to-be-released programming language Dart, it was a love from first sight. I like Java, and Dart is like Java, but a little better. I’m planning to write a series of blogs about Dart, but I couldn’t resist writing about the missing protected keyword.

The thing is that I firmly believe that having protected data access is pretty annoying, and on multiple ocassions it was forcing me to write convoluted code just to access protected variables from a non-descendant class. Seven years ago I published a post “Who needs protected variables” at JavaLobby.

A year later I had to fight with protected variables in ActionScript – here’s why.

Now, I’m happy to report that Dart language specification has only private and public data access. Just like I always wanted! This is what the spec states:
Dart supports two levels of privacy: public and private. A declaration is private if its name begins with an underscore (the _ character) otherwise it is public.” Just like that. No keywords to remember.

I like Dart and suggest Java, C#, and ActionScript developers to learn it. You’ll find yourself at home. The JavaScript folks should learn it too.

Nontraditional Android Phones

Google gets creative. Apparently some Android devices may have nontraditional sexual orientation. They started selling T-Shirts where two happy male or female Androids are holding each other’s hand while waving the rainbow flag.

The next logical step is to clearly mark the sexual orientation on the packaging of the devices. So the AT&T customers could clearly request, say a black gay Nexus 10 tablet. Or you can simply walk into a Verizon store and say, “Could you please give me two lesbians: Samsung Galaxy 4 and Boost Mobile Galaxy Rush. Make sure they come with the verision 4.0 Ice Cream Sandwich.”

For many people smartphones become the best if not only friends. Even more so, most of the people sleep with smartphones or tablets. Buying a smartphone becomes an important event in the life of many people. Like getting a puppy. Or adopting a child. Luckily, it’s possible to find out Android’s sexual orientation in advance, if Google agrees to clearly mark their devices. In the end of the day we’re entitled to know who are we going to bed with, aren’t we?

Phishing for Dummies

Everyone knows what fishing means. It’s when a man tries to convince a fish that this fat warm had nothing better to do but diving ten feet into the river.

Phishing is somewhat similar. Someone assumes that you are as stupid as an average fish and believe that every incoming email is a legitimate one and will happily bite into it. If you don’t like my definition of the term Phishing, read what the Wikipedia has to say:

Phishing is the act of attempting to acquire information such as usernames, passwords, and credit card details (and sometimes, indirectly, money) by masquerading as a trustworthy entity in an electronic communication.

Now let’s consider a real world example. I just got this email in my Yahoo! account (this is a reason why I decided to write this blog):

phishing1

If I was a regular fish, I’d simply clicked on the “Click Here” link and obediently followed all further instructions. But I’m as smart as a dolphin and immediately figured out that someone was trying to trick me. Let’s give this email a closer look.

First, the email came from some weird URL – @email.yahoo-inc.com and not from yahoo.com.

Second, it has this gibberish at the bottom: “Terms Privacy About our ads Advertise Developers”. These words are not even links to the articles Terms, Privacy et al.

Third, Yahoo! knows my name, and would address me as “Dear Yakov”, but not “Dear valid Customer”.

Fourth, the text of the email starts with “Due to so many complains on our server upgrades”. What a BS! Even if Yahoo! had many complains about their server upgrades, their award winning legal team would find better wordings to turn negative into positive, like “Due to our continuous efforts to imrove our service we’ve recently upgraded our state of the art server farms…”

If you are still not convinced, take a look at the following snapshot of my desktop. I’ve hovered (not clicked!) the mouse pointer over the “Click Here” link and took the following screen snapshot. Looked at the content of the Browser’s status bar at the bottom – this is a URL of the Web page that would be opened should I clicked on that link.

phishing22

Now we know the name of the phisherman! It’s http://www.highstreetproperties.com. If you’ll just try to enter this URL in your browser, you’ll see the page that reads “Error establishing the database connection”. I’m sure you’re dying to know were the actual “Click Here” link would have taken me, right? OK, as a good Samaritan, I’ll do it for you. On the count of 3, I’ll click. One. Two. Three.

phishing3

Boooring… Now even a fish with an avarage IQ can figure out that after entering Yahoo! ID and password, this information will be sent to the phisherman’s database located at highstreetproperties.com. Then these low class people will use this info to get access to your Yahoo! contacts and send them email (from your name) offerring to purchase these really nice blue pills that make miracles happen!

If you’ll examine the source code of the page, you’ll see that that name of the script at the phisherman’s site is called process.php. But do you want to know more details about this phisherman? Just go to the Networksolutions.com and use their whois service: http://www.networksolutions.com/whois to see who registered the domain name highstreetproperties.com.
phishing4

I hope you’ve enjoyed my real-world explanation of the Web security term Phishing. For more technical introduction to Web security read this chapter from our upcoming book on Enterprise Web development.

Categories Web

Using Facebook? Don’t!

My son Dave showed me the episode from the South Park, season 14, titled “You have 0 friends“. This great episode resonates with my understanding of the virtual world, hence this blog.

1. People who are using Facebook daily are doomed to lose their social skills. I mean, seriously.

fb1

2. People enjoying social networks are either already sick or getting there. On the surface it looks like social networks help lonely people to find someone to talk to. But people are more and more immersing into a virtual world and getting back to reality may become problematic, at least to some of them.

3. Young generation has troubles in communicating with people in the real world because of social networks. Yes, I’m an old fart, and you don’t need to remind me about it, but I’m actually meeting my friends face-to-face.

4. To me, the best momemt of this South Park episode is at about 8’10”. But what if he wouldn’t get a response? This would be a disaster (in a real world). Do you know what should you do after watching this episode? Watch it again. Recognized yourself? Sorry, but you’re on the road to join the world of people’s profiles… Good luck in getting back to the reality.

5. I’m not a social networks nazi. I have accounts on Twitter, Facebook, and LinkedIn. Twitter is for business. Facebook – I just don’t know how to cancel it. LinkedIn is for business.

twitter

6. Don’t trust me? Read this.

7. When I see that so-and-so wants to connect with me on LinkedIn I just ignore it unless I know this person.

linkedin

8. There is another very smart movie about the World War III (Facebook user may need to watch it twice to get it).

9. Enjoy this hashtag video with Justin Timberlake.

Close your Facebook account. Get real. Do you know how many friends you need in a real life? Just one.

Quick noise removal with Audacity

During JCrete conference, every session was recorded onto a small audio recorder that was standing in the middle of the room. Obviously, you can’t expect good sound quality when people are making all kinds of noises. Such recorders require a decent amount of post processing, which takes time, which no one has. Below are some simple steps describing how to lower the noise and amplify the audio level with a free program Audacity.

1. Download and install Audacity and LAME MP3 encoder.
2. Start Audacity and import your audio file using the menu File | Import.
3. You’ll see the graphics of the audio tracks.
4. Now you need to identify the noise to be filtered out from the audio. Several times hit the button on the toolbar that looks like the looking glass with the plus sign to zoom in.
5. Highlight a 2-3 seconds fragment with the noise only.
6. Select the menu Effects | Noise Removal and press the button “Get Noise Profile” so Audacity knows what to remove from the recording.
7. Click anywhere on the track to unhighlight the sound fragment.
8. Select the menu Effects | Noise Removal again, but this time just press the button OK. Audacity will start processing your audio removing the audio sample that matches your selection from step 6.
9. If there is still some noise GO TO step 5. If you don’t like the results of the second noise removal, select the menu Edit | Undo Noise Removal.
10. Amplify the sound level by selecting the menu Effects | Amplify. Enter a number (e.g. 5) and check off the box Allow Clipping.
11. If you want to remove unwanted noisy fragments, just highlight it and hit the button Delete on the keyboard.
12. Save the new version of MP3 by selecting the menu File | Export. Pick the mp3 format. Save it as a Joint Stereo and select the rate 32kbps, which is sufficient for the speach recording in a non-audio-friendly studio, and the file size won’t be too big.

Java unconference in Crete. Day 4.

The fourth day started with the session “Scaling up teams. Motivating people to learn new languages”. It was a discussion about why not too many developers are willing to learn new programming languages. We were talking about two real-world situations:
1. The team lead gives developers 30 min a day to learn whatever software they want, but they use this time for coffee.
2. The team lead makes arrangements with the management to take 5 people to a hackaton instead of going to work at the firm’s expense – only three out of 60 people signed up for it.

IT managers often face the choice: either hire professional contractors experienced in specific language/framework/tool or train their own employees. IMO, lack of motivation is damaging to any IT shop, and people who are unwilling to keep their skills up to date should be let go. The sooner the better.

The next session was “Embedded Java”, which presented another proof that the unconference format works really well. Four people gathered in the room and everyone said that he was interested in this subject and hoped that someone else had a real-world experience working with embedded Java. No one knew much about it, and the session lasted for 10 minutes. Mattias Karlsson had this little chip with Java SE embedded. One of the use is to hang it on the trees in the forest. If the chip’s moving it’s a signal that some intruders are illegally cutting these trees. Programming for embedded devices is an interesting trade that requires software developers to write efficient code that can run in the devices with limited memory and slower CPUs.

Then I’ve joined the session titled “Devops Tooling”. Devops are species that beside writing code are curious about how it’ll run in production. Typically devops are breeded in startups. Do you care if your programs log messages that can be useful for people from operations and customer support? If yes, you have a chance to join devops population. If you went as far as setting up monitoring tools so people from operation could be aware of the status of your app without the need to bother your highnessy – you have arrived to your destination. On the photo you see three Carl Quinn, Mattias Karlsson, and Kirk Peperdine participating in the devops discussion.

SONY DSC

For me the technical part of the conference finished in the room labeled “Functional programming in the post JDK 8 world” convened by Andres Almiray.
Andres stated that if you like it or not – you’ll be doing functional programming.
Juergen Strobel noted that in Java you should think first of a proper immutable structure, and then use functions. Java 8 has lang constructs and API to allow functional programming.
IMHO, for functional programming should be done in a self-contained modules using other JVM languages like Scala. Sven Reimers noted that the level of interoperability between Java and Scala running in the same VM is immature yet.

Then we spoke about Java 8 lambdas. Initially Java was a created as a blue collar language and now blue collars evolve. But I’m wondering how to teach the new Java 8 features to newcomers? I usually start with explaining object-oriented programming from Lesson 1 of my trainings. Mixing OOP and functional style of programming in the intro courses doesn’t seem right. It would be like teaching a two year old to drink beer – at this age kids have an impression the milk is the right beverage.

To my taste, Java remains the best language to teach the “Intro to Programming” course. People in the room suggested that Python or Scala could be used as the first one. Sure, the newbie’s mind is not cluttered with the Java way of doing things so the concepts of functional programming will be easier to digest.

In the evening the entire conference has gathered in the Heinz’s house. A Greek folk band was playing, some people were dancing while the others were eating, drinking and chatting Java.

SONY DSC

Carl Quinn from Java Posse showed photos of the 3D printer he was building at home. I’ve asked Carl about Bruce Eckel’s Java unconference. He said it’s a similar event, but people are not allowed to bring laptops to the sessions and there are no formal presentations – it’s just a mike in the middle of the room – people discuss stuff.

For most of us this unconference is over, but some people are staying one more day for a hackaton were they’ll be explore Java 8 lambdas hands on.

JCrete is a well done and interesting event, and such format is more appealing to me than a formal conference setup. Between you and me, I liked it more than JavaOne. It’s a lot more interactive, and you meet and talk to many well known and respected people willing to share their experience. For me it was a new conference format, and I’ve enjoined every bit of it. The informal discussion format of the Java Specialists Symposium works perfectly for me. While traditional Java conferences can be useful too, the JCrete unconference gives me the biggest bang for the buck let alone those beautiful beaches and Greek hospitality. The future JCrete unconference may have different disorganizers, but meanwhile, my hat off to Heinz Kabutz for disorganizing this wonderful event three years in a row.

I’ll be back!

Java Unconference in Crete. Day 3.

In the morning of the third day I was running a session about developing HTML5 applications. The main discussion was on pros and cons of developing HTML5 vs native applications for the mobile devices. IMO, going native is right if you can afford it. This recommendation is as good as saying that driving Mercedes S-class is better than driving a Fiat, which I mistakenly rented. But hey, not only this small car was taking me over over the Cretan hills, but I was giving rides to other Java developers too. If you’re interested in HTML5 development, I can offer you to read unedited drafts of our upcoming O’Reilly book.

Then I joined a session on Java frameworks. I believe that frameworks should be used if they allow developers to write less code and are not intrusive. The audience has divided into two camps – those who don’t like Hibernate and the camp that I belong to. I won’t repeat my reasoning here, but will rather give you a couple of links to my older blogs on the subject. Here’s the first one, and here’s one more.

I’ve completed the technical part of the day attending the session by Morris Naftalin titled “Navigating Streaming API”. This is a new Java 8 feature, which looks interesting as long as you can find a use case for it. This was the only session where I didn’t have anything to say. Yet. Actually, silent attendees are in minority at this unconference. I believe only one out of four of the participants didn’t say a word at the technical sessions. For these people the JCrete unconference was even more interesting and useful – they were in the learning mode.

Here’s one more thing that turns this conference into unconference. This morning JCrete organizers were wearing t-shirts of Jfokus – another Java conference.

SONY DSC

At JCrete the afternoons are for tanning and swimming, and we went to the local beach. The
water was warm and clean. For under two euros you can get a nice cup of Greek coffee, which is a treat.

In the evening I took my wife out – we’ve visited a lively city of Chania. What do you eat in the restaurant located in the sea port? You got it – the fish. The owner of the restaurant opened the fridge and showed us the fresh catch they got an hour ago. We picked a red snapper and a similar fish, which starts with a B. In addition to the grilled fish we had Greek salad, an octopus, fried cheese and a bottle of local wine. When I asked for the bill, they brought a watermelon, grapes and a small bottle of raki, which is a better version of grappa. It was on the house. Nice!

SONY DSC

The evening finished as usual by the pool. This time Kirk treated us with an expensive Tokaj wine, which he brought from Hungary. If you can’t afford drinking expensive wines, enroll into one of the Kirk’s training classes on Java performance optimization. It seems that the demand for such skills is pretty high.

One more day, and the conference is over.

Java Unconference in Crete. Day 2.

The second day of the JCrete unconference started as usual – after the breakfast we’ve entered the main room, where Heinz and Dmitry made announcements about four tracks of having the afternoon fun. I picked visiting of a “secret beach”. Then people expressed their interest in attending one of the four technical sessions. This is when the final rooms assignment was made. The session conveners are where standing in the corners of the room, the topics were announced topic and people where gathering in the corner of their choice.
Interestingly enough the main room has the same number of the corners as the number of tracks. The final actual room/session assignment was done when people are gathered at a particular corner. “It seems that we have the largest crowd in this corner – they’ll get the main room.” Is this simple or what? The KISS principle in action!

The first session was about making software simpler. The consensus was that in Java installing the required for the project is more complicated than it should be. The npm installer was used as an example of the proper way to do it.

I was running a session “Living and running in a virtual startup”. I’ve shared my own experience, and then we’ve discussed the issues that every startup is facing: where to get the money, where to find the right people, why people even create startups, and if the country laws are favorable for the entrepreneurship. It seems that Greece is the most tough place for startups from the laws perspective.

One person expressed a typical concern: “I have a nice job, but want to create startup. Should I just quit and take a risk?” One capitalist from South Africa answered that this is exactly what he did.

Never use your house as a loan collateral to fund your next great idea.
Try to sell the idea of you startup to your wife before quitting a well paid day job.

Then I said that we work with contractors from Eastern Europe – this is where we can find good developers willing to work at lower rates. One socialist from South Africa said, “Arn’t you exploiting these people using the fact that the salaries in their countries are low?” This reminds me of a great Indian tale about seven blinds and the elephant. I looked at it differently – we help these great developers and their families substantially improve their lifestyles without the need to leave their countries.

BTW, there are three people from Italy in the conference none of which lives in Italy – the IT market is weak there. Belgium is the money cow now!

Here is another comment from the same session, “I’m and idealist and like startups where people would work without pay just because they are passionate about the software and the idea.” IMO, there should be at least one pragmatic person in the startup otherwise either the time will be lost on developing of an unneeded product or capitalist sharks will eat these idealists for breakfast.

Then I’ve attended participated in a session about lying profilers. It was good to have a reassurance that even though the tools helps, the humans is still da man in the software optimization field.

In the afternoon my wife and I has joined the group of people who went to a secret beach. Another winding road and a pretty steep descent (ok, ok, Heinz’s mom did it last year) lead us to a beautiful blue lagoon. To see the picture of this place, click on the third letter “e” the first mentioning of the word “beach” in this blog.

Another group went to the Pirate Bay, which increased the budget of one of the local hospital by 560 euros. Manik is back in business in no time. Special credits to Kirk for knowing what to do in extreme situations!

In the evening, most of the conference had a dinner in a beach taverna. After 10PM a large crows has gathered by the pool. We had some beer and wine talking about women software. In particular, I had a chat with a geek who makes a living by improving performance of the software systems. When I asked about some numbers he said “It’ll be at least 10 times more responsive”. I trust this guy.

Java Unconference in Crete. Day One.

The conference takes place in the resort hotel. Even though there are only 60 of us, this unconference can have up to four tracks. This is how the main auditorium looked at 8:45AM.

SONY DSC

We sat down, the conference organizers explained the rules and gave each of us markers and a pack of yellow stickers to write down the suggested topics. You don’t have to be the subject matter expert in these topics – you may just want to learn more about them from others. This is what I wrote:

SONY DSC

The mike went around the room, and those who wrote something on the stickers had a chance to explain what their proposed topic was about. Some people simply presented their topics as simple as this: “I know nothing about XYZ, and am looking for your help in understanding it.”
Then the stickers were given to the organizers, and I’ve learned something new right away. Mattias Karlsson noticed that most of us don’t know how to peel the stickers off. He was kind enough to share this useful technique:

Peel off the sticker with a left-to-right movement. If you do it as most people do – bottom-up – the sticker will curl-up, and it will be hard to read its message when the sticker is placed on the board.

Thank you, Mattias! WHile people were introducing the possible topics, the organizers were placing them on the left board to group the similar topics together. At 10AM the initial version of the schedule (on the right) was ready:

SONY DSC
I participated in two sessions: “Working remotely” and “Application Design wars”. Again, not attended, but participated. Each of them had a dozen participants, and everyone has something to say on the subject. I really enjoyed every moment of these discussions. It’s hard to explain it in the blog – you have to be in the room filled with professionals to appreciate the fact that people know what they are talking about, respect other’s opinions and get everyone a chance to speak up. And let me assure you:

Geeks can speak. Geeks can listen.

Since each session was audio-recorded I can guess that at some point they’ll be published on the Internet. I’d love to hear the conversation that took place in each end every room. At 12:30PM the technical part was over and some people signed up for going to remote beaches while other went to see an archeological cite (we’re in Greece, remember?).

I was one of the drivers of three cars that took a dozen of people to a remote and beautiful beach in the Sooth-West of Crete. There were two couples in our car – my wife and I and Andres Almiray with his wife, who being a resident of the Swizerland did a great job explaining us why Mexico is a great country. On the side note, there is probably a dozen Java Champions here at JCrete, right Heinz? As you can see, the beach was full of nice looking Java developers:

SONY DSC

This was a rather long drive mainly in the winding roads in the mountains. Actually there was a part of a highway driving where I learned a new for me style of driving, which I called “Speeding on the shoulder”. The highway had one (or rather one-is) lane in each direction. But slower moving vehicles (Why have I rented that small and weak Fiat?) are supposed to move to the right to let the real drivers drive fast. So for the most part of the highway leg I’ve been driving at the speed from 60 to 90 km per hour on the shoulder. In the USA I’d get a substantial fine and four points on my driver’s license for this. Oh those Greeks!

FInally, I want to give credit to a nice iOS application called CityMaps2Go recommended me by one of the readers of my blog (thank you, Alex!). It’s an offline map app. I’ve downloaded the map of Crete in advance, and while I was driving my wife was watching how a little blue marker was moving on the map. You may ask, how is it possible if this was an offline map and I was not connected to the Internet? Smartphone have GPS. Becides, my iPhone had a phone connection, and most likely the position of the device was quickly calculated based on the distance to the closest cell towers (A-GPS).

Till tomorrow!