LINUX.ORG.RU

Сообщения lbvf50txt

 

Интерфейсы в ООП

Форум — Development

Введение: Объект != Класс

Тут народ путается с понятиями: интерфейс - переходник, класс - тип, объект - модуль («физическая» часть системы, класс это описание, объект это функционирующая сущность: Состояние+Методы). Многие вообще классы с объектами путают.

Под «физическим» понимается участвующий в работе, а не являющийся описанием. Разница как описанием типа Int, и реальными 32битами в RAM в которых хранится число. Объект это то, что «работает», а «класс» это описание того как данный «тип» должен работать.

Интерфейс: Прослойка между Объектами

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

  • «Модуль» как правило объект.
  • «Тип» как правило класс.

Пример: интерфейс Писатель используются для сохранения данных, а по этому интерфейсу данные могут передавать на сохранения в разные места: по сети, на диск, на принтер.

Пример из жизни: электрическая розетка/штепсель - передают энергию на разные устройтсва от разных источников: ГЭС, Генератор, ТЭЦ, Аккумулятор.

В Системной Дизайне Интерфейсы это «прокладки» через которые модули системы становятся отделяемыми и заменяемыми. Это уже не просто «тип-класса», а именно набор правил которым может соответствовать любой тип. Интерфейсы еще называют контрактами - т.е. наборами договоренностей которые должен соблюдать объект.

Заключение: Достаточно Объекта с Интерфейсом

В ЯП есть еще модули, миксины, лябды и прочее словеса которые затрудняют общее понимание системы как набора заменяемых модулей. Класс - это шаблон/тип по которому создаются объекты. Объект это «физический модуль», интерфейс - переходник по которому модули соединятся друг с другом. Вот и всё ООП.

ЭПИЛОГ

В своей статье я расскзаываю, что сделали инженеры Google, а по совместительству создатели UNIX, в языке Go: максимально упростили ООП модель для практического применения.

Убрали классы, убрали наследование, оставили Композицию/Агрегацию и Интерфейсы. Звучит сложно, на деле примитивно: представили программу как набор заменяемых «модулей» подключенных через интерфейсы.

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

Специально я не иду в детальное объяснение принципов проектирования и не пользуюсь словами вроде Dependency Injection. Цель статьи объяснить базовую идею OOD - Объектно Ориентированного Дизайна, того с чем мы сталкиваемся в быту на ежедневной основе: USB порт, крепление смесителя в ванной, приемник карточки в банкомате, диаметр горлышка пластиковой бутылки, габаритные размеры пакета с соком, высота полки в холодильнике, крышка на банке с соленьями, размер куска мыла - всё реализации концепции интерфейса. Каждый из этих объектов соответствует каким-то правилам, сохраняет контакт и делает элементы системы заменяемыми.

UPD #1:

Дорогой @Obezyan, благодаря вашему комментарию, я полностью составил ментальную модель объяснения OOD системы как функционирующего физического агрегата.

  • Объект - это деталь.
  • Класс - чертеж детали.
  • Интерфейс - чертеж соединительного крепления или штекера (интерфейса) по которому идет подключение. Модель крепления, Прокладка, Тип разъема/кабеля для подключения.

Одна идея интерфейсов может быть объяснена с разных сторон. Может быть более прикладным образом через Переходники/Штекеры/Прокладки, а может быть более абстрактно через зависимость реализации от абстракции.

Более абстрактное представление описывает Robert Martin в своей статье DIP (Dependency Inversion Principle) где интерфейс представляет как абстракцию (абстрактный класс). Что накладывается на преставление штекера для розетки - который питает прибор от абстрактной сети, которая может быть ТЭЦ, ГЭС, Дизель, Аккумулятор, Солнечные Батареи.

UPD #2:

Наследование - это синтаксический сахар над Агрегацией. При Агрегации подключается Компонент явно. При Наследовании Компонент подключается не явно: есть разные механизмы наследования. Базовая идея в перенаправленный СООБЩЕНИЯ на обработку в другой КОМПОНЕНТ. Другим КОМПОНЕТНОМ может быть: базовый класс, объект по прототипу, миксин - базовой идеи делегирования полномочий синтаксическая обертка не меняет.

Факт который не понимает 80% кодеров - наследование это дополнение к ООП, а не его суть. А 99% кодеров не понимает, что ООП это про Сообщения, а не про Компоненты-Объекты. Кодер != Инженер.

Изображение от Sendi Metz: Объект как космическая капсула принимающая и передающая радио сигналы.

Суть от Alan Kay:

I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning – it took a while to see how to do messaging in a programming language efficiently enough to be useful).

 , , , ,

lbvf50txt
()

ACK номер ожидаемого ОКТЕТА к принятию, а не номер ПАКЕТА! Драма в стихах

Форум — Talks

ACK номер ожидаемого ОКТЕТА к принятию, а не номер ПАКЕТА! Драма в стихах

