LINUX.ORG.RU

Сообщения conformist

 

Vue.js как добавление реактивности

Форум — Web-development

Привет.

Решил я сделать свой мини сайт на vps для лично своих заметок и прочих нужд. Т.к. в основном работаю с django, на ней и решил остановиться. Примерная концепция — отдельные приложения для реализации каких-то своих функций. Для упрощения восприятия положим, что это блог, какое-то приложение для учёта каких-то действий, может аналог pastebin, прочее.

Делать SPA я не собираюсь, равно как и использовать какие-либо route, т.е. классическая схема обычного веб приложения. Но! Хочется добавить какой-то реактивности, например, логин форма xhr запросом логинит. Так же в бложике может быть markdown редактор, например. Т.е. в некоторых местах могут быть какие-то сущности, которые работают исключительно с api бекенда. Такая примерно идея.

Понимая, что уже 2к19 и использовать jQuery как минимум странно, я решил заюзать vue. Написал конфиг для webpack, чтобы удобно собирать это всё вместе с scss стилями по разным файлам и хочу интегрировать это в страницы обычного django.

Собственно вопрос. Я ознакомился с документацией и разными решениями и что я понял:

  • почти всегда vue позиционируется как SPA. Типа вот тебе #app и тут делай что тебе надо. Но мне надо не это.
  • да, есть решение, когда тебе нужно не это и это — portal-vue — типа всё так же регистрируешь один #app, но магией работы с DOM из инициализированного приложения можно достучаться до элементов извне. Как мне кажется, это довольно костыльный метод.
  • сделать несколько инстансов vue App. Например в подключаемом файле js пишем конструкции типа: if element.exists => new vue.App... — несколько костыльно, но в общем мне решение подходит, т.к. я могу при нахождении какого-то элемента на странице сделать его реактивным.

Собственно вопрос — неужели всё так печально? Ладно, я могу создать несколько элементов, но, вдруг, мне понадобится шарить между ними какие-то данные? Скидывать всё в localStorage и добавлять кругом разных eventListener чтобы всё это отслеживать? Так это очень похоже на jQuery подход.

Если у кого есть пример решения подобной проблемы и как с этим боролись — заранее благодарен.

 , , ,

conformist ()

Django nested formset

Форум — Web-development

Всем привет.

Вопрос по django formset. Допустим есть модель и относящаяся к ней вторая модель:

class SomeModel(models.Model):
    pass


class RelatedModel(models.Model):
    some_model = models.ForeingKey(to=SomeModel, ...)

Так же к ним обычные формы. Теперь, на странице может быть несколько SomeModel, для этого используем modelformset_factory:

SomeModelFormset = modelformset_factory(SomeModel, SomeModelForm, extra=2, can_delete=True)
some_model_formset = SomeModelFormset(request.POST, queryset=some_model_qs, prefix='sm')

Таким образом у нас может быть много форм SomeModel и к каждой из них нужно добавить таким же образом formset из RelatedModel.

Как один из вариантов — пройти по формам some_model_formset и к каждой из них создать отдельный formset из RelatedModel с префиксом — prefix='rm_%s % index_of_some_model_form' и потом так же в цикле валидировать эти формы.

Нет ли более изящного решения этой проблемы?

 , ,

conformist ()

Засыпает hdd во время просмотра фильмов/прослушивания музыки

Форум — General

Доброго времени суток.

Пролема в том, что основная система на ssd, а на hdd осталась помойка. При просмотра контента (конкретно музыка — deadbeef, фильмы — smplayer (бекэнд mpv)) — воспроизведение подвисает на доли секунды. Очень похоже, как будто плеер считал в буфер какое-то количество данных и до того времени, как он обратится за следующими данными — винт уже заснул. Он немного шумит, потому слышно, как он включается.

Собственно вопрос, как от этого избавиться?

OC: debian sid, DE: MATE, если это будет полезным.

 , ,

conformist ()

Не допустить читерства на backend

Форум — Development

Доброго времени суток.

Есть проект на django, отдельно от него есть проекты на angular и react. На django есть система вознаграждений и она хранит так же вознаграждения за проведённое время в приложениях на angular/react. Разумеется для учёта этого времени из фронта делаются запросы на api django, чтобы сохранить результат.

