EXCEPTION CAUGHT BY FLUTTER FRAMEWORK

Уже ничего здесь не размещаю кроме своих любимых ошибок во Flutter. Итак встречаем новую)))

flutter: Caught Framework error
flutter: ══╡ EXCEPTION CAUGHT BY FLUTTER FRAMEWORK ╞═════════════════════════════════════════════════════════
flutter: The following assertion was thrown:
flutter: This widget has been unmounted, so the State no longer has a context (and should be considered
flutter: defunct).
flutter: Consider canceling any active work during "dispose" or using the "mounted" getter to determine if
flutter: the State is still active.
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

Решается простым оборачиванием вашего говна, которое вызываясь падает в эксепшен в if (mounted) {}

Flutter: The CustomAppBar can’t be assigned to the parameter type ‘PreferredSizeWidget’

Без длинных описаний перейду сразу к делу, если столкнулся с такой же ошибкой, то подмешай к целевому классу PreferredSizeWidget и заоверрайдь его метод:

class CustomAppBar extends StatelessWidget with PreferredSizeWidget {
  final String title;
  const CustomAppBar({Key? key, required this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return AppBar(
      backgroundColor: AppColors.navBarColor,
      leading: IconButton(
        onPressed: () {
          Navigator.of(context).pop();
        },
        icon: const Icon(Icons.arrow_back_ios_new),
      ),
      title: Text(title),
      centerTitle: true,
    );
  }

  @override
  Size get preferredSize => const Size.fromHeight(kToolbarHeight);
}

Flutter Error: [INSTALL_FAILED_INSUFFICIENT_STORAGE]

Снова Flutter. Ни с того ни с сего при запуске разрабатываемого приложения в эмуляторе стала вылетать такая ошибка.

Performing Streamed Install

adb: failed to install /Users/alexander/projects/cportal_flutter/build/app/outputs/flutter-apk/app.apk: 
Exception occurred while executing 'install':
android.os.ParcelableException: java.io.IOException: Requested internal only, but not enough space
	at android.util.ExceptionUtils.wrap(ExceptionUtils.java:34)
	at com.android.server.pm.PackageInstallerService.createSession(PackageInstallerService.java:557)
	at com.android.server.pm.PackageManagerShellCommand.doCreateSession(PackageManagerShellCommand.java:3143)
	at com.android.server.pm.PackageManagerShellCommand.doRunInstall(PackageManagerShellCommand.java:1341)
	at com.android.server.pm.PackageManagerShellCommand.runInstall(PackageManagerShellCommand.java:1303)
	at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:193)
	at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97)
	at android.os.ShellCommand.exec(ShellCommand.java:38)
	at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:24742)
	at android.os.Binder.shellCommand(Binder.java:950)
	at and
Error launching application on sdk gphone64 arm64.

Решилось простыми действиями:

Открываем в андроид студии AVD Manager и делаем Wipe Data

Flutter Error: [INSTALL_FAILED_INSUFFICIENT_STORAGE]

После чего в терминале выполняем:

flutter clean
flutter pub get

P.S. Проблема носила регулярный характер, и приходилось почти каждый запуск эмулятора производить действия выше. Решением оказалось создать новый эмулятор и выделить под него 4000 мегабайт оперативной памяти

Flutter Error: [INSTALL_FAILED_INSUFFICIENT_STORAGE]

Предпросмотр dart файлов MacOS quicklook(и на M1 тоже)

macOS Quicklook dart

Ни для кого не секрет, что я в своей профессиональной деятельности использую в основном продукты «яблочной» промышленности. Помимо выше озвученного факта, основной средой разработки для меня является великолепный Фреймворк Flutter, в своей жизнедеятельности эксплуатирующий не менее великолепный язык программирования Dart.

Ну вот как бы два никому на хрен ненужных факта, и что дальше, спросишь меня ты. А то, что я задался вопросом, почему бы у себя в MacOS не мочь при нажатии в Finder на пробел отображать предпросмотр dart файлов. Ведь нередко случается, что ищешь какие то либы, импорты или самописные функции в проекте, чтобы применить, где-то в другом месте и открывать весь проект в IDE каждый раз становится несколько муторно. Ведь любая IDE начинает сканировать, чекать зависимости, проверять линтером и т.д., что несколько тратит времени и изрядно раздражает.

