суббота, 22 октября 2016 г.

Драйвера Realtek RTL8723BE на Ubuntu

Недавно купил себе новый ноутбук HP. Все просто отлично! Доволен как слон. Поставил я на него сходу Kubuntu 16.04 и тут оказывается, что не работает wifi адаптер. Он как бы работает, но только в непосредственной близи от роутером, а если отойти на несколько шагов, то сигнал пропадает. Погуглив и разобравшись с проблемой я выяснил, что нужно просто обновить драйвера для адаптера и изменить некоторые настройки. В этой статье я опишу как это сделать.

пятница, 13 мая 2016 г.

Overlay для HTML контента

Я думаю каждый web-разработчик, рано, или поздно сталкивается с ситуацией когда, во время длительного процесса выполнения какой то операции, нужно перекрыть некий контент страницы. При этом, элементы управления в этом контенте становятся недоступными для пользователя. Как пример можно рассмотреть случай, когда данные в HTML таблице можно редактировать в самой же таблице. Как только пользователь отправит изменения на сервер, мы должны перекрыть всю таблицу, тем самым делая её недоступной для взаимодействия пока изменения не будут сохранены. Вот как это выглядит:

Обратите внимание, что на рисунке перекрыта только таблица, а не вся страница!

Вот какой должна быть HTML разметка и стилизация нашей таблицы:

<div class="overlay-wrapper">
    <div class="overlay-pane">
        <span class="overlay-loader"></span>
        <img src="../../images/ajax-loader.gif" />
    </div>
    <table class="overlay-content">
        <tr>
            <th>#</th>
            <th>Name</th>
            <th>Power</th>
            <th>Actions</th>
        </tr>
        <tr>
            <!-- Остальной контент таблицы --!>
        </tr>
    </table>
</div>

И соответсвующие CSS классы:

.overlay-wrapper {
  position: relative;
}

.overlay-pane {
  width:100%; 
  height: 100%; 
  position: absolute; 
  z-index: 2; 
  left: 0; 
  top: 0; 
  background-color: #FFFFFF; 
  opacity: .7; 
  text-align: center;
}

.overlay-loader {
  display: inline-block; 
  height: 100%; 
  vertical-align: middle;
}

.overlay-content {
  position: relative; 
  z-index: 1;
}

При этом, чтобы убрать перекрытие достаточно спрятать блок с класом overlay-pane.

Надеюсь кому-то пригодится.

воскресенье, 13 марта 2016 г.

Вход в систему по полям username или email

В предыдущей статье я подробно описал как можно заменить дефолтную модель пользователя django.contrib.auth.models.User своей собственной. Делали мы это для того чтобы изменить встроенное (из коробки) поведение фреймворка.

В этой статье, я хочу описать процесс реализации варианта использования, когда вход в систему пользователь может осуществить по одному из полей username, или email. Делается это очень просто — определением кастомного бэкенда аутентификации.

Следует отметить, что такого рода аутентификация возможна только в том случае, если username или email однозначно идентифицируют одного пользователя системы. Дефолтное (из коробки) поведение Django не разрешает этого добится, поскольку, в модели django.contrib.auth.models.User поле email не объявленно уникальным. Для реализации такой аутентификации, сперва необходимо заменить модель пользователя. Как это сделать описано в предыдущей статье.

Итак, допустим, мы имеем в проекте приложение под названием security. В нем создадим файл auth_backends.py в котором мы разместим наш бэкенд UsernameEmailAuthenticateBackend:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q


class UsernameEmailAuthenticateBackend(ModelBackend):
    def __init__(self):
        self.UserModel = get_user_model()

    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = self.UserModel.objects.get(Q(username=username) | Q(email=username))
            if password is not None:
                if user.check_password(password):
                    return user
            else:
                return user
        except self.UserModel.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return self.UserModel.objects.get(pk=user_id)
        except self.UserModel.DoesNotExist:
            return None
