Обновить
14.44

Dart *

Язык программирования, созданный Google

Сначала показывать
Порог рейтинга

OTP тестированию не помеха

Важность unit и интеграционных тестов несомненна для более-менее опытного разработчика. В этом посте поделюсь как решить следующую задачу:
Дано:

1) endpoint api для которого нужене OTP (one time password)

2) QR код экспорта из google authenticator

Найти: автоматически получать OTP и отправлять его endpoint-у

Решение:

1) Сканируем QR код любым сканером QR кодов, получаем что-то вроде 'otpauth-migration://offline?data=CjIKFEuKYhr.....' , обозначим это за url.
2) Этот url надо раскодировать, есть несколько вариантов как это сделать привожу довольно просто (минимум телодвижений) https://github.com/qistoph/otp_export . Клонируем и выполняем команду
./parse.py 'url'
вывод будет содержать secret это Base32 строчка-ключ обозначим за secret.

3) Осталось выбрать библиотеку для вашего языка реализующую RFC4226/RFC6238 и с помощью sercret и текущего времени в мс. получить OTP

Привожу пример на dart :
Пакет https://pub.dev/packages/otp
Вызов: final code = OTP.generateTOTPCodeString(secret, date.millisecondsSinceEpoch,algorithm: Algorithm.SHA1, isGoogle: true);

Теги:
Рейтинг0
Комментарии0

В Dart 3.0 появились Switch expressions, что позволяет сразу получить значение на основе выражения. Это может выглядеть так:

var x = switch (y) { ... };
print(switch (x) { ... });
return switch (x) { ... };

Сейчас я расскажу, какие преимущества даст новый подход. ?

habr...
habr...

Теперь, когда мы получили погодные данные (Pop.medium и temp = 17.0 ) из приложения Weather Today, наш код будет выглядеть следующим образом:

/// Probability of precipitation
enum Pop { low, medium, high }

enum Things {
  umbrella, // зонт
  raincoat, // дождевик
  windbreaker, // ветровка
  glasses, // очки
  ;

  List<Things> takeExtra(double temp /*Celsius*/, Pop pop) {
    return ...;
  }
}

Для удобства я определил метод takeExtra внутри enum, чтобы иметь доступ к значениям без использования Things. всякий раз. Подумайте, как бы вы реализовали данный метод.

У меня получился вот такой код:

List<Things> takeExtra(double temp /*Celsius*/, Pop pop) => 
    switch (pop) {
      Pop.low when temp >= 10 => [glasses, windbreaker],
      Pop.low when temp < 10 => [windbreaker],
      Pop.medium when temp > 24 => [windbreaker],
      Pop.medium => [umbrella, windbreaker],
      Pop.high => [umbrella, raincoat],
      _ => [glasses],
    };

Заметьте, это выглядит достаточно ёмко и выразительно. Страшно представить, какая цепочка switch case и if'ов могла выстроиться в этом методе. И всё же, используйте с умом данное новшество – лучше написать понятней, чем вычурней.

А в завтрашний поход я возьму зонт и ветровку. ?

Всего голосов 7: ↑7 и ↓0+7
Комментарии1

Как создать неизменяемый список – UnmodifiableListView или List.unmodifiable?

Для начала, давайте попробуем создать неизменяемый (именно unmodifiable, не путать с immutable) список разными способами:

// Dart version: 3.1.0 - 11.0.dev
import 'dart:collection';

void main() {
  // Выводимый тип - List<String>
  const colors = ['?', '?', '?', '?']; // или final

  // Выводимый тип - List<dynamic>
  final colors1 = List.unmodifiable(colors); 
  // используйте List<String>.unmodifiable(), чтобы тип выводился

  // Выводимый тип - UnmodifiableListView<String>
  final colors2 = UnmodifiableListView(colors);
}

Теперь давайте попробуем изменить первый элемент коллекции:

colors[0] = '?';
colors1[0] = '?';
colors2[0] = '?';

В каждом случае мы получим:

Unhandled Exception: Unsupported operation: Cannot modify an unmodifiable list

Неизменяемый список создан, что очень хорошо, однако, здесь есть подводные камни. Сложность алгоритма для List.unmodifiable – O(n), а для UnmodifiableListView – O(1)? Почему?

Продолжение в комментарии ↲

Всего голосов 3: ↑3 и ↓0+3
Комментарии3
2