Tuesday, June 21, 2016

Karabiner: Mouse/keyboard customizer for OS X

karabiber

For beginners, or the one who migrated from Windows environment, Natural Gestures (Scrolling and Swiping) might be bit confusing. But, once you get familiarized with them, it may feel like "What was I doing, all those days?".

It all changed, when I connected external mouse to my Macbook. When you start using that WHEEL, you will be confused.
Luckily there is a setting for mouse, to change scroll behavior (natural or the other way).

But, here's the catch.
If you toggle that setting, it also toggles the same for TRACKPAD!!!!!

I've seen that many people were freaked out and even raised BUG report to Apple. But, all those reports were closed, saying that is not a bug, but intentional feature!!!

For those, who can't leave with such one-sided settings, here is a simple util, which came to my rescue: Karabiner
It's simple, powerful and stable mouse/keyboard customizer for OSX.

Without going into much detail, here's the configuration I used to retain by Natural Gestures of Trackpad and also the intuitive behavior of mouse wheel.

First enable the natural scrolling setting of your Trackpad (OSX Settings).
Then open Karabiner.

Following are the changes I made under "Change Key" tab:

  • Karabiner Core Settings > Exclude devices > Don't remap Apple's pointing devices
  • Pointing Device > Reverse scrolling direction > Reverse Vertical Scrolling
  • Click on "Reload XML" button, which is at the top right corner
That's it!!!!

There are lot more settings/tweaks you can make.

Thursday, June 9, 2016

USB port not working on Mac

USB port not working on Mac

Recently I connected an external hard-disk to my new MacBook and observed that it was not properly detected on one of the USB ports. But I can see that it is powering my HDD.
I tried switching to other port and it worked. I simply ignored it by thinking that my HDD cable might be loose.
Now I bought a new USB drive and to get it detected, I have to insert and detach it multiple times. And as usual, I suspected the new USB drive, as my Mac is brand new. And planned to replace my USB drive.
Now my HDD came back to  my mind. And also my earlier laptop, in which few KEYS went unresponsive due to accumulated charges.
By little researching I found that I'm not alone. The solution that worked for me was "Resetting SMC"
Here is the procedure I followed:
  • Shut down the Mac and connect the power cable
  • Hold down Shift+Control+Option+Power concurrently for a few seconds.
  • When the light on the power adapter blinks or changes colors you’ll know SMC reset is complete
  • Release all keys at the same time
  • Now boot your Mac as usual.

Now I'm happy that I don't have to replace any of my devices.

Tuesday, May 31, 2016

HSQLDB

HSQLDB

It's been almost two years I've been using HSQLDB in one of my client-critical application.
When I was given the task of working on this application (which was already in production), main challenge was to reduce latency and also to make it flexible enough to accommodate any future use-cases.

Without going into to much details, here's my use-case:
  • Application receives data from multiple sources
  • Parse data from each source and extract required data
  • Aggregate this extracted data and find best candidate which satisfies certain rules

One simplest solution is to join data from all sources by having a (for-)loop, one each for a source and apply rules inside inner-most loop. As number of data sources increases, so does the latency.
HSQLDB came to my rescue. I used in-memory variant, as the data is non more required, once a candidate is found.

Data extracted from each source is stored into DB (from here on, DB => in-memory HSQLDB), wherein we have one table each for a data source.

Here come the best part.
Now all my rules for computation are mere SQL queries. Instead of going through the code, one can easily understand the rules by looking at this SQL queries.
By adding proper indices, which can be done by simple annotations, we can perform any complex query in almost no time (subject to the size of data).
It also comes with one more added benefit, flexibility. We can add/modify rules with almost no effort.

HSQLDB has a huge community and all your queries, if any, would have been already answered.

Please share your comments/queries below.
Will add samples and mocks, if required.

Wednesday, June 3, 2015

Nexus 5 : IMEI 0 issue

Nexus 5 : IMEI 0 issue

Sometime back, an update (believe me, an OTA update) blocked all network calls on my mobile. After struggling for a while, I came to know that IMEI of my phone was set to 0. Tried many solutions (resetting the phone, clearing cache, even installing fresh OS), but none came to my rescue.

Thanks to a guy (sorry for not crediting), who uploaded instructions in Russian language, and with the help of Google Translate, my phone is up and running again.

Note: Before proceeding any further, keep in mind that you need IMEI of your phone (check on back panel)

