• Запись звонков с несольких телефонов и сохранение?

    Zoominger
    @Zoominger
    System Integrator
    Можно ли записывать разговоры

    И уже вот тут мы спотыкаемся.
    Нет, нельзя.
    Ответ написан
    Комментировать
  • Какой самый "лёгкий" эмулятор андроида или иоса)?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Из подобного типа BlueStacks самый лёгкий.
    Легче только AVD, который идёт в комплекте с Android Studio
    Ответ написан
    6 комментариев
  • Асинхронность, многопоточность в андроид?

    @rPman
    Да android (это linux + java или что угодно) - многопоточная операционная система (и запускается на железе с несколькими ядрами в процессоре, давно), и да вам никто не мешает как пользоваться этим так и нет.

    Асинхронность не подразумевает использование threads, например можно использовать асинхронные сокеты в пределах одного потока.

    Вот в комментариях к вопросу немного разжевано.
    Ответ написан
    Комментировать
  • Чем отличается web-разработчик от web-программиста?

    Zoominger
    @Zoominger
    System Integrator
    Web-Разработчик занимается разработкой сайтов, а web-программист занимается программированием сайтов.
    Ответ написан
    3 комментария
  • Какие языки программирования лучше всего оплачиваются в России, США и Европе?

    @mamontm
    Оплачиваются не языки программирование.

    Оплачивается умение ими пользоваться.

    Есть буквально одно исключение - Cobol.
    Это один из старейших языков программирования, на котором начали писать еще тогда когда ваши родители еще не родились.
    Приходится иметь дело с очень древними программами, причем выполняющими весьма ответственные вещи, где высока цена ошибки (первыми, кто мог позволить себе компьютеры был очень крупный бизнес)

    о наблюдениям сервиса «Мой круг» в России последние пару лет по зарплатам лидируют...

    Вы неверно интерпретируйте данные.

    Просто ряд языков чаще используется в недорогих простых проектах. Что не отменяет их же использование в дорогих проектах. Но искажает понятие "средняя зарплата".

    Плюс недорогих проектов всегда намного больше. Что еще более искажает понятие "средняя зарплата".

    Ну то есть математически-формально всё так как описано в обзоре зарплат.

    Но вас же интересует, поди, сколько лично вы будете зарабатывать, если смените язык?
    А ваш заработок связан вовсе не с языком - а с тем, что вы в этом случае будете и с другим работодателем работать и опыта постепенно набераетесь.

    Причём если Scala и Elixir два года назад по зарплатам опережали прочие языки с сильным отрывом и за последние годы выросли по зарплате несильно, то Go и Objective-C за эти же два года совершили сильный отрыв от остальных языков и догнали Scala и Elixir

    Все упомянутые нельзя назвать распространенными на простых (то бишь на дешевых) проектах.

    P.S.:
    Узнаю типичный страх начинающего новичка (и типичное заблуждения уже начавшего новичка, который уже успел разочароваться в том, что ему не предлагают сходу 100 500 миллионов баков в месяц, как об этом все трубят) -

    "Я выучу не тот язык и карьера будет погублена"
    "Я выучу тот язык и карьера пойдет вверх".

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

    Важно ваше умение программировать. А это понимание/знание - алгоритмов, парадигм, концепций, паттернов.

    Эти вещи из языка в язык повторяются.
    Трудно выучить только первый.

    Сменить язык программисту с опытом - не сложно.
    Ответ написан
    8 комментариев
  • Какой рынок программирования НЕ «перегрет»?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Вообще замерзает рынок специалистов уровня сеньор.
    Вакансии висят месяцами и годами.

    Не перегрет рынок уровня мид. Вакансий полно.

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

    Поэтому выбирайте любую область, которая вам нравится, чтобы лично у вас была заинтересованность и желание дойти до приемлимой квалификации.
    Ответ написан
    2 комментария
  • Какой рынок программирования НЕ «перегрет»?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Рынок системных программистов. Особенный дубак в области разработки компиляторов, виртуальных машин, сборщиков мусора и т.п.
    Ответ написан
    3 комментария
  • Блокировка функциональности мобильного телефона?

    deepblack
    @deepblack
    возможно ли создание мобильного приложения или сервиса которое в определенном помещении или зоне будет блокировать функции телефона, а именно камеру и диктофон?

    Теоретически возможно, но
    • Работать это будет через Ж...
    • Легко обойти
    • Кто добровольно согласится ставить подобное приложение?


    Проще запретить устройства административными мерами.
    Либо использовать аппаратный Speech Jammer/Audio Jammer для препятствия записи голоса.
    Для видео можно предложить использовать мощный инфракрасный прожектор(ы) в определенном спектре.
    Но тут вопрос как это скажется на здоровье людей, в данном помещении?

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

    Это только на уровне ядра ОС, либо аппаратно.
    Но такое вам вряд ли под силу.
    Ответ написан
    2 комментария
  • Существует ли GIT-клиент с ограниченной глубиной хранения?

    SagePtr
    @SagePtr
    Еда - это святое
    Git для такого не предназначен, увы
    Ответ написан
    Комментировать
  • Как реализовать p2p, когда оба юзера за NAT?

    robux
    @robux
    бородат
    1. Перфорация NATов:
    UDP-pounching
    TCP-pounching (SYN-TCP)
    Для координации нужен третий узел-посредник, а дальше уже напрямую.

    2. IPv6:
    Можно эмулировать в IPv4 сервисами Teredo (в Windows) или Miredo (в Linux).

    3. Специальные протоколы для роутеров и не только. Гуглить по словам:
    IGD (UPnP), NAT-PMP (в рамках Bonjour), STUN, NAT-T (IKE), TURN, RSIP, MIDCOM, ICE, SBC, ALG, ICM (расширение к STUN+TURN).
    Ответ написан
    1 комментарий
  • Лента для домашних бэкапов?

    @Tabletko
    Системный администратор
    Зависит от размера бекапа. Если у вас 100500ТБ данных которые надо бекапить - может быть. На касету LTO-5 влезает 1,5ТБ(3 со сжатием). Диск на 4ТБ стоит 6-8т.р. Стоит заморачиваться с поиском стримера (а в идеале 2) и искать касеты, искать контроллер которым вы его будете подключать (обычно FC)? LTO-6 ещё актуален в энтерпрайзе, а значит и стоит достаточно дорого.
    Ответ написан
    3 комментария
  • Можно-ли скачать видео с YouTube используя DevTools?

    Есть такая «секретная» ссылка: www.youtube.com/get_video_info?video_id=XXXXXX
    Вместо XXXXXX подставьте хэш видео, который в ссылке на ролик, типа youtu.be/BWCiWZtrWXU после слеша.

    По этой (первой) ссылке вернутся URL-encoded данные. Распакуйте их и возьмите параметр url_encoded_fmt_stream_map. Его значение опять надо распаковать как URL-параметры. И из результата вытащить параметр url – это ссылка на единый скачивабельный видеофайл.

    Например, в консоли браузера:
    function getUrlParams(search) {
        let hashes = search.slice(search.indexOf('?') + 1).split('&')
        let params = {}
        hashes.map(hash => {
            let [key, val] = hash.split('=')
            params[key] = decodeURIComponent(val)
        })
    
        return params
    }
    var s = '------'; // здесь длиннющая строка из ответа /get_video_info
    var a = getUrlParams(s);
    var b = getUrlParams(a.url_encoded_fmt_stream_map);
    console.log(b.url); // эту ссылку открываем в браузере - это скачиваемый видеофайл


    Очень надеюсь, что вы покопаетесь в этих данных более подробно, разберётесь, как получать прямые ссылки на скачиваемые файлы во всех форматах и размерах, которые предлагает YouTube, и напишете короткий материал на Хабр по результатам, а также опубликуете gist с рабочим кодом для консоли браузера.
    Ответ написан
    3 комментария
  • Какую школу по онлайн обучению языку JAVA с нуля вы можете посоветовать?

    Никакую. Могу посоветовать Эккеля и Блоха. И полезней и дешевле и быстрее.
    Ответ написан
    4 комментария
  • Книга о безопасном коде?

    GreyCrew
    @GreyCrew
    Full-stack developer
    есть книга Совершенный код
    там есть глава, где описаны подходы безопасного программирования, и отдельно о проектировании и написанию кода, очень подходит для новичков в отличие от Чистого кода , хотя ее я тоже советую.
    Ответ написан
    Комментировать
  • Откуда берутся сотые доли при умножении на дробное число?

    Stalker_RED
    @Stalker_RED
    Такое не только в js, но и в подавляющем большинстве других языков (см. https://0.30000000000000004.com )

    Потому что процессоры не могут представлять дробные числа с бесконечной точностью. Про это есть стандарт IEEE 754, и это в принципе нормально (или просто все давно привыкли). Можно повышать точность вычислений, но тогда они будут длиться дольше, и можно округлять результаты.
    Ответ написан
    Комментировать
  • Зачем делать поле приватным а затем создавать для него геттер и сеттер?

    Zoominger
    @Zoominger
    System Integrator
    Для безопасности, чтобы никто не мог просто так поменять переменную.
    Для того, чтобы другой программист, который будет пользоваться этим кодом, не смог выстрелить себе в ногу.
    Для валидации, да.
    Да и вообще, это хорошая практика.
    Ответ написан
    Комментировать
  • Какие языки программирования учить для разработки на андроид?

    @beduin01
    Dart
    Ответ написан
    Комментировать
  • Как запустить 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 комментария
  • Как сохранить БД при обновление play market?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Нет, ничего не очищается. Все данные приложения остаются на месте. Если БД не изменилась, то ничего делать не надо. Если БД изменилась, надо поднимать номер версии и писать миграцию(как это устроено, зависит исключительно от используемой БД).
    Ответ написан
    Комментировать
  • Почему появилась ошибка No Activity found to handle Intent?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Потому что на этом эмуляторе нет приложения, способного обработать такой интент. Нужно смотреть в список активити, способных обработать интент. Если он пуст, то показывать пользователю соответствующее сообщение. Также приложения, содержащие такие активити, могут быть отключены, так что нужно смотреть, что есть хотя бы один элемент с providerInfo.enabled == true. Также, есть китайцы, которые провайдят это поле неправильно, так что вызов стороннего приложения с таким интентом лучше в любом случае заворачивать в try..catch.
    Ответ написан
    Комментировать