How Goibibo Ruined My Vacation

I recently went on a vacation of 10 days with my wife. I used a particular online portal to do most of the bookings and used Goibibo for the last two nights of my vacation, in Chandigarh and Delhi. So bad was my experience of the last two nights that all the sweet memories of my vacation were overshadowed and washed away. We came back from the vacation stressed, instead of the being recharged.

Here are the two instances.

ChandigarhEntire city of the hotel is listed wrong.

Hotel – Oyo 10070 Hotel Satkar Regency @ https://www.goibibo.com/hotels/oyo-10070-satkar-regency-hotel-in-chandigarh-1026524238785863934/

This hotel falsely claims to be in Nayagaon, Chandigarh. It is actually in Punjab and a good 13 KM away from Nayagaon. We reached Chandigarh during our vacation at 1 AM and realized the hotel was not in Chandigarh. I should have realized this earlier, but hey if a hotel publishes itself to be in Nayagaon, Chandigarh you would go into the exact location only after reaching Nayagaon. It was too far for us to travel and hence we started to look for a hotel in the middle of the night. Unfortunately, the next happened to be some law exam and all hotels across Chandigarh were full. I and my wife were left stranded in an unknown city at 2 AM. Luckily my driver knew of a place which happened to have 1 small room available> We were forced to book it at a hefty cost of 2500 for a room and hotel that should not cost over 700 on a normal day. I lost 2500 and my peace of mind only because booked the hotel through Goibibo, who didn’t bother to check if the hotel is listed in the correct city. Over the night, I tried reaching the hotel a few times over the phone, but nobody ever picked up the phone.

Here is what google map says

This is Chandigarh

This is Nayagaon, in Chandigarh

  

And this is the hotel, claiming to be in Nayagaon, Chandigarh

Delhi – Fully prepaid hotel says room unavailable at check-in (1AM)

Hotel the Raj – https://www.goibibo.com/hotels/the-raj-new-delhi-railway-station-hotel-in-delhi-3403263700294913450/

I booked the deluxe room by paying full money ~1500 in advance through Goibibo. On turning up at the hotel at 1 am with my family, I was told they don’t have a proper room for me, they only had one room that had no electricity. They suggested I use that as it was pretty late and we should sleep anyway and won’t need electricity. I could not agree with the ridiculous response and told him we can’t take the room with no electricity. The guy at the reception offered to help us by providing a room in another hotel nearby. With no other option in front of us, I and my wife at 2 AM in the night at Delhi, were forced to take up the alternative hotel, Harsha International.

This alternate hotel was neat and clean and close by. Raj’s staff did help move our luggage here.

Hotel Raj is listed under GoStay’s 100% money back guarantee. Hence after the stay, I requested Goibibo to refund my money as I had a difficult time and was made to stay in the standard room of a 1-star hotel while I booked and paid 100% amount in advance for a deluxe room in a 3-star hotel. I still haven’t got my money back from Goibibo, they insist they are sorry, but cannot offer me anything more than Gocash worth 700. I have denied this offer as I do not wish to use Goibibo ever again and hence to GoCash is of no value to me. I demand a full refund into the card that I used for booking. If Goibibo cannot refund me in a situation like this, I really doubt they will do so if the TV of wifi does not work as claimed under the 100% money back guarantee program, which so far only appears to be a big scam.

Goibibo Customer Service

One of the most pathetic experiences with a support team. I lodged two tickets on their portal, #26086306 for the Chandigarh hotel and #26086081 for the Delhi incident. 

The automated email from the support team says we will get a response within 2 hours or sooner (lol). I never got a response on 26086081, until I mailed them back 3 days later. As for 26086306, I was lucky to get a response, but the fool at the other end looked to be actually responding to 26086081 based on the content of the response. These idiots cannot even reply to the right ticket. All responses received until today have been about the Delhi incident, the Chandigarh incident has easily been lost in the abuse of the ticket numbers by their support team. The escalation channel is of no use either.

Here is what I have got from them on the Delhi issue so far

