• Почему выходит ошибка No such file or directory при отправке pdf в удаленное хранилище?

    @Anrek Автор вопроса
    Я сделал 2 ошибки:
    1) выше апи 29 получать абсолютный путь нельзя (изменили из соображений безопасности) - поэтому выходила ошибка No such file or directory, нужно копировать файл в кеш папку приложения.
    2) pdf файл нужно не только создать но и записать туда данные, а я только создал (и после того как исправил ошибку еще долго искал почему на сервер приходит пустой файл).

    Итого решение выглядит так (основные шаги)

    1) Запускаю окно выбора файла:
    Intent
    val pdfIntent = Intent(Intent.ACTION_GET_CONTENT)
    pdfIntent.type = "application/pdf"
    pdfIntent.addCategory(Intent.CATEGORY_OPENABLE)
    startActivityForResult(pdfIntent, 12)


    2) Переопределяю fun onActivityResult, в ней из полученной в ней data получаю uri и отправляю его сначала в функцию getDriveFilePath(uri)
    val uri = data.data
    Функция getDriveFilePath создает 2 File() и 2 stream и копирует данные по stream в файл в кеш директории (если не скопировать данные, а только создать файл, на сервер придет пустой файл, и еще важно копировать данные как для символьного файла, а не как для картинки, иначе тоже будет пустой файл).
    Функция getDriveFilePath

    val file = File(requireContext().getCacheDir(), name)
    try {
    val instream: InputStream = requireContext().getContentResolver().openInputStream(uri)!!
    val output = FileOutputStream(file)
    val buffer = ByteArray(1024)
    var size: Int
    while (instream.read(buffer).also { size = it } != -1) {
    output.write(buffer, 0, size)
    }
    instream.close()
    output.close()
    } catch (e: IOException) {
    Log.d("TAG1", "e: ${e}")
    }


    3) Отправляем полученный file в retrofit функцию, прикрепляем его к запросу и все.
    file.asRequestBody("application/pdf".toMediaTypeOrNull())


    Надеюсь это кому-то пригодится, потому что в полном виде для pdf я это нигде не нашел.
    Ответ написан
    Комментировать
  • Почему выходит ошибка "111 connection refused while connecting to upstream" в docker-compose?

    @Anrek Автор вопроса
    Ошибка была не в конфигурационных файлах, а в особенностях запуска программы на python: нужно было задать хост запуска в коде 0.0.0.0 (а не localhost или 127.0.0.1 или др.)
    Ответ написан
    Комментировать
  • Как пофиксить ошибку 502 Bad Gateway в nginx?

    @Anrek Автор вопроса
    Ошибка была такая: забыл добавить в кластере базы данных ip моего сервера в список разрешенных адресов.

    решал проблему в такой последовательности:
    1) поставил обработчик ошибки в коде контейнера back: ошибка 502 ушла, ошибка в nginx также ушла, осталась ошибка подключения в back.
    2) зашел в работающий контейнер back, установил базу данных(apt update и apt install postgresql postgresql-contrib), попытался подключиться через него к бд не через код а строкой psql -h host -p port -U user -W , не подключилось, вышла ошибка "Connection refused. Is the server running on host "10.0.0.101" and accepting
    TCP/IP connections on port 5432?"
    3) тут прочитал что это проблема или с файрфолом или со списком разрешенных адресов у бд
    4) зашел в список разрешенных адресов, исправил опечатку в ip, подключение заработало.
    Ответ написан
    Комментировать
  • Что изменить в Build.graidle чтобы проект собрался?

    @Anrek Автор вопроса
    Решение было такое:
    чтобы собрать проект удалил Fabric (он устарел) и закомментировал Crashlytics, т.к. на основные функции приложения они не влияли.
    Ответ написан
    Комментировать
  • Как работать с buckets в App Engine?

    @Anrek Автор вопроса
    ответ №1: в гугл можно через командную строку пошариться в папке проекта и там ее найти, а также посмотреть какие программы стоят на виртуальной машине.
    ответ №2 расписал в этом вопросе
    Ответ написан
    Комментировать
  • Как организовать хранение данных о том, что товар просмотрен?

    @Anrek Автор вопроса
    Решил так:
    -использовал не глобальное хранилище для сведений о просмотренных страницах, а локальное на клиенте. Решение не идеальное, но заказчика устроило.
    Ответ написан
    Комментировать
  • Как в cicerone объединить однотипные фрагменты?

    @Anrek Автор вопроса
    Решил так:
    создавать вьюхи как compain object непосредственно при инициализации класса. А для навигации применять data class.
    Ответ написан
    Комментировать
  • Как подключиться к базе данных Google Cloud?

    @Anrek Автор вопроса
    решил этот вопрос 2 путями и еще возможен 3-й.
    1) через pgAdmin чтобы непосредственно изменять базу данных, получать оттуда данные и т.д., инструкция тут.
    2) через connection string для postgresql непосредственно из кода, инструкция тут.
    3) еще можно было использовать то, что предложил google, он указывает варианты подключения из самых разных мест, например инструкция для client from a local machine тут
    Ответ написан
    Комментировать
  • Как продебажить ошибку чтобы понять почему url для базы данных некорректен?

    @Anrek Автор вопроса
    В итоге сработало вот это:
    socket://${process.env.SQL_USER}:${process.env.SQL_PASSWORD}@${process.env.IP_DB_PRIVATE}?db=${process.env.DB}
    Ответ написан
    Комментировать
  • Как фиксить ошибку при обращении к базе данных?

    @Anrek Автор вопроса
    Нашел решение: почитал про slonik и его версии, выяснил, что заменили выражения, в которых у меня возникала ошибка как указано тут:
    sql.raw
    Ответ написан
    Комментировать
  • Почему вылетает приложение при использовании строки из enum class?

    @Anrek Автор вопроса
    Дело было в том, что я объявил массив и переменную тоже прямо в теле класса. А эта переменная опирается на view. А так как фрагмент еще не создался мне выходила ошибка:

    Fragment MainFragment not attached to a context.

    Проблема решилась при объявлении того же массива в onViewCreated.
    Ответ написан
    Комментировать
  • Зачем нужна @Qualifier, если после нее ничего нет?

    @Anrek Автор вопроса
    Я разобрался. Есть @Qualifier из разных пакетов. Оба они касаются DI (внедрения зависимостей).

    В реальной жизни может сложится ситуация, когда создаётся несколько бинов одного и того же типа (например, с 1 и тем же интерфейсом), но в конкретном случае например необходим конкретный бин. @Qualifier — аннотация позволяет уточнить какой именно.

    1) Есть @Qualifier, которая импортируется из пакета CDI JSR 330 (CDI-это стандарт Java для контекстов и внедрения зависимостей, а JSR-330-это его подмножество, которое он полностью поддерживает), импортируется так:
    import javax.inject.Qualifier
    Ее уточнение не добавляется, просто пишется так:
    @Qualifier

    2) Есть @Qualifier, которая импортируется из пакета фреймворка Spring (фреймворк для внедрения зависимостей), импортируется так:
    import org.springframework.beans.factory.annotation.Qualifier

    И ей как раз указывается "уточнение" в скобках:
    @Qualifier("appContext1")

    В Spring бин называется по имени и вызывается явно по нему.

    В случае JSR 330 для этого создается своя аннотация для разделения зависимостей с одинаковыми интерфейсами и затем применяется и к классу бина и к зависимости. Документ про который шла речь в вопросе как раз перечень таких аннотаций.

    Итого: в Spring - определяемся с необходимым бином по его имени, а в JSR 330 - по имени его аннотации и удобно перечень всех этих аннотаций собрать в отдельный файл (что и сделали).

    Источник (тут же можно и примеры посмотреть)
    Ответ написан
    Комментировать