Tuesday, May 7, 2024

FFmpeg : bulk compress videos

The phones are getting bigger and there camera's more so. Now videos are getting recorded in 4K with bitrate around 20Mbps. Now if you wish to store them for long term, it takes a lot of space on the phone which normally has fixed storage. Even you backup on a hard disk, it grows with time. So ideally just compress it with no perceptible loss in quality.

To do so (on Windows):

  1. Insall FFmpeg : https://www.wikihow.com/Install-FFmpeg-on-Windows 
  2. Copy all videos into a folder from you phone to laptop
  3. run a batch script:
    for %%c in (*.mp4) do ( 
     ffmpeg -i %%c  -vcodec libx265 -crf 28 out\%%c
    )
  4. It will convert all the videos (mp4 files) one by one and the result will be stored in a out folder.
  5. Try to view some videos in the out folder and once satisfied, correct the created and modified date with the below powershell script:

    $modifyfiles = Get-ChildItem -force *.mp4| Where-Object {! $_.PSIsContainer}
    foreach($object in $modifyfiles)
    {
       $object.CreationTime=[datetime]::ParseExact($object.BaseName.Substring(4),"yyyyMMdd_HHmmss",$null)
       $object.LastWritetime=[datetime]::ParseExact($object.BaseName.Substring(4),"yyyyMMdd_HHmmss",$null)
    }
  6. Now copy the videos back to your phone (and your local hard disk backup as required)
  7.  

Monday, September 25, 2023

Bulk add members in to MS Teams

 MS teams natively does not allow to bulk add members to new or existing teams. The process to add members one by one is pretty troublesome if you need to add 100+ members in one go. Powershell comes to you help in such a scenario.

First install the Microsoft Teams module in Powershell:

Install-Module -Name MicrosoftTeams

In case, its already installed but is of an older version, try to update it using:

Install-Module -Force -Name MicrosoftTeams

Once done, create a simple csv file with 2 columns : Email, Role and fill it up.

Next we need the group Id of the Team to which you want to add the members to. Yes there is powershell command for it as well but it was pretty slow specially when you member of 100's of Teams !!

Simple way was to pull it from the browser window. Just open Teams on the browser window and select the target Team, and look for the param groupId in the url:



Once done, just execute the below script:

#Get users from the CSV

$TeamUsers = Import-Csv -Path "<file_path>"

$TeamID = "<Team_Id / groupId>"

 

#Iterate through each user from the CSV and add to Teams

$TeamUsers | ForEach-Object {

       Add-TeamUser -GroupId $TeamID -User $_.Email -Role $_.Role

       Write-host "Added User:"$_.Email -f Green

}

You should see members getting added one by one:




Sunday, July 23, 2023

Save space on Google Photos by compressing images

For the last few months, I was getting the Google warning that my 15GB of free space was running out and I needed to buy more storage. Upon analysing my space consumption on Google One I realized bulk on my space was being used by Photos. Last I remember it was all free so I had put my android phone photos to be automatically backed up on Google cloud for free.

Then I saw that the policy was updated on June 1, 2021 which not only counts storage for the original high quality images but also the compressed storage saver images. The good thing was that any photo uploaded before June 1, 2021 was not to be counted against the storage.

So first thing I stopped the automated backup and was looking for a day of free time to work out a technical solution. Like I believe most of us, I don't print any poster size photographs. Last I took a print may be decade back. Most of it was for digital consumption i.e. on phone, tab, laptop and at best TV. The resolution required was at best 4K for TV but certainly not the 12 MP per photo which my phone camera was capturing. The solution was to somehow use JPG compression to reduce the photo size but that was not available on the cloud.

