my photo

записки программиста: как я сделал СУБД

я давно не писал о своих программерских радостях. да, в общем-то их долго и не было.

так, по мелочи, разные эксперименты типа поиграться с http-запросами, поднять сервер, сделать приложение ToDoList (сначала на JS+NodeJS+Express+PostgreSQL, потом на Python+Django+SQLite/PostgreSQL) и типа того, попробовать разные алгоритмы на вкус, например, расстояние Левенштейна, алгоритм Дейкстры, поиски путей среди графов, разные сортировки, списки и проч.

но теперь действительно есть чем похвастаться.

для тех, кто любит сравнения: это упрощенная версия того, как работает PostgreSQL с клиентом через командную строку.

я сделал СУБД на С++ с использованием Socket-ов, то есть, клиент к ней подключается через TCP/IP, а не запускает сервер перед собой.
при модификации БД используется технология работы с памятью и позиционирования в потоке (а не простые построчные циклы, которым учат в школах и колледжах).
unit-test-ы (да, и они есть) работают на шаблонизированных функциях.
при коммуникации клиент-сервер использована рекурсия, если размер получаемого сообщения больше предполагаемого.
клиент и сервер - мультипоточные (использовал thread).

выглядит это так: пользователь с клиента пишет всякие SQL-команды (create table, insert, update, delete, drop, select..), ну и получает от сервера всякие ответы, то есть тут и работа с синтаксисом, и с правильной обработкой, упаковкой и передачей данных..

в общем, это круто!
чего и вам желаю.
Удачи!
P.S. и снова.. теперь-то кажется, что все не так сложно, но еще 2 недели назад, когда мне пришла в голову идея этого проекта, это был реальный challenge. те, кто когда-нибудь проходил через такое, - понимают. остальные, - просто поверьте 😉 это, правда, мощно.

my photo

Мадонна XXI века

перед вами результат моего проекта "Мадонна XXI века",
который от идеи до воплощения занял 10 месяцев.
про историю его появления я уже писал в фб.
о процессе создания, возможно, еще напишу позже.
буду ли выставлять или продавать, - пока вопрос открытый.
жудожественная задумка, почему так, а не иначе, позы, свет, сходство, отсылки и параллели, - тема отдельной публикации.
особенно, если критика и комментарии зададут тон.

пара важных моментов:
1) да, получился триптих,
2) да, их со-расположение именно так и задумано,
3) что она держит в руках? предполагаю от зрителей и критиков по крайней мере два варианта ответа.

итак, вот:



работы выполнены акрилом на грунтованном холсте на картоне, размер 30x40см.

Удачи!
P.S. обсуждение будет?.. кто-то готов высказаться?

my photo

программирование. распознавание голоса.

а как же я забыл написать про voice recognition?..

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

да! в начале июня был еще один маленький проект-эксперимент.
я поработал с voice recognition.

если кратко:
написал на Python программу, которая распознает человеческий голос (на русском языке) и реагирует согласно распознанным голосовым сообщениям-командам. на такие-то слова реагируем так-то, на слово "выход" завершаем программу.
пока не придумал, как это можно использовать для чего-то сложного-серьезного-большого, но прототип есть, и это круто!

что было примечательного?
1) 80-90% трудозатрат ушло не на программирование, на на то, чтобы правильно установить нужные библиотеки. оказалось, что в лоб они не встают, пришлось разбираться. в итоге (снова!) помогли индусы, видео с youtube было на хинди (или каком-то таком непонятном языке), но по картинке и по ключевым словам (английским) понял, что нужно использовать нестандартные библиотеки, для этого надо было зайти на специальный сайт, оттуда взять нужные версии (тут тоже пришлось повозиться, выбирая правильно встающую и работающую), ставить в нужной последовательности и проч. короче, тот еще challenge. в итоге поставил. но это еще не все.
2) после того, как нужные нестандартные библиотеки встали, начал разбираться с правильной "голосовой" базой. сначала поставил английский. потом понял, как ставить русский. бодался с 3мя вариантами баз, - итог такой: да, работает, да, распознает, только на понимание компьютером короткой фразы (до 10 сек) уходит порядка 50 секунд, потому что база русского языка весит 0.5Gb - 1Gb.. естественно, пока там локально пройдет поиск, требуется время...
3) все нормально заработало, когда я вместо локально подключенных баз с языком подключил распознавание online от Google. тут все стало летать, и я смог сделать нечто работоспособное в реальном времени.

