LINUX.ORG.RU

Сообщения djnoob

 

Пример архитектуры GUI-приложения

Форум — Development

Привет.

Есть ли у кого пример/дока/статья на тему архитектуры десктопных GUI-приложений? Желательно с использованием Java и Swing/JavaFX тулкитов, но не обязательно, подойдут и другие стеки.

Интересует такой идиоматический пример как делать НОРМ.

Есть MVC, MVVM, MVP и т.д., т.п. Но... Их можно приготовить с разной степенью говености. А меня интересует хороший пример. Есть у кого-нибудь подобное на примете?

 , , , ,

djnoob
()

Java: Получить координаты курсора ЗА пределами java-окна

Форум — Development

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

Сбился с ног, пытаясь понять как можно в java-swing application получить координаты курсора мыши за пределами JFrame.

Ну т.е. я хочу просто навести курсор куда угодно в м моем десктопе, и получить текущие координаты в java app.

Подскажите, куда копать?

 , ,

djnoob
()

Формат данных и API

Форум — Development

Всем привет.

Есть документная БД, в ней хранятся записи-документы конкретных смысловых сущностей. Для примера пусть сущность эта зовется Person.

Пусть полный документ Person имеет следующий вид:

{
    "id": 12345,
    "name": {
        "ru": "тест",
        "en": "test"
    },
    "permisions": {
        "perm1": true,
        "perm2": false,
        "perm3": true,
    },
    "contacts": {
        "phone": "+000000000",
        "email": "person@example.com"
    }
}

Дело в том, что для тех или илных Person's может НЕ быть определенных данных. Напрмимер данные контактов могут либо вообще отсутствовать, либо может отсутствовать только часть из них (например телефон). Аналогично c permissions.

Есть http API, которое возвращает на клиент коллекции этих документов, в виде JSON.

Идеологический вопрос. Как лучше хранить И отдавать данные на клиент? Например, если нет данных для контактов, можно записать в БД «расшитые», но пустые контакты, а можно записать объект контактов как null (или пустой объект {}, без расшития на его структуру:

Вар 1.:

"contacts": {
        "phone": null,
        "email": null
    }

Вар 2.:

"contacts": {}

Вар 3.:

"contacts": null

Какой вариант хранения лучше (ВСЕГДА расшитый по максимуму, сжатый, но с сохранением типа [пустой объект], сжатый/зануленный)?

И вопрос со звездочкой, ГДЕ можно прочитать про то, как правильно хранить документы в документной БД, в которой не предусмотрены ограничение целостности данных (монга, еластик и проч)?

Кто как делает в своих проектах?

 , , ,

djnoob
()

Какой запрос быстрее/оптимальнее

Форум — Development

Приветствую, ЛорЧЕГ.

Есть табличка mytable, в которой есть поле id (auto increment), на который наложен индекс и ограничение PRIMARY KEY.

Хочу выбрать самый старший идентификатор из всей таблицы (в таблице ~100 миллионов записей).

Какой запрос будет опитмальнее (MySQL, InnoDB):

1)

EXPLAIN SELECT MAX(id) FROM mytable;                                                                                                          +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                        |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+                     |  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | Select tables optimized away |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+

2)

EXPLAIN SELECT id FROM mytable ORDER BY id DESC LIMIT 1;
+----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | mytable | NULL       | index | NULL          | PRIMARY | 4       | NULL |    1 |   100.00 | Using index |
+----+-------------+----------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

 , , ,

djnoob
()

Elasticsearch, агрегация с фильтрацией.

Форум — Development

Есть индекс товаров (products). Пример документа, который находится в индексе:

{
    "product_id": <>,
    "title": <>,
    "type": <>,
    ...
}

Хочу сделать группировку продуктов по типу, НО!, чтобы в каждой группе был хотя бы один продукт с типом, например «aim».

Абстрагируясь от данных, задача может звучать так: сгруппировать документы по полю 'A', но исключить/не_создавать группы, в которых нет хотя бы одного документа со значением 'X', поля 'Y'.

У меня пока есть такой запрос.

{
    "aggs": {
        "buckets": {
            // группирую документы по title'у
            "terms": {
                "field": "title",
            },
            "aggs": {
                // возвращаю в результатах группировки документы целиком
                "products": {
                    "top_hits": {
                        "_source": True,
                    },
                },
            },
        },
    }
}

но он не влючает часть «исключить/не_создавать группы, в которых нет хотя бы одного документа со значением 'X', поля 'Y'.».

Кто имел дело с подобными кейзами в ES, подскажите, пожалуйста.

 ,

djnoob
()

Заннотировать метакласс

Форум — Development

