Как стать автором
Обновить
1
1.1
Вячеслав @xxxphilinxxx

Веб-разработчик

Отправить сообщение

"Что может быть разрушено истиной, не заслуживает спасения" (c)

Что касается пропаганды, то, конечно, бывают ложные срабатывания, неумышленные следования известным подходам, но мозг-то натренирован распознавать типичные методы и идеи даже через заход издалека. Обрывок новостей на ТВ вот недавно случайно услышал: говорили, что РФ вышла на первое место в Европе по экономике: в частности, по отношению ВВП к ППС. Но это ж как заявлять о победе в автомобильной гонке на основе суммарного количества оборотов двигателя. Умышленно или нет, но методы работы с информацией, выводы, полученные из недостаточно полной и объективной информации, и выгодоприобретатели (в случае успеха) показались в какой-то мере похожими. В статье автор расставил предупреждения о неточностях и допущениях, в комментах вроде адекватно реагирует на критику, но все равно подозрительно.

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

email - очевидный пример Web 3.0 (децентрализация - DNS, SMTP и локальное хранение данных - POP3, IMAP).

Что-то не так, а то и фидонет тогда придется назвать web 3.0: там тоже не было централизации и данные хранились локально.
Каким образом DNS и SMTP - децентрализация email? DNS - маппинг домена на айпишники, SMTP - вовсе протокол one-to-one общения для отправки письма. Чтобы отправить письмо кому-то, мне и так надо обратиться его почтовому серверу. Имхо скорее наоборот, при отсутствии DNS письма бы отправлялись по независимым IP-адресам, а DNS-сервер централизует эту систему.
POP3 и IMAP подразумевают, что почтовый сервер поднят на какой-то другой машине, что возвращает все максимум к web 2.0; для децентрализации либо почтовый сервер должен быть поднят непосредственно у вас на мобилке/компе и быть доступен 24/7, что недостижимо и чревато утратой данных, либо, как это обычно предполагается, письмо должно доставляться в какой-то общий ресурс вроде блокчейна, распределенный по устройствам других пользователей. Блокчейн вполне может содержать и шифрованные данные, а не только открытые - встречал уже "email будущего" на таком подходе.
Кстати, если у каждого есть только свои собственные уникальные данные, хранящиеся только на устройстве и принципиально недоступные извне, то это вообще на web-то не особо похоже: просто оффлайн-хранилище с возможностью ручной p2p-отправки в другое хранилище.

<zanuda_mode>Ммм да нет в вашем случае парадокса, это всего лишь каламбур: смешались термины, обозначающие перманентное кровное родство и... назовем это динамической семейной ролью. Даже в более запутанных и непривычных кровных связях это вопрос терминологии, а не логики.</zanuda_mode>
Хотя да, это забавно :)

Просто хотелось написать целостное решение

Я бы тогда посоветовал проделать еще две вещи: во-первых, объяснить, что делает команда, а то иначе это заклинание :) в идеале еще и дать команду, отменяющую эффект первой; во-вторых, хотя бы в двух словах описать информацию по ссылкам. Знаете, как обидно бывает, когда ищешь решение какой-нибудь нетривиальной проблемы, находишь на старых форумах, вероятно, единственную во всем интернете ветку с ее обсуждением, которая заканчивается словами "вот по ссылке решение, мне помогло", а ссылка уже нерабочая? Или что-то на скриншотах, которые тоже уже не грузятся.

Во втором варианте выяснили, что избавление от "%" дает прирост, но в последующих сделано по-старому. Выкинута распечатка собственно чисел. Из оригинальной статьи не взята куча идей - например, разворачивание цикла в 15 элементов в одну общую склейку строки. В Java есть аналоги reserve() для строк/контейнеров, чтобы избегать реаллокации? Частый вызов функций для числодробилок может оказаться заметно затратным - возможно, стоит сравнить функциональный стиль с императивным. Аллокации в памяти внутри функций тоже прилично съедают, даже если компилитор соптимизировал переменные внутри циклов.

Влезу и на всякий случай прорекламирую еще раз связку Singlefile + Importer - пока лучшее, что пробовал. Первое есть в виде плагина для браузера - скачает всю страницу одним файлом, даже картинки вошьет через data:... в тело документа. Затем этот файл перекладываю в обсидиан и запускаю его плагин Importer, который html умеет конвертить в md, причем сохраняя вшитые картинки. Так у меня получается и md статья, и исходный html-вариант, что полезно, т.к. md-разметка не всегда хорошо читаемая получается. Может быть, вам тоже так больше понравится.