Download related files from here.
Here is the procedure that I've followed:
  1. Install the LG driver LG
  2. Install QPST
  3. Copy the entire folder EFS Professional to C drive
  4. Unpack the archive Nexus5 the root of drive C.
  5. Using WUG Nexus toolkit:
    1. Make sure running stock Android 5.0.1
    2. Rooted
    3. If necessary, you can reset the IMEI using backups zero IMEI from the archive. To do this, simply make a backup of your EFS in TWRP, then replace in the folder's backup your files on the distribution of similar make and restore EFS.
      1. If it is already erased and writes 0, then just skip this step.
    4. Advanced tools: 
      1. Install boot(kernel) 5.0.0_diag_BOOT.img from folder
      2. open a command window, and run the following command
        • adb shell > su > setprop sys.usb.config diag,adb
      3. This activates the diagnostic mode on the phone and will be available operations with nvram through com port.
  6. Open EFS Professional:
    1. Click on Qualcomm NV Tools, Hit connect and go to Secure Ops.
    2. Hit Read and check off imei and meid, and enter imei and meid (meid is just imei without last two digits)
    3. Hit Write
    4. Reboot phone and check imei by typing *#06# 
    5. If imei still 0 > do b above again, then Read (note esn now appears), then Write again (ignore the errors) > Reboot and check, should be working.
    6. Repair 3G/LTE:
    7. Install the diagnostic bootloader again and run the setprop shell command again
    8. Open QPST Configuration from Windows programs
    9. Click Ports tab, Add new port, deselect secure ports only and should now see the serial port with phone connected (if not, then the serial drivers aren’t installed properly à Use WUG driver support to remove all android drivers and plug the phone in again to install from windows update)
    10. Click Start Start Clients > Software Download
    11. Go to Backup tab and click Start Leave SPC with all zeros (note file location of backup)
    12. Go to Restore tab, check “Allow phone / file ESN mismatch”, restore from the NEXUS5.qcn (from the folder), again leave SPC with all zeros here
      • Now click Browse next to QCN File, locate the backup from j above and now enter in SPC: 308508 > Start
    13. Reboot phone > everything should be working!
  7. Don't forget to make a complete EFS backup now!!!

Sunday, March 29, 2015

Divide : Separate work and play on one device

Divide : Separate work and play on one device


Recently I came across this beautiful app, while searching for good email app for corporate account. This app not only helps you in managing your emails, but also divides your work life from normal life, which can be accessed like switching between launchers.

From Play Store: Divide delivers the ultimate mobile productivity tool to get work done securely on your Android device. Check your work email, view your calendar, look up contacts and more, all in one encrypted workspace without worrying about your privacy or the threat of your company wiping your device. Divide syncs with Exchange ActiveSync, Google Apps, and Lotus Notes and offers a complete BYOD solution for individuals and IT.

Link: Divide

Wednesday, November 19, 2014

Java : Read from Excel (xls) file

Java : Reaf from Excel (xls) file

Reading from a text file is common. But, reading from an excel(.xls) file is not.
Recently, I got to do so. Little bit Google search and experimentation resulted in the following.

I used HSSF from Apache-POI.
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

public void readFromXlsFile (String pathToFile, String sheetName){
    try {
        FileInputStream file = new FileInputStream(pathToFile);

        HSSFWorkbook workbook = new HSSFWorkbook(file);
        HSSFSheet sheet = workbook.getSheet(sheetName);

        Iterator<Row> rowIterator = sheet.rowIterator();
           
        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();

            if (row.getRowNum() == 0) {
                continue;// skip first row, as it contains column names
            }

            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                if (cell.getColumnIndex() == 0) {
                    System.out.print(cell.getStringCellValue() + "\t\t");
                } else if (cell.getColumnIndex() == 1) {
                    System.out.print((long) cell.getNumericCellValue()+ "\t\t");
                } else if (cell.getColumnIndex() == 2) {
                    System.out.print((int) Math.round(cell.getNumericCellValue())+ "\t\t");
                }
            }
            System.out.println("");
        }

        file.close();

    } catch (FileNotFoundException fnfe) {
        fnfe.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
To run the above example, create a sheet in excel file with String, Long and Integer columns respectively.

To print column names, run a while loop with cell.getStringCellValue() on every cell in first row.

getStringNumericCellvalue() returns 'double' and you can see from the example that I've type-casted it to 'long' and 'int'.

To get a sheet by its index, use
getSheetAt(index)
in place of
getSheet(sheetName)

Tuesday, November 4, 2014

Mac Yosemite : Ugly turned out to be Uglier and Ugliest

Mac Yosemite : Ugly turned out to be Uglier and Ugliest
You might have read my review on Mac OSX Yosemite, The Good, bad and ugly.
Now it turned out to be UGLIEST.

No more words. Here's the image.
Mac Yosemite : Ugly turned out to be Uglier and Ugliest

If you are on Yosemite, you might be familiar with it.
Most of the times, you get stuck on boot logo.
I've seen complaints regarding it saying that fellow members are ignorant of it and they deny such possibility, even though many are still facing it.

Workarounds suggested by our online friends:
  • Just reboot your mac as many times it takes to your desktop.
  • Boot into safe mode, by holding SHIFT and then reboot.
Comment your workaround below, mine is the first one.

If you are still on Mavericks, be there till Apple provides a fix for this.