We request you to please note that we have validated your concern and as checked on this, the issue was resolved within the stay by the hotel as an alternate property was offered and the stay has been availed as well and we request you to please note that the resolution offered from our end for 500 Non-Promotional Go Cash stands the best from our end. Non-promotional go cash can be used without any restrictions on usage and validity and the amount offered is close to 50% refund of the booking. 

According to this idiot, 500 is 50% of 1494. According to me 50% is not same as 100% of a 100% money back guarantee.

On insisting, this is what I get

In that case, the best offer that we can make on this booking is 700 Non-Promotional go cash and we won’t be able to offer anything beyond this as the concern was looked after within the stay and no complaints were raised to the hotel after that as per our validation. 

Who can make these morons understand that if I did not stay in the hodel, who can I raise a complaint to the hotel during my stay? Also, if a person is harassed so much after a tiring trip and reaches the hotel at 1-2AM would they want to go to sleep or play ping pong with goibibo during the night? Yet, as a matter of fact, I had raised the complaint on the goibibo site during my stay, through Goibibo’s equally idiotic AI assistant, gia. 

I am pretty sure the AI is of no use and did not chase it further.

What should have happened?

Chandigarh – Apology from the hotel and Goibibo. Goibibo should ban the hotel forever for trying to lure customers of a nearby city but incorrect listing.

Delhi – Apology from hotel and Goibibo. I should get 100% money back, no gocash.

I am not sure what is an appropriate ask for a poor experience and spoilt vacation.

The classic snake game

Snake Game in C

The classic snake game that a lot of us were addicted to playing on our cellphones, made for DOS using C/C++ language with Borland’s Turbo C & graphics.h library

The project started as a hobby project to explore my C/C++ skills and I along with my friends used it as my project for the Computer Graphics course at my university

Originally posted on TechBirbal on Wed, Feb 20, 2008 by me, under my alias ju_s_t4u. Unfortunately, this great site was discontinued by its owner, hence only archived links available

You may need to install DosBox to compile and/or play the game.

Introduction

This is the classic version of the most popular mobile and computer game named “SNAKE”. The main objective of this game is to feed an increasing length of a snake with food particles which are found at random positions, picking up bonus mongooses that occur at regular intervals.

Classic Snake Game

The game starts with selecting one of the three difficulty levels followed by a screen which asks the user to select whether he wishes to play a bounded game or an unbounded game. These concepts are discussed later in the synopsis.

Features Of the Game

  • A very user-friendly game
  • Simple and easy game to understand
  • Explanations provided in the game as and when required
  • 3 different difficulty modes
  • 2 different gaming arenas
  • 3 Chances for each user
  • Presence of bonuses in the game to increase scores
  • Presentations of score card in a precise tabular form

Description

The “snake game” is a game made in C++ language. This is a game which is quite easy to play. The game is a classic representation of the snake game which appears as an inbuilt game feature in most of the leading mobile handsets like Nokia.

The “snake game” is one of the simplest game concepts ever, and just like Tetris it’s very addictive. There are a lot of variations of this game written in Flash, a relatively easy game to code, with an ability that when keys are pressed in rapid succession they are all registered. This is necessary if you want to have full control of the snake at all times.

Your goal is to move the snake and eat as many “food” blocks as possible. There is only one food block at any given time. When the food is eaten, the snake grows in length. If you hit the snake itself the game is over.

Depending on the mode selection, the game modifies itself and hence gives the user choices as he is free to select the difficulty level, the game arena that he can select a bounded or an unbounded region.

Each user gets 3 chances. After the snake consumes a food particle, the score increases. After picking up 15 food particles, a bonus mongoose appears. This Bonus is present only for a limited time. Once the user picks up a bonus, his points increase by 5.

If the user wishes to quit the game anytime, He or she can press the ‘X’ key on the keyboard. This would directly exit the game.

Different modes used in the game

  • Easy mode: Here the box size in which the snake is allowed to move around freely is larger in size as compared to the other two modes. Hence, the user finds it a lot easier to control the snake. Chances for the snake to die are quite less
  • Medium mode: Here the box size in which the snake is allowed to move around freely is larger in size as compared to the hard mode and smaller than in easy mode. Chances for the snake to die are moderate
  • Hard mode: Here the box size in which the snake is allowed to move around freely is smallest. Chances for the snake to die are highest

