Saturday, September 12, 2015

Kobo Aura review


About 6 months ago, I was given a Kobo Aura as a gift. It replaced the Nook Simple Touch that I had bought refurbished several years ago. Now that I've had the Kobo Aura for a while, I thought it would be a good time to write a review of it.

This isn't primarily a comparison with the Kindle Paperwhite, but being that the Paperwhite is the defacto standard for eReaders these days, a couple notes:
  • The specs of the Kobo Aura and the 2014 Kindle Paperwhite (the same year the Kobo Aura was released) are nearly identical (screen size and resolution, backlight, processor, storage, battery life).
  • I was happy to get a Kobo and not a Kindle, because the Kindle devices can effectively only read eBooks from Amazon, and if I were to buy my eBooks on Amazon, I wouldn't be able to read them on any other eReader other than a Kindle. I buy my eBooks from Google Play, Kobo, Barnes and Noble, and other publishers. I like having choices :)
Enough about that. Here are the things I love about the Kobo Aura:
  • The interface can be set to one of a number of languages, and it includes dictionaries as well as translations for multiple languages.
  • It has integrated Pocket support, which I love and use on a regular basis
  • When I first got the device there were a couple minor bugs, and I was pleasantly surprised to see they were fixed with a software update shortly after
  • It's priced competitively, cheaper than the Kindle Paperwhite and without ads
  • The backlight works great and can be turned off, unlike on the Kindle Paperwhite
  • The battery life is amazing
  • The Kobo store features are more subtle and less annoying than the Barnes and Noble features on the Nook Simple Touch
  • It has a micro SD card slot, which is nice although I haven't needed to use it yet. The Kindle Paperwhite doesn't have this.
Cons:
  • The bezels are flush with the screen. It looks nice, but because they're so thin it can be difficult to hold the device without accidentally touching the screen.
  • The screen doesn't always register touches. Most of the time pressing the screen once or twice will turn the page, but there have been times when I've had to touch the screen three or even four times before it would respond. If the device had physical page turn buttons this wouldn't be as big a deal, but pretty much all eReaders these days have eschewed them.
    Edit: I originally had a screen protector on my device and I believe it was causing touches not to register as well. Since I've removed it I rarely have to touch more than once or twice.
  • The screen backlight has a lot of blue light. To be fair, it's the same as all other eReaders, so it's more of a suggestion than a huge complaint. But I think it would make much more sense to have a more reddish light on an eReader that will be less disruptive to sleep cycles. Because of this, I normally leave the built-in backlight turned off, especially if I'm reading before bed.
Overall I'm quite happy with the Kobo Aura, despite its few shortcomings. I'd probably give it a 9/10.

If I were to buy an eReader right now, I'd go for the Kobo Glo HD:
  • Display is slightly recessed (unlike the Kobo Aura)
  • Improved resolution, matches the 2015 Kindle Paperwhite
  • Same retail price as the Kobo Aura
  • Although no advertised micro SD card slot, storage is expandable

Kobo Aura : mon avis


Il y a environ six mois, on m'a donné un Kobo Aura comme cadeau. Ça a remplacé le Nook Simple Touch que je l'avais acheté il y a plusieurs années. Maintenant que j'ai le Kobo Aura pour un certain temps, je pensais que ce serait un bon moment pour écrire mon avis.

Ce n'est pas essentiellement une comparaison avec le Kindle Paperwhite, mais étant que le Paperwhite est le standard de facto pour les liseuses ces jours, quelques notes :
  • Les spécifications du Kobo Aura et Kindle Paperwhite 2014 (la même année le Kobo Aura est sorti) sont presque identiques (taille et résoultion de l'écran, rétro-éclairage, processeur, stockage, la durée de la batterie).
  • Je suis heureux d'obtenir un Kobo et non un Kindle, parce que les appareils Kindle ne peuvent lire effectivement que des livres numériques d'Amazon, et si je devais acheter mes livres numériques sur Amazon, je ne pourrais pas les lire sur une autre liseuse autre qu'un Kindle. J'achète mes livres numériques de Google Play, Kobo, Barnes and Noble et d'autres éditeurs. J'aime avoir des choix :)