И я нашел способ делать предпросмотр dart(и не только) файлов по нажатию пробела в Finder. Далее расскажу как этого добиться.

  1. Переходим в этот репозиторий и качаем из релизов актуальный.
  2. В finder жамкаем Cmd + Shift + G и вставляем ~/Library/Quicklook и нажимаем Enter, ето перенесет нас в соответствующую директорию. Если finder ругнется, что такой директории нет, то создаём её (Если не в силах создать её, то признаёмся себе в слабоумии и отказываемся от этой тщетной затеи).
  3. Закидываем в эту директорию скачанный в 1 пункте файл QLColorCode.qlgenerator.
  4. Далее берем любой свой уже созданный dart файл, и прописываем в терминале его путь с такой командой:
mdls -name kMDItemContentType ~/main.dart

5. Терминал должен ответить чем-то таким(хз будет ли у вас точно такая же кодировка, проверьте на всякий случай):

kMDItemContentType = «dyn.ah62d4rv4ge80k2pwsu»

6. Копируем только ту часть, что находится в кавычках, то есть dyn.ah62d4rv4ge80k2pwsu.

7. Вводим в терминале:
open ~/Library/QuickLook/QLColorCode.qlgenerator/Contents/Info.plist
Если установлен Xcode то откроется им, если не установлен то хз чем вы там будете править его, с Xcode оченьно это удобно делать.

8. Погружаемся вглубь открытого в Xcode документа по пути Property List > Document types > Item 0 > Document Content Type Identifiers, после чего жамкаем плюсик на добавление нового элемента в список, как на скриншоте ниже.

Предпросмотр dart файлов MacOS quicklook(и на M1 тоже)

И вставляем ету самую часть из кавычек из пункта 5 dyn.ah62d4rv4ge80k2pwsu должно получиться как на скриншоте выше под пунктом Item 0. После чего сохраняем файл.

9. Далее в терминале вводим команду: qlmanage -r
И всё, можете проверять работоспособность.

ПЫ.СЫ. : Ежели qlmanage -r ругается на то, что не знает такой команды, то через brew устанавливаем старую версию сего файла brew install qlcolorcode, после чего по пути ~/Library/Quicklook заменяем файл на скачанный в первом пункте и проделываем с ним все последующие манипуляции.

Если же и там будет ругаться что дескать данный файл поврежден обратитесь к администратору системы то в терминале уже бахните:

codesign --force --deep --sign - ~/Library/Quicklook/QLColorCode.qlgenerator

Если не сработало ничего, то я ваще хз, не ваша тема, идите на завод!))) Всем добра)

Flutter: Execution failed for task ‘:app:compileFlutterBuildDebug’.

И снова Flutter! Нет-нет, я не умаляю достоинств этого потрясающего фреймворка. Он, на мой взгляд, реально на сегодняшний день лучшее решение, как минимум для кросплатформенной мобильной разработки, но как говорится и «на старуху бывает проруха», в общем всё равно буду плакать но продолжать грызть кактус))).

Что-то, как-то незаметно пилил в проекте и вдруг при очередном запуске Flutter выдал вот такое:

Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
Running Gradle task 'assembleDebug'...
../../flutter/.pub-cache/hosted/pub.dartlang.org/get_it-7.2.0/lib/get_it_impl.dart:185:7: Error: Expected an identifier, but got ','.
Try inserting an identifier before ','.
      ,rethrow;
      ^
../../flutter/.pub-cache/hosted/pub.dartlang.org/get_it-7.2.0/lib/get_it_impl.dart:185:7: Error: Expected ';' after this.
      ,rethrow;
      ^
../../flutter/.pub-cache/hosted/pub.dartlang.org/get_it-7.2.0/lib/get_it_impl.dart:185:7: Error: Unexpected token ','.
      ,rethrow;
      ^


FAILURE: Build failed with an exception.

* Where:
Script '/Users/alexander/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 1005

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> Process 'command '/Users/alexander/flutter/bin/flutter'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 22s
Exception: Gradle task assembleDebug failed with exit code 1