So the process I used was:

  1. Downloading photos to PC is cumbersome so I relied on the Google Photos android app. To do select say a day's or month's worth of photos -> select share -> select Copy To. This will force the photos to be download (in original quality on selecting that option) on to your phone's local storage. Let it download and then save in to a preferred folder.
  2. Next connect PC to phone using FTP and download the folder on to the PC.
  3. Next use Irfanview's batch processing to save it as JPG with 90% quality (even 80% is fine). Remember to retain the EXIF, IPTC, etc data




















  4. Once batch is completed, move the output images to the original folder so that the original photos get overwritten. If you wish to back the originals locally - this is the time.
  5. Now the issue is that the date created and date modified is updated to current date and time. If you upload this, this will mess up the Google photos layout. So we need to update the created and last modified timestamps.
  6. Powershell helps us to achieve it:

    $modifyfiles = Get-ChildItem -force *.jpg| Where-Object {! $_.PSIsContainer}
    foreach($object in $modifyfiles)
    {
       $object.CreationTime=[datetime]::ParseExact($object.BaseName.Substring(4),"yyyyMMdd_HHmmss",$null)
      $object.LastWritetime=[datetime]::ParseExact($object.BaseName.Substring(4),"yyyyMMdd_HHmmss",$null)
    }


  7. Once done, FTP it back to the phone and use Google photos.
  8. In Photos, now you will see the images in the cloud tagged with a cloud symbol whereas the local one wont have the symbol.
  9. Delete the ones on the cloud and let it complete.
  10. They backup the rest to the cloud.

And its all done. Save a few GB's doing it :)

Restoring Images Exif Data after upload to Google Photos

 Recently my Google free storage of 15GB is getting full so wished to get the photos back to my local system. Yes we can quickly download it but found that Google has wiped off of the Exif data, specially the dates.


So to restore it, luckily it still retained the file names like : IMG_20230508_110348.jpg

So quickly created the below script and it worked :)


SETLOCAL ENABLEDELAYEDEXPANSION

for %%c in (*.jpg) do ( 

set a=%%~nc

set x=!a:~4,15!

set y=!x:~0,4!:!x:~4,2!:!x:~6,2! !x:~9,2!:!x:~11,2!:!x:~13,2!

echo !y!

"<exiv2_location>\exiv2" -k -M"set Exif.Image.DateTime Ascii !y!" %%c

)


Also it need a PowerShell script to update the created Date and Modified date:


$modifyfiles = Get-ChildItem -force *.jpg| Where-Object {! $_.PSIsContainer}

foreach($object in $modifyfiles)

{

$object.CreationTime=[datetime]::ParseExact($object.BaseName.Substring(4),"yyyyMMdd_HHmmss",$null)

$object.LastWritetime=[datetime]::ParseExact($object.BaseName.Substring(4),"yyyyMMdd_HHmmss",$null)

}

Thursday, July 8, 2021

AWS : NodeJS : Hello World on EC2

 Although I have an account in AWS for over a decade, I really did not do much with it other than launching a EC2 instance and then say print Hello World.

A decade has passed and now AWS has caught up with me professionally so need to build come competencies around it.

First is to get the the Hello world back again using Node on a Web Page.

Assumptions:

  1. You have a AWS account. I am using the free tier one.
  2. Have basic understanding of Node
  3. Have basic understanding of AWS specially EC2, VPC and ACLs.

