Задать вопрос
  • Android. Как убрать этот отступ?

    a13xsus
    @a13xsus
    Lazy developer
    так на вскидку сложно сказать точно, вероятно смещение от топа у RecyclerView на 10dp + 4 dp от родителя RelativeLayout

    <ru.redo.steamlucky.ui.view.InventoryRecyclerView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/inventory_list"
                    android:background="@drawable/timer_background"
                    android:layout_marginTop="10dp"
                    android:padding="4px"/>
    Ответ написан
    1 комментарий
  • Можно ли формировать http запросы без помощи curl, sockets и т.д., а, например, с помощью js?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Человек предлагает выполнять запрос из браузера и светить пароль, пусть даже в виде хэша? Возьмите https://github.com/jhaoda/SMSCenter и не мучайтесь.
    Ответ написан
    Комментировать
  • Есть ли фреймворк для разработки Android приложений по типу Yii?

    mitaichik
    @mitaichik
    Согласен с коллегами - Android SDK и есть основной фреймворк. Но вставлю свои пять копеек:

    Я бы не советовал переносить принципы разработки Yii на Андройд-приложения. Ибо 90% процентов кода андройда - это отображение/ввод информации. Причем по иному принципу, нежели HTML + CSS + JS + AJAX, и там море своих премудростей, сложностей, особенностей. Да и сам Java гораздо мощнее и сложнее чем PHP. Поэтому советую не пытаться переделать Android под привычный php-html подход, а понять и принять его методы, иначе будет очень сложно и рано или поздно ты все равно придешь к этому.

    Что касается фреймворков - то для андройда уже написанно куча всего своего, выбирай лучше не самые удобные варианты (например, какой-нить новомодный AR которым пользуются 2 человека, хоть он и божественен), а то что проверено временем. Какого-либо определенного фреймворка который охватывает все-все-все вроде как нет, но есть много специализированных:

    Gson, Otto, Retrofit/OkHttp, ButterKnife, Android Data Binding, AndroidAnnotations, RoboGuice и прочее прочее - какой лучше юзать - этом лучше спрашивать у Androdi-спецов, я - любитель.
    Ответ написан
    Комментировать
  • Как сделать запрос?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SELECT `u`.`id`, `u`.`name`
      FROM `article_subject` AS `as`
      JOIN `user_subject` AS `us` 
        ON `as`.`article_id` = :article_id AND `us`.`subject_id` = `as`.`subject_id`
      JOIN `users` AS `u` 
        ON `u`.`id` = `us`.`user_id`
    Ответ написан
    Комментировать
  • Как передать arraylist во фрагмент?

    SanchelliosProg
    @SanchelliosProg
    Java, Android, Software Testing
    Ну, во первых, класс Wishbone должен реализовывать интерфейс Parcelable . AndroidStudio должна легко в этом помочь, ну, плюс покопайся немного в документации как этот интерфейс использовать. Иначе, ты не сможешь запихнуть этот ArrayList в Intent, в данном случае.

    Далее всё просто. Например, создаёшь коллекцию ArrayList, передаёшь её в Intent в качестве Extra (метод putExtra()).

    В целевой Activity/Fragment парсишь Intent, и выдёргиваешь свою коллекцию с помощью метода getParcelableArrayList("КЛЮЧ_КОТОРЫЙ_ТЫ_УКАЗЫВАЛ_КОГДА_ПОМЕЩАЛ_КОЛЛЕКЦИЮ_В_EXTRA")
    Ответ написан
    Комментировать
  • Как хранить сессию в мобильном приложении?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Не важно на чем Вы пишите и как (PHP, rest/не-rest и т.д.): схема - везде одна.

    Про сессию:
    1. Сервер создаёт идентификатор сессии и всегда указывает его при ответе на каждый запрос клиента.
    2. Клиент использует этот идентификатор (обычно хранит в куках браузера) при каждом последующем запросе.
    3. Если сервер в ответе указал НОВЫЙ идентификатор сессии, клиент - должен использовать новый.

    Про токен:
    Токен объединяет в себе авторизацию и сессию с помощью операции хэширования.
    1. После получения идентификатора сессии от сервера, клиент отправляет хешированную информацию на основе логина, пароля и полученного идентификатора.
    2. Сервер проверяет и, если всё верно, выдаёт токен для последующих запросов.
    3. Для защиты от восстановления формулы хэширования на основе одинаковых данных, используется полиморфизм: добавляется параметр random и timestamp к передаваемым параметрам.
    4. Для защиты уникальности - на стороне сервера предусматривается суточное хранение всех запросов на основе токена.

    Токен может быть как постоянным, так и одноразовым.
    1. Постоянный - когда при каждом запросе к серверу он не меняется.
    2. Одноразовый - когда после каждого запроса к серверу, сервер выдаёт новый токен.
    Ответ написан
    2 комментария
  • Android. Как правильно реализовать смену контента на экране?

    @Atllantis
    Да всё так же.
    Ещё, как вариант, можно на интерфейсах всё сделать.
    Хотя вариантов много может быть. Всё зависит от приложения.
    Ответ написан
    Комментировать
  • Android. Как правильно реализовать смену контента на экране?

    @itdroid
    Для Вашей задачи нет универсального и "правильного" решения, все зависит от UI и бизнес логики приложения. Для простых View, Ваше решение вполне рабочее. Единственное, можно использовать View.GONE вместо View.INVISIBLE, чтобы невидимые View не участвовали в процессе измерений контейнера.
    Если у Вас сложный UI для errorBlock, допустим это форма отправки сообщения об ошибке по email или еще что-то этом роде, то можно подумать об отдельном фрагменте для errorBlock.
    А так, просто не значит плохо!
    Ответ написан
    Комментировать
  • Android. Загрузка изображений в список. Почему так происходит и как это исправить?

    artemgapchenko
    @artemgapchenko
    Запрос на загрузку картинки через image-loader отрабатывает не мгновенно, поэтому у вас и возникает небольшой gap между запросом на загрузку и отрисовкой нового изображения. Я этой библиотекой не пользовался, поэтому есть два варианта:
    1. Не подключили или же не до конца настроили работу с кэшем, поэтому изображения всегда грузятся или из сети, или из disk-cache, минуя in-memory cache.
    2. С кэшем всё нормально, просто по каким-то причинам загрузчик не успевает сделать так быстро, чтобы смена картинок была незаметной. Перед загрузкой нового изображения или убирайте изображение из ImageView: imageView.setImageResource(0);, или устанавливайте placeholder.
    Ответ написан
    Комментировать
  • Android. Загрузка изображений в список. Почему так происходит и как это исправить?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Это происходит из-за того, что уже ненужные (те, что прокрутились за экран) изображения ставятся в переиспользуемые вьюхи. Что делать - выкинуть UIL(очень его не люблю), взять нормальный Glide или Picasso.
    Другой вариант - в tag ImageView запоминать последний запрошенный url, его же запоминать в коллбеке, сравнивать, и, если они не совпадают, картинку не устанавливать.
    Имхо, первый вариант лучше.
    Ответ написан
    2 комментария
  • Как установить значение переменной названием свойства объекта?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    es2015
    function ajax (type, value){
        var request = {
            [type]: value
        };
    }

    es5
    function ajax (type,value){
        var request = {};
        request[type] = value;
    }
    Ответ написан
    Комментировать
  • Как при открытии браузера вернуть пользователя обратно в приложения?

    @aol-nnov
    > куда копать???
    в официальную документацию, вестимо!
    Ответ написан
    Комментировать
  • Для чего нужен Docker?

    @spotifi
    Внутри Docker только Linux, и, экспериментально, FreeBSD. Запускается нативно под Linux и, экспериментально, под FreeBSD. Под MacOSX, Windows - через виртуальную машину.

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

    Это почти виртуальная машина. Почти, да не совсем.


    Есть такое понятие "ад зависимостей". Любое ПО устанавливаемое на компьютер, тянет за собой зависимости (конфигурационные файлы, статические файлы называемые обычно asset, вспомогательные утилиты/сервисы, библиотеки и пр.). Ряд из этих библиотек/утилит/сервисов несовместим друг с другом. А с учетом того, что каждая из этих библиотек/утилит/сервисов имеет и свои зависимости - ситуация еще хуже.

    Например, мы используем Yandex.Cocaine, которая нормально компилируется только на Ubuntu 14.04 (и, вроде, на Debian 7). Но не под CentOS 6, 7, Debian 8, FreeBSD 9, 10, Ubuntu 15, 16 и пр. - скомпилировать его невозможно. Запускаем в этих операционных системах в Докере.

    С другой стороны, и одновременно с этим, вам необходимо установить другое, более современное ПО. И одновременно более старое. Причем речь даже не идет об серьезно отличающихся версиях Linux. Например, одно ПО требует не менее Ubuntu 14.10, а другое не более Linux 14.04.

    Docker - это одна программа внутри индивидуального окружения с индивидуальной версией операционной системы. За счет слоеных контейнеров, если вы используете один корень для всех образом, то размер Docker контейнера всего-то на несколько килобайтов больше размера бинарного файла, запускаемого под Docker.

    Таким образом, мы имеем бинарный файл запускаемый как бы в своей операционной системе.

    Вы можете сказать - ба, да это же давно известная виртуальная машина. Но нет, это не так. Это так называемые контейнера. Никакой виртуальной машиной там и не пахнет. За исключением Windows и MacOSX, где работа без виртуальном машины пока экспериментально возможно только, а нормой в этих ОС является использование Докера внутри полноценной виртуальной машины.

    Но виртуальные машины с Докером используются только для разработки. Для запуска в production виртуальные машины с Докер не используются.

    Докер использует контейнеры операционной системы. LXC в Linux, Jails в FreeBSD. Контейнер - это область операционной системы, изолированная от основной части операционной системы. В контейнере свое дерево каталогов (включая системные /dev, /bin, /sbin и пр.), свои сетевые порты и пр. и пр.

    Но при этом не используется полная виртуализация. Что существенно экономит ресурсы. Запустить 100 полноценных виртуальных машин вряд ли получится даже на мощном сервере. А вот запустить 100 контейнеров Docker даже на слабом домашнем компьютере - возможно.

    Правда использование не полной виртуализации ограничивает использование операционных систем внутри контейнеров. Как правило, это специально подготовленные версии Linux или FreeBSD. Именно специально подготовленные. Windows - в принципе в контейнере запустить невозможно.

    Контейнеры существовали и до Docker. Докер, строго говоря, это всего лишь очень удобный набор инструментов, собранных воедино, для управления контейнерной виртуализацией. Но очень удобный.

    Зачем это используется?

    Ребята из всяческих Dropbox, Facebook и и пр. гигантах, запускающие по 1 млн. различных программ в своих сервисах, столкнулись, что невозможно везде гарантировать идентичные настройки операционной системы. А это критично.

    Вплоть до того, что идеально написанная и оттестированная программа на реальном сервере начинает себя вести непредсказуемо.

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

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

    Это позволяет гарантировать гораздо большую идентичность среды разработки и среды исполнения.

    До этого люди мучались, придумывали хитрые инсталяторы...

    Потом плюнули на попытки упорядочить окружение в ОС - и сейчас концепция такова - устанавливать программы на сервера вместе со своими индивидуально настроенными под них операционными системами - то есть внутри контейнеров. 1 контейнер = 1 настройка ОС = 1 программа внутри.

    Другими словами:
    • Докер-контейнер нужно использовать для отладки.
    • Тот же Докер-контейнер нужно использовать и на сервере.


    Это позволяет не трудиться с настройками "под сервер" локально на машине разработчика. Это позволяет разрабатывать на машине разработчика совершенно разные программы одновременно, которые требует несовместимых настроек операционной системы. Это позволяет давать гораздо больше гарантий, что программа на сервере будет вести себя также как и на машине разработчика. Это позволяет разрабатывать под Windows/MacOSX с удобным "прозрачным" тестированием под Linux.

    Докер применим к созданию/настройке только серверного программного обеспечения под Linux (экспериментально под FreeBSD). Не для смартфонов. А если десктопов - то только программное обеспечение без GUI.

    Посколько Докер позволил одним махом упростить работу разработчикам и админам и повысить качество результата - сейчас бум на Докер. Придумано огромная гора инструментов для управления развертыванием приложений созданных с Докером. Если раньше чтобы запустить 10 000 программ на 1000 серверах нужно было как минимум 3 высококвалифицированнейших девопса, которые писали кучу описаний как это сделать на Puppet, Salt, Chef, Ansible, да и то не было гарантий, это все тестилось месяцами. То сейчас с Докер даже один квалифицированных девопс может рулить миллионами программ на десятках тысяч серверов. С куда как большей гарантией, что все это заведется нормально.

    UPD:

    Может сложиться ложное впечатление, что разработчик готовит контейнеры в Докер, а потом передает их админу.
    Правильная методология все же другая:

    Разработчик отдает весь свой результат в систему CI (обычно через git)
    CI на каждый новый коммит делает с помощью Docker образ для тестирования.
    Если тесты проходят успешно, то этот же самый Docker образ, отправляется на развертывание в production.
    Или, чуть иначе в компилируемых системах, где исходники не нужны в production: в Docker производится развертывание среды для компиляции, а для тестирования разворачивается второй образ с уже откомпилированным добром, который уже отправляется в production.

    То есть при правильной огранизации дела разработчик не может/не должен влиять на то, какой будет образ.
    А вот в тестовой среде (запускаемом на сервер, недоступном разработчику в больших командах) и в production как раз используется один и тот же образ.

    Основная идея - что тестировали, ровно то и запускаем на боевом сервере. Один-в-один, включая те же самые файлы (не такие же, а именно те же самые).
    Ответ написан
    16 комментариев
  • Для чего нужен Docker?

    @viiy
    Linux сисадмин \ DevOps
    Представьте что нет никакой ложки докера.

    1) Есть одна физическая машина. Вы устанвливаете софт, разные приложухи, базы, web сервера, заходят тестовые юзеры, что-то запускают. Первая проблема - вы не понимаете кому что надо, кто владелец файлов, приложух, зачем висят демоны и кто за это ответственнен. Как выход, вы решаете это разделить на виртуалки.

    2) У вас есть физическая машина + на ней виртуалки. Вы выделяете под каждую задачу свою виртуалку, там сидят отдельные пользователи, вы навели какой то порядок. Появляется задача - пользователи хотят php 6, а его нет, хотят python3, а его нет, хотят Mongo, а она старой версии. Вы обновляете репозитарии, качаете новые пакеты, ставите, часть пользователей довольны, часть нет - им нужна старая версия какая была. Упс!

    3) Одна физическая машина + еще больше виртуальных машин. Вы разделили всех пользователей так, чтобы никто не дрался за версии софта, если нужен php6 - иди на эту машину, нужен php5 - вот на эту. Все счастливы, но появляются разработчики, которые говорят буквально так - "а у меня на рабочей машине все работает, я перенес все как было на виртуалку, а у меня появляется ошибка missing library libXXX.so.X". И вы понимаете что вам остается только создать полную копию машины разработчика, чтобы софт поехал на этой виртуалке без ошибок... И тут появляется Docker! :)

    4) Docker решает именно эту проблему. Вам не нужно заботится о софте который установлен на сервере/виртуалке. Вы просто берете и переносите софт со всеми "кишками" на другой сервер и он просто работает. Работает за счет того, что все "кишки" это слои файловой системы нанизанные как бисер друг на друга. Дополнительно решается проблема свободного места, т.к слои многократно переиспользуются контейнерами, если вам нужен php + одна библиотека, а другому php + другая библиотека, вы используете (грубо говоря) слой php, а для дополнительной библиотеки делаете отдельный слой, одновременно другой человек делает над php другой слой и вы не деретесь между собой и не видите чужих библиотек. Это грубо и скорее всего ради одной библиотеки никто новый слой не делает, делают слой пожирнее.

    Все запущенные процессы Docker помещает в изолированную среду процессов, файловой системы и сетевого стека. Есть много особенностей по работе с Docker, т.к он предполагает, что в одном контейнере вы запускаете один процесс. Если вам нужно запустить целый набор демоном, тут появляются проблемы, нужно писать шелл-скрипт, который все это поднимет в контейнере. Так же есть особенности по сети, файловой системе. Для кого то Docker спасение и решение всех проблем, но я как сисадмин от этого всего не в восторге.
    Ответ написан
    15 комментариев
  • Как добавить метод в стандартный объект JavaScript?

    NaN
    @NaN
    Object.defineProperty(Object.prototype, 'flip', {
    
       value: function(){},
       enumerable: false,
    
    });
    Ответ написан
    Комментировать
  • Как сделать, чтобы при наведении на картинку она подсвечивалась цветом?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Примерно так:
    https://jsfiddle.net/dte9m42q/
    Ответ написан
    Комментировать
  • В чем моя причина провала тестового задания Яндекса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ну давайте я покритикую:

    возьмем файлик

    1) вы не разобрались как объявлять методы у прототипов с новой нотацией `class`:

    class Travelsort {
        constructor() {}
        sortTickets(tickets) {}
    }


    2) вы не умеете пользоваться исключениями.
    if (!Array.isArray(cards)) {
        throw new ValueError('Wrong input');
    }


    3) использование let там где должен использоваться const

    4) в принципе использование переменных там где их быть не должно

    5) вы зачем-то реализовали свою функцию сортировки, я не увидел в требованиях отсутствия возможности использовать старый добрый Array.prototype.sort

    6) Общие замечания по кодинг стайлу. snake_case там где должен быть camelCase, пишите с большой буквы то что должно быть с маленькой и т.д.

    7) нарушения принципа единой ответственности. У вас объеткт умеет и сортировать и писать куда-то. Это категорически плохо.

    8) Если исправить 7-ой пункт то наш класс превращается просто в функцию.

    Далее... берем следующий файлик

    1) если вы пишите комментарии к таким маленьким кускам кода - стало быть у вас хромает именование вещей. Все должн быть понятно просто из названий методов/функций/переменных. При работе в команде над серьезными проектами это немаловажно, ибо код чаще читают чем пишут и экономить нужно именно это время.

    2) вы зачем-то тут в прототип объекта строки впихиваете функции для парсинга CSS. Таким образом мы нарушаем принцип единой ответственности. Да и в целом расширять без надобности прототипы объектов как-то не ок.

    Чуть дальше проскролил - вы пытаетесь расширить прототип строк для того что бы добиться API jquery? ух, батенька.

    3) очень много дублирования.

    4) очень плохо с protected variations.

    Справедливости ради, ваш код входит в категорию ">50% JS кода", так что не расстраивайтесь. Просто для работы в яндексе нужен чуть более высокий уровень и понимание вещей.
    Ответ написан
    17 комментариев
  • Как проверить отношение аргумента к методу?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ написан
    Комментировать
  • Аякс в аяксе в аяксе, какое решение выбрать?

    Никакой портянки не будет. Будет одна функция и один колбэк, отличаться будет только параметры current_step и token, или как там вы их назовете, по которым на бэкенде будет определяться, какую часть формы отдать.

    И это хорошая практика. Поддерживается также легко.

    P.S. Грузить форму сразу или нет, зависит от ее размера и сложности. Если форма большая и сложная, и состояние промежуточных этапов зависит от предыдущих, надо разбивать.
    Ответ написан
    4 комментария
  • VirtualBox. Как настроить доступ к SSH серверу, запущенном на гостевой ОС?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Переключите сетевую карту в режим NAT
    Пробросьте 22 порт на гостевую машину через "Проброс портов"
    Ответ написан
    3 комментария