LINUX.ORG.RU

Сообщения xmichael

 

Не работает обнаружение игр в ЛВС (виртуальной)

Пользуюсь Hamachi для создания виртуальной сети с товарищем, но почему-то в играх не работает обнаружение игр в локальной сети. Например, в играх на движке Source есть вкладка с серверами в локальной сети, и она пуста, хотя прямое подключение через «connect xx.xx.xx.xx» работает. Или в играх Codemasters (Dirt etc) не находит игры LAN. Подскажите в каком направлении копать? Как приложение или система отличает физическую локальную сеть от виртуальной?

 , ,

xmichael
()

Отображение двух Map в одну таблицу

Начал изучать JPA, и при реализации примерного проекта возникли сложности. Имеются сущности Product и Supplier. Необходимо для каждого продукта иметь цену и остаток по каждому поставщику. Задача состоит в отображении двух свойств сущности Product в одну физическую таблицу, которую назовем SUPPLIER_PRODUCT. Структура таблицы видится такой:

PRODUCT_ID | SUPPLIER_ID | PRICE | QUANTITY
с ходу попытался описать сущность соответствующих свойств продукта, сославшись на одну таблицу и столбец-ключ:
@ElementCollection
@CollectionTable(name = "SUPPLIER_PRODUCT")
@MapKeyColumn(name = "supplier_id")
@Column(name = "price")
private Map<Long, Long>	prices = new HashMap<Long, Long>();

@ElementCollection
@CollectionTable(name = "SUPPLIER_PRODUCT")
@MapKeyColumn(name = "supplier_id")
@Column(name = "quantity")
private Map<Long, Integer> qtys = new HashMap<Long, Integer>();
Ключ Long карт - это фактически @Id сущности Supplier (почему Long, а не сам Supplier, это тема для отдельного вопроса, но я надеюсь, что к моей проблеме отношения не имеет). И вот, при попытке заполнить эти поля и сохранить:
product.getPrices().put(supplier.getId(), product_price);
product.getQtys().put(supplier.getId(), product_qty);
products.save(product); // products - это Spring JpaRepository
бросается исключение:
Caused by: org.h2.jdbc.JdbcSQLException: Нарушение уникального индекса или первичного ключа: "PRIMARY_KEY_CE ON PUBLIC.SUPPLIER_PRODUCT(PRODUCT_ID, SUPPLIER_ID) VALUES (1830, 2, 3)"
Unique index or primary key violation: "PRIMARY_KEY_CE ON PUBLIC.SUPPLIER_PRODUCT(PRODUCT_ID, SUPPLIER_ID) VALUES (1830, 2, 3)"; SQL statement:
insert into supplier_product (product_id, supplier_id, quantity) values (?, ?, ?) [23505-193]
Насколько я понял, фреймворк делает insert при записи Quantities, хотя стоило бы делать update уже существующей строки.

Я понимаю, что можно обойтись одной картой, а два свойства вынести в отдельный Embedded класс, вероятно это решит проблему. Но не упускаю ли я способ, позволяющий избежать создания нового класса?

 , ,

xmichael
()

Beans и обработка событий изменения свойств

Привет. Есть у меня самописный набор классов а-ля Java Beans, т.е.:

class DummyBean
{
  private String m_str_prop;
  private List<PropertyListener> m_listeners;
  
  @PropertyAccessor
  public String getStringProp()
  {
    return m_str_prop;
  }

  @PropertyAccessor
  public void setStringProp(String a_str)
  {
    if(!m_str_prop.equals(m_str_prop = a_str))
    {
	// дергаем слушателей
	firePropertyChangeEvent();
    }
  }
  // ...
  public void addPropertyListener(PropertyListener l)
  {
    // ...
  }
  
  public void firePropertyChangeEvent()
  {
    // ...
  }
  // далее код анализа свойств бина и доступа к ним по строковому ИД (см. пояснение)
}
Т.е. бин с одним свойством «StringProp» типа String, при изменении которого должны оповещаться слушатели. За последнее ответственен метод firePropertyChangeEvent(), который, как видно, не имеет информации о том, какое именно свойство было изменено (предположим таки, что свойств у нас более одного).
Задача сделать так, чтобы вышеупомянутый метод каким-то образом сообщал слушателям идентификатор события.
Внимательный ЛОРовец наверняка заметил аннотацию PropertyAccessor. Это велосипед, который позволяет занести свойства бина в мап, чтобы пользователь мог применить оба способа изменения свойства:
DummyBean db = new DummyBean();
db.setProperty("StringProp","new value"); // первый способ
db.setStringProp("new value"); // второй способ
Вся магия заключается в том, что класс бина через Reflection ищет у себя методы, помеченные аннотацией, и, разделяя эти методы на геттеры и сеттеры, а так же определяя имя свойства по имени метода, заносит все это в мап, чтобы пользователь мог воспользоваться «первым» из способов.
Напомню задачу, нужно чтоб слушатели события изменения свойства получали его идентификатор. Решение проблемы очевидно (с самого начала :) ):
...
  @PropertyAccessor
  public void setStringProp(String a_str)
  {
    if(!m_str_prop.equals(m_str_prop = a_str))
    {
	// дергаем слушателей
	firePropertyChangeEvent("StringProp");
    }
  }

  public void firePropertyChangeEvent(String a_prop_id)
  {
    // ...
  }
