Thursday, November 29, 2018

Add additional context to SELinux

In this post we quickly look into how we add context for SELinux on our Orthanc binary storage.
$ sudo semanage fcontext -a -t etc_t -s system_u /opt/localdrive/orthancstorage

$ sudo restorecon -R -v /opt/localdrive/orthancstorage

Now we confirm it by the below command:
$ cat /etc/selinux/targeted/contexts/files/file_contexts.local
# This file is auto-generated by libsemanage
# Do not edit directly.

/opt/localdrive/postgres(/.*)?    system_u:object_r:postgresql_db_t:s0
/opt/localdrive/orthancstorage    system_u:object_r:etc_t:s0


Confirm the updates
$ ls -laZ /opt/localdrive/orthancstorage

Wednesday, November 28, 2018

Fixing SELinux Warnings for Postgres after changing the data directory

We moved the postgres data directory from its default location /var/lib/pgsql/data to /opt/localdrive/postgres.

This started to give lots of warnings in the SELinux audit logs. Postgres service was running fine as SELinux was in permissive mode, albeit giving verbose warnings as below.

$ sudo tail -f /var/log/audit/audit.log
type=AVC msg=audit(1543413248.637:5277): avc:  denied  { getattr } for  pid=5285 comm="postgres" path="/opt/localdrive/postgres/base/16386/PG_VERSION" dev="sdb1" ino=1725 scontext=system_u:system_r:postgresql_t:s0 tcontext=unconfined_u:object_r:unlabeled_t:s0 tclass=file
type=SYSCALL msg=audit(1543413248.637:5277): arch=c000003e syscall=5 success=yes exit=0 a0=5 a1=7ffef5d9e1f0 a2=7ffef5d9e1f0 a3=1 items=0 ppid=1314 pid=5285 auid=4294967295 uid=26 gid=26 euid=26 suid=26 fsuid=26 egid=26 sgid=26 fsgid=26 tty=(none) ses=4294967295 comm="postgres" exe="/usr/bin/postgres" subj=system_u:system_r:postgresql_t:s0 key=(null)
type=PROCTITLE msg=audit(1543413248.637:5277): proctitle=706F7374677265733A206175746F76616375756D20776F726B65722070726F63657373202020
type=AVC msg=audit(1543413248.638:5278): avc:  denied  { write } for  pid=5285 comm="postgres" name="12730" dev="sdb1" ino=1263 scontext=system_u:system_r:postgresql_t:s0 tcontext=unconfined_u:object_r:unlabeled_t:s0 tclass=file
type=SYSCALL msg=audit(1543413248.638:5278): arch=c000003e syscall=2 success=yes exit=5 a0=2947210 a1=2 a2=180 a3=50 items=0 ppid=1314 pid=5285 auid=4294967295 uid=26 gid=26 euid=26 suid=26 fsuid=26 egid=26 sgid=26 fsgid=26 tty=(none) ses=4294967295 comm="postgres" exe="/usr/bin/postgres" subj=system_u:system_r:postgresql_t:s0 key=(null)


To fix this, we had to perform a number of steps:

Edit SELinux to point to the current postgres data directory
$ sudo semanage fcontext -a -t postgresql_db_t "/opt/localdrive/postgres(/.*)?"

$ sudo restorecon -R -v /opt/localdrive/postgres


Restart Postgres service
$ sudo service postgresql restart


Now the audit "denied" logs are gone!

Tuesday, October 23, 2018

Installing Standalone Viewer of OHIF


You can install an OHIF Simple Viewer by following the below steps:

1) Install Meteor
$ curl https://install.meteor.com/ | sh


2) Clone the Viewers repository
$ git clone https://github.com/OHIF/Viewers.git

 
3) Go to the SimpleViewer directory
$ cd Viewers/StandaloneViewer/StandaloneViewer/


4) Run the Standalone viewer
$ METEOR_PACKAGE_DIRS="../../Packages" meteor --settings ../../config/dcm4cheeDIMSE.json

Make sure that your JSON file consisting of the URLs of DICOM images (i.e., series instances) is placed inside the directory Viewers/StandaloneViewer/StandaloneViewer/public
as in
Viewers/StandaloneViewer/StandaloneViewer/public/big.json
 
5) Access the viewer from the browser.
You may access it from localhost:3000 followed by the url of a JSON file consisting of Dicom images.
http://localhost:3000/?url=https://raw.githubusercontent.com/OHIF/Viewers/master/StandaloneViewer/StandaloneViewer/private/testData/PTCTStudy.json
or access your local json files consisting of the DICOM instances, as in,
http://localhost:3000/?url=big.json

Wednesday, September 26, 2018

Restaurant Scams in Atlanta

This weekend we had dinner at an Indian restaurant. My bill came as 37$ for the food we consumed for 29$ (11+ 15 + 3). The additional 8$ includes the sales tax and 20% service charge. (We were a group - but asked for individual bills). Since there was already a 20% service charge, I put 0$ on the tip. I clearly also indicated 37$ as the total in the bill (37 + 0.00 = 37).


Initially, my bank showed 37$ as pending. Now it shows 43$ as the completed amount. Mistakenly, or intentionally, the restaurant charged 6$ as the tip. I have a hard time to believe this is an honest mistake, since I also wrote down the total amount as 37$, after putting 0$ under the tip.


Also, a 20% service charge for a lousy service was not something I was planning to do. The food was below average too - and overpriced. Of course, from the menu, it looked 29$ for two, and with sales tax and 20% mandatory service charge, it came to 37$. Add the 20% service charge, why would I pay another 6$ to make a 40% tip in total for this below-average experience? Seriously?!


I have disputed this additional 6$ charge with my bank. The bank said, generally, they charge for the disputes, though they can make it free for me this time since this is my first dispute. However, they recommended to contact the restaurant and resolve this dispute with them.


So I called them. Judging from the voice, the first guy to answer the call was the waiter who served us (the second one). I explained to him my situation. He insisted I visit the restaurant with the bill to get a refund. He pretended that he could not find their copy of the receipt, while I was waiting for him searching through the records. He also verified what I had, where we sat down, and how much each cost, etc. Like security questions. :P I told him "I am busy to come to the restaurant to get the refund." when he repeated as if that is the only way. He said, "come on, you have time to call for 6$, and you tell me you are busy?" sarcastically. His intention was to shame me and make me give up. Now I realized he was the one who intentionally made the 0 to 6$ to get the 6$ for himself. I told him that I have already disputed this with the bank. Then he said, "Ok, give me your name and phone number. We will call you back if we find out what you say is correct". Then he also asked me to spell my name! Come on. :D He was also very unapologetic.


Within a few minutes, they called back. This time it must be a senior or a manager. He was polite and apologetic, and he accepted that it was their mistake. He said, "Your zero gave the one who entered to put a 6" (not sure what he meant. Did he mean the employee was a fraud or was it an honest mistake? It was unclear). He said they would send me a cheque for the 6$.

Update: I received a cheque from the restaurent on the 28th/Friday, 3 days from the 25th/Tuesday since I complained. This issue is resolved!


Anyway, lesson learned. Next time, I would not put 0.00 $ and write the same amount down, if I choose not to tip. I always tip. But not when a 20% service charge is already added to my bill. I would make sure just to cut the section standing for "tip" if I were to give no tip!

Luckily I paid attention. I am not sure how many customers lost their money to this scam.