Привет, лор!

Помогите зааннотировать метакласс, реализующий синглтон.

T = TypeVar("T", bound=type)


class Singleton(type):
    instances: ClassVar[Dict[Type[T], T]] = {}

    def __call__(cls: Type[T], *args, **kwargs) -> T:
        if cls not in cls.instances:
            cls.instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls.instances[cls]


Но это не работает. Не могу раздуплить, как правильно вывести типы тут?

 ,

djnoob
()

pytest+django - замокать декоратор вьюхи

Форум — Development

Привет, ЛОР.

Чет не работает мок декоратора (продолжает использоваться оригинальный).

Есть вьюха:

# myapp.views.py
from my_utils import my_decorator

@my_decorator
def some_view(request):
    pass


Есть тест на нее (с использованием pytest, pytet-django и putest-mock):

def test_some_view(mocker, client):
    mocker.patch(
        'my_utils.my_decorator',
        return_value=True
    )
    response = client.get(url)
    assert response.status_code == 200


Но в итоге декоратор не мокается, падает с ошибкой, так как пытается заюзать оригинальную логику, которая в декораторе используется. ЧЯДНТ?

 , ,

djnoob
()

Emacs + LSP + Python

Форум — Development

Привет, комрады!

Пытаюсь заюзать плюшки LSP для python'а в Emacs (27.1), но чет не выходит. Вроде расхожий такой кейз, но он нифига не работает.

...
(use-package lsp-mode
  :ensure t
  :config
  (add-hook 'python-mode-hook #'lsp)
  :commands lsp)

(use-package lsp-ui
  :ensure t)

(use-package company-lsp
    :ensure t
    :config
    (push 'company-lsp company-backends))
...

Перезапуск, при открытии любого *py-файла получаю сообщение в минибуфере:

Unable to find installed server supporting this file.

Глобально в систему (Mac OS) усановил весь необходимый бандл:

pip3 install 'python-language-server[all]'

Почему не работает LSP?

 , ,

djnoob
()

Алгоритм отложенной подписки на событие

Форум — Development

Подскажите паттерн/способ «отложенной подписки на событие».

Предположим есть событие 'sample_event'. И подписка на это событие, но факт подписки случается ПОСЛЕ ТОГО как событие было разослано всем тек. слушателям:

// эмиттер разослал событие текущим "слушателям"
emitter.emit('sample_event');

...
спустя минуту появляется новый "слушаетель" и хочет подписать на событие 'sample_event'

emitter.on( 'sample_event', some_function_reference );

Хочется, чтобы при таком раскладе данный «слушатель» ПОЛУЧИЛ реакцию на это событие, несмторя на то, что событие было разослано минуту назад.

Какие есть ли алгоритмы/паттерны/подходы для реализации такой хотелки?

Спасибо.

P.S. Не имеет значение на каком ЯП это реализовано.

 , , ,

djnoob
()

Автогенератор доки для Perl POD

Форум — Development

Всем привет.

Существует ли автогенератор доки, наподобие python sphinx, который может генерить html c докой, взятой из perl-файлов, из pod-аннотаций?

 ,

djnoob
()

webpack + jquery + backbone

Форум — Web-development

Всем привет.

Начал тыкать палкой вебпак. Пытаюсь собрать начальное клиентское приложения на базе backbone.js. Есть вот такой вот конфиг:

var webpack = require('webpack');

const { resolve } = require('path');
const SRC_PATH = resolve(__dirname, 'src');
const STATIC_PATH = resolve(__dirname, '../static/admin/');

var ExtractTextPlugin = require('extract-text-webpack-plugin');


module.exports = {
    entry: [
        `${SRC_PATH}/js/main.js`,
        `${SRC_PATH}/css/style.css`
    ],
    output: {
        filename: 'js/[name].js',
        path: resolve(__dirname, 'dist'),
    },
    resolve: {
        modules: ['node_modules']
    },
    module: {
        rules: [
            {
                test: /\.(js)$/,
                exclude: /node_modules/
            },
            {
                test: /\.(jst)$/,
                use: 'underscore-template-loader'
            },
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract({fallback: 'style-loader', use: 'css-loader'}),
            }
        ]
    },
    plugins: [
        new webpack.ProvidePlugin({
            $: 'jquery',
            jQuery: 'jquery',
            _: "underscore",
            "window.jQuery": 'jquery',
        }),
        new ExtractTextPlugin('styles.css', {
            allChunks: true
        })
    ]
};

main.js

'use strict';

window.$ = window.jQuery = require('jquery');
import 'bootstrap/dist/css/bootstrap.min.css';
import '../css/style.css';
require("bootstrap");

var Backbone = require('backbone');
var Router = require('./routers/router');

Backbone.$(function() {
    new Router();
    Backbone.history.start();
});

После сборки и подключения бандла. В консоле получаю ошибку:

TypeError: e.replace is not a function

Ошибка эта в кишках библиотеки sizzle (которую, как я понял, юзает jquery).

Сталкивался ли кто-нибудь с такой фигней? В чем может быть проблема?

 , , ,

djnoob
()

webpack + jquery + backbone

Форум — Development

Всем привет.

Начал тыкать палкой вебпак. Пытаюсь собрать начальное клиентское приложения на базе backbone.js. Есть вот такой вот конфиг:

var webpack = require('webpack');

const { resolve } = require('path');
const SRC_PATH = resolve(__dirname, 'src');
const STATIC_PATH = resolve(__dirname, '../static/admin/');

var ExtractTextPlugin = require('extract-text-webpack-plugin');


module.exports = {
    entry: [
        `${SRC_PATH}/js/main.js`,
        `${SRC_PATH}/css/style.css`
    ],
    output: {
        filename: 'js/[name].js',
        path: resolve(__dirname, 'dist'),
    },
    resolve: {
        modules: ['node_modules']
    },
    module: {
        rules: [
            {
                test: /\.(js)$/,
                exclude: /node_modules/
            },
            {
                test: /\.(jst)$/,
                use: 'underscore-template-loader'
            },
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract({fallback: 'style-loader', use: 'css-loader'}),
            }
        ]
    },
    plugins: [
        new webpack.ProvidePlugin({
            $: 'jquery',
            jQuery: 'jquery',
            _: "underscore",
            "window.jQuery": 'jquery',
        }),
        new ExtractTextPlugin('styles.css', {
            allChunks: true
        })
    ]
};