такие пироги.
было круто! ;)

Удачи!
my photo

программирование. параллельные (асинхронные) потоки C++ vs Python для поиска простых чисел

решил тут проверить тему в режиме параллельно исполняемых потоков..

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

когда-то давно, лет 20 назад, мне это не давалось, а вот на днях справился!
использовал распараллеливание потоков на задаче вычисления простых чисел (об этом было тут).

итак, алгоритм поиска-вычисления простых чисел до 1млн.
сделал два решения.
одно на C++.
другое на Python.
разбил поиск на 10 процессов в диапазонах по 100тыс.

итого.

на Python, по сравнению с ранее примененным поиском, улучшения не было (раньше 2 часа 40 минут, теперь 3 часа, но тут могли быть дополнительные наводки, комп не стоял без дела, так что примерно одинаково).

на C++ все параллельными потоками просчиталось за 148 секунд (!!!).

итог один и тот же: всего простых чисел до миллиона 78498 (и это правильно).

что тут особо интересного?
1) во-первых, получилось, и это само по себе круто!
2) практика с concurrent.futures на Python. и с future/futures/async на C++.
3) прикольное сопоставление производительности Python vs C++, - иногда простота программирования просаживает производительность в отношении тысячи к одному...
хороший урок.
хорошая практика.

Удачи!
my photo

программирование. прогресс с нейронной сетью. дообучил до 9 цифр

программирование. дополнительный прогресс с нейронной сетью.

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

UPD202006129: сегодня до-обучил сетку распознавать 9 цифр, заданных на вход в бинарном формате 3x5, например
111
001
111
001
111,
это 3,
а
111
100
111
001
111,
это 5.
вот график схождения ошибки:


вот график, как по ходу обученные значения стремятся к целевым:


а это отчет программы (обучение велось с точностью до 0.33 по backpropagation с функцией активации relu):
нотация: y0 - это 0й вектор обучения, дальше собственно входной вектор для обучения, последнее число в строчке. - целевое значение, а строчкой ниже, - фактический выход сети после обучения для данного входного вектора. ну и так далее.

UPD: ой, сорри, почему-то в скриншот не попали значения для y8 ->9, ну вы же мне верите?.. ;)

на днях напишу кое-что новое, чтобы не зацикливаться на нейронной сети.
Удачи!


my photo

программирование. дополнительный прогресс с нейронной сетью.

программирование. дополнительный прогресс с нейронной сетью.

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

снова взялся за нейронную сеть, которую написал и обучил в апреле-мае.
причесал код, сделал более универсальным (избавился от привязки к константам типа вшитые в код размеры сети и проч.), оптимизировал и проч.
в итоге, теперь сетка научилась распознавать цифры, написанные в стиле почтового индекса (3x5 пикселей).
использован новый метод активации нейрона: relu.
с точностью 0.5 выдает нужный результат в пределах пяти тысяч раундов обучения.
самый забавный случай был, когда сетка обучилась за 2 (ДВА!!!) шага для входного массива в три цифры (1, 2, 3):
на первом графике - величина ошибки обучения:

на втором графике собственно значения (черные горизонтальные, - это цель обучения),
с точностью 0.5 все четко:
зеленый - это распознанная=обученная "3" (3 плюс-минус 0.5),
оранжевый - распознанная=обученная "2" (2 плюс-минус 0.5),
синий, - распознанная=обученная "1" (1 плюс-минус 0.5).

считаю, это круто ;)
Удачи!
P.S. да, я принципиально (пока?) не пользуюсь стандартными библиотеками типа keras.
продложение следует...

my photo

программерские радости. Тетрис

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

несколько дней ничего не писал..
то есть писал.
но не в блог. а код.

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