Summary
1. Keep your receipts safe, especially when the waiter takes your card away from your view, and especially when there is a potential for them to seek a tip from your card.

2. Check your bank accounts online every day, and keep track of the balance, to make sure there are no weird transactions.

3. Report to the bank instantly if you find something weird.

4. Be extra vigilant if you are a tourist. You cannot spend time and money making international calls, and your bank may have limited control over a foreign transaction. Also, if your transaction is in a different currency, it will make the things even more complicated. If I were not living in Atlanta, even if they send me a cheque, I won't be able to receive it anyway - giving me no choice other than to give up.

Monday, September 17, 2018

Configuring Orthanc with Postgres backend with a network data directory

So we hve configured Orthanc with a Postgres backend. To support a large-scale data store, we mapped a network directory as the data directory of Postgres. Then we configured Orthanc to have Postgres as its backend data store, instead of its default SQLite backend, using the Postgres plugin. There is also an option for a MySQL/MariaDB backend, which we found not stable with MySQL in a network directory.

However, since we have the configured Postgres in a network directory, we have to make sure everything is running fine. Unfortunately, when we reboot, often the network directory does not mount on its own. Therefore, despite our configuration to start Postgres and Orthanc at the boot time, they both fail.

Data directory unaccessible → Postgres fails to start. Postgres failed to start → Orthanc fails to start.

We have to configure the below services in Centos, following the same order.

1) Postgresql
$ sudo systemctl start postgresql

$ sudo systemctl enable postgresql

$ sudo systemctl status postgresql

● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2018-09-17 14:46:41 EDT; 11min ago
 Main PID: 2655 (postgres)
   CGroup: /system.slice/postgresql.service
           ├─2655 /usr/bin/postgres -D /opt/pacs/postgres -p 5432
           ├─2657 postgres: logger process
           ├─2701 postgres: checkpointer process
           ├─2702 postgres: writer process
           ├─2703 postgres: wal writer process
           ├─2704 postgres: autovacuum launcher process
           ├─2705 postgres: stats collector process
           ├─2754 postgres: postgres orthanc ::1(48534) idle
           └─2755 postgres: postgres orthanc ::1(48536) idle

Sep 17 14:45:59 HOST.NAME systemd[1]: Starting PostgreSQL database server...
Sep 17 14:45:59 HOST.NAME pg_ctl[2652]: pg_ctl: another server might be running; trying to start server anyway
Sep 17 14:46:41 HOST.NAME systemd[1]: Started PostgreSQL database server.


2) Orthanc
$ sudo systemctl start orthanc

$ sudo systemctl enable orthanc

$ sudo systemctl status orthanc

● orthanc.service - Orthanc DICOM server
   Loaded: loaded (/usr/lib/systemd/system/orthanc.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2018-09-17 14:47:14 EDT; 8min ago
     Docs: man:Orthanc(1)
           http://www.orthanc-server.com/
 Main PID: 2753 (Orthanc)
   CGroup: /system.slice/orthanc.service
           └─2753 /usr/sbin/Orthanc /etc/orthanc/orthanc.json

Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.399045 ServerContext.cpp:167] Reloading the jobs from the last execution of Orthanc
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.399776 JobsEngine.cpp:281] The jobs engine has started with 2 threads
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.400023 ServerContext.cpp:293] Disk compression is disabled
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.400050 ServerIndex.cpp:1437] No limit on the number of stored patients
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.400490 ServerIndex.cpp:1454] No limit on the size of the storage area
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.400995 LuaContext.cpp:103] Lua says: Lua toolbox installed
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.403966 main.cpp:848] DICOM server listening with AET BMIPACS on port: 4242
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.404382 MongooseServer.cpp:1087] HTTP compression is enabled
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.405872 MongooseServer.cpp:1001] HTTP server listening on port: 8042 (HTTPS encryption is disabled, remote access is allowed)
Sep 17 14:47:15 HOST.NAME Orthanc[2753]: W0917 14:47:15.405915 main.cpp:667] Orthanc has started






To clean the data from Orthanc entirely

 

The easy way is to drop the Orthanc database.

First connect to the postgres client:
$ psql -U postgres
Password for user postgres:
psql (9.2.24)
Type "help" for help.


postgres-# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 dcm4chee  | dcm4chee | UTF8     | en_US.utf8 | en_US.utf8 |
 mytest    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 orthanc   | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 testtest  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
(7 rows)

Then go to another database to be able to drop the Orthanc database
orthanc=# \c mytest
You are now connected to database "mytest" as user "postgres".

mytest=# drop database orthanc;
ERROR:  database "orthanc" is being accessed by other users
DETAIL:  There are 2 other sessions using the database.

Yes, first we need to stop Orthanc!

[root@researchpacs postgres]# systemctl stop orthanc

Now drop the database. 
mytest=# drop database orthanc;
DROP DATABASE
mytest=#

Create the database again.

mytest=# create database orthanc;
CREATE DATABASE

Now you may start Orthanc again!

[root@researchpacs postgres]# systemctl start orthanc



You can also access your data via a browser, using the HTTP Port:

http://HOST.NAME:8042/app/explorer.html

Tuesday, September 11, 2018

Configuring Kong API Gateway for your Service Endpoints

Kong provides a complete documentation on its installation and a quick-start guide to start using it, such as configuring a service in Kong

In this post we will briefly look into configuring Kong using its Docker container as an API gateway for your backend services. This document uses Kong version 0.14.0-alpine, which is the current latest version of Kong. Kong can be configured with Postgres or Cassandra backend for its persistent storage. Here we will configure Kong with Postgres.

Install and Start Kong with Postgres

You have 2 options. If you want to get it done quick, I recommend choosing the option #2 - installing via Docker containers.

1. Download Kong's native installation for your operating system

Download and install Kong for your respective operating system 

Configure with Postgres:
$ psql -U postgres
postgres=# CREATE USER kong; CREATE DATABASE kong OWNER kong;


Run the Kong migrations:
$ kong migrations up

Start Kong
$ kong start

You may choose to start with verbose logs:
$ kong start -vv

You may need to create a kong configuration file to load Kong with custom configurations:
$ sudo mkdir /etc/kong

$ sudo touch /etc/kong/kong.conf

Now your Kong is running. Confirm that by,

 

2.  Install Kong via Docker containers.

We have our own "kong-ldap" repository with scripts that will install and configure Kong with Postgres in a container. 

$ cd kong-ldap

$ sh buildRun.sh

Optionally, you may also use these scripts to configure OpenDJ LDAP directory as a Docker container a well, connected to Docker. However, the commands are commented out - therefore you will need to uncomment the relevant commands in the script buildRun script to get it working.

Kong has two interfaces. One is the user-facing interface and the other one is the admin interface. The admin interface by default listens to the port 8001 and should not be exposed to the public. The admin interface is used by the administrators to create and configure the routes to the services in the Kong API gateway. The user-facing interface by default listens to the port 8000. It is exposed to the public, and the users can consume the services defined by the admin previously using the user-facing interface. The user-facing interface is completely separated by Kong from the admin interface.

Configure Kong for your Services

Configuring Kong as an API gateway for your services is a 2-step procedure, starting from Kong 0.14. Previous versions of Kong provided a unified approach through its "api" objects, which is current depreciated and replaced by two entities known as "services" and "routes".

Make sure that you have Kong up and running. Then,  execute the below two commands from the server that hosts Kong.