Bon, passons. Voici les choses que j'aime concernant le Kobo Aura :
  • L'interface peut être changer vers un certain nombre de langues, y compris des dictionnaires ainsi que des traductions pour des langues multiples.
  • Il inclut la fonctionnalité Pocket, que je aime et j'utilise sur une base régulière
  • Après j'ai reçu l'appareil, il y avait quelques bogues mineurs, et j'ai été agréablement surpris de voir qu'on les a corrigés avec une mise à jour logicielle peu de temps après
  • Il a un prix compétitif, moins cher que le Kindle Paperwhite et sans publicité
  • Le rétroéclairage fonctionne très bien et peut être désactivé, qui n'est pas possible sur le Kindle Paperwhite
  • L'autonomie de la batterie est incroyable
  • Les fonctionnalités de magasin Kobo sont plus subtiles et moins ennuyeux que les fonctionnalités de Barnes and Noble sur le Nook Simple Touch
  • Il dispose d'une fente pour cartes micro SD, ce qui est agréable bien que je n'en avais pas encore besoin de l'utiliser. Le Kindle Paperwhite ne dispose pas de ça non plus.
Les inconvénients :
  • Le bordure est au même niveau que l'écran. Il est joli, mais parce qu'il est si mince, il peut être difficile de tenir l'appareil sans toucher accidentellement l'écran.
  • L'écran n'enregistre pas toujours les touches. La plupart du temps appuyer sur l'écran une ou deux fois va tourner la page, mais il y a eu des moments où il fallait toucher l'écran trois ou même quatre fois avant qu'il répondait. Si l'appareil avait des boutons physiques pour tourner les pages ce ne serait pas un tel gros problème, mais à peu près tous les liseuses de ces jours ne les comprennent pas.
    Mise à jour : initialement j'avais un protecteur d'écran sur mon appareil et je crois qu'il a empêché les touches d'enregistrer aussi bien. Depuis que je l'ai enlevé, il faut rarement toucher l'écran plus d'une ou deux fois.
  • Le rétroéclairage de l'écran a beaucoup de lumière bleue. Pour être juste, il est le même que tous les autres liseuses, c'est donc plus une suggestion qu'une plainte énorme. Mais je pense que ce serait beaucoup plus logique d'avoir une lumière plus rougeâtre sur une liseuse qui sera moins perturbateur pour les cycles de sommeil. Pour cette raison, je laisse normalement éteint le rétro-éclairage, surtout si je lis avant de se coucher.
En général, je suis très heureux avec le Kobo Aura, malgré ses quelques inconvénients. Je le donnerais probablement un 9/10.

Si je devais acheter une liseuse en ce moment, je chercherais le Kobo Glo HD :
  • L'écran est légèrement en retrait (contrairement au Kobo Aura)
  • Amélioration de la résolution, correspond au Kindle Paperwhite 2015
  • Même prix ​​de détail que le Kobo Aura
  • Même si aucune fente pour carte micro SD annoncé, le stockage est extensible

Sunday, May 24, 2015

Moto G OTA update error


If you get an OTA (over-the-air) update for your Moto G and it fails, here's what you can do. First, a few requirements:

  • A Moto G. This may work with the Moto E or X as well. YMMV.
  • Retail Android. This goes without saying, but you won't get an OTA update unless you're running one of the stock/retail ROMs.
  • Your phone has been rooted or otherwise customized (custom boot logo, custom recovery, etc). This isn't a strict requirement, but it's probably the reason the update is failing in the first place.
  • These instructions were written for Linux, but they should run with minor adjustments on Mac and a few not-so-minor adjustments on Windows.
There are two main ways to go about resolving this:

Method 1: recommended
This method is the easiest and probably the fastest:
  1. (Recommended) Back up your phone in case something goes wrong

  2. Get the model number for your phone
    Settings → About phone → Hardware SKU

    Or:

  3. Get the build number for your phone
    SettingsAbout phoneBuild number

  4. Download the retail firmware for your phone corresponding to the phone's model and build numbers. You can download them from here:
    http://www.filefactory.com/folder/c6cdedc45a775d27

    For me, I had the Moto G XT1034 with build number KXB21.14-L1.61, so I downloaded this file:
    AWSRETAIL_XT1034_4.4.4_KXB21.14-L1.61_cid9_CFC.xml.zip

  5. Once the retail firmware has finished downloading, extract it

  6. Install the Android SDK tools

  7. Put your phone into fastboot mode. To do so, power off the phone, press and hold the volume down button, press power button, hold both for about 3 seconds and then let go

  8. Go to the folder where you extracted the retail firmware. Now we're going to restore the stock firmware without erasing the data partition (where all of your apps, settings, etc are stored):

    sudo fastboot flash boot boot.img
    sudo fastboot flash recovery recovery.img
    for file in system.img_sparsechunk.*; do sudo fastboot flash system $file; done
    sudo fastboot reboot


    If you're using Windows, you'll have to flash the system.img_sparsechunk files on at a time, for example:

    fastboot flash system system.img_sparsechunk.0
    fastboot flash system system.img_sparsechunk.1


    ... and so on.

  9. Now try the update again
    SettingsAbout phone → System updates

  10. If the update fails again, you have one of two options. If you don't mind wiping your phone and starting from scratch (which will erase everything), the easiest thing to do is to do fully restore the stock firmware. You'll put your phone into fastboot mode as before, but this time you're going to overwrite everything:

    sudo fastboot flash partition gpt.bin
    sudo fastboot flash motoboot motoboot.img
    sudo fastboot flash logo logo.bin
    sudo fastboot flash boot boot.img
    sudo fastboot flash bootloader bootloader.img
    sudo fastboot flash recovery recovery.img
    for file in system.img_sparsechunk.*; do sudo fastboot flash system $file; done
    sudo fastboot flash modem NON-HLOS.bin
    sudo fastboot erase modemst1
    sudo fastboot erase modemst2
    sudo fastboot flash fsg fsg.mbn
    sudo fastboot erase cache
    sudo fastboot erase userdata
    sudo fastboot reboot


    If, however, you don't want to completely wipe your phone and you don't mind getting your hands dirty, read on.