Дорогой LOR, я сидел ни кого не трогал читал книгу Network Programming with Go от Adam Woodbeck, раздел №2, а именно Socket Level Programming. Потом переводил параграф на русский язык, писал поэму на тему параграфа и отсылал своему другу с прозвищем «Маэстро Алгоритм» - получал в ответ порцию отборных матов и продолжал дальше.

И тут перечивая свою очередную поэму, и сверясь с книгой я обнаружил страшное. Автор гонит. Читаем:

Страинца 48, Acknowleging Receipt Packages by Using Their Sequnce Number.

For example, if a sender transmits
a bunch of packets with sequence numbers up through 100 but then receives
an ACK from the receiver with sequence number 90, the sender knows it
needs to retransmit packets from sequence numbers 91 to 100.
  1. Sequence Number - это номер следующий сущности готовой к принятию, если ACK Sequence Number = 90 - это значит 89 сущностей успешно принято, готовы принимать 90 сущность. ACK Sequence Number = (Success + 1) где Success это номер того, чего успешно приняли. Следовательно если из 100 отправленных, пришел ACK Seq Num = 90 то успешно пришло 89, и надо переотправлять с 90 по 100; - 11 пакетов.

  2. Cущность то не пакет, а БАЙТ. БАЙТ - 8 битов - ОКТЕТ.

Что делать, господа присяжные заседатели? Коммандовать парадом продолжаю я, но таких косяков я ожидал от лоровцев, но ни как от писателя букв на бумаге в книге.

Теперь ссылки найденные системой Grok.com:

https://datatracker.ietf.org/doc/html/rfc9293#section-3.4-1

 3.4. Sequence Numbers

A fundamental notion in the design is that every octet of data sent over a TCP connection has a sequence number.

Обратите внимание на изящество, байт звется ОКТЕТОМ, так как Байт он быавет разный.

https://datatracker.ietf.org/doc/html/rfc9293?referrer=grok.com#section-3.1-6.8.2

Acknowledgment Number:

    32 bits
If the ACK control bit is set, this field contains the value of the next sequence number the sender of the segment is expecting to receive. Once a connection is established, this is always sent.

Все равно я респектую Adam Woodbeck - книга хорошая. И заставляет задуматься, в принцпе для Go дела нет, все эти механизмы котроля передачи скрыты в реализации. И предоставляется просто интерфейс. Тем не мене ACK - это номер октета, а ни какого не пакета. И вообще TCP это «стриминговая» передча данных, реализуемая в модели не пакетов, а потока сохраняющего последовательнсть окетов.

P.S.

Внимательно вчитываясь в RFC9293, я пришел к выводу, что SNI и ACK похожи на указатели в Си. Или на шаклу линейки: первый сантиметр начинается с 0, а уже с 1 сантиметра начинается 2 сантиметр. Также SNI - указывает ту точку на которой остановились, если 0 - зачит будтем передавать 1 ОКТЕТ. Хотя я оконательно запутался, понятно, что это байты, и понятн что есть два поля в TCP Header которые указывают начиная с какого байта передаем, и какой байт уже приняли. А дальше надо детально разбираться. Сути это не меняет.

У каждго из узлов передачи есть свои числа, и говорить они могут одновремено. Дел полно двигаемся дальше. Adam Woodbeck - правильный пацан, кент в уважухе.

P.P.S.

Стараюсь разбираться: ISN - это то с чего начали (при утановленом SYN флаге, грубо говоря «от балды»). SEQ (Sequence Number) - это поле указывающие какой октет мы сейчас передаем. ACK (Aknowledge Number) - поле которое говорит какой ОКТЕТ мы готовы принять следующим.

  • SYN, ACK - флаги.
  • ISN - первое число, случайное.
  • Sequence Number, Aknowledgment Number - это 32 битные поля в TCP Header в IP пакете.

SEQ_num - Начало какой байт начали передовать. ACK_num - какйо байт ждем, ждем 10 байт (9 приняли), или ждем 20 (19 приняли).

P.P.P.S.

Важно добавить, SEQ_num и ACK_num указывают номера ОКТЕТОВ для TCP сегментов передаваемого и ожидаемого. SEQ_num - указывает байт с которого начинается TCP сегмент, а TCP сегмент икапсулирован в IP пакет.

И это механизмы для формирования непрерывного последовательного потока данных - дублирования потерянных сегментов.

P.P.P.P.S.

Протокол TCP предоставляет услуги поточной передачи данных, через объект Сокет. Последовательность данный при передачи реализована, через механизм сегментов которые содержат порядковые номера ОКТЕТОВ.

Существует два поля при помощи который получатель и отправитель регулируют последовательно отправки и получения сегментов, дублируя - если придется потерянные сегменты данных. Это 32битные поля SEQ_num и ACK_num. SEQ_num это информация от передающей стороны указывающая с какого порядкового номера ОКТЕТА (байта) начинается текущий сегмент. ACK_num это 32 битное поле которое заполняет принимающая сторона указывая какой следующий номер ОКТЕТА она готова принять: Если номер 100, значит 99 уже успешно принято.

Важно что сервер и клиент имеют два независимых друг от друга потока передачи данных и для каждого потока есть свои ACK_num, SEQ_num значения.

