вторник, 31 декабря 2019 г.

No module name '_ctypes' while creating new virtualenv

When I tried to create virtualenv with python3.7 (
virtualenv -p /usr/local/bin/python3.7
on one of my fresh VPS I faced
no module name '_ctypes'
You should perform these steps to fix it:
sudo apt-get update
sudo apt-get install libffi-dev
If you still have same error then you probably installed python3.7 by yourself from source codes. If so just repeat this installation:
cd /usr/src
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
sudo tar xzf Python-3.7.4.tgz
cd Python-3.7.4
sudo ./configure --enable-optimizations
sudo make altinstall
:hint if you have more than one cpu core, then you can speed up make stage by:
sudo make altinstall -j <number_of_cores>
:hint
cat /proc/cpuinfo
- shows you the information about your CPUs

среда, 18 декабря 2019 г.

postgresql - permission denied for sequence

Если ты столкнулся с %%permission denied for sequence %%, то значит, что ты используешь в табличке автоинкремент ( тип %%SERIAL%% или %%BIGSERIAL%% ) и тебе нужны соответствующие гранты соответствуюшему пользователю: %%grant all privileges on sequence to %%

postgresql - permission denied for relation

Если ты столкнулся с %%permission denied for relation%% , то попробуй дать соответствующему юзеру: %%grant all privileges on table to ;%%

среда, 4 декабря 2019 г.

python3 f-string 'invalid syntax'

If you faced 'invalid syntax' while using f-strings in python3 then you probably have ancient python version installed. f-strings feature appeared in 3.6 So you have to install a new python to be able to use f-strings in your code: For example, you are in Ubuntu ( or some other deb-based distrib ):
sudo wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz sudo tar xzf Python-3.7.4.tgz cd Python-3.7.4 sudo ./configure --enable-optimizations sudo make altinstall # not to replace default python

среда, 30 октября 2019 г.

Raw query must include the primary key

Как и любое достижение прогресса ORM-ы в каких-то кейсах хороши и удобны, а в некоторые моменты - раздражают. Например, когда речь о Django и случае, когда ты хочеш выполнить raw-запрос с группировкой ( чтобы не париться с нечевидными annotate и импортом нужных агрегатных функций ) . Пример:
r = CourseStudent.objects.raw("select course_id, count(*) as c from coursestudent group by course_id order by c")
В ответ мы видим:
Raw query must include the primary key
WTF? Как я вам воткну pk в запрос с группировкой по произвольному ключу ? К счастью, обойти просто - вот такой запрос спокойно отработает:
r = CourseStudent.objects.raw("select course_id as id, count(*) as c from coursestudent group by course_id order by c")
- мы немного схимичили, и навесили на произвольный ключ alias, такой же как pk таблицы, к которой мы делаем наш произвольный запрос

вторник, 29 октября 2019 г.

Migration is applied before its dependency on database

Разбираемся с ошибкой
Migration B is applied before its dependency A on database
Django version 1.11 Поселектив табличку %%django_migrations%% можно выяснить точную хронологию применения миграций и дальше выправить ее руками. Автоматически такое разрулить, по-видимому, не выйдет.

суббота, 16 января 2016 г.

Еще раз про юникод в perl и злосчастный Wide character in subroutine entry

Многие perl скриптеры  порой впадают в ступор от Wide character in subroutine entry. Хорошо, если знают хотя бы примерно о том, что такое Wide character, хуже , если нет. Хорошо, если начинают копать матчасть и разбираются с в общем-то нехитрой работой с юникодом в perl, хуже, если начинают наобум тыкать в use utf8, encode/decode... На выходе порой может получиться забавная инструкция с кучей вызовов на всякий случай.. она может даже будет работать, но подобный модуль будет доставлять всем вокруг головную боль. Итак, все просто: 1. если имеешь дело с данными из внешнего источника - проверяй их перед употреблением на is_utf8 и дальше действуй по обстоятельствам: либо кодируй, либо декодируй - но осознанно. 2. если имеешь дело со строковыми константами , то достаточно сказать use utf8 , чтобы для интерпретатора все константы скрипта были помечены не как последовательность байт, а именно как юникод-строка. 3. чтобы перевести в последовательность байт из юникода - decode 4. чтобы перевести из последовательности байт в юникод - encode помните о том, кто будет вас дергать и описывайте свои входы и выходы а также свою политику относительно внутренней работы со строками ( работаете как с последовательностю байт или как со юникод-строками ) и все будет хорошо.

четверг, 18 июля 2013 г.

Классическая проблема верстки - выравнивание блоков

Часто встречается ситуация, когда некий контейнер "набивается" float-ом дочерними элементами . На макете все красиво и ровно. На практике, после того как начинается работа с реальным контентом (например содержимое категории товаров в магазине), то однотипные блоки получаются разными по высоте. Проблему можно решить принудительным транкейтом содержимого, подбором "максимальной" фиксированной высоты или javascript-ом. Пример кода, решающего подобную проблему (используется jQuery):

//делаем высоту всех .thumbnail одинаковой
   var  max_height = 0;
 $('.thumbnail').each(function(){
    h = $(this).height();
   if(h > max_height){
     max_height = h;
    };
   });
 $('.thumbnail').css('height',max_height);

Этот код хорошо отработает , например , в IE, а вот Chrome могут быть проблемы, если в .thumnail внутри есть изображение. На момент вычисления height оно еще может быть не загруженным и поэтому полученные величины height и width могут очень удивить верстальщика :) Поэтому код надо модифицировать , например, вот так:

