Детектор фальшивых флешек

Я проиграл спор с китайским жуликом, который продал мне бракованную флешку.

Всё банально — я не смог предоставить доказательств, которые запросил суд. Суд запросил предоставить им видеозапись работы программы h2testw. Считается, что эта программа позволяет определить реальный объем флешек.

Эта чисто Виндовая прога. Причём, как оказалось, — прога не работает на Windows-XP, нужна Windows-7. После того, как я позаимствовал на несколько дней чужой нотик с Windows-7, выяснилось, что прога собирается тестировать флешку в течение 40 часов. Это столько времени будет длиться только запись на неё. А сколько будет длиться обратное считывание и сверка — вообще не известно!

Мне, вот, интересно — чисто теоретически — а что, правда, что судебная комиссия будет просматривать этот 40-часовой захватывающий и остросюжетный фильм?

До кучи, оказалось, что у меня фотик не может снимать чётко — на отснятых кадрах невозможно прочитать текстовые сообщения, которые программа h2testw выдает на экран монитора. Пришлось искать другой фотик. После того, как я позаимствовал на несколько дней чужой фотик… (дежа-вю?), выяснилось, что у фотика аккумуляторы могут работать максимум минут пять…

В конце концов, безупречный Aliexpress прислал мне сообщение, что поскольку я не предоставил доказательств в указанное время, разборки между мной и продавцом закончены. Поддельная флешка остаётся у меня, а деньги уходят на счет продавцу. Но у меня «всё ещё имеется возможность обратиться напрямую к продавцу» и попытаться выяснить отношения без Aliexpress. Ага. щаз! Продавца уже давным-давно нет.

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

1. Я аккуратно вскрыл флешку:

img_1274

Внутри у неё оказалось две микросхемы. Одна из них какой-то микроконтроллер:

img_1275

Другая — какая-то безымянная микросхема флеш-памяти. Что характерно — на ней стоит штампик «16GB»:

img_1276

Что в переводе на жуликовско-китайский означает 512 ГБайт! Так что всё нормально!

2. Я сейчас пишу супер-пупер мега-программу — называется «Детектор Фальшивых Флешек» (FFD, Fake Flash Detector). Пишу не столько для себя, сколько для тех, кто периодически сталкивается или возможно столкнётся с подобными проблемами. Думаю, найдутся и те, кто просто захочет протестировать свой «гараж» флешек.

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

Я знаю как примерно происходит тестирование в программе h2testw. Пока я придерживаюсь её методики. Программа x2tesw работает в двух фазах. В первой фазе тестирования программа x2tesw тупо заливает всё адресное пространство флешки файлами со случайным содержимым. Во второй фазе программа пытается считать файлы и определить их целостность.

Предполагается, что на флешке уже имеется файловая система. Причём, файловая система только Виндовая — ибо Винда неродные для неё файловые системы не понимает. Впрочем, это не так принципиально — большинство флешек как раз имеют файловую систему либо FAT16, либо FAT32.

Есть ещё одно требование к тестируемой флешке — файловая система должна быть чистой. То есть на флешке не должно быть файлов.

Я начинал писать свою прогу на Си. Написал первую часть проги, которая заполняет флешку случайными числами. Поскольку прога на чистом Си, то она, естественно, — консольная. Потом я начал писать вторую часть, где происходит считывание информации с флешки и производится анализ файлов — целый/испорченный.

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

В результате недолгих раздумий решил прикрутить графическую оболочку. Ну а так как на Питоне писать проги быстрее, чем на С/С++, то вторая часть проги оказалась графической. Как ни странно, у меня нет претензий к скорости и к качеству работы питоновской проги (ко второй части программы). Всё работает достаточно хорошо и быстро.

ffd-1

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

Первая проблема: проблема «лёгких отступов». Да, когда прога небольшая, и пока ты пишешь код (а не правишь написанное) — идея отступов «работает» на тебя. Но когда кода становится много, и когда ты начинаешь перетаскивать куски кода из одного места в другое, то отступы затевают против тебя войну. Из недавних твоих лучших друзей они планомерно превращаются во какое-то неотвратимое зло. Хотя, может быть я чего-то не понимаю в Питоне…