Different Gaming Arena

  • Unbounded mode: Here, during the process of travelling, if the snake hits the boundary wall, it does not die, instead it comes out from the opposite wall as though there is a continuation in the movement.
  • Bounded mode: Here, during the process of travelling, if the snake hits the boundary wall, the snake dies, and this is counted as a loss of life. This is a tougher mode as compared to the unbounded mode.

Fork it on github

https://github.com/jugalthakkar/snake-c

 

 

tincheck.tk – for bulk TIN & CST status check

A trader/entity in India pays value added tax (VAT) while buying goods and services and also collects VAT while selling to the next entity in the supply chain.

Say, the trader bought some goods worth Rs. 10 and if the VAT rate is 10% he would then pay Rs. 11 to the seller including Rs. 1 as VAT. Now the trader sells the goods to another entity for say Rs. 15, he also collects Rs. 1.5 from the buyer in this transaction. Overall the trader paid Rs.1 and collected Rs.1.5 towards VAT. At the end of the day this trader now owes Rs. 0.5 to the government between these two transactions amongst the three entities.

A trader of a decent magnitude would probably have several thousands of transactions a year across hundreds of buyers and sellers. The trader has to periodically (monthly/quarterly/annually) pay the net VAT he owes to the government. At this time he also needs to justify how the net VAT has been reached at. And this is done by a simple balance sheet (J1/J2) stating how much VAT he paid and to whom and how much he collected and from whom. The buyers and sellers are referred to by a unique number called taxpayer identification number or TIN. The government now knows from you, how much VAT you collected, at the same time it also knows from all your sellers how much VAT they collected from you when they submit their accounts.

Mathematically, the sum of all the VAT collected from you from all the sellers would be same as sum of all the VAT you paid to all of them. If either the trader fails to collect the correct TIN of the one of seller or one of the seller fails to provide your correct TIN, this would quickly raise a mismatch and a possible enquiry from the government asking for an explanation to either of the entities.

It’s the traders responsibility to gather and verify the TINs of various entities it transacts with, he may obtain it verbally, through email, sms and any medium he prefers. Obviously this can lead to mistakes. Thankfully the government (of Maharashtra in this instance) has provided a portal to verify and validate TINs @ http://mahavat.gov.in/Tin_Search/Tinsearch.jsp Before submitting their accounts to the government, the trader, or his accountant, has to validate all the TINs in their records. An average 200-300 TINs may be fairly the size for each trader. An accountant may have 20 such clients and hence has to validate thousands of TINs. The portal in it’s current form allows validating on TIN at a time only.

Given the above pretext and the importance of having correct TINs and at the same time validating hundreds or thousands of TINs at once let me to create http://tincheck.tk This came as a request from one of my close relatives who is a Chartered Accountant. I have not hacked the government’s TIN database or gained any access to the same maliciously. The tool provides a bulk input interface to the existing portal of the government and validates one TIN at a time behind the scene like a person would do.

GitHub Embed test page

Test page for https://wordpress.org/support/topic/does-not-work-426?replies=2

GitHub Links

Repository

https://github.com/twbs/bootstrap

https://github.com/twbs/bootstrap

User

https://github.com/twbs

https://github.com/twbs

Highcharts Tips – Accessing chart object from container id

Given the following container for Highcharts, how do you access the appropriate chart object from the container’s id?

Let’s see how we can get a handle of the chart object to display the title

Highcharts 3.0.1+

Highcharts 3.0.1 has made it fairly straightforward like most jQuery plugins

Highcharts 2.3.4+

For Highcharts 2.3.4+ the array Highcharts.charts could be used in conjunction with the data-highcharts-chart attribute to get the position of the chart in the array

 

Highcharts.charts    

An array containing the current chart objects in the page. A chart’s position in the array is preserved throughout the page’s lifetime. When a chart is destroyed, the array item becomes undefined.

If you have only a single chart on your page, you can smartly predict the index to be 0 and skip the first step