$(document).ready(function(){
//делаем высоту всех .thumbnail одинаковой только после полной загрузки всей страницы
   var  max_height = 0;
 $('.thumbnail').each(function(){
    h = $(this).height();
   if(h > max_height){
     max_height = h;
    };
   });
 $('.thumbnail').css('height',max_height);
});

вторник, 9 июля 2013 г.

Unable to find vcvarsall.bat

Часто при установке некоторых python-библиотек (PIL, django-imagestore .. ) под windows возникает ошибка:

Unable to find vcvarsall.bat

Причина отсутствии или невозможности при установке найти нужный Сишный компилятор, который как правило есть  в поставке MS VS.

Для решения проблемы совсем необязательно ставить "студию". Можно обойтись компилятором mingw:


  1. качаем отсюда и ставим
  2. скачиваем нужную python - библиотеку и выполняем для ее setup.py :

setup.py install build --compiler=mingw32

Перед этим не забудьте прописать путь к mingw32.exe в PATH (например C:\mingw\bin)

четверг, 4 июля 2013 г.

django-rest-framework - некоторые особенности

Как и обещал ранее дамплю все грабли и особенности , которые возникают в ходе освоения этого фреймфорка.

Сразу отмечу, что авторы этого приложения большие молодцы - документация на фреймворк сделана в виде пошагового туториала - фактически онлайн учебника. На первых шагах все делается стандартными механизмами. И дальше, по мере продвижения, авторы упрощают код с помощью многочисленных "плюшек" , которые предоставляет их приложение. Советую для лучшего понимания и во избежание последующего недопонимания :) именно так и поступать, а не копипастить конечные синтаксические конструкции.
Хотя при этом могут и проблемы возникнуть . Например, на одном из шагов авторы предлагают реализовать rest-вьюхи  как обычные function-based django views, сопровождая их декоратором api_view. Этот шаг - исключение и его лучше пропустить, сразу перейдя к class based views , иначе возникнет ошибка:

Cannot apply DjangoModelPermissions on a view that does not have `.model` or `.queryset` property.
Но и после перехода в class-based views не забываем указывать model или queryset в полях вьюшного класса.

Unicode

Для того, чтобы в отдаваемом REST-ом контенте корректно отображался Unicode необходимо в settings явно прописать UnicodeJSONRenderer.
Например:

REST_FRAMEWORK = {
 
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.UnicodeJSONRenderer',
    )
}