LINUX.ORG.RU

Сообщения unC0Rr

 

Оценка занятости сетевого канала

Как можно замерить, занят канал полностью или нет? Меня не интересует просто замер скорости, т.к. я не знаю теоретического максимума (точнее, максимум меняется, и замерять его путём забивания канала не решение), нужно только как-либо образом выяснить, есть запас, пусть и небольшой, или канал забит полностью.

 ,

unC0Rr
()

Я нашёл!

observer, 4 года назад тут искали рассказ. Так вот я его нашёл!

 , некропост

unC0Rr
()

Цикл с пред- и постусловием одновременно

Есть ли такое в каком-либо ЯП? Что-то вроде

while(cond1)
{
     ...
} while(cond2)

Да, это легко реализуется разными способами, но все они требуют введения лишних сущностей либо дублирования кода. Например,

if(cond1) do
{
     ...
} while(cond2 && cond1)

или

bool f = true
while(cond1 && (f || cond2)) do
{
     f = false
     ...
}

ну и т.п. В общем, смысл в такой конструкции видится, есть ли такое в каком-либо распространённом ЯП?

 ,

unC0Rr
()

Апгрейд сайта с drupal 5 на что-нибудь современное

Имеется сайт на drupal 5, с парой десятков стандартных модулей и парочкой нестандартных и кастомной темой. На сайте новости, раздел для аплоада файлов, форум, вики. Собственно, http://www.hedgewars.org/. Денюжку обещаю, но надеюсь, что сообщество не заломит цену, т.к. профита от игры мне никакого нет, просто больно смотреть на эту неподдерживаемую древность на сайте.

джаббер unC0Rr@gmail.com

unC0Rr
()

Цикл по всем возможным значениям

Как в Си перебрать все значения от a до b, где 0 <= a < b <= 255, используя 8-битный итератор?

Вопрос возник в связи с написанием конвертера кода из паскаля в Си. В самом паскале пишешь просто

var i: byte;
...
for i:= 0 to 255 do
, а прямой перевод на Си не прокатывает:
for(uint8 i = 0; i <= 255; ++i)

 

unC0Rr
()

Управление скачиваемым контентом

Ситуация: есть игрушка, к ней можно скачивать скрипты, карты, другие плюшки. Скачанные вещи подменяют собой изкоробочные, могут иметь несколько версий. Существуют ли библиотеки, позволяющие осуществлять управление всем этим добром: распаковка, отслеживание установленных дополнительных пакетов, обновление, удаление? Или придётся писать свой велосипед? Нужно максимально кроссплатформенное решение, так что пакетный менеджер дистрибутива прошу не предлагать.

 

unC0Rr
()

Не получаю enterEvent

Нужно получить события прихода и ухода курсора для сцены. Поскольку для сцены нужных событий нет, делаю потомка от QGraphicsView:

class DrawMapView : public QGraphicsView
{
    Q_OBJECT

public:
    explicit DrawMapView(QWidget *parent = 0);
    ~DrawMapView();

    void setScene(DrawMapScene *scene);

protected:
    void enterEvent(QEvent * event);
    void leaveEvent(QEvent * event);

private:
    DrawMapScene * m_scene;
};

DrawMapView::DrawMapView(QWidget *parent) :
    QGraphicsView(parent)
{
   setMouseTracking(true);

    m_scene = 0;
}


DrawMapView::~DrawMapView()
{

}

void DrawMapView::setScene(DrawMapScene *scene)
{
    m_scene = scene;
    qDebug() << "setScene" << m_scene;

    QGraphicsView::setScene(scene);
}

void DrawMapView::enterEvent(QEvent *event)
{
    qDebug() << "enterEvent" << m_scene;
    if(m_scene)
        m_scene->showCursor();

    QGraphicsView::enterEvent(event);
}

void DrawMapView::leaveEvent(QEvent *event)
{
    qDebug() << "leaveEvent" << m_scene;
    if(m_scene)
        m_scene->hideCursor();

    QGraphicsView::leaveEvent(event);
}

leaveEvent срабатывает как положено, enterEvent - нет. Похожие проблемы не гуглятся, потому спрашиваю здесь: что я делаю не так?

 enterevent,

unC0Rr
()

Что-то вроде perfect hash

Нужен алгоритм создания хэша по заранее заданным значениям, с коллизиями по заданным значениям. На входе числа не более 255, на выходе не больше 2^32 (желательно 2^8 или хотя бы 2^16, но непринципиально).

Пример:

вход       выход
1..4,25    9001
5,17,19    31337
8..12      100500
37         0

Естественно, входные диапазоны не пересекаются.

На ум пока приходит только построение КНФ, но может есть что-то с менее громоздким результатом?

UPD: Функция должна хорошо ложиться на C, хотелось бы обойтись без перечисления десятков «case x:» для диапазонов.

 

unC0Rr
()

Стирательная резинка

Хочу сделать стирательную резинку в сцене. По идее, для этого достаточно рисовать прозрачным цветом, но не так, чтобы нарисованная линии была прозрачной, а чтобы устанавливался прозрачный цвет вместо уже нарисованного. Возможно ли это сделать и как?

 ,

unC0Rr
()

Добавление в избранное перекидывает на первую страницу

Собственно, всё описано в заголовке. Хоть и мелочь, а пусть оставляет на той же странице, я ещё не дочитал тред.