Steps:
  1. Go to EC2. Select "Amazon Linux 2 AMI (HVM), SSD Volume Type" of type "t2.micro" and launch it. 

  2. You will get a public key .pem file. Keep it safely.

  3. On Windows, you will need to set the permissions of the file correctly to mimic chmod 400 of linux:
    1. icacls.exe key.pem /reset
    2. icacls.exe key.pem /grant:r "$($env:username):(r)"
    3. icacls.exe key.pem /inheritance:r

  4. Go to Security Group and Edit Inbound rule to allow:
    1. SSH (port 22) from anywhere
    2. HTTP (port 3000) from anywhere

      This will allow you to connect to the EC2 instance from your local laptop as well as browse the Hello World node site in there.

  5. Coming back to EC2 dashboard, you should see 1 Instance running

  6. You should be able to connect to it using SSH client and see the welcome logo:
           __|  __|_  )
           __|  __|_  )
           _|  (     /   Amazon Linux 2 AMI
          ___|\___|___|
    https://aws.amazon.com/amazon-linux-2/

  7. Now that you have a shell access to your EC2 instance, lets install Node JS.

  8. We will use nvm for it.

  9. curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

  10. Activate nvm using simply bash or . ~/.nvm/nvm.sh

  11. nvm install node

  12. check node installed:
    node -v
    v16.4.2

  13. Now let just start a simple Express web app
    mkdir myapp
    cd myapp
    npm init (and just enter till the end)
    npm install express --save
    vi app.js
    const express = require('express')
    const app = express()
    const port = 3000

    app.get('/', (req, res) => {
      res.send('Hello World!')
    })

    app.listen(port, () => {
      console.log(`Example app listening at http://localhost:${port}`)
     
    })
  14. node app.js
    Example app listening at http://localhost:3000
  15. So our web app is up are running on 3000 but its still within the EC2 instance. To be able to access it from the internet, we need to modify the security group of the EC2 instance to allow the port 3000 be exposed. This has been done in Step 2.

  16. So access the web app using the public IP or hostname of the EC2 instance. Note to use http:// and not https:// and append the port 3000 at the end. It should show up as :

    Hello World!
Thats all for today. Next we will connect the mighty Database :)

Wednesday, April 14, 2021

Kubernetes : Getting started on Windows

I had setup Kubernetes on local laptop and had tried a few things 2-3 years back. In the meantime the laptop got replaced and recently got some work around it. So it was time to set it up again.

I found that Docker Desktop does now support Kubernetes so thought it will be pretty easy to get up back again. So went to Docker Desktop -> Settings -> Kubernetes and selected Enable Kubernetes. In a few minutes it got enabled and on the command prompt I got kubectl. Wow, its all done.

Now the problems started.

First, when I executed kubectl version, I did get the client version but for the server version I got:

kubectl unable to connect to server: x509: certificate signed by unknown authority

So spent quite a few hours trying to work this out. There is enough documentation on the web but nothing specific to docker desktop. So despite the trials and errors, it did not work so abandoned it and went back to my earlier trusty minikube.

First had to remove Kubernetes from Docker Desktop but it was not allowing me to do it !!. So had to uninstall the whole of Docker Desktop.

Then installed the following using Chocolatey:

  1. Install kubectl : choco install kubernetes-cli
  2. Install Minikube : choco install minikube
Then installed Docker Desktop as well as had uninstalled it earlier.

All done, lets check all things are fine:

  1. Start the cluster : minikube start
  2. Check kubectl : kubectl version

    Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"windows/amd64"}
    Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:20:00Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

  3. Check cluster : kubectl cluster-info

    Kubernetes control plane is running at https://127.0.0.1:61152
    KubeDNS is running at https://127.0.0.1:61152/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

  4. All good, lets start the dashboard : minikube dashboard

    * Enabling dashboard ...
      - Using image kubernetesui/dashboard:v2.1.0
      - Using image kubernetesui/metrics-scraper:v1.0.4
    * Verifying dashboard health ...
    * Launching proxy ...
    * Verifying proxy health ...
    * Opening http://127.0.0.1:60036/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...

    Open the browser and view the brand new Kubernetes cluster in all its glory :)

So we have our K8 cluster setup. Lets start some sample applications just to test it out and revise some of the old stuff. So I tried to setup nginx as will be working on application which will have a HTTP interface.

So first create the nginx.yml file for the deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx

and apply it on the K8 cluster : 

> kubectl apply -f nginx.yml
deployment.apps/nginx created

Go to the MiniKube dashboard and under deployments, you will find:


 Under Pods, you will find:


The equivalent command line will be 
  • kubectl get deployments
  • kubectl get pods