...
Но это совершенно не круто, у нас могут быть десятки бинов, у каждого из которых пара десятков свойств, нехорошо заставлять программиста руками писать строковый ИД свойства в каждом сеттере, когда эта же информация уже есть в имени метода!
Извиняюсь за простыню, надеюсь доступно объяснил проблему, жду ваших вопросов/предложений по решению)
PS. Вот, например, есть вариант в методе firePropertyChangeEvent() определять имя вызывающего метода путем анализа стека. Но это совсем не красиво, кмк.
Еще можно использовать compile-time аннотации, чтобы компилятор дописывал ид события сам. Это труъ?

 

xmichael
()

Android: превратить тачскрин в тачпад

Привет. Имеется планешет на RK3188, у которого часть сенсорного экрана не работает (полоса вдоль, ~3 см). Есть ли способ сделать так, чтобы жестами по тачскрину можно было бы перемещать виртуальный курсор мыши на самом планшете (как если бы мышь или тачпад были бы подключены к нему по юсб)?

Перемещено JB из linux-hardware

 , ,

xmichael
()

Left4Dead2, radeon и vsync

В былые времена я ломал голову над тем, как заставить работать vsync по всей системе (kwin, видео), теперь появилась обратная проблема.
Небольшое отступление:
Поставил на старый ноут left 4 dead 2 (C2D 2.2, 3Gb RAM, HD3650+fglrx, kubuntu 12.04). ФПС меня, мягко говоря, не порадовал (~30), и было решено обновиться до 14.04 и перейти на открытый драйвер radeon, который в последнее время так хвалят (к тому же часто упоминается, что именно l4d2 на нем бегает даже лучше, чем на каталисте).
Каково же было мое разочарование, когда в обновленной системе, в которой я еще и поставил ядро 3.16 и месу из гита, фпс стало ~20 с просадками до 15 в тяжелых сценах... Естественно, речь идет о минимальных настройках игры, нативном разрешении 1280х800. Пробовал снизить разрешение - прибавилось около 10 кадров в секунду. Включение опции R600_DEBUG=hyperz не привело к заметным изменениям. Я понимаю, что железо слабое, но, помнится, на минималках было играбельно в оффтопике давным-давно, да и каталист в кубунте получше будет, но возвращаться не хочу.
А теперь вернемся к vsync'у. Если не получится поднять производительность, то нужно хотя бы отключить vsync. В данной игре работает какой-то адаптивный vsync, подозреваю, что тройная буферизация, фпс держится на 60(если смотреть в стену), 30, 20, 15 и тд. Тиринга и правда нет, но лаг мыши существенный; настройка всинка в игре ничего не меняет. Кроме того, заметил, что во всей системе нет тиринга, ни в квине, ни в видео. Опять же, настройки vsync'а kwin'а ничего не меняют, поэтому я решил, что «проблема» в драйвере или иксах. Нагуглил переменную окружения vblank_mode=0, пробовал с ней запускать glxgears - всинк пропал. Запустил с ней же steam и l4d2 - там, как раньше, синкается. Нагуглил опцию иксов

Option "SwapbuffersWait" "false"
Всинк пропал везде, в том числе и в игре. Но появился тиринг в квине, включение в его настройках всинка не помогло - такой вариант не устраивает. В общем, нужно убрать всинк из игры, оставив в системе.
К слову о повышении производительности: на минималках картинка слишком красивой остается, все еще работает HDR, например. Особенность линукс-порта, что-ли...

 , , , ,

xmichael
()

Multiseat на одном SSD

Хотел сделать дуалсит на основе двух виртуальных машин (или хотя бы хост+виртуалка); имеется только один SSD... Дело в том, что хотелось бы, чтобы виртуалки пользовали SSD и работали разные примочки для сохранения скорости и продления жизни, типа TRIM. Но даже если я отдам виртуалке раздел целиком, трима не будет. Подскажите, не имеют ли какие-либо современные средства виртуализации возможностей типа проброса TRIM или, может, не стоит заморачиваться по этому поводу (контроллер SandForce)? Кроме того, есть еще два варианта:

  • докупить еще ССД и пробросить в виртуалки соответствующие SATA контроллеры (благо их два имеется);
  • забить на виртуализацию и помучаться с мультиситом на двух Xorg, при этом получив трим и проч.

Первый вариант затратный, а второй с кучей мелких заморочек с разделением разных устройств по пользователям (плюс 90% найденной инфы относится к годам 2010-2011). Это я к тому, почему все еще надеюсь на чудо и не сделал выбор из этих вариантов :)
PS. Дополнительные требования к мультиситу: полноценное аппаратное ускорение графики, разделение звука, привязка определенных портов или контроллеров USB к пользователям.

 , , ,

xmichael
()

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