main.js

'use strict';

window.$ = window.jQuery = require('jquery');
import 'bootstrap/dist/css/bootstrap.min.css';
import '../css/style.css';
require("bootstrap");

var Backbone = require('backbone');
var Router = require('./routers/router');

Backbone.$(function() {
    new Router();
    Backbone.history.start();
});


После сборки и подключения бандла. В консоле получаю ошибку:

TypeError: e.replace is not a function


Ошибка эта в кишках библиотеки sizzle (которую, как я понял, юзает jquery).

Сталкивался ли кто-нибудь с такой фигней? В чем может быть проблема?

 , , ,

djnoob
()

MySQL множественный update с агрегацией

Форум — Development

Приветствую.

Есть таблицы - ученики и кружки/секции.

students
--------
id
name
...

classes
-------
id
title
count_of_students


students_classes
----------------
student_id (FK -> students.id)
class_id (FK -> classes.id)


Какие есть идеи, как можно проапдейтить classes.count_of_students (количество студентов для конкретного кружка) для каждой секции (кружка) одним запросом?

 ,

djnoob
()

MySQL и триггеры

Форум — Development

Привет всем.

Подскажите, почему имея такие вот НЕ взаимоисключающие триггеры:

DELIMITER $$
CREATE TRIGGER a_after_insert
AFTER INSERT ON a FOR EACH ROW BEGIN
  INSERT INTO b (a_id) VALUES (NEW.id);
END$$
DELIMITER ;

DELIMITER $$
CREATE TRIGGER b_after_insert
AFTER INSERT ON b FOR EACH ROW BEGIN
  UPDATE a SET b_id = NEW.id WHERE id = NEW.a_id;
END$$
DELIMITER ;

Получаю ошибку мускуля о:

ERROR 1442 (HY000): Can't update table 'a' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Как реализовать подобное, чтобы мускуль не ругался?

 , ,

djnoob
()

SQL Связь между двумя таблица

Форум — Development

Всем привет.

Подскжаите, валидно ли (не нарушает ли это общие принципы или какие-нибудь нормальные формы) сделать следующее:

+ таблица "бригады"
id
...(другие поля)
последниее_участие_бригады (ссылка на истрия_ротации_бригад.id)


+ таблица "истрия_ротации_бригад"
id
бригада_id - ссылка на бригаду
...(другие поля)

Т.е. есть история бригад, когда-либо принимавщих участие в проекте. Есть отдельно таблица бригад и у каждой пригады есть ссылка (последниее_участие_бригады) на таблицу историй бригад.

 ,

djnoob
()

Модифицировать объект request во Flask

Форум — Web-development

Всем привет.

Подскажите. Вот хочется делать middleware's всякие, которые добавляют к объекту request произвольные данные.

Вопрос, как такое во Flask? Следующий подход «в лоб» не работает:

def some_func(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        request['my_data'] = 'ololo'
        return f(*args, **kwargs)
    return decorated_function

Получаю ошибку от werkzeug:

self._get_current_object()[key] = value
TypeError: 'Request' object does not support item assignment

Или для реализации декораторов во flask, которые модифицируют объект запроса, приняты какие-то другие практики?

 , ,

djnoob
()

Агрегационный запос к эластику

Форум — Development

Всем привет!

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

Вот есть такие данные в индексе эластика:

{
    "users": [
        {
          "name": "...",
          "group": "admin",
        },
        ...
     ]
}

Группы могут быть: user, admin, manager и проч.

На выходе хотелось бы иметь следующее:

{"admin": 100500, "manager": 300, ...}

Как такое можно провернуть в эластике?

 

djnoob
()

Телек на кухню!

Форум — Talks

Всем привет.


Да, я знаю, что TV - это быдлосеть, а телик - быдлоящик.

Но! Посоветуйте девайс). Хочется иметь на кухне не телик в привычном понимании, а именно устройство (дисплей, условно), для просмотра видео (сеть, флешка, wifi). Отсюда требования к девайсу: хорошая матрица (яркость и контраст), поддрежка чтения с флешки, поддержка RJ45, wifi, OS с брозером для просмотра ютубика). Небольшая диагональ (до 27"), годные крепление на стену в комплекте.

 , ,

djnoob
()

Flask + pytest

Форум — Web-development

Всем привет.

В python и фляжке новичек. Встал вопрос о тестировании. Вот, предположим есть обработчик запроса:

@app.route('/', methods=['GET'])
def show_index():
    '''
    Отображение главной страницы
    '''
    users = UserModel().all()
    return render_template('index.html', users=users)

Хочу написать тест, который просто проверяет код ответа:

client = app.test_client()

def test_show_index():
    res = client.get('/')
    assert res.status_code == 200

Но мне не нравится, что под капотом данный тест делает реальный запрос к базе, так как в обработчике запроса вызывается модельный метод: UserModel().all()

Пытаюсь замокать данный метод:

client = app.test_client()

@pytest.fixture
def mock_user():
    return Mock(spec=UserModel)

def test_show_index(mock_user):
    mock_user.all.return_value = [{"id": 1, "username": "Test User"}]
    res = client.get('/')
    assert res.status_code == 200

Но данное мокирование не работает. Под капотом все также - реальный запрос к БД.

Подскажите, как правильно мокать такие вещи? Какие best-practices ксть на этот случай?

 , , , ,

djnoob
()

Scala, anorm и sql relations

Форум — Development

Привет всем!

Бывалые скалисты, подскажите как реализовываются связи many-to-many при использовании anorm.

Есть три таблицы: users, permissions и user_permissions. user относится к permissions как многие ко многим.

Есть отдельные парсеры для маппинга данных в объекты User и Permission. Вопрос, как реализовать anorm-парсер для объекта UserWithPermissions?

Пока имею конструкцию следующего вида.

case class UserWithPermissions(
  id: Int,
  username: String,
  email: String,
  uid: Option[String],
  password: String,
  first_name: Option[String],
  last_name: Option[String],
  avatar: Option[String],
  created: DateTime = DateTime.now,
  last_visited: Option[DateTime],
  is_activated: Boolean = false,
  is_admin: Boolean = false,
  permissions: List[Permission]
)

trait UserWithPermissionsSerialize {
  val writes = {
    get[Int]("id") ~
    get[String]("username") ~
    get[String]("email") ~
    get[Option[String]]("uid") ~
    get[String]("password") ~
    get[Option[String]]("first_name") ~
    get[Option[String]]("last_name") ~
    get[Option[String]]("avatar") ~
    get[DateTime]("created") ~
    get[Option[DateTime]]("last_visited") ~
    get[Boolean]("is_activated") ~
    get[Boolean]("is_admin") ~
    get[List[Permission]]("permissions") map {
      case id ~ username ~ email ~ uid ~ password ~ first_name ~ last_name ~ avatar ~ created ~ last_visited ~ is_activated ~ is_admin ~ permissions => UserWithPermissions(
        id,
        username,
        email,
        uid,
        password,
        first_name,
        last_name,
        avatar,
        created,
        last_visited,
        is_activated,
        is_admin,
        permissions
      )
    }
  }
}

object UserWithPermissions extends UserWithPermissionsSerialize

Но такая конструкция не работает. Я так понимаю, надо как-то подставить парсер для permissions в парсер UserWithPermission. Но как - не знаю... Имел ли кто-нибудь аналогичный опыт работы с anorm и межобъектными связями?

 , ,

djnoob
()

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