So all good, we have deployed nginx which is running in a container within pod. Still we need to expose nginx on a port in the container so that it is accessible. Update the yaml file to:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        ports:
        - containerPort: 80
          name: nginx

and apply it : kubectl apply -f nginx.yml

So now we have set port 80 where it will receive the request and forward it to nginx. Still this port is exposed within the K8 cluster and not to outer world. To expose it to outer world or host, we need to create a service which will do so. 

So create the nginx_service.yml as:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      targetPort: 80
      port: 8082

and apply it :
>kubectl apply -f nginx_service.yml
service/nginx created

In the minikube dashboard, you will find:

As you can well see that it was exposed the port 8082 for the app: nginx

Now you can check it on your local browser : http://localhost:8082 or http://127.0.0.1:8082/

All good. Now get will app development and deployment on K8 cluster :)

Saturday, June 6, 2020

How to Set Up a WRT54G as a Repeater

I have been using Linksys WRT54G for over 15 years now and it has been an excellent router.

Over time the broadband speeds have increased and my current broadband plan supports 200 Mbps. My router has an official peak speed of 54 Mbps but practically even if I sit next to it, I get around 20 Mbps which falls to less than 10Mbps in the next room and by the time I reach my 3rd bedroom, the signal is almost gone. So I felt, I am losing out on the speed I am paying for.

Another issue was the increase of device counts connecting to the router. Earlier it used to be just my laptop. Now we have 3 laptops, 2 smart phones, 1 Smart TV and the count will simply increase in future. In here my router was unable to cope up with. So if my child is watching YouTube on TV in FullHD , (in lock down due to Corona), my Skype and Team calls get impacted although I have enough bandwidth to support all in parallel.

So it was time for an upgrade. Did my research and finally concluded on TP-Link Archer C60 AC1350 primarily due to:

  1. Wanted a dual band router as it can support up to 867 Mbps @ 5 GHz. I don't think I will cross that speed in next 3-4 years
  2. It support MU-MIMO which will help support multiple devices in parallel
  3. Has 5 Antennas
  4. Cost was Rs 2200 on Amazon which was like 300 more than next model but had more features.
With the new router coming in, I did not want to throw my old router as the new one still did not reach my 3rd bedroom well. So started looking up on Google to convert my Linksys WRT54G in to a repeated. And yes it was possible.

The 2 reference links are :
Although the links are pretty accurate, there are some misses in there which I believe is more like article was written in the past and things have changed.

To flash the router and install DD-WRT on it

  1. DO the hard reset exactly as its said i.e. 30-30-30. Actually I did like 60-60-60 to be safe and all went fine.
  2. The GV5Flash.zip download is missing vximgtoolgui executable although the folder name is the same. The executable inside the folder is wrt_vx_imgtool which is like command line version of the tool . To get the GUI, use this url : http://web.archive.org/web/20060708130642/http://www.bitsum.com/files/vximgtoolgui.zip
Configure the  repeater

  1. In here skip the 'Reset Router' and 'Update Firmware' sections
  2. Start from 'Set Static IP Address'
  3. if you favour command line, you can use
    netsh interface ip set address name="Ethernet" static 192.168.1.9 255.255.255.0 192.168.1.1
    netsh interface ip set address name="Ethernet" dhcp
  4. Change Router Settings : Step 7 - You can put a better SSID than 'bridge' like _rpt or _ext
  5. An important step missed in here is to secure the repeater itself. To do so, go to Wireless :: Wireless Security Tab :: Virtual Interfaces section. In there you can set security mode for the repeater like WPA2 Personal and the key.

Now a bigger issue is once you have setup the repeater, there is no way you can access it over WiFi as its a plain proxy. If you try http://192.168.0.1/ , you will end up with the primary router. and there is no http://192.168.1.1/. So to access it back again, 
  1. you will need to setup you local laptop with static IP :
    netsh interface ip set address name="Ethernet" 
  2. Connect your laptop to the repeater using the Ethernet cable
  3. Now try http://192.168.1.2/ as the repeaters own address is 1.2 with 1.1. being the gateway (as configured in Step 3 of 'Change Router Settings'