Исходные данные — используется JWT (т.е. мы в принципе знаем, когда токен был получен (время жизни токена 15мин), так же есть refresh token). Нужно хранить 5-тиминутные отрезки времени. Т.е. пользователь провёл 5 минут — шлём запрос. Запросы с большим временем тоже можно, но меньше времени жизни токена (15мин).

Теперь вопросы и проблемы:

1) допустим токен был получен в 21.00, но это был refresh token и пользователь на самом деле был на сайте с 20.57 и, соответственно, в 21.02 придёт запрос на запись 5 минут. Как это валидировать? дать возможность 5 минутного сдвига до времени получения токена?

2) и более важный — это же простой xhr запрос с фронта. В принципе пользователь может изучить ключи этиз запросов и из какого нибудь postman/insomnia или обычным curl слать запросы постоянно — как защититься от этого?

Используется django rest framework + rest framework simplejwt. Production инстансы на domain.tld — django, subdomain1.domain.tld — клиент 1 и второй так же. Т.е. по идее можно было бы ограничить по хосту запросы, чтобы урегулировать второй вопрос. Кто-то делал подобное?

 , , , ,

conformist ()

Разные workplaces для разных мониторов

Форум — Desktop

День добрый.

Имеется debian MATE, 2 монитора и 4 workplaces. Проблема в том, что переключая workplaces меняются окна на обоих мониторах, а хотелось бы чтобы на втором мониторе был отдельный workplace (например открыл окно и оно там статично). Похоже, что marco это не поддерживает, может был у кого опыт, как достичь этого?

 , ,

conformist ()

ISPConfig apache default virtualhost

Форум — Admin

Привет.

Есть vps с apache и opencart. Нормально работает, 2 конфига для http и https. Указывают на один каталог и там силами htaccess сделан редирект на https.

Захотел поставить ispconfig, который проживает обычно на отдельном порту (8080) и пытаюсь в него попасть. Вот тут странность, в конфиге ispconfig написано virtualhost _default_:8080, т.е. apache должен при запросе по этому порту перенаправлять на этот virtualhost. Но этого не происходит, при каждом запросе мне показывается сайт, а не панель.

Для проверки в обоих document root я создал файл test.php с разным содержимым (например, default и custom).

