Страницы

Поиск по вопросам

понедельник, 20 мая 2019 г.

Правильный тип для String int double boolean

Задача стоит в проектировании БД для интернет магазина.
У каждого товара есть набор характеристик (связь многие ко многим разбивается через промежуточную табличку). У сущности "характеристика" есть кроме id еще String name и ??? value
Вопрос в том, какой лучше тип выбрать для value ?? пока склоняюсь к типу String, в который можно писать все вышеперечисленные типы. Еще есть мысли по поводу не заморачиваться и написать туда Object или Serializible.
С точки зрения проектирования какое решение будет правильнее?
Spring Boot (Spring JPA)


Ответ

Еще есть мысли по поводу не заморачиваться и написать туда Object или Serializible.
А заморочиться придется...
Это ровно та задача, которая стоит перед любым разработчиком универсальной структуры данных. Путь известен и проторен не одним десятком прогеров, включая и меня самого. Основные положения:
Типизация (без него никуда), с основными типами: целое, с плавающей точкой, булевая, дата, строка. Ну может еще что-то. Реализация типа на уровне класса
Если подробнее то примерно так (простейшая реализация для двух типов строка и целое число):
abstract class MyType { abstract void setValue(int value); abstract void setValue(String value); abstract String getValue(); } class MyTypeString extends MyType { private String valueString=null;
@Override void setValue(int value) { valueString=new StringBuilder().append(value).toString(); }
@Override void setValue(String value) { valueString=value; }
@Override String getValue() { return value; } }
class MyTypeInt extends MyType { private Integer valueInt=null;
@Override void setValue(int value) { valueInt=value; }
@Override void setValue(String value) { try { int val=Integer.parseInt(value); valueInt=new Integer(val); } catch(Exception ex) { valueInt=null; } }
@Override String getValue() { return new StringBuilder().append(valueInt).toString(); } }

как замерить время выполнения функции Android Studio?

есть ряд процедур как выявить самую долгую?
сейчас делаю так
long p0 = System.currentTimeMillis(), p1,p2,p3; proc1(); pt1 = System.currentTimeMillis()-p0; proc2(); pt2 = System.currentTimeMillis()-p0-p1; proc3(); pt3 = System.currentTimeMillis()-p0-p1-p2;
в Android Studio может есть встроенный функционал?


Ответ

Попробуйте с помощью TimingLogger
TimingLogger timings = new TimingLogger(TAG, "methodA"); // ... do some work A ... timings.addSplit("work A"); // ... do some work B ... timings.addSplit("work B"); // ... do some work C ... timings.addSplit("work C"); timings.dumpToLog();
На выходе
D/TAG ( 3459): methodA: begin D/TAG ( 3459): methodA: 9 ms, work A D/TAG ( 3459): methodA: 1 ms, work B D/TAG ( 3459): methodA: 6 ms, work C D/TAG ( 3459): methodA: end, 16 ms

Не меняется курсор в FireFox