So all good, I ended up with 3 SSIDs:
  1. Primary 2.4 GHz
  2. Primary 5 GHz
  3. Repeater 2.4 GHz
and yes my whole house is now covered :)

Monday, September 23, 2019

GIT Commit Stats using Command Line to analyse in Excel

git log --all --no-merges  --pretty=format:"%aE - %aI : %s" --after="2019-04-01 00:00"  > git.log

Sunday, September 22, 2019

Static code analysis and source code complexity tool - Plato for Typescript

I was looking for a tool which can report code complexity for an Angular application. The application is written in Typescript and there are hardly any tools for it.

The first place to look was Wikipedia : https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#JavaScript which has some tools for Javascript but none for Typescript.

Looking across the web : https://www.npmjs.com/search?q=keywords:complexity , I came across tools like Plato and Complexity Report based on EsComplex. I was quickly drawn to Plato for it nice graphical reports.

npm install -g plato

Still the problem was how to make Plato run on TypeScript. Yes there were people asking for it on the web but no answers.

Now I knew all the TS code of my angular application is compiled and put into main.js. So I applied Plato on the file directly. First thing I hit was a memory constraint put by node that it can use a maximum memory of around 1.5GB. So had to increase it using:

node --max_old_space_size=4096 ./node_modules/es6-plato/bin/plato -r -d report -e .eslintrc.json -t "MyApp" -x .json dist\MyApp\main.js.

It worked but resultant report was so big that beyond the basic summary, navigating it was causing browser to error out. Looking into it in notepad++, I found that it a lot of Angular internal code around Webpack and then a small amount of the application code.

So had to work out a better solution. Need to compile the individual TS files in to JS file and run plato only on them.

Luckily we have a tsc compiler for TS which will output the JS and then can run plato on it.
So first install:

npm install -g typescript

Now we can run the build task from VS Code directly using CTRL+SHIFT+B i.e. Run Build Task and select tsc:build

This will execute the command:

node_modules\.bin\tsc.cmd -p tsconfig.json

Depending on your tsconfig.json, your output will normally be at :

"outDir": "./dist/out-tsc",

Now when I look at ./dist/out-tsc/src/app, I see all by TS files compiled and resulting in to JS and JS.MAP files.

Now I can run plato and it does not even hit the 1.5 GB memory as it has smaller files to look into :

plato -r -d report -e .eslintrc.json -t "MyApp" -x .json dist/out-tsc/src

and see some wonderful results:



TSLint to ESLint

As a active Angular developer, maintaining a good based is pretty important. All along, the standard was TSLint which has now been deprecated in favour of ESLint.

Luckily tools are available to do the migration at : https://github.com/typescript-eslint/typescript-eslint

Unfortunately the documentation is not elaborate and did not work for me. So wanted to note down what worked for me.

First install / update your ESLint as it already has configured to support TypeScript:

npm install eslint --save-dev

Create the configuration file

node_modules\.bin\eslint --init

You can choose your options. I chose:

? How would you like to use ESLint? To check syntax and find problems
? What type of modules does your project use? JavaScript modules (import/export)
? Which framework does your project use? None of these
? Does your project use TypeScript? Yes
? Where does your code run? Browser, Node
? What format do you want your config file to be in? JSON
The config that you've selected requires the following dependencies:

@typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest
? Would you like to install them now with npm? Yes

Installing @typescript-eslint/eslint-plugin@latest, @typescript-eslint/parser@latest

It will create a .eslintrc.json file which will look like:

{
    "env": {
        "browser": true,
        "es6": true,
        "node": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/eslint-recommended"
    ],
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaVersion": 2018,
        "sourceType": "module"
    },
    "plugins": [
        "@typescript-eslint"
    ],
    "rules": {
    }
}

