Я и мой ёбаный кот на фоне ковра. Войти !bnw Сегодня Клубы
УНЯНЯ. У нас есть немножечко инфы об этом пользователе. Мы знаем, что он понаписал, порекомендовал и даже и то и другое сразу. А ещё у нас есть RSS.
Теги: Клубы:

java.text.Normalized.isNormalized(...) на мегабайтном файле может работать ОЧЕНЬ медленно, но если разрезать на куски по килобайту и прочекать каждый, то всего несколько мс

#YNC1B6 (1) / @hirthwork / 3348 дней назад

если нормализовать текст сразу в NFC, то время выполнения составляет 87 секунд. а если сначала в NFD, а затем в NFC, то 17

#4B1MSV (0) / @hirthwork / 3350 дней назад

java.net.URI.create(String) выполняет юникодную нормализацию uri. \u0438\u0306 будет превращено в \u0439, точнее, в %d0%b9, потому что "й" оно и в Африке "й". Жаль только, не все HTTP-клиенты так делают

#S4HSB7 (0) / @hirthwork / 3353 дня назад

открыл для себя java.text.Normalizer
три года мечтал о таком

#XDCCE6 (0) / @hirthwork / 3354 дня назад

ёбаный type erasure. это говно даже хуже чем невозможность перегрузить функцию в сишечке по типам входных значений

#C11LZP (4) / @hirthwork / 3360 дней назад

dae

public interface GenericAutoCloseable<E extends Exception> extends AutoCloseable {
    @Override
    void close() throws E;
}
#X6HCWI (4) / @hirthwork / 3378 дней назад

I used to be an adventurer like you, then I dereferenced NULL pointer

#D3WTUR (3) / @hirthwork / 3454 дня назад

позавчера вышла tika-1.9 наконец-то умеет толком извлекать всякую метаинфу из видеофайлов

#PGF48F (8) / @hirthwork / 3474 дня назад

tfw кто-то в 2017 году всё ещё использует Closeable объекты вне try-with-resources

#KMCHMX (0+1) / @hirthwork / 3477 дней назад

public class AsyncLock
Можно было бы поставить тег */b/ если бы я это в репозиторий не запушил

#M6TEH3 (3) / @hirthwork / 3498 дней назад

Это чувство, когда JVM от IBM считает себя умнее тебя и приходится идти на ухищрения дабы его наебать и сэкономить памяти на долгоживущих строках:

$ cat Main.java
import java.lang.reflect.Field;

public class Main {
    public static void main(final String... args) throws Exception {
        Field f = String.class.getDeclaredField("value");
        f.setAccessible(true);
        StringBuilder sb = new StringBuilder(40);
        sb.append("01234567890123456789012345");
        String s1 = sb.toString();
        sb.append("hello, world!");
        String s2 = sb.toString();
        Object v1 = f.get(s1);
        Object v2 = f.get(s2);
        System.out.println(v1 == v2);
    }
}

$ javac Main.java
$ java Main
false
$ /opt/ibm/java-x86_64-80/bin/java Main
true
#EPK53Y (1) / @hirthwork / 3502 дня назад

protected Members:If members are declared as protected then these are accessible to all classes in the package and to all subclasses of its class in any package where this class is visible.

#H8UMU8 (0) / @hirthwork / 3509 дней назад

интересная статья как в джаве вызвать незаоверрайженный метод родительского класса не из наследного класса: http://javachannel.org/posts/bypassing-subclass-method-overrides/

#3AF6OO (0) / @hirthwork / 3515 дней назад

оказалось, что joda-time изкоробки нет метода у DateTimeFormatter, который бы максимальное быстро распарсил из строки столько сколько нужно, и вернул количество символов, на которое нужно отступить

#3Z7TKF (0) / @hirthwork / 3524 дня назад

У меня вопрос, но начну с введение в то как я до него дошёл.
Допустим, у нас есть какой-то коллбэк, в качестве примера возьмём FutureCallback из всячески уважаемой мной библиотеки HttpCore.
Допустим также, что мы угорели по асинхронности и поэтому после того как коллбэк завершил свою работу, мы хотим сообщить об этом куда следует. Например, чтобы там новый запрос запустили или ещё чего.
Наивная имплементация будет выглядеть примерно так:

public class CompletingFutureCallback<T> implements FutureCallback {
    private final FutureCallback<? super T> callback;
    private final Runnable completionCallback;

    public CompletionFutureCallback(
        final FutureCallback<? super T> callback,
        final Runnable completionCallback)
    {
        this.callback = callback;
        this.completionCallback = completionCallback;
    }

    @Override
    public void cancelled() {
        callback.cancelled();
        completionCallback.run();
    }