First, you need to define a "service" in Kong to each of your service/API groups (i.e., your backend applications or web services).


1) Create a Kong Service using the Kong Admin API

$ curl -i -X POST --url http://localhost:8001/services/ --data 'name=radiology' --data 'url=http://172.20.11.223:9099/services/v4/TCIA/query/'

Above, we assume your web application is hosted in http://172.20.11.223:9099/  and it has a set of services under the base path /services/v4/TCIA/query/. We pass the complete url of the backend of the original service deployments through the "url" flag, as shown above. We create a service named "radiology" in Kong for these services, using the Kong admin interface for the creation of services. Here, we assume Kong is hosted in localhost, with its admin interface using the default port option of 8001. /services/ let you create/modify the service definitions in Kong.


Second, you should add a "route" to the "radiology" service that you created.

2) Add a Route to the Kong Service

$ curl -i -X POST --url http://localhost:8001/services/radiology/routes --data 'paths=/radiology'

 As shown above, we use the KONG-ADMIN-INTERFACE/services/SERVICE-NAME/routes to configure the routes to the service that we defined above. Here the SERVICE-NAME is "radiology" as we defined above in the previous step. The "paths" flag indicate the paths that Kong should match to the service that we defined in the previous step.


Accessing your services via Kong

Now, you may access your services via Kong
http://172.20.11.222:8000/radiology/getImage
the same way you access it directly
http://172.20.11.223:9099/services/v4/TCIA/query/getImage

Here, we assume that you have deployed Kong in a server with a public address http://172.20.11.222 and your services are in http://172.20.11.223.

You may of course do additional tasks such as rate limiting, request/response transformations, logging, and analytics with the Kong API Gateway. You may refer to the Kong documentation on pointers to achieving this.

Friday, August 24, 2018

Export Confluence HTML to Github Wiki

Confluence allows its HTML pages to be exported in a single zip. There is a Confluence-to-Github-Markdown tool that allows automatic export of these HTML files to markdown .md files with a single command from the core directory:
$ confluence-to-github-markdown

Now you can create separate pages in the GitHub wiki with these md files. However, there are a certain limitations that need to be manually handled to complete the process.

1. Image. GitHub wiki does not support uploading images. Images are posted via URLs in the wiki. Therefore, currently we need to upload the images to a public location and access the URL from there.

2. Metadata. The tool also converts metadata (which is actually good I think) to md. We need to manually remove them wherever unnecessary instead of showing them as plain text in the GitHub wiki.

3. The converter tool creates the name of the md file from the html title. If you have ' or any special characters in the title of your html, it will fail to convert and throw js errors. To fix, change the title header from something such as "Rakshak’s RESTful API" to "Rakshak RESTful API" before executing the converter tool.

4. Internal links (links to named anchors in the markdown) are not handled by the converter.  The anchors must be manually added.

5. Links to other pages in the confluence wiki are preserved as it is, rather than having them as a relative link. Therefore they need to be replaced by the respective new link in the markdown wiki.

6. Video embedding is not supported in Markdown. Therefore, the converter tool simply ignores any video files embedded in the HTML. To fix this, in the final wiki pages, manually add the videos as a simple HTML links as in, [screencast](https://www.youtube.com/embed/S8juo0Dx68I).

Friday, August 17, 2018

Installing Gravitee API Gateway

Gravitee running

Configuring and Starting Gravitee API Managemant Gateway

First install and start the dependencies:

1) Mongo
$ mongod

2) Elastic search
$ cd elasticsearch-6.3.2/bin/
$ ./elasticsearch




Starting Gravitee API Managemant Gateway
Download and extract the project zips of graviteeio.

First, Start the API Gateway
$ cd graviteeio-full-1.18.1/graviteeio-gateway-1.18.1/bin
$ ./graviteeio

Now accessing http://localhost:8082/ should give you the message:
No context-path matches the request URI.


Configure graviteeio-gateway-1.18.1/config/gravitee.yml
By default, the gravitee data is stored in the mongo database gravitee.
You can change these default configurations.


Then, start the Managemant API.
$ cd graviteeio-full-1.18.1/graviteeio-management-api-1.18.1/bin
$ ./gravitee

Now you can access http://localhost:8083/management/apis/ which should give an empty response [ ].

By now, the gravitee database in MongoDB should have the below collections:
events, ratelimit - for the API gateway
audits, metadata, roles, views - for the Management API

More configuration details such as using an LDAP provider and configuring OAuth2 Authentication can be found from the official documentation.


Next, start the Portal.
$ cd graviteeio-full-1.18.1/graviteeio-management-ui-1.18.1

You have the choice of starting the Portal with Python3 or Node.

Let's go with Python3.
$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Now you can access the portal from http://localhost:8000/#!/


You may further configure the portal to fit your requirements.


Configuring and Starting Gravitee Access Managemant

First, start the gateway
$ cd gravitee-am-gateway-standalone-2.0.4/bin/
$ ./gravitee

Now you should get an empty response to http://localhost:8092/
Now, run the AM Managemant API.

$ cd gravitee-am-management-api-standalone-2.0.4/bin/
$ ./gravitee

Now, accessing http://localhost:8093/management/domains/ should give you an empty response.


Finally, let's start the last component of our ecosystem.
The AM Managemant UI, which is a client-side Angular application.

The directory of the Managemant UI is at,
$ cd gravitee-am-webui-2.0.4/

You will need an HTTP server such as Apache or Nginx. Then you may configure the Management UI following the documentation.

Wednesday, August 1, 2018

The Atlanta Algorithm

As with many other cities in the US, Atlanta has a public transportation network (known as MARTA), which is a joke. In fact, the metro is ok. But my issue is with the buses. Unfortunately, most of Atlanta is not also walkable. Lack of proper sidewalks in the residential neighborhoods. Life in Europe has taught us that it is not necessary to drive, and it is ok to use the public transport. :D Given this state, we choose to live close to my university. 20 minutes by walk.