Now you check your file or folder :

node_modules\.bin\eslint src\app\app.component.ts

node_modules\.bin\eslint --ext .ts,.js src/

That's all good from command line. Lets not integrate it with VS Code : 

Open File -> Preferences-> Settings -> Open Settings (JSON) (on top right corner)

Append:

"eslint.validate": [
  "javascript",
  "javascriptreact",
  { "language": "typescript", "autoFix": true },
  { "language": "typescriptreact", "autoFix": true }

]


Saturday, April 27, 2019

PPP Rates

Something which I refer to but getting data in one place is tough.

Ref: https://data.worldbank.org/indicator/PA.NUS.PPPC.RF?end=2017&locations=IN&start=1990&view=chart

LOCATION INDICATOR MEASURE TIME  Value   PPP   Ratio   1/x 
IND EXCH NATUSD 2000         44.94         10.14           4.43           0.23
IND EXCH NATUSD 2001         47.19         10.23           4.61           0.22
IND EXCH NATUSD 2002         48.61         10.45           4.65           0.21
IND EXCH NATUSD 2003         46.58         10.64           4.38           0.23
IND EXCH NATUSD 2004         45.32         10.95           4.14           0.24
IND EXCH NATUSD 2005         44.10         11.06           3.99           0.25
IND EXCH NATUSD 2006         45.31         11.42           3.97           0.25
IND EXCH NATUSD 2007         41.35         11.76           3.52           0.28
IND EXCH NATUSD 2008         43.51         12.54           3.47           0.29
IND EXCH NATUSD 2009         48.41         13.20           3.67           0.27
IND EXCH NATUSD 2010         45.73         14.21           3.22           0.31
IND EXCH NATUSD 2011         46.67         15.11           3.09           0.32
IND EXCH NATUSD 2012         53.44         16.01           3.34           0.30
IND EXCH NATUSD 2013         58.60         16.73           3.50           0.29
IND EXCH NATUSD 2014         61.03         16.99           3.59           0.28
IND EXCH NATUSD 2015         64.15         17.15           3.74           0.27
IND EXCH NATUSD 2016         67.20         17.52           3.83           0.26
IND EXCH NATUSD 2017         65.12         17.73           3.67           0.27
IND EXCH NATUSD 2018         68.40         18.88           3.62           0.28

Monday, May 21, 2018

REST standards


  1. https://github.com/WhiteHouse/api-standards 
  2. https://martinfowler.com/articles/richardsonMaturityModel.html


HTTP METHODPOSTGETPUTDELETE
CRUD OPCREATEREADUPDATEDELETE
/dogsCreate new dogsList dogsBulk updateDelete all dogs
/dogs/1234ErrorShow BoIf exists, update Bo; If not, errorDelete Bo


"tags": [
  {"id": "125", "name": "Environment"},
  {"id": "834", "name": "Water Quality"}
],

and not 

"tags": [
  {"125": "Environment"},
  {"834": "Water Quality"}
],

Record Limits:

{
    "metadata": {
        "resultset": {
            "count": 227,
            "offset": 25,
            "limit": 25
        }
    },
    "results": []
}

Saturday, August 27, 2016

Rename images in batch using Irfanview

Earlier I used Exiv2 scripts to rename images.
Now Irfanview allows the same using GUI. The name pattern to be used is :
$E36868(%Y%m%d_%H%M%S)

Use the following powershell script to rename extension:
Get-ChildItem *.HEIC | Rename-Item -NewName { $_.name -Replace '\.HEIC$','.jpg' }

Saturday, February 27, 2016

Wayanad – 13 – 15.2.2016



