2017-05-18

GOTO 2014 - REST: I don't Think it Means What You Think it Does - Stefan Tilkov

My notes on GOTO 2014 - REST: I don't Think it Means What You Think it Does - Stefan Tilkov



"People decide they want to build something in a RESTful fashion, so they spend all their time arguing about where the slashes go".

"It is the first litmus test for your REST API whether you depend on specific characters in your URIs for things to work."
(From the client's point of view.)

"Version numbers in URIs just suck.  Everybody does it which doesn't make it any less sucky.  It is a stupid idea.  Don't do that."

"The version number is in the URI because the URI is the API". <-- ? I would assume the URI is NOT the API.

Versioning: "Version your documentation documents. Wait what? --Yes, no versioning".

Postel's law "TCP implementations should follow a general principle of robustness: Be conservative in what you do, be liberal in what you accept from others." http://tools.ietf.org/html/rfc761

    Client rules
Don't depend on URI structure
Support unknown links
Ignore unknown content
    Server rules
Don't break URI structure unnecessarily
Evolve via additional resources
Support older formats

Discovery/Discoverability: "JSON Home" http://tools.ietf.org/html/draft-nottingham-json-home-03

Hypermedia APIs "give you flexibility", "are cool", "are neat" <-- no explanation

"Excellent question, do I know any examples of widely used public APIs that fully follow this model?  No."

GΟΤΟ 2014 - Microservices - Martin Fowler

My notes on GΟΤΟ 2014 - Microservices - Martin Fowler


Characteristics of Microservices

1. Componentization
2. Organized around business capabilities
3. Products not Projects
4. Smart endpoints and dumb pipes
5. Decentralized Governance
6. Decentralized Data Management
7. Infrastructure Automation
8. Design for failure
9. Evolutionary Design

With services we typically use some kind of interprocess communication facilities such as web service calls or messaging or something of that kind.

How big should a microservice be?
    "It should have one responsibility" --too vague
"It should fit in my head" --fairly good

"You should not have a team that you cannot feed with 2 pizzas"

2016-05-15

"Andy" android emulator - Avoid it like the plague.


If you were thinking of installing the "Andy" android emulator on your PC, think again.  Here is my experience with it:

  1. The installable file (Andy_46.2_207_x64bit.exe) is 431 MB, so it took a really long time to download.
  2. It installed VMware without asking me, so the installation took a really long time.
  3. It installed some "Bonjour Service" by Apple, Inc. without asking me.
  4. It replaced all my .apk icons with its own icon without asking me. (I am using apk shell extension and I much prefer it that way.)
  5. During installation, there were 15 attempts to call home by "Andy" and/or by other crapware that it installed.  (I have a firewall, so I didn't let any of that happen.)
  6. At the end of the installation, it popped up a message box saying that the installation failed because it could not detect my internet connection, and that it requires internet access in order to install.
  7. Despite the failed installation message, "Andy" was found under "installed programs" so I uninstalled it.
  8. During uninstallation there were a couple of more attempts to call home.
  9. After uninstallation it left "Bonjour Service" installed, so I had to go find it and uninstall it too.
  10. After uninstallation it left an "Andy" folder on the root of my user folder, which I had to delete.

What a piece of crapware!

2016-05-02

Solved: “something went wrong” trying to create new user account on Windows 10

So, while trying to create a new user account on my Windows 10 computer, I get this:


The solution:

1. Start a command prompt as administrator.

2. Type the following command:
     net user <username> <password> /add

Voila, the user has been created. 

What in fact went wrong is that Microsoft completely broke Windows after Windows 7. 


2016-03-28

Rooting my Samsung Galaxy S2 mobile phone

So, I bought a brand new Samsung Android phone, and it was a huge disappointment due to all the distracting, annoying, and completely useless crapware from Google, Samsung, Vodafone, and even Yahoo, which came pre-loaded with the phone and which I am not allowed to uninstall.  I mean, never mind that a certain application is useless; suppose it is in fact very useful; and yet, suppose that despite it being so awesomely useful, I for some reason still want to uninstall it.  It is my phone, I should be able to do it, right?  But no, the powers that be have decided that I am not allowed to uninstall apps from my own phone. Even when they are not only useless, but actually harmful, since some of them are always running, thus consuming memory, CPU cycles, battery, and communications bandwidth. Some apps can be uninstalled, but many others cannot be uninstalled.  They have to stay on the phone.  Whether I like them or not.

After this horrible experience I am very seriously considering the possibility that next time I buy a phone it will be an iPhone.  But for now, I am stuck with Android, so I am now learning how to root my phone so that I can be somewhat in control of the situation.  I am experimenting with my old phone first, a Samsung Galaxy S2.  Here are my notes.

2016-03-20

Solved: Brightness control keys do not work on Asus Laptop

So, the brightness keys on my Asus Laptop do not work anymore.  All other Fn keys still work, but the Fn+F5 and Fn+F6 keys which control brightness do not work anymore.

The way to solve this problem is as follows:

Initiate an update of the driver of your monitor. This can be accomplished in many ways, for example:

1. Right-click on the desktop
2. Select "Display settings", then
3. Select "Advanced display settings"
4. Select "Display adapter properties"
5. Switch to the "Monitor" tab
6. Click on "Properties" for the monitor
7. Switch to the "Driver" tab
8. Click "Update driver".

Alternatively, you can:

1. Hit Win+Pause to open the "System" window
2. Click "Device Manager"
3. Find your monitor under "Monitors"
4. Right-click on the monitor and select "Update Driver".

Once the "Update Driver Software" dialog is up:
  1. In the wizard which prompts you whether you want to search automatically or browse your computer, lie and say that you want to browse your computer.  (Windows is so messed up that you have to lie to it to coax it to work.)
  2. On the next screen, do not browse anything, select "let me pick from a list of drivers on my computer".
  3. On the next screen, select "Generic PnP Monitor" and click "Next".
  4. You are done.
Source:
http://visihow.com/Restore_Lost_Brightness_Control_app_in_ASUS_Laptops_After_Updating

2015-11-26

On International Company Culture in The Netherlands

This was written on 2021-11-26 but it is retro-dated so as to not appear among my recent posts, and thus avoid embarrassing certain unnamed entities.  It is written in past tense even though a few paragraphs down the page it begins describing my current experience, because in the near future I intend this to become my past experience.

In 2015 I decided to leave Greece and its destroyed economy, and to go live and work elsewhere in Europe. I started an international job search, and within a couple of months I had a few offers to choose from. I picked the one from a company called Topdesk, in the nice little university town of Delft, in The Netherlands, mainly because of tax benefits available to expats in that country, but also, and in no small part, because The Netherlands has the reputation of being one of the most foreigner-friendly countries in Europe. The Netherlands achieves this reputation in a number of ways, one of which is the fact that the Dutch rank number one in the world (1) in English-as-a-foreign language proficiency, making it possible to live in The Netherlands without ever having to learn Dutch.

2015-10-21

The Mother of All Bugs

Summary: This is a story about the most elusive and sinister software bug I ever came across in my decades-long career as a programmer.

The Mother of All Bugs

At some point early in my career I was working for a company that was developing a hand-held computer for the area of Home Health Care. It was called InfoTouch™. The job involved daily interaction with the guys in the hardware department, which was actually quite a joy, despite the incessant "It's a software problem!" -- "No, it's a hardware problem!" arguments, because these arguments were being made by well-meant engineers from both camps, who were all in search of the truth, without egoisms, vested interests, or illusions of infallibility. That is, in true engineering tradition.

During the development of the InfoTouch, for more than a year, possibly two, the device would randomly die for no apparent reason. Sometimes it would die once a day, other times weeks would pass without a problem. On some rare occasions it would die while someone was using it, but more often it would die while sleeping, or while charging. So, the problem seemed to be completely random, and no matter how hard we tried we could not find a sequence of steps that would reproduce it.

2015-10-18

Computer telephony in C++ with MFC

Back in 1999-2000 the state of the art in computer telephony was called Interactive Voice Response (IVR).  Nowadays when we speak of "voice" we usually mean voice recognition, but all that those telephony systems did back then was to playback recorded messages and wait for the caller to press digits on their phone. Sometimes, we would ask the caller to speak on the phone, and we would record their voice, for a human operator to listen to later.

The hardware had special filters on it to recognize the DTMF digits, probably because the CPU was thought of as too wimpy to do it by itself.  I experimented writing WAV-file processing filters on my own, and discovered that it took less than 10% of CPU time per phone line to run such filters in software, so it could certainly be done, but then again there existed systems out there in configurations of 30 or even 100 lines per computer, and of course the CPU was not enough in these cases.  We only worked with configurations of four lines per computer, but still, since the filters were made available by the hardware, I made use of them for the work project, and I only re-invented the wheel at home, for fun.

My employer at that time managed to secure a number of computer telephony contracts for a couple of big clients; he gave me a rough description of what the projects were supposed to do, and he had my coworkers slide pizza under my office door for as long as it took me to complete them.  He probably charged his clients the equivalent of a dozen programmers for this, and it was all done by me.  The only external help that went into these projects was messages recorded by a professional at a recording studio.

What follows is some screenshots of the telephony application that I created to run these projects, in Microsoft Visual C++ using MFC and the Dialogic Telephony API.

All applets waiting to start. Click to enlarge.

Crossword Puzzle Compiler

Techniques demonstrated:

  • Solving an intractable problem using a scoring heuristic
  • Super-indexing data structures for ultra-fast domain-specific queries

Summary (just gimme the TL;DR)


This is old-style artificial intelligence in action, solving within seconds a problem that would normally take eons to complete.

You give it a crossword grid, and a long list of words, and it finds ways to mesh words into the grid so as to form a complete crossword puzzle.  The final working version was done in 2003 using C# version 1.2 with a minimalistic UI in WinForms. 

The following 30-second video shows the crossword compiler in action, filling multiple successive crosswords using a word list taken from actual crosswords that have been published on the interwebz by various sources through the years.  The video is in real time, showing that the crossword compiler is, in most cases, extremely fast.