All Versions

For versions before 2.3.4 you would need to track/manage the object yourself. We could use a map/object to store the charts by Id

If you have only a single chart on the page, you could simplify to just a  window.chart  object

References

Understanding Highcharts – Regular/Discrete Series Data

This is a part of the Understanding Highcharts – Series Data blog series

Let us first define what we mean by discrete or regular to set the context on this blog

  1. The x-axis (independent axis) is numerical
  2. The x-axis can be extended infinitely on either side, but sometimes can be bound by a mix & max
  3. Discrete: The x value of a points can’t be any number, but a certain (yet infinitely large) subset of the number system
  4. Regular: The difference between the x-values of any two given points is always an integral multiple of a fixed interval

Mathematically, all the x values can be formulated as follows

x = reference_x + N * fixed_interval

Where
reference_x
is the x value of a pre-defined reference point in the series, this can be the first point, last point or any other point in the series. N is an integer, can be positive or negative.
fixed_interval
is a fixed float. The values of
reference_x
&
fixed_interval
are static across all the points and only the N value varies from point to point. Integers & Natural numbers are classic examples of such series with
fixed_interval=1
Theoretically, for any series if we were to reduce the
fixed_interval
to a very small number, we would always be able fit all data points into the above formula. But in most cases we would not have y-values for all corresponding
N
values for such small
fixed_interval
Let’s say we are driving a car and wish to track the fuel consumption & time taken along our journey. For this experiment, we may choose a fixed interval after which we take a reading, let’s take a reading after every 50 kilometers. Initially, my odometer reads 10000 km and fuel tank is 90%. At the end of the journey I have the following readings

Odometer (km) Fuel Consumed (ltr.) Time Taken (mins.)
10050 7.2 110
10100 7.76 120
10150 8.96 115
10200 3.92 89
10250 7.76 122.6
10300 8.4 117

It can be easily inferred that
fixed_interval = 50 & reference_x = 10000
In fact the
reference_x
could have been any x value in the series, just that the value of
N
for points before it would be negative if we were to choose any point other than the start point. More importantly, Highcharts makes life easy if we choose the first point as reference, we will see how to do it next. Generally, although not always, there would be not more than one y value corresponding to each value of x.

Regular/Discrete Series Data in Highcharts

It is easy to notice the pattern of the x values in such series. Given the first point and the interval, the Nth x-value can be calculated & Highcharts offers doing this calculation for you! The series options of Highcharts has following two special properties
plotOptions.series.pointStart

If no x values are given for the points in a series, pointStart defines on what value to start. On a datetime X axis, the number will be given as milliseconds since 1970-01-01, for exampleDate.UTC(2011, 0, 1). Defaults to 0.

plotOptions.series.pointInterval

If no x values are given for the points in a series, pointInterval defines the interval of the x values in milliseconds. For example, if a series contains one value each day, set pointInterval to 24 * 3600 * 1000. Defaults to 1

If the above two properties are set in the series options, we can simply skip the x-values in the data and just provide the y values and let Highcharts take care of the rest.
series.data

1) A list of numerical values. In this case, the numerical values will be interpreted as y values, and x values will be automatically calculated, either starting at 0 and incrementing by 1, or from pointStart and pointInterval given in the plotOptions. This option is not available for series types with more than one value per point, like area range or OHLC.

Example:
data: [0, 5, 3, 5]

Let us see how to handle the above example in Highcharts

Limitations

In this approach we are forced to put one and only one value for each possible x value. Since Highcharts calculates the x values by itself, we have very limited control over it.

Say, we did not have valid data for one of the x values? Or one of the x-values is itself not valid? Had we specified the x-values ourselves, we could easily skip the particular data point. We do have an option to mark the y-value as
null
for missing points, but this will break the chart and may be undesired. If we just wish to skip the point but not break the chart, we would need to use the [x,y] approach.

If we wanted to something more special, e.g. have multiple Y values for a given X, we may have to choose to treat the data as irregular and provide explicit x values for all points.

Read More @ Understanding Highcharts – Series Data blog series