Промучавшись сутки с этой бедой, решил банальной пересборкой кеша:

flutter pub cache repair

Надеюсь это кому то сэкономит сутки жизни, берегите себя)

Mac m1 android studio flutter не видит emulator, пишет unable adb connection

Очередная заруба с эмулятором под маком. На этот раз в обновленной версии android studio уже появились образы под архитектуру arm64-v8a, решил перейти на встроенное решение вместо описанного здесь.

Но не тут то было. После стандартной успешной установки через AVD manager эмулятор великолепно, почти мгновенно стартует, чем не может не радовать, но в интерфейсе android studio, ровно как и в Visual Studio Code пишет что не выбрано устройство и невозможно подключиться к эмулятору.

Первое действие которое необходимо выполнить это внести в твой .bashrc или .zshrc (в зависимости от того каким шеллом ты пользуешься) строку указывающую путь к твоим platform-tools(предварительно проверь в SDK manager в Android Studio стоит ли галочка на Android SDK Platform-Tools скин прилагаю)

Mac m1 android studio flutter не видит emulator, пишет unable adb connection

Проверил? Теперь иди в Finder, ищи в своей домашней папке папку Библиотеки или Libraries если ты работаешь в английском интерфейсе MacOS. Если не можешь там найти её значит она в скрытых файлах, включи в finder отображение скрытых файлов(В английской раскладке нажми комбинацию клавишь Cmd+Shift+.)

Включил? Нашёл папку библиотеки? Красавчег! В папке библиотеки открывай Android/SDK/platform-tools и смотри. Дело в том, что в моём случае затык был в том, что в этой папке была ещё одна папка platform-tools в которой собственно все эти тулзы и лежали. Из неё копируем все файлы в родительскую папку platform-tools(так как именно к ней обращается эмулятор в поисках adb). После чего я прописал в конфиг .zshrc строку

export PATH="${HOME}/Library/Android/sdk/platform-tools:${HOME}/Library/Android/sdk/platform-tools/platform-tools:${PATH}"

После всех этих нехитрых манипуляций в термиале считываем конфиг .zshrc командой source .zshrc

И запускаем из андроид студии илди вскод свой эмулятор, в моём случае всё подхватилось великолепно.

Flutter: Unable to load asset: /assets/images/logo.png

Обожаю flutter. Нет, правда это лучший, на мой скромный взгляд, мультиплатформенный фреймворк. С помощью которого можно написать нативное приложение с гуём под любую платформу. И вот пилю я значится как всегда приложение и ничего не предвещало беды. На одном из этапов потребовалось, значится, добавить картиночку локально в приложение.

Прописал я как положено изображение в файле pubspec.yaml со всеми yaml подобающими отступами в виде табов:

flutter:
  assets:
    - assets/images/logo.png
    - assets/loginPage.svg
  uses-material-design: true

а на страничке непосредственно пытаюсь вот так вот вывести картинку:

Image.asset(
              '/assets/images/logo.png',
              height: 148,
            ),

и понять не понимаю какого буя приложение постоянно в эксепшн выпадает с такой вот ошибкой:

════════ Exception caught by image resource service ════════════════════════════
The following assertion was thrown resolving an image codec:
Unable to load asset: /assets/img/logo.png

When the exception was thrown, this was the stack
#0      PlatformAssetBundle.load
package:flutter/…/services/asset_bundle.dart:224
<asynchronous suspension>
#1      AssetBundleImageProvider._loadAsync
package:flutter/…/painting/image_provider.dart:675
<asynchronous suspension>
Image provider: AssetImage(bundle: null, name: "/assets/img/logo.png")
Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#9dc2c(), name: "/assets/img/logo.png", scale: 1.0)
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by image resource service ════════════════════════════
Unable to load asset: /assets/images/logo.png
════════════════════════════════════════════════════════════════════════════════
Flutter: Unable to load asset: /assets/images/logo.png

Час мучаний и гуглопоиска ни к чему хорошему не привёл. Я уже было начал подумывать, что всему виной обновление Flutter до последней, на текущий момент, версии:

$ flutter --version
Flutter 2.5.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ffb2ecea52 (13 days ago) • 2021-09-17 15:26:33 -0400
Engine • revision b3af521a05
Tools • Dart 2.14.2