    @Override
    public void completed(final T result) {
        callback.completed(result);
        completionCallback.run();
    }

    @Override
    public void failed(final Exception e) {
        callback.failed(e);
        completionCallback.run();
    }
}

Зоркий глаз сразу скажет: А что если коллбэк был написан говнокодером и он кинет unchecked exception в ответ на вызов cancelled, completed или failed? Тогда completionCallback вызван не будет. Ладно, переделаем на finally. Далее уже рассматриваем рефакторинг одной функции, благо все они однотипные:

@Override
public void cancelled() {
    try {
        callback.cancelled();
    } finally {
        completionCallback.run();
    }
}

Зоркий глаз возразит ещё раз: А что если оба коллбэка написаны одним и тем же говнокодером и completionCallback.run() так же кинет unchecked exception? Да, после того как unchecked exception кинул callback.cancelled(). Даже если мы где-то снаружи ловим все Throwable, то информация о первом эксепшене будет безвозвратно потеряна.
В этот момент перфекционист вырывает клок волос из головы и призывает в помощь try-with-resources:

class Completer implements AutoCloseable {
    private final Runnable completionCallback;

    public Completer(final Runnable completionCallback) {
        this.completionCallback = completionCallback;
    }

    @Override
    public void close() {
        completionCallback.run();
    }
}

public class CompletingFutureCallback<T> implements FutureCallback<T> {@Override
    public void cancelled() {
        try (Completer completer = new Completer(completionCallback)) {
            callback.cancelled();
        }
    }
    …
}

Вот теперь всё предельно корректно:
Если callback кинет исключение, то completer.close() так же будет вызван, и если он также кинет исключение, то это второе исключение будет добавлено к первому в список suppressed и при печати стек-трейса его будет видно и можно будет поанализировать.
Ну а если callback отработал как следует, то completer.close() так же будет вызван, а если исключение, if any, будет также проброшено наружу.

#KIFEAY (7) / @hirthwork / 3537 дней назад

Посоветуйте годную гуглгруппу или иной ресурс, куда можно было бы запостить
пост со сравнением двух сходных идиом и чтобы получить нормальную дискуссию.
SO не подходит, потому что у меня скорее не вопрос, а приглашение к обсуждению.
В гуглгруппсы глянул и их там сотни и первые две на полнены вопросами типа
how to hide and show cursor in JTextField? и происками HR

#ZPF3PC (14) / @hirthwork / 3537 дней назад

ну давай по пунктам разберём по ссылке написанное) складывается ощущение что авторы по жизни обиженные, про таких говорят что Брин не хотел, а Пэйдж не старался))

When you add a throw statement to an existing function, you must examine all of its transitive callers.

Ничего не должен, потому что для checked exceptions компилятор сам скажет, где эксепшен забыли обработать или пробросить

functions may return in places you don't expect

Тупо похуй где они вернут, главное что. И в случае checked exceptions явно указывается какие исключения могут возникнуть в конкретной функции

Lots of supporting machinery is needed to make writing correct exception-safe code easy.

Какая разница, где чистить ресурсы в goto statement или в finally? Только checked exceptions и try-with-resources делают многие вещи автоматическими

Turning on exceptions adds data to each binary produced, increasing compile time (probably slightly) and possibly increasing address space pressure.

Пиздёж без пруфов и бенчмарков

For example, invalid user input should not cause exceptions to be thrown

Вот это вообще пушка. Какая им разница, как парсер запроса сообщит наружу об ошибке? Это уже приблуда, которая response генерит пусть перехватить эксепшен и сообщит юзеру, что он мудак. А во внутренние дела парсера пусть не лезет. Эксепшены как раз и прудуманы для того чтобы делегировать обработку ошибок кому надо.

В общем, тебе нужно много думать о своём поведении, стремиться к пробуждению сознания)

#COD9FW (7) / @hirthwork / 3548 дней назад

http://docs.oracle.com/javase/8/docs/api/java/nio/file/DirectoryStream.html:

If an I/O error is encountered when accessing the directory then it causes the Iterator's hasNext or next methods to throw DirectoryIteratorException with the IOException as the cause.

public final class DirectoryIteratorException extends ConcurrentModificationException

Пиздец, блядь. «У нас какая-то хуйня случилась при итерировании по директории!» — «Кидай RuntimeException, чтобы программер заебался дебажить!»
Вот натурально, давно требуется уже интерфейс который бы позволял итерирование, но мог кинуть эксепшен в процессе. Казалось бы — один новый интерфейс и небольшая поправка в JLS. Но нет! Мы будет маскировать IOException под RuntimeException.

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

#JWBD3D (11) / @hirthwork / 3552 дня назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.