• Возможно ли развернуть два веб-сервера на 1 домене?

    neatsoft
    @neatsoft
    Life is too short for bad software
    кусок конфигурации с реального сервера:
    server {
        ...
        location /services {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
        ...
    }

    Документация: nginx reverse proxy
    Ответ написан
    5 комментариев
  • Как включить компьютер через 3g модем?

    neatsoft
    @neatsoft
    Life is too short for bad software
    TP-Link TL-MR3020, OpenWrt, Wake-on-LAN
    на роутер нужно установить OpenWrt, подключить и настроить модем
    на компьютере настроить и проверить Wake-on-LAN, подключить роутер к компьютеру витой парой и кабелем питания (usb)

    По моему опыту, некоторые сетевые карты прекрасно работают с WOL без всякой настройки, некоторые не позволяют выполнять холодный старт (в этом случае может помочь опция boot after power failure), некоторые не поддерживают WOL вообще. Перед покупкой железо желательно гуглить, если уже куплено - нужно проверить поддержку WOL до начала построения системы.
    Ответ написан
    Комментировать
  • Какой USB wifi-адаптер выбрать, чтобы без проблем работал на Ubuntu 16.04?

    neatsoft
    @neatsoft
    Life is too short for bad software
    TP-Link TL-MR3020 с LEDE (OpenWrt) в режиме клиента. Это, конечно, не совсем usb wi-fi адаптер, но зато работает без проблем. При подключении к usb дополнительный блок питания не требуется, потребление в пределах 200mA. Использую этот вариант более двух лет для подключения к сети нескольких Raspberry Pi в режиме 24x7.

    Если требуется поддержка 5GHz, MIMO, или 802.11ac, то либо Intel (M.2 или Mini PCIe), либо точка доступа с внешним питанием.

    P.S. Официальные драйвера - это то что есть в ядре, ath9k, например, или iwlwifi. Все остальное - шлак. Перед покупкой любое оборудование нужно гуглить.

    upd 2017: В продаже появился TP-Link TL-WR902AC - обновленный TL-MR3020 с поддержкой 5GHz и 802.11ac. Отлично работает под LEDE 17.01.2 ( https://lede-project.org/ ), энергопотребление низкое. Есть пошаговая инструкция по настройке клиентского режима - https://wiki.openwrt.org/doc/recipes/relayclient , в нижней части страницы ("Doing this via the Web GUI instead").
    Ответ написан
    Комментировать
  • Проблемна ли инвалидация кэша в Nginx?

    neatsoft
    @neatsoft
    Life is too short for bad software
    Только что закончил систему кэширования для высоконагруженного проекта на django + nginx, никаких проблем с инвалидацией не испытал. memcached + nginx microcaching. Принцип работы следующий:
    • nginx проверяет наличие данных в memcached с помощью memcached_pass, если нашел - возвращает;
    • django при рендеринге страницы помещает результат в memcached, при изменении - удаляет.

    В исходном виде у этой связки есть только одна проблема - обработка конкурирующих запросов. Если несколько клиентов одновременно попытаются запросить одну и ту же "непрогретую" страницу, то все запросы уйдут в бэкенд (ab -n 1000 -c 100). К счастью, nginx легко позволяет это предотвратить с помощью микрокэширования (uwsgi_cache_valid any 1s; uwsgi_cache_use_stale updating;). В бэкенд при этом уходит только самый первый запрос, параллельные получают результат из файлового кэша, последующие - из memcached. Не слишком элегантно, появляется дополнительный слой кэширования (файловый), но работает отлично. На реальных данных удалось получить ускорение в 1200 раз и неограниченную возможность масштабирования (с помощью дополнительных серверов с nginx в режиме микрокэширования между клиентом и основным сервером).
    Ответ написан
    Комментировать
  • Как отформатировать флешку под Убунтой?

    neatsoft
    @neatsoft
    Life is too short for bad software
    флэшка - это всего лишь последовательность байт (для операционной системы)
    если она исправна, то отформатировать ее можно следующим образом - Как удалить разбиение live-флешки?
    Ответ написан
    Комментировать
  • Как слегка изменить live-usb с Ubuntu, обновив образ под свои нужды?

    neatsoft
    @neatsoft
    Life is too short for bad software
    Существует два способа осуществления массовых инсталляций - клонирование и автоматизированная установка.

    Автоматизированная установка Debian и Ubuntu производится с помощью Preseed:
    Debian Installer Preseed
    Automating the installation using preseeding
    Preseed позволяет заранее задать ответы на вопросы инсталлятора, и выполнить дополнительные команды в процессе установки. При необходимости можно добавить в образ диска все необходимые пакеты, и сделать установку полностью автономной (без необходимости подключения к сети).

    Клонирование работает быстрее - полностью установленная и настроенная система просто копируется при этом с помощью dd на новый носитель, но имеет свои недостатки. Некоторые пакеты должны быть сконфигурированы в процессе установки уникальным образом, и не должны быть идентичными на разных компьютерах. Например, random-seed, base-passwd, и udev persistent-net. Можно написать скрипт, который будет подменять конфигурационные файлы после клонирования, но для для обычной Ubuntu это в любом случае будет костылем (хотя бывают специальные образы для облачных систем, которые изначально на это рассчитаны).

    Оба способа требуют довольно много времени на подготовку образа (т.к. приходится осуществлять множество итераций установка-проверка-исправление), и оправданы только в том случае, если требуется производить значительное количество установок. Для Ubuntu Desktop и Ubuntu Server лучше использовать Preseed.
    Ответ написан
    4 комментария
  • Аналог IrfanView для Ubuntu. Как быстро вырезать и сохранить фрагмент?

    neatsoft
    @neatsoft
    Life is too short for bad software
    Shift+PrtSc, выделение нужной области, Save
    Ответ написан
    Комментировать
  • Как сделать API для веб-приложения написанном на Django?

    neatsoft
    @neatsoft
    Life is too short for bad software
    Django REST framework
    Quickstart
    Tutorial
    Ответ написан
    Комментировать
  • Как синхронизировать базу и миграции Django?

    neatsoft
    @neatsoft
    Life is too short for bad software
    Информация о примененных миграциях хранится в самой базе данных (таблица django_migrations). Поэтому если скрипты миграций вручную не менялись и не удалялись, то никаких проблем при деплое не возникнет. Более того, дальнейшие изменения структуры БД можно без проблем накатывать с помощью python manage.py migrate - в этом и заключается прелесть миграций.
    Ответ написан
    5 комментариев
  • Есть идеи, как реализовать создание/хранение приходной/расходной накладной на Django?

    neatsoft
    @neatsoft
    Life is too short for bad software
    В одной таблице должны храниться документы, во второй - строки табличной части (всех документов).

    models.py:
    from django.db import models
    from django.db.models import Max, Sum
    from django.utils.translation import ugettext_lazy as _
    
    
    class Product(models.Model):
        name = models.CharField(
            _('Name'),
            max_length=200,
            db_index=True,
        )
    
        def __str__(self):
            return self.name
    
    
    class Document(models.Model):
        INVOICE = 'I'
        WAYBILL = 'W'
        TYPE_CHOICES = (
            (INVOICE, _('Invoice')),
            (WAYBILL, _('Waybill')),
        )
        type = models.CharField(
            _('Type'),
            max_length=1,
            choices=TYPE_CHOICES,
        )
        number = models.CharField(
            _('Number'),
            blank=True,
            max_length=50,
        )
        created_at = models.DateTimeField(
            _('Created'),
            auto_now_add=True,
            db_index=True,
        )
    
        @property
        def total(self):
            return self.items.aggregate(sum=Sum('total'))['sum']
    
        class Meta:
            ordering = ['-created_at']
    
    
    class DocumentItem(models.Model):
        document = models.ForeignKey(
            Document,
            models.CASCADE,
            related_name='items',
        )
        position = models.PositiveIntegerField(
            verbose_name=_('Position'),
            editable=False,
            db_index=True,
        )
        product = models.ForeignKey(
            Product,
            models.PROTECT,
        )
        price = models.DecimalField(
            _('Price'),
            max_digits=12,
            decimal_places=2,
        )
        quantity = models.DecimalField(
            _('Quantity'),
            max_digits=10,
            decimal_places=3,
        )
        total = models.DecimalField(
            _('Total'),
            max_digits=12,
            decimal_places=2,
        )
    
        def save(self, *args, **kwargs):
            if not self.position:
                position = self.document.items.aggregate(Max('position'))['position__max'] or 0
                self.position = position + 1
            super(DocumentItem, self).save(*args, **kwargs)


    admin.py:
    from django.contrib import admin
    
    from .models import Product, Document, DocumentItem
    
    
    @admin.register(Product)
    class ProductAdmin(admin.ModelAdmin):
        pass
    
    
    class DocumentItemInline(admin.TabularInline):
        model = DocumentItem
        fields = (
            'position',
            'product',
            'price',
            'quantity',
            'total',
        )
        readonly_fields = (
            'position',
        )
        ordering = ['position']
    
    
    @admin.register(Document)
    class DocumentAdmin(admin.ModelAdmin):
        inlines = [
            DocumentItemInline,
        ]
        list_display = (
            'type',
            'number',
            'created_at',
            'total',
        )
        list_filter = (
            'type',
        )
        search_fields = (
            '=number',
        )


    Стандартная админка - для примера, вообще она не для этого (обычным пользователям она не должна быть доступна). Но реальные формы строятся по тому же принципу.

    Код накидал прям здесь, не проверял, поэтому возможны незначительные ошибки.
    Ответ написан
    4 комментария
  • Как изменять имя файла при загрузки в Django?

    neatsoft
    @neatsoft
    Life is too short for bad software
    Для именования файлов лучше использовать хэш, а не uuid. Это гарантирует уникальность имён, и обеспечивает дедупликацию данных: сколько бы раз пользователи не заливали файл с одинаковым содержимым, он будет храниться в единственном экземпляре (исключение - файлы с одинаковым содержимым и разными расширениями, но это разумный компромисс - работать с файлами без расширений менее удобно на многих этапах).

    Можно реализовать соответствующую функциональность самостоятельно:

    app_name/models.py:
    import hashlib
    import os
    
    from django.conf import settings
    from django.core.files.storage import FileSystemStorage
    from django.db import models
    
    
    def upload_to(instance, filename, fieldname):
        ext = os.path.splitext(filename)[1].lower()
        class_name = instance.__class__.__name__.lower()
    
        h = hashlib.sha256()
        field = getattr(instance, fieldname)
        for chunk in field.chunks():
            h.update(chunk)
        name = h.hexdigest()
    
        return os.path.join(
            class_name,
            name + ext,
        )
    
    
    class OverwriteStorage(FileSystemStorage):
        def get_available_name(self, name, max_length=None):
            if self.exists(name):
                os.remove(os.path.join(settings.MEDIA_ROOT, name))
            return name
    
    
    class Article(models.Model):
        image = models.ImageField(
            storage=OverwriteStorage(),
            upload_to=lambda inst, fn: upload_to(inst, fn, 'image'),
        )


    Но гораздо разумнее воспользоваться готовой библиотекой:

    Установить hashedfilenamestorage:
    pip install django-hashedfilenamestorage

    и добавить следующую строку в settings.py:
    DEFAULT_FILE_STORAGE = 'django_hashedfilenamestorage.storage.HashedFilenameFileSystemStorage'
    Ответ написан
    1 комментарий
  • Кинула веб-студия, агентский договор?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg

    Что можно сделать в такой ситуации?

    Принять во внимание, не допускать подобное в дальнейшем. Выпить пивка, пожарить мяса, посмотреть на закат, поднять руку вверх, махнуть и сказать "да ну и ... с ним".
    Ответ написан
    1 комментарий
  • Как (и возможно ли) дотянуться до Junior JavaScript Developer в кратчайшие сроки?

    rim89
    @rim89
    программист-велосипедист
    Что от них хотят?
    Сходите на собеседование, там всё скажут
    На доучивание у меня примерно месяц (два от силы), правда с почти полным погружением. Возможно ли за это время дотянуться до Junior JavaScript Developer?

    люди разные, кому то надо 2 недели, кому то пол года
    На что делать упор в занятиях: пилить свой проект или проходить курсы? углубляться в "голый" JavaScript или разбираться с frameworks (какую выбрать?) и базами данных? Или вообще хватит умения обращаться с AJAX?

    На то, что от вас требуется, а это вы узнаете, исходят из требования по конкретной вакансии.
    Ответ написан
    Комментировать
  • Как завершить процесс в python?

    @WorldEn Автор вопроса
    Решил проблему с помощью библиотеки psutil
    import psutil
    
    parent_pid = 30437   # my example
    parent = psutil.Process(parent_pid)
    for child in parent.children(recursive=True):  # or parent.children() for recursive=False
        child.kill()
    parent.kill()
    Ответ написан
    Комментировать
  • Как запустить телеграм бота из-за прокси?

    @psy667
    Node.js backend developer
    Установите последние версии библиотек gunicorn, PySocks, pyTelegramBotAPI, requests и urllib3

    Затем попробуйте использовать другой прокси, например этот
    ip = '195.201.137.246'
    port = '1080'
    
    apihelper.proxy = {
      'https': 'socks5://{}:{}'.format(ip,port)
    }
    Ответ написан
    2 комментария
  • Чему научиться кроме HTML, CSS, JS для фриланса на upwork?

    @Ravenio
    Доброго времени суток.
    Отвечая на вопрос.
    По количеству заказов, на данный момент, по апворку у заказчиков популярны PHP/Wordpress/Laravel, WP вне конкуренции.
    В сторону JS есть много заказов по React/Angular/Node.JS, меньше по Vue.
    Если же говорить про то, что необходимо, то начиная с самых низов от WP сейчас никуда не деться, просто навыками HTML/CSS на апворке да и вообще уже никого не удивить.
    На JS/React/Node.js заказы выше уровнем, без опыта и хорошего портфолио их брать сложнее чем на том же WP.
    Ну и общее.
    Про идеальный английский - неправда. Знать его конечно необходимо, но уровня intermediate вполне.
    По поводу маленьких ставок и быть первым - тоже, не совсем:
    • Во-первых это не всем известная помойка. Да, заказчики бывают разные, но основаная масса желает платить специалисту, не равняйте менталитет заказчика из США с нашим, у него не укладывается, что специалист ставит 5-8$ за час. В среднем, все начинают в диапазоне 12-15$, хотите можете и с 5$ начинать, но лучше сразу привыкать ценить свой труд. И вас ценить будут в ответ. Пример из опыта заказ на установку WP, и темы без кастомизации и прочего ушел за 35$/час, на вопрос почему, заказчик сказал, потому что я вижу что вы сделаете за час, а человек будет за 7$ ставить мне его неделю, может заказчик и не прав, но такой ход мысли у многих. Повторюсь есть и иные случаи, но потом часто можно в Job feed увидеть - "даю апворку последний шанс, чтобы сделать мою работу, предыдущий фрилансер не справился".

    • Во вторых, там необходимо ответить в течении определенного времени, обычно окно составляет около 10 минут. Ваш cover letter выстраивается у заказчика релевантно вашим скилам, портфолио, последним выполненым работам, но никак не зависит от того вы ответите первая или десятая.

    Ни в коем случае, не при каких обстоятельствах не работайте за отзыв и за очень маленькую ставку, мошенников и сволочей большое количество. Случаев работы за 5$ два месяца - масса. Начиналось все с небольшой правки, и обещаний оставить хороший отзыв, а потом в процессе узнаешь что такое JSS, что такое скрытые отзывы. И так люди работали.
    Старайтесь избегать заказчиков из Пакистана, Индии. Русскоязычных старайтесь тоже избегать, вообщем ищите заказы в странах от Германии и западнее.

    В любом случае, как раз где-то через 6-8 месяцев обучения, вы уже сами будете отвечать на этот вопрос другим. Удачи вам, Марина!
    Ответ написан
    2 комментария
  • JavaScript, отслеживание переключения вкладок

    @artishok
    кратко
    <html>
        <head>
            <title>тайтл</title>
            <script>
                window.onblur = function () {document.title='документ неактивен'}
                window.onfocus = function () {document.title='документ снова активен'}
            </script>
        </head>
        <body>
            <img src="http://www.google.com.ua/images/nav_logo83.png">
        </body>
    </html>
    


    ssms-ka.narod2.ru/Habrahabr.htm
    Ответ написан
    Комментировать
  • Присваивание в python?

    sim3x
    @sim3x
    Перед открытием спойлера, попробуйте найти ошибку самостоятельно
    Не смешивате кириллицу и латиницу в коде
    Ответ написан
    Комментировать
  • Можно ли взломать архивы ".rar", ".zip" с паролем?

    @Codebaker
    Всё умею, всё могу!
    Безопасно, согласно правилу о неуловимом Джо. Скорее всего вы, содержимое вашей флешки и ваши архивы никому не нужны.
    Если вашу флешку найдет случайный прохожий, он с 50% вероятностью окажется неспособен ко взлому, с 50% вероятностью ему это будет неинтересно. Остаются 25%, что близко к правилу Паретто (80 на 20, где 80% этот взлом будет просто не нужен).
    Если ваши архивы будут называться как-то нейтрально, а не "Пароли от моих счетов в банке.zip", а содержимое архивов будет скрыто, то в принципе безопасно.

    Пароль должен быть не только сложным, но и длинным, т.к. брутфорсеры для архивов свободно лежат в сети.
    А отвечая на вопрос прямо: да, взломать возможно, т.к. все архиваторы неустойчивы к обычному брутфорсу.
    Ответ написан
    6 комментариев
  • В чём разница между постпроцессорами препроцессорами?

    Stalker_RED
    @Stalker_RED
    Вся суть одной картинкой:
    tZjTgV.png

    Препроцессоры превращают всякие штуки типа SCSS в CSS.
    Постпроцессоры "улучшают" уже готовый CSS (автопрефиксер, например).
    И да, можно собрать-настроить такой тулчейн, который будет делать все эти манипуляции за один проход.
    Ответ написан
    Комментировать