Last December, my wife and kid stayed back at her parent’s house and I came back alone to Bangalore on 27th December 2015. Back to my bachelor days. Last week of December was practically empty so hardly went to office. On 31st night, had Hari and Ashok at my home with drinks and KFC chicken. Bandy joined us in the night. Planned for going somewhere and rooted for Pondicherry. All agreed and the plan was to go next weekend. HK and Ashok stayed in the night. Next day had breakfast at Udupi Park followed by a nice lunch at Plantain Leaf. Slept through the afternoon. In the evening they left with plans to get Praveen roped in as well so that all can go out for 3 days. That evening got hold of Ritesh and Vinay and had our New Year party. 

Following week, I checked with HK but Bandy and Praveen backed out so nothing worked. Then checked out my friends like Deepak and Sanjay but there were more in to Cubbon Park and Lalbagh.

So finally last week had called up HK on Thursday to enquire about plans. He was ready and so was Ashok. He said he will check with Bandy and confirm. By night it was like Bandy won’t come so it will be the 3 of us and it will be Pondicherry. Friday around noon, checked again with him but he was busy. I was back early to home by evening when he called back talking about some weekend work for the next weekend release. Was able to put some sense in his mind that work will always be there and no one really cares about work so he agreed. He said that Vikas from his team will also join in and Wayanad will be a better place to go at this time of the year. I agreed.

I asked them to pack some dinner and come to my house. They came in like 9:30 pm. Had dinner of roti and 2 chicken curries. Looked through places to stay but did not book it as the rates were negotiable and it’s better to check them on spot. So just made a list of top 5 stays. Also made a list of places to visit. HK was still like return on Sunday night but I knew I can convince him for Monday giving us a full day to see the place.



Saturday 13th Feb:

Woke up like 4:45 and started getting ready. Made some tea which we had with biscuits. Left home at 6. Drove till A2B before Mandya which was like 100 kms from home. Reached there like 7:45. Well on time. Had masala dosa. Left around 8:30. Bypassed Mysore on its outer ring road. The road from Mysore to Nanjagud was under construction so had to slow down a bit. From Gundlupet took a right and entered the Bandipur National Park. Road was good and mostly empty. In the national park faced a lot of humps at regular intervals. Stopped for a while inside the national park for some photos. When we moved out of Karnataka and into Kerala, the forest changed its colour. From the dried white and brown tree barks, it all turned green and full of leaves.

The first big town in Kerala was Sutlan Bathery. Finally stopped at Meenangudi just before Kalpetta which is the district headquarters of Wayanad. It was around 12. Started checking out the places to stay. Found a good one name Coffee Aroma Resort and got set for it. Started like 1 and reached there close to 2. We were welcomed with a nice sugarcane juice and then moved to our twin cottages.

It really had a mountain stream flowing next to it like the photos. We all decided to take a dip in to it. So just headed out. Found a place where you can lie at like 30’ as well a small waterfall when water was flowing down from say 10-12 feet. I settled for lying down with water gushing all over my body. HK and Vikas took shower in the small waterfall. The water was really cold but got used to it in some time. Then just laid there with eyes closed. Had trouble breathing as water flowing over my head and nose so had to sit up intermittently. But that was a 30-45 mins well spent.


The resort manager came looking for us and informed that lunch is ready. So we went back to our cottages and took a quick bath and then down to the dining area. Lunch was rice, chicken curry (Malabar style) and dal. Small menu but good taste. Had a stomach full of it and straight back to our cottages for sleep. It was already like 4 pm. Slept till 8. Woke up and went back to dining for some tea. Had asked chicken biryani (kerala style), roti, paneer makhni for dinner and some beer and chicken fry to start with. Called up home and buny. Back to cottages and things were ready by then. Lots of talk of office and general life. Had dinner. A group of boys had come to the resort and they partied late in to the night so was awake for quite some time. Finally got some sleep.


Sunday 14th Feb:

Woke up like 7 when the alarm was for 8!! Surprised at what nature can do to you as we were practically inside a coffee plantation surrounded by forest. There was dew on the window. So just headed out alone as rest were still asleep. Went down the river and then upstream. Took photographs and then sat of a rock over the stream for some time. **PEACE**. Came back.