There is also a bus stop close to both my apartment and my lab. A bus (#6) passes by every 30 minutes, connecting my home to my lab in the university. I usually walk to my lab, and return, by foot. But since I have a free monthly public transportation pass from the university, I decided to use it.


"MARTA On the Go" a mobile app offers a real-time schedule of the bus, unlike Google maps which shows a static schedule. Today I checked the bus time just before leaving home. The bus was on its way. It said "6 minutes late" with the current location. MARTA On the Go does not show the estimated arrival time at each stop with this dynamic information. Rather, it shows the current location of the bus (that means, you should have an idea of the road map, or you need to use it in conjunction with another application such as Google maps) and the current delay. While this app does not solve the inefficiency of the public transport, it certainly mitigates the uncertainty and help plan the timing better.

Before leaving home, I check the app to confirm the arrival time of the bus. However, the timing is not accurate. The bus usually comes with a time interval [-3:5], that means 3 minutes earlier to 5 minutes later. But now for the third time in a row, the bus came 10 minutes late. To ensure I do not miss the bus, I always arrive 3 - 4 minutes earlier. Therefore, I leave home 7 minutes earlier than the bus' arrival time at the bus stop (since I need to walk a bit to reach the bus stop).

Sometimes a bus appears without showing in the app. Sometimes the bus shows in the app in the opposite direction. Sometimes a bus shows up in the app, but it is in fact out of order. So the app is useful. But not complete.

Every city's public transportation system teaches me some new life lesson. I learned something in Jeju. Now in Atlanta. I like these life lessons - I do not underestimate them. Trust yourself, instead of trusting an unreliable external entity!

Monday, June 18, 2018

My "CAT"/ Ph.D. Proposal

Today I presented my CAT, " Software-Defined Systems for Network-Aware Service Composition and Workflow Placement". I should have presented the CAT much earlier. However, it was delayed, and now I have presented it just a few months before my final defense. I received a grade of 18/20 for the CAT. The presentation slides are attached below.



Tuesday, May 15, 2018

Moving Bits with a Fleet of Shared Virtual Routers

Today I presented my paper titled "Moving Bits with a Fleet of Shared Virtual Routers" at IFIP Networking 2018 in Zurich. The presentation was very interactive. This was my work from KAUST. It is nice to be back in Zurich.


Abstract: The steady decline of IP transit prices in the past two decades has helped fuel the growth of traffic demands in the Internet ecosystem. Despite the declining unit pricing, bandwidth costs remain significant due to ever-increasing scale and reach of the Internet, combined with the price disparity between the Internet's core hubs versus remote regions. In the meantime, cloud providers have been auctioning underutilized computing resources in their marketplace as spot instances for a much lower price, compared to their on-demand instances. This state of affairs has led the networking community to devote extensive efforts to cloud-assisted networks --- the idea of offloading network functionality to cloud platforms, ultimately leading to more flexible and highly composable network service chains.

We initiate a critical discussion on the economic and technological aspects of leveraging cloud-assisted networks for Internet-scale interconnections and data transfers. Namely, we investigate the prospect of constructing a large-scale virtualized network provider that does not own any fixed or dedicated resources and runs atop several spot instances. We construct a cloud-assisted overlay as a virtual network provider, by leveraging third-party cloud spot instances. We identify three use case scenarios where such approach will not only be economically and technologically viable but also provide performance benefits compared to current commercial offerings of connectivity and transit providers.

Tuesday, May 1, 2018

The Conference Survival Guide

SoCPar 2010, Paris
I enjoy attending conferences. I never attended a conference when I did not have something to present. This is usually because of the funding, as it is unlikely for me to get funded to a conference when I am not presenting my work. So far, WWW2011 is the only conference that I attended without having a paper to present. Conferences help me fine tune my research, make new friends and build a network. I still vividly recall my first conference, SoCPaR 2010. I was presenting our paper, and luckily for me, I had 3 of my best friends with me. I was not alone. We all were co-authors of the paper, a team effort during our BSc times. I recall presenting the paper confidently and discussing with other researchers. Prof. Ajith Abraham of MIRLABS, who was organizing the conference remarked that he remembered us, a 4-member team arriving in Paris all the way from Sri Lanka to present our paper. It was a nice experience to travel to Paris, my first overseas trip. It was a cold winter, full of snow. The conference was held in Université de Cergy-Pontoise. I met two researchers from the same university in latter conferences, bringing back memories from 2010. 

Be prepared for the delayed luggage
Interestingly, the second conference I presented my paper was again in Paris in 2014. This time, it was MASCOTS, and this was the first paper of my MSc, and also the first paper as the first author. The other conference as part of my MSc research was UCC'14 in London. I met my friend there after a long time, and we had some good chat!

I love visiting different countries and various cities. Attending conferences also offers this opportunity. Moreover, the conferences immediately give you some partners to travel with. You meet some random researchers and make friends with them - because of the shared research interest (or purely because you are from the same university, country, or have something in common other than the research interest). For the rest of the conference, you can explore the city with them.

I try my best to attend all the sessions at the conferences. However, sometimes it is inevitable that I miss one session. Especially the earliest one on the day following my presentation. This is because sometimes I feel tired after the long presentation and its preparations and oversleep the following day. I also enjoy the coffee breaks, lunch times, and the gala dinner. The ideal time to make friends. You are lucky if your presentation comes on the first day. You can relax and enjoy the remaining talks/sessions without having to check your presentation once in a while.

I have attended several conferences during my Ph.D. As a result, I have traveled to several cities: Tempe, AZ, USA (IC2E'15); Berlin, Germany (IC2E'16); San Francisco, CA, USA (AMIA'16 and ICWS'16); Rhodes, Greece (CoopIS'16); Valencia, Spain (SDS'17); Munich, Germany (VLDB'17); Barcelona, Spain (SDS'18); and Zurich, Switzerland (Networking'18). Sometimes, I have one or two additional days following a conference. I use these days to travel to a near-by country or a city. Conferences always leave me with good memories - no exceptions so far. They give me more knowledge, and also other experiences with travels. I thank all the conference organizers and volunteers who make sure that we all have good experience attending the conference.

Saturday, April 28, 2018

The Road to Monaco

The Monte Carlo Casino
Finally, I visited Monaco! It was very similar to my trip to Andorra in 2015. When I visited Barcelona for an EMJD-DC Spring Event, I had an extra day. So I took a bus to Andorra and spent a whole day there before returning to Andorra. This time I had a free day after the conference. I also found a cheap return flight ticket (50 Euro Vueling) to Nice from Barcelona. From the Nice airport, you can get a bus (no 110) to Monaco. Purchase the tickets at the ticket office as the bus driver does not sell the tickets.  A return trip to Monaco costs 33 Euro. One way costs 22 Euro. So I purchased a return ticket.


Once you have your bus ticket, proceed to catch the bus at the bus terminal #3 right outside the airport. The bus is hourly. There is also a bus that goes to Menton with the same number (no 110). At least during our trip, two buses left at the same time, ours with the destination to Monaco, and the other to Menton (a city in French Riviera that comes right after Monaco). Make sure to get on the right bus. The bus drivers speak good English, and you will be fine.

Monaco is the smallest UN member nation since Vatican is not a UN member state. Before the journey started, the bus driver proceeded to ask from each of us where are we going. By doing so, he made sure that no one missed their bus stop. That is a pretty smart thing to do. I got down at the Monte Carlo casino with many others. The bus goes until the Monte Carlo beach. There was a tourist information desk in a short walking distance from the bus stop. There was a hop-on-hop-off bus. However, I did not take that and proceeded to walk across the entire country. Thanks to its small size, I managed to create a record of my own to have walked across a country for the first time! :D I discourage anyone from taking the hop-on-hop-off bus. It goes in parallel with the coastal line and does not even go to the Jardim Exotica (7 Euro entry fee). I easily walked to more places than what the bus covers. Also, why waste money on something useless? Monaco (combined with its towns such as Monte Carlo and Monaco Ville is entirely walkable). It also has a complete transport network of buses consisting of public buses.
Monaco is a rich country. A small 19 sq meter studio apartment costs 2,500 Euro per month as rent, excluding the utilities, as I found from an apartment agent advertisement in Monte Carlo. I paid 500 Euro for a studio of the same size inclusive of all the costs in Lisboa. I know people earn in Monaco much more than in Portugal, while not having to pay taxes. I had a good meal (bread, starters, entry, main dish, and dish), a menu option for 29 Euro (34 Euro including the glass of wine). It was a very crowded simple restaurant. Must be one of those on the cheaper side of the price spectrum as far as Monaco is concerned, I guess. I also found other restaurants that are more expensive.

There were several casinos including the Monte Carlo Casino and Cafe Paris Casino near the bus stop. Several shops selling luxury brands, and there was also a very nicely illuminated shopping mall with many such stores, giving it a golden feeling. As far as I noticed they did not have our cheap shops such as Zara and H&M. There was also a nice park with walking trails and a Japanese garden. I paid a visit to both. I avoided the Jardim Exotica as its entrance is not free. I visited the cathedral. Ok, if you are still reading the blog post, by now you would have identified that Monaco is not just casinos and shopping malls.

I walked across the beach until the end. I was thinking - where to get the bus now?! Luckily I found the bus stop of Monte Carlo Beach easily as I step out of the beach, completing my long walk. So did not have to spend time trying to locate it, or returning to the stop I arrived at. While waiting for the bus, a very old lady (in her 80s) came to me and asked me something in French. I told her that I did not understand. She immediately switched to English and asked me to tell her when the bus number 6 arrives. We immediately proceeded into a long conversation. When I asked her how many languages she can speak, she proudly answered: "oh, many." She happily recalled her life with three passports (born in France, 1 km from the bus stop, and having a husband with a Switzerland mother and a Switzerland passport - and thus having passports from Monaco, France, and Switzerland). Since she lives in Monaco, she has a Monaco passport and does not need to pay taxes. "That's the good thing about this," she claimed.

She also asked about what I am doing in Portugal. When I said I am studying, she proceeded to ask my age, and gave a look with a face, "Dude, that is too old of age to study. Did you fail your school or something?" lol. I tried to explain to her what is a Ph.D. I am pretty confident she knows what that is, given her exposure to the world (She has traveled as far as Hong Kong and her husband worked as a hotelier). But probably due to her difficulties in hearing, she did not quite catch what I said. Before I tried to explain her, the bus number 6 arrived. I stopped the bus for her and told her her bus is here. She thanked and greeted me good luck and proceeded to board the bus. I like nice people. They give you good memories that are hard to forget.

I returned to Nice to catch the last flight to return to Barcelona. I also saw the same two couple (looked like a young couple with the lady's parents) that came with me on the bus from Nice to Monaco. Previously on the bus, we shared a brief smile. The young lady came to me and asked something in Spanish, "blablabla, Moh-nuh-koh?" I understood she was asking something about Monaco. But not sure what is that she is asking about. I smiled and replied, "Sorry, I do not understand." I hate to say that. But unfortunately, I am not great at picking up with natural languages. :( She replied, "Monaco - good?" while giving a thumbs-up gesture. I said, "ah, yes, yes, good." giving back a thumbs-up, and asked her back, "And you? How was it?" She replied, "Yes, good! good!!" with a big smile. We all boarded the flight. I am happy to know that it is not just me doing this crazy travel of a same day return flight to Nice from Barcelona just to go to Monaco and return on the same day. There were 5 of us, including the young and old couple. I am not alone in this world. We are all similar in our uniqueness.

Airport Stories

The beautiful French Riviera (Côte d'Azur)
I am waiting for the flight to return to Lisboa in the Barcelona airport. Yesterday was a crazy day. First time in my life I had a return flight on the same day, from/to Barcelona and Nice. And also a non-stop walk across Monaco, stopping only for lunch. The French Rivera is a beautiful region. I enjoyed the view from the bus as it passes by with the view of mountains covered by clouds and glimpses of the Mediterranean sea with yachts. Barcelona airport does not seem to have free wifi in the airside. At least where I am sitting, has not even a slight trace of public wifi. I write this blog post sitting on the seats on gEdit, saving it to post when I return to the civilization where I have the Internet access.

The Jeju Algorithm

I like to travel with minimal or random plans. Traveling to Jeju was remarkable. But it did give some challenges in unplanned random moves, due to the language barrier. Google maps were showing in Korean. It is easy to read sentences in foreign languages as long as the language is written in a script that you can read (such as a Latin script). But that is not the case with Korean.

The locals in Jeju were amicable and came towards to help us with directions even without we asking. But unfortunately, most of them were able to speak only Korean. Then, there are information screens in every other bus stop. Though they are supposed to work in many languages including Korean, English, and Chinese, the touch screen was not working correctly, and it was nearly impossible to change the language in many of those machines. Buses had the information in English, such as the next stop, and the stop after that.

We had to go to a place in the main street. We know that it is a straight line. But several buses were going on the road along the direction. We decided to get on a random bus. We planned to stay on the bus as long as it goes straight. But unfortunately, at the next stop, it turned to a side road in the right. We got down and returned to the main street, and boarded another bus in the next stop. This bus also turned left after two stops. Finally, we asked a foreigner. He did not know the location that we are talking about. But when I told him that we need to go in a straight line, it is probably number 105 (not the actual number he mentioned. I just forgot what he said at this time. So let's assume that is 105 for the sake of this blog post). He warned us that he is not so sure. Then we were waiting. Another bus came. But not number 105. We decided to continue our Jeju algorithm. Our Jeju algorithm works with limited knowledge and certain assumptions. The path is definitely in a straight line, and there is at least one bus that reaches the destination. There is, of course, no direct bus between our origin and destination. We boarded this bus though it is not number 105. Luckily, the bus indeed took us to the destination. Not bad. We reached the destination by using three buses. Ideally, we should have used only two buses. But as our algorithm is not optimized, we ended up with three buses. :D Our return trip was tuned with the knowledge gained, and we returned merely with just one transit (using two buses).

Though this was not, of course, an optimal experience (we wasted some time and money for the bus fare for each leg of our trip). But it did leave us with some exciting memory to talk about for the years to come. :D

How to time-travel?

Time traveling is an exciting concept that has been portrayed in several fiction, literature, and movies. While I am not sure about its feasibility, at least we can simulate the feeling. :D

Let's try, step by step, to travel back in time.

The first step, pick a time and location that you like to time travel. It should be a location that you have been in the past time. It should have given you strong memories. It does not have to be happy memories. Not all the sad memories are necessarily terrible.

Have you decided a place and a time? I have for myself, chosen a few pairs of locations and years:  2017 in Louvain-la-Neuve, 2016 in Atlanta, 2015 in Rijeka, 2013 in Kista, 1987 until 2012 several parts of Colombo, and 2012 in New Delhi.

Now for this to work without causing confusion to you, you should not have visited the same places in between. Otherwise, the memories collide. :D For example, I haven't visited Rijeka after 2015 and Kista after 2013.

Also not all the places will take you back in time giving a time-traveling atmosphere. I was in Stockholm for the 2nd part of my EMDC MSc program in 2013. But I returned to Portugal for my thesis in 2014. However, it did not feel the same anymore. My friends did not return to Portugal with me. So make sure to bring the same people with you when you plan your time traveling. Might be a good idea to wear the same clothes too, to bring back the exact moment. :P

Next, are you back in your destination [location, time], such as [Rijeka, 2015]? Great. Make sure to go to the same restaurants, beaches, and universities that you frequented. Use the same mode of transport. If possible, eliminate anything new. Like, if you never owned a laptop in 2015, don't bring a laptop with you. :D

Great! Music plays a huge role in our memory. Listen to some songs or watch some music videos of the time. It works best if you did not listen to these songs in between. Otherwise, the original memories you allocated to the song might have faded away.

I have picked the below song, which was always playing in Rijeka wherever I went in 2015. I also did not listen to this song afterward. So it is my song of 2015 summer in Rijeka. :P


It is also important to create memories in the first place, to be able to recall them. Making memories is not easy. We don't remember every minor detail of our daily life. But we do remember when we do something remarkable or different. As a thought experiment, during my recent visit to Barcelona, I had Udon at the nearest restaurent for all 3 dinners. I am sure I will remember this forever. :D

Tuesday, April 24, 2018

Software-Defined Data Services: Interoperable and Network-Aware Big Data Executions

Today I presented my work titled "Software-Defined Data Services: Interoperable and Network-Aware Big Data Executions" at the Fifth International Conference on Software Defined Systems (SDS), in UPC Barcelona. This is my third time in Barcelona. However, this is the first time I am on my own here without my friends, as my previous visits were for the EMDC and EMJD-DC events in 2013 and 2015. This is my 4th time attending an SDS conference consecutively. 

I have attended the SDS'17 (Valencia, Spain), SDS'16 (Berlin, Germany), and SDS'15 (Tempe, AZ, USA) before. I have only missed the first installment of SDS (SDS'14), as I was doing my MSc those days, and my topic was not related to SDS. SDS started as a workshop co-located with IC2E in 2014, and promoted as a symposium in 2016. It graduated as a conference on its own in 2017.



Abstract: Services that access or process a large volume of data are known as data services. Big data frameworks consist of diverse storage media and heterogeneous data formats. Through their service-based approach, data services offer a standardized execution model to big data frameworks. Software-Defined Networking (SDN) increases the programmability of the network, by unifying the control plane centrally, away from the distributed data plane devices. In this paper, we present Software-Defined Data Services (SDDS), extending the data services with the SDN paradigm. SDDS consists of two aspects. First, it models the big data executions as data services or big services composed of several data services. Then, it orchestrates the services centrally in an interoperable manner, by logically separating the executions from the storage. We present the design of an SDDS orchestration framework for network-aware big data executions in data centers. We then evaluate the performance of SDDS through microbenchmarks on a prototype implementation. By extending SDN beyond data centers, we can deploy SDDS in broader execution environments.


This paper received the Best Paper Award at the SDS 2018!


 

Saturday, March 31, 2018

Is freelancer.com legit or scam?

It is 5.5 years since I reviewed Freelancer.com in my blog post "Is Freelancer.com a scam?". The post remained my most viewed blog post with 200+ comments for quite a long time. Most of the comments are from the users who agree that Freelancer.com is indeed a scam site. I can understand that they found my blog post by doing a quick Google search on "Freelancer.com scam." However, what is more interesting, some readers actually defended Freelancer.com. Interestingly, some of them did not really look genuine (why would you search and land on a blog post discussing whether freelancer.com is a scam unless you were searching for it?) But that it is just a guess. I also noticed canned comments from Freelancer.com employees (most likely bots), suggesting the concerned users to email their support team.

There have been alternatives popping up every once in a while. For example, the HubStaff. However, I am not really comfortable with recommending any of these. As in the past, the ones that many of us suggested as better alternatives to Freelancer.com were later acquired by Freelancer.com anyway. So the new ones can come to the same fate, or they themselves can turn into large evil corporations.

Apart from the issues of landing with a scam employer or a scam employee, Freelancer.com itself is a heavily unethical platform. By searching around the Internet (for example, read Freelancer.com is destroying my life), or reading the tens of comments in my previous blog post on Freelancer.com, you can get a taste of it. Most of the blame on the platform comes from its unethical way of charging. One particular case even I encountered was, the employee is charged the Freelancer.com 10% fees (which can be as high as 100$, if the project is 1000$) even if the employer turns out to be just a scammer. Since the employee did not get any benefit of the platform, any ethical organization would just refund the money. Other obvious issues are lower transaction rates, even lower than your banks, and the painfully long time they take to transfer your money! Transferwise does it at least 10 times faster! That is one ethical company. Freelancer.com on the other hand, an unethical bullying company. The most inhumane characteristics of Freelancer.com is when they randomly choose to block your account and ask for random verifications (as reported by commenters, sometimes driver's licenses are not accepted despite being listed as an accepted form of verification in the Freelancer.com itself).

If you must use sites such as Freelancer.com, try to work from a cheaper third-world country such as Bangladesh or Thailand. Not from Liechtenstein. Because you are not going to get paid higher just because you live in a more expensive or more developed country. 

Moreover, you real-world credentials do not really matter in the Internet world. It is hard to verify on the Internet whether you are who you claim to be. So even if you are an expert, you still have to build your online empire from ground-zero. Start this when you do not really need money, as a past-time. Working on Freelancing websites is not going to give you money quick unless you already have an account with justified success. The early days will be plainly painful as you put in work to a negligible payment (since your competitors are from cheaper countries anyway). 

There are of course many success stories. Many were just lucky or from the third-world countries with a competitive advantage on such global platforms. For example, 5$/hour is high in many South or South East Asian countries, while it is very little for most of the western countries. Others had the patience and time to build their profile slowly, till they can reach the 40 - 50$ hourly rate.

My verdict: Find a real job in the real world if possible. Want to be self-employed? Find local employers and build up a brand, so that you can find clients without greedy middlemen such as Freelancer.com. Freelancer.com is not entirely a scam. But it operates in a gray area with shady business practice (non-existing customer service paired with questionable antics to extract more money from the clients/users), acquiring competitors aiming to operate in a near-monopoly.

Tuesday, March 27, 2018

The horror of losing access to your email

Shenzhen Skyline
There are a few free and trialware VPN services (such as Psiphon and LanternPro) that come handy when you travel in countries with censorship. I had a hard time recently with Google locking my account due to suspicious activity (logging in from a random location via VPN). It was not letting me in since I could not remember the answer to my security questions and I did not have my phone working with me as I was traveling. Eventually, I restored the access to my account. However, it was quite a scary experience given how much I rely on my email account.

Inconsistencies at the Airports

Raspberry and Green Tea KitKat from Jeju
Airport security can be confusing. In the US airports, you should remove your shoes and belt, and also take out the laptop and big tablets from your bag, as you pass through the security scanner. Elsewhere, it is not necessary to remove your shoes as long as the shoes do not look bulky or big. In China, I found that removing belt is not necessary. However, in addition to the laptop, you should also take the camera, power bank, and umbrellas out. It is interesting to note these differences though I am not quite sure of the reasoning behind these choices.

Traveling is always fun, though preparing for it and its aftermath are not always fun. Due to deadlines and busy schedules, I usually have to work while on travels too. This time was no exception, with a deadline to submit my paper coming close by. However, it is all good memories.

Saturday, February 24, 2018

Llovizna gets a new look

I have been busy ever since my return from KAUST on the 12th of December. I was often working 60 - 80 hours a week with many deadlines. I had the UCLouvain Confirmation at UNINOVA, Almada (the opposite side of the Tagus river). It was a rewarding experience. Besides, I also had a quick trip to Evora, exactly four years after I visited it for an EMDC Winter Event. Today, I decided to give a new look to my blog, switching from the black background to a brighter one with a larger font. More plans for March. Exciting times ahead.

Below is how my blog Llovizna (formerly known as, 'On my way home.' Renamed to 'Llovizna' on the January 6th, 2010) evolved over time.

'On my way home,' as of April 23, 2009:

As of October 2, 2009:


'Llovizna,' as of February 6, 2011:









As of February 22, 2018:

Friday, February 23, 2018

Twitter bots, trolls, fakes, parodies, and anonymous

Twitter indeed has numerous bots. But not every weird account that you encounter on Twitter is a bot. There is a clear difference among the bots, trolls, and fakes, though often the demarcation is vague.

First, a bot is not necessarily bad, though often bots are deployed with malicious intent, such as distributing propaganda and making viral content out of useless posts. Twitter bots are an economic model, with companies such as Devumi selling them to like, retweet, comment, and share your posts automatically for a price. 
 
I had two bots Llovizna and @on_my_way_home to tweet every time I post something to my blog. I stopped these accounts and their posts in 2016. I could have made these automated posts directly to my main Twitter account Pradeeban. In 2009, I chose to create proxy accounts to tweet my blog posts to keep my Twitter account under my entire control, with no automation.

People often confuse a bot with a fake account and an anonymous account. An anonymous account is usually genuine. It hides the real identity of the user but does not try to create an alter-ego or another personality for the human behind the user. An anonymous account may have 0 to 100% of identification information of the user. On the other hand, a fake account is intended to misrepresent someone. If I create an account with no information at all to post on sensitive topics, that is an anonymous account. On the other hand, if I pretend to be a princess from Sweden in my Twitter profile, that is a fake account. 

Some fake accounts acknowledge they are fake, and often function with a touch of humor, faking the identity of a known person, such as politicians, leaders, and actors. They are parodies, as long as they acknowledge this in their profile, so as not to mislead an unsuspecting follower.

A bot account is still a complete account. By logging into the account, a human still can post tweets as in a regular account. However, usually interacting with a bot account is fruitless.

Trolls can be a regular account, though more often than not they are fakes, parodies, or anonymous accounts, as the repercussions of being a troll are imminent in the current sensitive world. It is often advised not to involve the trolls, as the more you interact with someone over the Twitter in their timeline, more visibility they get.

I have seen arguments on Twitter, where a verified user or a user with several followers discrediting the other party by their number of followers. "She got only 50 followers. She must be a bot" or "He got only 30 followers. He must be fake". These arguments are flawed for several reasons. First, if someone is making an intelligent communication, it is (still) not possible to be a bot. Second, you cannot judge a person fake by their number of followers. The person can just be someone who is busy with their real life than harvesting Twitter followers in a shady practice followed by many popular and verified accounts (more on this in my previous post, Twitter is inherently flawed and unfair - and "Influencers" are ruining it).

I also noticed that those who use the "number of followers" as a measure to judge the validity of someone's tweets are the ones that pay for fake/bot followers, or use the shady practice of "follow and unfollow after a follow back" used by accounts such as and

Twitter bots are not necessarily bad. They do some specific useful tasks, such as creating news syndicates and reporting weather alerts. Therefore, disabling the potential for bots is not a good idea. However, it may be a good middle ground if Twitter makes it mandatory for the bot creators to explicitly identify and acknowledge them as bots and offer to identify information to the creator. Such restrictions are already in place for parody accounts - you must self-identify your account as a parody if you are impersonating someone (usually a famous person). Otherwise, your account may be terminated by Twitter. We need similar measures to bots to ensure ethical use of bots.

Fake accounts can be entirely fictitious or imitate a real living person to some degree such as using someone else's identity or photo. Fake accounts are often harmful and are malicious in intent (for example, consider someone faking as a minor/child, or someone faking as a racial or sexual minority to make a political statement). They need to be controlled too. Twitter needs to improve a lot. Their workflow is flawed. Their verification program is broken and harmful. I still appreciate the simplicity of Twitter, despite its shortcomings. It is always an excellent platform to share your thoughts publicly, even if no one is listening.

Tuesday, February 20, 2018

My experience with flight reservation sites

Flight price comparison with Skyscanner
Let me summarize my experience with various flight companies based on my 6 years of travels. Always compare your flight prices with Skyscanner, and book by following the link. Skyscanner does not charge any fees for its service, nor it places cookies on behalf of the travel agent sites.

1. TravelGenio / Travel2Be - Managed by the same team. The worst of all. Read my post on my experience with them - Is TravelGenio a Scam?
Score: 0/5

 2. Tripsta
They are the best of all that I tried.  They do not randomly increase the price or seek additional charges.

However, like all the other travel agents, they also apply a price differentiation. As I prefer my flight details to be in English and in Euro, I had a habit of using their Ireland website, tripsta.ie. However, for the same flight, it costs 507 Euro in tripsta.pt and 541 Euro in tripsta.ie. Next time, I will stick with tripsta.pt, though I need to stick to the Portuguese language, as I cannot change the language to English while in Portuguese site. Only Portuguese language is available in tripsta.pt. I can, of course, use Chrome to auto-translate, just to be safe.
Score: 5/5

3. GotoGate
They are fine. However, I did not like the site as much as I liked Tripsta - which was simple and plain.
Score: 4/5

4. MyTrip
Haven't tried yet.
Score: ?/5

5. eDreams
Used them a few times, as they were the first to offer an easy payment with PayPal with 0 additional fees. The situation has changed now. They once sent a notice mentioning "Your card has been declined" when I actually paid using PayPal and when the payment was indeed successful. I had to call them and clarify. It was a smooth process, and the email was a mistake. They fixed it and sent another confirmation email promptly as I asked them over the phone - just to be safe.
Score: 4/5

6. Rumbo
Haven't tried yet.
Score: ?/5

7. BudgetAir
Offered 15 Euro discount, if you pay additional 8 Euro during a previous flight. I did not prompt for this, as I was not sure whether I will use them again. However, overall pleasant experience booking with them. No additional charge and no random fees. Also offers cheapest for many flights.
Score: 5/5

8. TopAtlantico
A local Portuguese option. Has many branches everywhere in Lisboa.
Haven't tried yet. 
Score: ?/5

9. Abreu
A local Portuguese option. Has many branches everywhere in Portugal. Price is a bit high. However, it gives you the sense of security if you must buy from an agent. Recommend if you live in Portugal. You can visit them to buy the ticket.
Score: 5/5

10. Geostar
Another Portuguese option. Too expensive. 
Score: 2/5.

11. Kiwi.com
Too expensive. Is this a joke?
Score: 1/5.

12. Your local travel agent
For the same flight, we paid 560 Euro from our travel agent (original price: 565 Euro; with discount - 560 Euro). 8 Euro more than Abreu. However, local travel agents are experienced to find you the best options from/to their base country - after all, this is their expertise.
Score: 3/5

13. Direct booking from TAP
Offers easy payment options as long as you have a Portuguese bank account - through ATM or online banking. Unless the flight is a TAP flight, the price will be very high. Even for the TAP flight, this may not be the cheapest option. However, you can pay within 24 hours. This gives you an additional safety net. Also, TAP flights are the best, inside Europe, to travel to/from Portugal.
Score: 5/5

14. Direct booking from Wizz 
The website was terribly slow. Takes ages! When I complained, they suggested me to book through their mobile application. They have friendly folks on their social media though. Wizz gives you the lowest prices and discounts to exotic locations in East Europe when you book directly. Their membership program is worth purchasing too.
Score: 5/5

My final verdict, based on my experience with flights across Europe, Asia, and the USA is given below. Good luck with your travels!



VERDICT:
Tripsta: GOOD 5/5
BudgetAir: GOOD 5/5
Abreu: GOOD 5/5
TAP: GOOD 5/5
WIZZ: GOOD 5/5
Gotogate: FAIR 4/5
eDreams: FAIR 4/5
Local Agent: NOT BAD 3/5
Geostar: BAD 2/5
Kiwi.com: BAD 1/5
TravelGenio/Travel2Be: BAD 0/5

Is TravelGenio a Scam?

It is always a good idea to compare the flight prices across multiple travel agent sites before actually buying them. Skyscanner is a web site that lets you compare the flight prices across multiple sites such as TravelGenio, Tripsta, and eDreams.

TravelGenio, has always been the poortest performer across many of the flight booking sites that I tried. However, I keep falling for them again and again as they list the lowest price. But, TravelGenio is the best in their bait-and-switch pricing strategy. For example, a price may be listed as 506 Euro. But when you are about to pay, it will increase by 10 Euro for many of the popular cards. As of today, only Visa Credit and Maestro cards offer the promised price. Others have an increase of 10 Euro for the flight of 506 (thus making the price 516 Euro).

However, I had even worse experiences with them.

I share my 2 bad experiences below:


First bad experience:

After booking the flight and everything was finalized and confirmed (they even had the payment finalized from my debit card), Travelgenio sent me the below email from the address infort@corp.travelgenio.com.

Caro Cliente,
Tal como lhe informamos no processo de compra, a reserva que tentou realizar não pôde ser confirmada pela linha aérea.
Como alternativa, realizámos uma reserva com a melhor tarifa disponível e com vôos semelhantes.
A nova reserva que realizámos possui localizador 4KB5FY e está garantida durante o dia de hoje.
Necessitamos, por favor, que nos confirme se deseja adquirir ou não esta nova reserva, caso contrário, procederemos à sua anulação sem qualquer tipo de gasto.
Envio-lhe em outro e-mail o itinerário detalhado da reserva para que possa verificar se os vôos são do seu interesse.
Ficaremos aguardando as suas instruções.
A tarifa mais económica que lhe podemos oferecer é 60.00 Euros superior ao importe que reservou inicialmente
Muito obrigado.

[Goolge Translation:
Dear Customer,
As we inform you in the buying process, the reservation who tried to perform could not be confirmed by the airline.
Alternatively, we made a reservation with the best available rate and with similar flights.
The new reserve that has held locator 4KB5FY and is guaranteed during the day.
We need, please let us confirm whether to purchase or not this new reservation, otherwise, proceed to its cancellation without any expense.
I send you another e-mail the detailed itinerary of booking so you can check if the flights are of interest.
We'll be waiting for your instructions.
The lowest fare we can offer is 60.00 euros to import higher than initially reserved
Thank you very much.
]


I replied:
Hi,
When I initially checked, the price indicated 752 Euro for 2 passengers. Then when I was about to pay, the price increased to 806,70 Euro, and I still paid and reserved the tickets. So that already is an increase of around 54 Euro.

Are you telling me that you are going to charge me an additional 60 Euro, making it 866 Euro, or are you telling me that you are going to charge 120 Euro more (60 Euro per person), and make it 926 Euro?
This is so frustrating. Please let me know and clarify how much is the current price, and how much, in addition to the 806 Euro that was reserved I should pay, so that I can confirm. Also let me know, how long will it take you to refund the amount, if I decide to cancel the booking.
Is there is a way I can create a bug report or feedback for this weird behaviour of the system?

I have used Travelgenio before, and it never had similar issues. It seems probably some management or other policy changes leading to this behaviour. I would stop using Travelgenio and instruct my friends and colleagues to do so (through social media, and travel reviews, etc), if this issue is not smoothly resolved.
Also, is this a real email, or a scammer impersonating Travelgenio? The email looks so unprofessional and extremely weird.

Regards,
Pradeeban.


Their reply:
Dear Customer,
 
Thank you for contacting Travelgenio.
 
In reference to your e-mail we inform you that the total amount is eur 864.74.
Please let us know on how to proced with the booking.
 
Yours sincerely,



I replied:
Ok, you may proceed with this for the total amount of 864.74 Euro. Please finalize this soon. Please do not keep randomly increasing the price further.
Also send a finalized invoice and confirmation to my email account once this is done and completed.
I do not want to mess up with my travel due to the mishaps in your system and policies.

Regards,
Pradeeban.


I was angry. So I replied once more:
I booked using Travelgenio, because it indicated 752 Euro. Otherwise, I would have used Travel2Be which showed a bit higher price (around 800 Euro, if I remember correct). Now finally I have to pay 864.70 Euro due to the inefficiency in Travelgenio. I wish your system was more effective. Also I noticed that the flight slots are quickly filling up. So I want to finalize this sooner. I do not want you to further increase the price or change the flight schedules.

I will be happy with your customer service, if you still could go ahead with 806,70 Euro, the amount I paid for, during the registration. If customer satisfaction is nothing for you, and if you still think it is not possible, you may go ahead with the 864.74 Euro as I indicated in the previous email.

I am writing up a blog post based on this experience. The ending and the verdict of that review blog post depends on how this issue is resolved.

Thank you.
Regards,
Pradeeban.


Eventually, I checked the prices online and with the local travel agent, and it turned out the prices went up during this delay, even in the other web sites. So I decided to pay TravelGenio the additional amount they asked, despite feeling betrayed.


During this conversation, I was not aware that Travel2Be actually has a partnership with TravelGenio, and they are probably owned by a single company. I later learned that from the TravelGenio web site itself, and from the signature of the emails I received:


Dear Customer,

Regarding the invoice for this booking, we have forward the information given to the corresponding department and as fast as possible you will receive the corresponding invoice.

We remain at your full disposition should you have any questions or need any further information.

Thank you and kind regards,


TRAVELGENIO/TRAVEL2BE

--
Giuditta
User Satisfaction Agent
Travelgenio.com



Second bad experience: 


Interestingly, I did not really remember the first experience when I booked another flight after some time. I just went for the cheapest option.
I paid for TravelGenio once more for another flight. Only after paying, I realized something not right. I immediately sent them this email:


When I was booking, it showed 154.01$. Suddenly the total appeared as 157.01$ with no explanation. Pls see the screenshot.
I expect an explanation how the 3$ is added to the final value magically.
Regards,
Pradeeban.
3$ magically added to the price.



Their reply:

Dear Pradeeban Kathiravelu,
Thank you for contacting our Advanced Support Department and sharing your comments with us. The feedback of our customers helps us to improve our products every day as well as the customer care provided.
We are writing to you regarding your booking T6T7FI.
In reference to your query, let us inform you that the prices shown at the availability page are subject to discounts and/or surcharges that will apply according to the payment form selected by you when you do the purchase.
At the payment page you can verify the payment methods available as well as the surcharges that apply to each one of them. If you select a payment method without discount, the price will change and the page will be immediately updated. As a consequence and before you confirm your booking definitely, you will be able to see, next to the “purchase” button, the final price you will have to pay according to the selected payment method.

However, and even if the final price, including surcharges, was shown before you confirmed the purchase, we understand your situation and therefore, as a goodwill gesture, we have refunded the amount corresponding to 3 usd, as you requested.
We hope you will travel with us again soon.
Kind regards,


Their reply was weird, cryptic, self-serving, and unnecessarily long (also not at all apologizing for their mess up). They just should have apologized for the technical glitch and refunded. However, I indeed received the 3$ back to my bank account. Nevertheless, if I did not pay attention, or if I did not complain, I would have lost my 3$.


Summary: TravelGenio may not be entirely a scam. But it follows shady business practices. Travel2Be is in fact another site managed by them.


VERDICT: AVOID TravelGenio and Travel2Be at any cost!