Как только мы реализуем этот бэкенд, настроим проект на его использование. Для этого, в файле settings.py определим кортеж AUTHENTICATION_BACKENDS таким образом:
...
AUTHENTICATION_BACKENDS = (
    'security.auth_backends.UsernameEmailAuthenticateBackend',
)
...

Это все. Теперь, Django будет использовать наш бэкенд для аутентификации пользователя.

вторник, 8 марта 2016 г.

Замена дефолтной модели User

Каким бы замечательным и продуманным ни был фреймворк, какие бы инструменты он не предоставлял из коробки, рано или поздно приходится вмешатся в его архитектуру и внести кое какие изменения. В этом смысле, Django, далеко не исключение. Вот небольшой пример. Допустим, нам нужно реализовать аутентификацию не по дефолтному полю username, а, скажем, по полю email. Для этого, нам уже потребуется определить свой класс пользователя и заменить им дефолтный класс django.contrib.auth.models.User.

В этой статье я подробно опишу как это сделать. Для примера, рассмотрим все тот же вариант использования, когда нужна аутентификация по полю email. Весь код класса я решил разбить на четыре части для удобства читаемости. Ничего особенного в этом классе нет. За исключением нескольких измененных строк, он один в один идентичен классу django.contrib.auth.models.AbstractUser. Вот как будет выглядеть реализация этого класса:

from django.db import models
from django.contrib.auth.models import UserManager
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.utils.translation import ugettext_lazy as _
from django.core import validators
from django.utils import timezone
from django.core.mail import send_mail

Создаваемый нами класс должен наследоватся от AbstractBaseUser и PermissionsMixin. Также, необходимо внести изменения в определения полей email и username:

class BaseCustomUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username, password and email are required. Other fields are optional.
    """
    email = models.EmailField(
        _('Email Address'), unique=True,
        error_messages={
            'unique': _("A user with that email already exists."),
        }
    )
    username = models.CharField(_('username'), max_length=30, unique=True, blank=True, null=True,
        help_text=_('Required. 30 characters or fewer. Letters, digits and '
                    '@/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(r'^[\w.@+-]+$',
                                      _('Enter a valid username. '
                                        'This value may contain only letters, numbers '
                                        'and @/./+/-/_ characters.'), 'invalid'),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        }
    )

Обязательно вносим изменения в поля USERNAME_FIELD и REQUIRED_FIELDS, как показано ниже:

    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    is_staff = models.BooleanField(_('staff status'), default=False,
        help_text=_('Designates whether the user can log into this admin site.'))
    is_active = models.BooleanField(_('active'), default=True,
        help_text=_('Designates whether this user should be treated as '
                    'active. Unselect this instead of deleting accounts.'))
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

В остальном коде, в классе Meta, изменим значение поля abstract на False:

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        abstract = False

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        full_name = '{0} {1}'.format(self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        "Returns the short name for the user."
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """
        Sends an email to this User.
        """
        send_mail(subject, message, from_email, [self.email], **kwargs)

Итак, для большей уверенности, что я делаю все правильно, я просто копирую весь код класса django.contrib.auth.models.AbstractUser и вношу нужные изменения. Конечно же, первое что приходит на ум, когда мы копируем код какого либо класса: "А не лучше будет унаследоватся от этого класса и переопределить нужные поля и методы?". К сожалению, согласно замечанию:

In normal Python class inheritance, it is permissible for a child class to override any attribute from the parent class. In Django, this is not permitted for attributes that are Field instances (at least, not at the moment). If a base class has a field called author, you cannot create another model field called author in any class that inherits from that base class.

на данный момент, невозможно унаследоватся от модели и переопределить поля или методы.

Как только мы создали свою модель, мы готовы подключить её в систему. Для этого, в файле settings.py, указываем Django использовать именно наш класс:

...
AUTH_USER_MODEL = 'security.CustomUser'
...

Теперь, вход в систему и регистрация будет осуществлятся исключительно по полю email вместо дефолтного поля username.

Существует возможность реализовать вариант использования, когда вход в систему производится по полю email или username. Как это сделать читайте в следующей статье.

понедельник, 12 октября 2015 г.

Установка и настройка Bower

Bower — это система управления JavaScript пакетами. Если вам приходилось работать с Composer, то Bower — это то же самое, только для JavaScript пакетов.

Использовать Bower очень удобно в командных проектах которые зависят от множества JavaScript библиотек. Всё что вам необходимо, это файл проекта bower.json, в котором отмечены все JavaScript зависимости, а об остальном позаботится bower. Bower сам закачает указаные зависимости нужной версии и аккуратно положит их в папку bower_components.

В этой статье я опишу весь процесс установки Bower, а также рассмотрю как настроить Bower для прокси.

Установка Bower на Windows

Прежде всего необходимо установить Node.js. Скачайте установщик с офф-сайта и запустите его. Установка особых настроек не требует, принимайте все по умолчанию. После того как Njde.js установится нужно перезагрузить машину.

В принципе, можно приступить к установке Bower. Для этого в консоли, под администратором, введите команду:

npm install -g bower

Если вы соединены с интернетом через прокси, то для корректной работы npm вам нужно настроить его. Для этого, выполните в терминале такие команды:

npm config set proxy http://<proxy_host>:<proxy_port>
npm config set https-proxy http://<proxy_host>:<proxy_port>

При этом bower установится глобально для целой системы. Это значит, что вы можете вызывать его из любой папки.

Опять же, насчет прокси. Чтобы настроить bower на работу через прокси, создайте файл %HOMEPATH%\.bowerrc со следующим содержимым:

{
  "proxy":"http://<proxy_host>:<proxy_port>",
  "https-proxy":"http://<proxy_host>:<proxy_port>"
}

Это все. Bower готов к работе.

Установка Bower на Ubuntu

Команда для установки nodejs

$ sudo apt-get install nodejs

После установки nodejs нужно создать символическую ссылку на исполняемый файл nodejs следующим образом:

$ sudo ln -s /usr/bin/nodejs /usr/bin/node

Для установки Bower необходимо установить npm командой:

$ sudo apt-get install npm

Если вы соединены с интернетом через прокси, то для корректной работы npm вам нужно настроить его. Для этого, выполните в терминале такие команды:

$ npm config set proxy http://<proxy_host>:<proxy_port>
$ npm config set https-proxy http://<proxy_host>:<proxy_port>

Только теперь, с помощью npm, вы можете установить bower такой командой:

$ sudo npm install -g bower

При этом bower установится глобально для целой системы. Это значит, что вы можете использовать его из любой папки.

Прокси настройки. Для того, чтобы bower корректно работал через прокси, создайте в своем домашнем каталоге файл .bowerrc со следующим содержимым:

{
  "proxy":"http://<proxy_host>:<proxy_port>",
  "https-proxy":"http://<proxy_host>:<proxy_port>"
}

Теперь Bower готов к работе.

пятница, 18 сентября 2015 г.

Удаление Ubuntu с компьютера

Предположим, что вы установили Ubuntu рядом с Windows на реальную машину. Попользовались некоторое время и вам не понравилось. В итоге вы приняли решение удалить Ubuntu с диска чтобы освободить место на диске.

Процесс удаления не менее ответственный чем процесс установки. Вам приходится работать с реальным жёстким диском, а это чревато потерей данных.

Прежде чем производить любые действиям на реальном компьютере, я настоятельно рекомендую хорошенько потренироваться на виртуальной машине. Также, обязательно сделайте резервную копию важных данных.

Для того чтобы проводить эксперимент по удалению Ubuntu, мы должны сконструировать модель нашей ситуации на VirtualBox. Итак, создадим виртуальную машину, установим на неё Windows 7, а потом установим Ubuntu рядом с Windows. Имея работоспособную модель можно без какой либо опаски пробовать удалять Ubuntu.

Удалить физически Ubuntu с жёсткого диска не составляет большого труда. Для этого просто нужно удалить все разделы жёсткого диска на которые устанавливалась Ubuntu. Это дело нескольких кликов мыши. Проблема состоит в том, чтобы восстановить главную загрузочную запись (MBR — Master Boot Record) жёсткого диска для загрузки Windows. Вообще то, и это не проблема, если есть специальная утилита BootRec.exe

Утилита BootRec.exe входит в любой дистрибутив Windows начиная с Vista. Если у вас есть установочный диск Windows, то вы можете взять её оттуда, или же скачать по ссылке.

Теперь, когда у нас есть утилита BootRec.exe, мы можем приступать к удалению Ubuntu. Но прежде чем начать, нам надо позаботится о том, чтобы скопировать утилиту в гостевую ОС, так как запускать её мы будем именно на гостевой ОС. Самый простой способ как это сделать заключается в том, чтобы "зашарить" папку между основной и гостевой ОС. Таким образом, мы сможем передавать в гостевую ОС файлы из основной ОС. Давайте сделаем это.

В первую очередь, необходимо установить дополнения для гостевой ОС. Для нашего эксперимента достаточно установить дополнения только для Windows. После того как дополнения были установлены, откроем настройки нашей виртуальной машины и перейдем в Общие папки, как на рисунке:

Откроется диалог в котором нужно будет выбрать папку:

В моем, конкретном случае, я создал новую папку share:

В результате, у меня появилась одна общая папка:

Теперь, скопируем в эту общую папку скачанную утилиту BootRec.exe. Если мы запустим виртуальную машину и загрузим Windows 7, то в проводнике увидим папку share, как на рисунке:

Давайте, в гостевой ОС, скопируем утилиту BootRec.exe из папки share в корень диска D:\. Это упростит для нас доступ к ней.

Только теперь, мы можем удалять разделы на которых установлена Ubuntu. Откроем для этого оснастку "Управление компьютером":

В этой оснастке выберем "Управление дисками":

И поочередно будем удалять тома на которых установлена Ubuntu. В нашем случае это три первых тома. Будьте внимательны. Следите за тем чтобы случайно не удалить тома "C:\", "D:\" и "Зарезервировано системой"

При каждом удалении система попросит подтвердить действие:

После того как удалим тома, необходимо удалить раздел свободного пространства:

Опять же, система попросит подтвердить действие:

В итоге мы получим не распределенное пространство на диске. Расширим диск D:\ этим пространством:

При этом запустится мастер расширения тома, в котором принимаем все по умолчанию:

После расширения тома мы получим такую разметку диска:

Только теперь пришло время воспользоватся утилитой BootRec.exe. Запускать её нужно в консоли с правами администратора. Чтобы открыть консоль с правами администратора, нажмите клавишу Win, введите строку cmd и нажмите сочетание клавиш Ctrl + Shift + Enter. Когда откроется консоль, последовательно выполните такие команды:

Все! Теперь можете смело перезапустить виртуальную машину и загрузится Windows. Ничего сложного.

понедельник, 14 сентября 2015 г.

Windows и Ubuntu на одном компьютере

В этой статье я хочу описать процесс установки на одну виртуальную машину VirtualBox двух операционных систем, а именно: Windows 7 и Ubuntu. Зачем это нужно? Тем самым мы можем подготовится к установке на реальный компьютер нескольких различных ОС.

Не редкая ситуация, когда на реальном компьютере уже установлена, например, Windows 7 и возникло желание поставить рядом с ней Ubuntu, или другую Linux-подобную систему. При этом есть риск потери данных, или вообще приведение уже установленной ОС к нерабочему состоянию. Чтобы свести такой риск к минимуму я рекомендую сначала потренироваться на виртуальной машине.

Прежде чем приступать к установке на реальную машину двух ОС, я настоятельно рекомендую потренироваться сперва на виртуальной машине.

Итак, предположим, что вы создали новую виртуальную машину на VirtualBox, установили на неё Windows 7 и собираетесь установить рядом с ней Ubuntu. Что для этого нужно. В первую очередь необходимо скачать iso образ дистрибутива Ubuntu с офф-сайта по ссылке. После чего, в настройках виртуальной машины, в разделе Носители, нужно установить этот iso образ в оптический привод, как показано на рисунке:

Теперь машина готова к запуску. Запускаем её и приступаем к установке.

  1. Загрузка файлов;
  1. Выбор языка;
  1. Подготовка к установке;
  1. На этом этапе предлагается выбрать тип установки. Выбираем "Другое" и жмём "Продолжить". Таким образом мы перейдем в ручной режим разметки диска. В принципе, это самый важный и интересный момент в процессе установки;
  1. Разметка жёсткого диска. На этом этапе будет уместным почитать о разметке диска в Ubuntu, или, более подробно, про разделы жесткого диска и файловые системы.

Обратите внимание, что мы разбиваем на разделы не реальный жёсткий диск вашего компьютера, а виртуальный, созданный при создании виртуальной машины. Все производимые на этом этапе изменения никак не повлияют на реальный диск.

  1. 5. 1. На рисунке видно, что на жёстком диске sda, на три основных раздела sda1, sda2, sda3 установлена Windows. При этом, по размеру разделов, мы можем сделать вывод, что sda2 это диск C:\, а sda3 — D:\. Поскольку свободного места для установки Ubuntu на диске больше нету, то придется разделить диск D:\ ( раздел sda3). Выберем, как показано на рисунке, раздел sda3 и нажмём на кнопку "Change...";
  1. 5. 2. В открывшемся диалоге необходимо указать сколько мегабайтов мы хотим оставить для диска D:\. В нашем случае, мы оставляем для диска D:\ 10000 Mb, а остальные 22713 Mb освобождаем под Ubuntu;
  1. 5. 3. Прежде чем внести какие либо изменения на диске, система попросит подтвердить действие. Нажимаем кнопку "Продолжить";
  1. 5. 4. В итоге мы получили 22714 Mb свободного пространства. Для установки Ubuntu требуется минимум 2 раздела: корневой раздел (системный) и раздел подкачки (swap). Это значит, что нам придется разбить свободное пространство на два раздела. Выбираем из списка "Свободное пространство" и жмём "+", как показано на рисунке:
  1. 5. 5. В открывшемся диалоге установим все так, как показано на рисунке;
  1. 5. 6. После этого получим следующее. Теперь нам необходим раздел подкачки (swap). Выберем "свободное пространство" и нажмём "+", как на рисунке:
  1. 5. 7. На область подкачки нужно выделить не менее количества оперативной памяти. В нашем случае, когда машина имеет 1000 Mb ОЗУ, мы столько же выделяем под swap. Итак, в открывшемся диалоге установим все так, как показано на рисунке и нажмём на кнопку "Продолжить":
  1. 5. 8. Выше я упоминал, что для установки Ubuntu достаточно два раздела: root (системный раздел) и swap (область подкачки). То-есть, уже сейчас мы можем приступить к установке системы. Тем не менее, я решил создать ещё один раздел под домашние папки пользователей. Итак, делаем по накатанной уже схеме, как на рисунке:
  1. 5. 9. Открывшийся диалог приводим к такому виду:
  1. 5. 10. В итоге, мы получили разметку диска как на рисунке. Напоследок жмём "Установить сейчас".
  1. 5. 11. Установщик предложит подтвердить внесенные изменения и приступит к установке системы.
  1. Выбор часового пояса;
  1. Установка разметки клавиатуры;
  1. Создание пользователя и установка пароля;
  1. Процесс установки;

По завершению установки нужно будет перезагрузить машину. После перезагрузки появится диалоговое окно в котором можно выбрать какую ОС необходимо загружать.

Вот и все. Ничего сложного. Пробуйте и вы.

Ярлыки

Популярные записи