Tuesday, July 16, 2019

My first day at the ajapaik developer camp 2019 in Nõva. Kimmo, Märt, Joel, Vahur and Katrin started already yesterday. The camp lasts until Thursday.

I will work on #3123 (Authentication issues in ajapaik).

What is django-allauth?

First I had to learn the following.

Ajapaik uses django-allauth while in Lino we use python-social-auth.

I read an interesting discussion on reddit about the difference. The opening question is “In the last years the standard recommendation for Social Authentication in Django has been django-allauth. However now that python-social-auth and the corresponding Django implementation social-app-django are under active development again I would like to know if anyone has more experience with it.”

Some interesting answers:

None of them are perfect. Django-allauth is cool unless you need OpenID Connect or something else non-trivial, then you’ll have to dig it out and implement it yourself or navigate the sprawling forest of forks..

It seems that Django-Allauth is lacking integration with Django-REST-Framework, while Python Social Auth has a library which integrates authentication for REST API later.

Installing a development environment

There are some problems related to authentication. Mostly irritating or wrong error messages when users try to sign in using some edge case situation.

But how can I see the problem?

A nice thing that the ajapaik project now uses Docker to provide a development environment.

Kimmo’s cheat sheet for installing Ajapaik docker locally. (my current steps + i will add also secrets; OS: Ubuntu 18.04):

$ git clone https://github.com/Ajapaik/ajapaik-web.git
$ get checkout WIP-xxx
$ cd ajapaik-web
$ mkdir docker/solr/data
$ chmod a+w docker/solr/data
$ cp ajapaik/settings/local.py.example ajapaik/settings/local.py
$ cp ajapaik/ajapaik/client_secrets.json.example ajapaik/ajapaik/client_secrets.json
$ sudo docker-compose up --build

At this point I had to first install Docker correctly: “sudo apt purge docker”, then add the docker repository to apt sources and “sudo apt install docker-ce”. Thanks to this.

Then the docker container had a failure during installation of dlib. It was a Segmentation Fault during cmake:

/tmp/pip-install-6ijdxix3/dlib/dlib/global_optimization/../matrix/matrix_la.h:1187:56:
internal compiler error: Segmentation fault

There were warnings about an obsolete pip version, so I tried inserting “pip install -U pip”. The ajapaik project uses several Dockerfiles, the file docker/dlib/Dockerfile contains multiple FROM statement (a feature called multi-stage builds). So it wasn’t evident to understand which Dockerfile was being processed. I tried several times, including after clearing the docker cache:

$ sudo docker image prune -a
$ sudo docker container prune
$ sudo docker volume prune
$ sudo docker system prune  -a

But the old pip version wasn’t the culprit.

I noticed that I get the same error when I simply try “pip install dlib” in a terminal on my machine.

It worked once after installing all the system packages described on this page by Adrian Rosebrock on January 22, 2018:

$ sudo apt-get install build-essential cmake
$ sudo apt-get install libopenblas-dev liblapack-dev
$ sudo apt-get install libx11-dev libgtk-3-dev
$ sudo apt-get install python python-dev python-pip
$ sudo apt-get install python3 python3-dev python3-pip

But then it turned out that it worked because I also had restarted my notebook after above step, and because I had not yet started PyCharm. PyCharm was the culprit. It is very hungry for memory. I have only 8 MB of RAM after all. I did several more tests and I close this issue with the assumption that “pip install dlib” fails when other memory-hungr software is running, e.g. PyCharm and Thunderbird.

In the waiting times I read the docker documentation. I learned that docker-compose runs the container described by the Dockerfile and connects it to the outside world as described in the docker-compose.yml file. The --build options causes it to build the image when needed.

The ajapaik project uses a solr service.

https://www.pyimagesearch.com/2018/01/22/install-dlib-easy-complete-guide/

Optimizing the face recognition feature

After a brainstorming with Vahur and some surfing and digging (e.g. here), I suggest the following changes:

Add a new table “Persons” (name, gender, birth_date, death_date, wikicommons_id, …)

Add a field FaceRecognitionRectangle.person (nullable FK to Person table).

Add a field Photo.author_id (nullable FK to Person table).

Write a script (admin command) which creates one Person for each Album for which there is at least one FaceRecognitionRectangle.

Add a field User.person_id (nullable FK to Person table). Users can link their account to a known person in their preferences.

What is the difference between subject_consensus and subject_ai_guess