• Где найти хороший конвертер SVG to PDF?

    pi314
    @pi314
    Не совсем конвертeр, но решает (эту и не только) задачу со свистом: https://asciidoctor.org/
    (Еще, как вариант - проблема может быть не в конвертeре, в отдельных SVG.)
  • С какой стороны подступиться к JAVA EE?

    pi314
    @pi314
    MaxLich,
    Быстро и качественно, это не проблема... Проблемы, которые можно решить за деньги, это не проблемы, а просто оперативные расходы )))
    goodfastcheap1-1.png?fit=621%2C597&ssl=1
  • С какой стороны подступиться к JAVA EE?

    pi314
    @pi314
    Алексей Черемисин,
    А вообще-то SOAP они сильно разные бывают

    Да, да, именно так! SOAP бывают разные: печальные, очень печальные, и, если совсем невезуха, то "от Microsoft"... Если есть хоть малейший шанс, то самый лучший SOAP - это REST на JSON :)
  • С какой стороны подступиться к JAVA EE?

    pi314
    @pi314
    Евгений, Давным-давно, когда я был молодой и глупый, мой тогдашний шеф сформулировал такую задачу: "нужно сделать вебморду к нашему архиву изображений, с преферансом и поэтессами... на EJB" (тогда еще даже термина JEE, как такового, не было), " так что, инсталлируй Tomcat и разбирайся" )) И пошло-поехало. Довольно быстро Tomcat был заменен на OC4J и, следом, на JBoss, были перепробованы все известные IDE, фреймворки и компоненты, были переписаны (под собственные нужды) фреймворки MyFaces и части Seam, потом написан свой фреймворк, потом это все отправилось в мусорник и было заменено Spring, а потом снесено и сделано с нуля. За 5-6 месяцев был сделан прототип вебморды, а примерно через год эта хрень пошла в продакшн и через еще, примерно, год, была снова кардинально переделана. В таком виде, кажется, оно до сих пор еще где-то работает ))
    Основной урок, который я из этого вынес: книги и туториалы полезны потом, когда стало понятно, что непонятно. А до того они только мешают и уводят в сторону (иногда в такие дебри, что потом становится мучительно стыдно). Туториалов есть миллион, но, ввиду обширности темы JEE, любой из них либо размусоливает какой-то определенный аспект, отвечая на вопросы, большинство из которых еще даже не возникли, либо настолько поверхностный, что после его прочтения-проработки остается одна мысль "непонятно, но здорово". Еще есть книги, типа-справочники, в которых по капельке, но обо всем. Их полезно пролистать для общего ознакомления, чтоб знать, что там вообще бывает и ориентироваться в терминологии. Но самое действенное - просто взять и начать с какого-нибудь HelloWorld, формулировать конкретные непонятки, и уже к ним искать туториалы и углубляться.
  • Какой метода из ArrayList позволяет переместить объект из одной коллекции в другую?

    pi314
    @pi314
    Антон Сорокин, Попробуй в следующий раз задавать вопрос о том, что на самом деле нужно, а не что получится. Тогда, глядишь, и ответы будут подходить ))
  • Переквалификация из Java в C++?

    pi314
    @pi314
    Толстый Лорри, За "исключения и шаблонную магию" в embedded могут по репе настучать )) Там, порой, вообще статическое распределение памяти нужно, плюс всякие MISRA. Но именно 17 там как раз и рулит ))
  • В каком справочнике можно увидеть различные разъёмы питания?

    pi314
    @pi314
    Вопрос странный. Нет такого единого "справочника по всем типам". Абсолютно любой разъем становится "разъемом питания", если его целесообразно для этого использовать, т.е. чтоб его характеристики (макс. допустимые ток / напряжение / частота, изоляционные свойства, пыле-влаго-защищенность, термо-механическая устойчивость, удельное сопротивление контактов, способ монтажа, конструкция и т.д.) соответствовали режимам работы питаемого устройства, с учетом требований стандартов, если таковые имеются для данного типа устройств. Проще говоря, в самопальном устройстве можно использовать какой душе угодно разъем, подходящий по характеристикам, а если замастырить, например, пятиштырьковый DIN в бытовой смартфон, это сегодня уже не поймет ни стандартизатор, ни потребитель )) Так что, наилучшим справочником на сегодня являются каталоги дистрибуторов и производителей. В даташитах, обычно, указываются все важные характеристики, предполагаемое применение и каким стандартам удовлетворяет тот или иной разъем.
  • Не работает мышь и клавиатура, что делать?

    pi314
    @pi314
    Мне, к сожалению, сложно добавить к уже сказанному что-то, как "эксперту". Проблема, очевидно, в том, что клавиатура или дефектная, или, что вероятнее, требует какой-то левой инициализации, которую делает только драйвер. Самый простой вариант, как мне кажется, одолжить у кого-нибудь простую клавиатуру (которая наверняка заработает), с ней сделать установку, и потом уже играться с драйверами.
  • Как написать Maven-плагин, который автоматизирует формирование архива с обновлением, в момент сборки проекта?

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

    pi314
    @pi314
    Просто по ходу: вы не путаете, часом, широту с долготой? )) Широта, это, вообще-то, от полюса к экватору, и дальше к другому полюсу...
  • Сколько всего может быть паролей + rainbow-tables?

    pi314
    @pi314
    Тупо перебирать "влоб" смысла, разумеется, нет, именно от того, что, в худшем случае, результат будет получен тогда, когда он уже давно никому не будет нужен. (Разве что, в распоряжении перебирающего имеются вычислительные мощности, сокращающие время перебора до приемлемого, типа какого-нить супер-пупер компьютера NSA или ботнета злобных хакеров.) Однако не все так плохо - для перебора придуманы хитрые методы (просто для примера: Rainbow Tables, словарная атака). Их много разных, как общего толка, так и направленных на известные "слабости" определенных конкретных хеш-функций или их имплементаций, но все они сводятся к тому, чтоб а) уменьшить количество комбинаций, которые нужно перебрать, б) увеличив при этом вероятность нахождения подходящей "как можно быстрее", т.е., по возможности, в начале, а не в конце перебора всех необходимых комбинаций и, одновременно, в) уменьшив количество необходимой памяти.
  • Почему отваливаются колбэки jna?

    pi314
    @pi314
    nuclear_kote, А, так вот же, в доке по JNA черным по-английски написано:
    If your callback needs to live beyond the method invocation where it is used, make sure you keep a reference to it or the native code will call back to an empty stub after the callback object is garbage collected

    В приведенном коде экземпляры коллбеков создаются (new TestCallback()), но нигде не сохраняются. После выхода из main() GC имеет полное право их убить, когда сочтет нужным, и нативные коллбеки будут уходить в Нирвану... что, похоже, и происходит))
  • Почему отваливаются колбэки jna?

    pi314
    @pi314
    nuclear_kote, Ну попробуйте тогда сначала изолировать проблему. Первым делом разберитесь, какой поток приходит в коллбек - явовский или (левый) сишный. Чудес не бывает, а код и потоки - они и в африке, и в яве, и в си одни и те же. Разница только в том, что JVM ничего не знает о происходящем в нативном коде. Замените сишную библиотеку явовским моком, типа, как я сделал, и посмотрите, отваливается или нет. По крайней мере станет понятно, где проблема.
    Потом, если "только минут через 5", посмотрите, не связано ли это с GC. Возможно, где-то медленно утекает память. Пока ее хватает, работает, потом - отваливается. Для проверки дайте JVM поменьше памяти и проверьте, не наступает ли эффект быстрее. Если так, то нужно смотреть структуры данных, которые гоняются между явой и нативным кодом... кто их создает, кто удерживает ссылки. Посмотрите, что происходит с потоками и памятью в jconsole, нет ли явных различий в поведении JVM до отваливания и после. Короче, гадание на кофейной гуще не поможет. Если не локализовать проблему, никто не даст такой волшебный совет, от которого все само собой заработает ))
  • Почему отваливаются колбэки jna?

    pi314
    @pi314
    nuclear_kote, ну, значит, таки блокирующий )) если в нем бесконечный цикл )) 31 user thread уходят в него и никогда не возвращаются. Вы уверены, что хорошо понимаете, кто кому Рабинович в многопоточности? В приведенном коде ничего не может отваливаться. Эти самые 31 поток уходят, каждый в метод start() (нативный код), там колбасятся, что-то делают с сокетами, а потом, очевидно, приходят в явовский метод callback(), очевидно, каждый в каждый из 10 созданных экземпляров, и все, что они там делают - увеличивают один единственный счетчик, статический, после чего возвращаются в нативный код, где "изменяют переменные" и продолжают колбаситься в бесконечном цикле. Если это так, то тут нечему отваливаться. Единственное, что может произойти - они могут застрять в нативном коде и никогда не вернуться. Я смоделировал это вот так, чтоб не заморачиваться с JNA и стабами. Помимо, мягко говоря, странного дизайна (возможно, он чем-то оправдан, не берусь судить), никаких проблем не возникает ))
    package ex.ample;
    
    import java.util.ArrayList;
    import java.util.concurrent.ThreadLocalRandom;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicLong;
    
    
    public class Main {
        public static void main(String[] args) {
            //TestLib lib = Native.loadLibrary("hello", TestLib.class);
            final TestLib lib = new TestLib();
    
            for (int i = 0; i < 5; i++) {
                lib.registerCallback( new TestCallback() );
            }
            new Thread(() -> {
                while (true) {
                    try {
                        String msg = "-------------------"  + TestCallback.counter.get() + "  ===\n";
                        msg += lib.printInfo();
                        System.out.println(msg + "\n-RESET COUNTER ----"  + TestCallback.counter.getAndSet(0) + "->0 ==" );
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
            for (int i = 1; i < 5+1; i++) {
                new Thread(() -> lib.start()).start();
            }
            System.out.println("---\nExiting main()...\n---");
        }
    
        interface ICallback {
            void callback(int inc);
            String printStatistic();
        }
    
        public static class TestCallback implements ICallback{
            static AtomicLong counter = new AtomicLong(0);
            private final AtomicLong totalIncCounter = new AtomicLong(0);
            @Override
            public void callback(int inc) {
                counter.addAndGet(inc);
                totalIncCounter.addAndGet(1L);
            }
    
            @Override
            public String printStatistic() {
                return "cb#" + this.hashCode() + " \tcalled " + totalIncCounter.get() + " times,\tcurrently at "+ counter.get();
            }
    
        }
    
        public static class TestLib {
    
            private final ArrayList<ICallback> registeredCallbacks = new ArrayList<>();
    
            public void registerCallback(Main.ICallback cb){
                registeredCallbacks.add(cb);
            }
    
            public String printInfo(){
                String res = "";
                for(Main.ICallback cb : registeredCallbacks){
                    res += cb.printStatistic()+"\n";
                }
                return res;
            }
    
    
            public void start(){
                while(true){
                    for(Main.ICallback cb : registeredCallbacks){
                        try {
                            TimeUnit.MILLISECONDS.sleep(ThreadLocalRandom.current().nextInt(300, 700+1) );
                            int incrementThisTime = ThreadLocalRandom.current().nextInt(1, 5+1);
                            String msg = "Thread " + Thread.currentThread().getId() + "\nbefore\t" + cb.printStatistic() + "\tincrement " + incrementThisTime;
                            cb.callback(incrementThisTime);
                            System.out.println(msg + "\nafter\t" + cb.printStatistic());
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            break;
                        }
                    }
                }
            }
        }
    }

    Мораль: если что-то отваливается, причину нужно искать в сишном коде. Возможно, в нем создаются еще какие-то левые потоки, которые, на самом деле, "изменяют переменные"... состояние явовских потоков можно всегда посмотреть в jconsole. Но, в любом случае, нужно разобраться, какой код в каком потоке выполняется - без этого трудно сделать какие-либо предположения.
    P.S. да, еще соображение вдогонку: если мое предположение неверно, и в метод callback() на самом деле приходит не созданный в яве поток, а поток, созданный в сишном коде, то там и нужно смотреть, почему он отваливается.
  • Почему отваливаются колбэки jna?

    pi314
    @pi314
    nuclear_kote, А что с методом lib.start() - он блокирующий или нет? И зачем он дергается 31 раз из разных потоков... В чем тут сутъ?
  • Почему отваливаются колбэки jna?

    pi314
    @pi314
    Может быть OutOfMemory в JVM (почему - вопрос к автору кода), когда JVM уже не жива, но еще не мертва. Что значит сишный код "не блокируется"? В дебагере смотрели? Возврат из коллбека происходит, с ожидаемым результатом за ожидаемое время?
  • Как ускорить запрос SELECT с вложенными запросами?

    pi314
    @pi314
    Ответ на вопрос, как ускорить SQL SELECT всегда одинаковый: выполнить EXPLAIN, посмотреть план выполнения, какие индексы используются, какая стоимость отдельных операций... и тогда уже смотреть, как его оптимизировать ))
    Вот тут я приводил наглядный простенький пример, как пользоваться EXPLAIN, на что смотреть и т.д.
  • Как заблокировать фальшивый сайт с угрозами и раскрытием персональных данных?

    pi314
    @pi314
    Если речь о техническом вопросе, то прикладывание части скриншота в данном случае излишне, не находите? Или это такое ненавязчивое сливание помоев еще и на Тостер? ))
  • [Intellij IDEA] Как овверайдить метод класса, имея его экземпляр?

    pi314
    @pi314
    EnderBro3D, Если возникают такие ну очень странные хотелки, это верный признак того, что пора критически задуматься о кривизне получившегося ОО-дизайна ))
  • Какую стратегию использования SVN выбрать для небольшой команды?

    pi314
    @pi314
    prometian, В целом, да, но не обязательно. Это зависит от того, над чем работает. Gitflow предлагает идею иерархически организованных (по критичности) веток. Master - в нее мерджатся только готовые версии, n release веток - это то, что в SVN бычно помечают тегами, т.е. релизы, предназначенные для тестирования, develop - это то, что в SVN называют транком, святой Грааль. Эту ветку всегда поддерживают актуальной и работоспособной. Из нее после модульного и интеграционного тестирования код мерджится в release. Плюс к этому, любое необходимое количество hotfix веток от соотв. release ветки, если спасение человечества не может подождать до следующего релиза, потом мерджится либо с release веткой, либо с master - смотря как организован процесс и версионирование. И, наконец, любое количество feature веток. Они создаются от develop, в них и работает один или несколько разработчиков, работающих над этой фичей. Из них код мерджится в develop, и далее по описанной выше схеме. Это так сказать, полная идея. На практике не всегда нужен такой зоопарк, так что можно адаптировать только то, что подходит под конкретный процесс разработки.
    git-model@2x.png