А и да, забыл совсем сказать. Я пропал, потому что у меня возникли здоровские проблемы с глазами, даже в больнице лежал. Это был ужас, 90-е! Старики в трениках, старушки со своими тарелками, все ободранное. Одна разница — у людей теперь смартфоны. Все остальное не изменилось за 30 лет.
В общем, я пропал по этой вот причине, да. Даже не работал долгое время. Надо бы продолжить постинг 🙂 Кстати, есть идеи о чем дальше написать? Я остановился на видосе, где хотел какую-то базу по архитектуре расписать, но без картинок конечно вышло так себе. Да и термины, что я употреблял, разные люди совершенно не так восприняли. Кажется, надо расписать все, игнорируюя любые термины, а то невозможно прост 🙂
В общем, я пропал по этой вот причине, да. Даже не работал долгое время. Надо бы продолжить постинг 🙂 Кстати, есть идеи о чем дальше написать? Я остановился на видосе, где хотел какую-то базу по архитектуре расписать, но без картинок конечно вышло так себе. Да и термины, что я употреблял, разные люди совершенно не так восприняли. Кажется, надо расписать все, игнорируюя любые термины, а то невозможно прост 🙂
Хочется как-то устаканить термины, устаканить общие знания, чтобы можно было обсуждать какие-то детали смело и без путаницы.
И для этого (связь не очевидна) я предлагаю вот что: напишите какие-то ваши типовые проекты, что это за программа, что она делает. Чтобы по описанию примерно было понятно, какие потоки данных.
Например
Приложение для изучения английского языка. В основном скачивает уроки-картинки-файлы, и показываетих на экране. Скачивает тесты и правильные ответы. На сервер отправляет статистику, и данные о завершении очередной задачи. И обновление анкеты пользователя.
Что у вас? Я свой вариант тоже напишу.
И для этого (связь не очевидна) я предлагаю вот что: напишите какие-то ваши типовые проекты, что это за программа, что она делает. Чтобы по описанию примерно было понятно, какие потоки данных.
Например
Приложение для изучения английского языка. В основном скачивает уроки-картинки-файлы, и показываетих на экране. Скачивает тесты и правильные ответы. На сервер отправляет статистику, и данные о завершении очередной задачи. И обновление анкеты пользователя.
Что у вас? Я свой вариант тоже напишу.
Не по теме архитектуры. Но вот случилось. Гитхаб закрыл мне доступ к аккаунту до тех пор, пока я не включу двухфакторку.
А я не хочу. У меня отличные рандомные пароли по 20-30 символов, и я отлично хендлю хранилище паролей. А вот свой телефон я не хендлю, я даже не знаю, какой номер лучше указать. Я хз в какой стране живу и когда тот или иной номер у меня отберут.
Устанавливать еще одно приложение в смартфон я тоже не хочу. Вот потеряю я его, или он сброситься, на новый перееду. Как мне переезжать на новый без доступа к старому?
Может быть я потерял смартфон или номер телефона и надо в двухфакторке подключать новые. А как, через почту же? То есть, выкидываем двухфакторку на этот период? Какой смысл изначально тогда в ней — я не понимаю.
Никаких плюсов, и только ухудшение безопасности. Новые программки — новые ошибки.
Сейчас я даже побраузить репозитории не могу, скачать что-нибудь опенсорсное. Мне надо куки очистить, чтобы гитхаб забыл меня и перестал заставлять двухфакторку подрубать.
А я не хочу. У меня отличные рандомные пароли по 20-30 символов, и я отлично хендлю хранилище паролей. А вот свой телефон я не хендлю, я даже не знаю, какой номер лучше указать. Я хз в какой стране живу и когда тот или иной номер у меня отберут.
Устанавливать еще одно приложение в смартфон я тоже не хочу. Вот потеряю я его, или он сброситься, на новый перееду. Как мне переезжать на новый без доступа к старому?
Может быть я потерял смартфон или номер телефона и надо в двухфакторке подключать новые. А как, через почту же? То есть, выкидываем двухфакторку на этот период? Какой смысл изначально тогда в ней — я не понимаю.
Никаких плюсов, и только ухудшение безопасности. Новые программки — новые ошибки.
Сейчас я даже побраузить репозитории не могу, скачать что-нибудь опенсорсное. Мне надо куки очистить, чтобы гитхаб забыл меня и перестал заставлять двухфакторку подрубать.
Программировать за кем-то — полный отстой. Одно дело, когда один программер уволился и ты поступаешь вместо него. Это одноразовый случай, надо вникать в проекты, это абичний.
А бывает, что на проекте работают несколько программистов, и внезапно тебе передают новую фичу, который начал делать другой, может он заболел или его перевели на другую срочную задачу.
И никто задачу не передаст со всеми почестями. Просто на тебе в лицо маленькое изначальное описание задачи и сам ищи в коде, что к этой задаче относилось, где не дописаное, что сломано, что не сделано. Разгадывай тайный замысел, что чувак хотел чувак вообще сделать.
И мало кто тебе еще передаст доп инфу, которую изначальный исполнитель добыл в личных чатах с менеджерами, продакт-овнерами и прочими людьми. Считается, что раз тебе это назначили, инфа к тебе в мозг магически поступает через "коллективное бессознательное"
А бывает, что на проекте работают несколько программистов, и внезапно тебе передают новую фичу, который начал делать другой, может он заболел или его перевели на другую срочную задачу.
И никто задачу не передаст со всеми почестями. Просто на тебе в лицо маленькое изначальное описание задачи и сам ищи в коде, что к этой задаче относилось, где не дописаное, что сломано, что не сделано. Разгадывай тайный замысел, что чувак хотел чувак вообще сделать.
И мало кто тебе еще передаст доп инфу, которую изначальный исполнитель добыл в личных чатах с менеджерами, продакт-овнерами и прочими людьми. Считается, что раз тебе это назначили, инфа к тебе в мозг магически поступает через "коллективное бессознательное"
Кстати! Я тут возвращаюсь в активное программирование, год отдыха прошел успешно (музыку изучал).
И вот начинаю с написания приложения для тренировки ритмов. В верхней части экрана будет нарисован ритм, а в нижней — две большие кнопки, два разных звука издавать будут по нажатию.
Задача кажется супер простой, но вот есть проблема: задержка воспроизведения звука слишком большая. Стандартными средствами я добился только 10мс. А нужно 5мс, чтобы не было заметно.
Поэтому ковыряю язык C, пытаюсь его подключить, и на нем буду обращаться к аудио-устройствам.
Пока что я 2+2 не смог сложить и получить результат в основном коде мобильного приложения, который на Dart написан. Держу в курсе 🙂
И вот начинаю с написания приложения для тренировки ритмов. В верхней части экрана будет нарисован ритм, а в нижней — две большие кнопки, два разных звука издавать будут по нажатию.
Задача кажется супер простой, но вот есть проблема: задержка воспроизведения звука слишком большая. Стандартными средствами я добился только 10мс. А нужно 5мс, чтобы не было заметно.
Поэтому ковыряю язык C, пытаюсь его подключить, и на нем буду обращаться к аудио-устройствам.
Пока что я 2+2 не смог сложить и получить результат в основном коде мобильного приложения, который на Dart написан. Держу в курсе 🙂
Так! Я не только сложил за вчера 2+2, но и организовал низкоуровневую работу с аудио.
Вот реально: я прям посемплово закидываю в аудиопоток свою волноформу! Сам суммирую разные звуки вместе! Прям миниатюрный аудио-движок, который работает в обход системного микшера.
И даже задержка получилась маленькая! Всего 5-10мс. Меньше сделать трудно: телефон не разрешает выставить буфер меньше.
Но это поживем-увидим, может и есть что-то еще для ускорения.
И что еще по теме: ChatGPT реально помогает. Он много врет, косячит, его надо дополнять уточнением инфы по документации, исправлять его ошибки. Но в целом, это получается быстрее, чем без него.
Но никаких джуниуров он не заменит. Мне показалось, он может только помогать изучать новую область для тех, кто уже более-менее разбирается и в доменной области, и в программировании.
Вот реально: я прям посемплово закидываю в аудиопоток свою волноформу! Сам суммирую разные звуки вместе! Прям миниатюрный аудио-движок, который работает в обход системного микшера.
И даже задержка получилась маленькая! Всего 5-10мс. Меньше сделать трудно: телефон не разрешает выставить буфер меньше.
Но это поживем-увидим, может и есть что-то еще для ускорения.
И что еще по теме: ChatGPT реально помогает. Он много врет, косячит, его надо дополнять уточнением инфы по документации, исправлять его ошибки. Но в целом, это получается быстрее, чем без него.
Но никаких джуниуров он не заменит. Мне показалось, он может только помогать изучать новую область для тех, кто уже более-менее разбирается и в доменной области, и в программировании.
Я почти никогда не встречал интересных постов по программированию на хабре, да и вообще где либо. Но вот интересная.
Я все не читал, но первый совет мне понравился. Не обязательно он правилен в выводе, об этом можно подумать самостоятельно. Но сама идея о подумать, что проще: слепить в кучу или разлепить кучу на отдельные штуки — мне нравится.
Хотя лично я бы предпочел решать такой вопрос исходя от разделенности слоев, от функций штук, которые я делю. Но я и сам такое еще плохо думаю, и не все такое вообще думают.
Так что вот такая идея про подумать над вопросом — хорошая.
Я все не читал, но первый совет мне понравился. Не обязательно он правилен в выводе, об этом можно подумать самостоятельно. Но сама идея о подумать, что проще: слепить в кучу или разлепить кучу на отдельные штуки — мне нравится.
Хотя лично я бы предпочел решать такой вопрос исходя от разделенности слоев, от функций штук, которые я делю. Но я и сам такое еще плохо думаю, и не все такое вообще думают.
Так что вот такая идея про подумать над вопросом — хорошая.
Хабр
От мидла к синьору. Часть вторая
В прошлой части я перечислил советы по развитию качества принятия решений. В этот раз поговорим о практических принципах, которые можно брать и использовать «здесь и сейчас». Подходов, советов и...
Так. Я продолжил. Я отрефакторил код, и вместо одного cpp файла у меня несколько. Даже классы выделил.
Я научил свой аудио движок воспроизводить любое количество звуков в любое время. Выделил аудио микшер, семплер. И сделал метроном, причем максимально точный, sample perfect.
А ещё починил звук. Оказывается я отправлял звук в буфер так, как будто у меня моно звук, а оно стерео. Одно число - в правую колонку, второе число - в левую.
На очереди - сделать секвенсор-лупер, чтобы ритмы играть любые.
Я научил свой аудио движок воспроизводить любое количество звуков в любое время. Выделил аудио микшер, семплер. И сделал метроном, причем максимально точный, sample perfect.
А ещё починил звук. Оказывается я отправлял звук в буфер так, как будто у меня моно звук, а оно стерео. Одно число - в правую колонку, второе число - в левую.
На очереди - сделать секвенсор-лупер, чтобы ритмы играть любые.
👍3
Хах, поздравьте меня. Я несколько дней отлаживал проблему обращения к висящему указателю. Ох уж этот c++. Мне кажется, на нормальных языках типа Dart, Kotlin, да даже на javascript такого бы никогда не произошло.
Фикс был просто изи, одна строчка.
Но теперь я сделал секвенсор!!! Это не просто метроном, а прям ноты вшиваешь, звуки разные, и биты играть можно
Фикс был просто изи, одна строчка.
Но теперь я сделал секвенсор!!! Это не просто метроном, а прям ноты вшиваешь, звуки разные, и биты играть можно
Я кажется, понял, в чем проблема с c++.
Я создаю vector длиной x. А потом пишу:
myVector[x+2] = 12;
И если вы думаете, что будет какое-нибудь исключение типа out of boundaries, то ваши ожидания не оправдаются.
Уважаемы создатели c++. Вы там совсем обдолбались? Вам че, было жалко маликусенькой проверочки добавить? Ну или если это специальная оптимизация, нельзя накидать предупреждений при использовании [] у вектора, типа берегись пацан??
Ну типа в 2026 году ваш язык вообще запретят к использованию в европе из-за вот такой херни. Может, пошевелитесь? Страуструп, давай, напеши нормальные спецификации безопасные уже, сколько лет то прошло с 1979 года
Я создаю vector длиной x. А потом пишу:
myVector[x+2] = 12;
И если вы думаете, что будет какое-нибудь исключение типа out of boundaries, то ваши ожидания не оправдаются.
Уважаемы создатели c++. Вы там совсем обдолбались? Вам че, было жалко маликусенькой проверочки добавить? Ну или если это специальная оптимизация, нельзя накидать предупреждений при использовании [] у вектора, типа берегись пацан??
Ну типа в 2026 году ваш язык вообще запретят к использованию в европе из-за вот такой херни. Может, пошевелитесь? Страуструп, давай, напеши нормальные спецификации безопасные уже, сколько лет то прошло с 1979 года
AI Programming Guide.pdf
437.6 KB
Я спросил и ИИ ответил. После небольшого форматирования получилась методичка по работе с ИИ при программировании. В общем, дельные советы.
Там есть повторы в текстах между главами, пара водянистых предложений, но на разок прочитать по диагонали сойдет.
Там есть повторы в текстах между главами, пара водянистых предложений, но на разок прочитать по диагонали сойдет.
Супер-безопасные ID для сущностей
Ох, давно я не писал, ох, давно!! Но вот начал прогать и понеслась мысля по полю 😊
Суть вот в чем. Есть сторейдж, откуда вы берете какие-то сущности. И у этих сущностей есть Id какие-то. И по этим id вы сущности считываете, передаете между разными штуками. Например, из экрана в экран.
Обычно это int или string. И существует вероятность ошибки: вдруг строка не правильная будет? Вдруг int неправильно значение? И когда будешь из сторейджа делать getById, будет либо null, либо кидаться исключение StateError или ArgumentError.
А если такое возможно, тогда в каждом месте, в каждом методе, которых хочет обналичить id до сущности, надо делать проверки и проектировать сценарии работы в случае отказа. На каждом экране, в каждом блоке (контроллере экрана) придется рисовать отдельный режим кукиша.
А уж если совсем по хорошему, это надо ошибки все логгировать и отправлять в свой какой-нибудь онлайн-копилку, для дальнейшего исправления.
А давайте без этого
И давайте сделаем вместо int или string - свой отдельный класс: MyEntityId. И чтоб совсем было весело: с приватным конструктором. То есть, экземпляр никто никогда не может создать, кроме… MyEntityStorage. В Dart так можно.
И просто такой факт, что такие id можно взять только у MyEntityStorage обозначает, что технически вообще не возможно никогда нигде никакая ошибка неверного id. Сущность не может несуществовать. Bullet-proof.
Это же сколько кода, сколько обработчиков, сколько UI не надо писать, сколько сценариев ошибок не нужно учитывать. Класс, да?
Вот только есть мааааленькая проблемка…
Начинает казаться, что если мы вместо примитивов будем передавать какой-то объект класса MyEntityId, который еще и сериализовать нельзя никаким образом, возникает вопрос. А почему бы нам тогда не передавать везде собственно сущность?
Или другой вариант. А что, если на сервере сущность удалили. И в момент какой-то асинхронной операции выясниться, что Id более не валидный, и он может где-то в какой-то переменной еще висеть. И тогда ошибка будет. И ее надо обрабатывать.
Или другой вариант: в другом типе данных хранится такой вот id, чтобы ссылаться на другую сущность. И… И как мы создадим этот другой тип данных, если мы не можем создавать MyEntityId?
Ну в общем, я еще подумою… А вам спасибо, и хорошего дня!
Ох, давно я не писал, ох, давно!! Но вот начал прогать и понеслась мысля по полю 😊
Суть вот в чем. Есть сторейдж, откуда вы берете какие-то сущности. И у этих сущностей есть Id какие-то. И по этим id вы сущности считываете, передаете между разными штуками. Например, из экрана в экран.
Обычно это int или string. И существует вероятность ошибки: вдруг строка не правильная будет? Вдруг int неправильно значение? И когда будешь из сторейджа делать getById, будет либо null, либо кидаться исключение StateError или ArgumentError.
А если такое возможно, тогда в каждом месте, в каждом методе, которых хочет обналичить id до сущности, надо делать проверки и проектировать сценарии работы в случае отказа. На каждом экране, в каждом блоке (контроллере экрана) придется рисовать отдельный режим кукиша.
А уж если совсем по хорошему, это надо ошибки все логгировать и отправлять в свой какой-нибудь онлайн-копилку, для дальнейшего исправления.
А давайте без этого
И давайте сделаем вместо int или string - свой отдельный класс: MyEntityId. И чтоб совсем было весело: с приватным конструктором. То есть, экземпляр никто никогда не может создать, кроме… MyEntityStorage. В Dart так можно.
И просто такой факт, что такие id можно взять только у MyEntityStorage обозначает, что технически вообще не возможно никогда нигде никакая ошибка неверного id. Сущность не может несуществовать. Bullet-proof.
Это же сколько кода, сколько обработчиков, сколько UI не надо писать, сколько сценариев ошибок не нужно учитывать. Класс, да?
Вот только есть мааааленькая проблемка…
Начинает казаться, что если мы вместо примитивов будем передавать какой-то объект класса MyEntityId, который еще и сериализовать нельзя никаким образом, возникает вопрос. А почему бы нам тогда не передавать везде собственно сущность?
Или другой вариант. А что, если на сервере сущность удалили. И в момент какой-то асинхронной операции выясниться, что Id более не валидный, и он может где-то в какой-то переменной еще висеть. И тогда ошибка будет. И ее надо обрабатывать.
Или другой вариант: в другом типе данных хранится такой вот id, чтобы ссылаться на другую сущность. И… И как мы создадим этот другой тип данных, если мы не можем создавать MyEntityId?
Ну в общем, я еще подумою… А вам спасибо, и хорошего дня!
🔥1
Просто код
Супер-безопасные ID для сущностей Ох, давно я не писал, ох, давно!! Но вот начал прогать и понеслась мысля по полю 😊 Суть вот в чем. Есть сторейдж, откуда вы берете какие-то сущности. И у этих сущностей есть Id какие-то. И по этим id вы сущности считываете…
Я еще подумал. Можно вместо приватного контруктора делать sealed class, в Dart есть такая фишка. Нигде снаружи нельзя будет такой класс расширить. Это повышает надежность.
Я поставил антигравити от Гугла и изучаю структуру проектов и разбивку на модули в c++
Йолы-палы, ребят. Я конечно тормозок, но наконец-то я по нормальному погонял агентов, скилы, слегка увидел под капотом, как это все работает, и как это отличается от использования chatgpt.
Это прост небо и земля! Реальна
Это прост небо и земля! Реальна