что получилось?
сначала писал собственно ту часть игры, которая игра, без робота.
два раза переписывал код в творческом порыве и для оптимизации.
вчера думал над всякими decision trees, сегодня дописал, чтобы в режиме прототипа заработало все вместе: и игра, и робот.

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

что можно развить?
- работает без графики, - можно было бы сделать красиво.
- пока работает с фигурами типа палка (но фреймворк позволяет добавлять новые типы фигур, поворачивать и бросать вниз без существенной переделки классов и алгоритмов),
- сейчас всего несколько стратегий выбора и принятия решений, - там масса для творчества и усиления возможностей интеллекта.

на этом пока остановлюсь, потому что цели сделать все-все-все не было.
важно было сделать
1) фреймворк, с готовностью быстрой доработки и
2) добиться работоспособного прототипа, который реализует минимальную версию базовой функциональности.
да! кому интересно, сделано все на Python.

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

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

my photo

особый тип исполнителей: обещать и ждать пинка

особый тип исполнителей: обещать и ждать пинка.
"все люди делятся" (С)
помимо прочего, люди делятся еще так:
если человека что-то попросить, и он пообещает это сделать, то:
1) есть такие, кто пообещает и сделает. это идеальные. таких (увы) очень немного.
2) есть люди, которые согласятся, но ничего не сделают. болтуны. ну или у них есть свои аргументированные отмазки. таких (увы) немало.
а еще
3) есть люди, которые сделают то, что обещали, но только тогда, когда будешь (их пинать) им напоминать.
это особенная категория, кому-то кажется, что они - ленивые трепачи. но это не всегда так.
да, они согласны. да, они готовы. да, они сделают.
но будут делать только тогда, когда попросившие проявят внимание, контроль и содействие.
например:
вы попросили X что-то сделать (Y).
X согласился (согласилась) сделать Y.
потом вы напоминаете X сделать Y.1.
а! ну да! точно, - ответит X. и сделает (ведь согласился и обещал).
потом вы напоминаете X сделать Y.2.
X согласится и сделает Y.2.
ну и так далее.
кому-то покажется это странным.
но так устроены эти люди типа 3).
это не значит, что они "плохие" или принадлежат к типу 2).
это значит, что с ними работает только такой подход.
в чем их фишка?
в том, что когда они дали согласие, они только _приняли_ идею плана Y.
но это не значит, что они _обязались_ тут же его выполнять.
для выполнения им нужно дополнительное воздействие (пинок, пендаль, напоминание).
они готовы и рады действовать дальше. по шагам, которые вы им напомните или укажете (Y.1, Y.2 и т.д.).
будут.
сделают.
только в том случае, если вы (или кто-то) четко поставите им задачу и будете ее контролировать.
таких типа 3) много.
они хорошие (не трепачи и не болтуны) и исполнительные.
с точностью до вашего контроля.
вы спросите: откуда ноги растут?
а я отвечу: из опыта.
на свете полно задач, которые, будучи поставленными-обозначенными-запрошенными, не требуют дальнейшего исполнения.
вот они и оптимизируют свою загрузку.
не обижайтесь на них.
и, если хотите, ну мало ли, обижайтесь на себя (хотя, это не конструктивно).
лучше ставьте задачу, получайте commitment, - контролируйте. и получите результат.
такова жизнь, таковые лучшие практики.
имейте в виду.
Удачи!
P.S. кто-то скажет, это очевидно, такие сплошь и рядом. к чему эти очевидности, кэп? я отвечу: иногда это надо осознать, чтобы лучше управлять. эти очевидные вещи не всем понятны. вот и поясняю...

my photo

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

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