Folks were up by then. Got ready and headed for breakfast. Vikas had headache so he ate little. Talked to the manager who said we can go upstream to a bigger waterfall. So we went for it after breakfast. It was like a 20-25 mins climb upstream jumping over rocks as we moved ahead. In a short time, it became tiring as we were like jumping rocks of size 2 or 3 steps each time. But all of us reached. The water volume was less still it formed a good waterfall. Just wondered how it will like during monsoons when it will be full of water. Caught my breath for some time and then headed up the spot when the water was rushing vertically down.

I was followed by HK. Ashok had a corn is his foot which was troubling him but he followed a little later. Vikas was literally sick and he threw up and sat at the base of the pool of the waterfall. The water was now chilling and since it fell from some 30 feet, it was like needles hitting the skin. It took some time to adjust but thoroughly loved it. Slowly I moved out at sat on a rock between the spot and the pool. I was still getting splashed by water but it was not directly over me. HK joined first followed by Ashok. After lie 45 mins, went back to the rocks by the pool and dried ourselves in the sun. On the way back, took a different route via the tea plantation. They had tea at the higher levels and coffee at lower levels. It was an easy stroll down.





Back to our cottages, took bath and got ready. The jeep was ready to take us down. Back to the car we headed for Kalpetta first to get Saridon for Vikas. After having it he felt better. Then on way to Banasura Sagar Dam, had lunch close to the dam itself. It was already around 2. Finally reached the dam. It was the largest earthen dam in India and since it’s a hilly region, there were a lot of island which were formerly hill tops before the dam submerged dam. They had a park and play are by the dam. Vikas looked for getting tickets for speed boating but we were late.


Left the dam at 4 for Lakkidi View Point. Wow. It’s the place where the road leaves for the Ghats and it was like a drop from Wayanad towards Kozhikode. The road snaked down one and then came up the opposite hill at a much lower level.


Took some photographs and left it for Pookot Lake which was close by. Took a stroll around the lake with Ashok and took some rest on the benches on it periphery. It was evening and it was good to take a leisurely stroll in the woods surrounding the lake.


When it started getting dark, headed back to the resort. Reaching there, called up the Jeep. In the resort had tea. Thereafter played TT with HK. I had played it after quite a long time. For dinner, asked for rice, dal, fish fry and aaloo fry with some beer and chicken fry. Back to our cottage, had the drinks and back to dining for dinner. Vikas and Ashok went to sleep. HK and I talked about office and life well till midnight. Then called it a day and went to sleep.


Monday 15th Feb:

Today as well woke up early around 7. Just walked around the resort. Went for breakfast at around 8 but breakfast won’t be server till 830. So had tea and waited. Had chowmein and poori-sabzi. Came back and got ready for departure. Were ready to leave at 1030. The plan was to go to Edakkal caves. On reaching there, we were told that it’s closed on Monday. So moved ahead. Drove non-stop till Gundlupet where stopped at a CCD and had a fruit drink. It was hot today. It was already 2 o’clock and did not feel like eating. So drove to KR Sagar Dam bypassing Mysore. Reached there by 4. Had some snacks at the shops at the entrance and then shared fried rice with Ashok in the Karanataka Government eatery in there and it was really bad. Sat at the head of Brindavan Gardens. Still after 100 years, the view is simply great. Strolled with Ashok through the gardens and then up to the musical fountain area.


Left at 630 and we were closing Kengeri around 9 when we stopped for Dinner. Had Chole Bature followed by ice-cream. Left around 10 and reached home by 11. Pretty drowsy so went for sleep. HK and Ashok stayed back but Vikas left. Next day HK and Ashok left before I awoke.

Overall a nice drive of around 750 kms where I was the driver. Nice scenes. It will be way better post monsoon when it’s all green. Still this was better than staying home at weekend :)

Photos at : https://goo.gl/photos/xxrDtQQxrq6y1jQh8