Оказалось всё так глупо и прозаично, что решил в назидание таким же затупкам как и я оставить сей топик-высер. Итак внимание, барабанная дробь…

Оказывается не надо в виджете перед assets ставить слеш. <FACEPALM>. Да-да, я там фиганул слеш и потратил уйму времени на поиски решения, посыпаю голову пеплом, не будь таким как я. Делай так:

Image.asset(
              'assets/images/logo.png',
              height: 148,
            ),

Как подключиться к docker по ssh

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

Сделать это нехитрое действо крайне просто, для этого открываем терминал, я так полагаю, что docker у вас уже инсталлирован, и вводим в терминале до боли простенькую комманду, и да, для самых ленивых все команды я воткну в описание к этому видео.

docker run --rm -ti -p 52022:22 ubuntu

rm – говорит о том что после выхода из контейнера контейнер будет удалён
t говорит о том что при создании докер контейнера будет создан псведо tty
i это ключик interactive говорит о том что процесс стандартного ввода линукс будет открытым даже когда не используется 

После ввода команды мы попадаем в ubuntu

Итак мы в терминале голой убунты, вводим команду на обновление репозиториев, склеиваем её с командой установки openssh сервера, и для последующего редактирования ssh конфига устанавливаем свой любимый консольный графический редактор, мне последнее время нравится micro вы ставьте что более удобно для вас nano vim или ещё какая-нибудь дичь.

apt update && apt install openssh-server && apt install micro

Отвечаем на пару вопросов о вашем локальном местоположении, после этого задаем пароль root пользователю, который в последствии будем вводить при ssh подключении. Для этого забиваем в терминале простеньку команду

passwd

после чего правим конфиг вновь установленного ssh сервера командой 

micro /etc/ssh/sshd_config 

(Понятное дело, что вместо micro вводите ваш текстовый редактор)

Находим строку PermitRootLogin, раскомментируем и в ней прописываем yes.

Сохраняем и закрываем файл, запускаем ssh сервер

/etc/init.d/ssh start

Поздравляю, теперь если всё сделано правильно вы можете подключиться к этому контейнеру по ssh, проверяем.

ssh -p 52022 root@127.0.0.1

Вход по ssh, отключение доступа по паролю и отключение root аутентификации

Шёл 2021 год, а я всё никак не хотел запоминать эти простые действия, ну что же, как обычно запишу сюда микромануал чтобы не гуглить больше.

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

  1. Да сотворю я пользователя нового и добавлю его в группу админску, дабы умел он пользоваться всеми благами sudo:
adduser manjarqo

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

usermod -aG sudo manjarqo

2. На локальной машине если ещё не создан ssh ключ то генерим:

ssh-keygen -t rsa

Если уже есть то сразу выполняем:

ssh-copy-id manjarqo@232.321.212.321

Вводим пароль, который задали при создании пользователя, после чего проверяем появился ли доступ по ключу:

ssh manjarqo@232.321.212.321

Если залогинился то переходим к следующему пункту, если не залогинился, то разбирайтесь что пошло ни так и потом переходите к следующему пункту.

3. После входа на сервер по ключу от нового пользователя открываем для редактирования ssh конфиг и чуть-чуть его правим:

sudo nano /etc/ssh/sshd_config

В нём приводим строку к виду PasswordAuthentication no, предварительно раскомментировав если закоментирована и строку к виду PermitRootLogin no, так же раскомментировав, после чего перезапускаем службу ssh командой:

sudo service ssh restart

Если всё прошло хорошо, то под root пользователем больше не зайти, что сразу же обломит тех кто непрерывно брутфорсит наш сервак и вообще вход возможен только человеку у которого в папке ~/ssh лежит именно ваш ключик, так что берегите его.
Всем добра!

Чем в macOS перегнать dvd в mp4

Возникла необходимость перегнать dvd диск в нормальный формат, скопировал целиком файлы с диска на мак, стал искать и нашел кучу платных решений, оказалось что есть великолепный инструмент Handbrake. По ссылке на офсайте есть версия и для M1 Apple Silicon. Работает великолепно.