Ответы пользователя по тегу Java
  • Почему не работают '[', ']' и некоторые другие клавиши при симуляции нажатий на Windows XP awt.Robot'ом, и как с этим бороться?

    Labunsky
    @Labunsky Автор вопроса
    Я есть на хабре
    В итоге использовал затычку для клавиш с помощью простой обертки над JNA:
    class WinXP {
            private static boolean isXP;
            private static Map<Integer, Integer> faultyXPCodes = new HashMap<>();
    
            static {
                String os = System.getProperty("os.name").toLowerCase();
                isXP = os.startsWith("windows") && os.contains("xp");
    
                faultyXPCodes.put(91 , 0x1A); // [
                faultyXPCodes.put(93 , 0x1B); // ]
                faultyXPCodes.put(92 , 0x2B); // \
                faultyXPCodes.put(59 , 0x27); // ;
                faultyXPCodes.put(222, 0x28); // '
                faultyXPCodes.put(44 , 0x33); // ,
                faultyXPCodes.put(46 , 0x34); // .
                faultyXPCodes.put(47 , 0x35); // /
            }
    
            private static boolean isFaulty(int code) {
                return isXP && faultyXPCodes.containsKey(code);
            }
    
            private static WinUser.INPUT PrepareInput(int flag, int code) {
                final WinUser.INPUT input = new WinUser.INPUT();
    
                input.type = new WinDef.DWORD(WinUser.INPUT.INPUT_KEYBOARD);
                input.input.setType("ki");
    
                input.input.ki.wScan = new WinDef.WORD(0x0);
                input.input.ki.time = new WinDef.DWORD(0x0);
                input.input.ki.dwFlags = new WinDef.DWORD(flag | 0x8);
                input.input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR(0x0);
    
                input.input.ki.wScan = new WinDef.WORD(faultyXPCodes.get(code));
                return input;
            }
    
            private static void SendInput(WinUser.INPUT input) {
                User32.INSTANCE.SendInput(
                        new WinDef.DWORD(1),
                        (WinUser.INPUT[]) input.toArray(1),
                        input.size()
                );
            }
    
            private static void Press(int code) {
                SendInput(PrepareInput(0x0, code));
            }
    
            private static void Release(int code) {
                SendInput(PrepareInput(0x2, code));
            }
        }
    Ответ написан
    Комментировать
  • Есть ли готовые решения в java для алгоритма Keccak?

    Labunsky
    @Labunsky
    Я есть на хабре
    Есть, тут сайт библиотеки, а тут с примером использования
    Ответ написан
    Комментировать
  • Сколько нужно иметь оперативки на ноутбуке для работы с IDEA Java?

    Labunsky
    @Labunsky
    Я есть на хабре
    Двухядерный 3805U, 4 гига памяти, ссдшка, полет нормальный не первый год, до сих пор не вижу причин обновляться
    Не слушай этих ребят, которые про "минимум 8" заливают
    Если тебе не нужен андроид (которому реально меньше 8 не зайдет при сборке даже на мелких проектах), то будешь спокойно делать что угодно. Если только сам своим софтом не сожрешь всю память, конечно. Ну и докупить памяти и вставить, если потребуется - дело одного дня и пары копеек, ноутбуки же за лишние 4гб часто имеют несоразмерную наценку
    Ответ написан
    Комментировать
  • Чем распарсить .xls версии 5.0 (BIFF5)?

    Labunsky
    @Labunsky
    Я есть на хабре
    Добро пожаловать в 2003.
    Ответ написан
  • Как получить кодировку сайта?

    Labunsky
    @Labunsky
    Я есть на хабре
    В тот момент, когда ты получаешь строку, она уже в любом случае хранится в джавовской UTF-16. Именно поэтому кодировка указывается для ридера до начала чтения.
    С уже считанной строкой, если она была прочитана не в той кодировке и "испорчена", а кодировка все неизвестна, ничего сделать нельзя.
    Для того, чтобы определить кодировку исходников сайта, который выгружаешь, нужно сначала получить его не в строковом виде, а массивом байт. После этого, можно работать с ним и уже определять кодировку либо с помощью своих костылей, либо уже существующих чужих.
    Ответ написан
    1 комментарий
  • Как сделать мульти градиент?

    Labunsky
    @Labunsky
    Я есть на хабре
    Алгоритмически:
    1. Выбираем N цветов, между которыми делаем градиент;
    2. Выбираем порядок их следования в нем;
    3. Определяем расстояние между цветами;
    4. Ставим цвета на этом расстоянии и рисуем градиенты обычным способом между каждыми двумя;
    5. ???;
    6. Градиент.
    Ответ написан
    3 комментария
  • Java: как проверить сколько осталось места на диске, на котором сохраняются временные файлы?

    Labunsky
    @Labunsky
    Я есть на хабре
    StackOverflow
    public static long getFreeSpace(String path) {
        File folder = new File(path);
        return folder.getFreeSpace();
    }
    Ответ написан
    Комментировать
  • Как узнать "длину" ячейки в Apache Poi?

    Labunsky
    @Labunsky
    Я есть на хабре
    Объединенные ячейки - группа обычных, значение при этом хранится в правом верхнем углу. Таким образом, получая объект Cell, ты получаешь не объединенную ячейку, а ее кусок (со значением или без).
    Чтобы определить, принадлежит ли ячейка к объединенной группе, можно использовать код отсюда. Посчитать длину можно с его же помощью довольно тривиальным методом
    Ответ написан
    Комментировать
  • Что учить после основ Java?

    Labunsky
    @Labunsky
    Я есть на хабре
    Все это - для энтерпрайза.
    Если хочется с места в карьер - да, нужно учить и идти работать.
    Если хочется изучения именно языка - изучай спецификации и внутреннее устройство, нижележащие технологии, являющиеся общими для любого языка (сети, ос, да даже железо). Попробуй сделать что-нибудь самостоятельно с использованием изученного. А абстракции верхнего уровня уже потом смотри.

    Но это не точно
    Ответ написан
    1 комментарий
  • При открытии артефакта Java проекта не работают некоторые библиотеки, что делать?

    Labunsky
    @Labunsky
    Я есть на хабре
    Если не умеешь руками, то стоит создать артефакт в идее из модуля с зависимостями (такой пункт при нажатии плюсика), указав при этом, засунуть зависимости внутрь артефакта, или связать их через манифест и положить рядом
    Ответ написан
    8 комментариев
  • Почему не удается загрузить или найти метод main()?

    Labunsky
    @Labunsky
    Я есть на хабре
    Дело не в методе. Запускай не с помощью комманды "java Be.class", а с помощью "java Be".
    Почему оно так, читай здесь.

    UPD
    Пока писал, опередили)
    Ответ написан
    Комментировать
  • Как решить ошибку в потоках?

    Labunsky
    @Labunsky
    Я есть на хабре
    JVM не может выделить памяти для создания нового потока. Обычно это означает, что где-то есть цикл/рекурсия с созданием кучи потоков - больше, чем можно создать. Подробнее можно почитать тут.

    UPD
    По приведенному примеру кода можно сразу сказать, что не стоит запускать один поток на каждый элемент списка (как минимум, на домашнем пк), особенно если размер может быть порядка сотен. Копай в сторону Producer-Consumer и подобных паттернов.
    Ответ написан
    2 комментария
  • Как сделать альбомную ротацию pdf?

    Labunsky
    @Labunsky
    Я есть на хабре
    Использовать соответствующую библиотеку
    А тут можно почитать, как с ее помощью это можно сделать
    Ответ написан
    Комментировать
  • Занимаюсь проектом, связанным с DSA алгоритмом. Знает кто, как отправить публичный ключ на сервер?

    Labunsky
    @Labunsky
    Я есть на хабре
    а) Довольно странно. Обычно используются ключи размера не больше 3072 бит, что даже при избыточном кодировании в base64 дает 512 символов. Чисто байтовое представление же, соответственно, ограниченно 384 байтами. Возможно, стоит посмотреть на алгоритм упаковки ключа в JSON - вероятно, проблема находится где-то там.
    б) Чтобы создать новый PublicKey, достаточно спарсить открытый ключ "y" как BigInteger и передать его в стандартный конструктор вместе с остальными открытыми параметрами.
    Ответ написан
    Комментировать
  • Почему не работает метод length?

    Labunsky
    @Labunsky
    Я есть на хабре
    Для того, чтобы ArrayList знал, какие объекты в нем хранятся, нужно указать их класс явно:
    ArrayList<String> list = new ArrayList<>();
    Тогда list.get(i) будет возвращать String и желаемый код заработает.

    Запись же
    ArrayList list = new ArrayList()
    эквивалентна записи
    ArrayList<Object> list = new ArrayList<>()
    В таком случае, list.get(i) возвращает не String, а Object, у которого метода length() просто не существует
    Ответ написан
    2 комментария
  • Где взять или как написать нейронную сеть JAVA?

    Labunsky
    @Labunsky
    Я есть на хабре
    Если не хочется писать все с нуля - можно попробовать Neuroph.
    Поставляется как в виде отдельного java-приложения, так и java-библиотеки/фреймворка. Хорошая документация прилагается
    Ответ написан
    Комментировать
  • Как разделить изображение на три слоя R G B?

    Labunsky
    @Labunsky
    Я есть на хабре
    public static BufferedImage[] splitToRGB(BufferedImage original) {
        BufferedImage R =  new BufferedImage(
                original.getWidth(), original.getHeight(),
                BufferedImage.TYPE_INT_RGB
        );
        BufferedImage G =  new BufferedImage(
                original.getWidth(), original.getHeight(),
                BufferedImage.TYPE_INT_RGB
        );
        BufferedImage B =  new BufferedImage(
                original.getWidth(), original.getHeight(),
                BufferedImage.TYPE_INT_RGB
        );
    
        for (int x = 0; x < original.getWidth(); x++)
            for (int y = 0; y < original.getHeight(); y++) {
                final int rgb = original.getRGB(x, y);
    
                R.setRGB(x, y, rgb & 0xff0000);
                G.setRGB(x, y, rgb & 0xff00);
                B.setRGB(x, y, rgb & 0xff);
            }
    
        return new BufferedImage[]{R, G, B};
    }
    
    public static BufferedImage mergeRGB(BufferedImage R, BufferedImage G, BufferedImage B) {
        BufferedImage original =  new BufferedImage(
                R.getWidth(), R.getHeight(),
                BufferedImage.TYPE_INT_RGB
        );
    
        for (int x = 0; x < original.getWidth(); x++)
            for (int y = 0; y < original.getHeight(); y++) {
                final int rgb = R.getRGB(x, y) | G.getRGB(x, y) | B.getRGB(x, y);
                original.setRGB(x, y, rgb);
            }
    
        return original;
    }
    Ответ написан
    2 комментария
  • Добавление текста на фото в java?

    Labunsky
    @Labunsky
    Я есть на хабре
    Почему на Java видны так сильно пиксели? А при добавлении фотошопа нет. И как добиться сглаженного и красивого текст в java?
    Потому что по-умолчанию drawString не использует сглаживание. Как его включить, можно посмотреть в официальной документации
    Ответ написан
    1 комментарий
  • Структура данных Java. Как сделать multilist?

    Labunsky
    @Labunsky
    Я есть на хабре
    Вот такая наивная реализация приходит в голову.
    Роль заголовков исполняют два мэпа. Все остальное, по сути, хранится двунаправленными связными списками, у которых мы знаем начало

    Код
    /**
     * Created by Labunsky on 24.03.2017.
     */
    public class MultiListEntry<S, C> {
        private MultiListEntry<S, C> nextStudentEntry = null;
        private MultiListEntry<S, C> nextCourseEntry = null;
    
        private S student;
        private C course;
    
        MultiListEntry(S student, C course) {
            this.student = student;
            this.course = course;
        }
    
        public S getStudent() {
            return student;
        }
    
        public C getCourse() {
            return course;
        }
    
        public void setNextStudentEntry(MultiListEntry<S, C> next) {
            nextStudentEntry = next;
        }
    
        public void setNextCourseEntry(MultiListEntry<S, C> next) {
            this.nextCourseEntry = next;
        }
    
        public MultiListEntry<S, C> getNextStudentEntry() {
            return nextStudentEntry;
        }
    
        public MultiListEntry<S, C> getNextCourseEntry() {
            return nextCourseEntry;
        }
    }

    /**
     * Created by Labunsky on 24.03.2017.
     */
    public class MultiList<S, C> {
        private Map<S, MultiListEntry<S, C>> studentsIndex = new HashMap<>();
        private Map<C, MultiListEntry<S, C>> coursesIndex = new HashMap<>();
    
        public void add(S student, C course) {
            MultiListEntry<S, C> newEntry = new MultiListEntry<>(student, course);
            MultiListEntry<S, C> lastEntry;
    
            if (studentsIndex.containsKey(student)) {
                lastEntry = studentsIndex.get(student);
    
                while (lastEntry.getNextStudentEntry() != null)
                    lastEntry = lastEntry.getNextStudentEntry();
                lastEntry.setNextStudentEntry(newEntry);
            } studentsIndex.put(student, newEntry);
    
            if (coursesIndex.containsKey(course)) {
                lastEntry = coursesIndex.get(course);
                
                while (lastEntry.getNextCourseEntry() != null)
                    lastEntry = lastEntry.getNextCourseEntry();
                lastEntry.setNextCourseEntry(newEntry);
            } else coursesIndex.put(course, newEntry);
        }
    
        public MultiListEntry<S, C> getStudentEntries(S student) {
            return studentsIndex.get(student);
        }
    
        public MultiListEntry<S, C> getCourseEntries(C course) {
            return coursesIndex.get(course);
        }
    }
    Ответ написан
    1 комментарий
  • Как получить ответ от сервера?

    Labunsky
    @Labunsky
    Я есть на хабре
    В цикле клиента верный момент закомментирован. Вероятно, позразумевался следующий код:
    while (b) {
         out.writeUTF(line); // отсылаем введенную строку текста серверу.
         out.flush(); // заставляем поток закончить передачу данных.
    
        line = in.readUTF(); // ждем пока сервер отошлет строку текста.
        tvOut.setText(line);
    
        b=false;
    }

    В приведенном же в вопросе коде строка от сервера не принимается в принципе.
    Ответ написан