Reference Links

Understanding Highcharts – Series Data

Getting back to basics, let us have a look at the the most fundamental aspect of a chart, the data. Diving deeper into the series.data option of Highcharts.

This is a series of posts dealing with the following topics

Some of the topics are tentative, leave feedback if you want something more covered

Understanding Highcharts – Categorized Series Data

This is a part of the Understanding Highcharts – Series Data blog series

Categories are a bunch of strings that sit on your independent (generally x) axis. Say, for plotting average temperature by country, the country names on the x-axis are categories. This is the simplest form of data, the points & x-axis labels are equally spaced horizontally.

Highcharts supports defining this kind of data in the following two ways

Method I – Using xAxis.categories

Defining the categories at once while defining the x-axis using the xAxis.categories option, and defining only the y values for each series

Method II – Using {name,y} point format

If you are like me, you may not find the above approach very natural. The approach asked us to define all x-values (categories) first and then the y-values as another array, I prefer defining my points as (x,y) or something similar. Well, now we can do just that with Highcharts 3.0, which supports defining categories at the time of defining your data. The series.data now also takes an array of objects, with two properties viz. name and y. The name acts as the category. Additionally we need to instruct Highcharts to use the xAxis as a category axis as follows.

Basic observation tells that the first method allows defining categories only once, hence if there are multiple series having same set of categories the first comes handy and prevents repetition & duplication. I would also use the first form if the set of categories were to be static, this would allow me to easily elevate the categories in a default option object. The second approach is more suited, in my opinion, for situations where the data and the categories are generated programmatically.

Read more @ Understanding Highcharts – Series Data blog series

Reference Links

EkStop: Big Fraud & Scamming Customers

I recently saw an offer on EkStop which said product B (worth ₹. X) free with product A. I ordered (ORD523777) for product A, along with a few more. At the time of delivery I only received product A, and another product similar to B, and only worth ₹ Y (Y < X/3). This I believe is cheating the customer, if you say you would give product B worth ₹ X, you are bound to provide the same, you can’t send product C worth ₹ Y (Y < X/3). I have purposely used X & Y, so that the values (low or high being subjective) of  goods don’t diminish the fraud going around.

