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

Кому интересно — попробуйте потестировать.
Решил я добавить в свой вебсокет-сниппет еще и авторизацию, чтобы уж точно им можно было в реальной жизни пользоваться.
Происходит все достаточно просто. Сервер хранит MD5 пароля (в примере — просто как строковую константу). При соединении генерируется "соль" и вычисляется MD5 от строки "соль + MD5 пароля". Эта "соль" отсылается клиенту. Клиент запрашивает у пользователя пароль, вычисляет MD5 от него, присовокупляет к "соли" и отправляет серверу MD5 результата. Если все ОК, сервер посылает сообщение "authOK", если же пароль неправильный, отсылается "badpass" → клиент опять запрашивает пароль у пользователя.
MD5 введенного пароля сохраняется в localStorage (или куках, если localStorage отсутствует), чтобы не вводить пароль каждый раз. В принципе, можно добавить кнопочку "forget me", но смысла в этом не вижу. Теперь у моих веб-морд будет хоть какая-то условная безопасность.
Я решил набросать веб-морду для управления ИК-спектрометром IRBIS, для чего опять понадобилось прикручивать вебсокеты. И опять пришлось ковыряться в предыдущем коде (веб-морда для простой управлялки на raspberry Pi). Чтобы впредь не нужно было заниматься чисткой кода, я решил сделать минимальный пример, позволяющий общаться через очередь сообщений: код на гитхабе.

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

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

Остается теперь придумать метод авторизации/аутентификации. Простейшее, что приходит в голову — при соединении сервер отсылает "соль", клиент шифрует введенный пароль этой "солью" и отсылает серверу. А тот проверяет, все ли ОК.
Нужно лишь найти вменяемые MD5 или SHA на жабоскрипте.

P.S. Полдня убил на верстку базы веб-морды! Совсем уже этот HTML забыл. Пытался верстать блоками, но ничего не вышло. Решил по-старому — вложенными таблицами.
Мой старый велосипед для обработки параметров командной строки перестал меня устраивать, т.к. не давал возможности указывать один и тот же параметр несколько раз (скажем, для сложных конвейеров), поэтому на его основе родился новый велосипед.
Велосипед изобилует ужасами вроде
void **aptr = *((void***)paptr);
...
result = (*((void**)aptr) = (void*)strdup(optarg));

и т.д., и т.п. (можно почитать код вместо принятия рвотных веществ ☺).
пример )
Т.к. ЛОР-вики скоро канет в /dev/null, я решил кое-какие свои заметки перенести сюда.

Автоподключение модема huawei при помощи udev


Текст )

Звук по сети


Текст )

Локализация


Текст )

Монтирование разделов на сменных носителях при помощи udev


Текст )

Клавиатура Microsoft NEK 4000


Текст )

Инициализация генератора псевдослучайных чисел


Текст )
Сегодня целый день провозился с реализацией простого интерфейса управления подвижкой 8MT175-150 при помощи подключаемого к компьютеру по USB драйвера SMSD-1.5. Одной из "особенностей" документации к драйверу была досадная "очепятка" в протоколе управления.
Теперь остается разобраться с узлом крепления диагонального зеркала (да и само зеркало заалюминировать), и можно будет собирать и юстировать наш БТА-комбайн для измерения поправок АСУ и оценки качества поверхности главного зеркала.
И не могу не похвастаться )
У меня появилось желание добить-таки наконец свой fitsview-hartmann, а для этого нужно добавить туда декомпозицию нормалей к волновому фронту по ортонормированному на кольце базису векторных полиномов. Для этого сначала надо реализовать разложение/восстановление волнового фронта по полиномам Цернике. Кстати, это еще пригодится мне в модели зеркала (можно будет помимо получения маски искажений формы зеркала из файла-изображения добавить возможность указания величины этих искажений коэффициентами Цернике).
немного кода )
Графики из предыдущей темы (блин, обнаружил, что я вчера все делал в /tmp, а перенести в ~/Dropbox забыл! Поэтому все изменения пошли коту под хвост, уцелело лишь то, что в ЖЖшке выложил, так что посчитать коэффициенты не могу, а тесты заново делать ломает) показывают, что зависимость скорости вычислений от количества пикселей на объекте (а также — количества объектов и их размера) имеет степенной вид, причем степень довольно плавно изменяется при изменении размера изображения.

Таким образом, если время вычислений T = Nm, где N - количество пикселей на изображении, то разбиение изображения на M кусков может позволить ускорить вычисления в том случае, если
T1 = M·[(N/M)m + t(sqrt(N/M))] < T.
Здесь t - время выполнения операции слияния границ соседних блоков с соответствующей ремаркировкой.

подробности )
Итак, как я уже говорил в предыдущей записи, алгоритм китайцев у меня заработал. Вот — сравнение с моим:
graph
Производительность, по вертикали — логарифм времени выполнения операции, по горизонтали — корень из количества пикселей на картинке. Синее, красное, розовое — мое; зеленое, голубое и желтое — китайцев. Верхняя пара кривых — для 50% соотношения пикселей изображения и фона; средняя — для 10%; нижняя — для 90%.
Подробности )
Итак, как я уже говорил в предыдущей записи, за время, бесцельно проведенное в Нижнем Новгороде, кое-что полезное я таки сделал. В этой записи расскажу о реализации операций эрозии и диляции.
Подробности )
В следующей заметке изложу эпопею поиска оптимального алгоритма выделения связанных областей. Но для начала надо отрихтовать "китайский" вариант, чтобы работал правильно. Ну и подумать насчет параллелизации (мало ли: вдруг на пару порядков быстрей будет).
А вот и простейшая реализация двоичных деревьев.
код )
Можно еще добавить операции вроде foreach, но пока лень.
Сегодня я увидел этот вопрос на stackexchange. Сначала просто сделал комментарий, но потом решил: а ведь стоит сделать реализацию дерева и двунаправленного списка, пригодится же когда-нибудь!
Для начала — то, что попроще: двунаправленный список. Реализация )
Деревья реализовал пока только поверхностно (сунул в ответ на stackoverflow), нужно еще воткнуть удаление узла + (возможно) построение пути до узла. А еще можно было бы над более сложными деревьями подумать.
P.S. Т.к. пока реализации тупо на уровне "сниппетов", в них нет самого важного — данных. Но это легко реализуется добавлением нужного типа данных в структуры.

July 2017

S M T W T F S
      1
23 4 5 6 78
9 101112 131415
16171819 202122
23242526272829
3031     

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2017 02:44 pm
Powered by Dreamwidth Studios