Вторая проблема: когда прога небольшая и классы используются по минимуму, то проблема «затуманенности» кода очень частым использованием слова self не стоит. Но как только прога разрастается, то каким-то волшебным способом весь её код зарастает этим сорняком. Это какая-то беда, знаете! Может я чего-то не понимаю…

Теперь я занят тем, что портирую код обратно с Питона на С++.

Только не говорите мне, что в интернете полно линуксовых программ для проверки флешек. Лучше поддержите меня морально. Скажите что-нибудь хорошее. Вдохновляющее. А то я чёт слегка приустал от нескончаемой череды проблем, безработицы и безденежья.

14 responses to “Детектор фальшивых флешек

  1. Ух ты. Да и хрен с ним, с этим жуликом. А вот появление тестового ПО под правильную операционку — это отлично. Ещё бы deb-пакет под 64bit. Готов поддержать не только морально. А если б научили писать на питоне хотя бы плагины к кикаду так вообще…
    Только интересно — а нельзя было записать видео с рабочего стола? Или это типа, не доказательство?

    • Не-е, Руслан, 64-х бит ещё долго не будет. У меня старинный Селерон-1800 с 1 Гигом памяти.

      Видео рабочего стола… Да кто их — юристов — разберёт, чему они ВЕРЯТ! Если уж встанет проблема обмануть правосудие, то ведь, согласитесь, не составит особого труда написать фейковую прогу, эмулирующую поведение h2testw.

      На экране прога будет выглядеть как настоящая h2testw. Ну и чё? И какие будут ваши доказательства?

      Но юристы, такие юристы…

      • Руслан

        Если будут исходники — могу помочь с 64-bit.
        Хм. А снять видео этой проги эмулирующей h2testw фотоаппаратом?) Ведь абсолютно то же самое…

      • Я не ради навязывания мнения, я стараюсь делиться правильными подходами.

        Про self. Ну это уже не особенность Python, а реализация Qt. Не думаю, что this в C++ будет сильно меньше. Это такая плата за использование ООП.

        С кодировками реальная беда, мне тут немного повезло я на Linux/Mac, поэтому у меня только UTF-8. Правда Qt хочет QString. Первый год я тоже плевался в монитор, но потом понял, что он ни причём и если я хочу упростить работу по переносимости своего ПО, то надо принять стандарты Qt. И всё сразу наладилось.

        Можете попробовать GTK, оно вроде без ООП было (давно не проверял). Но там приходилось много лишнего из фукнции в функцию таскать. Тоже не вариант.

        Кстати, отступы в Python помогают коды быть читаемым. Нет боёв по правилу расстановок скобочек и так далее. Хотя, должен согласиться, разработчики умудряются и тут показать индивидуальность.

        Мне нравится писать так:

        result = some_function(arg1, arg2, a=kwarg1, b=kwargs)

        при наличии множества аргументов стараюсь укладываться в 80..120 символов в строке так:

        args = (arg1, arg2, …)
        kwargs = (kwarg1, kwarg2, …)
        result = some_function(*args, **kwargs)

        Но очень часто вижу такой код:

        result = some_function(
        arg1,
        arg2,
        a=kwarg1,
        b=kwarg2
        )

        И простые функции перестают влезать в экран, начинаешь теряться в отступах (хотя правильно настроенный редактор помогает в решении проблемы).

      • 1>> Про self. Не думаю, что this в C++ будет сильно меньше.

        Мне кажется, что Qt здесь вообще не причём.

        Дело в том, на сколько часто в методе класса происходит обращение к членам класса и насколько часто к нечленам класса.

        Я не знаю как пишут свои программы другие программисты, но у меня так получается, что в методах класса идёт в основном обработка членов этого класса. В контексте С++ для этого делать ничего не надо. А вот в контексте Питона, каждый член класса нужно обязательно сопровождать ключевым словом self.

        В С++ я использую ключевое слово this очень редко. И в самом деле, обращение к членам класса не требует использования этого ключевого слова. Зачем? В коде программы просто пишется имя члена класса и оно понятно, что это ничто иное, как член класса. Зачем ещё какие-то уточнения? Нечлены класса (опять же!) — понятное дело — требуют уточнения «а какого, собственно, класса этот член?». Так что, обычно this в программах С++ используется крайне редко. Боюсь ручаться за полноту, но лично я использую this только тогда, когда имя члена класса совпадает с именем параметра в каком-нибудь методе. Пример:

        void MyClass::setCounter(int counter)
        {
        if (counter != 0)
        this->counter = counter;
        else

        }

        2>> Можете попробовать GTK, оно вроде без ООП было.
        Да. Я пробовал играться с wx (GTK). Да. Он — «чистый», без ООП. Создает красивые формы с красивыми виджетами. В этом отношении wx мне понравился. Писать небольшие однопоточные приложения на нём одно удовольствие.

        К сожалению, wx не поддерживает потоки. В одной умной книжке(wxPython 2.8 Application Development Coockbook) я прочитал о проблемах многопоточности в wx. В книжке был описан способ как можно подновлять «морду» программы, находясь в длительном процессе вычислений. На мой взгляд это какие-то ужасные костыли. Хотя и работают, я проверял. Но… как-то, спасибо, нет! Я уж лучше посмотрю другие технологии.

        3 >>
        Ох, не понимаю я этого — some_function(*args, **kwargs)

        В моём мимолётном (мгновенном) восприятии это: указатель args и указатель на указатель kwargs. Ну Си-шник я! И с этим ничего не поделаешь. Чтобы мыслить по-Питоновски, мне каждый раз нужно подавлять в себе Си-шника. Для меня это затратный процесс, несущий какой-то дискомфорт в работу.

      • Я так понял, Вы хотите помочь с компиляцией?

        Спасибо, Руслан, за готовность оказать помощь! Но пока эта помощь мне без надобности. У меня несколько иные проблемы.

  2. За свою любимый Python замолвлю пару слов:

    Чтобы отступы помогали необходимо придерживаться правила «функция или метод класса должны влезать в один экран».

    Self не замусоривает, я бы вообще такое не сказал, нужны примеры. Но, скорее всего, это следствие предыдущего абзаца.

    P.S. Выше — это не я🙂

    • Ну, Руслан, ты как за свою жену ввязался в драку. Понятие красоты — оно индивидуальное. Поэтому-то бессмысленно доказывать другому человеку, что это есть красиво или напротив — некрасиво. Навязывание своего мнения не есть хорошо.

      Вы просите примеров — не проблема!

      Вот пример кусочка кода:

      class ControlBar(QWidget):
      def __init__(self, parent=None):
      QWidget.__init__(self)

      self.pbStart = QPushButton(u"Старт")
      self.pbStart.clicked.connect(parent.start)

      self.pbStop = QPushButton(u"Прервать")
      self.pbStop.setEnabled(False)
      self.pbStop.clicked.connect(parent.stop)

      layout = QHBoxLayout()

      layout.addStretch()
      layout.addWidget(self.pbStart)
      layout.addWidget(self.pbStop)

      self.setLayout(layout)

      Посчитайте, сколько раз используется self.

      А вот конструктор другого класса:

      class WorkThread(QThread):
      def __init__(self, parent=None):
      QThread.__init__(self, parent)
      self.parent = parent
      self.stop = False

      def run(self):
      for row in range(self.parent.tableBar.rowCount()):
      cell = QTableWidgetItem(QString(""))
      self.parent.tableBar.setItem(row, 1, cell)

      for row in range(self.parent.tableBar.rowCount()):
      name = self.parent.tableBar.item(row, 0).text()
      result = self.testFile(name)

      if self.stop:
      self.stop = False
      break

      if result == True:
      cell = QTableWidgetItem(QString("OK"))
      else:
      cell = QTableWidgetItem(QString("Corrupted"))

      self.parent.tableBar.setItem(row, 1, cell)
      self.parent.tableBar.update()

      Здесь тоже self встречается намного чаще, чем мне (лично мне!) хотелось бы видеть.

      Сравните частоту использования self в Питоне и частоту использования аналогичного ему this в C++.

      Я не утверждаю, что я такой сильный знаток Питона. Напротив, я в нём не очень много понимаю. По крайней мере могу только сказать, что я мыслю свои программы в стиле чистого Си. Даже не С++. А уж Питон для меня… как до Луны.

      Не скрою, в варианте написания проги под Питоном меня достало также какое-то нечеловеческое конвертирование текстовых строк. У Питона текстовые строки одного формата — str. Qt использует свой формат QString. Операционная система возвращает имена файлов, директориев, содержимое файлов в своем формате. Если бы мы с вами жили в англо-язычной стране, то проблемы бы не было. Но мы живём в другой стране, в которой буквы национального алфавита не входят в набор ASCII. И вот тут-то начинается свистопляска! Utf-8 — для работы со строками внутри программы, CP1251 — для работы с именами файлов и директориев на диске. Перемножаем теперь это дело на QString и получаем ахрененно весёлый салат. Честно говоря — уже достало!

      Возможно, я просто хорошо помню времена, когда использовался КОИ-8. Ведь никаких таких проблем не было! Всё было единообразно и работало быстро, без каких-либо принуждений к конвертации. Даже времена ДОС-овской cp866 вспоминаются как приятные для работы.

      Потом на кой-то хрен придумали CP1251… Показалось — мало! Придумали Unicode. Опять мало!

      В графических программах одна кодировка (имеется в виду кириллица для Виндовса), в консольных — другая. Молодцы, чо!

      Ладно, у Линукса единая кодировка и там, и там! Я думал, что сюда не дотянуться шаловливые ручки новаторов! Хрена там лысого!

      Молодые программисты сразу в это ведро с дерьмом попадают. Они не были никогда в другом мире, поэтому и не знают, как оно должно быть на самом деле. Но я-то успел пожить в том мире.

      Я не знаю… С моей точки зрения это просто какая диверсия Пиндостана против человечества. Такую жопу подкинуть и притвориться, что де «мы здесь не причём». Конечно не причём! Мы сами себе вырыли эту помойную яму… Пиндосы нам только услужливо показали место, где рыть.

      Ладно. Эмоции всё это! Дела надо делать, а не сопли по ветру пускать.

  3. Есть проц AMD Phenom II X4 970 3.5 Ghz мать AM3 Gigabyte GA-MA770T-UD3, память оперативная DDR3 Kingston 2×2 GB, если надо могу продать

    • Спасибо, Кореш, но не сейчас. Я сейчас вообще не кредитоспособен. Говоря экономическим языком — не имеет смысла покупать то, что не отобьётся? Вот когда появится источник дохода, или образуется хоть какая-то перспектива, тогда наверно будет иметь смысл рассмотреть предложение. А пока горизонт чист и изменений ничто, увы, не предвещает.

  4. А ведь мог бы поставить на ноут SnagIt (в триал-виде) и записать видео с экрана.

    • Нет, не мог. Для этого нужно как минимум знать, что есть такая прога.

      • Мог бы и спросить у знакомых пользователей Windows.

      • У меня вообще нет ни одного знакомого пользователя «исключительно-Виндовс».
        А те, с кем я поделился проблемой, они в основном используют Линукс, а Виндовс вынуждены терпеть только из-за того, что им с кем-то приходится контачить, и эти «кто-то» вообще, кроме своей Винды ничего не знают и знать не хотят. И что самое печальное, эти «кто-то» порой занимают ключевые позиции, которые нельзя никак ни поправить ни проигнорировать. Вот и приходится людям терпеть эти дискриминации.

        Ну, например, в институтах преподы дают задания в новых форматах Ворда. Это пример. Таких примеров немного, но они создают проблему.

        Короче, в моём окружении нет тех людей, кто мог бы знать о виндовых программах.

        Вопрос-то ведь не в том, что где-то в этом огромном мире имеется программа какая-то виндовс-программа, котроая что-то там тра-ля-ля… Вопрос в том, что невозможно всё знать в этом огромном мире. И невозможно в короткий срок получить информацию и сориентироваться для ответа на проблему.

        И чтобы не продолжать дискуссию, что дескать «если бы сидел на Винде, то и проблем бы таких не знал», скажу, что я согласен. Да. Таких бы проблем я не знал, но постоянно бы сталкивался с другими проблемами. А оно мне зачем нужно?

        Проблема с флешкой и с виндовой программой — это разовая проблема. Пришла и ушла. И более, я думаю, уже не побеспокоит меня. А проблемы Винды — это ежедневные постоянные проблемы. Так что нафиг-нафиг такое счастье!

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s