• Можно ли подключить роутер по Wi-Fi к сети с предварительной аутентификацией?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Переключить свой роутер в режим моста.
    Начните с клонирования MAC адреса - установите в настройках своего роутера адрес уже зарегистрированного устройства.
    Если это не поможет, значит стоит более умная защита - отслеживание времени жизни пакета, DPI и тд.
    Ответ написан
    Комментировать
  • Можно ли подключить роутер по Wi-Fi к сети с предварительной аутентификацией?

    Jump
    @Jump
    Системный администратор со стажем.
    как подключить к этой сети роутер и раздать с него интернет на другие устройства?
    Хорошая идея, но провайдер может поставить защиту от этого.

    Но как с него пройти аутентификацию в браузере?
    Зачем с него? С любого устройства подключенного к роутеру.
    Ответ написан
    Комментировать
  • Правда ли, что сейчас так сложно найти работу?

    Zoominger
    @Zoominger
    System Integrator
    Сложилось впечатление, что рынок очень сильно переполнен

    Верное впечатление.

    А как при таком раскладе, ищут работу люди ниже уровня сеньора?

    В целом, страшно только в сфере веба, нормальные программисты ищут работу относительно легко.

    Может уже прошли те золотые it времена

    Да. Теперь это бизнес.

    весь хайп о "молочных реках и кисельных берегах" выгоден только вайтишным курсам?

    Да.
    Ответ написан
    17 комментариев
  • Как запустить 10000 классов в java?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Прежде всего нужно заметить, что запустить класс нельзя, его можно только объявить, а запускать можно методы экземпляров этого класса. Почему я и подумал, что вопрос неправильно сформулирован.

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

    Генерировать можно как java-код, так и байткод. Первый способ использует популярная библиотека Lombok. Для него понадобиться механизм работы с AST и механизм взаимодействия с компилятором. Oracle JDK и Open JDK предоставляют Compiler API, реализующий оба механизма. Кроме того, есть и другие инструменты для работы с AST, например Eclipse JDT. Я покажу применение пакета com.sun.tools.javac из Compiler API.
    Сноска
    До Java 9 пакет com.sun.tools.javac был упакован в tools.jar, поставляемый вместе с JDK. Начиная с 9-ки API компилятора вынесли в модуль jdk.compiler, не экспортирующие свои пакеты. Теперь можно не указывать путь до tools.jar в classpath, но нужно добавлять экспорты. В остальном ничего не изменилось.
    import java.lang.reflect.Method;
    import java.net.URI;
    import java.util.ArrayList;
     
    import javax.tools.JavaCompiler;
    import javax.tools.JavaCompiler.CompilationTask;
    import javax.tools.JavaFileObject;
    import javax.tools.SimpleJavaFileObject;
    import javax.tools.ToolProvider;
    
    import com.sun.tools.javac.code.Flags;
    import com.sun.tools.javac.code.Type;
    import com.sun.tools.javac.file.JavacFileManager;
    import com.sun.tools.javac.model.JavacElements;
    import com.sun.tools.javac.processing.JavacProcessingEnvironment;
    import com.sun.tools.javac.tree.JCTree;
    import com.sun.tools.javac.tree.TreeMaker;
    import com.sun.tools.javac.util.Context;
    import com.sun.tools.javac.util.List;
    import com.sun.tools.javac.util.Name;
    
    
    /**
     * Класс эмулирующий для компилятора файлы исходного кода
     * и позволяющий компилировать код прямо из памяти
     */
    class JavaSourceFromString extends SimpleJavaFileObject {
        private final String code;
    
        public JavaSourceFromString(String name, String code) {
            super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
            this.code = code;
        }
    
        @Override
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
            return code;
        }
    }
     
    public class CompilerDemo {
        private static final String BASE_NAME = "DynamicHello";
        private static final ClassLoader classLoader = ToolProvider.getSystemToolClassLoader();
        private static final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    
        /**
         * Метод формирующий абстрактное синтаксическое дерево
         * и преобразующий его в исходный код
         */
        private static String generateSource(String className) {
            Context ctx = new Context();
            JavacFileManager.preRegister(ctx);
            TreeMaker treeMaker = TreeMaker.instance(ctx);
            JavacElements elements = JavacElements.instance(ctx);
    
            JCTree.JCModifiers modifiers = treeMaker.Modifiers(Flags.PUBLIC);
    
            // Тело генерируемого метода
            // выводящее имя класса
            JCTree.JCBlock methodBody = treeMaker.Block(0, List.of(
                treeMaker.Exec(
                    treeMaker.Apply(
                        List.<JCTree.JCExpression>nil(),
                        treeMaker.Select(
                            treeMaker.Select(
                                treeMaker.Ident(
                                    elements.getName("System")
                                ),
                                elements.getName("out")
                            ),
                            elements.getName("println")
                        ),
                        List.<JCTree.JCExpression>of(
                            treeMaker.Binary(
                                JCTree.Tag.PLUS,
                                treeMaker.Literal("I am "),
                                treeMaker.Apply(
                                    List.<JCTree.JCExpression>nil(),
                                    treeMaker.Select(
                                        treeMaker.Apply(
                                            List.<JCTree.JCExpression>nil(),
                                            treeMaker.Select(
                                                treeMaker.Ident(
                                                    elements.getName("this")
                                                ),
                                                elements.getName("getClass")
                                            ),
                                            List.<JCTree.JCExpression>nil()
                                        ),
                                        elements.getName("getName")
                                    ),
                                    List.<JCTree.JCExpression>nil()
                                )
                            )
                        )
                    )
                )
            ));
    
            // Определение генерируемого метода
            JCTree.JCMethodDecl method = treeMaker.MethodDef(
                modifiers,
                elements.getName("introduceYourself"),
                treeMaker.Type(new Type.JCVoidType()),
                List.<JCTree.JCTypeParameter>nil(),
                List.<JCTree.JCVariableDecl>nil(),
                List.<JCTree.JCExpression>nil(),
                methodBody,
                null
            );
    
            // Определение генерируемого класса
            JCTree.JCClassDecl tree = treeMaker.ClassDef(
                modifiers,
                elements.getName(className),
                List.<JCTree.JCTypeParameter>nil(),
                null,
                List.<JCTree.JCExpression>nil(),
                List.of(method)
            );
    
            return tree.toString();
        }
    
        /**
         * Метод компилирующий исходный код
         */
        public static void compile(Iterable<? extends JavaFileObject> compilationUnits) {
            CompilationTask task = compiler.getTask(null, null, null, null, null, compilationUnits);
            task.call();    
        }
    
    
        /**
         * Метод запускающий сгенерированные классы с помощью рефлексии
         */    
        public static void loadAndRun(String className) throws ReflectiveOperationException {
            Class<?> cls = classLoader.loadClass(className);
            
            Method method = cls.getDeclaredMethod("introduceYourself");
            method.invoke(cls.newInstance());    
        }
    
        public static void main(String[] args) throws Exception {
            java.util.List<JavaFileObject> sources = new ArrayList<>();
    
            // Генерируем исходный код десятка классов
            for (int x = 0; x < 10; x++) {
                String className = BASE_NAME + x;
                sources.add(new JavaSourceFromString(className, generateSource(className)));
            }
    
            // Компилируем сгенерированный код
            compile(sources);
            
            // Запускаем скомпилированные классы
            for (int x = 0; x < 10; x++) {
                loadAndRun(BASE_NAME + x);
            }
        }
    }

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

    Продолжение в первом комментарии, а то я в лимит символов не укладываюсь.
    Ответ написан
    3 комментария
  • Бот для телеграмма на JAVA, как обойти блокировку в коде?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Не используйте LongPolling - решение не годится для продакшена, только вебхуки.
    Чтобы не тратится на домен можно использовать самоподписанный сертификат на ip.
    Пример генерации сертификата
    openssl req -newkey rsa:1024 -sha256 -nodes -keyout /home/localhost.key -x509 -days 3650 -out /home/localhost.cert -subj "/C=US/ST=New York/L=Brooklyn/O=Example Company/CN=<тут ip сервера>"


    Хостите бота на заграничных серверах.

    Для локальной разработки использовать https://localtunnel.github.io/www/
    Вещь жуть какая нестабильная, но из аналогичных решений это единственный сервис, что предоставляет именованные поддомены бесплатно.

    Чтобы немного решить проблемы с падениями, запускайте программу в цикле
    Вариант для windows
    FOR /L %N IN () DO @lt --port <локальный порт> --subdomain <поддомен>
    Ответ написан
    Комментировать
  • Tomcat и Java на флешке, возможно ли?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Да никаких проблем:
    1. Скачиваете архив JDK
    2. Распаковывайте его на флешку
    3. Скачиваете архив Tomcat
    4. Распаковывайте его на флешку
    5. Скачиваете архив Eclipse
    6. Распаковывайте его на флешку

    Остаётся создать в корне флешки батник, устанавливающий переменные окружения
    @echo off
    
    set "JAVA_HOME=%CD%\jdk-10.0.1"
    set "PATH=%JAVA_HOME%\bin;%PATH%"
    Ответ написан
    1 комментарий
  • Ползунок выбора диапазона времени?

    twobomb
    @twobomb
    А что у самого рук нет написать? Вот держи
    Ответ написан
    1 комментарий
  • Как прийти от знаний уровня простых алгоритмов и стандартных библиотек Java к Java EE и Spring?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Просто берёшь учебники, читаешь и практикуешься.
    5a53ac08cf030078714128.jpeg
    Ответ написан
    Комментировать
  • Java или C++ в качестве первого языка. Что выбрать?

    @Mercury13
    Программист на «си с крестами» и не только
    Только Java. Почему…
    1. Достаточно удачная стандартная библиотека.
    2. Проверка массивов на индекс — для начинающего бесценно.
    3. Не настолько полагается на указатели, когда человек ещё толком не знает, что это такое.
    4. Очень строгая проверка типов.
    5. Статическая типизация, Си-подобный синтаксис (хотя всё это у обоих).
    6. Сообщения об ошибках не настолько страшны (стандартная библиотека Си++ полагается на шаблоны).
    Вторым языком человек уже съест что угодно, но Си без плюсов — один из худших первых. Си++ не так плох, но Java, по-видимому, лучше.
    Ответ написан
    4 комментария
  • Откуда пошло разделение терминов с Client-side и Server-side на Front end и Back end?

    sim3x
    @sim3x
    Потому что client side - браузер
    server side - веб сервер, интерпретатор, СУБД

    Фронтендер не пишет браузер
    Бекендер не пишет веб сервер, СУБД и тд
    Ответ написан
    Комментировать
  • Почему не отправляется post запрос в guzzle 6?

    v_decadence
    @v_decadence
    $client->request('POST', '/post', [
        'form_params' => [
            'foo' => 'bar',
            'baz' => ['hi', 'there!']
        ]
    ])
    Ответ написан
    1 комментарий