Pull to refresh
16
0.1
Send message

Т. е. угнать аккаунт вообще зная только номер телефона

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

А адрес почты указать прямо перед сбросом пароля

Нельзя так сделать. Если почта не указана появится сообщение, что можно только сделать reset аккаунта. Это совсем не то же самое, что "указать почту прямо перед сбросом пароля". Если бы так можно было, это было бы просто смехотворно. 2FA пароль в телеге - это весьма надёжное средство против угона аккаунта, только почту не надо указывать.

Ну может быть из внутренней репы перекидывает во внешнюю один человек?

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

Откуда инфа?

Общался когда-то с людьми, близкими к процессам разработки там. У них в команде приветствуется внутренняя конкуренция и ответственность не размазывается на кучу людей. Поэтому, например, у них есть кроссплатформенный TDesktop и отдельный клиент под MacOS на Swift, которые разрабатывают разные люди. И оба официальные.

В общем не стоит сравнивать эти проекты, совершенно разный уровень во всем.

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

Плюс, из недавних слухов - в телеграме порядка 50 разработчиков, а обсидиан, насколько я слышал, пилят 2 или 3 человека.

Если вы посмотрите исходники Telegram Desktop, будет видно, что подавляющая часть коммитов там сделана одним человеком. Активно пилят клиенты под каждую платформу те же 2-3 человека.

А как вы сравнивали сложность приложений?

Просто из опыта. Современные мессенджеры - это как раз таки сложные приложения. Особенно Telegram со своими велосипедами, криптографическим протоколом, сериализацией и всей "спорной" функциональностью, которую они туда впихнули за последнее время. Посмотрите исходники android приложения или tdesktop.

Telegram Android:

───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
C Header                  4521    881544   115501    260905   505138      18565
C++                       3085   1080875   133390    125371   822114     118335
Java                      2594   1455102   136745     99485  1218872     361329
C                         1467    939573    90296    166256   683021     111731
JSON                       307    236604       10         0   236594          0
Assembly                   302    152562    18596     15193   118773        697
XML                        220     47628      424      1017    46187          0
Plain Text                  92    424265    56893         0   367372          0
Go                          80     56147     4992      4943    46212       6986
Perl                        70     81734     7150      6199    68385       1693
Python                      44     12759      613      1730    10416        391

Telegram Desktop:

───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
C Header                   900    104001    19019      7610    77372        940
C++                        821    474880    46037     10088   418755      76311

logseq:

───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
TypeScript                 409     38352     4731      3129    30492       4219
ClojureScript              384     83353     9180      2484    71689        415
Markdown                    86      4132      888         0     3244          0
CSS                         65     22786     2965       145    19676          0
JavaScript                  51      8410     1110      1049     6251        935
Clojure                     42      4885      466       163     4256        444

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

Я не знаю что там у вас тормозит.

В том же logseq вот issues про performance.
https://github.com/logseq/logseq/issues?q=is%3Aissue+is%3Aopen+slow+label%3A%3Atype%2Fperformance

Приложение Obsidian тормозит на Android. На десктопе редактор тупит на больших документах.

Если начать еще и гуй писать, то это в разы усложнит разработку

Для Desktop можно было взять Qt, для мобильных платформ Kotlin и Swift. И ничего тормозить не будет если написать нормально. Небольшая команда Telegram как-то справилась же, и приложение у них посложнее будет чем "редактор заметок". Сравните производительность и отзывчивость нативных клиентов телеграма на любой платформе и какой-нибудь Discord.

Я много чего за свою жизнь понаписал. На Электроне, правда, ничего не писал, чему очень рад.

Софт весьма сложный

Что именно там сложного? Редактор сложный для markdown? Который глючит. Или система плагинов и расширения функциональности сложная? Или система построения "графа знаний" по кросс-ссылкам между заметками сложная?

Но, допустим, там есть что-то реально сложное. Это разве оправдание, чтобы делать приложение на Электроне? Или оправдание, что оно должно тормозить? Или сложное приложение нельзя написать "тяп-ляп и в продашкен"?

Так они все на Электроне, хоть Obsidian, хоть Logseq, хоть Joplin...