On posting a complaint (##12157##, 5th October), I got a response, on 6th October, saying I would be credited with the balance amount. I waited for a two full weeks nothing happened, so I sent another response on 19th October. This time they credit Eks points to my account, but only worth ₹ X/2-Y, claiming

“We present you half of the offer product amount in Eks points. For any offer which we offer to our customer and not get delivered or some other issue we refund them half of the offer amount in Eks points.”

This was unacceptable, you can’t sell a product with an offer, and then not honor that offer as well as be unwilling to refund for return. The customer should at least have an option to either the take the alternative offer and get refund and return goods. Big fraud going on at EkStop in my opinion.

Let’s take an example to understand this scam. Assume they have an offer which says, buy onions worth ₹ 1000 and get Tomatoes worth ₹ 200 free. But at the time of delivery, you actually get free ketchup worth ₹ 80. And if you bother to complain, and follow up, you get credited ₹ 20 and that too in Eks points. Look at the very convenient math scam here, even while they credit half amount, they don’t do (200-80)/2 = ₹ 60, they try to squeeze as much money as possible from their so called valued customers and do (200/2-80) = ₹ 20, not to mention the fatter margin they have on ketchup over raw tomatoes.

My demands were very reasonable, either give me what you promised to give, or take back what you instead provided and give my money back. They instead just want to loot customers by posing fake offers and then not honoring the offer. Checking their terms @ http://www.ekstop.com/TermsOfUse.aspx I do not see any mention of half value credit points for non-availability of offer.

In another instance, although I never placed a formal complaint for this, for my ORD518254, the delivery time slot I had chosen was Oct 1 (or may have been 2 or 3) time 10PM-12AM. I get a call from their delivery guy at 6-7PM, I could not receive that and called back a few minutes later, he was calling to check if he could deliver at 7PM instead. I did not mind that, but the delivery guy had left for the next delivery and said he would instead deliver at the initially agreed slot of 10PM-2AM, which worked for me and we agreed and I told him we would be available at the said time. But the delivery did not happen that day, next day I get an email stating the delivery has been rescheduled for Oct 6! And why? Apparently I did not respond to their call!!! I agree I did miss their call at 7PM, but that wasn’t the agreed time slot anyway, and I courteously called the delivery person back and confirmed my availability for the agreed time slot. If EkStop can’t make a delivery, they should own up, apologize and provide delivery immediately the next day. Instead they choose to blame the customer for no fault of his own, and reschedule the delivery for a week later! This also wasn’t my first order, so they had delivered before and knew I was genuine customer and the delivery address was genuine, I see no reason to not come to my doorsteps and try to deliver. If I had to guess, it was the start of a long weekend and the city witnessed massive jams that night, this might have caused the failure to deliver. I would have appreciated if they had owed up to the real reason, and not blame me for their misdoings, and provide me delivery the immediate next day.

I have checked all their terms @ http://www.ekstop.com/Delivery.aspx & http://www.ekstop.com/TermsOfUse.aspx and I see no mention which states the customer is obligated to receive and call, and failing to which the order would be rescheduled. Instead it says

“If you were not available to accept the delivery we will attempt to contact you for alternate delivery instructions. If no contact is established then we will leave a note at your door with our customer contact number to reschedule the delivery.”

Whereas I was very much available to accept the delivery, I did not miss any doorbells for sure, and definitely did not see any note.

At both these instances one thing stands out, EkStop does not care about their commitment to the customers, they don’t value their customers. They only value money and can go to any lengths to loot customers.

 Update: After all the ranting, they have now refunded the balance amount in terms of Eks points. I still stand by the point that if they can not honor an offer they should let the customer return the item and get refund or propose an alternate offer and let the customer choose if he wants refund or the other offer.

Grievance posted @ the following

Customizing Highcharts – Tooltip Visibility

Let’s play around with the Highcharts tooltip some more. Last time we saw how to customize the position of the Highcharts tooltip, today we shall look at how to work around the visibility of the tooltip.

The outcome of this exercise would be

The default behavior of the tooltip is to show up when the user hovers over a point, the tooltip then stays visible as long as the user is still interacting with the points on the chart. The tooltip fades out with a delay after the user moves outside the chart area. Let’s see how to prevent this fading out and always have the tooltip persist on the chart area even after the mouse has moved outside the chart area.

In the process, we shall also learn about Extending Highcharts. Let’s extend the Highcharts.Tooltip class using the very convenient Highcharts.wrap method.

JavaScript with its dynamic nature is extremely powerful when it comes to altering the behaviour of scripts on the fly. In Highcharts we created a utility called wrap, which wraps an existing prototype function (“method”) and allows you to add your own code before or after it.

The wrap function accepts the parent object as the first argument, the name of the function to wrap as the second, and a callback replacement function as the third. The original function is passed as the first argument to the replacement function, and original arguments follow after that.

Let’s get wrapping. We will create a quick Highcharts plugin that overrides the Highcharts.Tooltip.prototype.hide behavior. We want the tooltip to persist, in other words we don’t want the tooltip to hide. Let’s override the hide method with a no-op method.

For the minimalists, the following code also does the exact same thing

Although, we have completely removed the hide functionality in the above example, we sometimes may want this to happen conditionally. The wrap method provides the original method as the first parameter too and we could use it for pre-processing, post-processing, conditional processing, etc.

If you noticed the demo carefully, you see the tooltip does persist but the tooltip does not come up till the user hovers over the chart once. We may want to force the showing of tooltip on load, let us see how to accomplish that.

The tooltip object has a refresh method on it, this method takes the points on which the tooltip shall show up. In case of a shared tooltip this argument would be an array, otherwise the method takes a single point as the argument. Following code would bring up the tooltip on the 3rd point on the 2nd series.

Invoking the above immediately after the chart instantiation shall show the tooltip on load, and clubbing with the previous plugin we shall have an ever persisting tooltip.

Here is the example we began with and see what can be accomplished by combining the techniques together

Reference Links