В чем я еще путаюсь так это в 0 байте-октете. Но это сути не меняет, а является низкоуровневой реализаций, 0-indexed или 1-indexed - не суть важно так как первое значение SEQ_num заполняется псевдослучайным образом и называется ISN: Initial Sequential Number вестимо.

TCP сегмент данный инкапсулирован в IP пакет и описывается так называемым TCP Header - который содержит флаги и вышеописанные поля SEQ_num и ACK_num - для реализации бесперебойного и последовательного потока данных.

P.P.P.P.P.S.

Дополнение: книга про TCP/IP которую я нашел по поиску картинок в Google. Подозрительно похожа на TCP/IP Illustrated от Kevin R. Fall, W. Richard Stevens - не факт, не проверял.

 , , ,

lbvf50txt
()

Plan 9

Форум — Talks

Продолжаем:

Операционная система Plan9 опередила свое время на 20 лет. Задачи для решения которых она была проектрована еще не стояли перед коммерчским миром IT, во всю испольовался однозадачный DOS, и UNIX более чем хватало для решения проблем.

По этой причине Plan9 не вышла за пределы акадамического круга разработчиков, так и не придя к прикладным разработчикам и админам. И как следствие сильно отстала от мейнстрима, не в плане концепции, а в плане инструментария и драйверов.

До появления ChatGPT казалось, что это отставание вечно, и Plan9 уже не возможно вернуть, так как под UNIX написанны «терра-тонны» кода, и как их портировать. Но LLM дает второй шанс. Так как на LLM можно сложить перевод драйверов и перевод системных библиотек для реализации новых сетевых протоколов таких как QUIС и HTTP/3. Приложения уже напишут разработчики на Go (который поддерживается в Plan9 нативно, команда Роба Пайка не забывает Plan9).

Plan9 действительно отличается от UNIX, так же как UNIX отличается от Windows. Потому, что предоставляет универсальный интерфейс для любых объектов системы. Программисту достаточно понять одну концепцию и он избавляется от необходимости постоянного изучения новых интерфейсов. Это как STDIN/STDOUT распределенные далеко за предлы CLI.

Вполне возможно, мы увидим возвращение Plan9 в продакшен, через работы LLM. Потому, что человеко-ориентированный код, это код который избавлен от большого количества абстракций. Высокоуровневый. А Plan9 как развыводит работу со всей информацией в системе на высокий уровень абстракции. Позволяя скрыть детали технической реализации внутри драйверов.

Plan9 is not a product

From: s...@ulysses.homer.nj.att.com (Steven Bellovin)
Newsgroups: comp.unix.wizards
Subject: Re: Plan 9? (+ others)
Date: 23 Aug 88 16:19:40 GMT

«Plan 9» — это не продукт и не задумывался как таковой. Это исследование — экспериментальное изучение иного подхода к вычислениям. Разработчики исходили из нескольких базовых предположений: что процессоры стали очень дешёвыми, но мы не умеем эффективно их объединять; что хорошие сетевые технологии крайне важны; что интеллектуальный пользовательский интерфейс (включая растровый дисплей и мышь) — это верное решение; что существующие системы с сетями, мышью и т.д. не являются правильным путём, и в частности, что современные рабочие станции — не тот ориентир, к которому стоит стремиться. (Нет, я не буду утруждать себя объяснением всех их доводов — это материал для отдельной длинной статьи.) В конечном счёте, система UNIX как таковая мертва в качестве инструмента для серьёзных исследований в области структуры операционных систем — она стала слишком громоздкой и слишком ограничена более чем 15-летней историей.


Подробнее:

 ,

lbvf50txt
()

Perl: язык для тех, кто слышит UNIX

Форум — Talks

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

Perl таким быть не пытается.

Perl — это гость с улицы UNIX, который зашёл на вечеринку, снял ботинки и начал рассказывать байки про системные вызовы. Он не делает вид, что файлов нет, что процессы не умирают, что сигналы не прилетают. Наоборот, он берёт эти примитивы и делает их частью себя:

  • проверка прав доступа к файлу — встроенный оператор;
  • чтение строк из потока — пожалуйста, прямо в условии цикла;
  • обработка сигналов — ну да, конечно, а что тут сложного?

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

Perl придуман лингвистом, и это чувствуется. Он думает не только как компьютер, но и как язык. У него есть сокращения, аллюзии, культурные мемы, обороты речи. Он может пошутить. Он может быть двусмысленным. Иногда кажется, что Perl разговаривает с вами на сленге местных, и вы или понимаете его на интуиции — или не понимаете совсем.

Это как жаргон строителей, матросов или айтишников в полночь за кружкой пива. Для тех, кто «в теме», Perl поёт. Для остальных он звучит как шум.

Perl не про чистоту кода. Он про власть. Про гибкость. Про то, что UNIX — это не что-то «под» языком, а воздух, которым дышит сам язык. Если вы живёте в мире процессов, файлов, сигналов и потоков, Perl говорит с вами на вашем родном диалекте.

