@hirthwork

Тег butthurt в блоге hirthwork

hirthwork

дваждымандопроёбище блядь
оказывается, что java не перечитывает /etc/resolv.conf, если он изменился. нужно изъёбываться и вызывать через JNI res_init(3), чтобы изменения подхватились
подробности тута и по ссылкам: https://groups.google.com/f...sympathy/Z8t06cqaWQE

hirthwork

СУКА БЛЯДЬ ПИЗДА НАХУЙ
ДЕСЯТЬ МИНУТ ЗАНИМАЛА ТЕРМИНАЛ ОПЛАТЫ
СУКА ТУПАЯ НАСОСИ НА ИНТЕЛЛЕКТ УЖЕ

hirthwork

16:55. три магазина. у первого время работы до 17:00 и висит табличка "открыто", у двух других — до 18:00 и 19:00.
заперты все три.

hirthwork
  1. Захватить мир
  2. Стандартизировать Ein Tastatur с единообразным расположением и формой кнопок
  3. Сжигать в доменных печах еретиков вносящих изменения в привычное расположение движущихся частей
hirthwork

Расскажу как мне сегодня припекло от опенсорса.

Есть библиотека Apache PDFBox. Есть там одно (единственное) место, где нужно отсортировать нестандартные объекты. Под нестантартные имеются ввиду объекты, компаратор которых не отвечает требованию транзитивности.
Начиная с Java 7 стал использоваться tim sort, который кидает эксепшен, если детектит, что компаратор не обеспечивает транзитивность.
Итак, итерация первая: Чуваки написали свой собственный quick sort (сортировка Хоара), который не делает подобных проверок: http://grepcode.com/file/re...il/QuickSort.java#68

Сортировка формально правильная, вот только на длинных отсортированных массивах падает со StackOverflowError. Потому что нехуй длинные рекурсии городить.
Когда я на эту проблему наступил, то недолго думая развернул одну из веток рекурсии. Т.е. если левая часть от делителя больше, то я делаю вызов quick sort для правой, а для левой делаю split в контексте текущего вызова — таким образом максимальная глубина рекурсивных вызовов становится log N и никакой ошибки. Да и работает быстрее, за счёт устранения лишнего вызова.

Но это вы прочитали про то как проблему решает инженер. Опенсорс коммьюнити идёт совершенно другим путём. Эти специалисты решили, что если стека потока не хватает, то нужно эмулировать стек в куче! https://svn.apache.org/view...&pathrev=1723157#l71
Т.е. заводим Stack<Integer> и пихаем в него пары границ итерирования. Охуенно же! Теперь у нас есть аллокации в памяти которых у нас не было, а так же есть O(N) дополнительный вызовов Stack<Integer>.push()/pop(), которые, я напомню забывшим, являются synchronized, т.е. как минимум используют спинлок!

В общем, повторю фразу тимлида: «У меня складывается ощущение, что в опенсорсе вообще никто не думает о производительности»

hirthwork

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

hirthwork

ну давайте, блядь, кто ещё про выход яаузера под линукс не написал? пишите, блядь, не стесняйтесь, уёбища

hirthwork

Перепись видов офисных мудаков тред. Офисный мудак — это не мудак, который нарушает правила внутренного распорядка. Офисный мудак не нарушает ни единого пункта из того что официально запрещено: не пиздит громко по телефону, не мусорит, не воняет, не отвлекает других от работы. Офисный мудак нарушает законы логики, чем вызывает раздражение у рационально мыслящей части человечества. Итак:
1. Мудак разнонаправленный — вызывая лифт с кнопками «Вверх» и «Вниз» нажимает обе кнопки. Хотя он конкретно знает на какой этаж ему нужно.
2. Мудак неверующий — подходя к кабинке туалета и видя индикатор «занято» всё равно дёрнет ручку и дверь так что содрогнётся вся кабинка.

Если честно, то меня, видимо, судьба пожалела и других видов мудаков я не наблюдаю, но уверен, что вам, дорогие читатели, есть чем этот список продолжить.

hirthwork

не знаю как вам и зачем вы это делаете, но лично мне крайне обидно, когда я оказываюсь в одном BL с Weltschmerz

hirthwork

а давайте я тоже эту хуйню у себя выложу, а то мало хуйни повыкладывали.

hirthwork

Из #anwn мы узнаём, что вереск настолько криворук, что не смог на школьной лабораторке вычислить g. Я как щас помню — у меня 9.83 м/с² получилось тогда