Нативные приложения давно никто не делает, долго дорого, сложно. А тут тяп-ляп наколбасил и в продакшен. Тормозит и безмерно жрёт ресурсы? Купи компьютер помощнее, нищеброд, у нас супер-современные web-технологии под капотом. Ну и что, что приложение для заметок хочет 50% CPU, 2 гигабайта ОЗУ и при этом тормозит.

getoutline.com

Они блокируют доступ к своему сайту с IP адресов из РФ. Понятно, что это open source и репа доступна на гитхабе, но осадочек остаётся.

В Joplin все данные хранятся в SQLite, при этом до недавнего времени даже не было прямой возможности указать директорию, в которой будет храниться эта БД. Удивительно, конечно.

А ещё Joplin тормозит. Не знаю, что надо такого сделать, чтобы простое приложение для текстовых заметок тормозило, но оно тормозит и на десктопе, и на мобильных платформах. Не иначе как "современные web-технологии" всему виной.

Обычно было как на этой картинке, поэтому через месяц перестал этим пользоваться. Ещё пробовал Codeium в виде плагина для Idea, невозможно пользоваться из-за того, что весь тот бред, что он генерирует, вставляется по кнопке tab. Особенно выбешивает, когда пишешь на Python. Хочешь вставить отступ, а вставляется экран какого-то мусора.

Просто структуру словаря надо делать упорядоченной по добавлению ключей. Как минимум иметь отдельную реализацию key-ordered контейнера. Столько проблем во многих случаях сразу уходит.
https://pypy.org/posts/2015/01/faster-more-memory-efficient-and-more-4096950404745375390.html

А потом всё тормозит, и персональные данные всё равно утекают. :)

Зачем так всё усложнять?

Управление аккаунтами это обычный сервис по работе с персональными данными. Все, кроме пароля, хранит у себя. Доступы зарезаны максимально, но есть.

Какая разница где хранить пароль, в одной базе или в другой если этот пароль всё равно хранится в виде стойкого к перебору хеша, например Argon2 с десятком раундов? Типа персональные данные можно потерять, а хеши паролей надо хранить под тремя замками? И ради этого городить несколько бэкендов, 3 базы и т.д. Ну смешно же.

База - это не сервис.

База - это просто ещё один кусок вашей системы, не важно как вы её назовёте, у неё есть точно такой же интерфейс для взаимодействия и есть логика хранения данных на уровне хранения данных. Сервис - это просто сущность, которая оперирует данными на входе и на выходе. Нет данных, нет системы, нет ничего.

А можно подумать зарание, и тогда вероятность появления проблем снизится.

Если бы это работало, все бы думали заранее и программы, написанные однажды, никогда не переписывали, и все были бы довольны. Но это не работает. Современные программы и проекты никогда не заканчиваются. Вы можете год проектировать архитектуру, а можете год колбасить "говнокод" на коленке. Всё равно кто-то будет всё это дописывать, переписывать, переделывать, перепроектировать и не один раз, если этот код будет хоть кому-то нужен. Я не видел ни одного проекта, который бы постоянно не пилили, и те, которые были спроектированы заранее, и те, которые писались на коленке "просто, чтобы показать MVP". Выкатываются новые требования и всё начинается снова. Перепиливается архитектура, вставляются костыли, убираются костыли и так до бесконечности.

И смотря на всё это 10 лет я подумал: да нафиг надо, делай проще, как можно проще, всё равно всё выкинут и перепишут заново, как бы ты ни пыжился. Ну вот и делай так, чтобы это было хотя бы проще переписать или не жалко выкинуть, когда появятся очередные требования, повёрнутые на 180 градусов от первоначальной идеи. Я не говорю, что надо писать говнокод и вообще не заниматься проектированием системы, но пытаться всё сделать идеально и правильно заранее никогда не выйдет. Поэтому даже и пытаться не стоит.

На счёт того, что 1 сервис - это всегда проще чем два, то я бы сказал, что почти всегда, но бывает, что проще/удобнее/необходимо сделать два. Всегда есть исключения, всегда есть нюансы.

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