А если не живёте… что ж, тогда, возможно, вам стоит попробовать Ruby. Там всё прилично. Там столовые приборы лежат на своих местах.

Картинка в тему от нейросети Qwen

Перемещено hobbit из admin

 , ,

lbvf50txt
()

Качество модерации Dimez

Форум — Linux-org-ru

Вот смотрите: есть такое понятие «роутер», он же «гейтвей», он же «шлюз», он же «сетевой шлюз», он же «маршрутизатор». Суть этого понятия: устройство которое находится сразу в двух сетях и пакеты из одной сети передаёт в другую сеть.

По этому маршрутизатор имеет как минимум два сетевых адреса, по адресу в каждой из сетей между которыми он передает пакеты. Два пользователя @vel и @mx__ в теме посвященной маршутизации не до конца понимают нюансы маршрутизации, и их удивляет почему роутер выводящий пакеты из локальной сети в интернет имеет адрес локальной сети 1, 2. При всем уважении и к @vel и к @mx__, в этом нет ничего зазорного, для этого мы и приходим в форумы чтоб разобраться.

И так, я написал небольшое сообщение, где объяснил концепцию роутера и посоветовал прочитать Столярова, где он хорошо объясняет этот концепт.

На каком основании @Dimez сносит мое сообщение по теме топика, по теме раздела администрирование с формулировкой «Флуд»? Когда это сообщение объясняет ключевое понятие администрирования.

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

 , ,

lbvf50txt
()

Разница между хорошим и великолепным разработчиком

Форум — Talks

Хороший разработчик знает как работают вещи, великолепный знает почему они работают именно так.

Good developers know how things work. Great developers know why things work. (c) Steve Souders в придесловии к книге Ильи Григорика.

 , ,

lbvf50txt
()

Cобсеседованиями собеседуй собеседник HTTP 1, 2, 3 QUIC

Форум — Talks

Что спрашивают на собеседованиях?

На собеседованиях спрашивают про разницу протоколов HTTP разных версий. Ну давайте не будем разговаривать про UDP/TCP это и так большниство знает, что UDP не дает гарантий ни для последовательнсоти и ни для доставки, а вот с HTTP?

Вот так, если сходу «Опа, Гоп Стоп!» Вчем разница?

  • HTTP создает соденинение на каждый запрос.
  • HTTP 2 уже вроде как может качать все ресурсы по одному соедению.
  • HTTP 3 основан на новом протокол QUIC который основан на UDP.

А теперь мои дороиге друзья ответы от ByteByteGo и лично от Alex Xu.

Проверил себя сам, проверьте себя и вы.

UPD:

Работа над ошибками:

  • HTTP 1 TCP соединение на отправку каждого ресурса, текстовый протокол.
  • HTTP 1.1 постоянное TCP содинение, возможность отсылать множество запросов, ответы приходят последовательно. Пока не пришел ответ на запрос №1, ответы на запрос №2, №3 и №4 не придут. Также текстовый проткол.
  • HTTP 2 протокол бинарный, также существует на постоянном TCP соединение, создана концепция стримов: параллельная загрузка ресурсов в рамках одного TCP соденинения.
  • HTTP 3 бинарнаый проткол на QUIC, потоки уже реализованы на уровне UDP. Сам QUIC расшифровывается «Quick UDP Internet Connection», является UDP с встроенным TLS.

 , , , ,

lbvf50txt
()

Эффект Даннинга-Крюгера

Форум — Talks

https://youtu.be/7q4ntB__w3M?si=Pwi1mlvGYdJTllmW

«Отсутствие желания признать свою некомпетентность — есть ни что иное, как защитный механизм, своего рода щит, прикрывающий тебя от насмешек и снисходительных взглядов окружающих. В этом бы не было ничего плохого, если бы уверенность в собственной гениальности не являлась барьером для получения новых знаний.» (c) Канал «Теперь Ты Знаешь»

 

lbvf50txt
()

Vim выделенный текст в ИНТЕРПРЕТАТОР и обратно в Vim

Форум — Development

Визуальные фильры в Vim

В Unix есть понятие filter, программа получающая поток данных и его возвращающая: awk, sed, tr, grep. Выделенные фрагменты текста из Vim пожно подавать на последоватеьность фильтров, и считывать результат обрабтно в Vim. Результат работы последовательности фильтров заменит выделенный текст.

Для этого следует.

  • Перейти в Режим визуального выделения (Visual mode): V
  • Передать выделенный фрагмент фильтрам нажав !, или можно нажать : и потом уже допечатать ! с коммандой.
  • В коммандной строке указать последовательность фильтров или интепретатор: :'<,'>!sort | tr '1234' 'ABCD', :'<,'>!python, :'<,'>!ruby
  • Нажать Enter

Таким образом можно не только фильтровать текст, но и использовать текстовые фрагменты как программынй код. Вводя в свои текстовые документы код на Ruby или Python для трансформации кода в текст:

puts %w{cherry banana apple qiwi}.sample => :'<,'>!ruby => cherry

Cправка

:help !

{Visual}!{filter}       Filter the highlighted lines through the external
                        program {filter} (for {Visual} see Visual-mode).