По событию mousedown создаётся под указателем новый элемент со своим набором стилей, в том числе собственный вид курсора.
$(document).ready(function() { $("input").on("mousedown", function() { $("body").append("

") }); $(document).on("mouseup", function() { $("div.resizable").remove(); }); }); .resizable { width: 100px; height: 100px; position: absolute; top: 5px; left: 5px; cursor: move; background: #eee; }
В Chrome и IE всё работает как надо, а вот Firefox вредничает: курсор остаётся тем же, что был до mousedown


Ответ

Судя по всему, FF показывает курсор input'а до тех пор, пока нажата кнопка. Можно попробовать исправить так (но код с mouseup кривой - надеюсь, он тут для примера):
$(document).ready(function() { $("input").on("mousedown", function() { $(this).addClass("move-cursor") $("body").append("

") }); $(document).on("mouseup", function() { $(this).removeClass("move-cursor") $("div.resizable").remove(); }); }); .resizable { width: 100px; height: 100px; position: absolute; top: 5px; left: 5px; cursor: move; background: #eee; } .move-cursor { cursor: move; }

Префикс не связан c пространством имён SVG

Хочу сделать текст дугой. Как видно в данном примере тут все отображается, а вот если в браузере открыть, то получаю вот такую ошибку и в Opera Chrome, FF


А вот в EDGE && IE просто пустота без всяких ошибок. Не смотря на ошибку, я вопрос в любом случае хотел написать, так как хотел спросить помощи в разъяснении логики построение координат атрибута d элемента path, но тут получается два вопроса в одном...

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

И может кто разъяснить хотя бы приблизительно какая координата атрибута d элемента path за что отвечает?
Lorem ipsum dolor sit amet consectetur.


Ответ

#1.
Немного уточню вопрос. Сообщение об ошибке появляется при открытии файла с расширением *.svg Если точно такой же код SVG сохранить с расширением *.html то сообщения об ошибке не будет.
В современных браузерах html парсер, если есть ошибки в svg коде пропускает их и выполняет код дальше. В вашем коде не указано пространство имен XML. Парсер svg считает это ошибкой и останавливает выполнение файла.
Необходимо добавить в шапку svg файла строчки определяющие namespace xml:
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
и тогда ваш код будет работать в любом окружении. Lorem ipsum dolor sit amet consectetur.
Отсюда вытекает практический совет,- делать отладку svg кода в его родном окружении, то есть в файле с расширением *.svg и только потом добавлять код в html страничку.
#2.
И может кто разъяснить хотя бы приблизительно какая координата атрибута d элемента path за что отвечает?
d="M0.057,0.024c0,0,10.99,51.603,102.248,51.603c91.259,0,136.172,53.992,136.172,53.992" />
M (moveto) - переместить перо в точку с координатами (X,Y) 0.057,0.024 c с этого символа начинается формула кубической кривой Безье – The cubic Bezier curve

Как перемещать приложение, если шапка с кнопками управления окна (закрыть/свернуть/расширить) скрыта

Как скрыть верхнюю шапку где находятся кнопки управления приложения (закрыть/свернуть/расширить), но в тоже время можно было бы перемещать приложение.
Как саму шапку скрыть я понял, но как сделать чтобы можно было бы при этом перемещать приложение
import sys from PyQt5 import QtWidgets, QtCore
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QMainWindow() w.setWindowFlags(QtCore.Qt.FramelessWindowHint) w.show() sys.exit(app.exec_())


Ответ

Пример:
from PyQt5.QtWidgets import QWidget, QApplication from PyQt5.QtCore import Qt
class Widget(QWidget): def __init__(self): super().__init__()
self.setWindowFlags(Qt.FramelessWindowHint)
self.old_pos = None
def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.old_pos = event.pos()
def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: self.old_pos = None
def mouseMoveEvent(self, event): if not self.old_pos: return
delta = event.pos() - self.old_pos self.move(self.pos() + delta)
if __name__ == '__main__': app = QApplication([])
w = Widget() w.show()
app.exec()

Равенство 4 текстовых значений

Почему 1 == 1 == 1 == 1 выдает результат true, а 'knx' == 'knx' == 'knx' == 'knx' выдает результат false


Ответ

потому что 1 это ещё и true. попробуйте так 2 == 2 == 2 == 2 - будет false
работает примерно так:
(1 == 1) == 1 == 1 итого (true) == 1 == 1 далее ((true) == 1 ) == 1 - тоже true (так как 1 это true). Ну и так далее...
'knx' == 'knx' == 'knx' == 'knx' : 'knx' == 'knx' == 'knx' == 'knx' -> (true) == 'knx' == 'knx' -> (true == 'knx') - false

StackExchange.Redis: несколько вопросов по транзакциям

Возникло несколько вопросов по работе транзакций в StackExchange.Redis:
Можно ли помещать в одну транзакцию команды, предназначенные для разных нод в кластере? Например, у ключа первой команды хэштэг {1}, а у ключа второй команды -- {2}. (Подозреваю, что нельзя.) В каких случаях вызов Execute()/ExecuteAsync() возвращает false? Только когда установленные условия не были выполнены? Может ли вызов вернуть false, если условия вообще не были установлены? Eсли происходит ошибка сети или внутренняя ошибка Redis, то вызов Execute()/ExecuteAsync() выбросит исключение или вернет false? Нужно ли еще проверять таски всех команд (предполагается, что все команды корректные и не должны выбрасывать ошибок) или они просто будут в состоянии cancelled?
К сожалению, документация насчет #2 и #3 не слишком подробная.

Этот вопрос -- дубликат с enSO


Ответ

Я заглянул в исходники StackExchange.Redis, а также поигрался с драйвером, и вот что обнаружил:
при вызове методов команд у ITransaction никакого общения с сервером не происходит драйвер обращается к Redis только после вызова Execute()/ExecuteAsync()
Поэтому ответы следующие:
Как подсказали в оригинальном вопросе на enSO, в случае кластера все multi-key команды должны соответствовать одному слоту. В контексте кластера транзакция считается multi-key командой.
Redis Cluster implements all the single key commands available in the non-distributed version of Redis. Commands performing complex multi-key operations like Set type unions or intersections are implemented as well as long as the keys all belong to the same node.
https://redis.io/topics/cluster-spec
При попытке выполнить транзакцию с невалидными ключами получим исключение "Multi-key operations must involve a single slot".
Execute()/ExecuteAsync() возвращает false в двух случаях: когда условия транзакции не были выполнены и транзакция была отменена, и когда драйвер не смог поставить команду в очередь (например, если на сервере кончилась память). Все таски при этом помечаются как canceled. Также Execute()/ExecuteAsync() не возвращает false если некоторые команды завершились неудачно (например, если команда была адресована ключу с неправильным типом значения). В случае проблем с сетью, Execute()/ExecuteAsync() выбрасывает исключение, а все таски остаются в состоянии waiting for activation.
Итого, таски следует проверять только когда Execute()/ExecuteAsync() возвращает true: каждый таск будет содержать или результат команды, или ошибку (см. свойство Exception).