LINUX.ORG.RU

Сообщения conformist

 

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

Привет.

Решил я сделать свой мини сайт на 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

Всем привет.

Вопрос по 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 во время просмотра фильмов/прослушивания музыки

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

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

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

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

 , ,

conformist ()

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

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

Есть проект на 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 для разных мониторов

День добрый.

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

 , ,

conformist ()

ISPConfig apache default virtualhost

Привет.

Есть 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 ()

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

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

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

 , ,

conformist ()

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

Доброго времени суток. Такой вопрос — есть диалог, в который загружается пачка элементов, допустим штук 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

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

В общем понадобилось в 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

Доброго времени суток. В апплете МАТЕ 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 ()

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

В общем сабж. Есть форма с двумя <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 или нет

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

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

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

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

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

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

 , , , ,

conformist ()

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

Всем привет. Есть плазмоид, который я хотел бы отредактировать под свои нужды. Вот он: 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

Привет.

Такая проблема. Есть скрипт, который удаляет из базы данных много записей. Для ускорения процесса использую 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 ()

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

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

 , ,

conformist ()

Bash Promt exit code

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

__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

Всем привет. В общем хочу реализовать бесконечную попытку получить данные по 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

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

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

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

 , ,

conformist ()

tmux custom bashrc in new window

В общем нагуглил расцветку для 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

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

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 подписка на новые темы