Далее, примеры: сортировка или передача текста как код в интерпретатор.

Cортировка строк в Vim:

banana
apple
coco
grape
arbuz
gursha
banan

V - для перехода в select mode. ! - для ввода утитилиы, которой черз pipe line будте передаваться выделение. sort - название утилиты в коммантной строке.

apple
arbuz
banan
banana
coco
grape
gursha

Использование pipe line во внешних коммандах для Vim:

После сортировки замена arbuz на арбуз и gursha на груша.

banana
apple
coco
grape
arbuz
gursha
banan

Выделение через V запуск через !:

sort | sed -e 's/gursha/груша/g' -e 's/arbuz/арбуз/g'

Результат

apple
арбуз
banan
banana
coco
grape
груша

Текст как код для Ruby:

А можно и в тексте взывать интерптератор.

puts 2+3*5-7
`V` => `!` => `ruby`

10

Или же заполнение случайными строками:

5.times { print rand(10).to_s + "\n"}
`V` => `!` => `ruby`
5
4
4
7
4

Гистограммы в Vim через Nushell

Неполучиось. Vim говорит ошибку E485. Далее по тексту решил через файл - «буфер».

Для начала в ~/.config/nvim/init.vim shell меняется на Nushell.

" ~/.config/nvim/init.vim
set shell=/usr/bin/nu

Потом в тексте выделяется столбец данных через V.

apple
banana
apple
...

И через ! фильтр вызывается код на Nushell.

Не работает. Vim говорит ошибку E485.

Ладно, поробую через файлы:

  1. Пишу код чтоб заполнить файл случайным образом.

Ruby:

10.times{ puts %w{apple banana qiwi}.sample + "\n"}

Python:

import random; print('\n'.join(random.choice(["apple", "banana", "qiwi"]) for _ in range(10)))

  1. Выделяю через V и запускаю через !ruby или !python.
apple
apple
qiwi
qiwi
qiwi
banana
banana
apple
banana
apple
  1. Cохраняю :wq tmp.txt запускаю nu.

Nushell:

~/tmp/nu> open tmp.txt | split row "\n" | histogram | table -t none | save out.txt 

Файл out.txt:

 #   value    count   quantile   percentage                  frequency                 
 0   apple        4       0.40   40.00%       **************************************** 
 1   banana       3       0.30   30.00%       ******************************           
 2   qiwi         3       0.30   30.00%       ******************************  

Истпользование комманд w r и w! для постоения гистограммы не выходя из Vim

  1. Генерация последовательности: V ! ruby или python

Ruby:

10.times{ puts %w{apple banana qiwi}.sample + "\n"}

Python:

import random; print('\n'.join(random.choice(["apple", "banana", "qiwi"]) for _ in range(10)))

Vim:

:'<,'>!ruby 
  1. Выделение и сохранение последовательности в tmp.txt
  • V Visual mode
  • :'<,'>w! tmp.txt - если надо перезаписать tmp.txt
  • :'<,'>w tmp.txt - если НЕ надо перезаписать tmp.txt
  1. сохранение кода Nu script. V потом :'<,'>w script.nu
open tmp.txt | split row "\n" | histogram | table -t none  
  1. запуск и считывание в буфер результатов работы :r !nu script.nu
 #   value    count   quantile   percentage               frequency             
 0   apple        5       0.50   50.00%       ********************************* 
                                              *****************                 
 1   qiwi         3       0.30   30.00%       ******************************    
 2   banana       2       0.20   20.00%       ********************              


Вывод: Выделяется фрагмент текста через V, сохраняется в файл :'<,'>w file.name или :'<,'>w! file.name для перезаписи. Файл считать в текст :r file.name, можно считать результат работы скрипта :r !nu file.nu.

 , , , ,

lbvf50txt
()

Подготовка и решение задач на ЭВМ, 1976

Форум — Talks

Фильм рассказывает об устройстве ЭВМ серии ЕС.

Свердловская киностудия, 1976 г.

https://youtu.be/K-nb8UPEePQ?si=uwuplz1xhzxvr-SP

Отличный фильм. Как много изменилось, как много осталось прежним.

 , , ,

lbvf50txt
()

Рекурсивных обход Record в Nushell

Форум — General

Исходное сообщение о работе с JSON.

@ZogG, @Dr64h вы не в курсе как обходить рекурсивно обходить Record, чтоб получать путь и значение каждого элемента?

То что, я пока нашел не подоходит. Просто превратить весь Record в огромную однострочку табицу где данные хранятся под именами столбцов. Могу получить имена столбцов. А вот пару имя/значение пока не знаю как.