https://domain.tld/test.php → default
https://domain.tld:8080/test.php → default
http://ip:8080/test.php → bad request
https://ip:8080/test.php → default
В конфигах везде убрал _default_, заменив на *:443/*:80. Пробовал перенести на отдельный поддомен ispconfig, например: panel.domain.tld, порт 443 — открывает так же дефолтный сайт (т.е. SNI не работает, получается?). Не знаю что ещё предпринять.
root@domain:/etc/apache2/sites-enabled# apachectl -t -D DUMP_VHOSTS
VirtualHost configuration:
*:8081                 domain.tld (/etc/apache2/sites-enabled/000-apps.vhost:8)
*:80                   domain.tld (/etc/apache2/sites-enabled/000-default.conf:1)
*:8080                 domain.tld (/etc/apache2/sites-enabled/000-ispconfig.vhost:6)
*:443                  domain.tld (/etc/apache2/sites-enabled/default-ssl.conf:2

 , ,

conformist ()

Направить весь трафик на порт

Форум — Admin

Доброго времени суток. Есть желание направить весь исходящий трафик на определённый порт, на котором поднят ssh туннель. Пробовал sshuttle, но после его запуска по ssh подключиться к удалённой машине уже нельзя. Потому ищется простой способ как это сделать. Заранее спасибо.

P.S. openvpn, которым обычно решал проблему, запустить на удалённой машине нельзя (контейнер без tun/tap).

 , ,

conformist ()

Angular поиск элемента в списке

Форум — Web-development

Доброго времени суток. Такой вопрос — есть диалог, в который загружается пачка элементов, допустим штук 20-30. Хочу добавить поисковую форму, похожую на md-autocomplete, но так, чтобы все элементы были видны, а если начинаешь набирать текст, то оставались только те, которые совпадают по фильтру. Сам md-autocomplete, насколько я понял, мне не подходит, т.к. он не показывает то, что загрузил, а только по мере набора.

Вот пример view, который сейчас:

<md-dialog-content ms-scroll>
  <md-list>
    <div layout="row" layout-align="center center" ng-show="vm.loading">
      <md-progress-circular md-mode="indeterminate" md-diameter="50"></md-progress-circular>
    </div>
    <md-list-item>
      <div flex class="md-list-item-text" layout="row">
        <div flex="70"><strong>Item</strong></div>
        <div flex="30"><strong>Saved</strong></div>
      </div>
      <md-divider></md-divider>
    </md-list-item>

    <md-list-item ng-repeat="item in items" ng-click="vm.selectItem(item)">
      <div flex class="md-list-item-text" layout="row" layout-align="none center">
        <div flex="70">
          <span class="text-truncate padding-right-25">{{ item.title}}</span>
        </div>
        <div flex="20">{{ item.modified_at | date:"dd/MM/yyyy" }}</div>
      </div>
      <md-divider></md-divider>
    </md-list-item>
  </md-list>
</md-dialog-content>

 , ,

conformist ()

lightdm не запускает сессию с ~/.xsession

Форум — General

Доброго времени суток!

В общем понадобилось в debian, чтобы был обновлён PATH, хочу в него добавить каталог $HOME/.local/bin. В ubuntu это работало, но там DM вроде был sddm и он читал .profile, а lightdm не хочет, ему нужен .xsession. Я его создал и написал в нём следующее:

#!/bin/sh

if [ -d "$HOME/.local/bin" ] ; then
    export PATH="$HOME/.local/bin:$PATH"
fi

exit 0
После этого я не могу создать сессию. Притом в логах lightdm он никак это не мотивирует, пишет просто — получил сигнал 15, выход. Не пойму, что ему мешает работает, может кто сталкивался?

 , ,

conformist ()

Форматирование вывода vnstat

Форум — Desktop

Доброго времени суток. В апплете МАТЕ command output хочу видеть количество потреблённого трафика. Раньше справлялся обычным awk, теперь решил чуть исправить вид.

Что хочу, что получилось:

~ vnstat -i enp3s0f5 --oneline
1;enp3s0f5;01/14/2018;164.21 MB;12.90 MB;177.11 MB;26.85 kbit/s;Jan '18;164.21 MB;12.90 MB;177.11 MB;1.27 kbit/s;164.21 MB;12.90 MB;177.11 MB
Вот так выглядит строка, которую нужно отформатировать. Интересуют 4-е и 5-е поле (если разбить с помощью ;), как хочу, чтобы оно выглядело: 164M/13M — т.е. округление и убрать букву B:
#!/bin/bash

function round_it(){
	count=${$1%.*}
	prefix=${$2%?}
	echo "$count$prefix"
}

IFACE=$(ip addr show | awk '/inet.*brd/{print $NF; exit}')
out=$(vnstat -i $IFACE --oneline)
IFS=';' array=($out)
down=${array[3]}
up=${array[4]}
echo $(round_it $down)
вот как написал, но не работает, жалуется на bad substitution, хотя в терминале если присвоить строку и разбить на массив — всё работает. Не пойму, где я накосячил.

Прошу помощи, заранее благодарен.

 

conformist ()

Загрузить содержимое файла в переменную

Форум — Development

В общем сабж. Есть форма с двумя <input type=file>. Они могут быть выбраны, а могут быть и нет или выбран один из двух. Проблема в том, что файла 2 и я не могу выйти из callback сохранив данные для последующего запроса.

Что я делаю:

function loadFile(element, getData){
  var file = element.prop('files')[0];
  var reader = new FileReader();
  reader.onload = function(e){
    var data = e.target.result;
    getData(data);
  }
  reader.readAsText(file);
};
// Далее проверяю, есть ли в element класс, определяющий, что это
// поле с файлом и пытаюсь его загрузить:
if(left_code.hasClass('file')){
  loadFile(left_code, function(result){
    console.log(result);  // здесь всё загружено
});
но как мне сохранить этот result в переменную и потом сделать точно так же со вторым файлом? Можно попробовать сделать ещё один внутренний if для второго, но если не будет первого, а будет второй → получим кашу.

Пробовал варианты из гугла типа $.wait, но что-то не получается.

 ,

conformist ()

Определить idle или нет

Форум — Development

Доброго времени суток. Пишу небольшой скрипт для себя с помощью python-xlib и потребовалось узнать мне, в какие моменты пк простаивает, чтобы это можно было отслеживать.

В гугле нашёл много ссылок на один и тот же кусок кода, в оригинале аж 2007-го года, который использует библиотеку C, но у меня сомнения:

1) неужели за это время не придумали ничего более удобного?

2) если всё же так, как мне это впихнуть в свой цикл?

Я использую в цикле next_event(), который ориентируется на Xlib.X.PropertyChangeMask: т.е. он реагирует на изменения в заголовках окон, например, и, когда пк неактивен, по идее вообще никаких event'ов происходить не будет.

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

 , , , ,

conformist ()

Редактировать kde5 plasmoid

Форум — Development

Всем привет. Есть плазмоид, который я хотел бы отредактировать под свои нужды. Вот он: https://github.com/Zren/plasma-applets/tree/master/commandoutput

Работает прекрасно, но выглядит немного не так, как надо. Как редактировать — более-менее понятно, но проблема с отладкой.

При внесении изменений удаление/добавление виджета не приводит ни к каким изменениям, но помогает logout/login, но это же совсем не дело. plasmoidviewer показывает просто окошко, виджет в нём не показывается. qmlscene жалуется так:

file:///home/conformist/dev/widgets/abc/contents/ui/main.qml:3 module "org.kde.plasma.plasmoid" is not installed
Долго гуглил и не смог понять, где он ищет пути для импорта, пробовал добавлять кое-какие варианты из /usr/share..., но без эффекта.

Помогите кто чем может, заранее спасибо.

 , , ,

conformist ()

sqlalchemy MySQL server has gone away

Форум — General

Привет.

Такая проблема. Есть скрипт, который удаляет из базы данных много записей. Для ускорения процесса использую threading. Отрегулировал pool (на сервере max_user_connections=20 и max_allowed_packet=64M), задал pool_size=6, max_overflow=20 в create_engine и в 5 потоков удаляю. Например для удаления 4000 id, по каждому id за один заход удаляются данные из 10 таблиц. Потому я разбиваю эти 4000 на куски по 50 id и в цикле по 5 потоков удаляю. Вроде бы исчезла проблема с max_user_connections, так теперь постоянно куда-то пропадает сервер. Что интересно, если убрать потоки и удалять просто последовательно — всё ок, никаких проблем. До этого на тестовом сервере я удалял по 500 id за заход — тоже без проблем.

Уже и не знаю, куда копать и что делать?

 , , ,

conformist ()

Пропал индикатор раскладки клавиатуры

Форум — General

После обновления до МАТЕ 1.18 пропал индикатор раскладки в трее. Обшарил весь dconf, вроде всё включено, поигрался цветами — не помогает. Даже как-то и не придумаю, куда ещё копнуть.

 , ,

conformist ()

Bash Promt exit code

Форум — General

Всем привет! Есть удобный способ добавить индикатор статуса последней команды в терминале, например так:

__prompt_command() {
    local EXIT="$?"             # This needs to be first
    PS1=""

    local RCol='\[\e[0m\]'

    local Red='\[\e[0;31m\]'
    local Gre='\[\e[0;32m\]'
    local BYel='\[\e[1;33m\]'
    local BBlu='\[\e[1;34m\]'
    local Pur='\[\e[0;35m\]'

    if [ $EXIT != 0 ]; then
        PS1+="${Red}→${RCol}"      # Add red if exit code non 0
    else
        PS1+="${Gre}→${RCol}"
    fi

    PS1+=" ${BBlu}\w${RCol} "
}
PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs
Но проблема в том, что я использую ещё и bash-git-prompt (собственно там я и вижу LAST_COMMAND_STATE) и вместе эти вещи не работают вне каталогов .git.

Вот у меня вопрос — как сделать, чтобы не только в каталогах git работало. Можно изменить GIT_PROMPT_ONLY_IN_REPO, но как то не хочется, чтобы весь тот код был всегда и везде и строка приветствия нужна разная для репозитория и для не репозитория.

 , ,

conformist ()

Endless try to get url

Форум — Development

Всем привет. В общем хочу реализовать бесконечную попытку получить данные по url. Вроде бы логично всё и просто, сделал так:

def get_with_delay(url):
    delay = 5
    while True:
        try:
            response = requests.get(url, headers=HEADERS)
        except: # пока ловим всё, что угодно
            logging.info('ConnectionError occurrence')
            logging.info('Sleep for a {} seconds'.format(delay))
            sleep(delay)
            delay += 10
            if delay > 90:
                delay = 5
            continue
        break
    return response
Тут происходит странное:

отключаем интернет, запускаем скрипт. Он как положено попадает в except и всё работает. Включаем интернет — скрипт работает. ОК. Но если я при работающем скрипте отключу интернет то всё просто стопорится на try: request.get. если нажать ctrl+c, то попадаю в блок except и опять тишина. Не могу понять, почему так происходит? Почему при отключении интернета requests не выкидывает какой нибудь exception?

 ,

conformist ()

nginx proxy apache ssl setup

Форум — Admin

Доброго времени суток!

Есть вебхостинг на котором пара десятков сайтов. Настроено так: nginx на 80-м порту принимает соединения, статические файлы отдаёт сам, динамику проксирует на 81-й порт апачу. Для одного сайта потребовалось настроить ssl. Есть ключ, сертификат, подключил к nginx для этого домена и первый же сайт для проверки ssl показал domain name mismatch, статус F, всё плохо. Начал гуглить и некоторые инструкции говорят, что нужно подключать сертификаты к апачу (ещё задествовать rpaf) и правильно передавать заголовки, а некоторые, что соединение должно быть шифрованным только до nginx. Собственно вопрос — как правильно настроить ssl в такой связке?

Перемещено leave из general

 , ,

conformist ()

tmux custom bashrc in new window

Форум — General

В общем нагуглил расцветку для git в баш, захотелось в одном окошечке, где общаюсь с гитом, была расцветка удобная. Удобство вот:

#!/bin/bash
COLOR_RED="\033[0;31m"
COLOR_YELLOW="\033[0;33m"
COLOR_GREEN="\033[0;32m"
COLOR_OCHRE="\033[38;5;95m"
COLOR_BLUE="\033[0;34m"
COLOR_WHITE="\033[0;37m"
COLOR_RESET="\033[0m"
function git_color {
  local git_status="$(git status 2> /dev/null)"
  if [[ ! $git_status =~ "working directory clean" ]]; then
    echo -e $COLOR_RED
  elif [[ $git_status =~ "Your branch is ahead of" ]]; then
    echo -e $COLOR_YELLOW
  elif [[ $git_status =~ "nothing to commit" ]]; then
    echo -e $COLOR_GREEN
  else
    echo -e $COLOR_OCHRE
  fi
}
function git_branch {
  local git_status="$(git status 2> /dev/null)"
  local on_branch="On branch ([^${IFS}]*)"
  local on_commit="HEAD detached at ([^${IFS}]*)"
  if [[ $git_status =~ $on_branch ]]; then
    local branch=${BASH_REMATCH[1]}
    echo "($branch)"
  elif [[ $git_status =~ $on_commit ]]; then
    local commit=${BASH_REMATCH[1]}
    echo "($commit)"
  fi
}
PS1="\[$WHITE\]\n[\W]"          # basename of pwd
PS1+="\[\$(git_color)\]"        # colors git status
PS1+="\$(git_branch)"           # prints current branch
PS1+="\[$BLUE\]\$\[$RESET\] "   # '#' for root, else '$'
export PS1
В tmux.conf создаётся 3 окна, вот так:
new -n work "bash"
neww -n bash
neww -n dev -c /home/conformist/dev
selectw -t 3
и вот тут я не могу понять, как мне дописать source ~/.bash_git чтобы только в dev был применён .bash_git. Что интересно, просто дописать не получается, окно или не создаётся или возвращает return 127 если запустить через run source после selectw. Вот создание рутового окна работает без проблем:
bind r new-window -n root "exec /bin/su -"
но по нажатию клавиш, а почему не хочет делать source — непонятно.

 ,

conformist ()

pass var from bash env to python

Форум — General

Есть файл с локальными настройками (логины, пароли, адрес базы данных). Пишу как обычно в файл:

export db_uri='sqlite:///some.db'
export login='admin'
export passwd='pa$$w0rd'
в скрипте питона пишу:
from os import getenv
engine = create_engine(getenv('db_uri'))
файл создаётся со знаком вопроса в конце (some.db?). При удалении баш дописывает some.db^M. Я так понимаю в переменную как-то затесался \n, собственно вопрос, а как передать правильно?

 , ,

conformist ()

RSS подписка на новые темы