А вы никогда не рассматривали базу данных как сервис, который хранит данные? Уберите это неоднозначное слово "микро", потому что вообще не понятно, что такое "микро" сервис и чем он отличается от "нано" сервиса или "мини" сервиса.

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

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

Не помню уже, что я хотел сказать. С пустым списком работать не будет, конечно. На пустом списке индекс -1 вызовет ошибку IndexError так же как -5 на списке из 3 элементов.

что это написанный с нуля движок это просто обманывать себя и других

И в чём же обман? Они честно пишут в readme, что "The Browser UI has a cross-platform GUI in Qt6 and a macOS-specific GUI in AppKit".

Зачем ему ... три питона (3.8, 3.9 и 3.11)

Не понятно, потому что питоны 3.8, 3.9, 3.11 обратно совместимы за вычетом удалённых deprecated модулей (что-то там удаляли из stdlib в 3.11 или в 3.12, не помню уже). Скорее всего кто-то ленивый сделал кривой пакет в FreeBSD, у которого в зависимостях аж 3 версии Python.

Какой код читается лучше #1, #2 или #3?

s = 'aaa;bbb;ccc;ddd'

parts = s.split(';')
last = parts[len(parts)-1]  # 1

*_, last = s.split(';')  # 2

last = s.split(';')[-1]  # 3

Опыт показывает, что #3 очевиден, прост и удобен любому разработчику на Python. Особенно в сравнении с #1 где надо написать две строки вместо одной, а ещё посчитать длину списка. Кстати, благодаря отрицательным индексам, первый вариант будет работать с пустым списком без ошибок.

Заворачивание индексов - это просто инструмент, который надо применять там где нужно, а там где не нужно, применять не нужно. Вот и всё. Это так же как с goto, не надо слушать "фанатиков чистоты кода", а использовать, руководствуясь опытом и здравым смыслом.

Если что, я вам минус поставил только в комментарий. Убрать его нельзя, но можно поставить вам плюс в карму ;)

В индустрии не хватает высококвалифицированных людей и профессионалов как бы странно это ни звучало (при том, что мы имеем сейчас карго-культ с идиотскими бесконечными многоступенчатыми алгоритмическими собеседованиями и прочим идиотизмом), и сумасшествие с безумными и бездумными процессами (как описывается в соседней статье) тоже не помогает. Так что люди, которые реализуют какой-нибудь workflow для оплаты, бронирования и т. п. в интернете, не слышали, например, про Temporal, long-running transactions и т. п. И всё это весьма грустно, потому что градус безумия в индустрии повышается, а качество продуктов снижается, при этом вся индустрия переориентируется на выкачивание денег из всех до кого можно дотянуться и в b2c, и в b2b.

В общем, довольно кривой механизм с точки зрения UX. При "добавлении ключа" на винде активируется сначала расширение Bitwarden. Если его закрыть, открывается другой диалог где есть два пункта на выбор: "Windows Hello или внешний электронный ключ" и "Использовать телефон, планшет...". Если выбрать первый пункт, то винда предлагает добавить отпечаток пальца. Если закрыть этот диалог, активируется уже какой-то механизм браузера, который предлагает использовать подключенный аппаратный ключ, но сначала надо создать PIN-код. Это всё выглядит просто как набор костылей каких-то, особенно когда переход к другому способу активируется через закрытие предыдущего диалога. Но я так понимаю, это реализация WebAuthn так криво сделана by design.

Я помню как добавлял ключи для Bitwarden, просто жмешь кнопку "добавить ключ", прикладываешь палец к ключу и готово - ключ добавлен и так несколько раз, чтобы добавить несколько ключей. И все эти ключи будут работать на любом устройстве с которого заходишь в аккаунт.

Они это назвали "Вход по лицу или отпечатку на устройстве". У меня активируется расширение Bitwarden если эту штуку включить и предлагает создать passkey для сохранённого в нём аккаунта. Работает точно так же как с Google-аккаунтами. А вот как добавить несколько YubiKey ключей, которые будут работать с любым устройством, например, не понятно.

Information

Rating
4,485-th
Location
Россия
Registered
Activity