~/tmp/nu> open react_p.json | flatten | columns | where ($it | str contains "lint")
╭────┬────────────────────────────────────────────────╮
│  0 │ @typescript-eslint/eslint-plugin               │
│  1 │ @typescript-eslint/parser                      │
│  2 │ eslint                                         │
│  3 │ eslint-config-prettier                         │
│  4 │ eslint-plugin-babel                            │
│  5 │ eslint-plugin-es                               │
│  6 │ eslint-plugin-eslint-plugin                    │
│  7 │ eslint-plugin-ft-flow                          │
│  8 │ eslint-plugin-jest                             │
│  9 │ eslint-plugin-no-for-of-loops                  │
│ 10 │ eslint-plugin-no-function-declare-after-return │
│ 11 │ eslint-plugin-react                            │
│ 12 │ eslint-plugin-react-internal                   │
│ 13 │ hermes-eslint                                  │
│ 14 │ lint                                           │
│ 15 │ lint-build                                     │
╰────┴────────────────────────────────────────────────╯

Через zip я добился создание таблицы. Но в ней нет пути.

~/tmp/nu> let names = open react_p.json | flatten | columns
~/tmp/nu> let vals = open react_p.json | flatten | values
~/tmp/nu> let pairs = $names | zip $vals

~/tmp/nu> $pairs | where ($it.0 | str contains lint) |
reduce -f [[key value]; [0,0]] {|it, acc| $acc | append [[key value]; [$it.0, $it.1.0]]} |
skip 1
╭────┬────────────────────────────────────────────────┬─────────────────────────────────────────╮
│  # │                      key                       │                  value                  │
├────┼────────────────────────────────────────────────┼─────────────────────────────────────────┤
│  0 │ @typescript-eslint/eslint-plugin               │ ^6.21.0                                 │
│  1 │ @typescript-eslint/parser                      │ ^6.21.0                                 │
│  2 │ eslint                                         │ ^7.7.5                                  │
│  3 │ eslint-config-prettier                         │ ^6.9.0                                  │
│  4 │ eslint-plugin-babel                            │ ^5.3.0                                  │
│  5 │ eslint-plugin-es                               │ ^4.1.0                                  │
│  6 │ eslint-plugin-eslint-plugin                    │ ^3.5.3                                  │
│  7 │ eslint-plugin-ft-flow                          │ ^2.0.3                                  │
│  8 │ eslint-plugin-jest                             │ 28.4.0                                  │
│  9 │ eslint-plugin-no-for-of-loops                  │ ^1.0.0                                  │
│ 10 │ eslint-plugin-no-function-declare-after-return │ ^1.0.0                                  │
│ 11 │ eslint-plugin-react                            │ ^6.7.1                                  │
│ 12 │ eslint-plugin-react-internal                   │ link:./scripts/eslint-rules             │
│ 13 │ hermes-eslint                                  │ ^0.22.0                                 │
│ 14 │ lint                                           │ node ./scripts/tasks/eslint.js          │
│ 15 │ lint-build                                     │ node ./scripts/rollup/validate/index.js │
╰────┴────────────────────────────────────────────────┴─────────────────────────────────────────╯

 , , , ,

lbvf50txt
()

Что с @dataman?

Форум — Linux-org-ru

Обьясните мне, что просиходит с @dataman?

В посте про Shell, где во всю идет обсуждение лингвистики, люди спокойно общаются. @dataman как с цепи на меня сорвался и начал удалять соощения о работе Nushell, абсолютно технические.

C фрагментами исходного кода и обращению к участникам за советом.

~/tmp/nu> open react_p.json | flatten | columns | where ($it | str contains "lint")
~/tmp/nu> let names = open react_p.json | flatten | columns
~/tmp/nu> let vals = open react_p.json | flatten | values
~/tmp/nu> let pairs = $names | zip $vals

~/tmp/nu> $pairs | where ($it.0 | str contains lint) |
reduce -f [[key value]; [0,0]] {|it, acc| $acc | append [[key value]; [$it.0, $it.1.0]]} |
skip 1
╭────┬────────────────────────────────────────────────┬─────────────────────────────────────────╮
│  # │                      key                       │                  value                  │
├────┼────────────────────────────────────────────────┼─────────────────────────────────────────┤
│  0 │ @typescript-eslint/eslint-plugin               │ ^6.21.0                                 │
│  1 │ @typescript-eslint/parser                      │ ^6.21.0                                 │
│  2 │ eslint                                         │ ^7.7.5                                  │
│  3 │ eslint-config-prettier                         │ ^6.9.0                                  │
│  4 │ eslint-plugin-babel                            │ ^5.3.0                                  │
│  5 │ eslint-plugin-es                               │ ^4.1.0                                  │
│  6 │ eslint-plugin-eslint-plugin                    │ ^3.5.3                                  │
│  7 │ eslint-plugin-ft-flow                          │ ^2.0.3                                  │
│  8 │ eslint-plugin-jest                             │ 28.4.0                                  │
│  9 │ eslint-plugin-no-for-of-loops                  │ ^1.0.0                                  │
│ 10 │ eslint-plugin-no-function-declare-after-return │ ^1.0.0                                  │
│ 11 │ eslint-plugin-react                            │ ^6.7.1                                  │
│ 12 │ eslint-plugin-react-internal                   │ link:./scripts/eslint-rules             │
│ 13 │ hermes-eslint                                  │ ^0.22.0                                 │
│ 14 │ lint                                           │ node ./scripts/tasks/eslint.js          │
│ 15 │ lint-build                                     │ node ./scripts/rollup/validate/index.js │
╰────┴────────────────────────────────────────────────┴─────────────────────────────────────────╯