это продолжение предыдущей истории.
я все-таки решил задачу переименования файлов в заданной директории по заданному шаблону на C++.
мучения продолжались 2 дня. только сегодня нашел решение.
в чем была проблема?
долго возился в надежде на filesystem. думал, что как-то надо заставить работать path, но это не выходило. потратил кучу времени на разные способы, на варианты c experimental\filesystem, на пробы с namespaces, смотрел видео, изучал примеры из интернета, - ну никак...
вчера заснул с мыслями:
1) что ничего не выйдет,
2) что это какой-то бред, что это нельзя сделать с C++, нельзя же так извратить язык, чтобы простые вещи не работали,
3) если не работает так, остается вариант через win32?
сегодня утром нашел таки решение!
да! через win32 (ну или как это правильно называется?).
восхищаюсь мозгом, который подбрасывает в моменты отчаяния новые зацепки за спасительные ниточки!
кроме мозга,
уже второй раз в безвыходной ситуации мне помогли индусы!!!
(первый раз был про установку правильно встающих библиотек Python по работе с Audio и распознаванием языка, - отдельная история).
короче, наконец-то нашел видео, где просто и понятно описано решение через windows.h, FindFirstFile, FindNextFile и проч.
почему там только 300+ просмотров и только 8 лайков, не понимаю ;)
в итоге заработало.
я обрадовался.
но рано ;)
еще час с лишним (если не все два) провозился с тем, как обрабатывать строки с названием пути, с названием файлов до, с расширением, с названием файлов после, как там правильно обработать логику последовательного присвоения нужных номеров, и какие есть тонкости между char*, char[], char[n], как склеивать строки из char, где во-время приклеить '\0' и все такое.
но вот все в порядке.
"ура! заработало!" (C).
о чем я?
какие выводы?
снова пришел к мысли, что все просто только после того, как получилось. а до этого - беда, нерешаемо, проблема, сложно, etc.
как же это правдиво и жизненно!
спасибо за внимание!

Удачи!

P.S. для тех, кто считает, что я потратил массу времени зря, отвечу: путь с позиции прошедшего этот путь выглядит просто. но просто не значит легко, особенно, если вы в начале пути...
философия, понимаешь.. ;)

P.P.S. всем программистам, у которых что-то не получается, могу сказать: ищите лучше, и найдете.
так и в жизни... ;)


my photo

программерские радости. что я обнаружил, переименовывая файлы. Python vs C++.

программерские радости. что я обнаружил, переименовывая файлы. Python vs C++.
продолжаем дневник бывшего программиста, вспоминающего программирование и изучающего новое.

встала тут задачка: надо переименовать файлы после конвертации и разрезания (split) видео в mp3. замучился это делать вручную. решил написать прогу. беру открываю Python, трачу в пределах получаса (со всякими красивыми доработками типа отлова Exceptions и проч.), и все получается.
дай, думаю, сделаю то же на C++, недаром же на днях поставил Visual Studio (нужно было для работы обработки голоса, об этом напишу отдельно).
нет. не получилось. никак.
и знаете, на чем застопорился?
просто стыдно: не знаю нужных h-файлов и библиотек, но, что более странно: не могу найти ничего внятного в поиске. ну никак вообще!
элементарная задача открыть директорию и прочитать файлы.
и что б вы думали?
нет ни одного примера, а те, что есть, - работают в основном для UNIX.
то ли я не умею искать нормально.
то ли ясно, почему так просто писать на Python, даже если не знаешь как. тут же элементарно: делаешь поиск, и все находится с нормальным описанием библиотек, функций, с примерами.
а с C (C++) у меня не получилось.
- стыдно?
- да.
будем искать.
вдруг, кто тут читает, и может помочь с нормальным поиском...?
как я раньше, 20 лет назад программировал на C и C++?
сам задался вопросом.
и сам ответил: потому что был нормальный Help. пишешь там на Borland-e или там на чем (как тогда это называлось от Microsoft? Dev Studio?), есть вопрос? - раз, и тут тебе и ответ. без всякого интернета. быстро и понятно. а сейчас...
неприятно, но хочется верить, что это я просто пока не умею нормально искать.
ну не может быть, чтобы на C/C++ все было так сложно...
(там сложно, да, но чтобы поиска нормального не было, - это ШОК!)
на Python просто.
но это развращает...
что делать? ;)

Удачи!
P.S. на подходе новый пост, как я позже круто распрограммировался на C++.
но вопрос с нормальным поиском для C++ пока не решил. на всякий случай, я программирую на Windows, а не на UNIX, - вдруг кто что посоветует?

UPD: спустя два дня мучительных поисков и экспериментов, задачу по переименованию файлов на C++ таки решил. об этом в следующем посте.