UPD: В хром версии MarkDownload - Markdown Web Clipper нет настроек скачивания картинок?

*thinking_face* Видимо, надо было добавить тег <sarcasm>

Поддерживаю, мы же не медициной занимаемся, их термины не должны нас путать. Но слово "пациент" уж слишком намекает на медицину, лучше что-то более нейтральное. У нас же паттерны и объекты? Возьмем, например, меридиан - начало отчета, а тут это тоже как бы отправная точка в паттерне. Null все так же переведем как "нулевой" - итого предлагаю "нулевой меридиан", хороший запоминающийся термин. Если не нравится меридиан, ну можно взять, например, стакан - в него ж можно объекты складывать. Такой термин даже на финансовых биржах есть для совокупности позиций - похоже на хранилище, как и тут. А null переведем как "пустой" - итого будет "пустой стакан", тоже неплохо.

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

Словы вроде русски, но смысл идею ускользать.

А что сейчас для веб-клипинга используете? Тоже ищу решение получше. Сейчас пробую связку из браузерного плагина для SingleFile, который подсмотрел среди экспортеров в Archivebox, и Obsidian-плагинов HTML Reader и Importer. Действий, конечно, получается больше, чем хотелось бы - "сохранить страницу", "перенести в папку", опционально "конвертнуть html -> md", зато надежно. Еще, если руки дойдут, попробую накрутить хуки на Archivebox и включить его экспорт в синхронизацию; мб даже закидывание на скачивание сделаю через watch папки обсидиана как альтернативу браузерному плагину

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

Я тоже засомневался, поэтому полез проверить: можно O(n log n) с константной памятью, просто придется пожертвовать устойчивостью и, возможно, лучшим временем, но, кажется, здесь ни первое не пригодится, ни на втором все равно не выиграть.

Ммм а почему вы игнорируете последнее решение из статьи с двумя указателями? В нем данные предварительно отсортированы по пользователю и странице, поэтому для устранения дубликатов в ответе достаточно при обходе каждого из двух списков пропускать идущие подряд одинаковые записи, а при перекрестном поиске не нужно искать по всему второму файлу, а достаточно просто двигать второй указатель, пока не найдется элемент с userID равным искомому или больше. Сложность получается O(n log n) на предварительную сортировку и всего лишь O(n) на обработку, т.к. каждый из двух списков обходится однократно; итоговая будет O(n log n + n) = O(n log n) при константной памяти.

Какие IO операции? Какие другие машины? Опять что-то выдумываете. Это может быть обход генератора или чтение канала данных в том же процессе, просто другим модулем. Вы сами придумали это ограничение, что список должен быть передан полностью законченным, и теперь пытаетесь всех убедить, что автор сам себя не понял и вообще профнепригоден.
С точки зрения ABI задача вообще не описана, поэтому отвечать на рассуждения о компиляторах и теории типов не стану.
Мне кажется вполне реальной ситуация, когда я реализовал этот механизм, собирающий полный список, а в памяти не помещается даже готовый список-ответ, поэтому пришлось, например, потратиться на вертикальное масштабирование. Затем приходит заказчик этой ерунды и спрашивает, почему так долго и дорого, и нельзя ли по частям, мол, ему так было бы проще. А единственным оправданием будет "вы же сказали список, а я это понял так".

Хочу пару цитат из статьи привести:

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

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

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

Не разделяю опасения.

В Go ввели шаблоны и он потерял одно из своих основных преимуществ: легкую читаемость.

Читаемость можно ухудшить множеством способов. Как вам, например, описание цепочки функций высшего порядка?

func MyfuncA(param1, param2 string) (func (param3 string, param4 func (param5 *interface{}, param6 int64) func () int64) func (param5 *interface{}) int64, error)

Что бы сделать например обобщённую функцию для sqlx нужно описать портянку из параметров шаблонов [...] Но ведь в Go например есть GORM, который без всяких шаблонов делает это.

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

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