Method 2: advanced
  1. At a minimum, you will need to make sure the stock recovery is flashed. Follow the instructions above, flashing only the recovery:

    sudo fastboot flash recovery recovery.img
    sudo fastboot reboot

  2. Now try to apply the OTA update. If it fails, now the fun begins! First of all, if your phone isn't rooted, you'll need to root it to get access to the update log files. If you flash a custom recovery to root, then flash the stock recovery back (the OTA will fail with a custom recovery).

  3. Once your phone is rooted, connect to it using adb and look at the update log, which will be located in /cache/recovery/last_log

    adb shell
    su
    more last_log

  4. Look particularly at the end of the log file to see what went wrong. This is what mine said:

    script aborted: "/system/etc/install-recovery.sh" has unexpected contents.
    "/system/etc/install-recovery.sh" has unexpected contents.
    E:Error in /cache/Blur_Version.210.12.61.falcon_umts.AWSRetail.en.US.zip
    (Status 7)
    Installation aborted.


    You can see that apparently the file /system/etc/install-recovery.sh had been modified, probably from when I rooted the phone.

  5. If the file causing errors is in this list:
    • /system/bin/app_process32
    • /system/bin/app_process64
    • /system/bin/install-recovery.sh
    • /system/etc/install-recovery.sh

    • Then the problem is SuperSU itself, which modifies a bunch of files when it's installed. You'll need to restore the files from backup:

      cp /system/bin/app_process32_original /system/bin/app_process32
      cp /system/bin/app_process64_original /system/bin/app_process64
      cp /system/bin/install-recovery_original.sh /system/bin/install-recovery.sh
      cp /system/etc/install-recovery_original.sh /system/etc/install-recovery.sh

  6. If another file has been modified, you need to replace the original file. This will take some work. First, you'll need a special utility called simg2img. You can probably find a pre-built binary for your system. I just compiled it myself:

    sudo apt-get -y install build-essential git zlib1g-dev
    git clone https://android.googlesource.com/platform/system/core
    cd core/libsparse
    gcc -o simg2img -Iinclude simg2img.c sparse_crc32.c backed_block.c output_file.c sparse.c sparse_err.c sparse_read.c -lz
    sudo cp simg2img /usr/local/bin

  7. Go to the folder where you extracted the retail firmware, and you should have one or more files starting with system.img_sparsechunk. The next step is to combine them using simg2img:

    simg2img system.img_sparsechunk* system.raw.img.tmp

  8. Now we're going to extract the ext4 partition from the image file we made:

    offset=`LANG=C grep -aobP -m1 '\x53\xEF' system.raw.img.tmp | head -1 | awk '{print $1 - 1080}'`
    dd if=system.raw.img.tmp of=system.raw.img ibs=$offset skip=1

  9. Getting close! Now, we'll mount the image we just created:

    sudo mkdir /mnt/system
    sudo mount system.raw.img /mnt/system

  10. Now we should have access to all of the original files from the retail firmware. The next step is to copy them to the device. Here's what I did to copy /system/etc/install-recovery.sh:

    adb push /mnt/system/etc/install-recovery.sh /sdcard/

  11. Now connect to the device and get the mount point for the /system partition:

    adb shell
    mount | grep system

  12. Finally, remount /system as read-write, copy the file, and then remount /system as read-only. Don't forget to replace the mountpoints in my example (/dev/block/platform/msm_sdcc.1/by-name/system) with the mountpoint you got from the previous step:

    mount -o rw,remount /dev/block/platform/msm_sdcc.1/by-name/system /system
    cp /sdcard/install-recovery.sh /system/etc/install-recovery.sh
    mount -o ro,remount /dev/block/platform/msm_sdcc.1/by-name/system /system

  13. If you've made it this far, congratulations! Try the update again. Hopefully, as in my case, it will now work. If not, you'll have to look at the update log file again and see if there's anything else you missed. Thankfully it'll go much quicker now that you've already done all the prep work.

Moto G erreur de mise à jour OTA


Si vous recevez une mise à jour OTA (over-the-air) pour votre Moto G et il échoue, voici ce que vous pouvez faire. Tout d'abord, quelques exigences :

  • Un Moto G. Cela peut marcher avec le Moto E ou X ainsi.
  • Logiciel Android officiel. Vous ne recevez pas une mise à jour OTA sauf si vous avez Android officiel / stock.
  • Votre téléphone a été rooté ou autrement modifié (logo de démarrage modifié, recovery modifié, etc). Ce n'est pas une exigence stricte, mais c'est probablement la raison pour l'échec de la mise à jour en premier lieu.
  • Ces instructions ont été écrites pour Linux, mais ils doivent fonctionner avec des ajustements mineurs sur Mac et quelques ajustements pas si mineures sur Windows.