hirthwork

Готовим разрыв шаблона в домашних условиях:
1. Открываем http://git.kernel.org/cgit/...lude/uapi/asm/stat.h
2. Смотрим на строки 12 и 13
3. Сравниваем со стоками 85 и 87
4. ...
5. FUUUU~

Зачем? Почему? Как потом подобные вещи дебажить? Кому после этого верить?

hirthwork

приехавший i2p перетёр мой wrapper.config :( придётся заново тюнить под ibm wrt jre

hirthwork

я в этой ябучей ласточке за два с половиной часа всю жопу уже отсидел. для сравнения — в задрипанном поезде на Киров жопу от езды ломитт начало только часов через пять

hirthwork

Полиморфизм, виртуальные функции, всё это сосёт. Глубоко и печально.
Представим, казалось бы обычный double-dispatch в тырпрайз коде:

// 3rd party library
struct processor {
    // returns number of processed bytes
    virtual size_t process(void* buf, size_t len) = 0;
};

struct file_processor: processor {
    // provides more effective processing routine
    virtual size_t process(FILE* file) = 0;
};

struct data_provider {
    // returns number of bytes processed
    virtual size_t process(processor& p) = 0;
};

...
struct file_provider: data_provider {
    FILE* file;
    virtual size_t process(processor& p);
};

size_t file_provider::process(processor& p) {
    file_processor* fp = dynamic_cast<file_processor*>(&p);
    if (fp) {
        return fp->process(file);
    } else {
        char buf[1024];
        size_t read = fread(buf, 1, sizeof buf, file);
        return p.process(buf, read);
    }
}

Ок, заебца, если наш processor является file_processor'ом, то data_provider'ы
умеющие работать с файлами будут использовать более эффективный метод обработки
данных. Таких оптимизаций могут быть десятки в чужой библиотеке.
А теперь, представим, что по флажку в конфиге мы хотим включать логгирование
количества обработанных байтиков.
Хуйня-война, пишем в своём коде декоратор:

struct logging_processor: processor {
    processor* parent;

    virtual size_t process(void* buf, size_t len) {
        size_t processed = parent->process(buf, len);
        std::iostream << processed << " bytes processed" << std::endl;
        return processed;
    }
};

Отлично, цифры логгируются, вот только теперь оптимизация у file_provider'а не
работает. Выхода три:
- Переопределять все возможные комбинации наследований
- Убить себя ап стену
- Перейти на хацкель

hirthwork

посмотрел исходники json-simple. ещё никогда моё желание написать свой json-парсер на рагеле не было столь сильно.

hirthwork

Суп, ночной. В общем делюсь своей попоболью. Дело в том, что я не умею строить
архитектуру программного обеспечения. Не систем вцелом (это я заебца, типа тут
ping, тут POST, а здесь мы через unix-сокет ебанём), а отдельных программ.
Например мне осенью понадобилось написать MIME-парсер, который бы грамотно
выбирал нужный multipart/alternative и превращал письмо в линейную структуру,
сохранив всю важную информацию.
Так вот, не смотря на то, что библиотека, которая производит разметку письма, у
меня была, я две недели сидел и тупил в лист бумаги, на котором пытался
изобразить обрывки мыслей о том как это всё должно работать. И только после
этого, с трудом собрав воедину целостную картину в своём утлом мозге, сел
писать код.
Настоящие профессионалы наверняка бы смогли нарисовать сначала общую структуру,
затем детализировали бы каждый из компонентов этой структуры, на третий день
бы, на основе предыдущих построений, слегка подправили механизмы взаимодействия
классов, а на четвёртый бы сели писать код и не тратили бы три недели на
полторы тыщи строк кода.

В общем, посаны и посанки, посоветуйте литературу или инструменты для того
чтобы стать АРХИТЕКТОРОМ и быстро решать подобные задачи.
inb4: Нужно больше опыта // я восемь лет уже программлю за зарплату
inb4: GoF // уже читал и проникся

hirthwork

ПОЖАЛУЙСТА ВКЛЮЧИТЕ JAVASCRIPT. В ВАШЕМ БРАУЗЕРЕ ОТКЛЮЧЕНА ПОДДЕРЖКА JAVASCRIPT. ДЛЯ ПОЛНОЦЕННОЙ РАБОТЫ ПРИЛОЖЕНИЯ НЕОБХОДИМО ВКЛЮЧИТЬ JAVASCRIPT

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.