Дженерики в go не полные по Тьюрингу, так что творить на них какую-то чудовищую магию, как это возможно, например, в плюсах, попросту не получится. Их введение прошло с очень длительными и обстоятельными обсуждениями, главный мотив в которых был "не переусложнить язык". На мой взгляд, получилось неплохо: все дженерики, которые я писал или видел, были очень простыми и всего лишь способствовали универсальности функций или контейнеров при сохранении типизации, так что область их применения невелика; никакого SFINAE тут нет, к счастью. К тому же, экосистема уже достаточно крупная и устоявшаяся, чтобы появление дженериков не перевернуло все с ног на голову. Собственно, такого и не происходит, хотя дженерикам уже полтора года.

Как же обходились без шаблонов в Go 13 лет?

Иногда с недовольством недостаточной выразительностью языка и необходимостью вручную писать одни и те же вещи из раза в раз вроде общих алгоритмов для массивов, которые теперь появились в пакете slices; кодогенерация как предлагаемая альтернатива не особо помогала. Собственные контейнеры всегда приходилось затачивать под конкретные типы, их толком не вынести было в библиотеки. Часто для обобщения приходилось уничтожать информацию о типе через пустой интерфейс, а потом ее восстанавливать через попытки приведения: уж лучше дженерики.

Раз теперь код в Go будет выглядеть как в Rust, то зачем продолжать использовать Go?

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

Интерпретация ответов тоже важна: исследователь все-таки не машина, которая просто проверяет галочки в тесте, на составлении опросника умственная работа не заканчивается. Вопрос "выберите лишний предмет из списка [x, y, z, &]" без критерия объединения имеет смысл, т.к. оставляет подопытному возможность придумать несколько собственных вариантов с разными критериями и таки лучше продемонстрировать способности, хотя некоторым и будет сложнее с таким справиться, нежели с прямолинейным вопросом. Не все так просто.
А конкретно описанный случай выглядит некорректно проведенным, т.к. подопытные явно зафиксировались на формулировке "лишний", а исследователь будто этого не заметил и продолжал настаивать, в итоге из-за этого тест "найди что-то общее ровно для 3 из 4 объектов" был воспринят как вызов "докажи, что лишнего нет и исследователь неправ, найдя применимость всех 4 объектов и связи между ними", с которым подопытные в итоге блестяще справились.

tl;dr «Низкая производительность» — это когда выполняется мало задач. Проблемы - это плохо. Что с этим делать - пока неизвестно, надо искать. Надо сделать так, чтобы было хорошо.

Проблема «Низкая ПИТ» — это, когда делается мало задач в интеллектуальной сфере в заданные сроки имеющимися ресурсами.
Когда делается мало задач, то получаются скудные результаты
Отсюда, проблема «Низкая ПИТ» — это, когда выполняется мало интеллектуальных задач.
сделано маленькое количество работы в интеллектуальной сфере – это значит выполнено мало интеллектуальных задач
Проблема «Низкая ПИТ» имеет негативный (отрицательный) характер
«Низкая ПИТ» вызывает у нас недовольство (дискомфорт).
Мы пока не знаем, что нужно сделать, чтобы преодолеть проблему «Низкая ПИТ».
у нас есть лишь потребность в преодолении этой проблемы
отсутствует понимание, на что воздействовать
Пока мы не знаем, на что воздействовать.
нужно искать причины появления проблемы «Низкой ПИТ»
Надо так настроить её [системы] работу, чтобы все интеллектуальные задачи выполнялись своевременно, ритмично и воспроизводимо.
проблема будет считаться преодолённой, если все интеллектуальные задачи в организации начнут выполняться воспроизводимо

Умножение двух чисел x и y имеет линейную сложность, так как требуется выполнить x умножений

Что, простите? Даже если вы имели в виду "умножение на N = N сложений", то это все равно далеко от реальности, иначе перемножение/деление больших чисел занимало бы вечность. Деление, кстати, более сложная для процессора операция, чем умножение.

У нас есть запись вида x = y % z , которая будет эквивалентна x = x - y * (x / y)

А у вас спина белая переменные перепутались.

Обратите внимание, что на практике сложность операции взятия остатка может быть оптимизирована в зависимости от аппаратной архитектуры и используемого компилятора

Так может быть, расскажете, как на практике, а не как у вас в голове на основе мат. модели уровня 5 класса? Ведь задан контекст: браузерный JS, а иначе в этой информации не просто нет смысла, а она еще и вредит, т.к. создает ложные представления.

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

Информация

В рейтинге
1 535-й
Откуда
Санкт-Петербург и область, Россия
Зарегистрирован
Активность