Maintenant les étapes :
  1. (Recommandé) Sauvegardez les données de votre téléphone au cas où quelque chose va mal

  2. Obtenez le numéro de modèle de votre téléphone
    1. Moto G 1st generation models
    2. Moto G 2nd generation models

  3. Obtenez le numéro de build pour votre téléphone
    ParamètresÀ propos du téléphoneNuméro de build

  4. Télécharger le firmware officiel pour votre téléphone correspondant au modèle du téléphone et le numéro de build. Vous pouvez le télécharger ici :
    http://www.filefactory.com/folder/c6cdedc45a775d27

    Pour moi, j'ai le Moto G XT1034 avec le numéro de build KXB21.14-L1.61, donc je l'ai téléchargé ce fichier :
    AWSRETAIL_XT1034_4.4.4_KXB21.14-L1.61_cid9_CFC.xml.zip

  5. Une fois le téléchargement du firmware officiel a fini, l'extrayez

  6. Télécharger Motorola fastboot (mfastboot), et l'extraire dans le même dossier que le firmware officiel
    https://www.androidfilehost.com/?fid=95916177934532795

  7. Mettez votre téléphone en mode fastboot. Pour ce faire, éteignez le téléphone, appuyez et maintenez le bouton d'alimentation, appuyez le bouton volume bas, tenir les deux à la fois pendant environ 3 secondes, puis lâcher

  8. Allez dans le dossier où vous avez extrait le firmware officiel. Maintenant, vous devez flasher ce que vous avez modifié. Dans mon cas, j'avais flashé un logo personnalisé et une recovery personnalisée, donc c'est ce que je faisais :

    chmod +x linux-fastboot
    sudo ./linux-fastboot flash logo logo.bin
    sudo ./linux-fastboot flash recovery recovery.img

  9. Si vous utilisez OS X, vous utiliserez osx-fastboot au lieu de linux-fastboot, et pour Windows, c'est mfastboot.

  10. Maintenant, essayez à nouveau la mise à jour
    Paramètres → À propos du téléphone → Mise à jour logicielles système

  11. Si la mise à jour échoue à nouveau, vous avez l'une des deux options. Si ça ne vous dérange pas d'effacer tous les données de votre téléphone et de partir de zéro, la meilleure chose à faire est de restaurer entièrement le firmware stock. Vous mettez votre téléphone en mode fastboot comme avant, mais cette fois vous allez écraser tout :

    sudo ./linux-fastboot flash partition gpt.bin
    sudo ./linux-fastboot flash motoboot motoboot.img
    sudo ./linux-fastboot flash logo logo.bin
    sudo ./linux-fastboot flash boot boot.img
    sudo ./linux-fastboot flash recovery recovery.img
    sudo ./linux-fastboot flash system system.img_sparsechunk.0
    sudo ./linux-fastboot flash system system.img_sparsechunk.1
    sudo ./linux-fastboot flash system system.img_sparsechunk.2
    sudo ./linux-fastboot flash modem NON-HLOS.bin
    sudo ./linux-fastboot erase modemst1
    sudo ./linux-fastboot erase modemst2
    sudo ./linux-fastboot flash fsg fsg.mbn
    sudo ./linux-fastboot erase cache
    sudo ./linux-fastboot erase userdata
    sudo ./linux-fastboot reboot


    Si vous avez des fichiers system.img_sparsechunk supplémentaires, assurez-vous de les tous flasher, par exemple :

    sudo ./linux-fastboot flash system system.img_sparsechunk.3
    sudo ./linux-fastboot flash system system.img_sparsechunk.4


    ... etc.

    Si, toutefois, vous ne voulez pas complètement effacer votre téléphone et ça ne vous dérange pas se salir les mains, lisez la suite.

  12. Maintenant, ça devient amusant ! Tout d'abord, si votre téléphone n'est pas rooté, vous aurez besoin de le rooter pour obtenir l'accès aux fichiers journals de la mise à jour.

  13. Une fois que votre téléphone est rooté, le connecter avec adb et regarder le journal de la mise à jour, qui sera situé dans /cache/recovery. Il y aura plusieurs fichiers journaux dans ce dossier, donc commencer avec le fichier le plus récent jusqu'à ce que vous trouviez celui que vous cherchez :

    adb shell
    su
    cd /cache/recovery
    ls -l
    more last_log.1

  14. Regardez en particulier la fin du fichier journal pour voir ce qui a mal tourné. Voici ce que le mien a dit :

    script aborted: "/system/etc/install-recovery.sh" has unexpected contents.
    "/system/etc/install-recovery.sh" has unexpected contents.
    E:Error in /cache/Blur_Version.210.12.61.falcon_umts.AWSRetail.en.US.zip
    (Status 7)
    Installation aborted.


    Vous pouvez voir que, apparemment, le fichier /system/etc/install-recovery.sh avait été modifié, probablement quand j'ai rooté le téléphone.

  15. Si comme moi votre journal d'erreur mentionne un fichier qui a été modifié, vous devez remplacer le fichier d'origine. Cela va prendre un certain travail. D'abord, vous aurez besoin d'un outil spécial appelé simg2img. Vous pouvez probablement trouver un binaire pré-construit pour votre système. Je l'ai simplement compilé moi-même :

    sudo apt-get -y install build-essential git zlib1g-dev
    git clone https://android.googlesource.com/platform/system/core
    cd core/libsparse
    gcc -o simg2img -Iinclude simg2img.c sparse_crc32.c backed_block.c output_file.c sparse.c sparse_err.c sparse_read.c -lz
    sudo cp simg2img /usr/local/bin

  16. Allez dans le dossier où vous avez extrait le firmware officiel, et vous devriez avoir un ou plusieurs fichiers commençant par system.img_sparsechunk. La prochaine étape est de les combiner à l'aide de simg2img :

    simg2img system.img_sparsechunk.* system.raw.img.tmp

  17. Maintenant, nous allons extraire la partition ext4 du fichier d'image que nous avons fait :

    offset=`LANG=C grep -aobP -m1 '\x53\xEF' system.raw.img.tmp | head -1 | awk '{print $1 - 1080}'`
    dd if=system.raw.img.tmp of=system.raw.img ibs=$offset skip=1

  18. Nous y sommes presque ! Maintenant, nous allons monter l'image que nous venons de créer :

    sudo mkdir /mnt/system
    sudo mount system.raw.img /mnt/system

  19. Maintenant, nous devrions avoir accès à tous les fichiers originaux du firmware officiel. La prochaine étape est de les copier sur le périphérique. Voici ce que j'ai fait pour copier /system/etc/install-recovery.sh :

    adb push /mnt/system/etc/install-recovery.sh /sdcard/

  20. Maintenant connecter à l'appareil et obtenir le point de montage pour la partition /system :

    adb shell
    mount | grep system

  21. Enfin, remonter /system en lecture-écriture, copier le fichier, puis remontez /system en lecture seule. Ne pas oublier de remplacer les points de montage dans mon exemple (/dev/block/platform/msm_sdcc.1/by-name/system) avec le point de montage que vous avez obtenu à l'étape précédente :

    mount -o rw,remount /dev/block/platform/msm_sdcc.1/by-name/system /system
    cp /sdcard/install-recovery.sh /system/etc/install-recovery.sh
    mount -o ro,remount /dev/block/platform/msm_sdcc.1/by-name/system /system

  22. Si vous avez rendu à ce point, félicitations! Essayez à nouveau la mise à jour. Espérons que, comme dans mon cas, il va maintenant travailler. Si non, vous devez regarder à nouveau le fichier journal de la mise à jour et voir si il y a autre chose que vous avez manqué. Heureusement ça va aller beaucoup plus vite maintenant que vous avez déjà fait tout le travail de préparation.