Приведите гражданина в чувтсва. Несколько часов я писал для сообщества пример как пользоваться Nushell.

Fish Shell 4.0 (комментарий)

Потом задал вопросы ребятам которые в Nushell разбираются. Пришел обиженный ключик @dataman и начал сносить сообщения.

 ,

lbvf50txt
()

Рецензия на книги А. В. Столярова

Форум — Talks

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

Что важно, этот курс стал бесплатно доступен любому желающему в два клика, без необходимости проходить бюрократический фильтр и платить цену автомобиля за доступ к информации. Благодаря работе Столярова любой заинтересованный человек получает качественно отредактированный конспект лекций МГУ по программированию с пояснениями. По содержанию это +/- 1999 или 2000 год.

Абсолютно ничего нового, революционного, свежего Столяров не написал. К моменту публикации (2016 год) по темам, затронутым Столяровым, было опубликовано десятки книг, которые пережили множество изданий. Например, книги по TCP/IP от издательства O’Reilly к тому времени издавались уже 20 лет и имели по 7-8 улучшенных и дополненных изданий.

Мало того, что Столяров опубликовал прописные истины администрирования и программирования, он еще их щедро разбавил философией лаборанта из 90-х. То есть технические книги стали содержать в себе конспекты типовых разговоров второкурсников за бутылкой водки. Что, конечно, добавило живости в чтиво, но дурно влияет на 17-летних подростков, которые пьяный трёп обслуживающего персонала воспринимают за жизненную философию и руководство к действию.

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

Но как разработчик, как автор, он не сделал ничего нового. И сам по себе является карикатурным образом админа 90-х, про которых писали юмористические рассказы в Fido. Попытка доказать всему честному люду, какой он великий инженер, через постройку велосипеда, развалившегося на первой кочке, — это типичный пример творчества тех лет. Рассказов про Винипуха и боды и записок Жены программиста.

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

Вывод: Столяров — это классический, можно сказать, эталонный системный администратор из 90-х. Человек, который отказался развиваться, отринул курсы повышения квалификации и навсегда остался в сладком возрасте 20 лет в рамках того давно ушедшего социума, его стереотипов и правил.

Книги Столярова — это книги 90-х, хотя они написаны через четверть века, в конце 2010-х. Это памятник эпохи начала массовой компьютеризации в России. Это надо понимать при работе с ними. Читая работы Столярова, надо давать «поправку на ветер», и всё будет хорошо.

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

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

 , , ,

lbvf50txt
()

Откуда Gmail знает мой /sys/class/dmi/id/product_name?

Форум — Web-development

Зашел через Chromium на почту Gmail, как водится на почте письмо Security Alert on Google. Читаю письмо, жму «Check Activity» и удивляюсь: по мимо Linux стоит еще информация из /sys/class/dmi/id/product_name - там название моего ноута.

Начал проверять поля протокола HTTP.

  1. User-Agent ничего такого не содержит.
  2. Набор полей HTTP Client hints Sec-Che-Ua тоже не содержит, хотя там много занятного.

Более всего похоже на HTTP Client hints, такак они не подреживаются в FireFox, а в Сhromium поддерживаются. Хотя я в заголовках запроса накого не нашел, что передавалось название ноута.

Кто знает через что Gmail получает информацию о моем ноуте?

UPD:

Заход производится через адресную строку, адрес gmail.com, логин, пароль, если исопльзуется Chromium: в Activities помимо Linux еще и модель ноута, если FireFox: только Linux.

  • Chromium Incognito Mode => Linux (Laptop name)
  • FireFox Incognito Mode => Linux

UPD:

  1. Открывается браузер в Incognito mode.
  2. В адресную строку вводиться gmail.com.
  3. Вводится имя пользователя и пароль.
  4. На почту должно прийти письмо Security Alert c адреса no-reply@accounts.google.com.
  5. В письме синяя кнопка Check Activity переводящаяя на https://accounts.google.com/...
  6. При нажатии на кнопку просиходит переход на https://myaccount.google.com/notifications/eid/...
  7. На странице из предыдущего пунтка написано Your account is at risk if this wasn't you далее информация о типе устройства взятая из User-Agent (+ дполнительная инфа о хосте в случае Chromium).

UPD:

 ,

lbvf50txt
()

Ловушка новых технологий

Форум — Talks

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

Из этой психологической ловушки меня вытащили несколько источников.

Данная психологическая ловушка всего лишь разновидность ловушки «правильного программирования». Требования «делать правильно» могут быть разные: старые технологии, новые технологии, гипертрофированная безопасность. И так далее и тому подобное.

Не попадайте в психологические ловушки.

 ,

lbvf50txt
()

512kb в debian.iso для загрузки по схеме MBR

Форум — Linux-hardware

Есть 32bit образ Debian и документация к нему. В этой документации предлогают готовить флешку следующим образом:

# cp debian.iso /dev/sdX
# sync

Мне вот интересно как будет работать Legacy BIOS в данной ситуации. Ведь Legacy BIOS запускает первичный загрузчик который находиться в первом секторе диска. Каким образом это реализуется при копировании данных черзе cp?

И как это совпадает с файловой системой. Там наверно есть какой-то файл который размещен в певром секторе. Интересно и не понятно.

UPD:

Там же на флешке еще должен быть bootable раздел, или при таком копироании флешка становиться ISO 9660 и в таком случае bootable partition не требутеся?

Возникает впрос прочему cp, а не dd. В данном контексте от root сp ведет себя как dd?

UPD1:

Раскрываем секреты загрузочных ISO-образов от artyomsoft

https://habr.com/ru/companies/ruvds/articles/706070/

Спасибо, @Flotsky за ссылку на статью.

 , , ,

lbvf50txt
()

lsblk видит sdb, parted -l не видит.

Форум — Linux-hardware

UPD: это был сбой предположительно вызванный сносом партиций на sda и востановлением их через testdisk. Загрузился с другого винта и parted для флешки заработал. Подробнее в конце сообщения.


Пытался сделать USB stick на Puppy Linux. При помощи dd записал данные на USB.

dd bs=4M conv=notrunc,fdatasync oflag=direct status=progress if=BookwormPup32-23.12-240907.iso of=/dev/sdb

Вставил свиток в комп. Все запустилось. Запустил PuppyInstaller, выбрал Bootable USB. Выбрал grub4dos. И оставил копироваться файлы. При повторой загрузке ничего не отображается кроме командной строки grub.

Вернулся к основной рабочей станции и чудеса.

# parted /dev/sdb

Пишет

Error: The device /dev/sdb is so small that it cannot possibly store a file system or partition table.  Perhaps you
selected the wrong device?

parted -l и fdisk -l вообщене видят sdb.

Зато

root@lbvf50txt:~# lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
NAME     SIZE FSTYPE  MOUNTPOINT

sdb     28.9G         
└─sdb1  28.9G iso9660 /media/dima/ISOIMAG

Puppy каким-то образом испортило мне флешку. До этого за сегодня я раза 4 запускал parted /dev/sdb и переклепывал партиции то на fat32 то на ext4 без проблем.

После запуска puppy installer флешка практически померла.

Как воскресить флешку?

Буду работать с Debian. Делать в ручную через chroot без всяких инсталяторов.

UPD: Гуглил, спрашивал ChatGPT - информации 0. Как вооще такое может быть не ясно.

UPD1: Вот так копирует.

dd bs=4M conv=notrunc,fdatasync oflag=direct status=progress if=BookwormPup32-23.12-240907.iso of=/dev/sdb1

Теперь parted работает с /dev/sdb1, и копирование через dd происходит с /dev/sdb1. Как будто /dev/sdb заменилось на /dev/sdb1.


UPD2: Во время настройки sdb я запустил parted без аргумента, и посносил себе на основном винте sda первые два раздела в таблице gpt. После чего кое-как их востановил через testdisk и продолжил работать.

К концу дня у меня заглючил parted /dev/sdb и parted -l и fdisk -l. После перезгрузки, я загрузиться не смог. Вставил другой диск, загрузился на старый Linux. Флешка форматируется нормально.

Сейчас пытаюсь востановить загрузку системы на sda. Диски монтируются нормально. EFI загрузочный и ext4 с данными вижу. Могу по ним ходить. Тепрь надо востановить GRUB поробовать згарзуится. Ну и так далее и тому подобное, или просто систему сносить и востанавливаться с бекпа /home.

UPD3: После того как перывй накопитель не отображался через parted -l, я вставил второй накопитель в USB, он точно так-же не отображался через parted -l, писал такую-же ошибку. Тогда я и понял, что возможно проблема в поломаных и востановленных разделах на sda, более того после работы testdisk у меня на 500мб поменялся размер партиции подкачки.

Тогда я загрузился с другого диска, и в другом экземпляре Linux уже прекрасно работал parted.

 , ,

lbvf50txt
()

Что там с Wikipedia?

Форум — Talks

Несколкьо дней подряд Википедия выдает банер: «Wikipedia still can’t be sold.»

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

 

lbvf50txt
()

Задал вопрос Столярову. Обращение к адептам.

Форум — Talks

Задал вопрос Столярову (@Croco) на его сайте, на что покупать еду если учиться согласно его учебному плану и запрету на использование современных технологий. Логично в ответ получил оскорбления. Спорить с 45 летним мужиком который настырно пытается отгородиться от реальности и жить в мире собственных фантазий - бесполезно.

Обращаюсь к адептам. Ребята ни с кем я не воюю, ни каких глобальных целей переустройства мира не преследую, в систему образования не лезу хотя мне предлогают, в отличии от вас. Мне реально интересно что вы будете кушать, отгородившись от GitHub и прячась от Python c JavaScript.

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

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

Теперь моя совсесть чиста. Подростков я предупредил.

 ,

lbvf50txt
()

RSS подписка на новые темы