unC0Rr
()

3D фильм не в нужном формате

У меня есть фильм в формате «кадр для левого глаза в верхней половине изображения, для правого - внизу», стереоочки red-cyan. Вопрос: можно ли посмотреть фильм mplayer'ом без предварительного перекодирования? Если да, то как?

unC0Rr
()

[GCI] Hedgewars

Проект Hedgewars утверждён для участия в Google Code-in как одна из всего лишь 18 организаций. Спешите принять участие!

Новость: http://google-opensource.blogspot.com/2011/11/google-code-in-2011-participati...

Сайт GCI: http://www.google-melange.com/gci/homepage/google/gci2011

unC0Rr
()

[TCP] Перезапуск сервера

Есть сервер игры, к которому клиенты подключаются по tcp, типичное время сессии около 30 минут. Возможно ли организовать перезапуск сервера таким образом, чтобы уже подключенные клиенты продолжали сидеть на старом, а вновь подключавшиеся оказывались на новой копии сервера? Когда все клиенты отключатся от старого сервера, он закрывается.

Пробовал закрывать слушающий сокет и запускать вторую копию, но она ругается на уже занятый порт. Запрос к гуглу, выдающий релевантную инормацию, не смог придумать. Как правильно организовать такой перезапуск?

 

unC0Rr
()

[Qt][PostgreSQL] QSqlRelationalTableModel и VIEW

Есть у меня такая табличка

CREATE TABLE marks
(
  id integer NOT NULL DEFAULT nextval('marks_id_seq'::regclass),
  workdate date NOT NULL,
  personpositionid integer NOT NULL,
  reasonid integer NOT NULL,
  hours numeric(4,2) NOT NULL,
  planmarkid integer,
  <тут всякие ключи>
)

В программе создаётся QSqlRelationalTableModel для редактирования таблицы, с одним отношением вида

setRelation(3, QSqlRelation("workers.reasons", "id", "name"))

Записи создаются, редактируются и удаляются на ура, всё замечательно.

Но понадобилась дополнительная функциональность со стороны базы данных, для чего исходная таблица была переименована в marks_table, и был создан VIEW вида

CREATE OR REPLACE VIEW marks AS 
 SELECT marks_table.id, marks_table.workdate, marks_table.personpositionid, marks_table.reasonid, marks_table.hours, marks_table.planmarkid
   FROM marks_table;

с правилами на INSERT, UPDATE и DELETE, которые замечательно работают при отправке запросов в базу напрямую. Но программа почему-то начала вести себя странно: отображение данных и добавление элемента через QSqlRelationalTableModel работают, а вот удаление и редактирование записи спотыкаются с такими ошибками:

SQL query error: "ERROR:  column "name" does not exist
LINE 1: ...D "workdate" = $2 AND "personpositionid" = $3 AND "name" = $...

и

SQL query error: "ERROR:  syntax error at or near "("
LINE 1: EXECUTE  (1504, '2011-02-07', 2574, 'Я - Продолжительность р...

Куда вообще копать? С точки зрения программы в базе данных должна быть всё та же прежняя таблица marks, я неоднократно пользовался таким приёмом, правда не использовал QSqlRelationalTableModel, только QSqlTabelModel, с которой не возникало никаких проблем при работе с view.

 ,

unC0Rr
()

[KDE4] Текущая погода

В стандартном виджете, показывающем текущую погоду за окном, не могу найти свой город Архангельск, в КДЕ3 такой проблемы не было. Есть ли какие-нибудь альтернативные виджеты или сайты с погодой?

unC0Rr
()

[Haskell][TCP сервер]Чтение из закрытого сокета/хендла

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

Чтобы воспроизвести проблему я запускаю сервер, захожу неткатом на него, отсылаю строки [«QUIT», «1», «2»] и пустую строку, завершающую пакет. Сервер реагирует на это отключением клиента с сообщением [«BYE», «1»]. Далее запускаю некат и повторяю действия, и тут начинаются «чудеса». Поясню, как работает сервер: на каждого клиента заводятся потоки (forkIO) на приём и на отправку, общающиеся с основным потоком через Chan-ы. Таким образом, на приём работает что-то вида

forever (hGetLine handle >>= \msg -> writeChan chan $ Message (clientId, msg))
Поток висит на hGetLine, и при получении строки отсылает её ядру сервера. При отключении клиента по идее он должен просто отваливаться с исключением.

Но тут случается странная вещь. Когда сервер отключает первое подключение, слушающий поток продолжает ждать строку от хендла. При повторном подключении система выдаёт хендл с тем же номером, создаётся второй поток, и теперь два потока ждут строки! Более того, они оба получают эти строки, каждый через одну. Соответственно, первый поток присылает ядру команды от уже несуществующего клиента, второй поток присылает неправильные команды от текущего клиента. Переписывание сетевой части с хендлов на сокеты ситуацию никак не изменило.

Вопросов куча. Почему при закрытии хендла/сокета могут оставаться потоки, ждущие с него данных, и более того, продолжающие читать с нового хендла/сокета с тем же номером? Как бороться с таким поведением? Как вообще правильно писать такие программы на хаскеле? Как работают с блокирующими вызовами в программах на других ЯП? Почему раньше работало, а сейчас перестало?

 

unC0Rr
()

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