Saturday, November 8, 2014

Android: The import javax.annotation cannot be resolved


I was trying to compile some code from AOSP (Android Open Source Project), and I ran into this error:

The import javax.annotation cannot be resolved

Caused by this code:

import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.ThreadSafe;


The solution was actually really easy:
  1. Go here:
    http://mvnrepository.com/artifact/com.google.code.findbugs/jsr305

  2. In the Version column click on the latest version number

  3. Click Download ( JAR )

  4. Copy the downloaded JAR file to the libs folder in your Android project (create the libs folder if it doesn't already exist).

Android: The import javax.annotation cannot be resolved


J'essayais de compiler du code de AOSP (Android Open Source Project), et je suis tombé sur cette erreur :

The import javax.annotation cannot be resolved

Causée par ce code :

import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.ThreadSafe;


La solution était en fait très simple :
  1. Rendez-vous ici :
    http://mvnrepository.com/artifact/com.google.code.findbugs/jsr305

  2. Dans la colonne Version cliquez sur le dernier numéro de version 

  3. Cliquez sur Download ( JAR )

  4. Copiez le fichier JAR téléchargé au dossier libs dans votre projet Android (créez le dossier libs si elle n'existe pas déjà).

Saturday, November 1, 2014

Using Exchange without Outlook


There are some good alternatives to Microsoft Exchange, for instance Zimbra. If your experience is like mine, however, most places use Exchange. Up until now, there haven't been many good options for using Exchange without Outlook. Support for Exchange calendar integration in particular has been lacking. But now there's a great option for using Exchange without Outlook, and you can set it up in less than 15 minutes:

  1. Install Thunderbird

  2. Install the Lightning calendar extension
    1. Download it from here:
      https://www.mozilla.org/projects/calendar/

    2. To install, open the downloaded .xpi extension file with Thunderbird. If that isn't an option:
      1. Open Thunderbird and go to the Tools menu → Add-ons

      2. Click the button to the left of the Search bar → Install Add-on From File

      3. Browse to the extension file and select it → Open

      4. Click Install Now

      5. Click the Restart Now button near the top right

      6. When Thunderbird reopens, close the Add-ons Manager tab

    3. You can also install it as a package in Debian/Ubuntu/Elementary (I normally prefer to download it to get the latest version):
      sudo apt-get -y install xul-ext-lightning

  3. Install the Exchange EWS Provider extension
    1. Download it from here:
      https://github.com/Ericsson/exchangecalendar/releases

    2. Unzip it

    3. Follow the instructions above for installing the Lightning extension to install the Exchange EWS Provider extension

  4. Set up your Exchange email
    1. If you haven't set up your Exchange email address yet, you can do so by using the following instructions. You may need to get the server addresses (IMAP/POP/SMTP) from your system administrator or IT department:
      https://support.mozilla.org/kb/manual-account-configuration

  5. Set up your Exchange calendar
    1. Open Thunderbird and then open the Calendar tab (Events and Tasks menu → Calendar)

    2. Right-click in the Calendar section in the lower-left side of the screen → New Calendar

    3. Select On the Network → Next

    4. Select Microsoft Exchange 2007/2010/2013 → Next

    5. Give it a name, select your email address, and click Next

    6. Check Use Exchange's autodiscovery function, enter your primary email address, Active Directory username, and Active Directory domain name. Then click Perform autodiscovery

    7. Enter your password when prompted

    8. The EWS server URL should automatically be detected. When it is, click Select

    9. Enter your password again if prompted

    10. You should be brought back to the Create New Calendar dialog. Click Next → Finish

    11. Your calendar should now be populated with your Exchange calendar events

  6. Set up your Exchange address book
    1. In Thunderbird go to the Tools menu → Address Book

    2. Click Add Exchange contact folder

    3. Give it a name

    4. Check Add global address list to search results (otherwise, it will only use your personal address book in Exchange)

    5. Check Use Exchange's autodiscovery function

    6. Enter your primary email address, Active Directory username, and Active Directory domain name, then click Perform autodiscovery

    7. The EWS server URL should automatically be detected. When it is, click Select

    8. You should be brought back to the Exchange Contact Settings dialog. Click Save

    9. Now you can search for a contact in Exchange by selecting Exchange contacts on the left and then using the search box in the upper right. Contacts will also be auto-populated when composing new emails.
There are other options out there for Outlook alternatives. One I tried is DavMail Gateway. Compared to Exchange EWS Provider, however, it used a lot of memory because it ran as a Java application in the background. It also didn't handle calendar events as well; for instance, if a calendar event was moved to a different time, it would show up under the new time as well as the old time.