Гостевая книга

Здесь вы можете оставить сообщение для владельца сайта, отзыв о функционировании, оформлении, содержании и вообще написать всё, что думаете по этому поводу. Просьба придерживаться темы ("по этому" — это ещё не "по любому") и соблюдать приличия :-) Функция добавления комментариев отключена на всём сайте.

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

Учтите, что комментарии на этом сайте премодерируются.

[Все старые комментарии перемещены в архив >>>]

Математика, трудоустройство

Доброго времени суток, Андрей Викторович!
С Вашим творчеством познакомился около полугода назад и был очень впечатлен — отдельное спасибо Вам за труды, и отдельное за мировозренческую позицию. В какой-то момент я стал разочаровываться не столько в людях, сколько в себе — в наши лихие времена, когда людей интересуют только деньги как самоцель, ни больше ни меньше, начинаешь сомневаться, а может это я не в том направлении думаю? А, нет. Я просто вижу не все. В общем, спасибо!
Некоторые вопросы, которые возникали и возникают во время обучения, отпадают сами собой. Ответы на некоторые можно найти покопавшись в архивах гостевой книги. Но некоторые вопросы остались для меня неразрешенными и я бы хотел задать их здесь.
Математика:
Уже неоднократно Вам задавали вопросы на эту тему. Постараюсь быть конкретным: я столкнулся с таким явлением (и сопутствующим ему сайтом) как МГУ teach-in, где есть записи лекций, а также текстовые материалы (конспекты, презентации, пособия) с разных факультетов, в том числе с родного для Вас факультета ВМК. Записи лекций это не очень удобно, а тексовые материалы, к сожалению, соответствуют не всем видео-материалам. Тем не менее, очень радует что есть структура повествования. Вопрос к Вам, как к человеку, мягко говоря, вовлеченному :-) в жизнь ВМК — как на этом факультете обстоят дела с математикой? Стоит ли ознакамливаться с материалами доступными на озвученном сайте? Может стоит обратить внимание на лекции с других факультетов, например, мехмата?
И на ту же тему вопрос касательно книги Дональда Кнута «Конкретная математика» — если Вы знакомы с данным трудом, как Вам кажется, подойдет ли она для самостоятельного изучения математики, с учетом того что в школе у меня с этим делом, кажется, все обстояло довольно неплохо (впрочем, какая разница что было в школе?) но вот университет я закончил по специальности философия? :-)
Трудоустройство:
Ну и пара чисто практических вопросов. Когда, по Вашему мнению, можно начинать объединять приятное с полезным и начинать искать работу без рисков получить травму мозга, несовместимую с дальнейшим развитием в сфере программирования? Несколько туманный вопрос, переформулирую: достаточно ли освоения первых двух томов для первичного трудоустройства с паралельным продолжением изучения материалов третьего тома? Или лучше было бы освоить все три тома до устройства на первую работу? В качестве профессионального инструмента я рассматриваю язык Си — да насколько я понимаю, писать-то больше и не на чем, во всяком случае из того что востребованно на рынке. Вопрос имеет определенную остроту, поскольку университет я уже закончил и вроде как пора бы и честь знать. И какие направления в работе лучше рассматривать для развития себя как программиста? (Параллельно с написанием вопроса заглянул на ресурсы по поиску работы. Стало немного грустно.)
Как-то многовато букаф вышло — заранее благодарю за уделенное время!

admin аватар

Жуть :)

Ну поехали по порядку.

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

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

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

Вообще если уж хотите моего совета, то рискну вам таковой выдать. Коль скоро вы освоили первые два тома моего учебника (речь ведь идёт об освоении, а не о "прочтении"?), то уж с чем у вас категорически не может быть проблем — это с командной строкой Юникса (включая Linux). Попробуйте для начала куда-нибудь устроиться сисадмином, только ни в коем случае не виндовозным, а именно на всякие юниксы; на такие места работодателю с удовольствием людей берут и без дипломов (это вообще работа, не требующая в/о, если уж честно), и без опыта, в ряде случаев вполне достаточно продемонстрировать, что вы командной строки не боитесь и обращаться с ней умеете; лучше, конечно, уметь ещё и простейшие сетки настраивать, но это вроде не так трудно. За время работы сисадмином можно попробовать что-нибудь сваять opensource'ное на том же Си, и опыт наберёте, и портфолио (в резюме ссылка на опубликованную оpensource'ную программу весьма способствует). Если даже и нет, всё равно полтора-два года опыта работы сисадмином поднимет вашу привлекательность в качестве кандидата в программисты. Да и третий том за это время осилите :-)

Здравствуйте. А

Здравствуйте. А что порекомендуете почитать, чтобы научиться простейшие сктки настраивать? И как вы относитесь к книге "Unix и Linux руководство системного администратора" Немет, Снайдер, Хейн, Уэйли, Макин?

admin аватар

Когда я всему

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

Игрушки

Спасибо! :-)
С огромным аппетитом смотрю на второй том, но пока рано — забавляюсь с написанием игрушек на Паскале. Ну и раз уж речь зашла рискну спросить вот еще что: еще до освоения указателей захотелось написать клон старого доброго Pong-а. Написал. Запустил. И тут же на почту стали поступать сообщения на хинди — я не эксперт, но кажется речь шла о предложении устроиться в какую-то индийскую IT компанию… «Тревожный звоночек» — подумал я и решил отложить работу с этой игрушкой дабы в голове всё немного улеглось. Ну, а если кроме шуток, то написал действительно плохо и вот на днях все переписал с нуля. Выглядеть и ощущаться стало лучше, но есть одно но, о котором позже.
По мере усвоения указателей хочется написать что-то еще более веселое и динамичное, например, клон Space Invaders. Еще всерьёз не думал о том как это дело будет выглядеть изнутри, но одну проблему я уже чувствую: движение управляемого игроком объекта когда клавиша нажата и остановка, когда клавиша отпущена. Это как раз то «но» с которым я столкнулся в Понге, но там, в принципе, некое коспромисное решение удалось найти — нажимает игрок клавишу «j» и платформа предсказуемо плавно движется вниз экрана, пока не упрется в границу; нажимает «k» и тоже самое происходит в обратную сторону. Главное вовремя задавать направление движения, дабы платфома успела соприкоснуться с мячиком и «отбить» его. Пытался написать как-то иначе, но решения получались не вполне красивыми и совершенно неэффективными — если получалось сделать так, чтобы платформа останавливалась в момент отпускания клавиши, то уже начало движения происходило с ощутимой задержкой (что еще хуже). В итоге оставил как есть, с плавными предсказуемыми движениями до пределов окна терминала. Есть, правда, возможность остановить платформу игрока нажав на какую-то другую клавишу, кроме клавиш отвечающих за движение — но это скорее недокументированная возможность, чем полноценная механика. Останавиливать платформу отдельной клавишей в динамичной игре это как минимум неудобно. Но то, что в Понге ощущается пусть немного непривычно, но, по крайней мере, можно сказать что это «не баг а фича», в Захватчиках будет вызывать только негативные эмоции — вместо того чтобы переместиться на нужное количество знакомест и выстрелить в космического супостата, фигурка игрока будет беспомощно мотаться из угла в угол, пока не попадет под вражеский огонь.
Есть мысль написать еще одну игрушку, но там тоже, по задумке, должна присутствовать такая механика. Короче, куда ни кинь — везде клин.
Вопрос: в каком направлении можно подумать, чтобы адекватно реализовать остановку по отпусканию клавиши в динамичных играх? Или пока стоит написать чего «попроще», а вернее того, где такая проблема не стоит вовсе, как, например, в Змейке, где остановок вообще не предусмотрено?

admin аватар

Во вы меня

Во вы меня озадачили :-)

Конечно, юниксовый терминал как объект (хоть тысячу раз абстрактный и виртуальный) работать на уровне клавиатурных событий (вида "такая-то клавиша нажата", "такая-то клавиша отпущена") не умеет, у него вообще нет клавиатуры как таковой, вместо неё линия связи (воображаемая, но от этого не легче), из которой высыпаются готовые символы, а не события клавиатуры. Работа на уровне событий клавиатуры в юниксе возможна (X-сервер же как-то это делает), но я с ходу не знаю, как, а лезть искать мне прямо сейчас некогда, тем более что вам это всё равно не поможет — во Free Pascal'е доступа к такой низухе точно нет.

Но обхитрить систему всё равно можно. Только придётся привязаться к системным часам. Общая идея такая: если у вас есть какой-то подвижный объект, и он должен при нажатой соответствующей клавише двигаться со скоростью N движений в секунду, то надо:

  • запоминать где-то время, когда объект двигался в последний раз (при старте программы — время, когда объект впервые появился на экране); лучше всего это время хранить вместе с координатами движущегося объекта, это его свойство, ничуть не хуже, чем сами координаты;
  • коль скоро обнаружилось, что нужная клавиша (например, одна из стрелок) нажата, вызывать процедуру для движения; эта процедура должна узнать, который нынче час, посмотреть, прошло ли достаточно времени, и если не прошло, то ничего не делать (тут же вывалиться), а вот если прошло, то произвести перемещение объекта на экране и запомнить уже новое время последнего передвижения;
  • если же никакие клавиши не нажаты, то просто сделать небольшую паузу — это нужно, чтобы попусту не греть процессор; например, если у вас объект движется пять раз в секунду, то здесь паузу можно выбрать, скажем, в 1/10 секунды.

Отдельный вопрос, как привязаться ко времени. Я не знаю, что курили те из создателей Free Pascal, которые придумали соответствующие процедуры из модуля sysutils, в команде FP, судя по всему, вообще злоупотребляют какими-то веществами. Но, в общем, сухой остаток такой — если подключить sysutils (добавить его в директиву uses) и написать вот такую функцию:

function NowMS : comp;
begin
    NowMS :=TimeStampToMSecs(DateTimeToTimeStamp(Now))
end;

то она будет возвращать количество миллисекунд, прошедшее с начала нашей эры (вот прямо с 1 января 0001 года). Загадочный тип comp — это вроде бы синоним Int64. Ну в общем эти comp'ы, по крайней мере, можно вычитать :-) что нам и требуется.

Дальше возникнет проблема с тем, что, когда пользователь нажимает клавишу, терминал сначала получает одно её нажатие, потом делается пауза, и только после паузы клавиатурный драйвер начинает "автоповторять" нажатую клавишу. Но мы же уже умеем привязываться ко времени :-) Следовательно, прекращать движение можно не тогда, когда KeyPressed говорит, что ничего не нажато, а тогда, когда ничего не было нажато, например, в течение последних 200 миллисекунд (1/5 секунды). Если задержка между отпусканием клавиши и остановкой объекта будет 1/5 секунды, пользователь её не заметит.

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

fluorine аватар

Системное время

можно так:

uses sysutils, dateutils, crt;
var
    start: TDateTime;
begin
    start := now;
    delay(50);
    writeln(MillisecondsBetween(now, start))
end.

Огромное спасибо! :-)

Огромное спасибо! :-)
Направление мысли уловил, буду разбираться!

Здравствуйте!

Здравствуйте! Может ли человек быть хорошим программистом без знаний из третьего тома?

admin аватар

Думаю, что нет.

Думаю, что нет. На одном императивно-процедурном программировании далеко не уедешь.

Здравствуйте.

Здравствуйте. Хотелось бы для себя выяснить, может проблема во мне и я не могу стать программистом. Не могу себе представить общий вид программы, чуть больший, чем тривиальная/простого уровня. Поясню на условной карточной игре. Изначально я займусь декомпозицией, то есть выясню какие функции(у кого больше очков) и сущности(карта)нужны для программы. Пишу код, если надо дебажу - работает.
Естественно карточные игры это не потолок моих желаний, хочется написать реальную программу. Например, оконник или bar (lemonbar/polybar etc). Я примерно понимаю X11, но задачу декомпозировать не могу, просто не за что ухватиться. То есть нет понимания как реализовать (что реализовывать?) каркас программы, который можно было бы обвешивать "фичами". Пытаясь понять код уже готовых программ(dwm), после некоторого времени теряется логическая цепочка что за что отвечает и т.д. Если это не проблема во мне, то как выработать этот навык, чтобы при задаче "любой" сложности было понимание что делать? У вас читал первые два тома, спасибо.

admin аватар

Вы бы ещё за

Вы бы ещё за операционную систему сразу схватились.

В принципе оконник — не так чтобы совсем суперсложная программа, но уж точно это не для того периода, когда человек ещё сам для себя не понял, может ли он быть программистом (кстати, в вашем случае скорее всего всё в порядке, вы просто слишком спешите).

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

Ну а рекомендация тут будет очень простая: вернитесь к первому тому, к части про Паскаль, и для начала на Паскале (!) напишите что-то такое, чем станет пользоваться (причём добровольно) кто-то кроме вас. В процессе как раз наберёте опыт простейшего кодинга.

Что до оконника — первое, что приходит в голову, это сделать какой-нибудь бесполезный, но работающий оконник, например, чтобы он вообще вокруг окошек ничего не рисовал, любое окошко появлялось изначально в середине экрана (полностью игнорируя другие окна), и чтобы это появившееся окошко можно было двигать, например, клавишами F9--F12. Потом постепенно обращивать полученный скелет новым мясом, несколько раз наверняка придётся переписать с нуля (когда код начнёт от рук отбиваться), но это нормально. Только не делайте этого прямо сейчас!. Что делать сейчас — см. выше.

П-Р-О-С-Т-Р-А-Ц-И-Я

Здравствуйте! Добежал до параграфа 2.10 и темы "односвязный список". Возникли проблемы в том, что очень трудно начало изучаться тема, стал какой-то нервный, и ощущение будто в голову уже эти знания с указателями не лезут. Сталкиваюсь с этим впервые, поэтому попрошу помощи...

А порисовать?

Попробуйте порисовать картинки. которые есть в книге. Шаг за шагом. Некоторым (и мне тоже) проще понять (например какой-нибудь) алгоритм просто рисуя его на бумаге, шаг за шагом его выполнение.
Можете поискать в интернете визуализации односвязного списка, таких полно, может вам такой способ поможет понять.
Ну а вообще - не стоит на одном параграфе "висеть" долго. Не получилось - идите дальше, потом вернитесь (только обязательно вернитесь, так как в будущем (в "Си") без них никак).

> Ну а вообще -

> Ну а вообще - не стоит на одном параграфе "висеть" долго. Не получилось - идите дальше

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

fluorine аватар

Как раз

Как раз таки-нет. Если указатели долго не "идут", нужно попробовать пописать программы без них. Поставить ограничения, вместо очереди использовать кольцевой буфер, и т.д., да много впринципе задач в которые хорошо вписываются ограничения. Можно попробовать писать на ассемблере, поиграв с косвенной адресацией через регистры. Так можно и полноценно "пощупать" указатели, понять почему мелкие структуры данных лучше копировать, чем брать от них адреса (передавать через var-параметры). Случай когда нельзя оставлять это на потом это - изучение Си, это да, тот самый случай.

Помощь

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

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

admin аватар

С одной

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

С другой — мне даже интересно, как вы себе представляете "помощь", которую тут решили попросить. Особенно с учётом того, что вы никаких конкретных вопросов не задаёте, просто констатируете факт, что вам стало тяжело. Ну так никто же и не обещал, что будет легко, не?

Список

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

Как думаете, это нормально?

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

admin аватар

Вообще-то в

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

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

Деревья

> Про дерево не напрягайтесь, это реально сложная штука. Пусть полгодика пройдёт, шок уляжется, мозг к указателям привыкнет -- окажется всё просто :-)

Да не, если с рекурсией — это не особо сложно. Я бинарные деревья даже в игре robozzle проходил. Мне сложно именно не рекурсивно, точнее вообще не понятно как в принципе что-то такое сделать. Я так думаю, что там придётся всё равно использовать рекурсию, просто замаскированную, например взять односвязный список и использовать его для хранения текущей позиции в дереве, то есть фактически реализовать ту же рекурсию, используя свой стек-костыль вместо аппаратного стека вызовов.

Или всё-таки можно обойтись только статическими структурами данных, не считая само дерево?

реализовать ту

реализовать ту же рекурсию, используя свой стек-костыль вместо аппаратного стека вызовов.
Аппаратный стек вызовов есть не во всех современных ЭВМ.

admin аватар

Мммм... есть

Мммм... есть кое-какие догадки на сей счёт, но в целом очень интересно, какие конкретно архитектуры вы тут имеете в виду.

admin аватар

Про стек вы

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

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

Здравствуйте,

Здравствуйте, стало интересно посмотреть вашу реализацию строк, которая Script Plus Plus, и вместе с исходным текстом библиотеки должен был быть еще файлик scrtest.cpp, но его не оказалось в архиве. Я что-то упускаю?

admin аватар

В данном случае

В данном случае скорее я что-то упускаю, точнее, упустил столько лет назад, сколько прошло с публикации версии 0.3.10. scrtest — это файл с юнит-тестами, то есть на функционирование библиотеки он никак не влияет, но, конечно, в архиве он вроде бы должен быть.

Прошу прощения, но прямо сейчас это исправлять не буду, постараюсь в ближайшее время выложить версию посвежее (только сам себя убедю, что она более-менее рабочая, и тут же выложу)

Здравствуйте,

Здравствуйте, решил попробовать написать более-менее нетривиальную программу. Понадобилась хэш-таблица для одной из подсистем. Реализовал хэш-таблицу вручную с использованием односвязных списков для разрешения коллизий. С этим особых проблем не возникло, работает как и требуется. Спустя какое-то время в другой подсистеме появилась аналогичная нужда в хэш-таблице. И вот возник вопрос- как поступить? Реализовать еще раз таблицу, но тогда будет много повторяющегося кода. STL я даже не рассматриваю как вариант. Писать свой шаблон для хэш-таблицы, тоже, вроде как, не хочется (а, вдруг, потом все-таки нужно будет модифицировать особым образом хэш-таблицу для одной из подсистем). В общем, не знаю как будет правильнее. Как вы обычно поступаете в такой ситуации?

admin аватар

Из

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

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

fluorine аватар

Раньше как-то

Раньше как-то видел в www.croro.net страницу "с красивыми картинками (картами)", это не про игру loosy_crocodile? Вы участвовали в одном контесте вроде-бы.. Как в неё поиграть? И ещё не могу найти ту страницу. Скиньте пожалуйсто :)

admin аватар

Брррррр, вы про

Брррррр, вы про это? http://www.intelib.org/icfp2002-contest.html Я не уверен, что в это можно "поиграть", Loosy Alligator — это название моей программы, поданной на конкурс и бесславно провалившейся из-за дебильного бага. Сама программа валяется на ftp до сих пор, с той страницы ссылка есть. Но чтобы в это играть, нужен ещё сервер от организаторов контеста, и что-то сдаётся мне, его уже не найти. Почти 20 лет прошло, как-никак.

Коди

Андрей, приветствую. В какой кодировке книги? Как ctrl+c - то прожать, чтоб оно в крокозябру не превратилось?

admin аватар

Сто раз уже

Сто раз уже сказано -- никак, ибо это не баг, а фича. Текстовый слой в этих PDFах сломан намеренно. Я уже даже в FAQ это вынес, сколько можно одно и то же спрашивать?!

Здравствуйте,

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

admin аватар

Это очень

Это очень сильно зависит от того, какие требования вы сами предъявляете к своей реализации. Если вас устраивает рассмотрение этого автомата на каком-то поле фиксированного размера, то вам хватит материала первого тома до главы про полноэкранные программы включительно. А вот если фиксированное поле не устраивает, то потребуются динамические массивы, Free Pascal их поддерживает, но я их намеренно не рассматриваю в книге, чтобы не лишать читателя стимула осваивать указатели и списки; да и вообще, чтобы понять, почему они такие "странные", нужно знать Си :-) (они оттуда импортированы, причём довольно кривенько). Ну и вообще, как, например, задавать исходную колонию? Будет ли ваша реализация позволять сохранять конфигурацию в файле и считывать из файла? Будет ли предусмотрен какой-то интерактивный редактор или пользователю придётся, скажем, самому в текстовои файле рисовать эту колонию звёздочками или ещё чем? Будет ли размер поля совпадать с размером экрана или вы позволите колонии разрастаться на большем поле, а для просмотра прикрутите всякий скроллинг? Всё это влияет на сложность реализации.

Но простейший вариант можно сделать сразу после изучения модуля crt :-)

Спасибо за

Спасибо за ответ, начну с малого.

Можно и

Можно и неинтерактивную программу сделать, как только научились читать исходное положение с input и пошагово выводить эволюцию колонии в output.

admin аватар

Можно, конечно,

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

Допустимо

Допустимо использовать на одном компьютере, но на разных дисках, два Линукс дистрибутива, одну чтобы протестить?

fluorine аватар

Видимо имеются

Видимо имеются проблемы с поиском информации :-)

Я за минуту нашёл вот-такую pdf'ку. Осталось только попробовать.

Вообще не обязательно даже читать эту pdf'ку. Достаточно оставить свободное место на диске при установке первого дистрибутива, и второй (сколько угодно) ставить на это свободное место, к тому же можно на разных OS использовать один swap раздел, "даже" один /home и "даже" настроить общие разделы (у меня это /public). И одной update-grub точно хватить.

Я у cебя второй системой держу FreeBSD, загружаю её с GRUB. Там плясок побольше, но всё возможно.

admin аватар

Бггг. А что,

Бггг. А что, по-вашему, может этому помешать?

tvldslv аватар

Intel ME

Доброго времени суток! Хотелось бы узнать ваше мнение насчёт системы Intel ME, так или иначе участвующей в работе компьютеров с чипами Intel. Это ведь целый ЦПУ (Intel quark) внутри системы со своей флеш-памятью и ОС Minix, имеющей доступ к системе на уровне выше всех "колец". Даже пакеты, поступающие через Ethernet, проходят "сквозь него". Как вам кажется, может ли Intel таким образом логировать действия пользователей, или ещё что похуже? И понимает ли это наше правительство, пуская на гос. предприятия системы, хоть и обзывающиеся "допущенные по СТ-1", но, по-факту, содержащие потенциально враждебные возможности?

admin аватар

Наше

Наше правительство вообще ничего не понимает. По поводу остального — честно говоря, надоело пережёвывать эту тему. Да, это, как говорят, алес капут. Ну хотя вообще-то не совсем, поскольку роутеры у нас обычно на ARMах, а на ARMах пока что вроде такого не замечено (хотя я мог отстать от жизни), так что, по крайней мере, вполне можно посниффить пакеты, которые предположительно исходят от IntelME (например, поместить за роутером несколько выключенных, но запитанных компов, и ни одного включённого, и посмотреть на трафик). Что обнадёживает — это что такого, естественно, только ленивый не делал, и что-то ничего на эту тему в инете не находится, т.е., возможно, IntelME в его нынешних версиях ничего никуда не посылает.

Вот тут есть неплохой обзор на тему "что можно сделать" (рекомендую выключить js, текст на странице доступен без него) https://security.stackexchange.com/questions/142947/what-can-i-do-about-...
Самый простой из советов — не пользоваться набортным эзером. Там, правда, советуют usb ether, а это не очень хорошая идея, поскольку в линуксе с драйверами для usb ether'ов полная задница. Можно ли использовать просто сетевую карту, вставленную в PCI-слот, и умеет ли ME ими пользоваться — я не понял.

Ну и такой момент, что пользователям маков, Windows и смартфонов, по-видимому, можно не беспокоиться насчёт IntelME, т.к. количество бекдоров и прочих анальных зондов в их операционных системах заведомо превышает на порядки то, что может прятаться в недрах IntelME.

роутеры у нас

роутеры у нас обычно на ARMахНа MIPSах тоже попадались.

Увы

> Что обнадёживает — это что такого, естественно, только ленивый не делал, и что-то ничего на эту тему в инете не находится, т.е., возможно, IntelME в его нынешних версиях ничего никуда не посылает.

Ни в коем случае. Если на стену вешают ружьё, значит оно выстрелит.

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

То же самое относится и к компьютерным шпионам. Если IntelME в момент проверки ничего никуда не шлёт, то 99% - это потому что ему просто не дана команда за вами следить, и лишь 1% - технические средства конспирации. Здесь есть и элементарная практичность: если бы все машины слали данные инициативно, их бы просто негде было хранить.

admin аватар

Сдаётся мне, вы

Сдаётся мне, вы тут кое-что упускаете. Когда машина находится за NAT'ом, ей нельзя "дать команду следить", если только она сама не слазит "куда надо" и не спросит, нет ли для неё каких указаний. Отсутствие трафика означает, что машина НЕ пытается ниоткуда получить никакие команды — а значит, она их и не получит. Хотя, конечно, "это не точно", поскольку, как тут кто-то уже написал, она вполне может свой (весьма незначительный) трафик маскировать, включаясь только тогда, когда пользователь активно что-то качает.

tvldslv аватар

Со слов

Со слов человека, которого я попросил это протестить: "За 4 дня "наблюдений" прошел 1 пинг в 8.8.8.8. Стоит отметить, что подключены были 3 машины, на одной присутствует vPro, если это важно." Но! Если может пройти пакет, значит вполне себе реально реализовать (особенно с нынешними вычислительными мощностями quark-ов (после D2000 в 2015 intel давненько про них не заикались, но, подозреваю, что современным IMEI управляет уже далеко не 1 ядро в 32nm на 400Mhz) и фактом того, что ME - это unix) код, проверяющий, чего там у пользователя запущено и "под шумок браузера"(особенно, если приходит большой массив данных, например, человек ест дерьмо пользуется платформой YouTube, или чем-то подобным) отправлять хоть логи действий, хоть изображение с веб-камеры (маловероятно, конечно, но все же). Тем более, что Minix - полноценная система (сомневаюсь, что инженеры из Intel реализовали все необходимые функции в рамках микроядра, сильно много насиловать клавиатуру пришлось бы), а значит, скорее всего часть функций системы лежит на "приложениях" -> возможности для компрометации пользователя стремятся в бесконечность. Кстати, насколько известно из официальной документации, код платформы зашифрован (понятно, что обфусцирован) и "декодирование" происходит на аппаратном уровне. Но, если есть декодирование, значит есть и участок, где код представляет собой вполне обычные x86 команды -> его можно считать (в случае с обфускацией на уровне вставки кучи мусора - наблюдать за некоторыми аспектами выполнения и пустые конструкции отсеивать, думаю, алгоритм такой можно реализовать). Не очень верю, что кто-то такое когда-нибудь сделает, но сам факт наличия шанса весьма обнадеживает

Parthen аватар

>Самый простой

>Самый простой из советов
Купить процессоры, которые выпускали до изобретения ME/PSP :)

admin аватар

Это, кстати,

Это, кстати, правильный совет. Только сначала надо всех вебщиков перестрелять к чёртовой бабушке, поскольку браузеры и "современный" веб на таких машинах не работают. Остальное работает нормально, у меня до сих пор eeepc901 в эксплуатации.

Parthen аватар

Я вас умоляю

Мой FX-4300, выпущенный в 12 году преспокойно выдерживает 2 браузера и приложение на Electron, еще и остается. Я уж молчу, что его разогнать можно.
А AMD PSP выпущен в 2013 году. Intel ME сильно раньше, но это проблемы пользователей Intel.

FX-4300,

FX-4300, выпущенный в 12 году
Да, в общем, и с Phenom II X4 840 особо не бедствую :) Но вот ноутбуку на Core 2 Duo T6600 грустновато, это да...

admin аватар

Вообще AMD до 2012

Вообще AMD до 2012 года выпуска включительно -- это может быть вполне себе решение.

tvldslv аватар

Насчёт веба -

Насчёт веба - полностью согласен. IBM Thinkpad x31 (ноутбук - чуть старше меня, Pentium M + 512M RAM под капотом) - полет нормальный. Вполне хватает как для чтения книг, так и для любой другой повседневной работы. Браузеры, правда, кроме Links / NetSurf не работают, но в вебе я не настолько нуждаюсь, что бы испытывать от этого сколь бы то ни было серьезные неудобства. Только вот, видимо, рано или поздно придется завести карту в банке, а их сайты из-под NetSurf открываться отказываются.

ME cleaner

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

Интересно, есть ли подобное для AMD PSP?

Указатели

Здравствуйте, Андрей Викторович. Позавчера я начал изучение указателей на языке Паскаль и пока не могу сообразить, как решить две предложенные вами задачи на стр. 411 второго издания МАКСпрес. Что вы можете посоветовать, подумать ещё или отложить изучение указателей?

P.S. Смысл записи first^.next^.next я понял. Дальше этих двух задачь текст не читал, только на картинку два раза как говорится, по-диагонали, взглянул, хотя искушение начать читать объяснение задачь велико.

admin аватар

В книжке всё

В книжке всё написано — все мои рекомендации и прочие соображения по поводу этих двух задач. А решать в любом случае вам.

tvldslv аватар

Ваших

Ваших читателей, оказывается, уже в "секту" записывают. Разговаривал с одним сотрудником НГТУ, так он мне пол часа доказывал, какую вы "секту свидетелей Столярова" создаете и как "мозги людям туманите, что бы люди с linux мучались".

Parthen аватар

>НГТУЭто

>НГТУ
Это Нижегородский или Новосибирский? В Нижегородском моя информатичка училась :)

tvldslv аватар

Новосибирский

Новосибирский

admin аватар

Да какая

Да какая разница, думаете в МГУ таких нет?

Parthen аватар

Просто

Просто интересно, кто моих учителей учил

admin аватар

Гм, "секта

Гм, "секта свидетелей Столярова" — ну а что, звучит :-)

Вообще это ожидаемо, и не только это, смею вас заверить. Своими книжками, особенно текстом предисловий, я совершенно откровенно заявил, что примерно 97% преподавателей программирования, если не больше — халтурщики. Я вполне отдаю себе отчёт, какое количество врагов я себе при этом нажил, и их число будет только увеличиваться по мере роста популярности моих книг. Понимаете, в этой игре такие правила. "Они" вам будут доказывать что угодно и сколько угодно времени — просто потому, что признать себя халтурщиком никто никогда не захочет и не согласится.

Ну а ценность аргумента, что, мол, людям придётся с линуксом "мучиться", можете оценить вполне объективно: вот лично я что, так похож на мазохиста? Совершенно очевидно, что, когда припрёт, с мелкомягким дерьмищем я справляюсь (что после этого руки трясутся и хочется кого-нибудь убить — это второй вопрос). Ну то есть вот лично я могу работать и с Windows, и с Linux. Могу, разумеется, под Linux'ом работать и с Desktop Environments, и с командной строкой. Умею, не поверите! Точнее, вы-то поверите, да и любой другой человек, если подумает, вряд ли поверит, что я не умею тыкать мышкой в иконки. Не люблю — это факт, но понятно, что умею. И из всего этого сборища альтернатив, разумеется, выбираю именно что командную строку для всего, кроме разве что сортировки фоток (там предметная область такая — превьюшки удобны).

А вот виндузятники работать к командной строкой не умеют. И с этим тоже обычно никто не спорит, потому что просто никто в обратное не поверит. И если я, умея и то и другое, выбираю командную строку, и не просто выбираю, а только с ней фактически и работаю вот уже больше четверти века — значит, (surprize!) она просто удобна. А мучаются не те, кто с работают с линуксом, а те, кто до полной ус$$чки, пардон, боятся сделать шаг в сторону от мейнстрима, и продолжают гонять отвратительные в своей контр-эргономичности GUI. Вот они — да, мучаются. Большинство соверменных людей проводят за компьютером много часов в день, можно было бы и потратить чуть-чуть времени, чтобы научиться с компьютерами работать нормально, т.е. грамотно и эффективно, а не так, как тридцать с лишним лет назад приучили весь мир поганцы-маркетоиды.

Удобство относительно?

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

Другими способами работать вы можете, но при этом нет того автоматизма, поэтому они воспринимаются как менее удобные.

Кстати кроме гуи и команд есть и другие варианты, например nc/mc/far. Некоторые как привыкли пользоваться нортоном, так до сих пор сидят за его клонами и искренне считают, что это удобнее как командного интерфейса, так и GUI, тогда как я вообще не очень понимаю зачем этот mc нужен и не пользуюсь.

> А может быть

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

> Другими способами работать вы можете, но при этом нет того автоматизма, поэтому они воспринимаются как менее удобные.

Я своему малому на лаптоп установил Линукс и Виндовс (для школы). У него еще точно никакие нейронные связи не успели выработаться к тому времени. На Линуксе у него - i3wm. Спустя некоторое время сравнений этих двух систем, он выбрал Линукс с i3wm, и если бы не школа, снес бы Виндовс давно.

admin аватар

Слушайте, ну

Слушайте, ну что за аргументы, ей-богу?! Вот это ваше "в мозгу уже сформировались нужные нейронные связи" можно сказать намного проще: да, блин, я умею пользоваться командной строкой. А они — не умеют. Я это сам сказал, заметим. Т.е. вы переформулировали моё собственное утверждение, использовав наукообразную лексику, и что, от этого поменялось что-то?

Вы что думаете, я на форточках никогда не сидел? Сидел-сидел. Правда, давно дело было, последней активно использовавшейся у меня дома версией оказалась в своё время Windows-95, следующую (Win98) поставить не успел, т.к. в самом начале 1998 года окончательно ушел из-под винды. Но до неё была Win-3.11, а ещё раньше — разумеется, MS-DOS с тем самым нортоном. Так что эти ваши "нейронные связи" у меня имели место под каждый из вариантов. И это мне никак не помешало.

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

А сравнивать удобство инструмента, с которым работать не умеешь, с удобством того, к которому привык — это, пардон, полная ерунда. Разумеется, тот, к которому привык, будет казаться более удобным. Ключевое слово "казаться".

Использование компьютера

> Т.е. вы переформулировали моё собственное утверждение, использовав наукообразную лексику

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

> Вы что думаете, я на форточках никогда не сидел?

Так я тоже сидел, но когда это было? А сейчас мне форточками неудобно пользоваться, как потому, что они ломают мои привычки (например я там время от времени набираю ls и только потом стираю, и набираю уже dir), так и потому что некоторые возможности там просто отсутствуют. Ну и по выше перечисленным причинам тоже — я только примерно знаю что там и где искать.

Кстати насчёт командной строки, а вы знаете, что в Windows есть Power Shell, который представляет собой оболочку с набором команд и вроде бы довольно мощным? Вот вы им не владеете, а bash владеете, поэтому в bash вам проще работать. Я, кстати, тоже PoSh не владею, да и из знакомых виндузятников им почему-то никто не пользуется.

> Разумеется, тот, к которому привык, будет казаться более удобным. Ключевое слово "казаться".

Так я это и говорил, собственно.

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

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

Есть же те же топовые программисты из микрософта какого-нибудь, или вон разработчик fasm, который этот fasm разрабатывает из-под Windows 10, хотя у него есть компьютеры с другими ОС, даже с DOS на котором он регулярно этот fasm тестирует. Неужто они умеют пользоваться компьютером хуже нас с вами?

< опытный

< опытный виндузятник мышкой реактивно ведёт к нужному пункту меню, потому что у него уже есть мышечная память >
Не-не-не :D Я вот сижу на Win10 чуть больше года, и за это время некоторые (многие) кнопочки в Параметрах меняли расположение аж ТРИ раза. К счастью, искать их не приходится - там есть поиск, а многое запускаю сразу из командной строки. А виндузятник я опытный.
Power Shell желания овладеть им не вызывает. Админы его юзают, но он и создан-то именно для администрирования. Дотнетчикам в нём удобно, ведь можно использовать классы .Net - это как сишарп с другим синтаксисом.
Bash в использовании приятнее, хотя я лично столкнулся с ним сильно позже, чем с PS.
Насчёт программистов Микрософта - их первой осью был Xenix, и все версии DOS, а так же винда вплоть до какой-то там версии NT писалась под ней. В консольном vi. И что-то мне подсказывает, что на NT они переползли потом лишь из-за того, что железо новое, да и с отладкой проще. Скрипты сборки винды написаны на cmd, и переписывать их на PS они даже не планируют. PS вообще слабо пригоден для скриптования из-за слабой предсказуемости - одна и та же команда норм работает интерактивно, а в скрипте делает абы что в тех же условиях. Скрипт превращается в море костылей. И это не детская болезнь - языку уже полтора десятка лет.
Нарыл, кстати, лаунчер для Андроида - командная строка вместо рабочего стола. Поюзал, вполне удобно. Набрать "flash" у меня получается быстрее, чем опустить "шторку" и найти там глазами иконку фонарика. Но смешно - на линуксе запустить Java-машину, в которой запустить монструозный гуй, в котором будет рисоваться линуксовая консоль на весь экран. Хочу теперь смарт, где такая консоль будет нативной, а то нынешний вариант плохо интегрирован с железом - звонить неудобно.

fluorine аватар

> Параметрах

> Параметрах меняли расположение аж ТРИ раза.

Ну да продолжайте сидеть с автообновлениями, глядите что-то серьезнее ещё пришлют.

> сишарп

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

> PS вообще слабо пригоден для скриптования из-за слабой предсказуемости - одна и та же команда норм работает интерактивно, а в скрипте делает абы что в тех же условиях.

Удивляюсь тому, какие обезьяны там сидят. Это же надо было так! На глаза "топовость" тамошних погромистов.

> Нарыл, кстати, лаунчер для Андроида - командная строка вместо рабочего стола

А можно название?

< продолжайте

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

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

< А можно название? >
T-UI Launcher. Он же Linux CLI Launcher.

Ужас

Господи. В данный момент работаю сисадмином в не-IT компании, везде на рабочих станциях стоят Win8.1 и Win10. Осенью незаметно прилетели обновления системы, которые прошли мимо меня и поломали сетевую печать у тех, чьи системы успели обновиться. Было очень больно, т.к. компов немало, автообновления не отключаемы, обновления снова прилетают

admin аватар

Не пробовали

Не пробовали весь мелкософт зафильтровать на роутере на уровне IP? По идее должно помочь.

Там главная

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

Мечтаю устроиться туда, где с виндой вообще не надо будет контактировать. Only POSIX-compliant OS's

Windows NT

Windows NT формально POSIX-compliant

admin аватар

Я не знаю, как

Я не знаю, как там насчёт "формально", зато точно знаю, что select там умеет работать только с сокетами. Если ЭТО ещё и compliant, то с этим долбаным позиксом-хренозиксом всё даже ещё хуже, чем я думал.

"Compilant" была

"Compilant" была только POSIX-подсистема. На Win32(GUI&CUI), OS/2 и 16-разрядные приложения эта "совместимость" на распространялась, и, разумеется, на внутренние No-UI процессы Windows NT.
С сетью в виндовом пазиксе было ещё смешнее.

admin аватар

Так не надо

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

Насколько я понимаю, вашим устремлениям лучше отвечает термин "Unix-like OSes".

Спасибо, принял

Спасибо, принял к сведению)

admin аватар

Их невозможно

Их невозможно выключить, не сломав систему.

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

> Вообще жду

> Вообще жду когда подохнет эта "технология"
> через лет так 1.5-2

.NET уже лет 20 живёт и для того, чтобы такие предположения строить, нужно иметь серьёзные причины. Не поделитесь? :)

> На глаза "топовость" тамошних погромистов

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

fluorine аватар

> Не

> Не поделитесь?

Ну я про виртуальность этой штуки. Сидели бы и дальше на винде, а не шли бы в линукс со своим mono :P.

Mono придумали

Mono придумали линуксоиды хрен пойми зачем. Микрософт выкатил .Net Core. Не путайте их, у Mono нет планов захватить мир.

admin аватар

Это не только в

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

admin аватар

По поводу

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

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

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

Так нет же, причём сразу везде "нет же", даже в мире линукса плодятся моральные уроды, которых хлебом не корми — дай влезть куда не звали: последнее новшество — гномеры, чьи "приложения" вторглись в зону ответственности оконного менеджера. "Никакой свободы выбора для пользователя, ибо вот ещё чего!" Позорище проклятое.

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

fluorine аватар

Это UI-дизайнеры

Это UI-дизайнеры решают как я слышал. Как обычно под дудку маркетологов, которые следят за "трендами" (или их задают?). Впрочем пока вся эта орава "специалистов" не дойдёт до командной строки и конфиг файлов все их труды - это бесполезная трата времени опаснейшая деятельность.

Кстати про веб. Тяжелый случай - это адаптивная вёрстка. Заходил на один сайт, а на этом сайте у меня мало информации размещалось на один экран. Я не мог так листать страницу, поэтому решил поиграть с масштабом. Ничего не получилось. Потом до меня дошло, что можно менять размер окошка браузера. Так я довел его до соотношения 1:4 (смартфона), и "вдруг" у меня на экране поместилось столько информации сколько я хотел.

> вебом: дайте информацию, а как конкретно она будет выглядеть

Такой браузер где я могу написать 1 css на все сайты интернета и +выборочно? Нет, я даже за!

admin аватар

в винде вам

в винде вам постоянно придётся что-то вспоминать или искать

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

Power Shell

Насколько я понимаю, он только-только появился, но дело не в этом. Покажите мне виндузятника, который всё — ну, как минимум все действия с файлами — выполняет в этом power shell'е.

Я к тому, что даже на маках много раз видел, как открывают терминал и в нём фигачат, но вот чтоб на винде окошко с power shell'ом открыл кто-то отличный от профессионального админа, пасущего сетку на сотню машин — не видел ни разу.

топовые программисты из микрософта

Не смешите мои тапочки.

разработчик fasm, который этот fasm разрабатывает из-под Windows 10

Ну значит правильно я nasm выбрал в своё время. Что-то интуитивно мне этот fasm не понравился.

Неужто они умеют пользоваться компьютером хуже нас с вами?

По-моему, это несомненно.

Выбор ассемблера

значит правильно я nasm выбрал в своё время.

Почему тогда не bunutils, если с nasm всё равно без них не обойтись при сборке линуксовых бинарников? Вроде бы as из GNU binutils больше похож на юниксовый.
Из каких-то педагогических соображений? Или повлияли предпочтения со времён MS-DOS?

admin аватар

Подробный

Подробный ответ на вопрос, почему для обучения следует использовать синтаксис Intel, имеется в предисловии к третьей части книги (см. текст между заголовком части и началом главы 3.1).

Как известно, GNU

Как известно, GNU as тоже понимает синтаксис intel-microsoft:

as -msyntax=intel -mnaked-reg -al << GAS
mov eax,[a+edx]
GAS
GAS LISTING                     page 1


   1 0000 678B8200      mov eax,[a+edx]
   1      000000

или с помощью документированных директив .intel_syntax noprefix
https://sourceware.org/binutils/docs-2.37/as/i386_002dVariations.html

admin аватар

Microsoft тут

Microsoft тут вообще ни при чём, есть синтаксис Intel, есть синтаксис AT&T, называются они так. Intel в официальной документации использует именно свой синтаксис, что вполне естественно; и для данной конкретной системы команд этот синтаксис выглядит естественнее, чем AT&T (ну да, если бы курс был ориентирован на PDP-11, даже я бы взял синтаксис AT&T).

Конкретно про gas можно сказать проще: он мне не нравится. Ощущение от него таково, что он никогда не предназначался для ручного программирования, только для трансляции всего того, что выплюнут компиляторы Си и прочих ЯВУ. Могу ошибаться (в том смысле, что авторы gas могли не иметь такого намерения), но ощущение такое есть. Он какой-то нечеловеческий.

Впрочем, когда я в 2007 году искал, какой взять ассемблер (условием был именно синтаксис Intel), я с ходу нашёл nasm и fasm, а про то, что gas тоже его поддерживает, информации не нашёл — то ли тогда такой поддержки не было, то ли просто не попались соответствующие тексты. Переделывать в любом случае не буду :-P

если бы курс

если бы курс был ориентирован на PDP-11, даже я бы взял синтаксис AT&T
DEC не использовала синтаксис, придуманный Кеном для юниксового ассемблера PDP-11, ни в документации, ни в MACRO-11.

# и @ уже использовались в UNIX для исправления напечатанного текста. А ; Кен решил разделять инструкции, записанные в одной строке: в интерактивных системах разделения времени уже не было причин кодировать каждую инструкцию или директиву на отдельной перфокарте. Правда этой возможностью он не злоупотреблял, чаще всего через ; перечислялись параметры системных вызовов или содержимое коротких массивов и структур.
Для отделения комментария в конце строки Кен выбрал /, как в DECовских ассемблерах для более ранних машин.

>>Неужто они

>>Неужто они умеют пользоваться компьютером хуже нас с вами?
> По-моему, это несомненно.

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

Кстати, линуксовая версия даже libc не использует, файл статический, дёргающий системные вызовы, а для выделения и освобождения памяти автор написал собственный упрощённый аналог malloc/free, который на 64-битной системе выделаяет адреса в пределах первых 4 гигабайтов, чтобы остальной код, использующий 32-битные указатели мог работать.

> Ну значит правильно я nasm выбрал в своё время. Что-то интуитивно мне этот fasm не понравился.

У обоих есть свои плюсы и минусы. На мой взгляд, из них для вашей задачи наиболее релевантно то, что nasm умеет добавлять отладочную информацию в формате, понимаемом gdb, а fasm её дампит в отдельный файл в своём собственном формате.

admin аватар

> Я бы что-то

> Я бы что-то подобное fasm написать бы не смог, например.

Я для себя проблемы в этом не вижу, кроме времени, которого у меня на подобные этюды нет и не предвидится.

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

Что характерно, "рядовые" (в смысле, совсем даже не топовые) программисты там попадаются вполне вменяемые, но, если мои сведенья верны, надолго они там не задерживаются.

> линуксовая версия даже libc не использует

А почему "даже", если он написан сам на себе, т.е. на ассемблере? Нахрена ассемблерной программе libc? Точнее, даже не так — если всё равно использовать libc, то на кой же ляд вообще писать на асме? (впрочем, вопрос "накой ляд писать на асме" в любом случае имеет только один валидный ответ: для демонстрации собственной крутизны).

> А почему

> А почему "даже", если он написан сам на себе, т.е. на ассемблере? Нахрена ассемблерной программе libc?

Ну, у fasm есть "ядро" и несколько интерфейсов. Один из них для libc, его предполагется использовать на всяких юникс-подобных ОС вроде BSD, но и на линукс должно работать. Собирается это в объектный файл который потом ещё надо линкером превратить в исполнимый.

Кроме fasm, ещё есть fasmg, который появился сравнительно недавно. Ключевое отличие что это уже больше чем просто ассемблер: теперь даже команды x86 — это тоже макросы, за счёт этого становится возможным ассемблировать произвольные двоичные файлы, а не только исполнимый код для x86. Правда он сам всё равно написан в командах x86 и на arm-компе будет только через qemu-user или что-то подобное запускаться.

Вот в этом fasmg почему-то линуксовая версия дёргала из /lib/ld-linux.so.2 функции malloc, calloc, realloc и free. Но недавно это убрали и теперь она дёргает только системные вызовы и использует свой менеджер памяти. Версия для libc тоже есть, она дёргает ещё и файловые функции типа fread, fwrite, fseek, ftell, write (последнее для того чтобы писать не буферизовано на stdin/out).

> то на кой же ляд вообще писать на асме?

1) Компиляторы ЯП принято писать на них самих почему-то.
2) Видимо автору проще писать на ассемблере, чем на каком-то другом языке. Или может доставляет больше удовольтсвия?

1) Компиляторы

1) Компиляторы ЯП принято писать на них самих почему-то.

В общем случае это сомнительный принцип. Мало кто пишет компоновщики на их входных языках. Хотя технически это, несомненно, возможно.

admin аватар

Ну это я

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

А, скажем, интерпретатор на его собственном языке написать вообще проще пареной репы в большинстве случаев, но практического смысла в этом — никакого от слова "совсем". Ну и что?

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

> Компиляторы

> Компиляторы ЯП принято писать на них самих почему-то

Важное уточнение: высокоуровневых языков :) Тот же FreePascal сначала на Си был написан (небольшое подмножество), а потом допиливался на самом Паскале. Ещё сектанты любители Рефала так часто делают свои реализации.

admin аватар

Рефалистов я в

Рефалистов я в этом не заметил. Единственная сколько-нибудь вменяемая реализация Рефала — Refal5 — написана на чистом Си, как и предшествующий refal2 (но его вменяемым называть невозможно). Из последовавшего я много чего видел, даже на джаве, но не на самом рефале.

Про FreePascal для меня это новость, я был почему-то уверен, что они начинали с TurboPascal в качестве компилятора для их компилятора.

На счёт FreePascal

На счёт FreePascal был неправ: в интернете пишут, что его первые версии были сделаны в Турбо Паскале 7.0. Видимо, я FreePascal с каким-то другим диалектом перепутал.

На счёт рефала: некоторые реализации созданы при помощи раскрутки компилятора. Причём, некоторые из них раскручивали "сами себя", а некоторые требуют стороннего компилятора (например, Refal 5 lambda). Но вообще, второй вариант кажется немного бредовым :)

admin аватар

Во-первых, ни

Во-первых, ни фига это не "принято", с ходу припоминается толпа компайлеров, которые совершенно не self-hosted или как это там называется. Во-вторых, ассемблер — это НЕ компилятор ЯП, это именно ассемблер, программа совершенно отдельного класса. В-третьих, не знаю, что там принято, но вот чего не принято — так это боевого программирования на ассемблере.

А вот насчёт "доставляет больше удовольствия" я совершенно запросто готов поверить :-)

В защиту fasm

Трудно сравнивать с nasm'ом, т.к. никогда им не пользовался. А вот fasm плотно использовал, перешел на него когда-то с tasm'а. Очень мне понравилось экономия нескольких байт на условные переходы вперед, tasm изначально не знал на сколько далек прыжок и сразу рассчитывал его как дальний и если предсказание не оказывалось ложным то он подставлял туда ближний переход, а оставшиеся байты заменял nop'ами. Fasm, за счет его много проходности, устраняет этот недостаток.
Что касается автора nasm'а (Simon Tatham), серию своих игр-головоломок, которые мне очень нравятся, он портировал на js, WebAssembly, Java. Сам автор, кстати, не гнушается использовать Windows.

> Что касается

> Что касается автора nasm'а (Simon Tatham), серию своих игр-головоломок, которые мне очень нравятся, он портировал на js, WebAssembly, Java. Сам автор, кстати, не гнушается использовать Windows.

Разрабатывать под Виндовс не значит пользоваться Виндовс! Вот, уважаемый автор сайта тоже писал под Виндовс, но это не делает его пользователем сей ОС. Так, между прочим...

> Разрабатывать

> Разрабатывать под Виндовс не значит пользоваться Виндовс!

В данном случае и разрабатывает и пользуется.

...I was also annoyed that every time I found a good game on (say) Unix, it wasn't available the next time I was sitting at a Windows machine, or vice versa; so I arranged that everything in my personal puzzle collection will happily run on both those platforms and more.
Simon Tatham's Portable Puzzle Collection

Только не подумайте, что я являюсь фанатом Windows.

admin аватар

Я тоже иногда

Я тоже иногда оказываюсь за компом с виндой — редко, но чаще, чем мне бы хотелось. И чо? :-)

Судя по тому, что этого Саймона анноит отсутствие конкретной игрушки под Unix, он не виндузятник. А что виндой явно не брезгует (в отличие, например, от меня) — ну так извращенцы всякие бывают :-)

admin аватар

За подобные

За подобные вольности авторам ассемблеров нужно руки отрывать. Ассеблер должен генерировать те инструкции, которые прописаны в исходнике, строго, и никакие иные. На то он и ассемблер, а не ЯВУ. Для условных переходов — если нет слова near, генерить short; для безусловных — если нет слова short, генерить near. Всё остальное — непрошенная самодеятельность. Хочешь "оптимальный" прыжок — не поленись написать short, если выдаст ошибку — убери слово short.

Варианты машинных команд

> Ассеблер должен генерировать те инструкции, которые прописаны в исходнике, строго, и никакие иные.

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

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

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

admin аватар

mov между двумя

mov между двумя регистрами, насколько я знаю, как раз кодируется совершенно однозначно. Несколько хуже с исполнительным адресом, в котором присутствует константа, для константы явно не указана разрядность, а сама константа умещается в один байт. Здесь, опять же, решается всё очень просто: по умолчанию используется форма машинного кода с наименьшей возможной разрядностью константы, но если её разрядность указать — то именно она и используется.

Ответ на вопрос "что плохого" очень простой: это не его собачье дело. Например, код, поданный на вход ассемблеру, может не быть написан руками, и вообще-то он может уже быть результатом работы оптимизатора — в этой ситуации самодеятельность ассемблера может только навредить; но дело, как водится, даже не в этом, а в том, что каждый должен заниматься своим делом и не делать ничего такого, о чём его не просили. Ещё раз: ассемблер — это не компилятор, это программа совершенно иного класса, если угодно, просто такой генератор образа памяти, и именно таковым он и должен быть. Оптимизация в его зону ответственности не входит.

У ассемблера

У ассемблера могут быть какие-то предпочтения по кодированию, или на платформе могут быть какие-нибудь соглашения о "каноническом" варианте кодирования инструкции, но для процессора нет разницы, как именно закодирован mov:
ndisasm movalcl

00000000  88C8              mov al,cl
00000002  8AC1              mov al,cl
admin аватар

Кстати, не знал,

Кстати, не знал, спасибо. В общем всё сходится, если сюда вот посмотреть http://www.logix.cz/michal/doc/i386/app-a.htm ; 88 -- это "mov Eb,Gb", тогда как 8A - это "mov Gb,Eb", но при этом Gb может представлять собой только регистр (байтовый), тогда как Eb -- или регистровый операнд, или "память". Соответственно между двумя регистрами можно и так и эдак.

В принципе это означает, что используемая мнемонизация неадекватна системе команд, поскольку это разные машинные команды, а мнемоники не позволяют эту разницу показать.

fasmg

Вот! А в fasmg как раз ввели новый экспериментальный синтаксис для возможности указать конкретный вариант кодирования. Но, так как, там все инструкции x86 не ассемблируются непосредственно, а заданы макросами, то для этой штуки кроме самого fasmg ещё нужны макросы, которые скачиваются отдельно. По умолчанию в дистрибутиве fasmg, вроде, этого ещё нет.

Как раз в той теме я и прочитал, что mov между регистрами неоднозначен.

В общем на tasm'е

В общем на tasm'е так и делал -- явно указывал short. Вообще borland пытался в него ООП добавить, выглядело это, правда, немного жутковато )

Power Shell

Power Shell существует уже лет 15, наверно, и гораздо удобнее, чем cmd.exe, но до командной строки в линуксе, мягко говоря, не дотягивает. Хотя, например, дополнение при помощи Ctrl-Space иногда оказывается очень удобным.

Скорость виндовых оболочек

> Power Shell существует уже лет 15, наверно, и гораздо удобнее, чем cmd.exe

Но зато медленней. Я сравнивал скорость исполнения аналогичных команд (которые делали одно и то же) в cmd и в PoSh и разница был в разы и не в пользу PoSh.

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

А ещё почему-то поиск файла по известному имени по NTFS из-под Windows оказывается медленней чем если перезагрузиться в линукс и применить find. Хотя казалось бы в Linux медленный FUSE ntfs-3g, работающий в юзерспейсе, а в винде нативная работа на уровне ядра.

< поиск файла ...

< поиск файла ... NTFS из-под Windows оказывается медленней чем если перезагрузиться в линукс >
Права доступа. Винда их чекает чуть реже, чем постоянно, а под линуксом они игнорируются - NTFS права несовместимы с никсовыми.
PoSh нифига не удобен, особенно в интерактивном сеансе. Он будто считает своим долгом сделать так, чтобы я курил онлайн-документацию при каждой попытке что-либо сделать в командной строке, и к каждой команде пририсовывал кучу мишуры только чтобы доказать, что я хочу сделать именно то, что написал. Дошло до того, что я установил WSL2 и пользуюсь башем оттуда. Удобнее значительно, хотя башем почти не владею.

PowerShell

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

А почему вы пользуетесь онлайн-документацией, если есть Get-Help?

Мне не понравились вот такие длинные названия команд через дефисы. Как будто, с Help можно сделать что-то другое, кроме как Get.

А вместо ls у них вообще Get-Child-Item Get-ChildItem... Да чем они упоролись, почему у них между первыми двумя словами дефис, а между вторыми CamelCase?

Вот когда слышу про WSL так и подмывает спросить — а зачем эмулятор с виртуалкой, если можно поставить нативно? А винду можно наоборот в виртуалку засунуть. Заодно можно запретить ей доступ на всякие левые ресурсы, чтобы рекламу на рабочий стол не могла подгружать и не обновлялась, когда не надо.

Get-Help не особо

Get-Help не особо удобен.
В Get-Help написано, что Help можно Save и Update.
Упоролись они командлетами, и эти дефисы с верблюдами как раз самая понятная и логичная (к.м.к.) часть PoSh.
Я удовольствием переселюсь на свободную ОС, если появится виртуалка, за две секунды запускающая огрызок винды, достаточный для работы прошивочных и диагностических драйверов всех г*девайсов и их же сервисного софта, и дающая винде полный доступ к указанным портам без глюков и лагов. Или когда всё это нативно появится не только под винду. Ну или когда сменю род занятий. Последнее наиболее вероятно.
Рекламу на рабстол винда не суёт. Обновляться по своему желанию уже разучилась, и загруженное обновление можно откладывать месяцами. А для перечисленных выше задач сеть ей можно вообще отрубить.

admin аватар

Не, ну с cmd-то

Не, ну с cmd-то сравнивать как-то даже нелепо, не? :-) Это как взять какой-нибудь паровой автомобиль на дровяной тяге и сравнить его с другим, от которого колёса отвалились.

Parthen аватар

>Я к тому, что

>Я к тому, что даже на маках много раз видел, как открывают терминал и в нём фигачат, но вот чтоб на винде окошко с power shell'ом открыл кто-то отличный от профессионального админа, пасущего сетку на сотню машин — не видел ни разу.
Дотнетчики таким занимаются, сам видел

admin аватар

С одной

С одной стороны, это всё-таки профессиональные программисты, а с другой — что, реально они, скажем, файлы с флешки таким способом сливают?

Знаю я одного

Знаю я одного человека, который, как вы говорите, "до полной ус$$чки" находил на мои агрументы "За" использование Linux свои контраргументы. И там фигурировали такие, что ну домохозяйки же ну не поймут как использовать. Не помню какие я ему примеры приводил, но там точно был такой: у Unix драйверва out of the box. Знаете, что он мне ответил? Говорит, мол, десятые форточки тоже. Ага, подгружая их без моего на то ведома из сети. Просто facepalm.

Уж не знаю, чем ему так Unix насолил. Но очевидно, что так на форточках и останется. После того разговора про драйвера, о Unix я решил с ним больше не говорить. Только продолжал меня подкалывать на учебной практике: "Опять ты со своим Linux. Уйдёшь -- удалю его с твоего компа".

fluorine аватар

FAQ

Вообще неплохо было бы иметь на сайте ещё и поиск как в linux.org.ru

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

Сайт же не

Сайт же не такой большой на самом деле.

Наверное, можно написать для себя программу, которая выкачивает весь сайт в файловую систему (например, парся html главной страницы, а далее рекурсивно бегая по всем ссылкам, не ведущим за пределы сайта, и составляя таким образом граф-карту сайта). Результатом будет набор HTML-страничек в папочках.

А дальше grep в руки и вперед)

admin аватар

всему вас, молодёжь, учить надо

1) откройте для себя wget -m

2) ПАПКИ — В ШКАФУ!!!

Спасибо

1) За это спасибо, не знал.

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

admin аватар

Это вам так

Это вам так кажется, а мне вот кажется, что слово "папка" в любом контексте, имеющем отношение к компьютерам, "отдаёт" ламерством.

admin аватар

Вот это не

Вот это не получится, извиняйте. Движок сайта в состоянии EOL уже лет десять по меньшей мере.

fluorine аватар

С вашей новой

С вашей новой CMS, все поменяется? :) Хотя бы с PHP-кодом Drupal больше ну будете связыватся.

Кстати вы наверное знаете такие ссылки как guestbook/archive/*#comment-* с новой страницой гостевой становятся битыми. Можно было бы именовать архивы c нуля - самая старая, и дальше...

admin аватар

Я не уверен, что

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

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

Parthen аватар

Анонс xmpp-чатика

Приглашаем всех в xmpp-чатик, созданный для взаимопомощи при проблемах, связанных с изучением программирования
xmpp:newbie_unix_prog@e2e.chat?join

Извините, а как

Извините, а как туда присоединится? Я пока зелёный, прошу не бить :)

Parthen аватар

Скачиваете

Скачиваете XMPP-клиент. (Я пользуюсь Gajim, он на питончике. Можете попробовать Psi plus, он на С++. Если нужен еще и IRC, попробуйте Pidgin). Находите себе сервер (я пользуюсь e2e.ee), там регистрируеетсь, потом авторизуйтесь в клиенте, там находите кнопочку Join Conference, вводите newbie_unix_prog@e2e.chat
И готово. Если непонятно, могу запилить инструкцию с картинками

feriman аватар

Рекомендую

Рекомендую попробовать консольный клиент irssi в связке с плагином irssi-xmpp.

Про PGP,

Про PGP, специально не рассказали, или оставили на "приятный" сюрприз?

Parthen аватар

Я им не

Я им не пользуюсь, слава OMEMO. Так что учить тому, чего не знаю, не буду.

> на "приятный"

> на "приятный" сюрприз?

Почему НА? Писал же КАК. Исправляюсь.

>слава OMEMO
Начнем с того, что не все программы его поддерживают и поддерживают хорошо, может сейчас с этим дела обстоят лучше. А PGP есть вот везде.
Те реализации программ в которых ОМЕМО идет по умолчанию грешат самодеятельностью. Вот буквально берет и само обменивается ключами с контактами. Само собой можно ключи вбить ручками, здесь философия в отсутствии понимания самой таковой возможности у ньюфагов.
Иногда такая самодеятельность выдает подобную ржомбу: https://www.linux.org.ru/forum/general/14876559

Parthen аватар

>А PGP есть вот

>А PGP есть вот везде.
Если я буду выбирать ПО по популярности, то я буду общаться из под винды на фейсбуке.

fluorine аватар

А зачем вам OMEMO,

А зачем вам OMEMO, PGP, GPG? Чатик шифруется?

я пока зеленый, прошу не бить :-)

Parthen аватар

>Чатик

>Чатик шифруется
Мне кажется бесмысленным шифровать открытую информацию, так что нет.

Вроде

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

Имя комнаты:

Имя комнаты: newbie_unix_prog
Имя сервера: e2e.chat

В зависимости от клиента это может быть два разных поля (у Gajim, что был под руками так, например)

admin аватар

Имя комнаты

именем комнаты является newbie_unix_prog@e2e.chat

UPD: хотя вообще-то чёрт разберёт, мне pidgin заявил, что это не является допустимым именем комнаты, так что хз

Возможно, у

Возможно, у вас пробелы до или после имени комнаты при копировании захватились.

admin аватар

Кстати, как ни

Кстати, как ни странно, похоже на правду — вбил всё руками и тут же всё сработало.

Тактично умолчим об умственных качествах разработчиков pidgin, не озаботившихся удалением пробельных символов из начала и конца.

В некоторых

В некоторых клиентах нужно имя и сервер писать в два отдельных поля, а собаку вообще не писать, в некоторых полностью всё имя комнаты.

admin аватар

Вы таки

Вы таки думаете, что я не в курсе, да? :-)))

Стало, кстати, интересно, с каких пор я пользуюсь джаббером. Порылся в старых архивах, обнаружил логи за 2004 год. Похоже на правду.

Parthen аватар

Странно. В

Странно. В чатике людей много, а Fairball даже с Pidgin сидит, все работает.
EDIT: попробовал сам, зашло со второй попытки.

admin аватар

Видимо, что-то

Видимо, что-то не так с моим клиентом. Ну и пёс с ним.

https://www.opennet.ru/openne

https://www.opennet.ru/opennews/art.shtml?num=56479 как показательно...

Вот вы смеетесь

Вот вы смеетесь над убогими, а они вон целый установщик системы на джавапитон переписали!
https://www.opennet.ru/opennews/art.shtml?num=56494

Господи, зачем

Господи, зачем они это делают (рукалицо)...

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

admin аватар

Вы

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

Ну и самое главное: никакого "шаманства" работа с консолью не содержит. Шаманство — это мышкой в иконки тыкать.

Установщик на макакинг-"технологиях"

установщик системы

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

admin аватар

При чём тут

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

Fedora, RHEL и CentOS можно окончательно списывать в убыток. Впрочем, для RHEL и федоры это уже давно понятно.

Fedora, RHEL и CentOS

Fedora, RHEL и CentOS можно окончательно списывать в убыток. Впрочем, для RHEL и федоры это уже давно понятно.

У меня ещё во времена моего первого знакомства с линуксом в конце 90-х, уже не помню по каким конкретным причинам, сложилось отрицательно-подозрительное отношение к дистрибутивам на основе RPM. Ну вот оно так до сих пор и держится.

admin аватар

Да ладно, вон в

Да ладно, вон в Openwall Linux тоже rpm :-) Правда, там несколько проще: репозиториев нет, ставится сразу всё, благо этого "всего" совсем немного. Но вообще, конечно, rpm'овские спеки — это какой-то ад кромешный, я под тот же Openwall делал пакеты, опыт имею.

А, простите,

А, простите, зачем там тогда rpm? Если "репозиториев нет, ставится сразу всё" и "rpm'овские спеки — это какой-то ад кромешный", то не проще ли было бы взять банальный tgz?

admin аватар

Тут на самом

Тут на самом деле не один вопрос, а два. Первый — зачем там вообще пакетный менеджер. Это как раз понятно — чтобы бардака не было, чтобы, например, версии софтин менять аккуратно, а не "по живому", чтобы деинсталлировать софтину можно было корректно. Поэтому, когда команда Openwall занималась удалённым администрением (сейчас вроде перестали, но довольно долго этим промышляли), считалось, что любую софтину нужно не просто configure/make/make install, а обязательно опакетить и rpm -Uvh.

Второй вопрос — почему именно rpm. Вот на этот вопрос ответа не знаю, решение не я принимал.

Странная

Странная какая-то новость.

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

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

Зависимости

Значит, разработчики этих систем те еще молодцы: получается, у них была зависимость не от конкретной версии библиотеки, а от последней актуальной.

Ну так во все помойках типа npm и аналогичных лежат последнии версии, вроде как. Пакетные менеджеры для скриптовых язычков - это то ещё поделие. Макаки обычно, не думая, закачивают все зависимости в свои "проекты" при деплое. Версии библиотек? Куда там. Типовой макакинг-проект - это по сути декларативное описание зависимостей. Они не подбирают библиотеки в зависимости от функционала, они, не думая, тянут последнее актуальное дерьмо из репозитория своего скриптового язычка. Это чем-то напоминает пакетные менеждеры дистрибутивов, только там всё в разы хуже. Программирующие пользователи, одним словом.

admin аватар

Вы всё ещё

Вы всё ещё верите в человечество? Прекращайте :-)

Насколько я понимаю, дело именно в том, что там толпа автоматизированных скриптов для деплоинга чего-то там (всякого разного) использовала рецепт, начинающийся с git clone --submodules или как там это называется (сам я никогда субмодули не использовал, так что не помню).

В действительности так (по аналогичному принципу) живут вообще все "экосистемы". Так что то ли ещё будет.

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

Серверные js-макаки

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

admin аватар

Гм... только мне

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

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

Организовать

  1. Организовать сплочённую группу революционно настроенных разработчиков.
  2. Внедриться под видом js-макак в сообщество web-разработки.
  3. Достичь в этом сообществе необходимых высот.
  4. Написать несколько ключевых библиотек с заранее внедрённым свойствами, которые понадобяться на заключительных шагах.
  5. Дождаться, пока эти библиотеки начнут использоваться в 70-80% веба.
  6. Сохранить в этом процессе здоровый разум и высокие моральные принципы.
  7. Внести в библиотеки необратимые изменения, рушащие всю js-инфраструктуру КЁМ.
  8. ????
  9. ПРОФИТ
Parthen аватар

>Организовать

>Организовать сплочённую группу революционно настроенных разработчиков.
Поменяйте на купить и все проблемы исчезнут

admin аватар

Ну да, все

Ну да, все исчезнут, останется одна: где взять столько денег.

admin аватар

Сохранить в

Сохранить в этом процессе здоровый разум

С этим будут проблемы. Лучше уж вечный двигатель изобретать, проще как-то.

fluorine аватар

Поганый GitHub'ик

Ещё одно подтверждение почему нельзя использовать GitHub.

В ответ на совершённые действия GitHub заблокировал доступ Марака к своим репозиториям (90 публичных + несколько приватных), а NPM откатил проблемную версию пакета. При этом законность действий GitHub вызывает вопросы, так как удаление разработчиком кода из одного из своих репозиториев не может рассматриваться как нарушение правил сервиса. Более того, в тексте лицензии на пакеты colors и faker явно обозначено отсутствие любых гарантий и обязательств в отношении работоспособности кода.

Кстати в одной статье встретил подход одного разработчика к командной работе идентичную вашей, но все равно использующей GitHub. Он предлагал использовать BitBucket, чтобы не портить репозиторий "на главном GitHub'овском" и не потерять код при отказе GitHub'а. :-P. Удивляюсь человеческому идиотизму, хотя он даже оказался умнее некоторых обезьянок ;)

Тут виноват не

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

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

admin аватар

> Тут виноват не

> Тут виноват не гитхабчик, а то, что некая организация

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

> Git - система распределенная

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

Если вас это удивляет, я вам тогда скажу, что эти ещё ничего. Есть такие люди, которые не понимают, что кнопочки на экране нарисованы и на самом деле ничего никуда не нажимается. Я реально таких людей видел. Правда, они всё-таки были не программисты :-)

Есть и те, кто

Есть и те, кто думают, что Линус Торвальдс создал GitHub

А ещё до сих пор

А ещё до сих пор существует, проводит исследования и пишет статьи International Flat Earth Research Society.

admin аватар

Если уж "можно"

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

admin аватар

А есть и те, кто

А есть и те, кто считает, что мелкомягкие купили git

У меня, кстати,

У меня, кстати, есть слабая надежда, что другие js-макаки обидятся на гитхаб за такое поведение и тоже начнут гадить в своих репах.

И не только

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

Pixel аватар

Яндекс Практикум

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

Книга Андрея Викторовича стала отличным способом погрузиться в мир программирования. В совокупности с задачником она станет прекрасным учебником. Вместе с тем, проблемы при изучении остаются. Не такие, которые помешают изучению, но замедлят его точно. Они зачастую неочевидны для тех, кто освоил профессию давно и у кого были наставники в свое время. Об этом можно много сказать, но не будем ) Часто возникают затруднения, связанные с освоением материала, задачей или нужен совет. И опыт получения обратной связи я получил, проходя бесплатную часть курса от яндекса. Сразу хочу закрыть тему и сказать, что курс не порекомендую никому - подача материала мне не понравилась, вебинары шлак, а заниматься в тренажере - это вообще боль. Дело в том, что нужно не результат правильный выдать, а написать код так же, как задумали его создатели тренажера. Речь о буквальном написании идентичного кода. Половину времени занимает подбор возможных вариантов записи чтобы удовлетворить желанию бездушной программы.

Но приятно удивила возможность задать вопрос в чат поддержки и сразу получить ответ. Работает этот сервис в любое время и быстро. Качество ответов посредственное, на той стороне не всегда внимательно читают вопрос, но это не страшно. Так вот я думаю, что для изучения учебника "Программирование: введение в профессию" идеально иметь помимо его самого, задачник, который ожидаем в ближайшее время и поддержку в виде чата с преподавателем. Пусть не круглосуточно, а хотя бы по вечерам или всю вторую половину дня и вечер без выходных.

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

fluorine аватар

Можете писать

Можете писать мне :). У меня есть сайт http://bimzhanovt.net/ , а там мой email, пишите я только рад. Правда сайт пока сырой, но, что точно, что через некоторое время там появится контент.

Вот даже змейку можно забрать для изучения git clone git://git.bimzhanovt.net/quetzalcoatl.git :D, на паскале CRT, но она не коммитилась уже как месяц и явно годится для переделки (не судите строго).

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

Могу посоветовать одного хорошего товарища, зовут его Unix. Используете его для всего, что может сделать компьютер, а он вам изо дня в день будет подавать задачки, что времени на решение всех задач уже не будет хватать. Задачник с таким другом вообще не нужен.

===

Кстати, Андрей Викторович работает ли у обычных юзеров форма контакта? По крайней мере я открыл O_o

admin аватар

Про формы

Про формы контактов -- вроде бы это настройками не запрещено, хотя можно и запретить

> Когда я

> Когда я впервые взял в руки книгу по изучению - это был ад. По причине того, что натыкался на термины и объяснения которых не понимал. Когда находил ответ на свой вопрос, то получал оплеуху, потому что мне не хватало знаний чтобы его понять.

А что, когда Вам кто-то начнет обьяснять термин "в живую", Вы его лучше поймете, чем тогда, если найдете на другом ресурсе в Интернете ответ? По-мне, так проще перелопатить Интернет, чтоб понять что-то, что не понятно. Лично я не вижу проблем с этим вообще.

> Часто возникают затруднения, связанные с освоением материала, задачей или нужен совет.

Интернет - полон советов! Серьезно!

> Качество ответов посредственное, на той стороне не всегда внимательно читают вопрос, но это не страшно.

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

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

Лично я такое не считают нужным по двум причинам. 1) Интернет - полон ответов на самые разные вопросы что в печатном, что в видео формате. 2) Программирование - это та профессия, где навык поиска и нахождения нужной информации в Интернете имеет оргомную роль. Ну это - мое мнение. Потому по-мне лучше развивать в себе это уже заблаговременно, чем получать готовый ответ в чате, а когда надо будет самому найти что-то, появятся проблемы. Кроме того, такой регулярный поиск ответов может улучшить знания английского языка, что для программирования в частности и ИТ вообще - очень важно!

admin аватар

С интернетом

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

Parthen аватар

Для этого

Для этого вообще тут давным-давно предлагали xmpp-чатик сделать, но не срослось. А имхо, но он вот прям нужен.

admin аватар

Ну, сделать

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

Parthen аватар

Из этого

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

А когда жить,

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

Parthen аватар

Ну, в моем

Ну, в моем понимании, это должна была быть автономная структура

admin аватар

Автономную

Автономную структуру можно создать без моего участия и даже без моего разрешения. Все люди вольны создавать собственные информационные ресурсы. Ну а я — см. выше :-)

Parthen аватар

Да я бы даже

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

admin аватар

Если это будет

Если это будет "комната" в xmpp, можете её анонсировать в гостевой, я анонс раскрою. Ну а придёт туда кто или не придёт — вопрос второй :)

admin аватар

Ну вот примерно

Ну вот примерно так, да :-) Точнее, в моём случае времени скорее не останется на работу, поскольку личную жизнь я всегда рассматривал как священную корову, не подлежащую "подселениям и уплотнениям" (tm). Но если отказываться от работы, надо как-то монетизировать то, что её вытеснило :-)

admin аватар

почему бы не

почему бы не сделать

И на этот вопрос есть закономерный ответ: потому что не хочу.

у вас же вроде свой jabber-сервер?

Как ни странно, нет. Другим ставил, себе так и не сподобился. А сейчас ещё и обнаружилось, что сколько-нибудь вменяемые реализации такового все discontinued, так что его и не на чем толком ставить.

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

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

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

admin аватар

У меня в своё

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

По поводу платной "поддержки" в принципе идея может быть рассмотрена. До недавнего времени я старался отвечать на вопросы, которые мне задавали по email'у (в том числе через форму на сайте), но эту лавочку (во всяком случае, бесплатную) придётся прикрыть, поскольку с ростом популярности книжки растёт и трафик, а моё время не резиновое, на всё (и на всех) его, увы, не хватит. Альтернативой может послужить некий платный сервис, если, конечно, на него будут желающие в сколько-нибудь заметном количестве.

У меня в

У меня в какой-то момент появился Спектрум. С ним в комплекте была "книжка" -- тоненькая брошюрка с описанием встроенного бейсика.

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

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

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

> платный

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

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

admin аватар

Пусть вызывает

Пусть вызывает сколько хочет, тут дело не в том, что там какую вызывает реакцию, а исключительно в том, соответствует ли что-то моим собственным принципам. Как я уже неоднократно говорил, есть ровно две вещи, которые имеют право стоить денег: материальные объекты и время, потраченное по конкретному заказу конкретного заказчика. Так что здесь всё чисто, а если кому что не понравится, то это не мои проблемы.

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

Парадигма консольных программ

Решил сравнить разные ассемблеры. Обнаружил вот такое различие:

$ nasm -g -f elf64 hello_nasm.asm; ld -n -o hello{,.o}
$ fasm hello_fasm.asm 
flat assembler  version 1.73.29  (16384 kilobytes memory, x64)
2 passes, 177 bytes.

nasm при успешной компиляции не выводит абсолютно ничего, как и ld, а fasm выводит свою версию, сколько он взял памяти, сколько проходов и какого размера получился файл.

Так вот, как вы думаете, а как правильнее? Предположим, вы сами бы писали компилятор, не важно, какого языка, как бы вы сделали?

Кроме того, это сообщение идёт на stdout, а не stderr. Куда правильнее сообщения вроде этого кидать, если это не сообщение об ошибке, по вашему?

Есть какие-то общие рекомендации, что кидать на stdout, а что на stderr? Где-то это очевидно, но бывает, что есть сомнения.

admin аватар

Правильнее --

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

Что касается stderr, то тут всё одновременно и просто, и непросто. Штатную выдачу консольной программы пользователь может захотеть перенаправить куда-нибудь и там что-то с ней сделать, в том числе в автоматическом режиме. На stderr следует сыпать всё, что предназначено для самого пользователя, даже если он перенаправил вывод. В частности, все эти версии и прочее, о чём пользователь в явном виде не просил, кидать на stdout — это уже просто совсем моветон.

Разница между DOS и Linux

А это соглашения именно из UNIX или вообще для всех консольных программ?

Вроде бы fasm был изначально написан для DOS как заменитель TASM, поскольку автору что-то там в нем не нравилось и уже позже портирован на Windows, Linux, и libc. Кстати, а DOS stderr был?

Я поискал скриншоты TASM, оказалось, что он тоже выводил свою версию, количество памяти и проходов. А потом ещё turbo link писал, что он turbo link какой-то там версии.

Выхлоп ассемблеров и компоновщиков

как правильнее? Предположим, вы сами бы писали компилятор, не важно, какого языка, как бы вы сделали?
Кроме того, это сообщение идёт на stdout, а не stderr. Куда правильнее сообщения вроде этого кидать

Вы бы сравнили ещё "стандартный" для UNIX ассемблер as.
Имя выходного объектного файла "a.out" было тупо зашито в исходниках ещё тогда, когда у UNIX и названия не было.

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

Ср., напр., 6.1 Standard I/O из двух разных редакций классической The UNIX Time-Sharing System:

более ранней ( https://people.eecs.berkeley.edu/~brewer/cs262/unix.pdf )

Programs  executed  by  the  Shell,  however,  start  off  with  two
open  files  which  have  file  descriptors  0  and  1.  As  such  a
program begins execution, file 1 is open for writing, and is 
best  understood  as  the  standard  output  file.  Except  under
circumstances  indicated  below,  this  file  is  the  user’s  typewriter.

и более поздней ( https://www.bell-labs.com/usr/dmr/www/cacm.pdf ):

Programs executed by the shell, however, start off with three open files with file descriptors 0, 1, and 2. As such a program begins execution, file 1 is open for writing, and is best understood as the standard output f
ile. Except under circumstances indicated below, this file is the user’s terminal.

as source 〉output 

causes source to be assembled, with diagnostic output going to output;

В 5-м издании perror() это ещё просто printf() заготовленного сообщения об ошибке:

perror(s)
char *s;
{
	char *c = "Unknown error";
	if(errno < sys_nerr)
		c = sys_errlist[errno];
	if(*s == '\0')
		printf("%s", c); else
		printf("%s: %s\n", s, c);
}

https://minnie.tuhs.org/cgi-bin/utree.pl?file=V5/usr/source/s4/perror.c

В 6-м perror() уже выводит сообщение в #2
https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/s5/perror.c

MS-DOS stderr

https://github.com/microsoft/MS-DOS/blob/master/v2.0/source/SYSCALL.txt#...

https://github.com/FDOS/kernel/blob/master/kernel/main.c#L409

stdin, stdout, stderr, stdaux и stdprn были в MS-DOS 2.0 для удобства портирования программ, написанных на Си для XENIX и подобных систем.
Есть они и в "современных" клонах DOS.

admin аватар

Ага, а теперь

Ага, а теперь объясните публике, при чём тут MSDOS. Точнее, попытайтесь нам растолковать, какое отношение несколько глобальных переменных, описанных в стандартной библиотеке Си, приложенной к отдельно взятому компилятору, имеют к собственно этой "системе" (скорее недосистеме).

FASM

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

FASM версии x.yz, выполняющийся на разных платформах по одинаковым исходникам, должен в идеале выдавать идентичный бинарник. Байт-в-байт. Если же среда или платформа, на коиорой выполнялся FASM, повлияла на результат многопроходной компоновки, то программисту важно знать, удастся ли его разместить в выделенных секторах дискеты или микросхемах ПЗУ.

admin аватар

В MSDOS не было

В MSDOS не было аналога stderr, какие к ещё чёрту соглашения. Мне, честно говоря, не вполне понятно, зачем вспоминать эту, как бы это выразиться, и не платформу, и не систему, а недоразумение дебильное, которое к тому же скоро тридцать лет как окончательно вымерло.

aversey аватар

Это даже не недоразумение =)

Про мелкомягкий DOS есть один прекрасный факт -- это продолжение купленной ими Наспех и Грязно сделанной Операционной Системы (Quick and Dirty Operating System) -- название как бы намекает, что создатели даже не пытались. =)

stdin/stdout

> В частности, все эти версии и прочее, о чём пользователь в явном виде не просил, кидать на stdout — это уже просто совсем моветон.

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

Но fasm по умолчанию пишет данные в выходной файл. Так важно ли, куда он пихает служебную инфу об успешной компиляции?

admin аватар

Здесь важен

Здесь важен общий принцип, точнее даже сразу два: (1) не просили говорить — молчи и (2) если программа не интерактивная, то сообщения, предзназначенные человеку — в поток диагностики.

Ошибки и ошибки

А вот ещё я странную фигню обнаружил:

Segmentation fault просачивается каким-то образом на терминал даже после &> /dev/null. Если нужно его всё равно замаскировать, помогает взятие пайпа в круглые скобки и &>/dev/null после них.

Полагаю, что дело в том, что это сообщение выводит не сама программа, а что-то другое (ядро?) и оно не идёт в её дескрипторы, ни в 1, ни в 2.

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

Но ведь у fasm это как раз штатная выдача, раз он выдаёт её всегда. Хотя я согласен, что было бы правильнее её не выдавать пока юзер не попросит с помощью флага -v, --verbose или подобного. То есть получается что он всё-таки правильно делает, что выдаёт её на stdout?

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

$ fasm hello_fasm.asm /dev/stdout 
flat assembler  version 1.73.29  (16384 kilobytes memory, x64)
ELF>x@@@8@@@��H��H��H�Ƣ@H��H��&ltH1�Hello, World!
2 passes, 177 bytes.

> В частности, все эти версии и прочее, о чём пользователь в явном виде не просил, кидать на stdout

Но ведь у компилятора стандартный вывод в штатной ситуации вообще не используется. Тогда логично как раз таки служебные сообщения компилятора отправлять всё-таки на stdout, так как именно их может понадобится фильтровать, в том числе сообщения об ошибках и проблемах в исходном коде (error и warning), а вот сообщения о проблемах именно самого компилятора — их уже на stderr, например, если не хватило памяти, файл с исходником не читается, файл с объектным кодом не пишется и... вроде всё.

Тогда и версию компилятора и прочую ерунду тоже можно отправить на stdout, если её вообще выводить, но лучше не выводить без ключика вроде -v. Может пользователь захочет многократно что-то компилировать и сравнивать время компиляции и будет как раз эту статистику использовать потом для обработки grep-ом, sed-ом и тд.

С другой стороны, если штатной выдачей компилятора считать всё-таки бинарник, то вполне возможно, что пользователь захочет отправить его на stdout для дальнейшей обработки, в таком случае правильнее вообще все сообщения пихать на stderr — и сообщения об ошибках и предупреждениях и сообщения об ошибках компилятора.

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

-----

А вообще у меня такое ощущение, что при работе с консольной программой, можно сразу отличить, была она изначально написана под Unix-подобные ОС или была перенесена с DOS / Windows. Я думаю, вы пользовались консольной версией 7zip? Вот там видно, что она была изначально для Windows. Например при нормальной успешной распаковке на stdout всё равно сыплются сообщения.

-----

А как вы считаете, должны ли все (по крайней мере, новые) консольные программы стараться использовать соглашение GNU: короткие ключи должны быть с одним дефисом и одним символом, причём под одним дефисом можно объединять несколько ключей, длинные ключи под двумя дефисами, и слова разделяются одним дефисом (e.g. --ignore-whitespaces), а -- означает терминатор ключей и дефисы в последующих аргументах игнорируются?

admin аватар

Segmentation fault

Segmentation fault просачивается

Вообще-то можно было бы догадаться, что Segmentation fault выдаёт не та программа, которая свалилась (она уже всё, свалилась, сдохла, выдать она больше уже ничего не может), а запускавший её командный интерпретатор — по итогам анализа того, что там ему выдал wait.

Но ведь у компилятора стандартный вывод в штатной ситуации вообще не используется

Значит, он должен быть пустым.

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

А это и не требуется. Зато автор точно знает, подразумевал ли он сам возможность автоматизированной обработки выдаваемой информации.

соглашение GNU:

Этим "соглашениям" намного больше лет, чем самому GNU.

Лично я "длинные" ключи (которые с двумя дефисами), по-моему, не использовал ни в одной своей программе, во всяком случае не помню за собой такого. По-моему они неудобны.

А почему вот

А почему вот такой код не компилируется?

int main()
    return 0;

Получается, что фигурные скобки вокруг тела функции — это не то же самое, что в других местах?

Иными словами, выходит, это синтаксические омонимы, как end после begin и end после record в паскале или () в инфиксном выражении и () вокруг названия типа для каста.

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

admin аватар

А почему вот

А почему вот такой код не компилируется?

Потому что язык Си так устроен

Получается, что фигурные скобки вокруг тела функции — это не то же самое, что в других местах?

Как ни странно — ни фига. Есть в Си такое понятие — составной оператор, он же блок. Так вот телом сложного оператора (цикла или ветвления) может быть любой оператор, в том числе блок, ведь это тоже оператор; а телом функции можно быть только блок.

может ли что-то быть между закрывающей круглой скобкой и открывающей фигурной в декларации функции

Рекомендую погуглить, какой синтаксис всего этого безобразия был предложен изначально (так называемый K&R C). Между прочим, прекрасно поддерживается компиляторами до сих пор.

Если синтаксис K&R проигнорировать как артефакт доисторической эпохи, то в чистом Си вроде бы между заголовком и блоком ничего быть не должно. А вот в Си++ — сколько угодно.

Но омонимия с этими злосчастными скобками вообще-то присутствует, только не там, где вы её ожидаете. В операторе switch фигурные скобки обязательны и при этом они не являются блоком — там нельзя описывать локальные переменные. UPD: тут я оказался неправ, память иногда выделывает странные штуки.

> там нельзя

> там нельзя описывать локальные переменные

У меня простыня ниже компилируется (с 2-мя предупреждениями) даже с флагами -ansi и -pedantic. Правда в case 1 переменная var будет содержать мусор, т.к. она объявлена, но до инициализации дело не дошло (из-за этого оба предупреждения). Или имелось ввиду что-то другое?

#include <stdio.h>

int main(int argc, char **argv)
{
    switch(argc) {
        int var = 42;
    case 1:
        printf("argc == %d, var == %d\n", argc, var);
        break;
    case 2:
        var = 42;
        printf("argc == %d, var == %d\n", argc, var);
        break;
    default:
	{}
    }
    return 0;
}

PS: А вот в описаниях структур и enum'ов эта омонимия точно есть :)

PSS: чертов HTML, угловые скобки даже внутри тега <pre> пропадают.

admin аватар

Да, вы правы.

Да, вы правы. Интересно, откуда я это взял.

По поводу структур и enum'ов — это ещё ладно, а вот в инициализаторах... :)

> Интересно,

> Интересно, откуда я это взял.

Возможно, это из-за того, что в switch нельзя объявлять переменные сразу после метки (вне зависимости от флагов компилятора) и если в блоке встретился хотя-бы один оператор (если использовать флаг -ansi).

    switch(argc) {
        int var;         /* можно */
    case 1:
        int var1 = 13;   /* нельзя (в любом случае) */
        puts("");
        puts(argv[0]);
        break;
    case 2:
        puts("");
        int var2 = 42;   /* нельзя (с флагом -ansi) */
        puts(argv[0]);
        puts(argv[1]);
        break;
    default:
        {}
    }

gcc для var1 выдаёт такую диагностику:

error: a label can only be part of a statement and a declaration is not a statement

на var не ругается, а вот на var2 выдаёт ошибку только с флагами -ansi -pedantic -pedantic-errors. Так что тут всё ещё интереснее :)

PS: извините за очередную простыню :D

Ну кстати это

Ну кстати это логично. Объявление переменной — это выделение памяти в секции .data

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

admin аватар

Объявление

Объявление переменной — это выделение памяти в секции .data

А вот и нет :-P

Как можно их выделить или не выделить условно?

Запросто.

    if(a < b) {
        int x;
        /* ... здесь она нужна, вот и описали ... */
    } else {
        /* ... а здесь нафиг не сдалась, вот и нету */
    }

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

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

локальные переменные в блоке

Что такое выражение возможно я понимаю, конечно. Вопрос в том как это работает?

Есть переменные в секции исполнимого файла (не обязательно .data), о них должно быть известно на этапе компиляции. Есть переменные в стеке, о них как я понимаю, тоже должно быть известно на этапе компиляции.

Вопрос — что в этом случае должен делать компилятор? Выделять место для a в любом случае, но вне блока выдавать ошибку при попытке доступа?

admin аватар

Локальные

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

Наиболее "лобовая" реализация переменных, локализованных в блоке — это при входе в блок смещать указатель стека, чтобы отвести место под локальные переменные этого блока, а при выходе — смещать его обратно. Но можно без таких "туда-сюда" обойтись, изначально выделив во фрейме подпрограммы достаточно места под любые варианты наборов локальных переменных, возникающих в сколь угодно глубоко вложенных блоках данной конкретной подпрограммы. Скажем, если в одной ветке if'а описана переменная типа int, а в другой — две переменные типа long long, то достаточно предусмотреть 16 байт, и их хватит и на ту ветку, и на другую.

Всё становится намного интереснее в Си++, где в картину могут вмешаться ещё вызовы конструкторов и деструкторов, но по-моему ваш вопрос не об этом :-)

> вызовы

> вызовы конструкторов и деструкторов

А как они могут повлиять на ситуацию? Насколько я понимаю, у объекта на протяжении всего времени жизни размер (поля самого объекта + поля предков + vmtp) не меняется.

admin аватар

Да нет, на

Да нет, на размер-то не повлияют. Просто безобидные с виду фигурные скобки благодаря конструкторам и деструкторам локальных объектов превращаются (потенциально) в целые простыни кода. И если при компиляции чистого Си я бы как минимум попытался обойтись без модификации [ER]SP на входе и выходе вложенного блока, то в программе, написанной на Си++, это может оказаться просто неактуально :-)

Чёрт,

Чёрт, процитировал комментарий, а то, что первое же слово в цитате является ключевым, не заметил. Спасибо за объяснения :)

PS: я сам некоторое время из-за опасений, что значение в esp/rsp будет "мотать туда-сюда" (особенно, в циклах) в программах на Си все переменные старался описывать в начале функций. Но потом стал догадываться, что мои опасения напрасны :)

admin аватар

Ага, теперь

Ага, теперь понятно. Мне просто никогда не приходило в голову написать что-то внутри switch, но раньше первой метки. А после меток да, начинается катавасия.

Стало

Стало интересно, откуда такое ограничение для switch-case-меток взялось и есть ли оно для goto-меток. Оказывается, после любых меток нельзя описывать переменные, причём вне зависимости от "стандарта". Видимо, варвары-стандартизаторы до этого момента не добрались.

> В тех же switch'ах я часто ветки заключал в отдельные фигурные скобки исключительно с целью описания локальных переменных

Один раз сделал то же самое, но скобки у вложенных блоков случайно оставил на том же уровне, что и закрывающая скобка у switch. Может, кстати, об этой проблеме 3-ем издании в $4.8.2 стоит упомянуть?

Размер стека

Вот вы писали, что
> после появления в Unix-системах легковесных процессов (тредов) на размер стека было наложено довольно жёсткое ограничение: 8 MB.

А что если моей программе требуется больше стека? Будет ли нормально взять системный вызов malloc и создать себе область памяти на гигабайт, скажем, а затем поместить её конец в esp?

fluorine аватар

На самом деле 8

На самом деле 8 MB хватит с головой, вон в MacOS X размер стека 512 KB. Судите сами, даже в большой программе будет не больше 10ти стековых фреймов, если пустить рекурсию на дерево высотой 20 (что уже дофига, 2^20-1~1'000'000) будет ну 30 максимум. Если не хватает, вы явно что-то неправильно делаете, всё.

UPD: как у вас malloc в системный вызов превратился :-) ?

malloc

Я просто не помню наизусть системные вызовы и привык что обычно они называются так же, как и аналогичные функции из C, поэтому и написал malloc, имея ввиду тот системный вызов, который просит у ядра дать программе новый регион памяти заданного размера. Видимо это должен быть mmap.

fluorine аватар

А их и не нужно

А их и не нужно помнить наизусть.

Вот здесь, например содержатся системные вызовы для ядра линукса версии 2.2 (их номера и параметры): https://montcs.bloomu.edu/Information/Linux/linux-system-calls.html

Или можно скачать исходные тексты ядра. Я скачал версию 2.2, оно достаточно маленькое (~150'000 строк), тогда не было 64-битных процессоров, что облегчает работу.

Пожалуй glibc тоже будет хорошим вариантом.

---

brk оказался совсем прост: вся его работа это установка конца сегмента данных своему аргументу. Т.е. вернуть можно. Главное запомнить конец сегмента данных, а потом его скормить brk.

Полез в glibc. Там оказалась глобальная переменная __curbrk, инициализированная значением 0. Так ешё в библиотеках оказалась функция sbrk, она увеличивает сегмент данных на свой аргумент.

Если её использовать со значением 0, функция вернет адрес конца сегмента данных, но и здесь нет магии, возвращается значение находящееся в __curbrk.

Если использовать её с ненулевым значением она возвращает старое значение конца сегмента данных и использует brk для работы с кучей.

Обе можно и самому на асме да написать. Ещё как я понял придётся самому создавать таблицы свободной и занятой памяти и как-то хитро с ними работать.

---

Заголовок mmap меня, что-то пугает...

---

Кстати, какие спецификации по Unix'ам лучше читать. SUS и POSIX только мозги искалечат, нет?

А их и не нужно

А их и не нужно помнить наизусть.

Вот здесь, например содержатся системные вызовы для ядра линукса версии 2.2 (их номера и параметры): https://montcs.bloomu.edu/Information/Linux/linux-system-calls.html

Или можно скачать исходные тексты ядра.

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

ls /usr/share/man/man2
fluorine аватар

UPD: пардон, вы

UPD: пардон, вы про список системных вызовов, а я же давал информацию про то как попробовать системные вызовы на асме. Топикстартера ведь интересовала информация, как нужно выделять 1GB памяти под стек. Пусть разбирается с mmap следуя моим подсказкам :^)

admin аватар

Сейчас его,

Сейчас его, чувствую, плохому таки научат.

fluorine аватар

Ага, щас. Эти

Ага, щас. Эти системные вызовы у человека скорее всего будут для 64-битной ОС. А номера системных вызовов для 64-битной и 32-битной систем (асм в 1томе, ведь для 32-битной ОС, верно?) различаются (1), и в этих ваших манах не расписываются значения номеров (2) и констант (3) их-то ученику и придется для программирования на асме да раздобыть.

Номера системных вызовов я беру из ссылки выше, а константы grep'аю либо из /usr/include, либо из исходных текстов ядра версии 2.2.

Но man'ы конечно не помешают, как и исходники glibc (предпочтительнее, конечно версия постарее, так как она будет меньшего размера, чем более новые), чтобы понимать как эти системные вызовы работают (a), как их следовало бы реализовать самому (б).

Если у ученика не линукс (скажем BSD), процедура впринципе будет скорее всего такая же.

admin аватар

Читайте man :-)

Читайте man :-) Комитетские поделья слишком уверены в собственной непогрешимости, а в man'ах бывает даже сравнительный анализ разных спецификаций.

admin аватар

Если это будет

Если это будет BSD-система, то mmap, если Linux — то brk (но для вашей задачи увеличения стека brk не слишком подходит, как ни странно). Разница между malloc и теми системными вызовами, через которые она реализована — это, я бы сказал, штука фундаментальная, настоятельно рекомендую разобраться. Это тот самый случай, когда игнорировать детали недопустимо.

Память

Я так понимаю, что разница в том, что malloc/free хранят список свободных и занятых регионов памяти и если свободных достаточно, то системный вызов не совершается, а память выделяется из уже использованной и потом освобождённой. А системный вызов позволяет только взять регион памяти, но не позволяет его отдать.

Если не brk, то какой? У меня всё-таки линукс.

admin аватар

Ну почти

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

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

А системный вызов позволяет только взять регион памяти, но не позволяет его отдать.

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

Если не brk, то какой? У меня всё-таки линукс.

mmap, больше никаких нет. Просто в BSD-системах brk извели под корень, там только mmap и остался, а в линуксе они оба по-прежнему есть и активно используются.

Иной вопрос, что в контексте нашего обсуждения (как подменить стек, чтоб он стал побольше) правильный ответ — «никакой», причём вне зависимости от используемой системы.

Просто в

Просто в BSD-системах brk извели под корень, там только mmap и остался

В OpenBSD есть brk(2). Правда, не знаю, насколько активно он тут используется, но, по крайней мере, присутствует.

admin аватар

а что покажет

а что покажет truss, если его натравить на программу, активно работающую с динамической памятью?

вдогонку

Собственно, OpenBSD'шный код malloc вот тут: https://cvsweb.openbsd.org/src/lib/libc/stdlib/malloc.c?rev=1.272&conten...

И, насколько я вижу, вызовов brk (в отличие от mmap) там действительно нет. В какой степени это отвечает на вопрос об "изведении под корень brk"?

admin аватар

Вполне

Вполне отвечает. brk в BSD-системах почему-то сильно не в почёте.

Дык нету такой

Дык нету такой утилиты в OpenBSD. Не говоря уже о том, что я, честно говоря, ненастоящий сварщик системный программист. Но если разобъясните, то готов попробовать, самому интересно.

ktrace(1) подойдёт?

на программу, активно работающую с динамической памятью?

Это, например, какая? Может просто чучелко изобразить, которое будет malloc -> sleep -> free делать в цикле?

admin аватар

ktrace не

ktrace не пробовал, не знаю. Про чучелко -- такое не будет к системе обращаться, зачем ему, оно будет одну и ту же (от системы давно полученную) память помечать как занятую, потом снова как свободную. Хотя если то же самое, но без free и без sleep :-) -- ну то есть тупо malloc в цикле -- то да, подойдёт.

fluorine аватар

И блоки эти

И блоки эти кратны страницам, потому что система по-другому не умеет.

Разве нельзя некратными странице (4 kB) размерами спрашивать? Вроде позволяет.

А в конце стоит отдавать всю запрошенную память с помощью brk или система сама справится?

admin аватар

Разве нельзя

Разве нельзя некратными странице

mmap не позволяет, про brk не помню

А в конце стоит отдавать всю запрошенную память

зачем?! чтобы лишний раз прыгнуть в ядро и обратно? Тут просто нужно чуть-чуть здравого смысла: а куда денется память, если при окончании процесса система её не вернёт себе?

(ну хотя... увы, объекты ядра, порождаемые процессами, но остающиеся в ядре, если их не грохнуть в явном виде, таки существуют, чёрт бы побрал тех, кто придумал System V IPC; но это вроде единственное исключение из общего правила, и крайне мерзкое).

Вы уверены?

> mmap не позволяет, про brk не помню.

По меньшей мере на Linux 5.9 mmap позволяет просить блоки некратного размера.

admin аватар

Сейчас сложно в

Сейчас сложно в чём-то быть уверенным, к сожалению. Но вообще все спецификации mmap, которые я видел, упоминают системный вызов getpagesize и/или значение sysconf(_SC_PAGESIZE).

admin аватар

Господи, ну

Господи, ну malloc-то зачем? Вы же не собираетесь потом этот кусок памяти возвращать в кучу? Тот самый случай, когда правильнее вызвать напрямую mmap, если уж совсем припёрло. А ещё нужно будет озаботиться, чтобы та функция, в которой вы всё это непотребство провернули, никогда не пошла дальше и никогда не вернула управление.

Хотя правильнее тут скорее провести с самим собой сеанс психотерапии. Ну, например, ответить самому себе на вопросы, а почему не хватает стека? а почему 8MB не хватает, а 1GB точно хватит? а не жирно ли 1GB? а по каким таким причинам тянет на всё большое, может причина не в программах? и, может быть, компенсировать собственные комплексы как-то по-другому, ну там купить себе джип побольше и пострашнее?

Если серьёзно, то не должно такого быть, чтобы стека не хватило. Если его не хватает — вы просто делаете что-то не то.

Non-ASCII в документации

А как вы думаете, насколько приемлемо использование не-ASCII символов в документации? Причём, так как документация, которую я видел, была на английском языке, эти символы использовались только для рисования таблиц с красивыми рамочками. Думаю, что даже если бы они отобразились кракозябрами, таблицы остались бы читаемыми, но у меня без всякой настройки сразу отобразились именно рамочки.

admin аватар

Документация

Документация — это текст на естественном языке. Не вижу проблем, документация вообще не обязана быть просто текстом, она может быть в другом формате. Хотя, конечно, те же RFC обходятся чистым текстом и алфавитом ASCII, и это правильно.

Целевая аудитория

Доброго времени суток.
Как я понял, Ваши книги предназначаены для правильного формирования мышления и действительно нужным навыкам true-программиста. А есть ли какие-либо рекомендации тем, кто программистом быть не собирается, но по работе требуют знания SQL или питон? Они вряд ли хотят тратить своё время на Паскаль, ассемблер, итд по списку.

fluorine аватар

Думая и т.д.

Думая и т.д. можно закончить на изучении Си и устройства ОС. Получается не очень-то и долго: 1-1.5 года плотного изучения при наличии желания.

А "непрограммисту" Си++ с лиспами и не нужен. На выходе он/она сможет SQL и Python за 2 вечера с документацией и узучить.

admin аватар

Что-то я

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

SQL

SQL — это не язык программирования, это язык запросов.
Изначально он предназначался не для программистов, а для пользователей базы данных. Если требуется прямо отличное его знание с пониманием нюансов разных СУБД — это странно.

А Python — ну если его требуют, значит им требуется программист всё-таки, верно? А тогда и образование должно быть соответствующее.

И ещё вопрос какой уровень знания Python вообще требуется. Если просто прочитать готовые скрипты и изредка что-то поправить — это одно, а если прямо писать новый код на этом языке — другое.

Вспоминается

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

admin аватар

Язык запросов, говорите?

А знаете, что бывает, когда "почтипрограммист" хватается за SQL?

update Members u
inner join
(select tu.member_id, SUM(COALESCE(tu.teammember_score, 0.00)) as score,
        SUM(COALESCE(tu.teammember_score, 0.00) * POW(0.9, $maxRaidId
        - d.raid_id
        - (select count(*)
                from RaidDevelopers rd
                where rd.raiddeveloper_hide = 0
                        and rd.raid_id > d.raid_id
                        and rd.member_id = tu.member_id
        ))) as sc7,
        SUM(COALESCE(tu.teammember_score, 0.00) * POW(0.9, $maxRaidId
        - d.raid_id)) as sc7old
from TeamMembers tu
        inner join Teams t
        on tu.team_id = t.team_id
        inner join Distances d
        on t.distance_id = d.distance_id
        left outer join
        (
        select tld.teammember_id, MIN(lp.levelpoint_order) as minorder
        from TeamLevelDismiss tld
                inner join LevelPoints lp
                on tld.levelpoint_id = lp.levelpoint_id
         group by tld.teammember_id
        ) c
        on tu.teammember_id = c.teammember_id
where d.distance_hide = 0
       and tu.teammember_hide = 0
       and t.team_hide = 0
       and COALESCE(t.team_outofrange, 0) = 0
       and COALESCE(t.team_result, '00:00:00') > '00:00:00'
       and COALESCE(t.team_minlevelpointorderwitherror, 0) = 0
       and COALESCE(c.minorder, 0) = 0
       and d.raid_id <= $maxRaidId
group by tu.member_id
) a
on a.member_id = u.member_id
SET u.member_score = a.score, u.member_sc7 = a.sc7, u.member_sc7old = a.sc7old

В оригинальном тексте это ещё было завёрнуто в строковый литерал на втором уровне вложенности в perl-скрипте, так что добавьте мысленно, во-первых, две табуляции в начало каждой строки, и во-вторых то, что сверху и снизу (на перле). К сожалению, я целиком скрипт не видел, только этот фрагмент. Человек, который это цитировал (насколько я понимаю, как раз вполне программист), собственно говоря, показал сей запрос, чтобы объяснить, почему они там всё никак не могут отразить в коде маааааахонькое изменение правил подсчёта этого вот пресловутого score. "Попробуйте сами там что-нибудь поменять и не сломать".

Я это к тому, что программирование надо изучать всерьёз — или не трогать совсем. А SQL — это тоже программирование, только намного хуже.

SQL — это тоже

SQL — это тоже программирование
Андрей Викторович, а почему Путон -- это скриптинг, а SQL -- программирование?

admin аватар

Во-первых, если

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

Во-вторых, SQL, конечно, не программирование. Я же говорю — "хуже". Можно даже сказать так: если запросы на SQL превратить в программирование, как это часто делают (и как это сделано в примере выше), получается полная хрень. Скрипты, впрочем, тоже программы, только маленькие. А скриптинг — ну да, тоже программирование, только хуже.

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

И, кстати, в интернете сайтов всяких дофига, чего обязательно сюда-то припираться?

на этом

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

feriman аватар

Заметка

Заметка майнтейнера Portage и вообще поддержки Python в дистрибутиве Gentoo: The future of Python build systems and Gentoo.

Небольшая цитата из заметки:
Unfortunately, this is all happening without much of a concern for backwards compatibility or feature parity. The Python developers are focused on building their own packaging infrastructure and have no interest in providing a single good workflow for distribution packagers. It is really unfortunate given that many of them rely on our work to build the environments they use to work.

fluorine аватар

Интересная

Интересная картинка оттуда, не одни мы не любим стандарты :^)

https://imgs.xkcd.com/comics/standards.png

admin аватар

Как раз эта

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

admin аватар

Питонисты на

Питонисты на лапах разносят заразу.
Питониста увидев, уволь его сразу.

В "уволь" всего

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

admin аватар

Да как бы

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

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

Макакинг, бессмысленный и беспощадный

Если пишут, значит им так удобно?

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

конечный пользователь разницы не замечает

Это при том, что питоноподелка несовместима между своими версиями) Я уже молчу про то, что она может быть вообше не установлена в системе.

Parthen аватар

Мда

Я эту вещь объяснял своему однокласснику в третьем классе, когда он получил двойку по русскому.
Есть простая и понятная концепция человеко-часов. Нельзя для экономии получеловекочаса создателя тратить человекогоды потребителей. Это и есть причина, почему существует вообще в языках правила, почему писать всегда сложнее, чем читать.
Если посчитать, сколько времени пользователей потратили "программисты" на Питоне, то это тянет на натуральный геноцид.

Кража времени пользователей

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

Создатели systemd в этом плане догнали и перегнали питоняш.

admin аватар

Если пишут,

Если пишут, значит им так удобно?

Разумеется, ничего не знать, ничего не уметь, но при этом всерьёз мнить себя программистом — это удобно.

И конечный пользователь разницы не замечает.

Это тебе, макака позорная, кто такую чушь сказал? В действительности любая зависимость времени исполнения — откровенное хамство в отношении не только конечных пользователей, но и майнтейнеров. А уж зависимость программы от всей экосистемы этого вонючего питона — это за гранью добра и зла; всех питонистов, считающих возможным свои недопрограммы кому бы то ни было передавать, следует лишить права профессиональной деятельности в области IT, причём пожизненно. Вред, который вся эта недоученная мразота наносит цивилизации, я даже затрудняюсь оценить, но это, пожалуй, ещё хуже, чем всякие форточки и прочая проприетарщина.

Главное же получать удовольствие от процесса

А давай я тебя пристрелю? Не представляешь, какое я от этого получу удовольствие.

ведь всех нас объединяет

Лично меня с питономакаками не объединяет ничего. Вообще. И вон с моего сайта, мразь.

fluorine аватар

С обезьянами

С обезьянами общатся просто бесмысслено общатся, такое ощущение будто в черепной коробке ничего и нет, все аргументы заходят в одно ухо, а выходят из другого. Остаётся только отстреливать, что греха таить.

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

Системное ПО на языке с GC (docker), это как будто первоапрельская штука, а ведь реально существует и не сон!

Docker

Системное ПО на языке с GC (docker), это как будто первоапрельская штука, а ведь реально существует и не сон!

На этом Goвне в последнее время стало появляться что-то слишком много "софта". PHP-макаки активно мигрируют на этот, т.н. "стек" со всеми вытекающмими, как говорится.
А docker этот - это вообще лакмусовая бумажка состояния "современной" IT-"индустрии".

На этом Goвне в

На этом Goвне в последнее время стало появляться что-то слишком много "софта".

Вообще говоря, если те, кто пишут "софт" на том же, например, Python, перейдут на Go, то я, как пользователь и майнтейнер этого "софта", буду только рад. Как язык мне Go совершенно не нравится, сам я на нём писать не буду и другим не посоветую. Но вот изначально заданное в Go'шной инфраструктуре стремление к минимуму зависимостей у откомпилированной программы совершенно правильное.

PS. Ну а сама идея доскера и подобного -- это, конечно, позор индустрии, на каком бы языке оно не было написано.

admin аватар

Данная

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

Parthen аватар

Если от вас

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

admin аватар

Конечно, есть:

Конечно, есть: немедленно сменить работу. И свой мозг целее будет, и окружающему миру вреда не нанесёте.

Длинные команды

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


a=1 b=1000000; while ((c=(a+b)/2,b-a>1)); do seq $c | ./foo &>/dev/null && a=$c || b=$c; done; echo $a $b

Вопрос. Вот вы говорите, что больше 80 символов в одну строку лепить нельзя, а эта команда длиной чуть более 100 символов.

При этом, лично меня эта команда устраивает. Да, терминал её переносит на вторую строку, но это не мешает мне её читать и редактировать. Но всё-таки, а как бы вы решили такую задачу, какой командой и что бы с ней сделали, чтобы она влезла в 80 символов?

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

admin аватар

А вы хранение

А вы хранение ЭТОГО готовы доверить файлу .bash_history? А не стрёмно? А ну как потеряется, не задолбаетесь воспроизводить?

Если же хранить, как положено, в файле, то получается

a=1
b=1000000
while ((c=(a+b)/2,b-a>1)); do
    seq $c | ./foo &>/dev/null && a=$c || b=$c
done
echo $a $b

И это я ещё не начал ваши нагромождения выражений расписывать по-человечески.

Файл даже скриптом объявлять не обязательно и бит x навешивать, достаточно его "втянуть" через точку:

  . mycmd.sh

А теперь как это должно выглядеть на самом деле:

a=1
b=1000000
while true; do
  c=$(( (a+b)/2 ))
  [ $b -le $a ] && break
  if seq $c | ./foo &>/dev/null ; then
      a=$c
  else
      b=$c
  fi
done
echo $a $b

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

Файл даже

Файл даже скриптом объявлять не обязательно и бит x навешивать, достаточно его "втянуть" через точку:

  . mycmd.sh

Данный конкретный "скрипт", раз уж он всё равно в отдельном файлике, лучше всё же, наверное, запускать через sh (ну или там bash):

sh mycmd.sh

Для этого тоже не нужно объявлять его скриптом и навешивать бит выполнения.

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

admin аватар

Да пофиг,

Да пофиг, допустимо и то и то, надо только помнить про разницу между ними. Например, набор функций и alias'ов нужно именно "втягивать" (хотя этого вашего "доступа к кишкам" при этом вроде не надо), или если хочется, чтобы задействованные в псевдоскрипте переменные остались в доступе. С другой стороны, если получилось достаточно развесисто и хочется, наоборот, среду исполнения ЭТОГО хотя бы чуть-чуть изолировать — то да, sh вполне правилен. Но тогда уже даже я, несмотря на свои вредные советы, сделал бы нормальный скрипт :-)

Скрипты

> А ну как потеряется, не задолбаетесь воспроизводить?

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

Да и скрипт придётся писать параметрический, например ./foo надо будет заменить на "$1", и конкретные начальные значения a и b тоже надо задавать через командную строку. Да и именно seq я не всегда использую. Параметрический скрипт уже требует больше усилий, чем одноразовая команда, делающая то же самое.

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

Хотя может и оформлю в скрипт... потом как-нибудь.

admin аватар

Вот что за бред

Вот что за бред я только что прочитал?!

Вспоминать имя файла я наверное буду не намного меньше времени.

Это означает, что у вас бардак в файловой системе.

Да и скрипт

А вы это не рассматривайте как скрипт, считайте это просто текстовым файлом, в котором записана команда, чтобы её не забыть.

придётся писать параметрический

"Придётся"? Мне всегда в таких случаях хочется спросить: "а не то — что?"

./foo надо будет

Кому "надо"? Вот вам лично — надо? По-моему прямо сейчас — не надо, а потом всегда успеете, файлик на полэкрана поправить несложно. В смысле, вот когда понадобится, тогда и сделаете.

Не факт, что написать скрипт один раз

А вы не пишите скрипт. Пишите ту же самую одноразовую команду, просто сделайте это не в командной строке (что неудобно, блинский фиг, ну неудобно же!!!), а в текстовом редакторе.

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

Вообще-то её и в командной строке можно записать в несколько строчек, делать one-liner никто не заставляет, а обратный слэш перед enter'ом никто не отменял (хотя он тут в большинстве случаев не нужен, shell умный, незаконченные конструкции он сам предложит закончить). Иной вопрос, что в редакторе это делать заведомо и многократно удобнее.

Вообще, тут можно сказать совершенно определённо: если вы считаете, что сочинить зверский нечитаемый oneliner, пользуясь для этого только возможностями Readline, по каким бы то ни было причинам и в какой бы то ни было ситуации может быть проще, быстрее или в каком-либо ещё смысле лучше, нежели записать тот же набор команд в текстовом редакторе — то вы заблуждаетесь. Точка.

fluorine аватар

Вообще-то её и в

Вообще-то её и в командной строке можно записать в несколько строчек, делать one-liner никто не заставляет

Можно же даже проще, нажать C-X C-E откроется $EDITOR, после этого файл по желанию сохранить. Часто бывает удобно, чтобы переделывать скрипты из интернета.

А вы это не

А вы это не рассматривайте как скрипт, считайте это просто текстовым файлом, в котором записана команда, чтобы её не забыть.

Кому "надо"? Вот вам лично — надо? По-моему прямо сейчас — не надо, а потом всегда успеете, файлик на полэкрана поправить несложно. В смысле, вот когда понадобится, тогда и сделаете.

А вы не пишите скрипт. Пишите ту же самую одноразовую команду, просто сделайте это не в командной строке (что неудобно, блинский фиг, ну неудобно же!!!), а в текстовом редакторе.

Кстати, спасибо!

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

Ваши слова помогают взглянуть на проблему под другим углом и немного "расслабиться" что ли. Заведу, пожалуй, прямо сейчас директорию ~/scripts и буду туда скидывать такие файлики (а для нормально оформленных скриптов и прочих выполнимых файлов у меня есть ~/bin, который добавлен в PATH).

admin аватар

Между прочим,

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

myfunction() {
  echo this $1 is $2 function $3 not $4 a $5 script
}

У меня толпа таких функций живёт в ~/.bash_profile :-) Ну, типа, где alias'а не хватает из-за отсутствия у него параметров, можно вот такое вот задействовать. Потом файлик "всосать" в текущий shell с помощью всё той же точки, и названия функций будут даже автодополняться, что тоже не так чтоб неважно.

Когда я пишу на

Когда я пишу на паскале, read и write спокойно читают и пишут переменные любого типа, в частности Byte, Integer, LongInt, Int64 и тд.

Но в языке C нужно дублировать размер типа данных в вызове printf/scanf в форматной строке и в описании переменной.

Но в форматной строке я вижу для целых только %d и производные %ld, %lld и так далее. Но в C кроме обычных char, short, int, long и long long ещё есть специальные типы из stdint.h, имеющие фиксированный размер и наоборот переменный размер, например int64_t и uintptr_t. С одной стороны, для многих задач это удобнее, например если вы парсите файл или сетевой протокол. С другой, эти типы получается невозможно нормально напечатать через printf или я чего-то не знаю?

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

admin аватар

Слушайте, как

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

Ну а stdint.h — это, как и всякий комитетский бастард, сущность дебильная, рушащая концептуальную целостность Си.

stdint.h

> Приходится ей рассказывать.

Это-то как раз всё понятно, хотя gcc вон ругается, если применить не тот тип в форматной строке. Я просто хотел сказать, что по этой причине простые программы с вводом-выводом на паскале приятнее писать чем на C, если не требуется лезть в дебри системы.

> Ну а stdint.h — это, как и всякий комитетский бастард, сущность дебильная, рушащая концептуальную целостность Си.

Предлагаете каждый раз писать какие-нибудь хитрые макросы, если нужен фиксированный тип данных? Например разбор файлов известных форматов.

Ещё могут быть нужны типы данных вроде целого, которое занимает 4 байта на 32-битной системе и 8 байт на 64-битной.

Так что, писать макросы или всё-таки подключать stdint.h допустимо?

в идеале конечно в языке должно быть столько же форматных спецификаторов, сколько и типов данных.

admin аватар

Предлагаете

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

Зачем хитрые макросы, просто ввести те же typedef'ы в соответствии с потребностями решаемой задачи. А когда потребуется перенос на другие платформы, добавить #ifdef'ы. Собственно, stdint.h именно это и делает, только он никак не сообразуется с потребностями задачи.

Ещё могут быть нужны типы данных вроде целого, которое занимает 4 байта на 32-битной системе и 8 байт на 64-битной.

Он есть и называется long. Если найдёте компилятор, на котором long ведёт себя как-то иначе — расскажите мне.

или всё-таки подключать stdint.h допустимо?

Смотря с какой точки зрения "допустимо".

в идеале конечно в языке должно быть столько же форматных спецификаторов, сколько и типов данных.

В языке, ещё раз подчёркиваю, нет и не может быть (и не должно быть) ни одного форматного спецификатора. Что до библиотечных функций форматированного вывода, то в них как раз столько спецификаторов, чтобы поддержать все типы данных, какие ЕСТЬ в языке. Те типы (точнее, typedef'ы), которые вводятся в stdint.h, в язык не входят.

Макросы

> Он есть и называется long. Если найдёте компилятор, на котором long ведёт себя как-то иначе — расскажите мне.

Тогда нужно в файл вставить что-то вроде:
assert(sizeof(long)==sizeof(void*));

Подобная штука, которая бы вычислялась при компиляции и прерывала её, если что-то не сходится, в Си есть?

> чтобы поддержать все типы данных, какие ЕСТЬ в языке

А вот со 128-битными целыми не работает. Как объявить такую переменную я нашел, но присвоить ей значение напрямую не выходит, приходится это делать умножением двух чисел, которые влезают в int64, вывести на stdout тоже не получается за один раз, приходится городить конструкцию из двух или даже трёх спецификаторов, чтобы вывести по кусочкам.

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

admin аватар

Тогда нужно в

Тогда нужно в файл вставить что-то вроде:

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

Подобная штука, которая бы вычислялась при компиляции и прерывала её, если что-то не сходится, в Си есть?

Нет и не надо. В библиотеках — есть, но это совершенно другое.

А вот со 128-битными целыми не работает.

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

что если городить макросы для переименования типов

Вынужден повторить ещё раз: макросы тут ни при чём от слова совсем. И такой вещи, как "переименование типа", в Си нет. Есть директива typedef, которая не имеет отношения ни к макросам, ни к ПЕРЕименованиям.

придётся ещё делать парные макросы

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

В реальных задачах обычно можно из общих соображений прикинуть, какова будет разрядность нужного числа — точнее, какого из встроенных целых хватит для его размещения. Соответственно преобразовать, чтобы компилятор с ума не сходил, и печатать. Придуманная вами проблема высосана из пальца.

Есть, но не надо

>> Подобная штука, которая бы вычислялась при компиляции и прерывала её, если что-то не сходится, в Си есть?

> Нет и не надо. В библиотеках — есть, но это совершенно другое.

Вообще-то есть трюк (это же Си!) для "сильных духом":

static char assert_long_size_is_pointer_size[sizeof(long) == sizeof(void *)];

128 бит

> На всех существующих компиляторах разрядности типа long достаточно для преобразования в него адресов без потери информации.

Мне требуется, чтобы было точно равно, не больше и не меньше. Кроме того, у MSVC таки long даже на 64-битной платформе 32 бита. Конечно можно сказать "просто не используйте этот компилятор", но по-моему лучше, чтобы компиляция сразу падала с ошибкой, что сразу подскажет тому кто возьмётся за MSVC, что это была плохая идея, чем чтобы программа молча давала неправильные результаты.

> Никаких 128-битных в Си нет, никогда не было и я очень надеюсь, что никогда не будет.

#include <stdio.h>

int main() {
	__uint128_t i, dec=10000000000000000000u;
	long double j;
	i  =  80000000000000000;
	i *= 100000000000000000;
	j  = 8000000000000000000000000000000000;
	printf("double1=%Lf\n", j);
	j  = i;
	printf("double2=%Lf\n", j);
	printf("integer=%llu%019llu\n", i/dec, i%dec);
	return 0;
}

Вот эксперимент по использованию 128-битных целых. Судя по всему, каким-то образом это работает, хотя литерал такой длины не компилируется и приходится формировать число в два этапа. Кстати это компилируется и в gcc и в clang, хотя в последнем нужно небольшое исправление.

> Нет и не надо. В библиотеках — есть, но это совершенно другое.

Так библиотечная возможность по идее на этапе компиляции не должна работать?

fluorine аватар

Вам реально 16

Вам реально 16 байтные целые нужны? Может ещё и на килобайт тоже? А что вдруг кому-то захочется нужно же непременно ввести.

При виде 128 битного целого, создателя этой штуки захотелось изолировать от общества.

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

Где вы 128 битное целое видели, под капотом у железа?

Конечно ваш пассаж про то, что printf является частью языка дал понять, что книга в вас толком и не влезла, не рано ли за Си взялись?

admin аватар

В принципе они

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

admin аватар

И что? Вы ещё

И что? Вы ещё скажите, что в Си есть вложенные функции (ну а что, gcc же допускает). А MSVC вообще не Си, он не умеет чистый Си, только C++.

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

Благодарность

Андрей Викторович, спасибо Вам за ваши изумительные книги!
(просто +1 к числу благодарных читателей)

tvldslv аватар

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

Доброго времени суток. В этом учебном году сдаю ЕГЭ. Лет так с 13-14 хотел на ФИИТ МГУ, но, видя проходные баллы, понимаю: задача поступления весьма сложна. Даже пробники ЕГЭ: математика - 87б., информатика - 100б., русский язык - 60б. не особо внушают уверенность. Прекрасно понимаю, что в родном Новосибирске пройду на бюджет любого НГТУ и ему подобного что называется, со свистом. Хотел бы узнать ваше мнение, стоит ли оно того - пытаться пройти на данный факультет, может быть год - два подряд, каждый раз пересдавая ЕГЭ, или расслабиться и сосредоточиться на самообразовании? Недавно закончил изучать ваше "Введение в профессию" и чувствую, что самообразование - штука весьма прикольная и гораздо более интересная, чем выслушивание преподавателя в УЗ

admin аватар

Тут вопрос, что

Тут вопрос, что вы теряете от попытки. Вроде подаваться одновременно в разные места никто не запрещает.

Хотя, конечно, на ФИИТ поступать не надо, поступайте на основное отделение, и потом постарайтесь не попасть на первый поток — там из вас обезьяну делать будут.

Тем не менее

Тем не менее обезьяну из вас сделать попытаются в любом случае на старших курсах ВМК.
Нам уже второй год семья Березиных читает курс по .NET. На третьем курсе они нас учили рисовать окошки и программировать мышкой под Windows Presentation Foundation.
Сейчас (на 4-м курсе) мы программируем в браузере на JavaScript. При этом в кажом семестре для зачёта нужно сдать 3-5 домашних заданий.
Самое удивительное, что зам.декана по учебной работе пытается выдать этот курс как преимущество своей кафедры и при этом в самом деле считает, что ВМК готовит <<научную элиту>>, а не <<быдлокодеров>> (как он сам выразился).

А им никто не

А им никто не пробовал говорить, что изучать микрософтовские "технологии" бесполезно? Даже если забить на всё СПО и то что оно не работает под линуксом и BSD.

Вот представьте что вы учились на 4-м курсе лет 10 назад и изучали там Silverlight. Изучили, достигли мастерства, знаете каждый класс и метод, написали помимо лабораторок несколько полезных/интересных приложений.

А если вы учились 5 лет назад и была там разработка под Windows Phone — новую "перспективную" мобильную платформу от самой великой Microsoft?

Вот сейчас вы изучаете WPF, а сможетеле ли вы через 5-10 лет хотя бы просто запустить программу на этой фигне на актуальной на тот момент версии Windows? Далеко не факт.

А вот программы, написанные на C даже 30 лет назад до сих пор работают.

Написанное на Turbo Pascal 25 лет назад — думаю под FPC скомпилируется без проблем.

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

admin аватар

Слушайте, ну

Слушайте, ну что вы тут как вчера на свет родились? Разумеется, "пробовали". Больше того, вы предисловия к моему первому тому видели? Вот эти люди тоже видели, смею вас заверить. Прочитали или нет — вопрос второй. Но "краткое содержание" заведомо известно всему факультету.

11 лет назад я пытался объяснить, по какой причине нельзя переводить первый курс на Си. Я не услышал ни одного возражения по существу. Вообще. Никто даже не попытался ничего возразить на мои аргументы. И кончилось всё примерно так, как я и говорил. И они, тем не менее, продолжают на этом пресловутом первом потоке уродовать мозги первокурсникам.

Понимаете, это так не работает. Чтобы остановить очередной маразм, совершенно никак не достаточно привести аргументы. Их просто проигнорируют.

admin аватар

Во-первых,

Во-первых, кафедру надо выбирать :-) Между прочим, вы удивитесь, если узнаете, какое количество ваших однокурсников считает, что лучше уж изучать JavaScript, чем Лисп и Пролог; так что тут каждому своё.

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

Parthen аватар

Чет мне

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

Прикладная математика

Прикладная математика, например. И математике худо-бедно научат, и программирование не сильно трогают.

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

Parthen аватар

Не знал,

Не знал, спасибо.
Я вообще почему на нее внимание обратил -- там написано "математика" и проходные баллы сильно поменьше чем на распиаренную прикладную математику и информатику

admin аватар

Вполне вариант.

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

Но вот если рассматривать как вариант специальность инженерную (любую), то тогда уж лучше "программистская", не так противно будет.

Добрый день.

Является ли побочным эффектом передача var-параметра в процедуру?
Ну например, мы поработали с переменной в главной части программы, потом передаем эту переменную как var-параметр в процедуру, в процедуре мы делаем множество вещей с этим параметром, в том числе и: write, read и т.д. Потом после этого мы используем этот var-параметр в главной части. Будет ли считаться такое действия за побочный эффект?

fluorine аватар

Попробую

Попробую объяснить.

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

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

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

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

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

Прекрасный пример это ReadKey из модуля CRT. На странице 371, 1 тома показано как её изолировали в процедуру GetKey. GetKey в разы удобнее пользоваться нежели ReadKey, ведь при использовании ReadKey каждый раз при желании обработать пользовательский ввод мы должны помнить, что она может вернуть доп. код и её обязательно нужно вызвать второй раз.

Посмотрите на замечательный кусок кода key := ReadKey, прогуливаясь по коду можно даже не заметить, что здесь символы изымаются из потока ввода, ведь здесь переменной присваивается значение, мы ожидаем только присваивание, а на выходе из буфера изчезла клавиша.

Бывают побочные эффекты в вызовах подпрограмм. Возьмем абстрактную в воздухе подпрограмму f(f1(x), f2(x, y), f3(x, y, z)), и каждая из f1, f2, f3 имеют побочные эффекты, одна добустим изменяем x, и печатает его значение, другая тоже пытается изменить x, у третьей тоже есть свои приколы. Вопрос в каком порядке исполняться побочные эффекты? Измениться ли поведение если включить оптимизации? Хорошо пусть порядок вычислений прямой, теперь попробуйте разгадать в этом случае поведение программы. Хорошо если на это уйдет минут 15.

Вот почему.

Короче говоря функции следует рассматривать, только как функции в математическом смысле (с некоторыми исключениями), а для всего остального есть процедуры.

aversey аватар

Передача не является побочным эффектом

Дополню ответ Андрея Викторовича:

Сама по себе передача по ссылке (var) не является побочным эффектом, даже если вы используете такую передачу не в процедуре, а в функции. Побочным эффектом являлось бы, например, изменение внутри функции параметра переданного по ссылке, но никак не сама передача.

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

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

Надеюсь теперь стало понятней. =)

"Побочным

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

Это касается только функции или процедуры это тоже касается?

admin аватар

Что, читать не

Что, читать не умеем? Пойдите ещё куда-нибудь, в интернете очень много разных сайтов.

To aversey: ну, что я говорил?

aversey аватар

Правильно говорили =)

И правда, понятнее не стало...

/dev/null, я же начинаю свой ответ с того, что "дополню ответ Андрея Викторовича". Дальше я продолжаю -- "... не является побочным эффектом, даже если ... не в процедуре".

Давайте попробуем сказать, что все действия, изменяющие состояние программы являются побочными эффектами. Теперь задумаемся что это для нас значит -- например, мы хотим сказать, что побочные эффекты в программе не стоит использовать -- но что мы видим? -- эффект присваивания состоит только из побочного эффекта! То есть в программе не должно быть присваиваний? Более того, процедура не может ничего возвращать, весь её эффект так же выражается в побочных эффектах в таком определении.

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

Но как в таком случае делать ввод-вывод и взаимодействовать с внешним миром? Есть два известных мне ответа -- первый: сузить всё взаимодействие с внешним миром до заранее заданного ввода программы (а это в большей части случаев дорого, неэффективно и неудобно или даже невозможно); а второй -- построить модель в духе Хаскеля, где взаимодействия накапливаются (по факту этого может не происходить, но логически устроено всё именно так), например в монаде, что бы затем быть применёнными к реальному миру. Монады же -- буквально -- штуки в которые можно оборачивать значения, и имея функцию из типа А в тип Б обернутый в монаду (А -> М Б), можно взять значение типа А в монаде (М А) и получить Б в монаде (т.е. определена функция: М А -> (А -> М Б) -> М Б) -- монада таким образом играет роль контекста, то есть состояния программы -- в итоге мы вновь имеем своего рода императивное программирование, пускай формально и выраженное в виде функционального!

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

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

admin аватар

Насколько я

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

Проблема тут не в том, что человек в "передаче" пытается найти побочный эффект, а в том, что он пытается найти побочный эффект за пределами вычисления выражения, т.е. там, где кроме этого "эффекта" нет вообще ничего.

admin аватар

Повторяю для

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

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

Добрый день,

Добрый день, Андрей Викторович! Я недавно установил Линукс и меня стали интересовать вопросы. Есть ли необходимость в антивирусе на Линуксе? На что способны вирусы в Линуксе? Сидев на Виндовс мне часто приходилось переустанавливать её именно из-за них.

Антивирус

Я считаю, что антивирус не нужен даже под Windows, не только под Linux. Работа антивируса в фоне очень сильно замедляет все операции с файлами, но при этом он всё равно не гарантирует отсутствие вирусов.

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

Вирусы для линукса.

Теоретически что-то вроде вирусов для линукса существует.

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

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

В общем, простейшие правила информационной безопасности и можете не беспокоиться:

Если не нужен SSH — отключите демон sshd, если нужен, настройте авторизацию по ключу без пароля или установите сложный пароль. Не помешает перевесить на недефолтный порт, но не обязательно.

Программы старайтесь ставить только из репозитория своего дистрибутива. Если требуется поставить что-то, чего там нет, лучше всего собрать из исходников самому. Если где-то предлагают для установки запустить что-то вроде curl http://something | bash — не делайте этого.

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

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

admin аватар

Не всякое

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

Parthen аватар

качал вирусов

качал вирусов себе на линух.

Распаковал.

Поставил под root.

Не завелись. Два часа гуглил, оказалось, вместо /usr/local/bin вирусы стали в папку /usr/bin на которую у юзера malware нет прав на запись, поэтому вирус не может создать файл процесса. Нашел на китайском сайте патченый .configure и .make, пересобрал, переустановил.

Вирус заявил, что ему необходима библиотека cmalw-lib-2.0. Оказалось cmalw-lib-2.0 идет под CentOS, а под убунту ее не было. Гуглил два часа, нашел инструкцию как собрать .deb пакет либы из исходников. Собрал, поставил, вирус радостно запустился, пискнул в спикер и сделал core dump.

Час чтения syslog показал, что вирус думал, что у меня ext4 и вызывал ее api для шифрования диска. В btrfs это api deprecated поэтому линукс, заметив это непотребство, перевел раздел в рид-онли.

В сердцах открыл исходники вируса, grep'нул bitcoin кошелек, отправил туда $5 из жалости и пошел спать...

fluorine аватар

в папкуокошки

в папку

окошки это неизлечимый диагноз :)

admin аватар

Излечимый-излечимый

Излечимый-излечимый. Просто не сразу лечится.

Parthen аватар

У меня это

У меня это преинтереснейшим образом мутировало. Когда я сижу в терминале, для меня это директории. Когда я сижу в графическом файловом менеджере это папки.

admin аватар

Есть такое

Есть такое мнение, что формально folder — это как раз и есть элемент графического интерфейса, такое окно, в котором подписанные пиктограммы. Иной вопрос, что "папка" в этом смысле совершенно не обязана соответствовать объектам файловой системы на диске.

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

mc

> Но вообще с файловым менеджером стоит уже завязывать

Ох, в случае с midnight commander сложно согласиться, уж больно он удобный. Так быстро, как правильно вызванная команда cp он, конечно, кучу файлов не скопирует, но для мелочей им пользоваться самое то.

mc может быть

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

Во времена DOS необходимость nc, vc, dn и прочих оправдывалось явной убогостью command.com. Помню, что попробовав тогда заменить command.com на что-то более приличное (кажется это был 4dos), я через непродолжительное время практически перестал запускать nc/vc/что-то ещё. Так что, к тому времени, как у меня появился первый линукс (а дело происходило на трёшке, поэтому я линукс в то время юзал без иксов, в голой консоли), привычки начинать сеанс работы с запуска клона nc у меня уже не было. Ну а никакой новой потребности запускать mc с тех пор так и не появлялось.

admin аватар

Ни фига он не

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

Вот смотрите, я с Linux работаю с 1994 года, mc тогда уже существовал, мне его показали сразу же (прямо вместе с Linux'ом), как им пользоваться — было очевидно, это же очередной клон Norton Commander'а, а эпоха MSDOS тогда ещё не кончилась, хотя и клонилась к закату, ну в общем Norton Commander тогда был прямо-таки "наше всё".

Так вот, для определённых задач я даже иконочками пользуюсь — точнее, ровно для одной задачи, фотки сортировать. А вот mc я не использовал никогда, хотя о его существовании всегда знал. Sapienti sat.

Parthen аватар

>Но вообще с

>Но вообще с файловым менеджером стоит уже завязывать
Он нужен, когда некоторые товарищи присылают директории и файлы с названиями на русском языке

admin аватар

Патология,

Патология, несомненно, тяжёлая, но я как-то всегда с этим в командной строке справлялся, в чём проблемы-то?

Parthen аватар

Честно?

Честно? Настраивать лень :)
Я попытался когда-то и бросил, у меня так и остались кракозябры и при вводе, и при выводе. Поставил графический файловый мендежер и графический текстовый редактор, настроенный на виндовую кодировку. Так что все, что мне присылают пользователи винды, там и открываю.

admin аватар

На каждую

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

fluorine аватар

> ничуть не

> ничуть не проще, чем в терминале

Только узнал оказывается, что в моем xfce4-terminal в настройках есть опция encoding, буду этим пользоватся когда виндузянтики файл в cp???? пришлют

admin аватар

К сожалению,

К сожалению, всё не так просто. Если бы когда-то "улучшатели" и поборники "прогресса" не придумали локали, эта опция работала бы именно так, как вы от неё ожидаете. А вот в сочетании с локалями... э... ну, в общем, сами увидите.

admin аватар

*LOL* читаю и

*LOL* читаю и плАчу

admin аватар

Работая с Linux (в

Работая с Linux (в вообще, скажем так, с нормальными системами) с 1994 года, я ни разу не видел ничего даже отдалённо напоминающего вирус. Отказавшись от мелкомягких пародий на операционки, можете про вирусы забыть. И про антивирусы (которые не более чем развод на бабки) тоже.

Есть мнение,

Есть мнение, что вирусов под Linux нет потому, что он гораздо менее популярен на домашних PC, чем тот же Шиндовс

Вирусы

Есть мнение, что вирусов под Linux нет потому, что он гораздо менее популярен на домашних PC, чем тот же Шиндовс

Не только. Количество дистрибутивов, мягко говоря, немалое, а Шиндовс - один-единственный.

admin аватар

Мнение столь же

Мнение столь же хорошо известное, сколь и очевидно бредовое. Во-первых, программистов-любителей, имеющих хакерские склонности, под Linux намного больше, просто потому что с такими склонностями жить под Linux многократно приятнее. Во-вторых, я лично знаю людей, которые сейчас, может, уже остепенились, а лет пятнадцать-двадцать назад душу бы продали за то, чтобы стать "Первым, Кто" написал реально размножающийся вирус для Linux. И я этих людей знаю в достаточной степени, чтобы понимать, что если бы это было возможно — они бы это сделали, квалификации у них с запасом, чтобы и из компьютера, и из любой системы выжать всё, что вообще хоть как-то можно выжать. Смею заверить, сейчас такие люди тоже есть и их даже стало больше, просто я никого не знаю из хакеров следующего поколения. Остался бы в своё время в интернет-провайдинге — наверное, знал бы и этих.

Роутеры

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

Можно ли это вирусом считать, не знаю, но таки роутеры почти все под линукс.

admin аватар

Кстати,

Кстати, интересно — ни разу не подхватывал такого, но у меня в хозяйстве "коробочные" роутеры крайне редко появляются, и если появляются, то всегда за NAT'ом (и пароль дефолтный я всегда меняю, естественно, будь оно хоть за десятью natами).

В принципе я слышал, что бывают под убунтой червяки — пользуются тем, что там sudo по умолчанию с ALL=ALL. Сам, опять же, ни разу не видел, но, опять-таки, у меня всегда первое действие после установки дебианоподобной системы — снести sudo к чертям.

Хотел узнать,

Хотел узнать, как обходиться без sudo в системе, но решил покопаться в архивах гостевой книги, и сам нашел ответ на свой вопрос:
http://stolyarov.info/guestbook/archive/2#comment-2037

Публикую это здесь, вдруг, кому-то тоже будет интересно узнать.
Спасибо вам, Андрей Викторович, за книги, сайт и видеоблог!

совсем не очевидные вещи

> http://stolyarov.info/guestbook/archive/2#comment-2037

Спасибо за ссылку. Я до таких дебрей ещё не добирался. Очень интересно и что самое важное -- полезно.

И, если честно, Андрей Викторович, эти вещи про IDE (комменты про IDE были выше обсуждения sudo), sudo и ИБ лично для меня, человека, который пришёл с форточек, не были ни капли не очевидны. Составлю для себя специально список "Как надо и как НЕ НАДО". Как говориться лучше поздно, чем никогда.

А вы, Андрей Викторович, обо всех этих методах ИБ узнали на собственном опыте или где-то когда-то откуда-то вычитали или вас кто-то этому научил/рассказал?

P.S. Мне, после того, как попробовал обычный текстовый редактор (это vim. emacs мне показался неудобным. может потому что просто к vim-у привык), возврвщяться к IDE и графическим редакторам текстов нет никакого желания.

P.P.S. Для создания/удаления и всяческого манипулирования пользователями так и напрашиваются bash-скрипты, аж руки чешутся.

admin аватар

вас кто-то

вас кто-то этому научил/рассказал?

О, с наставником в этой области мне просто несказанно повезло: это был SolarDiz; в самом конце прошлого века мы с ним работали в одной конторе. По правде говоря, у меня тупо не хватило мозгов воспринять всё, что он на меня готов был вывалить, но и так неплохо получилось.

возврвщяться к IDE и графическим редакторам текстов нет никакого желания.

Так и должно быть. Vim просто удобнее. Emacs, говорят, тоже, но у меня с ним что-то не заладились отношения.

Для создания/удаления и всяческого манипулирования пользователями так и напрашиваются bash-скрипты, аж руки чешутся.

Чтоб было куда стремиться, расскажу одну историю :-) В одном из филиалов МГУ надо было студентов обеспечить доступом к Unix-серверу, чтоб было на чём делать задания. Ну так я там поставил Linux, а для генерации учёток сваял скриптик, который и пользователей заводил (по заданному списку), и генерил LaTeX'овый документ, из которого получался PDF, чтобы печатать пользовательские карточки (с логинами, паролями и памяткой), которые потом раздавали студентам. Возможности командной строки неисчерпаемы :-)

> печатать

> печатать пользовательские карточки (с логинами, паролями и памяткой), которые потом раздавали студентам
Андрей Викторович, а разве можно сообщать пароли? Я вычитал в гостевой книге*, что это плохая практика

http://www.stolyarov.info/books/asm_unix#comment-968
> Разумеется, сообщать пароль рута нельзя никому, пароли вообще никогда никто и никому сообщать не должен. Вообще, понимаете? Никогда, никто, никому. Человек сам себе ставит пароли и никогда их никому не говорит

admin аватар

Конечно, нельзя

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

А теперь представьте себе, как вы это делаете... э... что-то около двухсот раз подряд (если мне память не изменяет, карточек пришлось как раз столько напечатать), причём студенты же такие дисциплинированные, вы ж понимаете — к назначенному времени никто не придёт, будут ползти по одному с интервалом минут в 15, да ещё за время командировки (а дело было на выезде) хорошо если половина доползёт.

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

fluorine аватар

вообще

вообще "покопаться в гостевой" можно при помощи гугла. в поисковой строке вбить site:stolyarov.info "что хочешь найти?"

admin аватар

Вот здесь ещё

Вот здесь ещё тред был про sudo: http://stolyarov.info/books/asm_unix#comment-937

Здравствуйте!

Здравствуйте! Андрей Викторович, а где грань между пропагандистом и не пропагандистом?

admin аватар

Ровно там же,

Ровно там же, где грань между обычной коммуникацией и информационным насилием: в наличии или отсутствии факта навязывания коммуникации. Скажем, книга или сайт сами по себе пропагандой быть не могут, а вот рекламные баннеры, ведущие на сайт, посвящённый некой политической, этической, философской и т.п. точке зрения — это, несомненно, пропаганда; точно так же когда сектанты на улицах раздают свои книженции — это тоже, несомненно, пропаганда (хотя сами по себе книженции и сам по себе сайт как таковой — нет).

А что, это всё не очевидно?

Например,

Например, блогер kamikadzedead называет себя пропагандистом, ставит себя на один уровень с телевизионными пропагандистами. Если вы на него подписаны в тюбике, значит не считаете его таковым? Поэтому и спросил, где грань, а то запутаться можно

admin аватар

Я не уверен, что

Я не уверен, что всё знаю про kamikadzedead и про то, как он в начале своей ютюбиковской деятельности раскручивал свой канал. Вообще почему-то мне кажется, что он свой канал нигде не рекламировал, тогда он, конечно, никакой не пропагандист. Тут есть одна нехорошая шероховатость — тюбиковская рекомендательная система, которая зрителям роликов подсовывает анонсы других роликов; с учётом этого можно считать всех, чьи ролики попадают в эти анонсы, таки да, пропагандистами.

А ещё есть такой момент, что на войне, как известно, убийцы перестают быть убийцами и превращаются в героических солдат. Оголтелая пропаганда, которую ведёт наше замечательное государство — это, собственно, информационная война против собственного народа, и считать ли тех, кто пропагандирует противоположные точки зрения, однозначно нехорошими редисками — вопрос дискуссионный. То есть тут не так всё однозначно. Например, вся предвыборная агитация (вся! без исключения!) — это совершенно очевидное информационное насилие, но я не стану требовать от оппозиции прекратить агитацию. Её можно прекращать только всю сразу, точно так же, как на войне можно заключить мир, но просто отказаться стрелять в одностороннем порядке и позволить себя убить — ну, такое себе.

А, да, ещё вообще-то совершенно пофигу, на кого я подписан на тюбике. На моей основной рабочей машине тюбик уже примерно год как не работает (и это едва ли не единственный сайт в мире, который на ней не работает, Гугл в этом плане впереди планеты всей), так что на youtube я уже давно не хожу. Вообще. Когда мне нужно посмотреть конкретное видео, я для этого использую Invidiou (см. https://solmu.org/pub/misc/invidio.html) либо youtube-dl, но ни там, ни там подписки никак не работают. Машина достаточной мощности, на которой вполне себе можно смотреть тюбик, у меня в хозяйстве есть, но она не основная (бралась когда-то под видеомонтаж) и за неё я сажусь довольно редко.

fluorine аватар

youtube-dlКстати,

youtube-dl
Кстати, если сейчас она у вас подводит с скоростью её можно поменять на форк yt-dlp (такая же питон поделка), youtube-dl'шики перестали обращать внимание на pull request'ы с замечаниями о замедлении скорости или как оно там на гитхабе называется.

Не могу понять почему runtime error 216.

В общем, решил я сделать самую первую задачку с односвязным списком. Она вроде как работает, но получаю такую штуку, перед этим была версии 3.0.0, там пришлось два раза CTRL+D, оно считывало 0, потом выдавало список в обратном порядке.Версию обновил, результат такой же

Результат:
2
5
6
7
8
0
8
7
6
5
2
Runtime error 216 at $0000000000401204
$0000000000401204
$00000000004012DA
$00000000004230BC

Исходный код:

1 program Single_Linked_List;
  2 
  3 type
  4     element_ptr = ^element;
  5     element = record
  6         data: integer;
  7         next: element_ptr;
  8     end;
  9 
 10 
 11 
 12 procedure Is_Your_Data_Correct;
 13 
 14 begin
 15 
 16 {$I-}
 17 
 18 if IOResult = 0 then
 19     {не делать ничего}
 20 else
 21     begin
 22         writeln('I couldn''t parse your input. Type the correct data.');
 23         halt(1)
 24     end
 25 end;
 26 
 27 
 28 
 29 function Read_And_Insert(first, second: element_ptr): element_ptr;
 30 
 31 var
 32    current_state: boolean;
 33 begin
 34     while not SeekEof do
 35     begin
 36         new(first);
 37         read(first^.data);
 38         Is_Your_Data_Correct;
 39         current_state := true;
 40         first^.next := second;
 41         new(second);
 42         read(second^.data);
 43         Is_Your_Data_Correct;
 44         current_state := false;
 45         second^.next := first
 46     end;
 47 
 48     if current_state = true then
 49         Read_And_Insert := first
 50     else
 51         Read_And_Insert := second
 52 end;
 53 
 54 
 55 
 56 procedure Print_All_Numbers_Backwards(first, second: element_ptr);
 57 
 58 begin
 59     while (first <> nil) or (second <> nil) do
 60     begin
 61         writeln(first^.data);
 62         second := first^.next;
 63         writeln(second^.data);
 64         first := second^.next
 65     end
 66 end;
 67 
 68 
 69 
 70 var
 71     first, second: element_ptr;
 72 begin
 73     first := nil;
 74     second := nil;
 75     begin
 76        first := Read_And_Insert(first, second);
 77        Print_All_Numbers_Backwards(first, second)
 78     end
 79 end.

Ещё вот так

Ещё вот так можно проверять булевские переменные:

bool value;
...
if (value.ToString().Length == 4)
{ 
  ...
}
else if (value.ToString().Length == 5)
{
  ...
}
else
{
   throw new ArgumentException();
   return !true && !false;
}

Это легендарный индусский код, если что. Особенно последнее else впечатляет.

admin аватар

Да ладно...

Да ладно... честно говоря, в сравнении с тем, что делает в своём коде топикстартер — в качестве локальной переменной вводит параметр подпрограммы, а начальное значение ему задаёт при вызове (т.е. в коде вызывающего) — этот ваш индокод выглядит даже слегка прикольно :)

fluorine аватар

1. У вас какой-то

1. У вас какой-то супер странный стиль выбирать идентификаторы, читать сложно.
1) В паскале приняты идентификаторы, где слова набраны с заглавных букв алфавита и без знаков подчеркиваний. Например, first_element следовало бы переписать как FirstElement, а current_element, как CurrentElement. Из Print_All_Numbers_Backwards убрать знаки подчеркиваний, и стало бы PrintAllNumbersBackwards, хотя я бы выбрал другой идентификатор (скажем PrintNumbersInRev(erse)Order), но впринципе придираться не к чему. И дальше.
2) И допустим для вас нормально использовать стиль с подчеркиваниями, тогда почему бы тогда не сохранять единый для них стиль: не current_state, element_ptr и Print_All_Numbers_Backwards, а скажем Current_State, Element_Ptr, Print_All_Numbers_Backwards или всё в нижнем регистре сurrent_state, element_ptr и print_all_numbers_backwards.

current_state = true?
Хочу вас разочаровать, но можно сделать просто и элегантно if current_state then, ещё одна придирка возможно, что current_state здесь выглядит очень странно, может вы бы не стали бы сравнивать логическое выражение (!) (переменную current_state: boolean) с true если бы название было бы более подходящее.

19 строка: {не делать ничего}
Нет нельзя (категорический!) использовать символы не из ASCII в тексте программы, даже в комментариях.

Эм.., вы вообще рабочий код скинули?
74 second := nil;
75 begin
76 first := Read_And_Insert(first, second);

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

Мой вам скромный совет, вернитесь на эту страницу, только когда в тылу будет подчищено. То есть предыдущие части нужно бы с карандашом перечитать. У вас пробелы в самых базовых вещах.

admin аватар

Что, не

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

admin аватар

Прямо даже и не знаю

Тут непонятно, с какого конца начинать комментировать. Ну то есть написан, конечно, совершенно махровый бред, но вас ведь это замечание не удовлетворит. Вообще, похоже, вы в глубине души уверены, что ошибка где-то не у вас, типа, я всё правильно делаю, а тут какая-то сволочь мне runtime error с непонятным номером. Ну так я вас сейчас разочарую.

Начну с самого главного: в процедуре Is_Your_Data_Correct самым грубейшим образом нарушена расстановка структурных отступов, причём нарушена так, что с первого совсем расфокусированного взгляда даже не видно, в чём косяк. Всё остальное можно как-то там объяснить недостатком понимания происходящего, отсутствием опыта и т.п., но когда оператор if (и вообще любой оператор) пишется с крайней левой позиции — это ничем, кроме абсолютной безалаберности, объяснить нельзя. Да плюс там ещё кириллица в тексте программы, комментарий написан по-русски; это уже вообще полный беспредел. Ну то есть здесь есть ровно два варианта: либо менять своё отношение к происходящему, либо бросать изучение программирования. Выбирайте, что больше нравится.

А ещё — зачем вон те вон begin и end в головной программе? Не те, которые обозначают начало и конец главной части, а те, что внутри, begin после присваиваний, end перед финальным end'ом. Они, конечно, ровно ничего не меняют в происходящем, но зачем они написаны? Чтобы читателя программы взбесить?

Далее по оформлению: вон директива {$I-} у вас стоит так, как будто она имеет отношение только к всё той же процедуре. А это не так, если бы её действие распространялось только на эту одну процедуру, от неё толку бы не было никакого, поскольку, чтобы перехватить обработку ошибок на себя, нужно, чтобы в режиме $I- был откомпилирован оператор read (а не последующая проверка). К счастью, директива-то действует на весь последующий текст, если только её не отменить (не написать {$I+}), так что операторы read у вас скомпилировались именно в том режиме, в каком надо, но вопрос здесь не в этом — вопрос в том, зачем вы её разместили внутри процедуры. "Чтоб никто не догадался"? Или как?

Чтобы завершить обсуждение этой (крайне странной) процедуры, задам ещё один риторический вопрос: а зачем нужен if с пустой (!) веткой then? Что, противоположное условие записать не справились? Ну так, на всякий случай, в Паскале есть операция "не равно", обозначается так: <>. Но если даже этого не знать, то есть ещё операция not, которая любое логическое выражение превращает в его противоположность.

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

Дальше вот имя переменной current_state — ну охренеть какое информативное. В голову тут может прийти что угодно, но только не то, что у вас там в действительности (чётность количества элементов, внесённых в список... ан нет, наоборот: НЕчётность). Самое интересное, что у вас ведь даже нет начального состояния, то есть вот "состояние" какое-то есть, и, значит, должен быть, наверное, какой-то конечный автомат, меняющий состояния, но с какого состояния он начинает работу — не определено. Кстати, это ваше "состояние" может так и остаться неопределённым, если пользователь попадётся вредный и не введёт ни одного числа, сразу нажмёт Ctrl-D. Или на ввод вам подаст файл из одних пробелов. Или вообще пустой. В вашей программе, впрочем, это "пофигу", поскольку тогда будет сугубо всё равно, какой из ваших first/second возвращать, они оба так и будут nil, вот только чтобы об этом догадаться, надо ещё посмотреть, как конкретно у вас эта ваша функция Read_And_Insert вызывается. Т.е. чтобы понять, как будет работать вызываемый, нужно знать устройство вызывающего. Декомпозиция такая декомпозиция.

Кстати, коль скоро обратили внимание на этот if, давайте посмотрим и на его заголовок. Что, очень трудно догадаться, что current_state = true есть всегда то же самое, что просто current_state? Ведь специально же в книге эта бредятина разобрана, см. параграф 2.2.9 (ближе к концу), и даже указана причина — неудачное имя логической переменной. Вот прямо ровно ваш случай. Понятно, конечно, что не вы первый, не вы последний, некоторых персонажей приходится пинать весь их первый курс, чтоб они так не делали, а кому-то не хватает и приходится продолжать их пинать на втором курсе. Потому и в книге на этом специально внимание акцентируется (и, кстати, сильно больше, чем в одном месте!) Но нет, куда там, нам же обязательно надо, чтоб нас в это ткнули.

Ну и, чтобы завершить обзор стилистических косяков: с какого бодуна у нас Read_And_Insert оформлена как функция? Что, нравится писать по-сишному с побочными эффектами? То есть вам нравится ровно то, с чем я всю книжку пытаюсь бороться (см. для начала параграф 2.3.6)? Может, тогда какую-нибудь другую книжку почитать?

Ах, да, и почему Read_And_Insert так называется? Ну, читать-то она, положим, читает, а куда она чего ВСТАВЛЯЕТ? Она там внутри себя вообще-то (по смыслу) строит список целиком, а не в какую-то уже готовую сущность что-то там "вставляет". Очередное "чтоб никто не догадался".

Теперь плавненько подбираемся к сути, но именно что плавненько. А вот скажите, зачем у этой вашей функции Read_And_Insert аж целых два параметра, если всё равно они оба всегда при её вызове равны nil, и иначе быть не может просто по смыслу? Такими вещами вы запутываете сами себя, и в данном случае, как это скоро станет ясно, запутали вы себя вполне успешно. А всё почему? А всё потому, что не задались вопросом "что делает Read_And_Insert". А это, между прочим, очень важный вопрос, и ответ на него должен состоять из одной простой фразы, и из этой фразы должно быть очевидно, зачем нужны все параметры. Функция эта у вас читает числа и формирует из них список; ради всего святого, накой чёрт для этого нужно — ещё прежде, чем начнём работу — знать адреса аж двух элементов такого списка?!!! Список ещё не сформирован, мы его формировать даже не начинали, а адреса двух его элементов нам вынь да положь? Это вообще как? Это вообще куда?

Теперь поглядим на ваш цикл чтения. Проверили SeekEof, убедились, что "там что-то ещё есть", то есть вроде бы есть что читать. После чего читаем сначала одно число, а потом сразу же другое без всяких проверок. А кто вам сказал, что там два числа есть? Может, там было только одно число и после него больше ничего?

Ну то есть вы числа читаете парами — и без вариантов, хотя сами себя (и читателя программы) тщательно пытаетесь убедить в противоположном. Даже ввели эту вашу current_state, и даже проверяете её. Вот только на выходе из цикла она ни при каких условиях не может оказаться истинной. Внутри цикла — некоторое время истинной остаётся, но потом неизбежно и неотвратимо ей снова присваивают false. Ах да, ещё она может оказаться неопределённой, если цикл ни разу не прокрутится (тот самый случай пустого файла). И в этом случае она совершенно случайно может оказаться истинной (но с тем же успехом может оказаться и ложной, это зависит от того, какой конкретно мусор лежал в стеке до того, как была вызвана ваша функция). А вот если в файле хоть что-то было, то ложь без вариантов. Так что для случая нечётного количества чисел ваша функция работать будет заведомо неправильно.

Самое интересное, что список-то она при этом сформирует. Чтобы понять, что это реально происходит и даже "почти правильно", мне потребовалось минут десять разбираться в вашем теле цикла. Первое впечатление было, что этот сумбур работать не может в принципе. Но нет, оказалось — может. Как-то там. Во всяком случае, в памяти выстраивается односвязный список, в конце таки да — nil, правда в первом элементе может быть ноль, не имеющий отношения к задаче (это если чисел было нечётное количество). Отсюда же, кстати, и необходимость второй раз давить Ctrl-D: первый конец файла у вас read "употребил", а чтобы SeekEof, наконец, false выдал, приходится ещё раз устроить Ctrl-D. Ну да ладно.

Давайте теперь посмотрим, что с этим списком будет происходить дальше. Для начала посмотрим на головную программу. В first будет адрес начала списка. В second так и останется nil вне всякой зависимости от того, что с одноимёнными переменными происходило внутри Read_And_Insert (это же совсем другие переменные, просто имена зачем-то одинаковые — наверное, чтоб читателя программы ещё и тут ввести в заблуждение; впрочем, "перехитрили"-то вы в итоге сами себя).

Ну и добираемся, наконец, до того места, где программа валится с runtime error. Это у нас процедура (спасибо, хоть не функция) Print_All_Numbers_Backwards. Правильный ответ на вопрос "что она делает" должен был бы, наверное, быть таким: "она распечатывает числа из списка". Ффффсё. Никаких "backwards", ведь числа она вообще-то печатает ровно в том порядке, в котором они расположены в списке. И — ещё важнее — для этого ну вот просто ни в какое место не упёрлись ДВА адреса элементов.

Лезем внутрь процедуры. И наблюдаем для начала интересную картину: параметр second вообще никак не используется. Вот вообще. Совсем. На первой же итерации цикла он получает значение, отличное от того, которое было передано, ДО того, как переданное значение будет хоть как-то использовано. Вопрос, зачем тогда передавать параметр (который к тому же взрывает мозг читателя программы вопросом, зачем он нужен).

Дальше — больше: элементы списка печатаются парами. Эй, а вдруг там нечётное количество элементов, тогда как? Впрочем, да, тут эффект чётной ошибки: функция, которая список строит, построить список из нечётного количества элементов не может в принципе. Но если её исправить так, чтобы она всё-таки работала правильно, а не как попало, то она, конечно, будет строить список из такого количества элеметов, сколько пользователь вколотил чисел. И тогда мы тут с этой "печатью парами" пролетим, как фанера над парижем.

Но падает-то она не поэтому. Падает она, потому что так сформулировано условие цикла. Цикл при таком условном выражении будет продолжаться, пока хотя бы один из двух указателей (этих вот first, second) не равен nil. А выйти из цикла программа, соответственно, должна при противоположном условии, то есть когда? Когда ОБА указателя СРАЗУ окажутся нулевыми. Ну так не успеет этого случиться, вот в чём проблема. Сначала получится так, что first уже нулевой, а second пока что нет. Вот тут она и трапнется. Это и есть ответ на вопрос, почему ваша программа вылетает с runtime error 216. Самое занятное, что ЭТО как раз исправить проще пареной репы: в условии оставить только проверку first, и дело сделано. Валиться она после этого перестанет.

А теперь оцените объём получившегося у меня текста, сравните с размером предыдущего абзаца, который отвечает на заданный вами вопрос "чего это она валится", и подумайте, станет ли ваша программа правильной, если вы заставите её больше не валиться. Я бы сказал, что из всего, чего вы тут навертели, вот эта вот мелкая ошибочка, формально приводящая к аварии — это прямо-таки мелочь, не заслуживающая внимания.

UPD: Ваша простыня под заголовком "Так лучше?" раскрыта не будет. Нет, так не лучше, бред как бред, местами, наоборот, хуже стало, причём сильно — вы, по ходу, читать не умеете. И вы уже злоупотребляете моим временем; всё, ваш лимит исчерпан.

А, надо было списком, ну тогда...

program print_two_times;

procedure uncurse(p: pointer; offset: ptrint);
begin
	if p <> nil then begin
		uncurse(pointer(p^), offset);
		writeln(plongint(p+offset)^)
	end
end;

procedure recurse(p: pointer);
var n: ptrint;
begin
	if not seekeof then begin
		read(n);
		recurse(@p)
	end else begin
		n := pointer(@n)-pointer(@p);
		uncurse(p, n);
		uncurse(p, n)
	end
end;

begin
	recurse(nil)
end.

Кстати, не компилируйте эту программу с -O2 и выше, а то сломается.

admin аватар

Чур меня 8-()

Чур меня 8-()

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

Заодно, кстати, век живи, век RTFM: я не знал, что в FP можно нетипизированные указатели вычитать.

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

Боже, только не мой мозг!

Хотите увидеть немного магии?

program print_two_times_again;

procedure uncurse(p: pptruint);
begin
	if pptruint(p^) <> nil then begin
		uncurse(pptruint(p^));
		writeln((p-1)^)
	end
end;

procedure recurse;
var n: ptruint;
begin
	if not seekeof then begin
		read(n);
		recurse
	end else begin
		n := (pptruint(@n)+1)^;
		uncurse(pptruint(n));
		uncurse(pptruint(n))
	end
end;

begin
	recurse
end.

По-моему, такой вариант даже интереснее.

Да вам свой

Да вам свой задачник выпускать надо. Разумеется, с ответами :)

admin аватар

Что-то подобное

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

Крис Касперски?

Автор скорее всего он. Довольно известный персонаж.

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

admin аватар

Я совершенно не

Я совершенно не уверен, что это был именно он. Давно дело было, не помню, где видел, увы.

Наверное автор

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

admin аватар

Точно, Крис Касперски

Насколько я помню, это псевдоним, но не суть.

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

Ну а что разбиться можно насмерть, как это доблестно исполнил Крис Касперски — такая смерть уж точно лучше, чем от старости. Больше того, она заведомо лучше, чем смерть при многих других вариантах экстремальщины. Я вон сейчас активно по рекам сплавляюсь, там фаталити очень так себе (но тоже лучше, чем от старости). А при прыжке с парашютом в большинстве случаев человек и понять ничего не успевает.

admin аватар

Вы это...

Вы это... что-нибудь полезное делать не пробовали?

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

Карандаш и бумага

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

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

admin аватар

Конкретно

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

Магия

Да что там сложного-то? Тут всего две строки с арифметикой указателей, которые изменяются на +1 и -1 и всё.

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

admin аватар

> Да что там

> Да что там сложного-то?

Издеваетесь? :-)

UPD: Ну хорошо, признаю, вы таки взяли меня на слабо, так что пришлось взглянуть на текст внимательнее. Вот это вот n := (pptruint(@n)+1)^; заносит в n численное значение сохранённого EBP, которое указывает на аналогичное место предыдущего стекового фрейма. Т.е. здесь вы не стали строить список из фреймов, воспользовавшись тем, что этот список уже построен в ходе создания самих фреймов при вызовах recurse. При вызовах uncurse её параметр пробегает адреса реперных точек всех фреймов, т.е. тех их мест, где сохранён EBP. Чтобы напечатать из соответствующего фрейма нужное число, делается шаг в обратную сторону (единичка из адреса вычитается). Я только не понял, откуда там в конце этого «списка» берётся nil, на наличие которого ваша программа вроде бы полагается — но, видимо, это какая-то особенность FPC.

Внутри uncurse ещё и применён обратный ход рекурсии, так что числа выводятся в прямом порядке, но это уже мелочи.

В принципе да, ничего сверхсложного нет, просто надо знать, как устроен стековый фрейм, и верить в то, что никто не включит местный аналог -fomit-frame-pointers или как его там :-)

Если совсем честно, спасибо за эту пару головоломок, свою дозу кайфа я получил. Впрочем, воля ваша, но магией я бы это не называл. Как устроен стековый фрейм, написано в том же первом томе, где и Паскаль излагается, только в следующей части. По правде говоря, про адресную арифметику в FP я даже не упоминаю, предпочитаю поберечь мозги новичка — это уже во втором томе всё, в части про Си; но догадаться можно. Ещё нужно догадаться, что за зверь такой ptruint и что это вовсе не указатель, а целое достаточной разрядности.

В общем, нормальный системщик расковыряет. Новичок, конечно, вряд ли.

Разгадка

Цепочка указателей идёт на один шаг дальше, чем нужно, поэтому вместо p используется pptrint(p^). Почему она вообще кончается нулём — не знаю, я просто увидел это в отладчике.

Возможно, EBP при запуске программы обнуляется или самой системой или стандарной библиотекоЙ?

ptruint нужен был, чтобы в n хватило место для сохранения указателя в ветке else и чтобы +1 к указателю срабатывал правильно.

По-моему в понимании арифметики указателей главная проблема в том, что она работает не так как с числами. Например +1 в этой программе прибавляет к численному значению указателя не единицу, а 4 или 8.

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

А теперь вопрос — а вы эту программу запускали под отладчиком или догадались, глядя только на её текст?

admin аватар

Нет, под

Нет, под отладчиком я её не запускал. Откровенно говоря, я не помню, как в gdb смотреть регистры :-) Просто вы мне заявили, что карандаш и бумага не нужны, вот и пришлось вспмонить, что там в следующем "слоте", а там оказалось saved_ebp (стек-то растёт в сторону убывания адресов, а n — первая (и единственная, но это неважно) локальная переменная. Дальше всё сложилось, кроме этого nil (ну есть значит есть).

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

Стек

> Откровенно говоря, я не помню, как в gdb смотреть регистры

Я только бинарный дамп стека смотрел, уже после того как рекурсия поглотила ввод. Вот как правильно это делать я не знаю — я в другой вкладке смотрю PID, потом /proc/$PID/maps и там вижу адрес стека, ну а затем примерно так:
x/128000xa 0x7fffffffca00

Вот сейчас посмотрел статьи про стек, пишут что в функции main регистр EBP должен быть равен нулю — так что это не особенность паскаля, а скорее особенность Linux. Ну или обоих стандартных либ. Надо потестить на nostdlib-программе на Си.

Стек изначальный в x64

gdb -q -ex starti -ex 'i r' -ex 'x (size_t*)$rsp'\
-ex 'x /5s ((char**)$rsp)[1]' --args /bin/ls one two three

Где-то в SysV ABI должно быть описано начальное состояние процесса.

Стек

Забавная команда. Ничего сверхестественного, конечно, но ведь можно этим и не ограничиваться.
Если ввести вот такую команду:

x /128xa $rsp

Видно, что в стеке после argv лежит ещё множество адресов, указывающих на переменные окружения, но между этими адресами и началом строки argv[0] лежит ещё примерно 400 байт с какими-то данными.

admin аватар

Что там лежит

Что там лежит вся командная строка и всё окружение, а на самом верху (вот прямо начиная с [rsp]) сначала argc, потом все элементы argv, так что сам стек представляет собой массив argv — это хорошо известно, для 32-битного случая см. в первом томе пар. 3.6.8, во втором — гл. 4.12 и пар. 5.3.3. Чего я не знал — так это что ebp/rbp при старте будет нулевым.

admin аватар

> в функции main

> в функции main регистр EBP должен быть равен нулю

Что-то мне это сомнительно, у неё же тоже есть и параметры, и локальные переменные, как она будет с ними работать? Может быть, это у _start нет полноценного фрейма, и потому EBP нулевой будет?

EBP

Я запустил программу на C собранну с -g и сделал gdb / break ... / info registers. В rbp находится адрес какой-то, ведущий в стек, по этому адресу 0x0. Если сделать один шаг и дать войти в функцию, то этот указатель сохраняется в стек и указывает всё ещё на этот 0x0.

admin аватар

А, ну ровно это

А, ну ровно это я и предположил, там следующим шагом будет, скорее всего, mov rbp, rsp (следуя классике).

fluorine аватар

Ещё можно вот

Ещё можно вот так делать:

type
CalcInt = int64;
CalcIntPointer = ^CalcInt;
...
token = record
kind: TokenKind;
data: pointer;
end;

в дебрях одной процедуры:
new(CalcIntPointer(t.data));
CalcIntPointer(t.data)^ := ResData

admin аватар

Нет предела

Нет предела человеческому идиотизму.

Перед сном

Перед сном увидел это, взбодрило лучше чем кофе.

#include <stdlib.h>

void main()
{
    a: ; malloc(1); goto a;
}
admin аватар

Что-то совсем

Что-то совсем бред. Зачем такое нужно, ещё можно понять — ну там посмотреть, как система себя поведёт, когда память кончится, всё такое. Но нафига goto, какая религия не позволяет написать for(;;)? Да даже и с goto не справились толком, там же не нужна точка с запятой после метки, оператор и так есть (собственно вызов malloc).

Честно говоря, не понимаю, откуда вы тут такой бодрящий эффект нашли.

for or while?

А почему вы советуете for(;;) а не while(1)?
И почему пустое условие у for не является синтаксической ошибкой? Тогда и пустые скобки у while() тоже будут работать?

admin аватар

for(;;)

for(;;) — это традиционная идиома Си, есть даже традиция читать её как forever; см. параграф 4.3.6, там это есть. Почему не является ошибкой — потому что так устроен язык Си; в описании сишного for в явном виде сказано, что любое из трёх выражений в заголовке можно опустить. Про while этого не сказано, и там опустить выражение нельзя. Подозреваю, что прикол с forever придумали исходные авторы языка, для этого и разрешили опускать условие.

tail /dev/zero

tail /dev/zero

Зачем что-то придумывать? Ещё можно форк-бомбу, но от неё избавиться сложно, а tail /dev/zero прибьёт само ядро через OOM.

fluorine аватар

Помню я в баше

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

admin аватар

Это ещё

Это ещё сообразить надо :-)

fluorine аватар

при

при разыменовании учитывается член kind, так что segfault не будет по определению, иначе пришлось бы держать вместо одного data:pointer, DataInteger, DataFloat, DataOperation, DataBrackets, ...

admin аватар

Вариантные

Вариантные записи? Не, не слышал

А так лучше?

program repeat_two_times_in_reverse;
uses baseunix;

procedure reverse;
var n: longint;
begin
	if not seekeoln then begin
		readln(n);
		reverse;
		writeln(n)
	end else
		fpwaitpid(fpfork, n, 0)
end;

begin
	reverse
end.

admin аватар

*LOL*

*LOL*

Честно говоря, мне сложно оценить, что тут "лучше": когда пытаются решить поставленную задачу (а задача там, как мы понимаем, на списки, то есть целью является освоение списков) и получают на выходе полную х-ню, поскольку не понимают, что такое параметры подпрограмм и что такое локальные переменные; либо же когда вместо списков применяют обратный ход рекурсии, а чтоб напечатать два раза, на верхушке рекурсивных вызовов берут и "раздваиваются" (пофиг нам ваш паскаль со списками, смотрите, как клёво можно обращаться с юниксом). Нет, конечно, в боевых условиях за такое руки отрывать, но тут автор программы, скорее всего, квалифицирован в достаточной степени, чтобы в боевых условиях такого не делать. Так что да, видимо, так всё же лучше :-)

Библиотека виджетов

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

admin аватар

Скажем так, из

Скажем так, из ныне поддерживаемых библиотек виджетов я умею работать с двумя — FLTK и WxWidgets. После освоения FLTK я к WxWidgets не имею желания прикасаться. Т.е. если вас интересует, на чём я буду писать GUI, когда в очередной раз придётся это делать, то ответ однозначный: да, на FLTK. Просто при этом я, пожалуй, всё же не стану утверждать, что все остальные библиотеки виджетов вот прямо совсем ни на что не годны. Просто лично я на них писать не буду, но я не скажу, что каждый, кто пишет, скажем, на Qt, прям сразу круглый дурак.

А вот для обучения — тут, извините, без вариантов, учить больше не на чем, все остальные мозг изуродуют.

Есть ещё весьма

Есть ещё весьма симпатичная и простая в освоении IUP. Написана на Си, заточена под использование с ним же, но на сайте есть небольшой гайд по сдруживанию с плюсами при надобности.

admin аватар

Цитата из

Цитата из раздела "availability":

> UNIX (FreeBSD and Linux) using GTK+ (since 3.0)

ну вот зачем они это сделали, а? Лично я даже смотреть дальше не буду, хотя, конечно, с этим не все согласятся.

Возвращаясь к исходному вопросу — нет, для обучения по моей программе оно в качестве замены FLTK не годится. Чтобы сгодилось, сначала вокруг неё нужно навертеть плюсовых классов, причём не абы как, а так, чтобы выстроилась логичная иерархия. Должен сказать, кстати, что и FLTK в этом качестве подходит довольно условно, поскольку ООП там вроде и используется, а вроде и не совсем (какие к дьяволу callback functions в ООП, ёлки-бутылки).

Зачем нужна многопоточность

Наткнулся на статью https://gregoryszorc.com/blog/2021/04/06/surprisingly-slow/

Оказывается, что в Windows, если включен антивирусный сканер (windows defender), CloseHandle (закрытие файла) выполняется несколько десятков миллисекунд.

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

Хотя пример под Windows, но не исключено что и в других ОС подобные затыки есть.

fluorine аватар

Когда всё таки

Когда всё таки нужна многопоточность: Dataflow architecture.

Недавно у бороды вышло интервью с создателем Эльбруса. Борис Арташесович Бабаян говорит, что сегодня многопоточность неэффективна, цитата из интервью "нужно, чтобы само существо задачи в паралелле внутри работало".

Правда меня напугало вот это "Dataflow architectures have no program counter, in concept: the executability and execution of instructions is solely determined based on the availability of input arguments to the instructions,[1] so that the order of instruction execution is unpredictable, i.e., behavior is nondeterministic.".

Быстро посмотреть там оно на 51:50.

Все слова Андрея Викторовича подтверждены, и сам создатель процессоров говорит о неэффективности малтитрединга.

admin аватар

Таки

Таки докатились до недетерминированных компьютеров. Пора запасаться (1) средствами радиоэлектронного подавления и (2) бронебойными базуками, на случай если номер 1 не сработает.

fluorine аватар

Что-то я

Что-то я вспомнил Unabomber'а. Все настолько плохо?

Кстати читали Why the Future Doesn't Need Us Билла Джоя https://www.wired.com/2000/04/joy-2/ ?

admin аватар

Всё не

Всё не настолько плохо, всё намного хуже.

aversey аватар

Зачем не нужна многопоточность

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

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

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

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

Обобщая: многопоточность не нужна вообще ни для чего.

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

admin аватар

Вы что,

Вы что, издеваетесь?

Во-первых, под Windows крайне затруднена манипуляция полновесными процессами, там только мультитрединг фактически и есть (и это не повод его использовать, это повод никогда не писать ничего серьёзного для Windows). Во-вторых, я не в курсе виндовой конкретики (когда я последний раз писал под Win/*, это была ещё "платформа" Win16, больше четверти века назад), но в системе обязана существовать штатная возможность избежать подобных "пауз" — сначала заказать исполнение действия, потом через какое-то время проверить, завершилось оно или нет, и в нормальных системах такая возможность, разумеется, всегда есть. Если конкретно под виндой её нет — я не слишком удивлюсь, под виндой вообще много чего нет.

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

Зато в статье по вашей ссылке есть одна интересная фраза — последняя. Вот она:

Please don't cargo cult my advice without measuring and applying critical thinking first.

Вообще довольно сложно понять, тот же это аноним написал коммент, что и предыдущие комменты про треды, но если тот же (а по стилю похоже), то вам какое слово непонятно во фразе "вон с моего сайта"?

> в системе

> в системе обязана существовать штатная возможность избежать подобных "пауз"

Справедливости ради, в Linux до очень и очень недавнего времени не существовало неблокирующего чтения/записи из обычных файлов: ядро всегда рапортует их "готовность" в select и компании, а сами вызовы весело блокируются. AIO не считается хотя бы потому, что не было толком реализовано.

admin аватар

Ну да, ожидание

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

А что изменилось в "очень недавнем времени"? Я, по ходу, не в курсе.

Async IO

Кроме posix-aio, который как раз на тредах, был/есть ещё так называемый linux-aio (io_getevents etc.), но он адекватно работал только c O_DIRECT. А вот совсем недавно[1] появился интерфейс io_uring[2]: зубодробительный, конечно, но с более широкой областью применения.

1. https://lwn.net/Articles/810414/
2. https://kernel.dk/io_uring.pdf

Нет, там не я

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

> но в системе обязана существовать штатная возможность избежать подобных "пауз" — сначала заказать исполнение действия, потом через какое-то время проверить, завершилось оно или нет, и в нормальных системах такая возможность, разумеется, всегда есть.

А в винде она кстати есть, только даже при асинхронном закрытии "рукоятки", если включен антивирус, то всё равно программа тормозит. В той же статье и написано, что с этого и начинали. Ну ладно, не в той а в этой: https://habr.com/ru/company/vdsina/blog/544218/ , но я так понял, что там был перевод и дал ссылку сразу на оригинал.

admin аватар

> просто

> просто отвечал на главу из книги

По-видимому, у вас тоже имеются проблемы с чтением. Ещё раз: малтитрединг недопустим, и, следовательно, вопроса, зачем он "может быть нужен", просто не стоит.

> А в винде она кстати есть, только даже при асинхронном закрытии "рукоятки", если включен антивирус, то всё равно программа тормозит.

Ну так не пишите под винду.

Здравствуйте,

Здравствуйте, что думаете по поводу PascalABC.NET?

PascalABC.net

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

В общем, я его пробовал — фигня:

1. Написано на .NET и в линуксе работает через пень-колоду. Никаких дополительных модулей нет, только консольный ввод-вывод. IDE вообще не работает.
2. Следует из 1: криво реализованы указатели. Поддерживаются не все операции, какие поддерживаются могут работать неправильно.
3. Плохая совместимость с полноценным паскалем. Например нету ReadStr.
4. Хоть код и открытый, но он кривой, завязанный на MS Visual Studio и прочую проприетарщину.

В общем выкиньте каку и возьмите хотя бы Free Pascal. Тоже не супер-идеал, но хотя бы работает и достаточно неплохо.

admin аватар

Соглашусь,

Соглашусь, пожалуй, про указатели, но и только.

Прежде всего: создан специально как учебное пособие, создатели (что бы они ни говорили по этому поводу) не предполагали возможности "боевого" использования (например, для коммерческого программирования). Не так чтобы это было совсем недопустимо, в некоторых безнадёжных случаях можно и так, но случай с Паскалем совсем не безнадёжный — есть ведь тот же FreePascal.

Дальше, создан он специально для винды (и не надо мне рассказывать про переносимость .NET, вся эта переносимость если и существует, то тоже лишь от полной безнадёги, создатели платформы никакой переносимости не планировали). Винду использовать для обучения нельзя — вообще, совсем, никак, точка, все свободны. Кто пытается учить людей программированию под виндой — либо халтурщики, либо просто вредители.

Опять-таки, IDE. Все описания PascalABC, что я видел, практически сразу (максимум — во втором абзаце) расписывают, какая там замечательная IDE. Ну так IDE вообще нельзя использовать ни для чего, а для обучения — тем более, они скрывают как раз то, что обучаемый должен видеть.

Следующий момент — таки да, указатели. Я в своём курсе трачу время на Паскаль всего по двум причинам, и полноценное, но при этом не-шоковое освоение указателей — из двух причин, пожалуй, всё же главная. При этом, насколько я понимаю, .NET сам по себе garbage collected, таким же стал и PascalABC, а при наличии сборки мусора никакой речи быть не может о полноценном освоении указателей. В таком виде Паскаль вообще не имеет смысла включать в программу обучения. Больше того, там имеется толпа мерзости, пришедшей из "современных" "стандартов" C++, вроде автоматическго вывода типа переменной при описании, да и готовые динамические структуры данных тоже (и попробуйте при их наличии объяснить обучаемому, зачем вообще нужны эти ваши указатели). Короче говоря, на ЭТОМ можно обучить только очередную макаку.

Ну и так далее. Далее везде.

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

Ах да, и это всё — уже не говоря о том, что ни винду как таковую, ни "платформы", предполагающие компиляцию в промежуточное представление, которое потом выполняется некой виртуальной машиной — этакое полуинтерпретируемое исполнение, что .NET, что Джава — не должны вообще-то использоваться никогда, никем, нигде, ни для чего и ни при каких условиях. Абсолютно дебильные "технологии", все их якобы-достоинства существуют только в воображении их апологетов, зато из фатальных недостатков это всё практически состоит.

Ну так IDE вообще

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

С обучением всё понятно, но почему опытному программисту нельзя использовать IDE?

admin аватар

Потому что

Потому что контрпродуктивно. Компилятор и редактор текстов — это в достаточной степени не имеющие ничего общего между собой программы, они не должны быть ни одним целым, ни комплектом.

А в чём

А в чём собственно принципиальное отличие IDE и текстового редактора у которого есть функция запустить внешнюю команду, где прописан или может быть прописан компилятор (а это любой текстовый редактор кроме самых примитивных)? А если он ещё и умеет перехватить вывод компилятора и при ошибке перемотать окно с кодом к строчке, в которой возникла эта ошибка?

admin аватар

Ещё раз, и

Ещё раз, и медленно: обычный редактор вы выбираете сами, а IDE отличается тем, что редактор за вас выбрали создатели компилятора. Всё, точка.

А навигацию в коде по ошибкам компилятора умеет любой программистский редактор. Вот я, например, vim использую, он с этим прекрасно справляется.

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

Ну вот KDevelop

Ну вот KDevelop позиционируется как IDE, но с компилятором, насколько я знаю, не связана. Какой есть в системе, тот и использует. Qt Creator тоже вроде ни на какой конкретный компилятор не завязан.

То есть если IDE поставляется отдельно от компилятора и позволяет в настройках задать любой, то тогда использовать можно?

admin аватар

Что за манера всё валить в кучу?

> есть если IDE поставляется отдельно от компилятора и позволяет в настройках задать любой, то

... то это, для начала, не IDE. А то вы так, чего доброго, и vim в IDE запишете.

Если интересует моё мнение, то KDevelop (а равно и eclipse, и CodeBlocks, и kate, мало ли их там), разумеется, тоже использовать нельзя, но уже по совершенно другим причинам. Если программа может быть консольной, она должна быть консольной, GUI всегда контрпродуктивны; консольные редакторы текстов для программирования существуют, и это означает, что использование для той же цели монструозных оконных приложений попросту глупо. Это если говорить именно о текстовых редакторах.

Что касается Qt Creator, то его использовать нельзя принципиально в силу, опять-таки, совершенно иных причин. Начать с того, что Qt использовать нельзя (вообще). Далее, если основной целью софтины является рисование формочек, то тот редактор текстов, который там "в комплекте", использовать нельзя по той же самой причине, по которой нельзя использовать "комплект" из редактора и компилятора: это разные программы и их нельзя скрещивать. Ну и, наконец, "визуальный" подход к рисованию формочек с последующей генерацией части кода, предполагающей дописывание "в туда" чего-то ещё своего, тоже недопустим (и вот это уже просто категорически; такие действия — признак профнепригодности).

Заметим, тут три совершенно разные причины, и каждая из них в отдельности заведомо достаточна, чтобы и разговора быть не могло про Qt Creator. При том, что оно, формально говоря, не IDE.

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

А как вы

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

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

А что насчёт части информатики, которая на самом деле математика — двоичная система счисления, способы кодирования информации? Ну то есть то что часто вообще без компьютеров рассказывается.

admin аватар

Элементы

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

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

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

Так что тут, увы, плохо и так, и эдак тоже плохо. Ответа на вопрос "что делать" у меня нет.

А можно узнать,

А можно узнать, что конкретно не так делают в школе, что приходится исправлять?

Имеется ввиду что-то уже упомянутое типа привычки ставить пустой readline в конце программы и тд или что-то другое?

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

admin аватар

Паразитный

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

Что в школе делают неправильно: пишут под винду, пишут в IDE, пишут чёрт знает на чём (питон, C++, чего там только нет), пишут как попало (а попадает, естественно, совершенно не так, как надо). На выходе мозги полны больших и жирных тараканов. Вообще у меня встречный вопрос, вы предисловие к этому читали? Если нет, то см. "Предисловие второе, методическое". Естественно, расположено в начале первого тома. Может, вопросов меньше станет.

Предисловие читал.

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

2. А так ли важно какой язык в рамках школьной программы? Вроде ветвления, циклы и линейное исполнение есть в любом из изучаемых в школе языках, даже в Python и QBasic, разве нет? Вроде как школьники и не должны доходить до того места, где различие между языками становится заметным.

3. Пишут как попало — это да, я тоже писал как попало не смотря на то что учителя говорили про структурные отступы и прочее. Потом как-то всё-таки начал оформлять более тщательно, но это было уже на стадии самостоятельного изучения. А в школе все эти требования к оформлению вызывали наоборот раздражение, причём не только в случае с кодом.

"Ну вот какое дело учителю русского, что я дату написал цифрами на полях, почему надо обязательно «Шестнадцатое декабря 2021 года» на отдельной строке по центру? Почему обязательно надо чертить чертежи карандашом на геометрии? Я и ручкой могу начертить. Почему на физике надо дано, решение и ответ отчёркивать? Почему при решении столбиком надо карандашом проводить линию между слагаемыми/сомножителями и результатом?" и вот все эти отступы так же воспринимались. Но за них вроде оценки не снижались, если код работал, просто ругались, поэтому прокатывало.

Так так ли важно, что по-началу пишут как попало, если позже ученики на своём опыте всё равно поймут, почему надо писать, соблюдая стандарты оформления?

admin аватар

> Предисловие

> Предисловие читал.

Похоже, это из серии "смотрю в книгу, вижу фигу". Вас в этой вашей школе хотя бы читать-то научили, не?

> (то есть точно такие же консольные программы на паскале как в вашей книге до указателей)

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

> по идее должно лечиться просто показом полноценных консольных программ

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

> Вроде ветвления, циклы и линейное исполнение есть в любом из изучаемых в школе языках, даже в Python и QBasic, разве нет?

И что? Программирование не заканчивается на ветвлениях. Конечно, тем, для кого "изучение программирования" даже не дойдёт до понимания вложенных циклов (а таких в школе всегда будет большинство), сугубо всё равно, на чём их будут учить, этот контингент испортить нельзя, там портить нечего. Вот только любой общеобразовательный предмет, чтобы от него был хотя бы какой-то смысл, должен ориентироваться не на тех, кто его "пройдёт мимо", а на тех (да, меньшинство!), кого предмет зацепит. А для этих людей ранняя привычка полагаться на бригаду добрых гномиков — это как раз то, чем плохо программирование "на чём попало".

Между прочим, в тех же предисловиях, которые вы якобы читали, всё это есть, и подробно.

> учителя говорили про структурные отступы

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

> ученики на своём опыте всё равно поймут

А кто вам сказал, что они поймут? Я каждый год на втором курсе вынужден буквально запинывать примерно половину контингента, чтобы их программы начали выглядеть как программы, а не как каракули. NB: это люди, которые поступили в МГУ на "программистский" факультет и уже один курс отучились, то есть это уже совсем не "кто попало", мой контингент — результат тщательного отбора. И вот их приходится пинать самым жёстким образом минимум полсеместра.

"на своём опыте поймут", ага. Три раза хаха.

> стандарты оформления

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

admin аватар

А что, не

А что, не очевидно, что именно я по поводу этого дерьма могу думать и по каким конкретно причинам?

Добрый день

Хочу закончить изучать программирование. Какие последние шаги нужно сделать?

aversey аватар

Инструкция.

Я предлагаю следующие шаги:

  1. Выберите задачу своей последней программы -- лучше если это будет что-то в духе системы слежки или социального кредита, можно построить систему отслеживания и контроля передвижения людей -- одним словом, нужно выбрать такую тему, за которую счастливые пользователи вас не просто по головке погладят, а сделают это с такой радостью, что у людей с не титановым черепом голова могла бы пропасть по причине стирания;
  2. Установить винду последней версии и использовать для программирования только её;
  3. Программировать только на Rust, ведь все программы должны быть записаны на лучшем языке на свете;
  4. Так как Rust -- это не просто лучший язык на свете, но лучший язык низкого уровня -- писать надо именно низкоуровневую программу;
  5. Разумеется, делать это надо используя всю полноту достижений человечества в лице самых современных процессоров, обладающих такой привлекательной величиной в тысячи и десятки тысяч страниц невероятно приятного к чтению, осмысленного текста документации;
  6. Использовать при программировании все доступные методологии и лучшие практики написания кода, как если бы дядюшка Боб в вас вселился;
  7. Наконец я предлагаю вам показать, что полученная программа не имеет ошибок, лучшим методом известным человечеству -- путём всестороннего её тестирования -- это займёт у вас некоторое время, зато по его истечении вы сможете наслаждаться полным покоем во вселенной пережившей тепловую смерть.

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

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

fluorine аватар

Чем плохо тестирование?

показать, что полученная программа не имеет ошибок, лучшим методом известным человечеству -- путём всестороннего её тестирования

Чем плохо тестирование? Слишком медленно?

Говоря о

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

admin аватар

Вообще-то оно

Вообще-то оно не "слишком медленно", оно невозможно. Принципиально. Никакое сколь бы то ни было тщательное тестирование не может гарантировать отсутствия ошибок. Соответственно словосочетание "всестороннее тестирование" — это что-то вроде вечного двигателя: оно невозможно, и все это знают.

Parthen аватар

> Установить

> Установить винду последней версии и использовать для программирования только её;

На ней запустить Chrome, в котором будет новейшая™ ОС от Google на WASM, где запустить Chrome. Намертво привязать программу к такой системе, поскольку если это используете вы -- должны использовать и другие

admin аватар

последними шагами не занимаюсь

С этим вопросом вам куда-то сюда.

Программирование

То есть, вы считаете, что программирование — это как мафия: выйти можно только вперёд ногами?

admin аватар

Я бы сказал, что

Я бы сказал, что программирование — это диагноз, и он не лечится. Результат, впрочем, тот же.

Добрый день.

Добрый день. Хочу начать изучать программирование. Подскажите какие первые шаги нужно сделать?

admin аватар

Подробный

Подробный ответ на этот вопрос содержится в третьем ("напутственном") предисловии в первом томе книги Программирование: введение в профессию.

tvldslv аватар

Доброго

Доброго времени суток. Читая "Программирование. Введение в профессию", возник вопрос: имеет ли смысл внутри функций заботиться о именовании переменных (например, прописывать в имени то, что переменная - такой-то счетчик, а не просто i и т.д.). А то я раньше, писав код, абсолютно как-то не задумывался о том, что по-сути, занимаюсь написанием говнокода. Заранее благодарю за ответ

admin аватар

Читая

Читая "Программирование. Введение в профессию", возник вопрос

"Подъезжая к станции, с меня слетела шляпа". См., например, тут. Аккуратнее с деепричастными оборотами.

По существу вопроса: см. Оформление программного кода, во втором издании это пар. 1.2.1 (стр.10 в книжке, 12-я в pdf-файле).

fluorine аватар

gnu coreutils

Я в попытках читать код лучших и найти примеры для подражания (даже если вообще ничего не понимаю в их коде), скачивал разные исходники и случайно попал сюда ftp://ftp.gnu.org/gnu/coreutils/coreutils-8.24.tar.xz,
там есть функции на 10 параматеров (конкретно в src/copy.c extent_copy), гм.. я озодачился это получается иногда так можно (у меня прямо ступор) и не понимаю как они это вообще используют.

aversey аватар

Подражание коду

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

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

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

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

fluorine аватар

Да, плохое

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

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

> в целях развития навыков чтения кода
чужой г#внокод тоже нужно уметь читать ^^. Я в гну полез просто из интереса (каждый день же использую), и узнал например, что у них все операции копирования/удаления и т.п. это отдельные модули, т.е. например всякие bash'и возможно просто цепляют этот модуль себе и вот у нас уже есть shell builtin :-).

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

Насчет безопасников, я бы "true безопасниками" считал тех, кто умеет находить ошибки в чужих программах и/или исправлять их. А вот здесь необходимо бы иметь нехилый такой experience в программировании.

admin аватар

> попытайся

> попытайся вникнуть в их трюки,

Хороший код и трюки — понятия взаимоисключающие.

> "true безопасниками"

Там не совсем так. Обычные программисты под ошибкой понимают нечто такое, что, если его обнаружить, выглядит как ошибка и оказывается понятно, как это исправить. Хакеры в программах ищут не такие ошибки, совсем другие: в большинстве случаев даже автору программы невозможно объяснить, почему вот тут вот в его программе дыра — он может просто не понимать, как устроены техники взлома.

Лет 10 назад

Лет 10 назад устроился на работу в небольшую контору по объявлению. В объявлении требовалось знание ассемблера. Как потом оказалось ребята занимались безопасностью лишь условно, т.е. по факту весь создаваемый инструментарий использовался не только в благих целях. Большую часть времени пришлось заниматься написанием и отладкой эксплоитов под Win XP SP1 в отладчике SoftICE (на SP2 и выше он уже не работал).
Как вы правильно отметили, здесь требуется очень специфическое мышление, если программисты - не совсем нормальные люди, то "хакеры" тем более.
В итоге с этой работы я ушел, т.к. начал чувствовать изменения в психике. С другой стороны некоторые техники, с которыми пришлось познакомиться, до сих пор вызывают у меня уважение к их авторам.

PS: Когда читаешь где нибудь на opennet о том что кто-то подменил js библиотеку в npm возникает мысль - как всё деградировало.

Код от GNU --

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

К совету посмотреть код от OpenBSD присоединяюсь, кстати.

В качестве

В качестве примера для подражания могу посоветовать проект OpenBSD.

Беглым

Беглым взглядом прошелся по "NetBSD source code style guide": OpenBSD стиль похож на NetBSD, что и не удивительно, ведь, на сколько я понимаю, OpenBSD пошел из NetBSD.

admin аватар

Фиг знает, не

Фиг знает, не видел. В принципе я не удивлюсь, если там действительно код достаточно внятный.

Что касается

Что касается оформления исходников, кстати, у них есть короткий стайлгайд прямо в манах: https://man.openbsd.org/man9/style.9

admin аватар

> Enumeration values are all

> Enumeration values are all uppercase.
> enum enumtype { ONE, TWO } et;

тьфу...

я понимаю, что "так все делают", но от этого не легче

fluorine аватар

Prototypes should not have

Prototypes should not have variable names associated with the types; i.e.,

void function(int);

not:

void function(int a);

А это хороший совет?

admin аватар

Отвратительный.

Отвратительный. Заставляет писать комментарии там, где можно было бы обойтись самопоясняющими идентификаторами.

aversey аватар

Код OpenBSD

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

А вот что касается самого кода -- то тут ситуация одна из лучших. Например, только у них я видел нормальный strlen. Сравните с кошмаром из glibc, схожим ужасом из FreeBSD и вот таким ребусом из musl. =)

Из любопытства

Из любопытства и для полноты картины решил посмотреть на strlen в DragonFlyBSD и NetBSD. Они там оказались тоже весьма лаконичными и почти идентичными OpenBSD'шному:

https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/lib/libc/...

http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/common/lib/libc/strin...

Дальнейшее любопытство позволило узнать, что у FreeBSD когда-то тоже был простой strlen (что неудивительно, учитывая общего предка у всех упомянутых систем), но в какой-то момент они решили пойти по пути усложнения. В логах хорошо видно приход некоего любителя оптимизаций, одним коммитом резко усложнившего код.

aversey аватар

Спасибо

Не видел до этого код DragonFlyBSD и NetBSD -- но да, то что вижу идентично и хорошо. Спасибо, буду знать. =) В целом пример strlen тут не столь принципиален, просто у меня сложилось довольно хорошее впечатление о коде опёнка в сравнении с остальными ОСями.

Теперь аккуратно скажу, что оптимизаторство головного мозга мне кажется более опасным чем излишняя паранойя безопасников. Опята тоже порой делают плохой код, но кажется стараются поддерживать его в каком-никаком порядке, так как признают, что иначе их поглотят ошибки. При этом у большинства ОСей линия партии как раз в эффективности -- Линукс, фряха, DragonFly, ... (про окошки и яблочки тактично умолчу =) ) NetBSD тут немного отличается -- у них упор на портативность, не знаю как такую установку оценить в плане влияния на качество кода.

Поясню почему "аккуратно" -- потому что порой безопасники создают высеры (простите, другого слова нет) вроде Rust, которые приносят всё во имя воображаемой (и именно так!) безопасности.

admin аватар

Вот-вот, aversey,

Вот-вот, aversey, где блин статья про раст?

А можете

А можете подробнее объяснить почему Rust плох? Я пока являюсь больше противником языка, хоть и не использовал его ни для чего. Отталкивает он меня своим агрессивным маркетингом (или как это правильно назвать, когда отовсюду различные эксперты призывают к переписыванию всего на Rust, а то небезопасно). Но всё-таки, хочу услышать мнение тех, кто проводил какое-то (пусть даже поверхностное) исследование языка.

aversey аватар

Статья про Rust

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

Спасибо за интерес, жду отзыва о статье когда она выйдет. =)

UPD: статья вышла.

Статья хорошая,

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

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

Переписывальщики на Rust

почему Rust плох?

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

различные эксперты призывают к переписыванию всего на Rust, а то небезопасно

Эти "эксперты" только на переписывание и способны. Ничего толкового на этом хрусте до сих пор не выкатили, что как бы неудивительно. Этот хруст похож в этом плане на D - одно время тоже из каждого утюга вещалось об этом "улучшенном С++". А самое весёлое, это т.н. "коммьюнити" раста - вчерашние js-макаки. Отсюда куча веб-фрейворков на этом поделии, нужность которых меньше нуля. Так ладно бы копошились в своей веб-песочнице со своим хрустом, так нет же - каждый веб-павиан считает своит долгом накатать "публикацию" о применении этой поделки для разработки под МК.
Я уже промолчу насчёт переписывания утилит командной строки на этом недоразумении (так как же и на golang).
Ну а "инициатива" по использования хруста в ядре - это вообще клиника. После такого адептов хруста всерьёз воспринимать невозможно.

порой

порой безопасники создают высеры (простите, другого слова нет) вроде Rust

Rust создали в Mozilla же. А человек, работающий в Mozilla, вообще не имеет морального права рассуждать о безопасности программ и их пользователей, по моему скромному мнению.

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

admin аватар

Полагаю, это

Полагаю, это были не специалисты по информационной безопасности, а такие персонажи, которые называют себя специалистами по информационной безопасности.

Реальных специалистов по инфобезопасности изрядно меньше, чем чуваков, которые имеют наглость себя так называть. Меньше — раз этак в десять тысяч.

Полагаю, это

Полагаю, это были не специалисты по информационной безопасности, а такие персонажи, которые называют себя специалистами по информационной безопасности.

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

admin аватар

Таким

Таким специалистам стоит задать один простой вопрос: "а ты сам эксплойты писать умеешь?" И посмотреть на реакцию.

Parthen аватар

У нас на кой-то

У нас на кой-то черт существуют 2 крайне разных специальности -- компьютерная и информационная безопасность.
Компьютерная безопасность это именно то, про что вы говорите.
А информационная безопасность это про установку сложных паролей сотрудникам, вход по пропускам, заполнении 200 бумажек-отчетов и прочее.

admin аватар

Ага, на входе

Ага, на входе 100500 ритуальных приседаний, а потом посреди open space на сто человек стоит выключенный комп, за которым никто не сидит и за которым никто не следит, и из него гордо торчит флешка с Самым Главным Секретным Ключом.

Не читал всю

Не читал всю ветку выше, просто листал гостевую книгу и случайно глазом зацепился :)

Захотелось поделиться.
Являюсь как раз таким "специалистом по информационной безопасности". Закончил универ по профилю ИБ, программированию учили только на модном питоне и С++. Нифига не понял тогда, хотя в школе с Паскалем проблем не было. Спустя несколько лет работы в должности "специалиста по защите информации" (бумагомарателя-эникейщика) понял что путь в никуда, а развития без знания программирования нет.

Сижу теперь после работы изучаю Ваши книги и тихонько грущу от того что не попались они мне раньше.

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

Не видел до

Не видел до этого код DragonFlyBSD и NetBSD -- но да, то что вижу идентично и хорошо.

С NetBSD всё оказалось не так очевидно при более пристальном рассмотрении, я написал об этом дополнительный комментарий.

излишняя паранойя безопасников

Паранойя -- это хорошо и правильно же. :)

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

При этом у большинства ОСей линия партии как раз в эффективности

Неумное стремление человеков к сиюминутной эффективности в ущерб всему остальному очень удручает, конечно. (И не только в IT, кстати, проблема в целом глобальнее.)

aversey аватар

Ассемблер и паранойя

Да, видел ваш комментарий про NetBSD -- низкоуровневые оптимизации на ассемблере мне кажутся нормальными, более того их ассемблерный код не плох, как по мне. =) Ну и речь шла про код на Си -- а к нему у меня претензий нет, он идентичен DragonFlyBSD и OpenBSD.

И разработчики OpenBSD это, как мне кажется, прекрасно понимают.

Мне тоже, но это было пояснение к слову "аккуратно" -- потому что хотя паранойя это явно не худшее, и даже пожалуй полезное свойство программиста, но и оно иногда приводит к плохим решениям. Конкретно OpenBSD например вводили такое -- а именно рандомизацию выделения памяти программам. Не скажу что это прям ужасно, но это усложнение, при том не являющееся неизбежным для выполнения ОС своих функций. Думаю подход "улучшение безопасности любой ценой" у них имеет место -- и это плохо! -- но как и сказал изначально, их код в целом мне кажется одним из самых адекватных и понятных.

admin аватар

Так

Так рандомизация адресов есть сейчас везде, в линуксе её уж лет двадцать как запилили. Честно говоря, не вижу, чем это плохо, вот то есть совсем не вижу.

aversey аватар

А я отчасти вижу =)

Ну, то что что-то есть везде, как мы все понимаем, не показатель. =)

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

Может я тут не прав, но мне так кажется. Как вам известно я OpenBSD несмотря на это очень люблю, просто как и они тоже стремлюсь быть осторожным. =)

Хотя насчёт NetBSD

Хотя насчёт NetBSD не совсем понятно.

В коммите к FreeBSD'шной оптимизации strlen есть такой комментарий:

The idea is taken from J.T. Conklin's x86_64 optimized version of strlen(3) for NetBSD, and reimplemented in C by me.

А в NetBSD есть ассемблерный файлик src/common/lib/libc/arch/x86_64/string/strlen.S

Так что, может быть strlen в NetBSD реализован и вовсе на асме (по крайней мере для архитектуры x86_64).

admin аватар

Что-с? Это

Что-с? Это гнутые-то "код лучших и примеры для подражания"? Вы видели, как они исходники оформляют, пардон? Они бы мне не просто зачёт не сдали, там всё хуже: я обычно, видя безграмотное оформление кода, отказываюсь этот код обсуждать в принципе; ну так вот любой гнушник — во всяком случае, такой, который в этом кодингстайле реально пишет, а не конвертирует в него исходники программами вроде indent — на моём зачёте засыпался бы ровно на этой стадии.

fluorine аватар

Хотел спросить:

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

Кстати хотел ещё узнать как работает isatty, залез в glibc 2.20:
в sysdeps/posix/isatty.c:
int
__isatty (fd)
int fd;
{
struct termios term;

return __tcgetattr (fd, &term) == 0;
}

Интересно, что не работает по fstat, как вы писали во втором томе. Может вопрос требует дополнительного изучения, или это гнутые не могут нормально программировать unix?

а в sysdeps/unix/sysv/linux/tcgetattr.c:

int
__tcgetattr (fd, termios_p)
      int fd;
      struct termios *termios_p;
{
  struct __kernel_termios k_termios;
  int retval;

  retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios);
  
  /* копируем в termios_p, k_termios с разными директивам компиляции и не трогаем retval */

  return retval;
}

Может это информация будет для вас полезна :-)

admin аватар

Диспозиция для

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

С isatty в принципе всё правильно. На самом деле в книге имеет место ошибка, fstat вообще не позволяет узнать, терминал это или нет, он только позволяет узнать, что дескриптор связан с символьным устройством.

Parthen аватар

К слову

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

admin аватар

Можно замкнуть

Можно замкнуть круг: Торвальдс в одном из своих текстов предлагал GNU coding style guide распечатать на принтере, после чего сжечь не читая.

Здравствуйте!

Здравствуйте! Раньше задавал вопрос по Паскалю (а именно про то, как fpc формирует машинный код и используется ли при этом ассемблер), теперь же стало интересно узнать про "полноэкранные программы".
Каким образом crt может управлять консолью, системные вызовы которой, по-сути, написаны на Си (неужели получилось связать Си-шные функции с Паскалевскими процедурами)?
Заранее спасибо.

admin аватар

Что у вас за

Что у вас за бардак в голове?! Какие ещё "системные вызовы" у консоли, какая разница, на чём они написаны (вообще-то ни на чём, никаких таких системных вызовов не существует в природе, но если бы они даже существовали и были бы написаны на Си, это ничему бы не мешало).

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

Кстати, вот это ваше "неужели получилось" впечатляет особенно. Free Pascal предусматривает линковку с модулями, написанными на других языках, и вызовы подпрограмм в соответствии с разными конвенциями, в том числе, таки да, и с сишной тоже, то есть взять модуль, написанный на Си, включить в сборку паскалевской программы и вызывать из неё функции, в том модуле описанные — это абсолютно штатная возможность, присутствовавшая во Free Pascal с самого начала (и, насколько я помню, в Turbo Pascal она тоже была). UPD: если интересно см. https://www.freepascal.org/docs-html/prog/progsu46.html - тут пример, как целиком библиотеку подцепить, есть ещё директива {$L} — она цепляет отдельный объектник; функция описывается и используется точно так же.
Но и это здесь к делу не относится — если я только правильно понимаю, как устроено это чудище внутри, использования кода на языках, отличных от Паскаля, авторы FP избегают. В общем, нет там ни сишного кода, ни обращений к таковому.

Для системных вызовов (настоящих, блин, реальных, а не выдуманных вами) у FP RTL есть свои собственные обёртки, выполненные, естественно, в виде ассемблерных вставок — точно так, как это сделано и в libc. Сие обстоятельство никакого отношения не имеет к реализации именно модуля crt, поскольку любая программа, работающая под управлением ОС, вынуждена общаться с внешним миром именно через ОС, т.е. через те самые системные вызовы. Любая, понимаете? Даже просто чтобы корректно завершиться, нужен системный вызов. Самая короткая программа на Паскале, как известно, вот такая: «begin end.» — никаким модулем crt тут и не пахнет, а системный вызов — да, нужен, прямо-таки необходим.

Ну а экран управляется esc-последовательностями. Тут всё совсем просто.

Вы правы - в

Вы правы - в голове у меня бардак. Скорее это связано с тем, что ранее узнал о termios и о различных её функциях - т.е. просто залез не туда, куда на данный момент можно.
Но вопрос (возможно глупый) теперь в другом: как программа узнаёт, например, размер экрана? Я на 90% уверен, что для этого нужен какой-никакой системный вызов (как терминал может хранить данные?).
P.S. Только сейчас вспомнил про WhereX и WhereY и появились мысли по этому поводу:
1. Терминал всё же может хранить данные (как тогда обратиться к эти данным, например, на ассемблере?);
2. Crt где-то у себя хранит эту информацию, а данные эти он получает (тоже интересно - как?).

admin аватар

> как программа

> как программа узнаёт, например, размер экрана?

Через вызов ioctl с параметром TIOCGWINSZ. Полегчало? (tm)

> Я на 90% уверен, что для этого нужен какой-никакой системный вызов

Без системных вызовов программа может только менять данные в отведённой ей памяти. Любое (любое!!!) взаимодействие с внешним миром происходит через операционную систему с помощью системных вызовов.

> (как терминал может хранить данные?).

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

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

> 1. Терминал всё же может хранить данные (как тогда обратиться к эти данным, например, на ассемблере?);

Вот уж тут совершенно неважно, на чём (в смысле, на чём написана программа). К драйверу терминала и параметрам дисциплины линии можно обратиться через ioctl, через этот системный вызов вообще делаются все операции с драйверами устройств, не сводящиеся к чтению и записи. Например, "открыть лоток DVD-привода" делается через него же. С самим терминалом можно общаться через Esc-последовательности — что, собственно, делает команда resize — она сначала посылает терминалу последовательность "запомни позицию курсора", потом последовательность "позиционирование курсора" с координатами (999,999), потом последовательность "скажи, где твой курсор", на что уже терминал отвечает, опять же, esc-последовательностью, содержащей координаты. Дальше resize отправляет терминалу последовательность "восстанови сохранённую позицию", а драйверу терминала опять же через ioctl сообщает, какой теперь у экрана размер. Изначально, насколько я понимаю, драйвер считает, что размер 24x80 и именно его отдаёт на соответствующие запросы (которые тоже делаются через ioctl). Когда терминал не физический, а нарисованный, xterm как программа знает, когда пользователь меняет размер его окошка (X-протокол предусматривает передачу этой информации) и сам дёргает соответствующим образом драйвер терминала.

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

COM-порт

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

Например это происходит когда роутер или одноплатник настраиваешь по UART, когда там сеть ещё не поднята для ssh.

admin аватар

У меня такого

У меня такого ни разу не было, но тут, возможно, дело в том, что я почти никогда не меняю размер xterm'а — он как открывается в классическом 24x80, так и остаётся. Всё это полностью подтверждает сказанное выше: драйвер serial'а вместе с дисциплиной линии не знают, каков размер терминала по ту сторону, и за неимением лучшего предполагают, что это 24x80. Должно быть достаточно одной команды resize.

Мне удобнее

Мне удобнее окно терминала разворачивать во весь экран.

Команды resize может быть достаточно, но это если она есть, а она есть не всегда и не везде.

admin аватар

Мне удобнее

Мне удобнее окно терминала разворачивать во весь экран.

Это означает, что вы не умеете пользоваться терминалом. В норме терминал можно развернуть на всю высоту экрана, но его никогда нельзя делать шире 80 колонок. Единственное исключение — когда какой-нибудь моральный урод прислал нам что-то текстовое (чаще всего URL), которое больше 80 символов, но которое нужно зачем-то скопировать как единую строку; после исполнения такой операции терминал следует немедленно пристрелить и открыть новый, т.к. это быстрее, чем попадать обратно в 80 колонок.

Текст шире 75 колонок заведомо контрэргономичен, и книгопечатникам это известно уже лет триста. Пять накидываем на рамки, нумерацию строк и всё такое прочее.

она есть не всегда и не везде.

Может, у вас ещё и ls не всегда есть?

>Ну и нафига вам

>Ну и нафига вам это всё сейчас?
Просто было интересно узнать (для полноты картины), каким образом программа может повлиять на терминал (оказывается есть системный вызов ioctl - он, в свою очередь, делает за нас всё работу с escape-последовательностями).
В общем, порядок в моей голове вы навели одним предложением: "Любое (любое!!!) взаимодействие с внешним миром происходит через операционную систему с помощью системных вызовов." (постараюсь впредь этого не забывать).
Большое вам спасибо за потраченные на меня время и силы!

admin аватар

> ioctl - он, в свою

> ioctl - он, в свою очередь, делает за нас всё работу с escape-последовательностями

Даже близко такого нет. Драйвер ничего не знает про esc-последовательности. Драйвер — это часть ядра, а ядро вообще обычно не делает ничего такого, что программы могут сделать сами. Сформировать esc-последовательность программа может (и должна) сама, отправить на терминал — обычной операцией записи в поток (т.е. это системный вызов write, и он тоже, разумеется, ничего не знает ни про какие последовательности, ему что сказали, то он и отправит). Роль драйвера тут в том, что он помнит два целых числа — ширину и высоту. Одни программы ему через ioctl эти два числа сообщают, другие через тот же ioctl (только с другим параметром) у него эти два числа запрашивают. Ну, ещё, если не ошибаюсь, драйвер терминала при изменении размера окна отправляет активной (текущей, нефоновой) группе процессов сигнал SIGWINCH, если, конечно, активная группа вообще есть. То есть ему некий добрый дядя сообщает, что размер экрана изменился, и он не только запоминает новый размер, но и рассказывает выполняющимся программам, что размер поменялся и пора запросить новый размер. Но о том, что размер поменялся, драйвер не сам узнаёт, ему об этом сообщают. И новый размер он не сам узнаёт, ему его говорят.

> Любое (любое!!!) взаимодействие

Если бы вы чуть внимательнее читали книгу, то уже знали бы это. Во вводной части в параграфах 1.1.2 и 1.1.6 говорится, что программа может только ковыряться в собственной памяти и всё, а всё остальное должна делать через операционную систему, хотя в явном виде термин "системный вызов" не употребляется. Но откуда-то вы ведь этот термин взяли. Так вот, если бы вы его взяли из книги, то впервые он упоминается в параграфе 3.1.2 — и вот там уже это не просто "есть", а выделено жирным шрифтом. И вообще в "ассемблерной" (третьей) части системные вызовы упоминаются то и дело, в том числе подробно рассказывается, как они делаются.

> вызывать из

> вызывать из неё функции, в том модуле описанные — это абсолютно штатная возможность, присутствовавшая во Free Pascal с самого начала (и, насколько я помню, в Turbo Pascal она тоже была).

Также в реализациях Паскаля полувековой свежести были директивы вроде EXTERNAL или FORTRAN с примерно теми же целями.

Написал

Написал программу. Откомпилировал. Сегфолт. Дебаггером нахожу фрагмент кода, который передает очень странный адрес (0x55f0000000a), заместо нормального адреса структуры. Т.к. мне нужна не вся структура, а лишь одно из ее полей, решаюсь передавать адрес нужного поля. Компиляция. Все работает. Негодую. Адрес ВСЕЙ структуры не передает (подставляет тот странный адрес), а вот поле - пожалуйста. С выражением лица "А чо бы и нет" возвращаю все как было. Компиляция.
...
Все работает просто замечательно.
Почему? :)
Есть ли какие-нибудь еще инструменты разработки? Я ума не приложу, как находить такие ошибки, которые появляются откуда не возьмись

admin аватар

Дайте-ка

Дайте-ка угадаю... программа многомодульная? :-)

Вы угадали :)

Вы угадали :)

admin аватар

Такое обычно

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

Спасибо!!!

Спасибо!!!

Parthen аватар

Есть ли у вас

Есть ли у вас статистика, сколько раз люди запрашивали видео-интервью с вашего сайта?
Просто интересно, сколько предпочли ютубчик прямому видео.

admin аватар

Есть, и не

Есть, и не радует совершенно. Всего было 548 скачиваний, из них успешных (читай -- до конца файла) всего 104, остальные 444 обрывались раньше. Это всё суммарно по всем трём выложенным файлам.

Придётся, видимо, расстаться с остатками веры в человечество.

Человечество

Человечество хочет смотреть видосике на телеке, а не скачивать с ftp.

Gopher у Вас, кстати, есть?

Parthen аватар

>скачивать с

>скачивать с ftp
Любой нормальный плеер видео (vlc/mpv например) умеет в потоковое воспроизведение. А если еще подзаморочиться youtube-dl, можно будет даже качество выбирать.

Видосики с ютуба

смотреть видосике на телеке

С рекламой через каждые 5 минут. Из серии "мышки плакали, но продолжали жрать кактус".

admin аватар

Вот я и говорю,

Вот я и говорю, верь после этого в человечество. Чел-овечество.

Гофера нет, а надо?

Есть PeerTube -

Есть PeerTube - децентрализованный, федеративный видеохостинг с открытым исходным кодом. Все видео хранятся на вашем собственном сервере. Последнее время набирает популярность, как альтернатива ютубу. Рекомендую! Ваши видео там удобнее было бы смотреть.

admin аватар

Глянул. Эта

Глянул. Эта мерзость написана почти целиком на TypeScript, сайт там даже не делает вид, что может работать с отключённым JS.

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

Parthen аватар

Так Peertube

Так Peertube изначально появился на технологии WebTorrent. Мертворожденный, в общем.

Возможно. Но в

Возможно. Но в любом случае, во вселенной децентрализованных сервисов (она же Fediverse) что-нибудь интересное еще появится. Это прекрасная альтернатива сервисам от компаний (ну не все из них, конечно, но вектор правильный)
PS: капча у вас на сайте ядрёная, хрен пройдешь.

admin аватар

Между прочим,

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

Есть

Есть исправленные версии приложения (без рекламы). Даже т.н. интеграция автоматически перематывается.
Что касается видео об информационном насилии, то я, например, их слушал (скачал аудиодорожки с помощью бота в телеграме). А на Ютуб зашёл, кажется, ради лишь одного момента про отписку из мэрии.
Отдельное спасибо за данные минилекции, они скорректировали мои взгляды.

Parthen аватар

Есть, да вот

Есть, да вот только на телефоне. Там да, и ютубовской и спонсорской рекламы нет.
Только вот одно но -- на компе так может либо браузер, либо FreeTube (на электроне, читай браузер)

fluorine аватар

Разрешение направления завимости модулей

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

Арена содержит в себе всех героев.

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

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

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

Как бы вы поступили в этой ситуации? Решение в лоб это засунуть всех героев и арену в один модуль но оно мне не нравится, есть ещё решение каждому герою присвоить смещение, чтобы он сам как-то без помощи процедур родителя отрисовывал себя, но так получится дублирование кода :(

admin аватар

Так-с... у меня

Так-с... у меня возник вопрос, вы понимаете, что модуль может зависеть от другого на уровне интерфейса, а может — на уровне реализации? Перекрёстная зависимость на уровне интерфейсов невозможна (то самое "не скомпилируется"), но зависеть крест-накрест на уровне реализаций модули могут, имеют право, никак это компиляции не мешает. На Паскале это uses в секции implementation (не interface!), на Си это #include из файла реализации (но не из хидера). Не так чтоб это было хорошо и правильно, но предметные области сплошь и рядом заставляют так делать, и никто пока не умер.

fluorine аватар

> крест-накрест

> крест-накрест на уровне реализаций
Я правда решил это пока вы ещё не написали этак через час после коммента.

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

Вы в главе про указатели говорили, что нетип. ук. могут понадобится в сложных программах с нетривиальными структурами данных. Видимо у меня та самая ситуация.
==
Мне кажется у меня появилась идея, как реализовать окошки в паскале. Например, какой-нибудь виджет при нажатии на него посылает сигнал (какую-нибудь переменную перечеслимого типа, вызвав vidget.parent^ и подпрограмму родителя, не обязательно даже окна, GUI же бывает многоуровневый) родителю, и например он меняет активный виджет на другой или выполняет предписанные действия, открывает файл, выходит из игры, сохраняет прогресс и т.п.

Это считается за ООП, ну или мышление в терминах объектов и сообщений.

admin аватар

Честно говоря,

Честно говоря, вообще ни черта не понял из вашего текста. Правильно вы архитектуру сделали или нет — узнаете, когда через полгода к этому коду вернётесь :-)

Новый язык.

Вопрос не содержит иронии/ издёвки.

Если C++ ужасен, но ему нет альтернатив и вообще cmustdie, то пытались(етесь) ли Вы создать собственный язык? С пониманием дела, разрабатывая не "на коленке" можно было бы сотворить нечто достойное, лишённое многих недостатков нынешних языков.

fluorine аватар

модули cppm

https://habr.com/ru/company/otus/blog/575954/

Очередной удачный теракт

admin аватар

Вот вроде и

Вот вроде и ясно уже всё с этим, но — по-прежнему удивляюсь, ну как можно быть ТАКОЙ мразью? Как этих недолюдей земля носит?

admin аватар

Мне кажется,

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

tvldslv аватар

Вот кстати,

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

admin аватар

Ну, допустим,

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

> проприетарных

> проприетарных прошивок периферийных устройств, которые устройство не может на себе хранить

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

admin аватар

Пока чип впаян,

Пока чип впаян, во-первых, прошивка уже там и никто не пытается нам рассказывать, можно её копировать/распространять или нельзя и на каких условиях. Во-вторых, её при этом в большинстве случаев нельзя поменять без программатора, а это значит, что её можно воспринимать как часть железяки, а не как софтину. Плохо, конечно, но не смертельно.

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

А этот язык

А этот язык будет супер-переносимым на любую платформу как Си? Вон с Rust'ом, который пытается на такую роль претендовать, не получится, язык слишком перегружен. Чтобы, например было как с Си, когда его компилятор могут написать студенты с хорошим уровнем знаний (вон сколько компиляторов на том же гитхабе сделанных just for fun).

admin аватар

Переносимость

Переносимость на "любую" платформу — это довольно вредный миф: я бы посмотрел на тех, кто попытается портировать Си с его побитовыми операциями, скажем, на троичную (!) Сетунь (или на её эмулятор, или на её реинкарнацию в железе, которую вроде грозятся выкатить).

Больше того, кто-то когда-то где-то видел процессор, на котором сложение и вычитание знаковых целых при переполнении генерит прерывание, и на этом основании в Си формально a+b с участием знаковых считается UB. Убил бы тех, кто это придумал.

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

А компилятор — да, должен быть прост как валенок. Вся сложность должна быть вытеснена в библиотеки.

Есть только одна маленькая проблемка: "этого языка", скорее всего, не будет.

А

А "стильное-модное-молодежное", появившееся в последнее время, например Zig или Odin, может, на ваш взгляд, развиться во что-то дельное? С GC и прочим понятно, здесь вопросов нет, но вот эти языки предлагают прозрачную работу с памятью, для Zig существуют bare metal программы (Odin до такого, как я понимаю, пока не дорос).

admin аватар

Конкретно эти

Конкретно эти два — нет, не могут. Zig уже обзавёлся "стандартной библиотекой", в которой контейнеры, треды, чего там только нет; напоминает boost в паре с STLем. А Odin, честно говоря, расхотелось дальше смотреть после предложения "Join the Odin community on Discord." Люди, которые такое предлагают, ничего хорошего породить принципиально не способны.

Zig уже

Zig уже обзавёлся "стандартной библиотекой"
Но ведь она явно импортируется при необходимости - в библиотеке Си тоже есть треды, в C++ - исключения, динамическая память и RTTI, что не мешает использовать эти языки для тех же микроконтроллеров, если не "распускать руки" и не использовать лишнего. Разве проблема в этом "фарше", если нам не нужно платить (быстродействием, уползанием в рантайм) за то, что мы не используем?

admin аватар

> в библиотеке

> в библиотеке Си тоже есть треды,

В стандартной -- нет. Только не надо про C14 и вообще про всё, что было начиная с C99 -- это уже к Си никакого отношения не имеет.

> в C++ - исключения, динамическая память и RTTI

Давайте не подменять обсуждаемый предмет, исключения и RTTI в Си++ не являются библиотечной возможностью, это раз, и они безнадёжно уродуют язык, это два. К счастью, компиляторы умеют их отключать.

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

> если не "распускать руки"

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

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

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

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

Почему вы

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

admin аватар

Нельзя никогда.

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

фактически нет работы с разделяемыми данными

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

выигрыш от использования многопоточности дает ощутимый пользователем прирост производительности

Такого никогда не бывает в реальной жизни, т.е. вот чего я никогда не видел — это чтобы сначала было показано на однопоточной программе, что она работает слишком медленно. Вообще-то потом должна быть сделана попытка загрузить параллельные процессоры обычными процессами (не тредами), причём чтобы эти процессы общались через пайпы или сокеты; затем, если будет убедительно (на практике! никаких умозрительных соображений!) показано, что в решаемой задаче слишком высок оверхед от системных вызовов (что вообще, на мой взгляд, нереально), можно ещё попробовать разделяемую память, созданную через mmap (на практике до этого не дойдёт никогда). И вот уже после этого (т.е. после никогда) можно было бы подумать про многопоточность — можно, но не нужно, поскольку существующие её реализации слишком во многом уступают модели с полновесными процессами, при этом ни в чём не выигрывают.

Подчёркиваю, на практике предварительного исследования быстродействия не делает никто и никогда; все случаи применения тредов, которые я до сей поры видел — не ответ на слишком медленную работу программы, а результат вопиющей безграмотности программистов (как правило, тупого неумения работать в терминах явных состояний, либо, что ещё хуже, обезьяньей самонадеянности типа "я не знаю, чем треды плохи — значит, они ничем не плохи").

> А тогда зачем

> А тогда зачем треды?
Ну вот, например: программе для 3д-моделирования нужно провести предварительную обработку большого количества файлов (3d-моделей) и потом использовать получившуюся информацию для отрисовки. Если использовать треды, то можно при загрузки сцены каждому треду назначить файл или несколько файлов и выделить кусочек памяти, где он будет сохранять результат этой обработки. Эти кусочки памяти не будут между собой пересекаться. После обработки треды завершаются (остается только главный поток). Возможно, при использовании процессов, разница в скорости была бы незаметна, но я не очень понимаю, зачем в такой ситуации пытаться использовать полновесные процессы через пайпы, какие приемущества это может дать или от каких опасностей тредов это может уберечь? Хотя, например, в случае какого-нибудь http-сервера, я бы точно выбрал программирование в терминах явных состояний и полноценные процессы.

admin аватар

Что, читать не

Что, читать не умеем, да? Вон с моего сайта, я тут древообработкой заниматься не собираюсь.

К счастью,

К счастью, компиляторы умеют их отключать
Ну, в общем, да, про это и шла речь. Хотя могут и пытаться включать возможности "стандартной" библиотеки даже при явном запрете - не так давно писал максимально простую прошивку под контроллер на ARM'е, так банальнейший код типа забивания секции .bss нулями в цикле и копирования .data из флеш-памяти в оперативку при старте gcc-шный компилятор изо всех сил пытался заменить на вызов memset и memcpy (естественно, роняя линковщик из-за -nostdlib). Пришлось изрядно обвесить его ключами, чтобы пресечь подобные попытки.
А вообще я, наверно, слишком высокого мнения о "программистах, не распускающих руки" и об их количестве на фоне всех прочих.
Здесь есть и ещё момент - язык, потенциально способный к работе на голом железе, едва ли будет "слишком высокоуровневым", да и вряд ли "нефоннеймановским". А после обстригания чего-то высокоуровневого до необходимого для bare metal уровня мы, отложив ножницы, с удивлением обнаружим, что опять получился Си...

"Высокоуровневость"

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

Почему? Главное, чтобы язык обладал свойсвом zero runtime. А понятие "высокоуровневости" относительно. Любой язык, за исключением языка ассемблера - формально высокоуровневый. При оценке возможности использования языка для разработки на "голом железе", более важным критерием будет являться не "степень высокоуровневости", а умение компилятора генерить машинный код без явного оверхэда.

после обстригания чего-то высокоуровневого до необходимого для bare metal уровня мы, отложив ножницы, с удивлением обнаружим, что опять получился Си

Для bare metal по-хорошему не С нужен, а ассемблер с крайне развитым макропроцессором, хотя бы. В принципе, никто не мешает генерить ассемблерные листинги даже с помощью какого-нибудь OCaml. Но логичнее, конечно, идти "от низкого уровня к высокому", а для это как раз и нужен язык, который даёт возможность создавать свои собственные абстракции. При таком подходе понятие "уровня языка" вообще становится несущественным. Формально язык, конечно, является низкоуровневым, но возможность нафигачить абстрации нужной сложности позволяет, по сути, создать DSL.

admin аватар

с удивлением

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

Вот уж ни фига подобного. Даже если применять традиционный подход с фиксацией в компиляторе всего, чего только можно, и даже если не думать о высокоуровневых абстракциях и их построении библиотечными средствами (естественно, именно библиотечными, а не средствами компилятора) — то даже в чистом Си есть что исправить: во-первых, ввести массивы как самостоятельную сущность, во-вторых, описания сделать линейными, т.е. читаемыми слева направо, а не как сейчас, да и много чего ещё. В первую очередь — ссылки, это из всего Си++ настоящий семантический бриллиант.

Останавливаться на этом никто не заставляет, следует ввести (хотя бы для структур) конструкторы с деструкторами и переопределение операций (да хотя бы даже присваивания), и вот тут нужно вовремя затормозить, поскольку виртуальность — это уже механизм достаточно сложный, чтобы в языке ему было не место. Дальше очевидным образом возникает некая операция вызова виртуального метода (в отличие от обычного), а её определение отдаётся на откуп библиотекам, то есть построение _vmt и вот это вот всё — должно быть там, а не здесь, и библиотек таких должно быть больше одной, хотя бы даже для того, чтобы множественное наследование можно было поддерживать или не поддерживать. Такой язык УЖЕ будет лучше, чем Си и Си++ (даже вместе взятые, пожалуй).

Следующий шаг — осознание того, что с перегрузкой операций нужно разбираться целиком во время компиляции, следовательно — перегруженные операции не должны быть функциями, они должны быть макросами, и конструкторы, кстати, тоже; отсюда следует, что макропроцессор должен быть не такой, разумеется, как в Си/Си++, а нормальный, работающий не до компиляции, а во время таковой, т.е. имеющий доступ к идентификаторам, их категориям, к системе типов и т.п. — вообще ко всей информации, какая есть у компилятора. Заодно избавляемся от манглинга. А ещё (ну это уже мелочь) this должен быть ссылкой, а не указателем.

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

Следующий шаг — понять, что вообще-то не должно быть такого дебильного понятия, как "ключевое слово". Например, все слова, введённые компилятором, могут начинаться с какого-нибудь знака доллара. Или вообще с обратного слэша, как в TeX'е. Дальше — что вообще-то набор операций и их приоритеты компилятором фиксировать не надо, достаточно на уровне компилятора предусмотреть некое «применение функции/псевдофункции (читай — макроса) к кортежу параметров» и средства для построения этого кортежа, а с остальным справятся макросы, введённые библиотекой. Такие слова, как if, while и прочее, можно вводить как имена макросов. В итоге тот "язык", который видит программист, будет сформирован целиком библиотеками макросов, и таких вариантов будет много, но компилятор будет для всех один и объектные модули будут одного и того же вида, без всяких, естественно, сложностей с их линковкой и взаимными обращениями. А "уровень" тут будет доступен абсолютно любой, от почти ассемблера до почти питона (с точностью до стратегии исполнения, всё-таки питон интерпретируемый, а тут будет, естественно, чистая компиляция).

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

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

Если очень

Если очень коротко - нас бы спас "Си с шаблонами" как одно из подмножеств C++? Работа с типами, метапрограммирование, вот это вот всё, да ещё и тьюринг-полное, да ещё и на этапе компиляции?

admin аватар

Если коротко

Если коротко — нет. А подробно описано выше.

Если даже учить

Если даже учить С++ по второму изданию Страуструпа, то чем и как компилить? Без шуток, gcc 2.95 выкачен в 1999, после первого стандарта.

9 из 10 нанимателей на хедхантере предлагают зп от $2K и хотят 11/14/17/STL/boost. Я правильно понимаю, что таким сразу "давай до свидания", т.к. там проблем будет больше чем на два килобакса. И не учить же их на собеседовании, как свой софт делать.

admin аватар

Компилить

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

Ну а 2K за C++ — просто смешно вне всякой зависимости от используемого диалекта. И да, если хотят C++14 и выше — туда лучше и на пять килобаксов не ходить.

О.Хре.Неть

Блин, спасибо, что не пожалели времени на такое развернутое объяснение!
Вот уж ни фига подобного
Эх, неужели это она, та самая сишность моего межушного ганглия?..

admin аватар

Сишность мозга,

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

Очень жаль.

А что порождает неуверенность? Идеализм? Так нам достаточно языка, который не будут характеризовать как нечто ужасное или необходимое зло.
Мне кажется, на такую работу можно было бы собрать достаточную сумму посредством краудфандинга. По крайней мере, я бы поддержал.
В конце концов пора начинать войну со стандартизаторами, майкрософтом, гуглом и прочими террористами, мракобесами да вредителями. Если победить их и возможно, то только качественной работой, которая им не свойственна.

admin аватар

Какой ещё

Какой ещё идеализм, наоборот — самый что ни на есть реализм. Приличный компилятор — это серьёзно. А на войне с корпорациями есть более важные задачи, чем новый язык, писать пока что можно и на C++, если при этом отличать допустимое от недопустимого.

Приличный компилятор компиляторов

А LLVM -- приличная система построения компиляторов?

admin аватар

Нет. Во всяком

Нет. Во всяком случае, на ЭТОМ нельзя реализовать язык, который я задумал.

fluorine аватар

А дракончик,

А дракончик, точнее Compilers: Principles, Techniques, and Tools, хорошая книга? Хочу создать простой компилятор, но боюсь подходить к синтаксическому анализу. Что бы посоветовали?

admin аватар

Если я только

Если я только правильно понимаю, кто такой "дракончик", то это Ахо-Лам-Сети-Ульман, так? Если да, то это не то чтобы "хорошая" книга, просто других нет :-) NB: я новые издания не смотрел, у меня есть перевод первого издания, которое ещё писали Ахо с Ульманом вдвоём. Ну, типа, классика и всё такое.

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

fluorine аватар

Да тот

Да тот самый.

Нашел ещё "Построение компиляторов" Вирта, правда там Оберон-0. Можно узнать почему вы перестали Вирта воспринимать всерьез после Оберона?

Классика CS

Ещё одна классическая книга
The Design of an Optimizing Compiler (1973)

https://kilthub.cmu.edu/ndownloader/files/12102674

Нашел ещё

Нашел ещё "Построение компиляторов" Вирта

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

В последних главах А+СД=П есть пример разработки процессора простого языка с использованием рекурсивного спуска.

Первые трансляторы арифметических формул использовали правила переписывания "в лоб". Фактически получался наивный восходящий анализатор.

Когда Ахо и Ульман писали свою книгу, уже работали синтаксически управляемые трансляторы. Да и Д.Кнут приступил к своим так и недописанным глыбам под впечатлением.

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

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

Чуть более сложный язык - язык, в котором корректна только одна программа - пустая программа ( пустой исходный файл, или файл, в котором нет ни одного символа и ни одной строчки ). Результатом сборки такой программы может быть, например, пустой или минимальный допустимый на целевой платформе исполняемый объектный модуль, корректно завершающий свою работу без ошибок. А если мы предполагаем раздельную трансляцию для последующей компоновки с модулями на нашем или других языках, то в результате должен получиться пустой или минимальный объектный модуль, который понравится компоновщику, но не содержит каких-либо данных или инструкций, которые должны попасть в скомпонованную программу. Пустая программа допустима в Си только как "единица трансляции", а в большинстве реализаций Паскаля недопустима вообще: без точки в конце Паскаль - не Паскаль. Затем допускаем программы, состоящие из последовательностей пробельных символов, например, из " \t\n\v\f\r", с таким же результатом трансляции.

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

И так далее.

fluorine аватар

Признаюсь

Признаюсь ничего не понял из вашего комментария, попытаюсь к ниму вернуться позже :-). Вообще, когда я начинал моей первой книжкой по которой я попытался изучить программирование была Программирование. Принципы и практика использования C++, Страуструпа. Книга в целом, теперь на мой взгляд нацелена исключительно на создание дресированной макаки, но вот одна глава там у меня отлажилась в сознании очень сильно. В 6 главе он описывал создание калькулятора объяснил лексемы, то как создать грамматику, как превратить грамматику в программу и все это написал и показал с использованием одного класса token_stream и показал весь процесс разработки со всеми ошибками проектирования в начале. Тогда я не смог эту главу понять, да и всю книгу впринципе, какой c++ для начинающих, но сейчас надо вернуться.

> В последних главах А+СД=П есть пример
Спасибо, не знал, что там в конце есть это. Надо будет её догрызть до конца, там изложение очень интересное.

admin аватар

Этюдик так

Этюдик так сделать можно, и даже очень полезно для общего развития. Сделать в таком режиме язык программирования, который сможет заменить Си и Си++, а заодно поставить отчётливый крест на мракобесии вроде D, Go, Rust и вот этого вот всего — заведомо не получится, к этой задаче нужно подходить с противоположной стороны.

Если что, лично я прекрасно знаю, как делать лексический и синтаксический анализ, и как объектный код сгенерить и записать в elf object file — тоже представляю, мне с этой низухой разбираться уже не нужно. Проблемы у меня, несомненно, есть, но уж точно не здесь.

Куча мелочей кроме разбора

Низуху можно поручить студентам-аспирантам.
Или тем, кто опасается приступать к синтаксическому анализу.

admin аватар

Низуху можно

Низуху можно поручить студентам-аспирантам.

За свою жизнь я отруководил больше полусотни дипломных работ, курсовые вообще не считал. Так вот, нет, студентам-аспирантам ничего поручить нельзя. Код, который они после себя оставляют, даже если как-то работает, поддержке не поддаётся и годится только на то, чтобы его выбросить. За всю, подчеркну, довольно обширную практику у меня был только один случай, когда код, написанный в ходе работы над т.н. "магистерской диссертацией", условно "остался жить" (в недрах библиотеки InteLib), и то я сильно сомневаюсь, что смогу, если что, этот код адекватно поддержать — а если не смогу, придётся откатить. Это при том, что код создавался практически в четыре руки, то есть с моим непосредственным участием.

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

fluorine аватар

>

> студентам-аспирантам ничего поручить нельзя
А что мешает аспирантам писать хороший код, мало опыта написания программ из-за учебы, которая отнимает все время, или чтобы писать хороший код нужно "побывать в мастерской" и не вариться только в университете?

admin аватар

Мой пост был не

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

А со студентами всё намного проще: у них есть "час икс", про который достоверно известно, что всё, что они делают, им (лично) после этого часа икс не понадобится. Час икс — это дата защиты диплома.

admin аватар

Очевидно же, не?

Очевидно же, не? Потому что фоннеймановское программирование и сборка мусора — сущности взаимоисключающие.

Несколько раз

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

admin аватар

Мне ответ

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

Если мы готовы отойти от возможностей базового вычислителя настолько далеко, что нас перестаёт смущать даже сборщик мусора, то тащить за собой адреса, присваивания, циклы, вообще все прелести (на самом деле, просто извращения), продиктованные машиной фон Неймана, нет никакого смысла, нужно брать в руки другие инструменты — языки высокого уровня, тот же Лисп, или Пролог, или какой-нибудь Haskell, Scala, мало ли их. Конечно, мы из компьютера больше десяти процентов его возможностей при этом не выжмем, но на языках со сборкой мусора — тоже не выжмем.

NB: лично я не считаю, что нефоннеймановское программирование — это "правильно"; я предпочитаю не забывать, что текст, который я пишу — это не абстрактный полёт мысли, а программа для вполне конкретно устроенной железки. На этой железке сборки мусора нет. Точка. Но это по моему мнению — точка; есть много сторонников мантры "люди дороже компьютеров", и в некоторых случаях эта мантра имеет смысл даже для меня — например, если программа предназначена для двух-трёх запусков, а то и вообще одного. Или когда эффективность заведомо не нужна — скриптинг ведь тоже никто не отменял. Ну и вообще, взять и в одночасье ликвидировать все нефоннеймановские языки, разумеется, невозможно, да и не нужно — напротив, хорошо иметь опыт работы с ними, чтобы, во-первых, мозги не утрачивали эластичности, а во-вторых, даже для того, чтобы понимать, как не надо (хотя, увы, это сильно не для всех).

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

Хм, получается,

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

Вероятно, это как раз была одна из задач, которую ставили перед собой авторы SICP.

admin аватар

Я своими

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

Но про SICP я бы поостерёгся восторгаться. Из вошедших в программирование по SICP'у потом вполне получаются всякие джависты и питонисты, серьёзные программисты тоже бывают, но скорее не благодаря SICP'у, а вопреки. Увы. Нельзя при обучении программированию игнорировать компьютер, иначе результатом обучения станет очередная обезьянка.

Нельзя при

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

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

admin аватар

Но и

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

Разумеется, нельзя. Ну так, на всякий случай — обратите внимание на третий том моего трёхтомника. Хотя бы на его название, а лучше — на оглавление.

Иначе получаем

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

...потому будем

...потому будем писать на Си :)

Здравствуйте!

Здравствуйте! На счёт кнопочных телефонов из недавнего интервью с Вами. Честно говоря, даже им сейчас веры нет, после статей вроде: https://habr.com/ru/post/575626/
Судя по всему, там примерно такая же ОС и приложения, как и в смартфонах, только больше ограничений для пользователя. А в плане слежки всё то же самое. :(

admin аватар

Нет там никаких

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

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

Короче говоря, это просто другой порядок риска.

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

Parthen аватар

>на кнопочниках

>на кнопочниках нет соответствующей опции.
Здрасте, я однокласснику зачем закачивал игры на Java?
Кнопочник, 2015 год.

fluorine аватар

Ещё и игры по

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

Игры

прилетала ссылка и скачивался исполняемый файл

Всмысле исполняемый? На телефонах же вроде был предустановлен рантайм для запуска байткода жабы. Такого прям, чтобы бинарники прилетали, небыло, вроде. Хотя, конечно, невыпиливаемый рантайм для жабы - это дичь, безусловно. Т.е. уже 15 лет назад начинали закидываться удочки на тему возможности установки на телефоны всякого непонятного ражна.

Уххх, вы прям

Уххх, вы прям такие воспоминания вызвали в моей голове. Да, на последних страницах газет-журналов середины нулевых кучу всяких картинок, популярной музыки и игрушек предлагалось скачать, отправив код на короткий номер. И ме-е-елким таким шрифтом внизу про цены и всякие отказы от ответственности. Бывало, под доброй половиной этих картинок один и тот же код был написан...
Ну а по java-игрушкам на кнопочниках просто сходила с ума детвора того времени, это да. Конечно, тогда никто особо не заморачивался на тему безопасности всего того зоопарка, который на переменах друг другу по блютузам да ик-портам скидывали ("Да не шевели ты мобилу, щас вырубится всё!"), но, всё же, в сравнении с нынешним смартфонным мракобесием, это было гораздо меньшим злом. J2ME, на которой писался такой софт, основывалась на Java 1.3 без модных приколюх, которыми сейчас оброс этот язык, байткод был действительно байт-кодом весьма компактных размеров, API был примитивнейшим, а жизненный цикл приложения был именно что циклом, который выходил из спячки раз в сотню миллисекунд, пинал метод для обновления и проверял какой-нибудь boolean-флажок, позволявший вывалиться из цикла и вызвать destroyApp(). Всё! И ведь в пару десятков килобайт запихивали какие-нибудь пошаговые стратежки, в которые залипали часами, всякие псевдо-3D на процах без "аппаратной плавучки". И ведь работало, и шустро! А сейчас куча слоёв абстракции, электрон (ВМ внутри ВМ внутри ВМ, а хули), приложения по полгига, да у тебя ж смарт прошлогодний, как ему не тормозить, вот это вот всё. Так что зря закопали J2ME, зря. Сейчас и кнопочников-то с ней если и найдёшь, то с кастрированной и ни на что не годной, да и что запускать-то?. Говорят, jabber J2ME-шный, вроде, существует в природе, а так заглохло всё стараниями Неназываемых...

Говорят, jabber

Говорят, jabber J2ME-шный, вроде, существует в природе

Напомнили, я себе как раз где-то в 2000-х покупал Nokia 6820, такую специфичную раскладушку с относительно полноценной клавиатурой, специально под jabber J2ME-шный.

admin аватар

Чертовщина

Чертовщина какая-то. Интересно, остались ли ещё в продаже кнопочники, не несущие на себе ip-стек.

admin аватар

А вот это уже

А вот это уже хуже, да. Просто отвратительно.

Имя массива = адрес его начала

Здравствуйте! Перечитываю второй том, и вернулся к теме многомерных массивов. Но вопрос связан не с ними. На странице 223 вы пишете что во всех случаях кроме применения sizeof и еще двух экзотических ситуаций, имя массива есть адрес его начала. Но об этих двух ситуациях ничего не сказано. Не могли бы вы рассказать о них здесь?

admin аватар

Вот за каким

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

Раз уж спросили, случаев, когда массив НЕ преобразуется к адресу своего первого элемента, формально "стандарты" вводят три: если он выступает аргументом sizeof, если к нему применена операция взятия адреса (результатом становится адрес типа "указатель на массив"; не спрашивайте меня, зачем это нужно, и что курили авторы "стандартов" — я тоже не знаю) и строковый литерал в инициализаторе массива char'ов, вроде вот такого:

   char s[] = "this is damn idiotic string";

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

Дальше прямо как в том анекдоте: "и что, полегчало?"

> здесь ещё

> здесь ещё догадаться надо, какой конкретно массив "не преобразуется"

Справедливости ради, не так это и сложно. Достаточно помнить, что записи

char s1[] = "String";
char s2[] = { 'S', 't', 'r', 'i', 'n', 'g' };

эквивалентны друг другу. А воспринимать конструкцию в фигурных скобках как что-то, что сводится к "адресу первого элемента", как-то трудновато.

Массивы

записи

char s1[] = "String";
char s2[] = { 'S', 't', 'r', 'i', 'n', 'g' };

эквивалентны друг другу

В s1[] терминирующий нуль будет конечным элементом.

воспринимать конструкцию в фигурных скобках как что-то, что сводится к "адресу первого элемента", как-то трудновато

Да вроде вполне логично. Как раз таки набор символов явно намекает на расположение в ячейках памяти. Строка как раз с такого угла зрения хуже воспринимается. Хотя и тут '\0' как бы намекает на набор байтов.

Да, забыл 0

Да, забыл 0 добавить :( Ох уж этот синтаксический сахар...

> Как раз таки набор символов явно намекает на расположение в ячейках памяти.

Так-то да, этот набор и лежит где-то в памяти (м.б., в .text или .rodata), но дело немного о другом. Когда мы содержимым этой области памяти заполняем массив символов, созданный, например, на стеке, то вряд ли будем думать об адресе этой области, скорее уж об её содержимом. В добавок ко всему, конструкцию в фигурных скобках нельзя, например, в фукцию передать или присвоить указателю на const char (т.е. адресной переменной), а строковый литерал как раз можно.

Знакомьтесь, Си

Драсте. Ну значит-с занялся я изучением второго тома. Уже прошел часть про Си. И очень им заинтересовался, поскольку: "ВАу! На нем написана целая ОСь которой я пользуюсь! ВАу!". У меня возникло два вопроса.
1) В вашем томе, я так понял, описаны почти все возможности языка Си (их правда мало, чувствуется связь с ассемблером). Я хочу продвинуться дальше. И поглядываю на разного рода библиотеки. То бишь, на моем, получается, начале пути, не будет ли вредно пользоваться готовым решением др. программистов? (библиотек и всего прочего). А также, на что обращать внимание при выборе литературы? Куда ни глянь, везде так и пестрят C98, ANSI C, т.е. стандарты, которые я тоже недолюбливаю.

2) Отсюда вытекает второй вопрос. Вот вы сказали, что рисование окошек вредит мышлению. Не имею ничего против, хотя свистоперделки именно делать очень нравится (и я уже как-то у вас спрашивал и вы ответили, что если сам напишешь библиотеку всех этих "менюшек и окошек", то это будет полезно. Попробовал - абсолютно согласен. Правда времени ушло много и все что я получил... Да.). Но, напротив этого, вы же приводите целый параграф изучения ncurses, и в конце упомянули menu, panel, cdk. Т.е., как я понял, готовые библиотеки для рисования окошек, менюшек, и даже (!) целых виджетов наподобие кнопок. Неужели к этому моменту я должен постигнуть таких высот, чтобы не париться об этом? :)

P.s. Хочу отметить, что когда я начал изучать про ncurses, я начал думать, дескать: "как бы выглядела моя программа? Мм, да, вот тут окошко, здесь вылезающая менюшка...". Это и есть нечто плохое?

admin аватар

Так-с, ну прежде

Так-с, ну прежде всего: "продвинуться дальше" и "поглядывать на библиотеки" — это противоречащие друг другу тезисы. Если хотите продвинуться в программировании, надо учиться своё писать, а не чужое пользовать.

ncurses я в книжку включил по достаточно простой причине: в псскалевской части есть crt, как бы нехорошо при переходе на Си понижать множество доступных возможностей. А самостоятельно сделать аналог ncurses довольно сложно, слишком многое нужно учитывать (например, базу данных по возможностям различных терминалов, известную под именем termcap — тут ещё такая сложность, что её тупо не на чем проверять, где вы сейчас какой-нибудь VT52 найдёте).

По поводу выбора литератувры конкретно по Си нужно обращать внимание, очевидно, на год издания. Всё, что после 1999 года, как правило, ориентировано на C99 (и более поздние так называемые "стандарты"), а это уже не Си, это коллективный бред стада агрессивных дебилов. Книги, подобные моей — изданные после 1999 года, но C99 не рассматривающие — возможно, встречаются, но мне не попадались. Впрочем, я сомневаюсь, что вам нужна литература именно по Си, этот язык во втором томе рассмотрен достаточно подробно. Вот по языкам из третьего тома, если их профессионально осваивать, дополнительная литература потребуется, это без вариантов.

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

Ну а продумывать вид рабочего экрана, разумеется, рано или поздно придётся, если вообще предполагать использование полноэкранного интерфейса. Вопрос не в том, какие мысли, вопрос в том, когда, то есть на каком этапе они начинают приходить в голову. Когда функциональность программы более-менее определена (с точностью до файлов и их форматов, например, а также всяких используемых сетевых протоколов и прочего), и автор программы, например, понимает, как должна выглядеть эта программа, если полноэкранного интерфейса к ней не будет (например, будет какая-нибудь командная строка типа gdb'шной или что-то ещё), то да, продумывать внешний вид интерфейса уже можно начинать. Если же мы ещё толком не поняли, что программа должна делать, но уже начинаем думать про окошки и менюшки — ну, это плохо. Это вообще ужасно.

сделать аналог

сделать аналог ncurses довольно сложно, слишком многое нужно учитывать (например, базу данных по возможностям различных терминалов, известную под именем termcap — тут ещё такая сложность, что её тупо не на чем проверять, где вы сейчас какой-нибудь VT52 найдёте).Но сделать аналог crt или минимального подмножества curses не сложно, если cпециально не усложнять.
У нас нет сейчас острой необходимости повторять хитрости авторов vi, curses и EMACS, чтобы обновлять экран кратчайшей последовательностью команд, используя особенности терминала прошлого тысячелетия, который нам никогда и не встретится, если мы не займёмся археологией.

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

  • Сброс
  • Очистка экрана
  • Перемещение курсора в заданную строку и колонку
  • Изменение атрибутов текста(подчёркивание, инверсия, цвет и т.п.)

С автоматическим определением размеров окна эмулятора чуть сложнее, но это и curses в свое время не умела, так как пользователи не могли произвольно изменять физические размеры CRT терминалов подобно тому, как это стали делать позже пользователи программ, подобных xterm.

Для ТС: скачать ненавистный стандарт можно бесплатно без регистрации на официальном сайте
https://www.ecma-international.org/publications-and-standards/standards/...

Стандарт стандартом, главное - тестирование понимания и поведения существующих реализаций.

Доброго

Доброго времени суток! Честно, не люблю задавать вопросы, так как считаю, что в интернете есть все, но в этом случае я просто запутался. В данном случае экспериментировал с многомерным массивом после прочтения части по си. Если руководствоваться примером из книги (варианта в 4 томах), то создаю указатель на массив я правильно, с передачей его, как параметра, пришлось уже потанцевать. Неужели эта функция может работать только с такой "шириной" и написать ее в более общем виде нельзя? Заранее извиняюсь, если вопрос глупый. Честно говоря, не успел еще освоиться в си.

#include 
#ifndef HEIGHT
#define HEIGHT 50
#endif

#ifndef WIDTH
#define WIDTH 70
#endif

void show_ground(char (*ground_ptr)[WIDTH])
{
        for(int i = 0; i < HEIGHT; i ++)
        {
                for(int j = 0; j < WIDTH; j ++)
                {
                        printf("%c", ground_ptr[i][j]);
                }
                printf("\n");
        }
}

int main()
{
        char main_ground[HEIGHT][WIDTH];
        char (*ground_ptr)[WIDTH] = main_ground;

        for(int i = 0; i < HEIGHT; i ++)
        {
                for(int j = 0; j < WIDTH; j ++)
                {
                        main_ground[i][j] = 35;
                }
        }

        show_ground(ground_ptr);
        return 0;
}

admin аватар

На практике

На практике указатели на массивы в явном виде применяются крайне редко — я не случайно в книжке написал, что всей этой машинерией не владеет каждый второй профессиональный сишник. Обычно функции такого рода пишут как работающие с одномерным массивом, а координаты (строка,столбец) переводят в расстояние от начала массива "руками", это проще, чем вот эти вот все "танцы".

Плюс доступ к

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

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

admin аватар

У меня, когда я

У меня, когда я подобное слышу, автоматически возникает вопрос: понимаете ли вы, что двумерные (и вообще многомерные) массивы в Си реализованы без каких бы то ни было намёков на массивы указателей? Ну то есть хорошо ли вы понимаете, что, если я описываю

    int m[10][20];

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

Да, я понимаю,

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

Я просто подумал, что человек, задавший вопрос, почему-то захотел пользоваться двумерным массивом, реализованным именно как массив указателей на массивы - так ведь тоже можно сделать (объявив массив по-другому), и синтаксис обращения к элементу, насколько я помню, останется таким же: a[2][2] (компилятор, кажется, в разные конструкции это преобразует - для обычного двумерного массива в *(a + 2 * n_cols + 2), а для массива указателей в *(*(a + 2) + 2) ).

В С массивов нет

Я просто подумал, что человек, задавший вопрос, почему-то захотел пользоваться двумерным массивом, реализованным именно как массив указателей на массивы

Скорее всего человек уже испортил себе мозг какой-нибудь жабой и теперь усложняет реализации. Ну вот нет никаких массивов на уровне железа, есть последовательность байт. Из этой последовательности можно лепить что нужно. И какой массив будет по размерности - это дело десятое. Это вот стремление к манипуляциям массивами (которых, внезапно, в С нет) "целиком" - явное следствие разработки на ЯП со встроенной структурой данных "массив", жабой там, или, не дай бог, пайтоном.

admin аватар

Ойдаладно. На

Ойдаладно. На уровне железа и ветвлений с циклами нет, одни переходы. И процедур с функциями тоже нет, только куски кода и адреса. Что ж теперь, удавиться с горя?

Массив — абстракция вполне себе годная, как, впрочем, и запись/структура/кортеж, как его/её ни называй. И что в Си их нет — уж точно не достоинство Си, а наоборот.

Массив - дело тонкое

С одной стороны, таки да - полноценных массивов в С хочется.

А вот с другой- как только мы хотим в языке иметь полноценные массивы возникают такие вопросы как:

1)А как мы будем их передавать в функции/процедуры/подпрограммы? По ссылке или по значению? И если по ссылке, то что будет с консистентностью семантики?
2)Какие у нас будут языковые возможности по работе с этими массивами как с сущностями - размер узнать можно? а под-массив можно выделить? и т.д.
3)А что делать с массивами размеры которых при компиляции неизвестны - как именно с ними работать можно будет? Пусть даже, как в С, сама аллокация и вынесена в библиотеку - описывать-то такие сущности (или их пререквизиты) как-то надо.

Понятно, что на все эти вопросы ответить можно, но ответы будут влиять на runtime library, семантику и синтаксис. В результате имеем на одном конце "шкалы" С c его недомассивами и семантическим монстриком из простыни в примере, а на другом-нет, даже не python (причем в python массивов-то вообще-то нет. Они там появляются если поставить и подключить соответствующие модули), а относительно современный (начиная с 90-го) Fortran
в котором можно написать зверя вида:

A(::2)=SIN(B(SIZE(A):1:-2)

Но во что именно оно при компиляции превратиться (и когда какой компилятор на ней переклинит) - лучше не думать.

Впрочем можно даже и на уровне F77. Конструкции вида

INTEGER :: A(-1:1,2,2), B(3,5)
СALL DO_SOMTH(A(-1:0,1,2), B(:,4))

уже делает работу с массивами (для компиляции и runtime) сравнительно трудоемкой.

admin аватар

Я не сказал бы,

Я не сказал бы, что в наши дни стоит всерьёз опасаться этих вопросов. Есть пример версий Паскаля от Borland (позже -- от Embarcadero), где вполне себе уживаются классические паскалевские массивы, размер которых зашит в их типе, динамические массивы, размер которых можно менять встроенными процедурами, и адресная арифметика прямо-таки в сишном виде. Получилось, возможно, не очень красиво, но по мне так это, как водится, из-за груза совместимости с предыдущими версиями.

А что будет с zero runtime?

И это всё не требует поддержки runtime библиотеки? Что-то я в сомнениях. Особенно в части динамические массивы, размер которых можно менять встроенными процедурами

Мы же разговор начали с С, а не с поддержки массивов вообще.
Т.е. можно ли было бы добавить в С полноценные массивы, сохранив его достоинства?

Нединамические

Нединамические массивы с границами, неизвестными во время компиляции были ещё в Алгол-60

begin integer n, m;
n := get_n; m := get_m;
begin
array a, b, c [7:n, 2:m], s [-2:10];
comment real по умолчанию;
Динамические в этом языке более неуклюжи.

В gcc с давних времён было аналогичное расширение.

admin аватар

Насколько я

Насколько я понимаю, это ровно то, что в C99 и более поздних "стандартах" называется VLA. Для меня это основная причина недопустимости применения C99 и всего, что за ним последовало.

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

admin аватар

Динамические

Динамические массивы в поздних версиях Turbo/Borland Pascal представляли собой откровенную полумеру, полноценная адресная арифметика, если я правильно это помню, появилась то ли в 7.0, то ли вообще уже в Delphi. Если изначально считать, что адресная арифметика должна присутствовать, то без этой полумеры (да, несомненно требующей поддержки от runtime, ибо там нужна динамическая память) можно вполне обойтись.

Что до адресной арифметики в сочетании с полноценными массивами, то я тут вообще никакой проблемы не вижу. Адресная арифметика вводится точно так же, как сейчас в Си, и объявления массивов — точно так же, как в существующем Си (ну, с точностью до того, что, наверное, "сложные описания" стоит сделать всегда идущими слева направо, но это уже другой вопрос), просто имя массива остаётся именем массива и к адресу первого элемента приводится только явно. Или можно даже разрешить неявно, но только тогда, когда "припрёт" -- например, при присваивании указателю соответствующего типа. Квадратные скобки станут чуть более полиморфными, но они и сейчас полиморфные (в смысле, работают с разными типами по-разному).

обычный

обычный многомерный массив - это просто последовательность байт, лежащих впритык друг к другу Может быть и не совсем впритык, а с выравниванием и заполнением.

admin аватар

Это вы путаете

Это вы путаете со структурами.

А вот кстати,

А вот кстати, вопрос.

Предположим, у нас есть структура с 3 полями типа char, int и short. В 90 процентов случаев эти поля будут занимать в памяти соответсвтенно 1, 4 и 2 байта, и компилятор, скорее всего, расположит элементы в порядке "int-short-char", добавит структуре лишний байт для округления (чтоб было 8, а не 7), и будет следить, чтобы вся структура всегда лежала в памяти по адресу, кратному 4 (чтоб процессору легче было из структуры инты выдирать).

А если рассмотреть массив (без разницы, какой размерности) таких структур, то могу ли я сказать, что компилятору придется и массив разместить в памяти так, чтобы первый его элемент (а значит, и каждый) обязательно располагался по адресу, кратному 4? То есть, получается, выравнивание по расположению в памяти и для массивов верно?

Sizeof всегда

Sizeof всегда кратен выравниванию в Си. Для нарушения правил выравнивания в компиляторе могут быть прагмы или ещё какие-то хитрости, но тогда и выравнивание всей структуры может получиться более мелкое.

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

admin аватар

Тут вот это вот

Тут вот это вот "кратен выравниванию" допускает разные толкования. Насколько я понимаю, он кратен наибольшей величине выравнивания, применённой в данной конкретной структуре. Например, если в структуре все поля типа char, то её sizeof вполне может быть вообще нечётным, то есть никакого выравнивания не будет — но для char'ов оно и не нужно.

admin аватар

Если мне

Если мне склероз не изменяет, компилятор не переставляет поля местами, он только имеет право вставлять неиспользуемые байты для выравнивания. А ещё там действует какое-то хитрое правило, что размер структуры целиком, если в ней есть хотя бы один int, будет кратен sizeof(int), и то же самое для short, вот для long'ов не уверен.

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

компилятор не

компилятор не переставляет поля местами
Сишный -- нет, но, кстати говоря, есть языки, где может переставлять для экономии памяти, если явно не запретить. Zig, в частности.

admin аватар

Судя по

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

Впрочем, простыня вообще производит удручающее впечатление. С одной стороны, целочисленные константы вводятся олдскульно макропроцессором, а с другой — описание переменной цикла в заголовке цикла, я себе такого даже в плюсах не позволяю, откуда это изначально пришло, а уж в чистом си такое писать... гм... вот прямо на канделябр нарываться. Я даже не уверен, что это новомодные стандарты позволяют, по-моему это gnu extension.

Мне кажется,

Мне кажется, чтобы начинающий сишник понял, в чём здесь дело, ему нужно вернуться «в начало» - осознать, что таки в Си нет массивов, они эмулируются указателями, и что конструкция x[i] - это в точности вот что: *(x+i)
Соответственно, x[i][j] - это в точности вот что: *(x[i]+j), или, раскрывая дальше, *(*(x+i)+j)
Далее надо вспомнить, что выражение вида a+b, где a - указатель, b - целое, это не адрес следующей ячейки памяти, а указатель на следующий элемент последовательности, на которую указывает a, т. е. если a имеет тип int *, то в плоской модели памяти на 32-битном процессоре a+1 будет указывать на ячейку памяти на расстоянии 4 байта от a, а если b имеет тип char, то (b+1) будет указывать на ячейку памяти на расстоянии 1 байт от b.
Соответственно, если x имеет тип "указатель на массив длиной в десять int" - то x+1 будет указывать на ячейку на расстоянии 10*4=40 байт от x.
Именно поэтому автор исходного вопроса прав — без WIDTH никак не обойтись, ни предложенным им способом, ни переводя вручную.

admin аватар

В книжке это

В книжке это параграф 4.9.1, там всё это есть, и ТС его наверняка читал, иначе вряд ли догадался бы, что этот монстр в Си вообще присутствует. Проблема, подозреваю, не в этом.

Спасибо всем, кто ответил!

Некоторые уже похоже даже поставили крест на моем успешном освоении языка в будущем xd

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

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

По поводу массивов. Что важнее. Поигрался несколько дней с ними. Я планировал найти удобоваримое представление для своих элементов двумерного поля. Конечно, я вполне отдаю себе отчет в том, когда элементы лежат подряд. И даже понимаю, почему нам нужна "ширина" для работы с двумерным массивом. Почему бы мне просто не создать указатель и не выделить память вручную, вместо того, чтобы использовать одномерный массив и положить в него двумерный массив, что уже с самого начала порождает нелогичность.(: Керниган и Ритчи в своей книге вообще по-моему по приколу написали про multi-dimensional arrays. Точнее про передачу их в функцию. Что это за функция будет такая, которая работает с массивом только одной ширины, но разной длинны.

admin аватар

по поводу

по поводу использования макроопределений

В действительности всё не столь однозначно. Во-первых, enum'ы предназначены не для этого, так что получается очередной хак (ну хотя Си из хаков практически состоит, так что одним больше, одним меньше, не шибко большая разница). Во-вторых, константы бывают не только целочисленные, и для всех остальных по-любому придётся использовать макросы, так что я вполне понял бы программиста, предпочитающего макросы использовать для любых констант, в том числе и целых, просто из соображений единообразия. Ну и в-третьих: вы использовали технику, которая довольно широко применяется — если символ не определён, определить его неким значением по умолчанию, а вот если определён, то пусть так и будет. Это, как мы понимаем, позволяет, не меняя исходник, поменять значения констант в получаемой откомпилированной программе, задав соответствующие значения в командной строке компилятора. На enum'ах такого не сделать.

по какой причине плохо использовать данную возможность?

По такой, что в языке Си этой "возможности" нет. А C99 — это уже не Си, это бастард. Если допустить из него хоть что-то, будет крайне сложно объяснить, например, партнёрам по проекту, почему нельзя применять те же VLA.

один небезызвестный

Я таких только лично знаю не один десяток (хотя конкретно этого вашего ютьюбера лично не знаю), и что теперь, пойти утопиться?

Керниган и Ритчи в своей книге вообще по-моему по приколу написали про multi-dimensional arrays

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

по-моему это gnu

по-моему это gnu extension
Увы, C99 и новее...

admin аватар

?! ну в C11 я бы

?! ну в C11 я бы поверил

Нет, это С99.

Нет, это С99. Здесь (пункт 2), например, можно посмотреть. Вроде это даже тут где-то обсуждалось.

А здесь можно вещи похлеще найти.

fluorine аватар

Конечные пользователи

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

admin аватар

Я думаю, можно

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

Devuan

Здравствуйте, какой devuan лучше поставить: первую jessie(LTS) или последнюю версию chimaera.

TL;DR Если нужен

TL;DR Если нужен именно Девуан, то лучше ставить Beowulf и не обновлять его до Chimaera.

Недавно пытался поставить server-редакцию Химеры (4.0), установщик даже не загрузился, у него не получилось создать/открыть какой-то файл и он ушёл в цикл, пытаясь его открыть/создать. Бэовульф (3.0) спокойно загрузился и поставился, затем я обновил его до Химеры. Весь мой мир ужаснулся, когда я увидел ЧТО лезет из репозиториев при попытке поставить OpenSSH (я делал минимальную установку, поэтому в меню при установке не выбрал OpenSSH). Он на серьёзных щщах тянул за собой в зависимостях пакеты adwaita-icon-theme и всякое *-gnome. На сервере без иксов, где только голая консоль. Я не стал об этом репортить (не знаю как это делать, да и после шока не было желания) и пошёл поставил другой Линукс-дистрибутив.

Вообще, я уже не в первый раз замечаю такие проблемы с зависимостями у не очень популярных дистрибутивов. Поэтому хотел бы попросить обращать внимание на то, что packet manager тянет в зависимостях.

admin аватар

Жёстко.

Жёстко. Интересно, у Дебиана аналогичной версии такая же хрень творится? Вроде пакетная база у них почти общая.

Я поставил

Я поставил Дебиан 11, тоже без OpenSSH. Там в зависимостях всё нормально оказалось, специально проверил. У меня ощущение сложилось, будто мейнтейнеры Девуана просто по ошибке что-то куда-то не туда в конфигах сборки/зависимостей написали

admin аватар

Зависимости

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

Но что openssh за собой гнома потянул — это где же так накосячить-то надо было, а?...

Вы меня

Вы меня заинтересовали :-)

Скачал я файл Sources.gz по ссылке http://deb.devuan.org/merged/dists/chimaera/main/source/

Там есть такие строки:
Package: openssh
Binary: openssh-client, openssh-server, openssh-sftp-server, openssh-tests, ssh, ssh-askpass-gnome, openssh-client-udeb, openssh-server-udeb

Пошёл сюда: https://packages.debian.org/stable/gnome/ssh-askpass-gnome
Там такая строка:
Этот пакет был отделён от основного пакета openssh-client для того, чтобы openssh-client не зависел от GTK+.

В дебиане, кстати, openssh зависит от systemd (даже в отрыве от гномозависимостей, во прикол): https://packages.debian.org/stable/openssh-server

dep: libsystemd0
библиотека утилит systemd

Так что, видимо, всё таки спеку они меняли

admin аватар

Потому и

Потому и меняли, ага. Так а это что получается, openssh сам по себе превращается в метапакет, который ставит их все сразу? То есть можно поставить отдельно openssh-server и сам ssh, тогда всё будет нормально, но это же ещё знать надо...

Beowulf будет в

Beowulf будет в самый раз. В Chimaera sudo идет из коробки, каких ещё "сюрпризов" ожидать от него непонятно. Жалею, что установил четвертую версию.

admin аватар

sudo по-моему во

sudo по-моему во всех из коробки, не? apt-get remove спасёт гиганта мысли.

admin аватар

jessie, я бы

jessie, я бы сказал, старовата. Странно, что нет более поздних LTSок.

Игорь аватар

Ребёнок и компьютер

Решил тут поделиться родительской мыслью.

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

А ребёнок-то постоянно у меня допытывался, Папа - какой у тебя пароль-то? Ну какой?

И я решил, так заведу просто сыну учётку, без прав на запуск иксов и прочего, пускай себе в консольке сидит. Сказано - сделано. Учётку создал, пароль он сам установил на неё.

И там есть парочка консольных игрух, типа ctris, cavezofphear и freepascal. И сегодня ушёл на работу, а сам поглядываю - зашёл или нет? Что запустил. Так ведь зашёл малец, сперва понятно игрухи видимо поиграл, но сильно долго-то в них всё равно надоест, и пошёл он в fp. Понимаю, что IDE - зло, но пока показал ему так. Более того, у меня книги ваши лежат на столе и значит первый том он взял, я ему показал там парочку листингов (простейших, где writeln'ы только), что типа вот по этой книге паскалю можно отлично научиться.

И вижу что в домашнем каталоге появляются .pas файлы, со всякими там writeln'ами и выражениями.

Т.е. реализуется схема вида: Ребёнок остался один на один с консолью и книжкой и интересом чего-то поделать и в остальном с полной свободой действий :)
Поглядим что будет получаться. Буду приходить и появившиеся за день вопросы и непонятки объяснять и какие-то базовые понятия связанные с ОС и консолью разъяснять.

Блин, дайте в 6

Блин, дайте в 6 лет ребенку быть ребенком! Вот у меня у самого ростет ребенок 6-ти лет. Ну блин, ребенок ведь! Не надо обирать детство из-за каких-то своих амибиций. Ему в жизни хватит еще всего этого!

Parthen аватар

Крайне несогласен

Вот у меня в детстве самая ненавистная фраза была "Тебе еще рано". И физику мне рано, и писать научиться мне рано.
Хватит делать из детей непонятно что. Хочет ребенок и занимается.

Никто не спорит

Никто не спорит с тем, что ребенку надо давать делать то, что он желает. И ничего не рано, если ребенок сам хочет! Но в конкретном случае я вижу желание папы (само желание не есть плохое) посадить ребенка в 6 лет за комп именно для того, чтоб освоить, например, консоль. А ребенок хочет играть! Потому тут я вижу амбицию папы, а ни желание ребенка. А это не есть правильно. Так можно получить результат противоположенный желаемому: у ребенка эта ситуация осядет в памяти, он запомнит, как хотел играть а вместо этого папа его посадил за консоль, и потом в жизни из-за принципа будет сидеть на Виндовс.

Уж лучше тогда подыскать игру, которая ребенку будет нравится и при этом развивает определенные навыки: вот от этого пользы будет заметно больше! И купить в придачу конструкторов несколько. Можно и разных. Пускай делает из них, что ему придет в голову!

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

Как-то так...

admin аватар

Да вот нету тут

Да вот нету тут никакой амбиции папы. Ну то есть она, может, и есть, но ребёнку этого не видно: он же в комп, в эту самую командную строку, лазит тайком от папы, пока папа на работе!

admin аватар

Кстати да, у

Кстати да, у меня в целом та же фигня, поэтому я тут спорить полез. Хотя у меня ещё и дополнительное пикантное обстоятельство: фразу "тебе ещё рано" и её аналоги я слышал только от бабушки, остальные взрослые, окружавшие меня в детстве, оказались более адекватными. А бабушка умела офигенно вкусно готовить, но этим её достоинства исчерпывались.

Что значит быть ребёнком?

Oliver, все дети разные! Что делать, если у ребёнка не вполне получается быть ребёнком?

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

admin аватар

В упор не вижу,

В упор не вижу, где тут у ребёнка "не получается быть ребёнком". Очень даже получается. Да и как это вообще может "не получиться" быть ребёнком?

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

admin аватар

Какие нахрен

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

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

Что означает

Что означает "грузят цифрой три"?

admin аватар

Ну типа вот тут

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

Мой 6-ти летний

Мой 6-ти летний малой тоже у компа проводит некое время. Сегодня время провождение времени за компом у ребенка - не есть новость. Сегодня куда труднее ребенка от этого самого компа оттащить! :)

admin аватар

Оттаскивать,

Оттаскивать, насколько я могу судить, бесполезно. В обсуждаемой ситуации получилось намного лучше: вместо того, чтобы гонять всякие стрелялки, ребёнок развивает собственные мозги. Причём, что характерно, сам развивает, добровольно, даже слегка "тайком от папы". Я бы сказал, epic win.

Когда надоест

Когда надоест комп, пусть попросит Деда Мороза принести пару макеток, батареек, мешок транзисторов и светодиодов, а также техническое описание PDP-8

fluorine аватар

А сколько ему

А сколько ему лет? Я просто представляю 6 летнего ребёнка, и как он в консоли сидит.. Классно, что вы его знакомство с компьютерами начали с консоли. Тех кто не знаком с GUI намного легче пересадить на консоль, иначе начинаются претензии, что мол на дворе XXI век.

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

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

Правильная консоль?

> представляю 6 летнего ребёнка, и как он в консоли сидит.. Классно, что вы его знакомство с компьютерами начали с консоли.

6-летнему ребёнку может быть интереснее и полезнее консоль из лампочек, проводочков и кнопочек, а не эмулятор терминала на фреймбуфере.

admin аватар

Может, и да. А

Может, и да. А может, и нет. Пока что точно известно, что консоль его заинтересовала. Заинтересуют ли его лампочки и кнопочки — можно проверить только одним способом: подсунуть эти самые лампочки с кнопочками и посмотреть на результат.

Ламповая консоль

Если на третьем бите заскучает, то цифровую электронику можно отложить на 3-4 года.

> Я в дестве, мог

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

Вам крупно повезло, что не получили тяжелые травмы! Тут кичиться абсолютно нечем! Не всем детям так везет

fluorine аватар

Знаете у меня

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

От гиперопеки в современном мире нужно избавляться, имхо. Я вообще убежден, что детей нельзя растить в городе. Только в селе, только хардкор, чтобы и имунитет укреплялся, и чтобы к природе и к животным привык, а не то, что я вижу у своих взрослых братьев и сестер, которые живут в городе. Человек радовался! Радовался, что есть в многоэтажке площадка для игр. Я бы в таком доме не то, чтобы не жил и растил детей, я бы ни за какие пряники бы туда не пошел. Иначе начинается, вот он в грязи повалялся, теперь микробов нахватается, давайте сейчас его укутаем на зиму, так чтобы ему жизнь сахаром не казалось и т.д. Если что я с 8 класса живу в городе по учебе и сейчас 2 курс, я у себя дома код пишу в 2 раза быстрее, потому что нет такой информационной нагрузки, всяких баннеров, звуков машин, рекламы на каждом сантиметре, спасают только горы в выходные

admin аватар

Ага, а потом мы

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

Да, для развития полноценной личности необходим определённый риск в детстве, тут никуда не денешься. Иначе медуза аморфная вырастет.

Разумеется, все

Разумеется, все должно быть в меру, в том числе и родительская опека, но вот когда ребенок со спичками играет возле бензина, это - уже недоопека!

admin аватар

Проблема, к

Проблема, к сожалению, именно в том, что отследить возникновение такой ситуации, которая уже за гранью, без гиперопеки невозможно. Ну то есть стоит, несомненно, объяснить, что легковоспламеняющиеся жидкости — это несколько опаснее, чем может показаться по их внешнему виду, и даже, пожалуй, продемонстрировать -- ну там взять баночку из-под паштета, налить в неё грамм 50 бензина и где-нибудь в безопасной обстановке показать, как оно вспыхивает, как горит, что будет, если тушить водой, как надо тушить правильно, что будет, если разольётся, ну чтобы растущая личность не переоценивала свои возможности в укрощении стихии. Но полностью исключить ситуации, которые (да, согласен) уже на грани криминала, можно только одним способом — следить за каждым шагом. А это и есть гиперопека, увы.

Есть такая

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

admin аватар

Откуда она

Откуда она взялась — понятно, меня больше волнует, к чему она приводит. Да ещё государство со своими дебильными законами её, опеку эту, всячески стимулирует.

Парадигмы надо менять, иначе вокруг будут одни медузы.

Игорь аватар

6 лет, из кода -

6 лет, из кода - мы с ним залезли в исходники консольного тетриса ctris, я конечно залез, но с ним вместе смотрели, я ему показал где задержка и как она формируется и сделали её чуть больше с целью чтобы тетрис не был таким хардкорным :)

А мне рассказывать, я же тоже из диких СССР'овских времён, когда дети проводили детство на улице, не уткнувшись в смартфон. Так что тоже являюсь представителем тех что выжил вопреки своей любознательности :)

admin аватар

Вот нафига

Вот нафига IDEшку-то показали? Если он так лихо справляется с консолью, то что же, с каким-нибудь nano и запуском компилятора не справится?

Игорь аватар

Да справится

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

А вообще играть

А вообще играть Ваш ребёнок любит? С чем-нибудь кроме компьютера?

Игорь аватар

Играть любит

Играть любит конечно. В запоминалки (50 карточек попарных), шашки, шахматы. В игры с бумагой и ручкой. Охоты на лис там, морской бой и прочие крестики нолики.

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

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

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

А так сам по себе весёлый и забавный ребёнок.

Если в садике скучновато

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

А в школу в этом году не отдали, потому что ещё не было шести лет на первое сентября?

В таком

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

А коллектив из двух десятков сверстников - не совсем естественный. 2-3 года разницы (+/- в школьном возрасте) оптимально, если есть общее дело и интересы (условынй детский хор).

> В таком

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

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

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

лего

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

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

> С лего есть

> С лего есть довольно большая опасность в том, что лего формирует "квадратно-гнездовой" способ мышления

Очень сомнительное утверждение.

admin аватар

Зря, кстати,

Зря, кстати, сомневаетесь. Такая проблема реально существует, и не только с лего, вообще с любыми конструкторами, где детали могут скрепляться между собой только фиксированными способами, условно говоря, где все углы прямые, а если не прямые — то только потому, что так задумано (в смысле, задумано создателями конструктора). Это тоже своего рода парадигма: есть некто, который "так задумал", и мы делаем так, как "он" задумал, а сами ничего задумать не можем.

Parthen аватар

Конкретно ЛЕГО

Конкретно ЛЕГО (оригинальное) вещь великолепная -- там детальки так устроены, что их можно и под углами ставить и я этим часто пользовался.
Вот есть Lego Duplo, вот это да, такое себе

Классический

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

лего-роботс и

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

admin аватар

Дети разные

Дети разные бывают. В в 10-11 уже кое-что ставить поздновато, например, если к этому времени не сформировалось понимание "что такое умножение", то и не сформируется.

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

Да и вообще "рассказывать" бесполезно в большинстве случаев. Нужно, чтоб сам захотел узнать, но при этом рассказывать не требуется, требуется только отвечать на вопросы и подсовывать нужные источники информации.

Разумеется,

Разумеется, время покажет, понял он их на самом деле. И разумеется, дети - разные. Моя мысль заключается в том, чтоб ребенку давать то, что будет разивать его мышление, что потом в жизни ему очень поможет понимать самые разные вещи. Любому ребенку. Как-то так...

admin аватар

Вот только не

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

Развитие мышления

От работы с компом тем или иным способом замечательно развивается умение работать с компом этим способом.

admin аватар

С таким же

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

Parthen аватар

off-topic

А что развивает игра в прятки?

admin аватар

Да до чёрта

Да до чёрта всего. Как и любая коллективная игра — навыки социального взаимодействия. Потом, естественно, умение быстро бегать. Умение оценивать свои силы и чужие возможности (вот добегу я сейчас до выручалочки или меня водящий заметит и успеет быстрее?) Наверняка специалисты ещё что-нибудь отметят.

admin аватар

Польза

Польза — понятие относительное. У меня в детстве были и конструкторы, и пластилин. Чего я никогда не делал — это не собирал из конструкторов ничего такого, что предлагалось в прилагаемой к конструктору книжке. Вот то есть я вообще не понимал, как это так — собирать то, что "надо", это же мой конструктор, что хочу, то и делаю; получались всегда исключительно бесформенные и дебильные хаотические соединения деталей. И из пластилина я никогда не лепил "что-то", просто зачем-то мял его в руках, получались всякие шарики, колбаски, блинчики, в целом "непойми что".

Не знаю, может, на мелкую моторику это как-то и влияло, но в целом полезность всей этой деятельности мне кажется сомнительной.

Assembler и дальнейшее обучение

Учусь по трехтомнику ("Программирование: введение в профессию"). До изучения ассемблера было очень интересно учиться, однако после.. После стало как-то не так, единственное что интересует сейчас - разобраться с сетями; есть ещё идея перейти на программирование микроконтроллеров (там ассемблер, + хочу разобраться с электрическими цепями и т.д.). Вопросы: могу ли я прочитать главу по сетям ( просто для саморазвития) и "программист ли я на самом деле" (Из предисловия - программированием заниматься можно только тогда, когда это "в кайф"; у меня же пропало желание этим заниматься, хотя оно было)?
Также хочу выделить пункт про микроконтроллеры - (если я всё же программист) можно ли залезть в ардуино (на первое время) или надо сразу перейти к низкому уровню (т.е. голые мк)?

Микроконтроллеры и ассемблер

есть ещё идея перейти на программирование микроконтроллеров (там ассемблер

Дался вам этот ассемблер ) Не надо на нём так циклиться - это просто ЯП. Разрабатывая под микроконтроллеры отличается в основном только необходимостью знания его микроархитектуры. И ассемблер там необходим только в роли "моста" между микроархитектурой и вашим ПО. Писать на нём стоит только в учебных целях.

хочу разобраться с электрическими цепями

Микроконтроллеры в этом особо не помогут. Хотя, конечно, зависит от того, что вы понимаете под "разобраться". Точнее на каком уровне.

[ZANUDA_MODE

[ZANUDA_MODE ON]
микроархитектурой
Таки архитектурой, микроархитектура подразумевает наличие внеархитектурного "программно-невидимого" состояния, к которому нет доступа ни из ассемблера, ни из Си, ни откуда-либо ещё.
[ZANUDA_MODE OFF]

Подходы к разработке

С точки зрения подходов к разработке для больших машин, разработка под МК фактически идёт на уровне микроархитектуры, т.к. здесь запросто может использоваться какая-нибудь маршрутизация запросов между контроллерами DMA и периферией. И вот с точки зрения "большой машины" это будет происходить именно на уровне микроархитектуры, т.к. здесь будет юзаться мультиплексор DMA. Но с точки зрения микроконтроллера это уровень архитектуры, да.

микроархитектура подразумевает наличие внеархитектурного "программно-невидимого" состояния, к которому нет доступа ни из ассемблера, ни из Си, ни откуда-либо ещё

Ну как бы да, но для общего развития знать микроархитектуту ядра МК знать полезно.

До того, как

До того, как взялись за трехтомник, у вас было вообще какое-то представление о работе программиста? Просто здесь есть, как минимум, два варианта - "слышал, что это круто, но посмотрел и, как говорят, 'ниасилил' или разочаровался, не совпали ожидания с реальностью" (хотя, раз духу хватило на ассемблер, это вряд ли подходит) и "нет желания подниматься уровнем выше, хочется остаться поближе к железу" (раз уж всплыли МК). Первый вариант комментировать вряд ли стоит, можно лишь сказать, что вовремя поняли, чем не хотите заниматься, что само по себе важно (тут неоднократно обсуждали, что надо быть тем ещё маньяком, чтобы от этого получать удовольствие). Если вариант второй, то нужно понимать, что, как и программирование "вообще", программирование микроконтроллеров и "электрические цепи" - очень обширное понятие. В любом случае, человеку, знакомому с программированием, "въехать" в МК проще - обычно переход (ну, по крайней мере, до засилия Arduino и шумихи вокруг IoT) происходит в обратном направлении, когда "железячник" решает влезть в программирование, у него, чаще всего, нет представления ни об архитектуре программ, ни об "управлении сложностью", если так можно выразиться, поэтому порождаются весьма причудливые и монструозные конструкции. Что до ассемблера, тут поддержу Андрея Викторовича - и в МК для него места немного осталось. Сейчас нет необходимости жёсткой экономии каждого байта, тем более, что сейчас более популярны МК на ARM, а тамошний ассемблер с бесчисленными префиксами-суффиксами у команд, вообще, имхо, больше ориентирован на машинную обработку, чем на запись человеком. Да и задачи, решаемые на МК, бывают сильно разными. Можно посоветовать тех же Харрисов, "Цифровая схемотехника и архитектура компьютера", если есть желание покопаться в железе. Там, в конечном счете, тоже дело доходит до ассемблера и Си в минимальном изложении, но "с другой стороны". Если уж так тянет в ассемблер для AVR - есть книги Ревича, например, или широко известный учебный курс тов. DI HALT, свободно доступный как в виде цикла статей, так и в виде pdf-ки. Arduino лучше не трогать на начальном этапе - опасное это дело, как говорится.

Огромное

Огромное спасибо за книги - обязательно почитаю.
> "До того, как взялись за трехтомник, у вас было вообще какое-то представление о работе программиста?"
Представлений не было, однако:
До этого использовал С# под юнити и под консольные приложения - это, естественно, было на ОС виндовс (причём я уже чувствовал, что что-то тут не то (ничего не понимал - от этого было не так уж интересно)); спустя какое-то время решил самостоятельно освоить С++ - вскоре обнаружил, что сети там (под Windows) использовать очень сложно, после узнал о трехтомнике (спасибо автору за то, что показал и рассказал всё эти тонкости работы системы в 1 томе - я про представление данных на ПК, асм и в принципе администрировании системы).

Сейчас попробую снова изучить Си - до сетей так и не дошёл, а сервер написать хочется)

Просто интересно

А что именно показалось непонятным в C#?

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

>А что именно

>А что именно показалось непонятным в C#?
Скорее не в языке дело - все ютуберы, разные сайты по типу "C# для чайников" так и не объясняли, например, почему мы должны использовать enum и константы вместо простых чисел. А работа с движком Unity сводилась к банальному копированию кода; я уже тогда понимал, что такими темпами ничего самостоятельно написать не смогу - придётся лезть на форумы и искать решение.

admin аватар

Ну да, когда

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

Вообще какой нахрен сишарп для начинающих? Там ООП, а чтобы просто понять, о чём идёт речь при рассказе про ООП, нужно иметь опыт самостоятельного написания программ в 2-3 тысячи строк. Тем, у кого такого опыта нет, ООП объяснять бесполезно.

>Вообще какой

>Вообще какой нахрен сишарп для начинающих? Там ООП, а чтобы просто понять, о чём идёт речь при рассказе про ООП, нужно иметь опыт самостоятельного написания программ в 2-3 тысячи строк.
Для новичков, желающих создать игру, выбор ограничивается двумя движками - Unreal Engine 4 и Unity (с языками C++ и C# соответственно). Рассказы про то, какой C++ сложный, вынуждают многих выбирать C# как первый язык для обучения.

Или есть другой, более ужасный вариант - под влиянием таких людей как ХаYди Х0 и одного из преподавателей МФТИ (преподаёт первокурсникам Python) огромное количество людей, ещё не видевших хотя бы Паскаль, спешат освоить питон.

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

>Тем, у кого такого опыта нет, ООП объяснять бесполезно.
Это то да, только вот деньги за просмотры у ютуберов никто не отменял. Сюда же можно отнести авторов курсов по программированию "С++ за 3 месяца" (иногда с "гарантией трудоустройства") и тому подобное.

admin аватар

Для новичков,

Для новичков, желающих создать игру

"Ничего не знаю, ничего не умею, но хочу быть круче всех". Ну да ну да.

C# как первый язык для обучения

Хрен редьки ни разу не слаще, в данном случае даже хуже, пожалуй.

ни разу не услышав об, повторюсь, ООП.

Слышать они могут что угодно о чём угодно, например, что программисты все как один ничего не делают и бабки не знают куда девать. Что толку-то? Про ООП бесполезно и даже вредно "слышать", его надо или уметь, или изучать, чтобы потом уметь, или не трогать вообще.

деньги за просмотры у ютуберов

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

Parthen аватар

>Вообще,

>Вообще, подозреваю, народ скоро выработает иммунитет против этих самозваных гуру.
Пока в ютубе не будет адекватных роликов, все пользователи ютуба будут смотреть инфоцыган.

admin аватар

Пролема уж

Пролема уж точно не в отсутствии адекватных роликов, поскольку их там вообще-то есть. А инфоцыгане — явление, возникшее задолго до ютубовской эпохи. Скажем, у Майка Науменко есть такая песня, называется "Песня Гуру". Как раз про такого персонажа, которых сейчас называют инфоцыганами. Если не ошибаюсь, это самое начало 1980-х, то есть песне-то вообще-то сорок лет.

Ничего не знаю,

Ничего не знаю, ничего не умею, но хочу быть круче всех
Ну так юношеский максимализм же, так его растак. Мне кажется, подавляющее большинство "начинающих программистов" грезит о двух вещах — своей игре (непременно в 3D с умопомрачительным графонием) и своей операционной системе. Я, например, где-то ко 2 курсу универа (ни разу не программистская специальность, химик) увлекся JavaScript'ом (как говорится, гусары, молчать) и, когда начался семестровый (всего лишь) курс программирования с одной парой в неделю и гордым названием "Вычислительные методы в химии", по договоренности с преподавателем носил ДЗ не в Lazarus, вокруг которого строился курс (ага, программки с гуём и одной процедуркой, запускавшейся по нажатию кнопки в окошке), а в виде страничек с JS-ным кодом (ну вот скучно мне было решать квадратные уравнения в заботливо сконструированном кем-то окошке, а вот нарисовать в браузере график интерполирующего полинома для заданного набора точек, имея в распоряжении только методы для рисования точки и прямой - самое то, причем это было не по заданию, а так, "для души"). Заодно увлеченно рассказывал преподавателю о грандиозных планах по написанию своей оси на JS. Но надо сказать, что я, в отличие от упоминавшихся здесь некоторых "питоняшек" понимал, что на голом JS этого не сделать, и рассказывал ей о необходимости написания своего интерпретатора JS, который бы мог работать с bare metal (ну вот восхищала меня тогда идея, что "программу" можно написать в одном Блокноте, безо всяких там компиляторов, да-да). Сейчас-то я понимаю, почему она так улыбалась... А вот вопросом безопасности такой полностью интерпретируемой ОС ей удалось меня поставить в тупик, это да. Так что максимализм, он такой.

упоминавшихся

упоминавшихся здесь некоторых "питоняшек"
О нет, я не думал что такие существуют, то есть я мог предположить, но вот, что реально есть ОС, о нет. Вот
https://github.com/joshiemoore/snakeware

admin аватар

Где ОС-то? :) Там

Где ОС-то? :) Там Linux, а питоновый только юзерспейс. Честно говоря, при виде этого возникло ощущение, что обезьяны начали строить для себя подходящий обезьянник.

"Начинающие программисты"

большинство "начинающих программистов" грезит о двух вещах — своей игре (непременно в 3D с умопомрачительным графонием) и своей операционной системе

Ага. На каком-нибудь хрусте или плюсах. Повторяя заученную глупость про "C древний и устарел".

Да ну как бы

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

Неофиты

Да ну как бы "чистым Си" неофиту черепушку вскрыть можно ничуть не хуже, чем этими языками.

А что такого сверхсложного в чистом С? По мне так чем ближе к железу - тем проще. Не, ну хрустом вскрыть можно - это недоразумение создано спецом для параноиков. С++ (если без стандартной библиотеки) - врят ли. Но если нет опыта с чистыми сями, то удобства С++ окажутся непонятны (в смысле человек не поймёт для чего нужно усложнение в виде ООП). Хотя, в принципе, может оказаться и так, что С++ просто окажется не нужен и человек останется на чистых сях (например, если выберет профессией эмбеддинг). Про С++ с STL лучше вообще умолчать - если кто-то "обучится" этому (STL-макакингу) с нуля (при этом можно реально травмировать мозг), то получится аналог питоняши, по недоразумению называющей себя "С++ - программистом".

например, если

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

Эмбеддинг

Nelson, а вы, вообще, эмбеддингом занимаетесь, как я понимаю?

Приходится ) Но я скорее "железячник", нежели программист.

можете в двух словах рассказать, насколько охотно в эту сферу берут людей без профильного образования, и реально ли это вообще?

Сложный вопрос на самом деле. Тут всё больше зависит от ваших целей. Если вам нужен "карьерный рост и вот это вот всё", то высшее образование, скорее всего, понадобится. С другой стороны, толковых специалистов в этой сфере катастрофически не хватает, поэтому главным критерием при приёме на работу всё же будут фактические навыки, а ещё лучше какие-то реализованные проекты.
Конечно, профильное образование не помешает, но тут, правда, тоже не всё так просто. Обычно в эмбеддинг приходят либо с чисто программистстским образованеим либо с техническим по типу "Радиотехника", "Промышленная электроника" и т.д. Какое из них более подходит для сферы эмбеддинга - фиг его знает ) В идеале 50/50, наверное. Так что самобразование в этой сфере однозначно решает, т.к. чисто программистских знаний либо чисто "знаний по электронике" недостаточно. С другой стороны в сфере есть немало людей без высшего образования, которые вполне себе грамотные специалисты.
Также стоит быть готовым к тому, что очень часто от эмбеддера при устройстве его на работу в наших реалиях будут требовать не совсе адекватные вакансии навыки и опыт: опыт в разработке аналогой электроники, проектироваие печатных плат и т.д., что как бы не совсем правильно, мягко говоря, т.к. это отдельные профессии, причём требующие основательной подготовки и опыта. Многие работодатели не понимают, что эмбеддер - это всё таки программист, а не схемотехник, инженер-проектировщик и конструктор, который может также ещё при необходимости разработать прошивку в одном лице. Но это, наверное, уже больше к вопросу о правильном позиционировании себя как специалиста.
От себя могу сказать, что нужно прежде всего определится, насчёт того, что вам ближе: программирование или электроника.
Если интересно именно программирование, то в эмбеддинг лучше не идти, потому что как программист вы в этом случае будете стагнировать. Писать прошивки - это не такая прям сложная наука, как это часто пытаются представить. В "большом программировании" решаются намного более сложные задачи.
Если же подойти к эмбеддингу чисто "с точки зрения железа", то можно обнаружить, что, внезапно, никакой разработки тут нет. Эмбеддер разве что должен разобраться с набором периферии микроконтроллера. Хорошо, конечно, если человек сумеет развести ещё и плату, но такое наблюдается редко, если дело касается не совсем банальных устройств.
Короче, если нет явного интереса к электронике, то идите в программисты ) Я бы сказал, что эмбеддинг - это всё же для тех, кто в первую очередь электронщик (хотя толковому электронщику идти в эмбеддинг также вовсе необязательно, но это уже другая история) по натуре (который при необходимости может написать прощивку).
Ну и также нужно учитывать, что найти работу "программистом больших машин" всё же проще - этот момент нужно обязательно учитывать.
P.S. Сорри за простыню, вопрос крайне обширный.

По мне так чем

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

Назначение языков

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

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

fluorine аватар

Плюсую

Плюсую, ОС хотел писать ещё когда начинал с питона. Юношеский максимализм как он есть. "Исполнил мечту", на паскале после того, как прочитал Just for Fun Торвальдса, Линукс же начинался вообще как эмулятор терминала, потому что Линуса выбесил Minix'овский. Сделал простой эмулятор терминала в терминала, а программы сделал подпрограммами. Ещё впринципе "мечты" зависят от человека, а степень "странности" и "нереализуемости" растёт с повышением выбранного стека технологий юного ума.

admin аватар

"Стало как-то не

"Стало как-то не так" — это когда, ещё на самом асме или уже на Си? Впрочем, тут в любом случае пытаться что-то определённое выдать — это примерно как диагноз по фотографии.

могу ли я прочитать главу по сетям

А что, вам это кто-то может запретить?

можно ли залезть в ардуино

Я не схемотехник, но если я что-то в чём-то понимаю, то это примерно как программировать начинать с питона. Там же и останетесь, по-настоящему предмет не освоите.

Кстати, я с 2008 года активно пишу под AVR, а тамошнего ассемблера не знаю и от этого не страдаю. Ну так, на всякий случай, чтобы не возникало странного ощущения, что для МК пишут на асме.

Есть

Есть предположение, что желание пропало из-за малого количества практики и небольших проектов ранее - попробую снова освоить Си (до процессов и услуг ОС не дошёл, внезапно это стало интересно).
> "Кстати, я с 2008 года активно пишу под AVR, а тамошнего ассемблера не знаю и от этого не страдаю. Ну так, на всякий случай, чтобы не возникало странного ощущения, что для МК пишут на асме."
То есть вы используете Си? Меня скорее интересует ассемблер (смотрел видео одного человека на YouTube - он берёт Intel 8008 (иногда связку таких) и делает на основе этого сумматор, вычислитель чисел Фибоначчи и т.п. - в общем, интересные схемы с использованием асма - по-моему, очень даже интересно).

>"Я не схемотехник, но если я что-то в чём-то понимаю, то это примерно как программировать начинать с питона. Там же и останетесь, по-настоящему предмет не освоите. "
Понял, а взять отдельно от туда процессор могу? Из описания, это процессор ATMEL (ATMEGA) - тоже, если не ошибаюсь, из семейства AVR.

admin аватар

То есть вы

То есть вы используете Си?

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

скорее интересует ассемблер

Жизнь слишком коротка, чтобы тратить её на ассемблерное программирование. На Си то же самое получается в разы быстрее, плюс часть кода можно перенести в другие проекты под другие процессоры. А в довершение всего оптимизирующий компилятор может машинный код сгенерить ещё и лучше, чем то, что вы сделаете "руками" на асме.

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

он берёт Intel 8008 (иногда связку таких) и делает на основе этого сумматор

Есть ещё люди, которые марки собирают. А есть такие, которые вытачивают из металла модельки автомобилей в масштабе 1:43. Не надо путать хобби и практическую деятельность, на практике сие бессмысленно — и, кстати, ассемблер-то тут при чём? Это чистая схемотехника.

а взять отдельно от туда процессор могу?

Конечно, это проц как проц, очень даже неплохой. Под Linux есть всё, что нужно для работы с ним — avr-gcc со всем его окружением и библиотеками, всякие avrdude и uisp для работы с программатором. Можете даже макетные платы взять ардуиновские, надо же на чём-то макетироваться. Чего не трогайте ни в коем случае — это всего, что связано с программированием "под ардуино".

Сумматоры на 8008

ассемблер-то тут при чём? Это чистая схемотехника.

Думаю, что интереснее собирать сумматоры на И-НЕ/транзисторах/лампах/трансформаторах.

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

Сумматоры

Думаю, что интереснее собирать сумматоры на И-НЕ/транзисторах/лампах/трансформаторах.

Это прям совсем жёстко ) Ну ещё на дискретной логике можно понять, но на лампах... )

Можно ещё на

Можно ещё на релюшках, счастливо избежавших утилизации после модернизации соседней АТС.

А что насчёт

А что насчёт Forth? Ходят слухи, что под голое железо он очень даже годный, и применяется вроде в основном на МК.

admin аватар

Господи, ну

Господи, ну нельзя же так вестись на разводки. Форт стековый, где вы видели микроконтроллер со стековой архитектурой? А слухи эти ходят, да — их исключительно фанаты форта и распространяют. Ну, их-то понять можно, они в это сами верят, но это ж не повод начинать вслед за ними верить в чудеса.

>Конечно, это

>Конечно, это проц как проц, очень даже неплохой. Под Linux есть всё, что нужно для работы с ним — avr-gcc со всем его окружением и библиотеками, всякие avrdude и uisp для работы с программатором. Можете даже макетные платы взять ардуиновские, надо же на чём-то макетироваться. Чего не трогайте ни в коем случае — это всего, что связано с программированием "под ардуино".
Не совсем понял, что имеется ввиду под "программированием под ардуино" - готовые библиотеки с функциями по типу pinMode?
>"Жизнь слишком коротка, чтобы тратить её на ассемблерное программирование. На Си то же самое получается в разы быстрее, плюс часть кода можно перенести в другие проекты под другие процессоры. А в довершение всего оптимизирующий компилятор может машинный код сгенерить ещё и лучше, чем то, что вы сделаете "руками" на асме."
Понял, теперь окончательно перехожу ко второму тому. Спасибо.

admin аватар

> что имеется

> что имеется ввиду под "программированием под ардуино"

Там дело не в готовых библиотеках, хотя и в них тоже. Что реально отвратительно -- это что там, во-первых, применяется Си++ (да, блин, именно Си++, а не чистый Си), при этом все руководства и примеры написаны на идеально-обезьяньем уровне, вообще без каких-либо объяснений, как этот код работает и что тут происходит (какие-такие объекты, какие-такие классы, куда вы меня тащите); оно и понятно, научить кого попало языку Си++ не так просто, как может показаться. А во-вторых, там применяются "интегрированные среды".

Удобно

Удобно заходить на страницу ввода логина/пароля на данном сайте, прописывая нужный адрес (stolyarov.info/user) в адресной строке. Но если его (stolyarov.info/user) не знать, лично мне найти страницу ввода логина удалось лишь заходя в "Гостевая книга --> Архив гостевой книги с 25... --> сбоку - нужная форма". Если это не намеренный ход, то некоторым посетителям отсутствие на главной странице формы для входа может быть не очень удобно. Спасибо.

admin аватар

Вот сейчас

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

Действительно,

Действительно, все в порядке. У меня данная форма не отображается в вертикальном положении монитора, а в горизонтальном - все на месте.

admin аватар

Это, видимо,

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

fluorine аватар

http://stolyarov.info/node/33

http://stolyarov.info/node/332 справа
==
Краудфандинговый проект по созданию новой книги нуждается в вашей поддержке: помогите сделать второе издание!
==
Второе издание же выпущено. Не ошибка? Где-то видел: "следующий этап - задачник". Может так правильно будет?

fluorine аватар

Ну задачник уже

Ну задачник уже выпущен. Пора менять запись?

admin аватар

Ну поменять-то

Ну поменять-то я поменял, хотя теперь, пожалуй, всё это уже не так важно.

admin аватар

Спасибо,

Спасибо, поправил текст этого блока. А при чём тут страница, блок же этот показывают почти везде?

fluorine аватар

Просто

Просто конкретный пример)

Parthen аватар

Если свобода

Если свобода лишь отсутствие насилия, то можно ли считать свободу воли лишь отсутствием насилием над волей (читай принуждением)?

admin аватар

"Свобода" в

"Свобода" в социально-политическом смысле и "свобода воли" как противоположность детерминизма — это просто две совершенно разные и никак не связанные между собой сущности, обозначаемые зачем-то одним словом. У меня в диссере по философии этот вопрос подробно разбирается, со ссылками и т.п.; скажем, Кант и Дж.Ст.Милль об этой омонимичности знали и чётко отделяли одно от другого, а вот марксисты, наоборот, устроили просто-таки вакханалию словесных спекуляций, причём, судя по всему, сознательно (читай — злонамеренно) игнорировали тот факт, что слово "свобода" имеет два совершенно разных смысла.

Короче говоря, ответ — нет. Между свободой воли и свободой социальной вообще нет и не может быть никаких параллелей. Примерно как между консолью компьютера и консолью крыла самолёта.

Консоли

А ещё есть игровые консоли.

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

admin аватар

Что в них

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

Откуда взялось это слово в авиации — довольно очевидно, это собственно такая часть крыла, которая нависает. Если я правильно понимаю, то формально крыло — это в том числе, например, та его часть, которая на некоторых самолётах образует низ фюзеляжа, а консоли (левая и правая) — это как раз то, что в просторечии и называют "крыльями".

Как это слово получило новое значение — "пульт управления" — тоже вполне понятно. Пульты очень часто делали и делают закреплёнными за их заднюю часть, а сам пульт нависает над полом, чтоб можно было перед пультом сесть на стул и при этом было куда девать ноги.

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

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

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

Проверено - не проверено

Андрей Викторович, добрый день!

На вашем сайте у некоторых пользователей в гостевой книге рядом с именем висит статус "(не проверено)". Например: "Anonymous (не проверено)", "Вася (не проверено)". У некоторых пользователей такой статус отсутствует.

Что дает "проверенность"? С анонимусами все понятно, проверять там нечего, но вот "проверенность" зарегистрированных пользователей, наверное, имеет какой-то смысл.

admin аватар

Ровно этот

Ровно этот смысл и имеет. Зарегистрированный пользователь пришёл, ввёл пароль, тем самым "доказал", что это он (на самом деле нет, конечно, но движок сайта этого не знает). А аноним может вколотить что угодно, и ему это позволяется, только рядом пишется вот это вот "не проверено".

Сломал компилятор Паскаля

Добрый день Андрей Викторович! Завершаю изучение рекурсии в Первом Томе. В конце главы вы дали задачу: сделать нерекурсивные процедуры для прохода/подсчета значений по бинарному дереву. Долго думал, в итоге придумал такую идею: заводим очередь, туда копируем адрес первого узла, потом проверяем левую и правую часть первого узла, если они не пустые, то копируем в очередь после первого, первый же печатаем/складываем его значение и удаляем... Памяти кушает много, но работает :)
Не суть.

В этом фрагменте программы есть один if (показал стрелкой), который компилируется без begin и end. Если же их поставить, то вылезает ошибка. Серьезно.

if tree = nil then
    tree := tmp
else
begin
    current := tree;
    while current <> nil do
    begin
        if (n > current^.num) and (current^.more = nil) then
        begin
            current^.more := tmp;
            break
        end;
        if n > current^.num then
            current := currrent^.more;
 -->    if n < current^.num then
            if current^.less = nil then
                current^.less := tmp;
            current := current^.less
    end
end

Мне лишь хочется понять: я ошибся или я сломал компилятор? Если и правда сломал, то как выискивать такие ошибки? Потратил час-полтора, пока разобрался со всем этим.

Благодарю!

{За простыню текста простите. Мне лишь показалось, что вам будет интересно посмотреть на этот, как мне кажется, нетривиальный случай :D Ведь насколько я помню, вы сами говорили: "выиграть в лотерее - больше шансов, чем словить баг компилятора".
А еще пробельные отступы не форматировались в "кодовой" части этого комментария. Все стерлись}

Может это из-за

Может это из-за точки с запятой перед end?

admin аватар

Перед end точка с

Перед end точка с запятой не нужна, но это и не ошибка, то есть она допустима, компилятор ругаться не будет. Просто пустой оператор, Паскаль его допускает.

Точка с запятой

Не, был какой-то случай, как раз в if, где точка с запятой приводит к ошибке. Кажется, дело в том что она заканчивает оператор if и следующий else уже не воспринимается.

admin аватар

Это перед else, а

Это перед else, а не перед end, читайте внимательно.

Точка с запятой

Да, я немного перепутал. Тот коммент про end тоже мой был. Я имел ввиду else.

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

admin аватар

Тут бесполезно

Тут бесполезно что-то предполагать, пока нам не покажут программу целиком. А нам её, судя по всему, уже не покажут :-)

Если вы просите

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

Например, так:
1) Вот я написал программу: (далее полный текст программы)
2) Попробовал ее скомпилировать следующей командой (полный текст команды)
3) Компилятор выдал ошибку, вот такую: (далее полный текст ошибки)

В описании ошибки компилятора как раз и может содержаться самое интересное :)

admin аватар

И что мне с этой

И что мне с этой вашей простынёй делать прикажете? Это же фрагмент программы, а не программа целиком, я не знаю, какой тип записи у вас используется, какие объемлющие строки, в общем я могу разве что попытаться догадаться, как этот фрагмент нужно компилировать, чтобы проявить эффект, о котором вы говорите. Но пытаться догадаться я не буду, это занятие неблагодарное.

Про отступы — используйте теги <pre>, а не <code>, которые вообще-то для другого.

Pascal, оператор read

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

[предыдущий ввод программы]
debian@debian-hp:~$ [оставшиеся символы (т.е. то, что не прочитала программа)]

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

procedure Clean;
var
    c: char;
begin
    while not eof do
        read(c);
end;

После вызова процедуры Clean, с клавиатуры нужно два раза имитировать ситуацию конца файла, т.е. Ctrl+D нажать дважды.
Вопрос: что я сделал не так и как это решается?

admin аватар

Вот буквально

Вот буквально несколько дней назад это обсуждалось, и прямо тут :-)
Тыц сюда

Здравствуйте,

Здравствуйте, Андрей Викторович. Во время изучения ассемблера стало интересно, как именно компилятор того же Паскаля транслирует исходный текст программы в её машинный код.
При дизассемблировании (спец. ключ в fpc) получил файл, где 90% - комментарии, а остальные 10%, в основном, call.
Транслирует ли fpc исходный текст на ассемблер, а затем кидает линкеру (ld)?

Вам нужен

Вам нужен ассемблерный файл при компиляции? Там есть опция -a, чтобы компилятор после сборки бинарника его сохранял. Если еще и -al добавить, то будут добавлены строки-комментарии с кусками исходника, что удобно, если надо посмотреть, что там сгенерировалось.

admin аватар

Как я понимаю,

Как я понимаю, эти ключики автор исходного коммента уже нашёл :-) Там даже можно указать, синтаксис какого ассемблера генерировать, и в число этих ассемблеров входит nasm. Вопрос был не в этом, а в том, использует ли fpc реально внешний ассемблер; ответ на этот вопрос — как ни странно, нет. То есть генерировать ассемблерный текст он умеет, но если его об этом не просить, то сам генерирует готовый объектный код.

admin аватар

Насколько я

Насколько я вижу, fpc запускает линкер (который ld), а вот никаких ассемблеров не запускает — видимо, с генерацией объектного кода он справляется самостоятельно. Можете это сами посмотреть, strace вам в руки. Только не спрашивайте, почему и зачем всё сделано именно так, это уж точно вопрос не ко мне.

А если писать

А если писать собственный диалект Паскаля, допускается ли вариант "генерации" ассемблерного кода, а затем - его компиляция? Просто интересно, возможно ли такое провернуть (да и правильно это вообще)?

admin аватар

gcc (самый

gcc (самый популярный компилятор Си и Си++) так и работает, например. Паскаль в этом плане вроде бы ничем принципиально не отличается, чтобы для него это вдруг оказалось нельзя.

Ещё один

Ещё один вопрос, который мучает меня с самого начала обучения. Откуда берется первая версия компилятора? Ну, скажем у меня есть его исходный текст; что мне с этим делать и как получить исполняемый файл?

Немного уточню

Немного уточню ответ Nelson. Описанный им процесс называется "раскрутка компилятора", и продолжается до реализации компилятора на языке, для которого транслятор (компилятор или интерпретатор) уже есть. Если же мы пишем самый первый в мире транслятор, раскрутку надлежит продолжить до реализации примитивнейшего ассемблера на языке машинных команд. Нули с единицами (ну или дырки в перфокарте - одно и то же) руками расставлять, да.
Слышал, что первый Паскаль был реализован именно на ассемблере. А до того его безуспешно пытались сваять на Фортране.

Слышал, что

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

Вот что вспоминает по этому поводу сам Вирт:

After my return to Switzerland, I designed a language after my own preferences: Pascal. Together with a few assistants, we wrote a user manual and constructed a compiler. In the course of it, we had a dire experience. We intended to describe the compiler in Pascal itself, then translate it manually to Fortran, and finally compile the former with the latter. This resulted in a great failure, because of the lack of data structures (records) in Fortran, which made the translation very cumbersome. After this unfortunate, expensive lesson, a second try succeeded, where in place of Fortran the local language Scallop (M. Engeli) was used.

Проблема курицы и яйца

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

Какая-то у вас совсем суровая ситуация - исходник компилятора реализован на языке, для которого не существует компилятора ) Тут разве что только вручную переводить в машинные коды. Причём, скорее всего, трудоёмкость данного процесса заставит вас максимально урезать первый вариант реализации вашего ЯП. Урезать настолько, чтобы первая версия вашего компилятора смогла собрать только лишь саму себя. А дальше уже использовать первую версию для компиляции следующей, более развитой версии компилятора. На какой-то из этих итераций вы получите вполне себе практически полезный ЯП, на котором сможете реализовать уже что-то полезное, отличное от очередной версии компилятора. Как-то так, наверное )
А вообще проще реализовать первую версию компилятора просто на другом ЯП по идее, хотя утверждать не буду, разработка компиляторов - это отдельная область с кучей особенностей. Этот вопрос хорошо бы задать разработчикам компиляторов.

admin аватар

Про Free Pascal на

Про Free Pascal на этот вопрос ответить довольно просто: первые версии его компилятора собирались на Turbo/Borland Pascal'е.

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

Раскрутка Си

К началу разработки Next-B и Си в системе уже была куча доступных языков достаточно высокого уровня:

http://man.cat-v.org/unix-1st/1/b
http://man.cat-v.org/unix-1st/1/bas
http://man.cat-v.org/unix-1st/1/for
http://man.cat-v.org/unix-1st/6/basic

Так что автокодить можно было бы разве что только для развлечения. ;)

Константы при раздельной трансляции

Здравствуйте. Допустимо ли создание одного заголовочного файла со всеми константами, заданными через enum, чтобы включать его в нужные модули? Как я понял, описать такую константу в одном модуле, а в других только объявлять её не получится.

admin аватар

Конечно

Не только допустимо, но и достаточно часто именно так делают. И не только enum, можно и #define (например, для строк).

"Описать в одном, объявить в другом" можно разве что константную переменную, в смысле такую переменную, которая со словом const. Но она не будет константой времени компиляции. А настоящие константы — хоть enum, хоть макросы — только во время компиляции и существуют, все их вхождения в тексте программы компилятор заменяет на их значения, и в объектном файле уже только значения, никаких имён констант. Так что линкеру, который собирает модули, констант уже не видно.

Коварный правый нижний угол

Добрый вечер, Андрей Викторович. Я изучаю модуль crt и столкнулся с неожиданной ошибкой. Вот, например, в книге вы предлогаете дописать программу movehello.pas так, чтобы строка не залезала за границы окна терминала... Я перепробовал много разных рабочих вариантов, строка перестала залезать, когда следующая координата была больше ScreenWidth или ScreenHeight, но при этом строка отказыввлась рисоваться, если последний ее символ занимал позицию (80, 24). Она на самом деле рисовалась, но не на последней строке (у меня это 24), а на 23-й. Тот же прикол есть и в программе movingstar.pas из вашего архива. Можете подсказать, с чем это может быть связано.

P.S. Я начал писать змейку и из-за этой ошибки размер игрового поля пришлось уменьшить на 1 со всех сторон. Если я печатал символ границы игрового поля в позиции (80, 24), верхняя граница "уезжала" вверх вместе с нижней на y - 1.

admin аватар

С чем связано,

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

Это можно побороть, но, видимо, создатели freepascal'евской версии crt для unix-систем этим заморачиваться не стали.

Python для начинающих

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

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

Программирующие пользователи

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

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

Parthen аватар

К слову

Nelson, вы нигде блог не ведете? Я бы почитал.

Блог

Блог я не веду. И каким в теории вы видите мой блог? Набор статей на тему "Почему нельзя использовать Python"? )
Нет, ну в принципе можно конечно пытаться объяснять ущербность скриптоты, как "инструмента" создания софта, может единичные начинающие "программисты"-питоняши и одумаются )

Parthen аватар

Привычка уже,

Привычка уже, что у каждого в интернете не-юзверя есть блог. Может мне просто так кажется, потому что я тут уже какой день разбираю ЖЖ, который я для себя открыл полгода назад.
> единичные начинающие "программисты"-питоняши и одумаются
Ну, я живой пример такого программиста.

Привычка уже,

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

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

admin аватар

Питон такой питон

Для начала процитирую собственную книжку (первый том, второе предисловие; во втором издании это стр.23):

привыкнув к «всепрощающему» стилю скриптовых языков вроде того же PHP, большинство неофитов оказывается принципиально неспособно перейти к программированию на строгих языках — даже на какой-нибудь Джаве, не говоря уже про Си, а хитросплетения Си++ для таких людей оказываются за горизонтом понимания.

Но с питоном всё ещё хуже, и намного: этот язык изначально сделан как командно-скриптовой и сугубо интерпретируемый, но при этом (опять же изначально) позиционировался и позиционируется как язык общего назначения. А так вообще-то нельзя. Почему нельзя — я попытался объяснить в главе 12.5, это самый конец третьего тома (букв там много, можно и не осилить, но в двух словах такие вещи не объясняются).

Это я уже молчу про такие "мелочи", как обязательность структурных отступов. Сторонники питона обычно заявляют, что это якобы достоинство их замечательного языка в качестве учебного пособия — типа того, что сразу приучает начинающих ставить где надо нужное количество "декоративных" пробелов. В действительности эффект часто наблюдается прямо противоположный: перейдя на другой язык, неофит обнаруживает, что "здесь можно и без этого", и забивает на отступы вооооот такой чугунный болт. Разумеется, отступы нужны не транслятору, а человеку — чтобы программу можно было читать; и это нужно объяснять, подробно рассказывать, для чего и как расставлять в тексте отступы, несмотря на то, что компилятор их игнорирует; когда учат питону, обычно поступают с точностью до наоборот — так надо, и точка, зачем тут что-то ещё объяснять; ну и получаем в результате то, что получаем.

Но, конечно, основное тут то, что к услугам питонистов — целая бригада "добрых гномиков"; а что вообще-то в компьютере никаких гномиков нет — это потом оказывается сюрпризом, и крайне неприятным. Отказаться от услуг бригады гномиков — это нужна очень серьёзная мотивация, так что большинство тех, кто начал с питона, там же (не факт что на питоне, но в скриптухе) и остаётся.

Короче, хотите испортить собственные мозги — добро пожаловать в питонисты.

У меня наоборот

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

Сишность головного мозга

долго смотрел на сишный ванлайнер копирования строки

А теперь задумайтесь, почему вы смотрели на него долго )

admin аватар

Если питон

Если питон вызвал ощущение типа "не нравится мне это", то не всё потеряно :-) Ну а восторг при виде сишных трюков, особенно конкретно этого — есть шанс, что с опытом пройдёт. Качественная программа — это не та, которая написана изощрённо, а та, которая легко читается; в этом плане копирование строки представляет собой случай довольно простой, а чуть более сложные конструкции такого рода превращают чтение кода в непрерывное разгадывание ребусов, и это быстро надоедает.

Конечно, писать

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

Parthen аватар

Тут когда-то

Тут когда-то nelson сказал очень годную фразу. Что-то типо: "Python -- идеальный язык программирования для тех, кто не хочет программировать"

Parthen аватар

http://www.stolyarov.info/les

http://www.stolyarov.info/lessons.html
>обучение программированию под Windows, MacOSX, iOS, Android и другие закрытые проприетарные операционные системы;
А разве Android не открыт? У них же по какому-там соглашению обязанность открывать исходники. На базе этих исходников есть AOSP (Android Open Source Project), и уже на его базе есть множество дистрибутивчиков, на одним из -- Lineage OS, я собственно и сижу, причем сижу вообще без сервис гугла -- это мне некоим образом не мешает, спасибо F-droid.

admin аватар

Там не всё

Там не всё открыто, и того, что не открыто, моральным уродам из гугла вполне хватает, чтобы контролировать устройства, принадлежащие пользователям, вместо самих пользователей. А Lineage OS далеко не на всё можно поставить, увы.

Тьфу чёрт, из меню ссылку убрал, а саму страничку придушить забыл. Исправляюсь.

Статьи

Андрей Викторович, Ваши книги очень результативно отразились на моём прогрессе изучения программирования (а также сотнях, а то и тысячах других людей).
Не планируете ли Вы публиковать статьи на различные темы обсуждения? Так, ознакомившись с Вашим трудом как первый том азов программирования и прочитав десятки комментариев на этом сайте, меня действительно заставило задуматься о реальной "пользе" таких вещей как JScript и, к примеру, многоядерных процессоров. Это очень интересные и практичные темы, о которых довольно мало кто говорит с не шаблонной точкой зрения.

admin аватар

Я много чего

Я много чего могу планировать, проблема в том, что времени на всё это нет.

Роботы-спамеры

Не так давно я посмотрел ваш видеоролик, где вы предлагали говорить телефонным спамерам.

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

admin аватар

Ну а тут есть

Ну а тут есть телефонный номер, с которого пришёл звонок. А ещё, как правило, есть название и координаты рекламируемой организации. И, замечу, рекламный обзвон с помощью робота запрещён федеральным законодательством в явном виде и много где, то есть это прямо вот преступление как оно есть, и заказчик такой рекламы может (согласно закону, опять же) налететь на штраф от 100 до 500 тыр, для сравнительно небольшой фирмы это может оказаться весьма чувствительно. Могу вам даже рассказать, куда направлять письменные жалобы (в виде заказных писем по обычной почте). А следующий вопрос очень простой: вы это реально делать будете? Или, как все, поленитесь?

А ведь

А ведь телефонный номер можно подменить на любой - такие услуги есть в интернете. Спамеры могут звонить и с +123456789, фиг их отследишь потом

admin аватар

В Интернете

В Интернете много чего есть, вплоть до увеличения пениса (NB: нет, современная медицина вместе с хирургией не знает ни одного способа для этого). Но технически действительно возможно сделать так, чтобы у получателя звонка отобразился произвольный номер; если я правильно понимаю, как устроена телефонная сеть, для этого нужно контролировать оборудование одного из операторов связи — к сожалению, это не проблема, крысы есть везде.

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

Сервисы для

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

admin аватар

У SIP свои

У SIP свои номера, при чём тут подмена. А насчёт "хорошо прятаться" тут есть одна простая мысль: вот это вот "хорошо спрятаться" не покупается за деньги, то есть хорошо прятаться надо уметь самому, иначе не получится. И, к счастью, спаммеры прятаться толком не умеют, если им ещё и прятаться всерьёз придётся, они станут нерентабельными и загнутся в силу чисто экономических причин. Проблема именно в том, что сейчас они могут себе позволить и не прятатся толком, всё равно никто их не ищет.

Согласен с

Согласен с Вами. На счет SIP: существуют и с подменой номера на произвольный - сам пользовался, но не с целью информационного насилия ;)

admin аватар

Ну кстати

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

Посимвольный ввод

Здравствуйте, Андрей Викторович. Не могу понять, как работает процедура на странице 322 первого тома книги второго издания.

Я себе работу процедуры представляю так, что когда я ввожу число 257 и нажимаю Enter, в переменную c должно занестись число '2'.

И если в этот момент переменная c содержит значение '2', то где шляется остальная часть введенного мной числа, а именно 57? Может она где-то фиксируется?

Мысль о том, что введенная последовательность символов где-то шляется, закрадывается в голову после того, как я убираю из исходника readln и печатаю какой-то несвязный набор букв и цифр, например, '5tralala'. После набора этой последовательности и нажатия клавиши Enter, в вывод попадет не только строка с первым символом, который привет к ошибке (в этом случае это будет 't'), но и последующие, в каждой из которых находяся символы, составляющие набранную последовательность символов, сразу после строки 'Please type first number: ', то есть выполнение процедуры завершается и цикл repeat в главной части программы приказывает процедуре выполниться еще раз.

Еще меня запутывает второй оператор read в теле цикла while. Не понятно, какую он делает работу, если ввод уже отработал?

admin аватар

должно

должно занестись число '2'.

Такого "числа" в природе не существует, и переменная c в этом примере не может содержать число. Читается и заносится в переменную символ, а не число.

где шляется остальная часть введенного мной числа

Правильный ответ здесь такой: всё, что уже введено, но ещё не прочитано программой, находится в каком-то промежуточном буфере. В данном конкретном случае это буфер потока ввода, связанный со стандартным вводом; когда пользователь нажал Enter, он тем самым отдал набранную строку операционной системе (на самом деле не напрямую, но в общем так или иначе операционка эту строку слопала и заныкала), потом ваша программа вызвала read, этот read обратился к операционке, она ему отдала всю строку целиком, но ему нужен был только один символ, так что этот символ он положил в переменную c, а остальное оставил уже в своём собственном буфере — точнее, в буфере, который живёт в памяти вашей программы, такой буфер (отдельный) связан с каждым из её потоков ввода.

По правде говоря, совершенно непонятно, зачем вам это знание прямо сейчас. Все эти буферы, что в памяти вашей программы, что в ядре операционной системы — это чистая оптимизация, всё могло бы работать без этого. Если бы всех этих буферов не было, терминалу (точнее, программе, которая его эмулирует) пришлось бы самому хранить все символы, которые пользователь ввёл, но активная программа ещё не скушала. Но видимое поведение программы при этом было бы точно таким же, разницу в скорости вы при интерактивной работе не уловите никак — там речь идёт о микросекундах.

в вывод попадет

Вот уж в вывод тут точно ничего не попадёт. Мы тут вводим, а не выводим.

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

Еще меня запутывает второй оператор read в теле цикла while. Не понятно, какую он делает работу, если ввод уже отработал?

Какой конкретно ввод, по-вашему, отработал? Первый цикл в этой процедуре читает символы, пока не найдёт символ непробельный, этот символ (при правильном вводе — первая цифра вводимого числа) остаётся в переменной c, а управление проваливается во второй цикл. Так что всё, что прочитано _до_ того read, который вас столь смущает, в действительности — ОДНА (!!!) цифра из вводимого числа. И, возможно, перед ней ещё была куча пробелов, их уже тоже прочитали. А вот все цифры, кроме самой первой, читает как раз этот read, для этого он и нужен.

У вас вообще как с циклами-то?

> У вас вообще

> У вас вообще как с циклами-то?

Не знаю, как самому себе дать корректную оценку. В целом я понимаю, какие значения логических выражений в циклах приводят к их завершению. В цикле while --- это значение false, а в цикле repeat --- это значение true.

Спасибо за то, что объяснили. Теперь, имея ввиду, что оператор read(c) отщипывает от введенной пользователем строки по одному символу, я понимаю, как работает эта процедура.

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

Последнее, что интересно, в конце той последовательности символов, которую вводит пользователь и которая попадает в поток ввода, есть символ перевода строки (#10)?

admin аватар

оператор read(c)

оператор read(c) отщипывает

Ни черта он ни откуда не отщипывает. Он читает. Из потока. Ну вот есть такая штука, поток ввода. Из него можно данные читать. А что пока ещё не прочитали — то там, в этом потоке, пока что и остаётся.

только принять тот факт

У вас какие-то глобальные проблемы, но я не понимаю, какие. "Принимать" здесь ничего не нужно, вы бы ещё решили "смириться с фактом", ага. Если непонятно — надо искать, где и что непонятно, а не "принимать факт".

Последнее, что интересно, в конце той последовательности символов, которую вводит пользователь и которая попадает в поток ввода, есть символ перевода строки (#10)?

А почему именно в конце? Пользователь с помощью клавиатуры формирует текст, текст состоит из отдельных строк. Когда пользователь завершает очередную строку нажатием Enter, в потоке оказывается символ перевода строки. Ну вот если мы на клавишу с буквой A нажмём, будет байт 65, если не ошибаюсь; если на пробел — будет байт со значением 32; а если на Enter — будет байт со значением 10.

Обычно текст состоит из законченных строк, так что последним байтом перед наступлением ситуации <<конец файла>> будет именно #10. Но это не обязательно, файл ведь можно сформировать какой угодно. И на клавиатуре устроить <<конец файла>> можно в середине строки, нужно только Ctrl-D нажать два раза. Такая ситуация не вполне корректна, но возможна.

Я все-таки так и

Я все-таки так и не понял, каким образом readln без параметров удаляет все символы из стандартного потока ввода до близайшего перевода строки. Андрей Викторович, можете, пожалуйста, объсянить этот момент?

admin аватар

Гыгыгыгыгыгыгы

Что значит "как"? Вас не смущает, что read (и readln) способен "как-то там" вообще исполнять такое действие, как чтение очередного символа из потока? Если смущает, то, наверное, дело не в том, как вот конкретно readln без параметров работает, проблема намного глубже.

Если же не смущает, то в чём вы видите проблему? Оператор readln в общем случае, прочитав всё, что предписано параметрами, после этого берёт из потока по одному символу и ничего с ними не делает, просто игнорирует, и так до тех пор, пока очередной символ не окажется символом перевода строки. На этом readln заканчивает работу. Соответственно если параметров нет, то он только вот это вот — чтение по одному символу, пока перевод строки не обнаружится — и делает.

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

> И на

> И на клавиатуре устроить <<конец файла>> можно в середине строки, нужно только Ctrl-D нажать два раза.
< Почему именно два раза? Я теперь запутался, когда я думал что я хорошо знаю.

Поэкспериментировал с cat, вот мои результаты

$ cat | hexdump -c
TEST
0000000 T E S T \n
0000005
$ # C-D отжат после перевода строки
$ cat | hexdump -c
TEST0000000 T E S T
0000004
$ # Действительно пришлось 2 раза отжать не сделав перевод строки. Почему так?

Я когда писал на паскале думал что это ошибка тамошней runtime-library. До меня никак не дошло что как он смог его(ситуацию конец файла) употребить. Вроде СКФ может возникнуть только один раз.

Можете объяснить?

admin аватар

Вот накой чёрт

Вот накой чёрт такую простыню постить, особенно если учесть, что интересна она только лично вам, а все, кто знают этот прикол, всё и без простыни поймут.

Объяснение очень простое — так работает терминал (точнее, его дисциплина линии, это подробно рассмотрено во втором томе, пар. 5.4.1 и 5.4.3) в каноническом режиме. Строки он накапливает, пока пользователь не нажмёт Enter, потом отдаёт сразу всю. Если нажать Ctrl-D, пока накопленная строка пустая. он устраивает имитацию конца файла. А если строка не пустая, то — отдаёт накопленное, не дожидаясь Enter (соответственно, когда жмём Ctrl-D второй раз, строка уже пустая, ведь её только что отдали, и получается конец файла).

^D

А вот это уже интересный нюанс. Я не знал, что ^D делает что-то полезное и в середине строки тоже, хотя читал несколько статей про работу терминала. А вы как узнали про эту фичу?

КП

Вообще этот ␄ называется EOT (Конец Передачи).
Это ещё с докомпьютерной цифровой электросвязи пошло: скоростного телеграфа, телепринтеров на телефонных и выделенных линиях, радиомодемов и т.п.

https://en.wikipedia.org/wiki/End-of-Transmission_character#Usage_in_mai...

https://api.docs.cntd.ru/img/12/00/02/74/27/4bd6cdc9-866d-4049-97b5-832d...

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

admin аватар

Гм, вы меня

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

Вот вы не

Вот вы не хотите врубать https, а какой-нибудь условный Урюпинтелеком возьмёт, да и внедрит рекламу в http-трафик вашего сайта, как это сделал РТ. И в один прекрасный момент вы начнёте показывать мне рекламу, а сами знать об этом не будете. (Если мне не изменяет память, год назад я рекламу на вашем сайте увидел, но её быстро вырезало расширение браузера, и больше я её не видел. Да и скандал разразился вокруг РТ, мб прикрыли лавочку). Я бы советовал подумать насчёт https. +Всегда можно оставить http-only версию сайта для очень старых устройств

admin аватар

Во-первых, и

Во-первых, и в-главных, _я_ вам рекламу показывать не начну. Если кто-то куда-то внедрился, вопросы к ним, а не ко мне. И учитесь уже пользоваться VPNами, вообще-то пора.

Во-вторых: нет, https на этом сайте не будет, пока я жив и пока доменное имя stolyarov.info находится под моим контролем. Это вопрос принципиальный, а не технический: https — это один из инструментов по принуждению пользователей к постоянному апгрейду версии браузера. Я в этом участвовать не буду.

Если здесь вам что-то не нравится — в интернете есть много других сайтов.

Если бы я не

Если бы я не знал про вмешательство в трафик, то вопросы бы возникли у меня к вам. Но если вдруг все провайдеры моего дома начнут пихать рекламу в http-трафик, то вопросы у меня к вам всё таки возникнут, и я, скорее всего, действительно уйду на "много других сайтов", но с https/http+https. (ну не съезжать же мне из дома из-за нерадивых провайдеров)

Я поэтому и предложил оставить ещё и http-only версию сайта для устаревших браузеров.

ВПНы? Ну, да, это могло бы решить проблему. Но в текущих реалиях РФии это скорее временное решение. Да и не костыль ли это?

admin аватар

А почему бы вам

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

Parthen аватар

>И учитесь уже

>И учитесь уже пользоваться VPN
Какое совпадение, прямо сейчас его не могу настроить. Может подскажете самый простый способ (слышал через ssh можно), а то я в сетях чайник.
>https — это один из инструментов по принуждению пользователей к постоянному апгрейду версии браузера
А можно поподробнее?

Не зная

Не зная подробностей, могу предположить, в какую сторону думать.
1) Арендовать VPS в той стране, где требуемые сетевые доступы не порезаны.
2) Поднять на этом VPS VPN-сервер (разных VPN-серверов много, у каждого свой мануал по установке и настройке).
3) Назначить VPN-серверу какой-нибудь нестандартный порт, чтоб всякие штуки из интернета в него не долбились
3) Аутентификацию лучше сделать через SSL-сертификаты, сгенерированные своим собственным центром сертификации. Корневой сертификат собственного ЦС+серверные и клиентские сертификаты делаются с помощью утилиты openssl. Это дает большую безопасность, чем аутентификация по паролю.
А с собственным ЦС вы не зависите ни от каких проприетарных центров, и в любой момент можете все поменять.

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

admin аватар

Когда

Когда требуется просто ходить браузером по интернету с "того" ip-адреса, VPN таки кажется слегка overkill. Поднять на том конце tinyproxy и ssh -L до её порта — по трудозатратам в разы проще.

Не спорю, overkill,

Не спорю, overkill, да. Зато неделька (или месяц - от человека зависит) мытарств с настройкой полноценного VPN со всеми свистелками и перделками оставит в голове у человека кучу полезных знаний. Программисту они лишними не будут.

Конечно, если человек на этом всем уже собаку съел, то лучше выбирать то, что проще, если эффективность решения проблемы не меняется.

Скорее всего будут лишними

Что-то учить нужно когда припрет, иначе знания реально будут лишними, то бишь будут валяться без дела. Вот когда придётся зашифровать вам вашу сеточку алгоритмом каким-нибудь, вот тогда эти знания реально не будут лишними. Да и скорее всего знаний хватит на уровне подключения библиотек/программ и понимании как из-за этого изменится архитектура вашей сети. А например математическую подоплеку этого алгоритма можно оставить математикам.

Иначе вот реально много людей кто много знает, но мало умеет. А чтобы уметь нужно пробовать.

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

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

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

На этом пожалуй закончу.

admin аватар

Я бы не был

Я бы не был столь категоричен. Когда я двадцать с лишним лет назад начал активно преподавать, на тот момент ещё совмещая это с коммерческой работой на full time, мне многие задавали сакраментальный вопрос "нахрена". Сейчас вон, судя по книжкам, которые тут выложены, можно сказать, что я всё делал правильно, но тогда я ответить на этот вопрос не мог.

Да, есть

Да, есть конечно разные ситуации.

Я просто пытаюсь себя и остальных дорогих для меня людей предостеречь себя от ситуации когда, в которой я побывал "человек _куда-то_ идет, но не знает куда", да вроде _куда-то_, иногда на автомате, иногда просто не до конца понимая, что он хочет. В таких ситуациях, _я_ считаю, что нужно остановиться и задать себе вопрос "Куда я иду и зачем?" / "Зачем я это учу?".

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

> Я бы не был столь категоричен. Когда я двадцать с лишним лет назад начал активно преподавать, на тот момент ещё совмещая это с коммерческой работой на full time, мне многие задавали сакраментальный вопрос "нахрена". Сейчас вон, судя по книжкам, которые тут выложены, можно сказать, что я всё делал правильно, но тогда я ответить на этот вопрос не мог.
< Ну я не знаю вашей ситуации, не знаю зачем вам захотелось пойти в преподование. Может реально была такая потребность. Может что-то по Фрейду, или Юнгу). Я не психолог, я просто по своему жизненному опыту :^))).

Мне пока 18 и вся жизнь ещё впереди, но даже так, все равно жизнь можно разделить на несколько этапов, так она оказывается коротка даже для молодого меня. Ну вот мои этапы:
- детство /* прошло */
- студенчество /* один год прошел, есть еще 3 которые нужно провести максимально продуктивно */
- профессиональная карьера возможно до 40
- после 40, я должен стать состоявшимся мужчиной /* ... */
- ну а дальше не старчество а плодотворная жизнь. У некоторых даже в это время только начинается бурная жизнь, планировать сюда как-то даже бессмысленно, надо хотя бы до 50 дожить-с

Строго даже по-моему))) Но даже так есть же план. И он личный, а не общий для всех. Да и черт знает куда меня жизнь понесет. Тут даже на месяц планировать почти нереально, из-за того что нужно считаться с неизвестными планами других людей.

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

Отвечу двум

Отвечу двум предыдущим ораторам:
> http://stolyarov.info/guestbook#comment-5513
> http://stolyarov.info/guestbook#comment-5512

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

Оказывается мои 18 лет это:
7 лет от рождения (я сам не знаю что тогда происходило)
11 лет школы
7 лет "обычной"
4 года физмата
1 год университета "онлайн" и этот год "офлайн"

И если подумать я не совсем далеко ушел от совсем-детства 11 лет вроде пустяки, мне через 12 лет будет всего-лишь казалось-бы 30, а я смог много чего успеть за эти годы. А что я смогу за эти 12!

В общем да слишком я походу погорячился с тем что подумал о старости.

4 года физмата у меня были невероятные, и университет у меня ещё впереди. А я успел уже набить много шишек, теперь буду стараться не повторять бывших ошибок.

За 1 чертов год я успел набить шишек в олимпиадном программирвании, узнал из видео АйтиБороды с Чайкой о вашей книге, но не хотел отпускать занятие на которое потратил уйму времени (вроде только семестр, но психологический было тяжело взяться за Паскаль и начать все заново), а оказалось что не зря, взял ваши книги и за лето так прокачался что мне начало доставлять удовольствие это дело, и начали появляться свои идеи и они были реализуемы. И торопиться летом не нужно было тоже по-идее. Сейчас смотрю как нас учат программированию, пусть из нас и делают макак намеренно, но я уже могу самостоятельно отделять плохое от хорошего, чем Андею Викторовичу бесконечно благодарен. Можно взять и свой темп, и никуда не торопится. Время я трачу не зря.

> Насчет химии: { ... } они просто неактивны, но это совершенно не то же самое, как если бы их не было — активируются такие знания на удивление быстро. { ... }
< Вот тут реально согласен. По крайней мере из-за этого я умею мыслить в терминах химических веществ, а это уже достаточно много. И вернуть знания когда они в будущем понадобятся будет на 2 порядка легче чем учить с нуля.

> Вообще, если что-то доставляет удовольствие, вопрос "зачем я на это трачу время" вообще не должен подниматься.
< Just for Fun. Этот девиз мне нравится. Может даже возьму когда-нибудь и химическую степень на западе, очень хочется потому что я не успел нахимичить всякую-всячину в школе, а ведь мне нравилось и нравиться до сих пор, наблюдать, проводить и узнавать. Меня только выбешивало что я получаю только теоретические знания, да и в моей стране плоховато с хим. образованием, тут 3 курсники только проходят то, что я в 10 классе знал. А мне в такой среде учиться ни разу нет желания. Поэтому пошел в IT потому что, результат тут можно увидеть сразу и без дорогостоящих реактивов.

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

Погорячился, погорячился...

Вообще,

Вообще, конечно, ход мыслей у вас очень интересный - то вы жалеете, что на химию в школе уйму времени потратили, то вдруг химическую степень хотите да нахимичить "чего-нибудь этакого". Так что, наверное, все же не зря это время было потрачено, иначе вы бы о химии и не вспоминали вовсе. Я, кстати, вообще первый раз вижу, чтобы кто-то всерьез сетовал, что в школе "чем-то не тем занимался" (ну, кроме пинания не скажу чего) - на то ведь оно и общеобразовательное учреждение; там задача сформировать базовые представления о разнообразных направлениях деятельности, показать, чем вообще ты по жизни заниматься можешь (а уж на олимпиады, в том числе по химии, я ходил что на работу - они в воскресенье проходили, и можно было потом совершенно легально прогулять день среди недели; и на двух в один день бывал...). А специализация - это в вуз, пожалуйста, так что у вас еще все впереди.
Кстати, подкину идею. Так уж вышло, что сам, мягко говоря, "причастен к химии", хотя и очень хотел в свое время связать жизнь с ИТ. Но вот занесло на химфак, а там увлекло квантовохимическое моделирование (всегда в лабе смеялись, что у нас из реактивов только чай и спирт). И вы себе не представляете, сколько кода под задачи в этой области было написано за прошедшие 10 лет! Совместил, так сказать, приятное с полезным. Так что можно в эту сторону посмотреть - расчеты, численное моделирование и т.д. (тем более, физмат за плечами); хотя вам, как я понимаю, интересна именно экспериментальная часть (я вот в свое время в кванты и убежал, чтобы всех этих банок со склянками не касаться...)

Parthen аватар

>Я, кстати,

>Я, кстати, вообще первый раз вижу, чтобы кто-то всерьез сетовал, что в школе "чем-то не тем занимался"
Приятно познакомиться, записывайте второго.
Я вам даже больше скажу, я жалею что в начальной школе не тем занимался. Скажи я себе пару слов, моя жизнь была бы другой.

В универе год

В универе год матанализа точно за два года (а может, и больше) старших классов школы зайдет. Там книжка толщиной 600 страниц, и не художественного текста, а формул и выкладок, и неподготовленному уму (первокурснику) порой одну страничку минут 40 читать приходится. А параллельно еще другие предметы есть.

А если с младшей школой сравнивать, так наверное 4 класса в один семестр универа можно впихнуть.

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

admin аватар

Не

Не демонизируйте матанализ, учебник учебнику рознь. Фихтенгольцем я как-то раз зачитался.

> то вы жалеете,

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

> интересна именно экспериментальная часть
< именно!

Слушайте, вы

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

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

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

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

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

admin аватар

Я, конечно,

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

А планировать — ну да, гнилое занятие. Когда мне было 18, если бы мне кто-нибудь сказал, что я стану преподом, да ещё у меня будет диплом кандидата философских наук, то я бы просто не поверил. Ржал бы, наверное, очень громко.

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

Вообще, если что-то доставляет удовольствие, вопрос "зачем я на это трачу время" вообще не должен подниматься.

admin аватар

Тут вопрос

Тут вопрос сложный. Если нет прокси, то на том конце нужен ещё и NAT, грамотная настройка роутинга, чуть что — и появляется потребность в source-based routing. Для человека, никогда не строившего сетки сложнее внутриквартирной на три компа, это может оказаться просто не под силу, а результатом станет тупое следование какой-нибудь пошаговой инструкции.

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

> И вообще,

> И вообще, неделька здесь, неделька там

Блин, а вот эта мысль заставила задуматься.

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

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

Это верно и с

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

Ну тут уж

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

2 строчки

2 строчки говорят достаточно

Netscape Communications created HTTPS

Brendan Eich, a Netscape Communications Corporation programmer, created JavaScript in September 1995

А вообще https активно продавливается гуглом во всех браузерах.

admin аватар

Может

Может подскажете

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

А можно поподробнее?

Совсем недавно обсуждалось:
http://www.stolyarov.info/guestbook/archive/5#comment-4838

VladOs аватар

Pointers

Здравствуйте Ув.Андрей Викторович. У меня возник вопрос по поводу первой задачи про односвязные списки. В цикле, который выводит все записанные в память числа я заменил tmp на first и всё благополучно работает. И суть в том, что, мне кажется, я понимаю как это работает с first, а с tmp нет. Ведь временный указатель, в конечном итоге, ссылается только на соответствующий указатель first, а адреса на предыдущий tmp у него ,по идее, нет. Каким образом при помощи tmp мы получаем последовательный доступ к числам стека?

В этой

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

Если заменить tmp на first в цикле вывода, то программа продолжает работать также, только вы теряете указатель на начало цепочки, а значит второй раз по ней пройтись не сможете.

admin аватар

Во-первых,

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

Во-вторых, вот это ваше

на которые непосредственно не указывает ни одна переменная-указатель

— это просто-таки ложное и очень опасное утверждение. Поле записи — это тоже переменная, а что у неё нет имени в виде идентификатора — так это никоим образом не делает её чем-то отличным от переменной. В частности, в качестве var-параметра в процедуру можно передать и поле записи, и элемент массива, проблем здесь никаких; но главное — что эти штуки (а) имеют адрес и (б) им можно присваивать. Любой объект с этими двумя свойствами — это именно переменная, а не что-то другое.

Переменная

Мне казалось, что переменная — это сущность в ЯП, у которой есть идентификатор и к которой можно привязать/присвоить значение, например p (после var p: pointer;) — переменная. А что-то вроде p^ или p^^.ptr^.n — это уже не переменные, а выражения, пусть даже язык позволяет их ставить слева от присваивания или передавать через var-параметр. Хотя, внутри подпрограммы, переданное через var-параметр всё-таки получает привязку к переменной.

А в вашем определении переменной можно назвать любую область оперативной памяти. В том же паскале, не говоря уже о C, вполне можно сделать указатель, например на середину строки и задать ему тип ^integer, а затем пользоваться.

admin аватар

Мне казалось,

Мне казалось, что переменная — это

Здесь вы категорически неправы, и чем раньше это поймёте, тем лучше.

p^^.ptr^.n — это уже не переменные, а выражения

Это, несомненно, выражения, но если в терминологии Си можно сказать, что это "леводопустимые выражения", то терминология Паскаля таких слов не подразумевает — здесь это просто, тупо и цинично "выражение, задающее переменную". То есть результатом выражения является переменная.

А в вашем определении

Я не давал определений. В технических дисциплинах вообще довольно плохо с определениями.

переменной можно назвать любую область оперативной памяти.

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

> Здесь вы

> Здесь вы категорически неправы

Хм... мне казалось, это вопрос терминологии. Ну ладно.

А как тогда назвать вот эти все штуки, которые определяются в var директивах или параметрах подпрограммы, если не переменными?

admin аватар

мне казалось,

мне казалось, это вопрос терминологии.

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

Терминология — это важно, она во многих случаях определяет стиль мышления или во всяком случае влияет на него.

А как тогда назвать вот эти все штуки

Те, что в секции var — переменными, разумеется. Если очень хочется их как-то выделить среди всех возможных переменных, то можно обозвать их как-нибудь вроде "именованные переменные", но мне вот ни разу этого не потребовалось. И так понятно, что вот у этих переменных есть имена, а вот у тех всяких динамических, а равно и таких, которые части других — ну, нету имён, во всяком случае в виде идентификаторов.

Те, что в параметрах подпрограммы — формальные параметры, это строгий термин. То обстоятельство, что они вообще-то тоже переменные, я предпочитаю обойти деликатным молчанием, поскольку, хотя им и можно присваивать, брать от них адреса и в вызываемые подпрограммы отдавать через var-параметры (язык это не запрещает), лучше этого всё же не делать. То есть да, они вполне себе полноценные переменные (во всяком случае, в Паскале и Си), но это такое знание, которого бы лучше не было.

Операторы

Кстати вот насчёт взятия адреса, а что если так сделать:

var i: integer; p, q: ^integer;
...
new(p);
q := &i;
&i := p;

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

admin аватар

Операция

Операция взятия адреса, начиная с Turbo Pascal, обозначается в Паскале символом «@»; но не суть.

Так, как вы написали, сделать нельзя ни в Паскале, ни в Си, ни ещё где бы то ни было. Результат операции взятия адреса — это адрес (т.е. значение), а не переменная, его нельзя ставить слева от присваивания. Точно так же, как нельзя, например, слева от присваивания поставить число 25. Или, скажем, результат сложения каких-нибудь a и b.

Взятие адреса против указателей

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

admin аватар

Если бы можно

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

Это получился бы не язык, а бредятина какая-то. Хотя, впрочем, есть и такие языки — та же Java, хотя причины там совершенно не те, какие имеете в виду вы.

> а, наоборот,

> а, наоборот, нельзя было бы обойти указатели, любое имя было бы указателем.

Ну да, я тоже об этом подумал. Потому так и не было сделано в C и Pascal.

С друой стороны, можно было бы усложнить компилятор и сделать так. что переменные, адреса которых ни разу не присваиваются комплируются во что-то вроде mov rax,[12345] (где 12345 — захардкоженный адрес), а где есть присваивание адреса "под капотом" используется пара из указателя и самой переменной.

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

Переменные не всегда лежат по захардкоженному адресу

К сожалению как раз так не "можно было бы усложнить компилятор": локальные переменные находятся на стеке, и захардкодить адреса всех переменных так, как написали вы -- нельзя. Даже если компилятор так усложнить (rust -- отличный пример переусложнённого языка) компиляция становится отдельной трудной задачей, которая занимает кучу времени и требует мощных ресурсов компьютера. Звучит глупо, хочется ответить "да кому нужна скорость компиляции, важна скорость получаемой программы" -- а теперь поймите что в вашей модели от компилятора требуется глобальный анализ программы, то есть эта задача будет расти с около-экспоненциальной сложностью. Итого программировать станет невозможно просто потому что программы будут компилироваться днями (как сейчас компилируются, скажем, браузеры -- только в вашем языке медленно компилироваться будет даже маленькая программа).

Вдогонку -- что такое по-вашему указатель на непосредственные данные? Простите, но моё воображение рисует что-то вроде:
int *p = &5;
В терминах Си. Но это конечно абсолютный бред -- константы не обязательно попадают в сегмент данных, поэтому в машине просто может не быть адреса, по которому к ним можно обратится. Поэтому и нельзя брать адрес от констант в Си.

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

Ещё добавлю по изначальному сообщению:
> var i: integer; p, q: ^integer;
> ...
> new(p);
> q := &i;
> &i := p;
У этой модели все прекрасно, только один вопрос меня одолевает -- а как вы будете передавать в функцию, принимающую данные эти самые данные, если у вас есть только указатель на них? Можно попробовать делать это автоматически -- удачи вам тогда с неявным разыменованием (количество ошибок которые оно спровоцирует мне даже представить страшно) и с согласованием системы типов; а иного выхода нет. Значит в языке будет разыменование -- а тогда спрашивается зачем городить весь этот огород? -- ведь куда проще оставить один понятно ведущий себя механизм.

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

admin аватар

Мне вот больше

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

Операторы и операции

Мне просто пришло в голову, что @ или & могли бы быть не просто операцией, а оператором (не уверен в правильности терминологии). В общем, как ^ или *, только наоборот (и тоже допустимым слева от присваивания).

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

Эта мысль возникла после того, как вы сказали, что выражения с ^ и . (разыменовывание и взятие поля записи) тоже являются переменными, точнее задают их.

Кстати, всё равно остаётся вопрос, а любое ли выражение где последним оператором является ^ задаёт переменную? Вот например a+b+32 (после var a,b: integer;) не задаёт переменную, а что насчёт (pinteger(a+b+32))^ ? По крайней мере ничего не запрещает попытаться забрать значение по адресу, заданному произвольным целочисленным выражением. Ну и записать туда что-нибудь вроде тоже ничего не мешает, главное чтобы этот адрес попал в диапазон, куда разрешен доступ.

admin аватар

(не уверен в

(не уверен в правильности терминологии)

Абсолютно неправильная терминология. Операторы — это законченные конструкции вроде if, while, repeat/until, case, вот это вот всё. По-английски, замечу, это statement, а английское слово operator следует переводить как "операция". В книжке об этом сказано, причём сильно не один раз.

а любое ли выражение где последним оператором является ^ задаёт переменную

С точностью до поправки, что это не оператор, а операция — да, во всяком случае в Паскале результатом разыменования всегда является переменная.

Операция взятия адреса

Ну да, теперь вспомнил. & — это из C.

> Результат операции взятия адреса — это адрес (т.е. значение), а не переменная

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

Как думаете, была бы польза от такой возможности?

admin аватар

Как вы себе это

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

Нет уж, нужен указатель — опишите его явно. А у любой переменной есть адрес, и этот адрес можно получить, на это как раз и есть операция взятия адреса; но изменить его, _очевидно_, нельзя.

admin аватар

В цикле,

В цикле, который выводит все записанные в память числа я заменил tmp на first и всё благополучно работает

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

И суть в том, что, мне кажется, я понимаю как это работает с first, а с tmp нет

Тогда вы не понимаете ни того, ни другого, причём совсем, вообще, никак, даже близко, и это ваше "мне кажется" — штука довольно опасная, может вас потащить по ложному пути. Потому что работает в действительности абсолютно одинаково, только с tmp мы не портим значение first и не теряем, как следствие, сам список.

Ведь временный указатель, в конечном итоге, ссылается только на соответствующий указатель first, а адреса на предыдущий tmp у него ,по идее, нет

К сожалению, это бессмысленный набор слов. Я из него не могу понять, что за чушь творится у вас в голове.

На всякий случай, если я только правильно понимаю, о каком фрагменте кода идёт речь, то tmp НЕ "ссылается" ни на какой first. Никогда, ни в какой момент времени. Кстати, вам жизненно необходимо убрать термин "ссылается" из своего лексикона, иначе так и будете путаться. Указатели не ссылаются, они указывают. И в книге написано, как следует понимать фразу вида "A указывает на B".

Каким образом при помощи tmp мы получаем последовательный доступ к числам стека?

А вот этот вопрос наводит на подозрения, что непонимание у вас возникло намного раньше — судя по всему, вы не вполне понимаете суть циклов. Хотя, конечно, с уверенностью я это заявить не могу, одного заданного вопроса для этого мало.

UPD: Да, кстати, в этом примере нет никакого стека. Односвязный список и стек — сущности не просто совершенно разные, они из разных предметных областей. Стек можно реализовать с помощью односвязного списка, но стек также можно реализовать и на массивах, а если припрёт — то хоть на файлах. А на односвязном списке можно сделать не только стек, но и очередь, и вообще много чего. Откуда у вас эта ущербная терминология? Избавляйтесь от неё.

VladOs аватар

К сожалению, это бессмысленный набор слов.

Я воспользовался схемой из учебника и нарисовал похожую для нескольких чисел, только не убирал tmp из графического представления. У меня получился список first каждый элемент которого указывает на предшествующий, а также созданные tmp указывающие на элементы first. И вот какая получается связь у tmp между собой мне картинка ответов не дала. Хотя я её ради этого и рисовал...

Судя по Вашим

Судя по Вашим комментариям, у меня возникло впечатление (возмонжно - ошибочное), что Вы не понимаете двух вещей:

1) Что такое Запись в Паскале.
2) Что такое указатель.

Думаю, Вам стоит вернуться к этим темам: и не советую при прочтении материала спешить. Лучше 10 раз перечитать, не спеша, но понять как следует, чем прочитать пару раз, думать, что понял, но при построении тех же списков, запутаться в элементарных вещах.

И позвольте узнать: Вы перед тем, как сели за книгу уважаемого автора сайта, обучались программированию где-то, по каким-то иным источникам?

VladOs аватар

Здравствуйте!

Здравствуйте! Да было дело. Это были языки VBA & VB.NET.
Я последовал рекомендациям автора и после главы с указателями нашёл себе задачу (игра) и отложил освоение этой темы до времён когда будут отработаны и понятны основы изложенные до этой темы. И в ходе решения своей задачи я часто перечитываю разные главы.

admin аватар

По-моему, там

По-моему, там всё ещё хуже, у человека имеются какие-то проблемы с присваиваниями и циклами. Не скажу, что он их вообще не понимает, но что проблемы с ними есть — это без вариантов.

admin аватар

А зачем вы "не

А зачем вы "не убирали tmp из графического представления"? Вы понимаете, что tmp — это просто переменная (да, хранящая адрес; ну и что? это 4 или 8 байт в памяти, там нет никакого волшебства), она (в смысле, переменная с этим именем) ОДНА и на каждом шаге получает новое значение? Если у вас их, переменных этих, получилось _много_, а это напрямую следует из ваших слов, то вы сами себя зачем-то запутали, вот и всё.

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

И ещё: нет и не может быть никаких "элементов first". Переменная с именем first — это тоже именно что переменная типа указатель, она хранит ОДИН АДРЕС, больше ничего. В ней нет никаких элементов.

Ах, да, и элементы списка (строго говоря) друг на дружку не указывают. Указывает на следующий элемент списка не весь элемент, а только его поле с именем next, которое представляет собой указатель.

Больше, к сожалению, из ваших слов извлечь я ничего не могу, и что у вас творится в воображении, мне по-прежнему непонятно.

Оператор присваивания в Си

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

admin аватар

Ваш

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

В любом случае:

1) питон тут ни при чём вообще от слова совсем;

2) операция и функция -- это, разумеется, совершенно разные сущности; совпадают они только в математике, но мы здесь не занимаемся математикой.

lake

Мне никак не даёт успокоится один вопрос. Как стандартизаторы проникают в software'ную индустрию. Ну вот я понимаю как например стандартизируют разную технику. Технику не пускают в продажу. В сфере образования те учреждения которые не соблюдает государственные образовательные стандарты закрывают либо меняют руководство. А как стандарты действуют в нашей сфере? Не пустит софт после создания к людям не получится это ведь информация. Неужели есть принуждение? Я чуть не подавился когда узнал, что стандарты iso ещё и стоят денег.

Никуда они не

Никуда они не проникают. На стандарты кладут всегда, когда это получается.
Скажем, на ГОСТ положить не выйдет, если вы работаете с государством, использующим его. В других странах тоже есть свои госстандарты. Тут явное принуждение.
Разработчики компиляторов C++ вынуждены реализовывать стандарты, потому что слишком много пользователей (в т.ч. денежных) иначе сменят поставщика. Потому что девиз "настаящщива си-плюх-плюхера" - сложность ради сложности, возможности ради возможностей. Микрософту это, правда, не мешает на стандарт ложить, когда очень хочется - у них своя экосистема и дурачиться по-своему они вполне могут.
А чаще всего стандартам следуют потому, что сферическая в вакууме программа никому не нужна. Она должна взаимодействовать с другими и отдавать результат своей работы.
Так что принуждение есть всегда, просто не всегда явное. В наше время чаще всего принуждает не барин с кнутом, а пустота в кошельке или желание признания.

admin аватар

Не следует

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

Стандарты и спецификации

Ну так может в этом и дело, что люди не отличают стандарты от спецификаций?

Я вот тоже не совсем понимаю в чём разница. Верно ли будет определение: стандарт — спецификация, официально зарегистированная неким регулирующим органом, например МГС СНГ или ISO? Или вы их как-то иначе определяете?

Стандарт

Стандарт бывает часто чем-то таким умозрительным, бюрократичным и оторванным от реальности. К примеру, мне многие знакомые медики говорили, что Минздрав часто делал такие стандарты лечения больных и назначения лекарств, которые выполнить проблематично (выглядят странно/противоречат друг другу и т.д.). То же самое и в IT - посидели дядьки 3 месяца у круглого стола, почесали головы, и вот вам вылез стандарт.

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

admin аватар

Вот ни фига не

Вот ни фига не десятое. Слово "стандарт" подразумевает некую обязательность, то есть навязывание своего мнения другим, в пределе — всему миру. Лучше это слово вообще не употреблять.

admin аватар

Можно и так, но

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

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

admin аватар

Принуждения

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

Parthen аватар

Чем плох Ардуино?

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

Ругают Ардуино

Ругают Ардуино и его ярых фанатов, на самом деле, ровно за то же, за что и адептов повсеместного использования скриптовых языков - за нецелевое использование инструмента. Его придумали специально для быстрого создания прототипов и для обучения, чтобы помочь начинающим преодолеть психологический барьер, дать понять, что они "что-то могут". Библиотека Ардуино написана так, чтобы максимально скрыть от пользователя самый низкий уровень, без контроля за которым, увы, с микроконтроллерами полноценно не поработать. Кроме того, например, стандартные возможности вроде слежения за временем через millis() или вывода ШИМ-сигнала через analogWrite(), реализованы там с использованием определенной периферии (в частности, таймеров), что лишает пользователя возможности при необходимости использовать их для собственных целей без серьезного перелопачивания всего своего уже написанного кода. Может получиться и так, что кто-то чуть более опытный безо всякой "задней мысли" посоветует неофиту использовать что-то, да хоть те же таймеры, в обход ардуиновской библиотеки (да ты вот так-то и так-то запиши напрямую в регистр значение), что чревато трудно отлавливаемыми ошибками, которые начинающему окажутся не по плечу. Опять же, без понимания того, что вот этот вот конкретно взятый микроконтроллер может или не может, эффективно использовать его не получится (ну а действительно, что может пойти не так, если юзать в хвост и в гриву числа с плавающей точкой на восьмибитном камушке без FPU?). С точки зрения библиотеки Ардуино, микроконтроллеры самых разных семейств и степени навороченности отличаются друг от друга только тактовой частотой и объемами памяти. Поэтому объяснить не очень опытному, но упрямому фанату Ардуинки, что микроконтроллер на ARM'е на его новенькой платке имеет DMA, позволяющий, например, вообще независимо от основной программы выгрузить картинку на дисплей, да еще и максимально быстро, практически нереально, он так и продолжит ждать в цикле установки флажка готовности по передаче каждого байта.
Второй минус - активно насаждаемые и при этом исключительно вредные практики вроде "тупняка в цикле" в ожидании некоторого события или бездумное использование функций задержек, подвешивающих контроллер на вполне ощутимое время. То, что допустимо на "больших компьютерах", где операционная система сама заберет управление у ждущей чего-то задачи, здесь, увы, не работает - "операционная система" здесь сидит на стуле перед компьютером и пишет прошивку.
Наконец, третий минус - засилие библиотек, зачастую весьма посредственного качества, вообще позволяющих отключить мозги. Работа с любым датчиком, дисплеем и прочим - это, в первую очередь, чтение документации на предмет наличия подводных камней. Реально встречались люди, отказывавшиеся использовать "железку", для которой нет кем-то заботливым написанной ардуиновской библиотеки, при том что даташит на нее - это 5 листков, включая обложку и оглавление.
При всем при том, Ардуино - все же хороший инструмент, в первую очередь, для "пробного заезда", чтобы за небольшую сумму (спасибо китайским друзьям!) человек мог понять, а надо ли оно ему вообще. Ну и быстрое прототипирование - тоже большой плюс. Например, я купил какой-то датчик, при этом мне, как минимум, надо убедиться, что он рабочий, но времени посидеть и поковыряться прямо сейчас нет. Я могу взять плохонькую, но хоть как-то работающую библиотеку и увидеть, что железка инициализируется, выдает определенные значения и т.д. Будет время попозже - засяду за документацию, напишу что-то, отвечающее именно моим потребностям. Ну, насколько я могу судить, в вашу задачу это укладывается идеально - поглядеть, что там на этой карточке, да и забыть, скорее всего.

Ардуино

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

Ардуино - это же не совсем про "общее программирование". Это, скорее, про эмбеддинг (вопрос качества "разработки" под ардуино - это вообще отдельная тема).
Разработка для "больших машин" не требует (в общем случае) знаний микроархитектуры ЦПУ (триггеров, дешифраторов, счётчиков и т.д.). Программист оперирует данными на уровне регистров (архитектуры), даже если речь идёт о высокоуровневых ЯП (жабисты и питоняши ни в счёт).
Эмбеддинг же как бы предполагает, что программист владеет основами цифровой схемотехники (по крайней мере уровнем микроархитектуры). Проблема в том, что нынешние начинающие "программисты" встраиваемых систем не желают разбираться в микроархитектуре используемого микроконтроллера, предпочитая вести разработку в лучшем случае так, как это делается в мире "больших машин". Т.е. юзается большое число высокоуровневых библиотек (типа HAL для STM) без малейшего понимания о происходящем на уровне микроархитектуры.
Ардуино - это квинтэссенция подобного подхода с соответствующими последствиями.
Мораль простая - держаться подальше от Ардуино. Есть желание развиваться в эмббеддинге? Значит необходимо освоить азы цифровой схемотехники, чтобы не пугаться излагаемого в даташитах.

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

Типичный пример макакинга - "квалификация" уровня "кое-как могу собрать из готовых библиотек".

Ардуино - все же хороший инструмент, в первую очередь, для "пробного заезда"

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

Ардуино

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

Или как здесь — прочитать/скопировать беспроводной пропуск.

Использование Ардуино

например грелку в аквариум сделать управляемую релюшкой

И зачем для этой задачи использовать ардуино? Более того, данную задачу можно вообще решить без использования МК, даже самого примитивного.

прочитать/скопировать беспроводной пропуск

Ну, может быть. Только какое это имеет отношение к разработке?

Ну вот это вот

Ну вот это вот "без МК" в нынешних условиях - больше вкусовщина, цена какой-нибудь Attiny13 (ок, нагрянувший кризис, конечно, внёс коррективы) да пары деталей в обвязку обойдётся ниже, чем схема аквариумной грелки с компараторами или чем ещё, да и калибровать схему с МК не в пример проще.

admin аватар

В макакинге

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

admin аватар

Как железо он в

Как железо он в общем не так чтоб чем-то был плох, но тут вопрос не ко мне, скорее к электронщикам. А вот с программной точки зрения — ну, э... т-ссссс! Там C++ внутри!

Parthen аватар

Эмм, я ни то

Эмм, я ни то чтобы эксперт по С++, но тамошний язык я понимал, еще когда питонистом был.

admin аватар

Вот

Вот именно.

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

Литералы и константы в Паскале

Как себе правильно объяснить, что такое литерал и константа?

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

Ну а константы - это литералы, значения выражений которых не изменяются.

admin аватар

Нет, всё

Нет, всё намного проще. Литерал — это когда число записано вот прямо циферками, то есть в виде числа. А строка — вот прямо в виде строки с кавычками.

Например, 375 — это литерал. А 5*6 — это не литерал, литералов тут два, 5 и 6. А ещё в Паскале литералом будет, скажем, 'Hello, world'. А в Си литералом будет "Hello, world". Или, например, 'a'.

Parthen аватар

Олимпиадное программирование?

В свете того, что ЕГЭ я сдам не так хорошо, чтобы поступить туда, куда хочу, рассматриваю вариант олимпиад.
Помню тут была тема, что олимпиады травмируют, очень хотелось бы подробностей, а то "Ломоносов" мне даже понравился.

А почему вы

А почему вы решили, что вы сдадите ЕГЭ не так хорошо, как хотелось бы?

Я не знаю, в каком вы сейчас классе, но до конца учебного года еще целых 9 месяцев. Негусто, но достаточно, чтобы сносно подготовиться (студенты на сессии вон вообще за неделю перед заменом выучивают семестровый материал - качество страдает, конечно, но все возможно, если поднапрячься). А если вы в 10-м классе, то у вас вообще 2 года - горы можно свернуть.

Если вас пугает истерия со стобалльниками в этом году, так это, как мне видится, случилось из-за того, что вторую волну зачисления отменили, и стобалльники тупо держали всех на крючке (документы не забирали и висели во всех рейтингах вверху). На ВМК МГУ в этом году проходной балл за 5 экзаменов был (судя по конкурсным спискам) в районе 447 - не мало, но и не так уж много.

В общем, мораль такая - в себя надо верить.

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

И олимпиады все еще сложнее ЕГЭ, если что)

Parthen аватар

>Я не знаю, в

>Я не знаю, в каком вы сейчас классе
11, физмат
>Если вас пугает истерия со стобалльниками в этом году
Только в этом? Тенденция 285+ проходных баллов меня вообще не радует.
>ВМК МГУ
Тут такое дело -- терпеть не могу физику.
>В общем, мораль такая - в себя надо верить.
Вера это хорошо, но кто его знает, надо бы и запасные варианты продумать.

К сожалению,

К сожалению, ЕГЭ по физике вам сдать, скорее всего, придется, потому что, насколько я помню, подавляющее большинство специальностей в вузах требуют именно русский язык, математику и физику. Есть те, которые в дополнение к этим трем требуют еще и информатику (а на ВМК еще дополнительное вступительное испытание по математике в самом МГУ).

А вот так, чтобы требовали русский язык, математику и информатику (без физики) - такого я не помню. Хотя, конечно, может все и изменилось, я ЕГЭ в 2011 году сдавал.

А на самом ВМК физики мало, год всего на втором курсе, и нет там ничего такого, что невозможно сдать.

Если что, я за ВМК нисколько тут не агитирую, я его просто в пример привел, так как сам его закончил.

Parthen аватар

> подавляющее

> подавляющее большинство специальностей в вузах требуют именно русский язык, математику и физику.
Не-а, большинство требуют РМИ, некоторые РМИ/РМФ на выбор, и еще немного РМФ.

admin аватар

Тут такое дело

Тут такое дело -- терпеть не могу физику.

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

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

Это всё, впрочем, никоим образом не означает, что надо на ВМК поступать.

Забавно, что в

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

Например, на паре по основам ИБ я сказал, что в распечатанной лекции, которую нам раздали, разобраться в теме просто невозможно, текст как будто вырван из контекста. На это преподаватель просто пожал плечами :(

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

Как бы последний 4-й курс и боюсь представить, что в университете будет что-то похожее, от чего желание поступать куда-то улетучивается.

admin аватар

Простите, но

Простите, но откуда в колледже, имеющем отношение к IT, могут взяться хорошие преподаватели?

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

Parthen аватар

>дело тут

>дело тут обычно не в физике, а в тех, кто её преподаёт в школе
Не просто согласен, а прямо-таки потверждаю -- так и есть.
>Кстати, такой вопрос тогда, а с геометрией как дела?
Вообще без проблем, особенно если под рукой интернет и можно загуглить подзабывашуюся теорему.
>А с текстовыми задачами
Тоже проблем нет, разве что решал я их как-то по-своему.
Проблемы вот сейчас есть с тригинометрией, поскольку там 100500 формул преобразований, но тоже думаю осилю.
С физикой проблема похожая -- формулы не помнишь вообще, а задача на уровне "Летели 2 крокодила"

Касательно

Касательно тригонометрии очень рекомендую обзорно познакомиться с комплексными числами в объеме понятия, что это вообще такое, и тригонометрического/экспоненциального представлений. В этом случае все вот эти вот "суммы в произведение" и прочее элементарно выводятся через экспоненты.

Тригонометрия

В этом случае все вот эти вот "суммы в произведение" и прочее элементарно выводятся через экспоненты.

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

admin аватар

Вроде бы в

Вроде бы в школе их через единичную окружность как раз и вводят, а как их ещё-то вводить.

Вспомнилась

Вспомнилась цитата (вот слово в слово привожу) из учебника по матану Ильина-Садовничего-Сендова: "...определение тригонометрических функций sin x и cos x с помощью наглядных геометрических соображений имеет логический пробел ... Логически безупречно эти функции можно определить как решение некоторой системы функциональных уравнений".

И далее предлагается три набора свойств, связывающих некоторые функции f(x) и g(x) и доказывается (точнее, говорится "доказать тут не можем, прочитайте там-то и там-то"), что такая пара функций единственна и является, собственно, синусом и косинусом.

Вот бы школьникам понравилось :)

admin аватар

Школьникам бы

Школьникам бы как раз понравилось. Они вообще любят учителя забросать вопросами и в итоге дураком (или дурой) выставить. Между делом, стратегия обороны для учителя очень простая — честно сказать «не знаю», можно ещё предложить желающим ученикам самим разобраться в этом вопросе (интернет в помощь) и сделать доклад. Но почему-то чем хуже педагог подготовлен по своему предмету, тем сильнее он боится сказать «не знаю».

admin аватар

Ну да, конечно.

Ну да, конечно. Ага. Для начинающего самое оно.

Нет, оно, конечно, если в формулу Эйлера (которая с кисинусом) поверить до мозга костей, то всю прочую тригонометрию это сильно упрощает. Вот только одна сложность: лично я так и не понял, откуда эта пресловутая формула взялась. Сиречь, почему возведение в мнимую степень раскладывается именно так, а не как-то иначе. Что она работает — вижу, но вопрос "какого фига" для меня так и повис, и пока что никто мне не смог этого объяснить так, чтобы я поверил. И в моём случае этой истории, как мы понимаем, уже много лет, если совсем точно говорить — то 27 (ибо всерьёз этот вопрос меня заинтересовал при изучении ТФКП на втором курсе, а это весна 1994 года; при изучении алгебры на первом курсе кисинусы тоже всплывали, но тогда у меня были какие-то другие проблемы).

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

почему

почему возведение в мнимую степень раскладывается именно так, а не как-то иначе
Возможно, не совсем вас понял: в смысле, "раскладывается" на cos(phi)+i*sin(phi)? Доказать это нетрудно, разложив cos(phi) и sin(phi) в ряд Тейлора, сложить и сравнить с разложением экспоненты. Или речь была об этом самом разложении в ряд?
P.S. Кстати, насколько я понимаю, в свежем проекте ЕГЭ 2022 по математике возникло задание с комплексным числом, так что какие-то основы в школах должны появиться, по идее.

admin аватар

"раскладывается

"раскладывается" на cos(phi)+i*sin(phi)?

именно

Доказать это нетрудно, разложив cos(phi) и sin(phi) в ряд Тейлора

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

Для сравнения — вот есть такая штука "определитель матрицы", как только его сам не определяют, как только не доказывают его свойства и т.п., но для меня он оставался в категории фокусов, пока кто-то мне не сказал, что это просто объём n-мерного параллелепипеда, натянутого на векторы-строки (или векторы-столбцы). Ну да, объём "ориентированный", но такие мелочи меня уже смутить не могли. Сразу стало очевидно, когда и почему он обращается в ноль, больше того, стало понятно, почему он не меняется при прибавлении к строке линейной комбинации остальных строк, ну в общем реально стало понятно, что он такое. Определения из учебников, будь то через миноры или через сумму всевозможных произведений по одному элементу из каждой строки — возникновению такого понимания не способствуют вообще от слова совсем.

Или вот есть правило Лопиталя. Тоже казалось тузом из рукава, пока вдруг не допёрло, что там в числителе и знаменателе тупо сокращаются dx'ы. Ну а в учебниках доказательства такие, что мне их тяжело проследить, и немудрено, что фокус оставался фокусом.

Ну так вот формула Эйлера для меня по-прежнему фокус.

какие-то основы в школах должны появиться

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

на меня оно,

на меня оно, увы, не действует
А доказательство через предел для e, когда в e(i*phi) = lim (n to inf) (1 + i*phi/n)^n при больших n можно заменить 1 + i*phi/n на комплексное число с модулем, равным длине единичной окружности на комплексной плоскости, т.е. на cos(phi/n) + i*sin(phi/n)? Возведение в n-ю степень для этого комплексного числа - это поворот на свой же угол phi/n n раз, т.е. один раз на phi, т.е. e(i*phi) = lim (n to inf) (cos(phi)+i*sin(phi)). Фактически, выражение, предел которого мы ищем, перестаёт зависеть от n, поэтому предел можно убрать. Или нужна именно геометрическая интерпретация?

admin аватар

Видимо, я уже

Видимо, я уже всё забыл, поскольку вот тут

заменить 1 + i*phi/n на комплексное число с модулем, равным длине единичной окружности на комплексной плоскости, т.е. на cos(phi/n) + i*sin(phi/n)?

мне непонятны оба шага — и почему можно заменить, и почему оно есть cos(phi/n) + i*sin(phi/n)

Наверное, не

Наверное, не мастер я объяснять... :( Но попробую.
Вот у нас комплексная плоскость, образованная осями Re и Im - нашими "как бы икс" и "как бы игрек". Нанесем на чертеж ещё окружность, ограниченную по Re точками (-1; 0) и (1; 0), а по Im - (0; i) и (0; -i). Число 1 + i*phi/n мы изобразим в виде точки с координатами (1; phi/n) на этой плоскости. Для пущей важности можно еще провести линию параллельно оси Im через точку (1; 0) - касательную к окружности. Теперь соединим начало координат с нашей точкой, получим вектор. Если теперь начать увеличивать n, действительная координата у точки меняться не будет, а мнимая начнет уменьшаться, конец нашего вектора заскользит вниз по проведенной касательной, при больших n он все сильнее будет ложиться на ось Re, комплексное число будет становиться "всё действительнее". Если теперь при каждом n из начала координат проводить вектор такой длины, чтобы он упирался в окружность, т.е. равной её радиусу, то мы увидим, что длины векторов будут всё ближе с ростом n (чуть более строго - там член второго порядка малости, .т.к. окружность - кривая второго порядка). Ну а как записать координаты вектора длины r, расположенного под углом phi/n к оси абсцисс? Через проекции (r*cos(phi/n); r*sin(phi/n)). Ну а поскольку "игрек" у нас мнимый и мерится "ишками", в результате получается cos(phi/n)+i*sin(phi/n). Как-то так.

admin аватар

С чего бы это вы

С чего бы это вы "не мастер объяснять"? Как раз тут всё вполне понятно. Просто, видимо, в предыдущем своём комменте вы что-то не то написали, поскольку длины окружности я тут по-прежнему не вижу.

длины

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

admin аватар

Да ладно,

Да ладно, бывает, ещё можно по Фрейду попробовать истолковать :-) Если серьёзно, спасибо большое, у меня одна из самых заковыристых математических непонятностей начала потихоньку рассасываться.

Ну да, Фрейд -

Ну да, Фрейд - наше всё :-) Пожалуйста, на самом деле, тоже не так давно для себя этот вопрос разъяснил, хотя и не спустя 27 лет, как в вашем случае, а где-то 8.

объём n-мерного

объём n-мерного параллелепипеда
Эх, как, оказывается, мне повезло, что нам (далеко не математикам, кстати говоря) в свое время его именно так и определяли в курсе вышмата, хотя и не сразу, после "фокусов" с минорами и прочим.

Определитель матрицы

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

Выглядит, конечно, не так красиво, как "n-мерный ориентированный объем параллелепипеда, натянутого на векторы", но на мой взгляд, вполне интересно.

admin аватар

Не видел, надо

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

Хотя, по правде говоря, без геометрической интерпретации, по-моему, неизменность определителя при "элементарных преобразованиях" останется фокусом.

admin аватар

Формулы не надо

Формулы не надо помнить, их надо уметь выводить. Причём не просто помнить, как они выводятся, а пропустить вывод "через себя", понять, откуда ЭТО взялось и с какого бодуна оно работает. Собственно говоря, все доказательства и принципы вывода ровно для этого и нужны — понимать, как устроена математика. И вот хотите верьте, хотите нет, а схему вывода, если её удалость понять, запомнить проще, чем саму формулу.

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

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

Parthen аватар

>И вот хотите

>И вот хотите верьте, хотите нет, а схему вывода, если её удалость понять, запомнить проще, чем саму формулу.
Опять же, охотно верю, потому что в геометрии я никогда и ничего не учил, для меня любая теорема крайне очевидна.
А физика почему-то неочевидна (хотя по любой логике должна быть наоборот -- моей любимой книжкой была все-таки "Занимательная физика" Перельмана, а не геометрия)

Насчёт

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

Неочевидность физики

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

А в математике все формулы и понятия поддаются логике и следуют непосредственно из аксиом. Математика - это вообще такая вещь в себе, которая работает на умозрительных заключениях, и к реальному миру часто бывает малоприменима (однако, часто бывают и случаи, когда без математики ну вот совсем никуда - формат музыки mp3, например, без нее никто бы не придумал).

admin аватар

Кабы всё было

Кабы всё было так просто, настал бы рай. У меня в начале нулевых был прикольный случай, я тогда работал ещё в коммерческом программировании, и у меня был некий сослуживец — вполне себе разумный человек, с нормальным образованием, весьма правильный программист, всё такое; в общем, сидели мы как-то в кафешке после рабочего дня и свершали возлияние вискариком по какому-то, не помню уже, поводу. Как разговор зашёл про физику — не помню, но кто-то внезапно выдал, что есть в этой вашей физике всякие непонятности и чертовщина, вроде формулы центростремительного ускорения. Так этот мой вполне, вроде бы, разумный сослуживец заявил, что, мол, это вот просто так её придумали, поэтому она такая, придумали бы по-другому, она бы была другая.

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

Не, ну вот реально, эту силу же измерить можно. Динамометром, чтоб его. Откуда там место произволу (типа, что придумали, то и есть)?! Но вот нет, пока не покажешь фокус с формулами, народ самостоятельно мозги не включит.

Что до математики, то бОльшая её часть вообще никак не может быть применена к реальному миру. Например, действительных чисел (тех, что не являются рациональными) в приложениях быть просто не может. Но про mp3 это вы как-то приземлённо мыслите. Берите выше: без математики не было бы физики — вообще всей целиком. И химии, и биологии бы не было. Больше того, везде, где из одних знаний можно как-то получить другие, имеет место математика. А где её нет, остаются гуманитарные (читай, бессмысленные) заклинания.

admin аватар

Ну так вам

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

А можно ответ

А можно ответ на вопрос, почему гравитация и магнитные силы обратно пропорциональны квадрату расстояния? Или хотя бы направление, в котором подумать?

Хочу тоже испытать потрясение)

К таким

К таким комментариям ещё часто добавляют что-то в духе: "Мальчик Витя, 40 годиков" :) А вообще, конечно, любопытно, сколько времени (а иногда и всю жизнь) мы проживаем под влиянием неких установок, чего-то, принятого вот так вот на веру. Всё же, самый главный вопрос в этой жизни - "Почему?", но вот задать его (показав кому-то, что ты чего-то не знаешь) почему-то всегда стыдно.

admin аватар

Я вам признаюсь

Я вам признаюсь честно, когда до меня "это" вдруг допёрло, мне сорока ещё вроде не было, но оставалось уже не так много. То ли 38 мне было, то ли 39.

admin аватар

Представьте

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

По своему опыту

Придётся решать много, реально много, очень много. Забудьте про оформление кода, нейминг. Решать нужно будет на скорость. Если нужно занять место то нужно решать очень быстро. Во время подготовки можете забыть и про нормальное программирование. Лично у меня это не получалось.

Всё задачи там решаются максимум на 100 строк. Если больше то значит вы "неправильно" решили.

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

Вот и получается весь этот самый вред о котором все говорят. Только долго не этим не занимайтесь. После этого по любому придётся лечиться.

admin аватар

Сначала

Сначала оговорюсь, что имелись и имеются в виду только олимпиады по программированию. Про другие предметы я ничего подобного заявить не готов.

Что касается программирования, то здесь есть два фактора. Первый — собственно программирование на скорость, причём когда целью является "чтобы работало". Есть такое понятие "эстетика программного кода", оно неформализуемо и неуловимо, вот просто программа может быть написана красиво, а может быть, пардон за выражение, говнокод. Есть, конечно, определённые правила, я их даже вон в книжку собрал, но это только самое начало, примерно как для художника умение правильно держать кисть, ну или там понимать элементарные вещи вроде перспективы или цветокомпозиции, но не более того. Факт при этом такой, что красиво написанную программу намного проще читать, понимать и модифицировать, и у нормальных программистов вот это вот эстетическое чутьё развивается само собой под действием того факта, что к программе ведь наверняка придётся вернуться, возможно, через год, через пять лет, неизвестно когда, но когда всё забудется и придётся в ней разбираться. Если программу писать как попало, это потом аукнется.

Так вот, на олимпиадах нет никакого "потом", а любые попытки сделать код красивее только мешают, поскольку на это всё-таки нужно потратить время — то самое время, которое на олимпиаде самый важный ресурс. Поэтому если практическое программирование способствует формированию эстетического чутья, то олимпиадное, напротив, любые ростки такового напрочь отшибает.

Есть и второй фактор, который, к сожалению, обусловлен во многом не самим явлением олимпиад как таковым, а безответственностью их организаторов. Как правило, задания составляются так, что участники, пишущие на Си++ с использованием STL, получают преимущество в скорости кодинга; следом за связкой C++/STL идёт пресловутый питончик. Людям, пишущим на нормальных языках, приходится "терять время" на создание списков, деревьев и прочих структур данных, а у этих есть всё готовое. Конечно, код у них получается, мягко говоря, некачественный, но на олимпиадах не оценивается качество кода, только количество формально решённых задач. Никаких мер по ограничению применения таких инструментов, поощряющих макакокодинг, то есть "работу" без понимания происходящего, не предпринимается. Итогом становится, собственно говоря, изучение Си++ в школе, и не просто Си++, а как раз всех тех его аспектов, от которых надо бежать как от чумы. На выходе имеем искалеченные мозги даже без всяких олимпиад.

Вот такая, как говорят, картина. Это, впрочем, не означает, что нельзя участвовать в абитуриентских олимпиадах вроде того же "Ломоносова". Можно и нужно, и далеко не все там пишут на Си++. Только надо к этому делу подходить с известной осторожностью. В конце концов, на машине вон тоже разбиться можно, что ж теперь, на машине не ездить? Здесь есть конкретная цель — поступление в ВУЗ, и если помнить, что цель именно эта (а не "победить и стать чемпионом", как на всеросе), то можно, наверное, избежать формирования того, что я называю "олимпиадностью головного мозга".

codegolf

А как насчёт код-гольфа? Там уже не на время, но побеждает тот, чья программа проходит все тесты, при этом имея наименьшую длину.

admin аватар

Да в принципе

Да в принципе то же самое: стимулируются такие "навыки", которые в практическом программировании следует считать скорее вредными привычками. На практике код следует писать так, чтобы он был в первую очередь понятен человеку, читающему его, и при этих условиях, возможно, ещё эффективен (по времени или по занимаемой памяти, это уже зависит от решаемой задачи). Но в первую очередь — понятен. Минимизация длины исходника в большинстве случаев этому противоречит.

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

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

Кроме C++/STL есть

Кроме C++/STL есть ещё Java с его длинной арифметикой.

Вот прямо вот

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

admin аватар

Я его не скрыл,

Я его не скрыл, я его раскрыть не успел. У меня другие дела есть, кроме как тут разгребать очередь на премод :-) А вообще мой-то комментарий был написан раньше.

У вас ключик

У вас ключик истёк.
http://www.croco.net/croco/croco_public_key.html

admin аватар

Он уже

Он уже двенадцать лет как истёк.

UPD: как оказалось, секретный от него я потерял, так что убираю эту страничку нафиг.

Вы

Вы разочаровались в pgp?

admin аватар

Не так чтобы

Не так чтобы разочаровался, просто мне ни разу не потребовался этот ключ. То есть там вообще была целая история, ключ я сгенерил, когда предстояла некая глобальная встреча с анонсированной key signing party; принёс домой ворох ключей от людей, лично со мной знакомых, они все домой принесли мой ключ, и, видимо, все всё подписали, куда-то там загрузили (не помню куда, давно дело было), я даже fingerprint своего ключа на визитке напечатал... и... и... и ничего.

Когда ключу подошло время экспириться, я внезапно осознал, что за три года ни разу им не воспользовался. Ну и всё, собственно :-) вся история.

Программа на Паскале.

Добрый день.
Пишу это дабы поделиться опытом изучения программирования и задать автору и более осведомленным гостям насущные вопросы.
При прочтении вашей книги, а конкретнее на момент окончания темы о языке Паскаль, так и не смог придумать себе интересную задачу, которую бы хотел решить на нем. Оставил немного на потом (как уже выяснилось, что на сейчас). На данный момент прошел ассемблер и нахожусь на "серединке" си. Да простит меня автор за не соблюдение предписаний, ваша книга раз за разом отвечает на мои вопросы, накопленные за несколько лет изучения компьютеров до того, как я наткнулся на этот труд, поэтому остановиться читать не смог (очень сложный паст перфект да еще и континиус в данном предложении, прошу прощения, если не прав в пунктуации, и вообще построении предложения). Надеюсь, что ничего себе не "травмирую", как вы говорите, проходя эти языки без серьезной практики. На данный момент серьезно озадачен тем, чтобы это наверстать.
Естественно пока совсем не претендую на оценку "отлично", но считаю, что именно понять работу с памятью и указателями мне удалось хорошо прочитав и разобрав примеры, без написания чего-либо серьезного, а ассемблер только укрепил понимание в разы. Вероятно это "благодаря" тому, что я начинал изучение программирования с цирка на "шарпах" по урокам на ютубе и однажды дошел до того, что не смог создавать объекты во время работы программы, тогда у меня появилась тысяча вопросов по поводу того, как же это вообще должно работать и что, собственно говоря, я делаю не так (у каждого свой путь, не судите строго).
Так вот, на данный момент придумал себе пару задач. Если по второй, план более менее ясен, по ней все можно найти в интернете, то первая потребовала от меня получить из файла изображения цвета пикселей, например в RGB (такое решение в итоге породил мой мозг). Собственно говоря, моя неосведомленность завела меня в тупик с самого начала (в школе мне не рассказывали про файлы изображений, а в университете я вообще пытался стать инженером энергетиком). Я сразу не стал лезть в интернет, дабы понять, что я вообще делаю и зачем, и решил сформировать перечень вопросов, которые возникнут по ходу моего действия. За пример был взят файл в формате ".jpeg". Пройдясь по файлу hexdump'ом, я выяснил, что все будет несколько сложнее и заветных цветов я не найду. Пришлось полезть за ответами в сеть. То, что существуют алгоритмы сжатия - не стало для меня сюрпризом, но то, насколько сложно сделать обратные преобразования ввело в ступор, сдаваться крайне не хотелось. По какому принципу данные располагаются в таком файле разузнать я смог. Далее идут такие понятия, как: таблица квантования, таблица Хаффмана и древо кодов по ней, обратно дискретно-косинусное преобразование. Во все это придется довольно серьезно вникнуть ради получения цветов изображения. Но ведь есть и другие форматы изображений. Естественно, брать готовые "декодеры" не имеет никакого смысла. Подскажите, в правильном ли направлении я смотрю? Правильно ли будет относить такой файл к типизированным при его чтении? В самом деле довольно часто примерно по таким причинам откладываю написание какой-либо программы - не понимание каких-либо базовых вещей. Именно поэтому сильно хочу прочитать третий том (читаю версию в четырех томах), кажется там есть очень много полезного. Буду признателен, если получу какие-нибудь советы!

Разбор и формированиие бинарный файлов

Я бы не советовал начинать сразу с jpeg, лучше возьмите... Да даже наверное не BMP, возьмите netpbm. там формат ещё проще и сделан прямее чем микрософтовский. Ещё есть формат tga (targa), тоже простой, но всё же не настолько.

А дальше можете браться за png, формат уже посложнее, но всё равно вполне можно проигнорировать некоторые фичи и осилить.

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

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

Если стоит

Если стоит задача научиться получать из файла изображения получать цвета пмкселей в RGB, то лучше попробовать этим заняться на картинке в формате BMP. Я предлагаю делать именно так, потому что файл BMP представляет собой, по сути, просто трехмерный массив данных картинки (первое измерение - ширина, второе - высота, третье - цвета), который поместить в оперативную память и разобрать будет несравненно проще, чем JPEG. На самом деле, конечно, в файле BMP лежит не только массив с самой картинкой, а еще и заголовок в самом начале файла (заголовок - это некоторые служебные данные, необходимые для работы с форматом BMP, такими данными могут являться, например, длина и ширина картинки). Конечно, помимо описанного в формате BMP будут еще другие детали, но зная концепцию, совладать с картинкой уже будет проще.

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

Если вы хотите прочитать в оперативную память файл в формате JPEG, то здесь вы наткнетесь на более сложные концепции сжатия изображений с потерями, которые основаны на математике. Если есть силы это вникать, то можно либо просто прочитать в интернете про сжатие с потерями вообще и про JPEG в частности, либо почитать книжку Ватолина Д.С. про сжатие, там про JPEG есть глава, книжка вот тут: http://compression.ru/compression.ru/book/. Предупреждаю - сам книжку от корки до корки не читал, но в любом случае после ее изучения картинка должна стать яснее.

admin аватар

Я бы не взялся

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

А "заветные цвета" — ну, за этим в .bmp, там нет сжатия.

Что до выбранной последовательности чтения частей книги — вы же не совсем новичок, если текст хорошо, как нынче говорят, "заходит", почему бы его и не читать. Работу с памятью и указателями вы освоили, это примерно половина того, ради чего я рассматриваю в книге Паскаль. Вторая половина — прочувствовать печёнкой разницу между функциями и процедурами и никогда потом про неё не забывать (в большинстве применяемых ЯП такой разницы нет, но это как раз и означает, что продолжать отличать процедуры от функций — важнейшая задача для воображения программиста).

BMP

Почему все советуют BMP? Для импорта и экспорта графики форматы netbpm гораздо лучше. А у BMP полно версий и правильный парсер сделать будет сложнее. И опциональное сжатие там тоже есть.

Ну тут же дело

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

А почему BMP, а не netbpm - да потому что это первое самое простое, что в голову приходит. Я вот про netbpm не знал.

Я встречал BMP в

Я встречал BMP в загрузочных заставках Windows (logo.sys) и телевизионной приставки (просто BMP-файл) прямо на разделе.

Я думаю можно в принципе попытаться парсить BMP-файл какого-то конкретного формата, например от Windows 95, а если будут флаги расширенных возможностей, писать про них и вываливаться с ошибкой.

Как можно

Как можно побороть свое желание "изучить все быстренько и перейти к Си"? Проблема в том, что (ранее) первым языком программирования стал C# с ООП; узнал о вашем трехтомнике, стал читать. Паскаль дался легко, написал змейку на crt, позже появилась идея написать программу для решения квадратных уравнений с графиком, решил отложить это до Си, "там больше возможностей будет". Прочитал часть по assembler'у, двинулся к Си и... Чего-то не хватает.
Осознал, что практики и на паскале, и на ассемблере было мало. Вопрос: можно ли вернуться ко второй части и попробовать снова?
Не поздно ли?

admin аватар

Конечно можно,

Конечно можно, почему нет-то? Это вперёд лезть может быть преждевременно, а вернуться назад и зачистить что-то в тылу — это никогда не поздно, по-моему. Даже наоборот, с высоты нового опыта (вот этого вот "чего-то не хватает"), возможно, как раз обратите внимание на что-то такое, что раньше пропустили мимо.

Спасибо за

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

admin аватар

Бороться не

Бороться не надо, само пройдёт.

Parthen аватар

Вести с полей

А нас в учебнике для 11 класс ИКТ учат, значится ООП (к сведению, мы не знаем что такое указатель) и динамические веб страницы на JS.
Ну еще и на новый мессенджер "Сфера" по приказу переходим, ура блин.

admin аватар

Я видел много

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

Parthen аватар

До недавнего

До недавнего времени мой учебник мне таким и казался -- он хотя бы пытается отвечать стандартам.
BTW, в Сферуме я все же вижу хоть сколько-то разумное зерно. Если выгнать нынешних программистов, получится даже неплохой сервис. Ну а пока я объясняю техподдержке что такое JS и почему я не буду пользоваться Electron

А яма-то востребованная!

Доброго всем дня.
Экспозиция:
Очень люблю open source(и далеко не за бесплатность, честно). Но и все бесплатное, чего греха таить, я тоже люблю. А уж делиться с кем-то (по большей части собственно созданным) и разделять восхищение от этого - блаженство одним словом. А еще я знаком с вашей работой про инфор. насилие и инфор. свободу.
И вот тут у меня произошло "замыкание".

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

Кульминация:
Дурно от того, что кто-то продает воздух. Но согласен с тем: кто хочет и другим не мешает - тот делает, что хочет.
1.Так чем же плохи платные биты, если они мне не нужны и я на них не трачусь? Так сказать, если кто-то готов заплатить, значит тот, кому платят просто угадал(ему повезло, никто ничего никому не должен).
2.Читал ветку с польз. Parthen(привет ровесник!). И было там что-то похожее с "игры - отдельная категория", "одно дело код, другое дело сюжет и краски".
Ув. Андрей Викторович, прошу вас, как философа и программиста в одном лице, помогите развидеть границу всего этого дела!

Благодарю.

Parthen аватар

>Читал ветку с

>Читал ветку с польз. Parthen
Привет :)
> Но мой друг хочет именно этот хоррор (именно эту яму), более того, он готов добровольно заплатить за него (за эти биты). И платит.
Заодно платит издателям-копирастам, площадке и т.д.
А потом разрабы поймут, что это все выгодно, и будут еще больше клепать игр, заодно заплатят издателям, рекламщикам и прочей нечисти.
>"игры - отдельная категория", "одно дело код, другое дело сюжет и краски".
Тут в том плане, что современные игры как фильмы, их фиг выпустишь без вышеописанной нечести. Это плохо, и без этого даже можно обойтись -- краундфандинг вам в помощь. Но из меня оратор, как из толстяка балерина, так что переубеждать я никого не умею, не хочу и не буду. Просто мое скромное условие -- все что я разрабатываю я на линуксе раздаю бесплатно.
Ну вот вообще я не считаю особым злом людей, которые это все продают. Зло намного большее кто научил людей, что можно все это продавать. А между прочим, вся это копирасткая хрень принадлежит Биллу Гейтсу "Открытое письмо любителям". Вот прям точь-в-точь аргументы копирастов: "Бесплатное делают любители, а платное оно хорошее", "Вы обесцениваете труд программистов" и проч.

Выскажу свое

Выскажу свое мнение. Я против продаже битов и байтов, но (!) я считаю, что программист имеет право делать со своей программой, что угодно. Это его желание выкладывать исходники или нет, например. Я планирую выпускать бинарники своих программ, и пусть люди добивают до какой-то суммы программу на моём сайте и только тогда получают исходный код. Не хочется даром отдавать свой труд публике, тратить свою жизнь на вколачивание кода, чтобы моей программой пользовались, но не было ситуации когда мне не задонатили и цента. Так ведь и случилось с тем JS-ником, который испортил свой репозиторий из-за того-что его пользователи не отблагодарили (вроде максимальный донат был 2 доллара, ЛОЛ).

Можно тогда и

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

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

admin аватар

Между прочим,

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

Ну, по правде говоря не "ровно так". Во-первых, я к тому времени уже кучу книжек понаписал — все сугубо задаром — и мог как-то обосновать для публики, что реально собираюсь (и, главное, могу) сделать то, что обещаю. Во-вторых, я, собственно, на серьёзное вознаграждение не надеялся, финплан был таков, чтобы просто суметь это всё написать, издать, при этом не разориться и зубы на полку не сложить. Если бы я то же самое время потратил целенаправленно на зарабатывание денег, то заработал бы, э... ну, раз в шесть-семь больше. Проблема в том, что в этом случае я ничего, кроме денег, для себя бы не получил, а так я заделался в авторы вот такой вот книги, и сей факт, в отличие от денег, никакая инфляция не сожрёт и никакие бандиты не отнимут.

Фразу про исходники я не распарсил. В смысле, прятать исходники, конечно, бессмысленно, но при чём тут "не потеряли"?

admin аватар

Мда. Имеете ли

Мда.

Имеете ли вы право не отдавать исходники? Да имеете, конечно. Информация ваша? Ваша. Коммуникация — взаимодействие с другими людьми? Несомненно. Значит, вы сами решаете, вступать в коммуникацию или нет.

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

Но дело тут не в этом. Слушайте, вот вы не хотите "даром отдавать труд публике", а что, хоть кто-то заставляет?! Хоть кто-то, может быть, просит?! Да ни фига, ни того ни другого. Идите и продавайте свой труд, спрос на программистов нынче высок как никогда, и будет ещё выше. Не хотите в офисное рабство — пишите софт на заказ, этот рынок тоже бездонен как чёрная дыра. Или вообще бросайте нахрен программирование, займитесь производительным трудом (под которым можно понимать только и исключительно производство материальных предметов), ну там ларёк с шаурмой откройте, например. Окружающий мир предлагает вам громандный ассортимент способов продать часть своей жизни не просто за деньги, а за вполне себе неплохие деньги.

Но нет же, чёрт подери. Вы, судя по декларируемым намерениям, хотите учинить очередную инициативную разработку, т.е. делать нечто такое, о чём никто вообще-то не просил — и по каким-то неведомым причинам уверены, что вам за это кто-то что-то должен. Что, видите ли, "публика" сильно не права, если вдруг (о блин) не хочет донаты слать.

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

вся это

вся это копирасткая хрень принадлежит Биллу Гейтсу "Открытое письмо любителям"Билл с друзьями внаглую использовал проприетарныю университетскую систему для разработки своего клона Бейсика под Altair.

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

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

Доступные микроЭВМ с CP/M и Apple стали доступны чутҗ позже.

admin аватар

Вот так вот,

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

Parthen, мотай на ус :)

Этика

> в каких-то случаях нехорошо, но можно

А вы для начала определите, что такое "можно". В принципе любая копирастия в каком-то смысле "можно" — если ты закопирастишь любую фигню, тебя скорее всего не убьют и тебе вполне вероятно удастся выжать из неё какие-то деньги (хотя это смотря как будешь публиковать). Ну даже не удастся — ничего не потеряешь, кроме репутации у гиков.

А если "можно" в смысле "морально допустимо", то это видимо эквивалент отрицания "нехорошо", а значит "можно, но нехорошо" невозможно.

admin аватар

Я бы сказал, что

Я бы сказал, что между "нехорошо" и "такая бяка, что за это надо к стенке ставить" имеется довольно приличное расстояние, так что невозможность варианта "можно, но нехорошо" лично для меня выглядит абсурдно. В жизни сплошь и рядом приходится идти на компромиссы, и это всегда как раз и получается "нехорошо, но можно/допустимо".

admin аватар

Вот тут уж как

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

Тот, кто написал игру и выложил её по принципу "хотите платите, не хотите как хотите" — игру писал ради денег. Заведомо. Такие люди наносят вред окружающей среде и цивилизации. Те, кто готовы поддержать проприетарщиков своими деньгами, поддерживают (цитирую сам себя) отжившую модель общественных отношений, направленную на интересы экономических паразитов, которым давно нет и не может быть места в мире. Все прогрессивные люди шкурно заинтересованы в том, чтобы проприетарщики вымерли (к сожалению, не все прогрессивные люди это понимают, но это вопрос времени и разъяснительной работы); следовательно, тот, кто платит деньги проприетарщикам, наносит вред всему обществу (это фиг бы с ним) и лично мне, как заинтересованному в смерти копирайтной парадигмы (вот это уже не фиг с ним).

Что тут непонятно-то?

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

хотите платите,

хотите платите, не хотите как хотите
Я почему-то "как хотите" воспринял как "не платите", т.е. берите за так, но, коль неудержимо хочется поддержать разработчика, можете занести. Ну, был у человека, как сейчас говорят, pet-проект (мало ли, силы свои проверить, ценный опыт получить, просто "по фану" и т.д.), который взял и вырос во что-то такое, что людям показать не стыдно, за что процент появившейся аудитории готов заплатить по доброте душевной, несмотря на бесплатность. "Плохо, что ли? Хорошо!" (c) Это же обычные донаты получаются.

admin аватар

Не надо

Не надо подменять обсуждаемый предмет. Сбор пожертвований — это сбор пожертвований, в нём нет ничего плохого. Требование оплаты — это требование оплаты, то есть "можно не платить" означает ровно одно: тогда и перебьёшься без моего "продукта" (ненавижу это слово, есличо). Попытки валить в кучу принципиально разнородные сущности приводят только к одному: публика отвлекается от сути.

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

ненавижу это

ненавижу это слово
Знаю :) "Кто сдает продукт вторичный, тот питается отлично!" - кажется, так у Войновича было?
А по поводу пет-проекта я не предполагал никакого подвоха - все свободно доступно, при этом есть возможность поддержать автора совершенно добровольно в режиме пожертвования. Вообще, мне очень понравился обсуждавшийся здесь с тов. Parthen некоторое время назад вариант: бери свободно исходники с сайта разработчика и "цомпеляй"; хочешь готовый бинарник, скажем, под M$ - выкладывай эти самые "$".

<вариант: бери

<вариант: бери свободно исходники с сайта разработчика и "цомпеляй"; хочешь готовый бинарник, скажем, под M$ - выкладывай эти самые "$">
При таком раскладе $ вообще никто не занесёт, ИМХО.
Если выложить бесплатно - кто-нибудь, может быть, кинет донат. Если требовать денег за лицензию - возможно, кто-то заплатит, чтобы товарищ майор не того-этого. А требовать денег за компиляцию, да ещё и под винду - дело заведомо гиблое, ибо торренты живут и здравствуют, а "поддержать разработчика" при таком отношении к пользователям едва ли кто захочет.

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

admin аватар

пользуйся

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

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

С учётом этих двух поправок — да, всё в порядке. Техподдержка — это время, потраченное по заказу. Воплощение "хотелок" — это тоже время, потраченное по заказу. То есть здесь всё чисто.

admin аватар

Ага, Войнович,

Ага, Войнович, "Москва-2042". У меня ровно этот же триггер всегда срабатывает на слово "продукт".

при этом есть возможность поддержать автора совершенно добровольно в режиме пожертвования

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

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

Точки зрения дают линии прогресса

Мм-м-м, т.е. делиться чем-то своим, но требуя за это деньги, так же как и платить за это - есть поддержание того, что наносит вред обществу(в которое вхожу я, а значит и мне), поскольку таким образом мы поддерживаем то, что помогает выжимать соки из людей, а не то, что помогает этим же людям творить...
Копая глубже, понял, что хотел заиметь аргументы в свою пользу для спора с "копирастами", которых никак не мог переубедить из-за чего считал себя неосведомленным, либо глупым (есть в контактах пара художников, нет, после ваших слов, даже неких наемников, жаждующих денег), в итоге понял, что и спора-то не было - лишь монолог от моего лица и словесный поток негодований на весь мир. Пока они озабочены макс. извлечением прибыли из того, что слепили, они не станут слушать то, что этому как-то противоречит. Можно ли им как-то помочь?
Благодарю.

admin аватар

делиться чем-то

делиться чем-то своим, но требуя за это деньги,

У вас бардак с терминологией. "Делиться" и "торговать" — это принципиально различные действия.

есть в контактах пара художников, нет, после ваших слов, даже неких наемников, жаждующих денег

Между прочим, "наёмники" — то есть те, кто делают что-то по конкретному заказу конкретного заказчика — ничем не плохи. Повторяю в сотый раз, есть две сущности, имеющие право стоить денег: материальные объекты и человеческое время, потраченное по конкретному заказу конкретного заказчика. "Наёмники" превращаются во вредителей только в одном случае: если они собственного заказчика, который весь банкет, собственно говоря, и оплатил, ещё и ущемляют в правах на то, что было сделано на его деньги. Да, такие уроды тоже встречаются — например, заказчику, по заказу и на деньги которого разработан некий софт, не предоставляют от него исходники. Очень уж им хочется одного коня продать десять раз. В целом это просто мошенничество, следовало бы в УК специальную статью ввести.

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

Вы все верно

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

А crt считается?

Добрый день, после изучения модуля crt по вашей книге, загорелся желанием сделать игру... С оконным интерфейсом в терминале? В общем, очень хочется сделать что-то наподобие рпг в "termianl ascii based style".
В голове заела мысль: после запуска игры и нажатия "start" открывается некий слой графики с информацией (проще: как в NetHack'е). Далее делаем шаги, туда-сюда, исследуем локации(в общем, по классике жанра).
НО!
При нажатии опр. комб. клавиш поверх игрового поля/слоя (!) открывается (отрисовывается?) экран, допустим инвентаря. Нажав другую комб. клавиш, экран (слой?) инвентаря закрывается/стирается и открывается/отрисовывается карта локаций, которая, опять же, закрывает основной игровой слой.
Вопрос: считается ли это пресловутым рисованием окошек способных исказить мышление? Да и что вообще можете посоветовать? (например, в голову пришла мысль открытые слои хранить в дин. стр. данных. Закрыл "окно" инвентаря - удалил структуру связанную с ней. Ну, чтобы у нас хранились данные о том, что было "под" и "над".)

Благодарю.

admin аватар

Если вы этот

Если вы этот интерфейс сделаете сами, то нет, это не будет даже близко по эффекту к тому "рисованию окошек", которое может испортить мозги. Вот если взять готовую библиотеку виджетов (тот же Turbo Vision), то да, это будет то самое.

По поводу "как сделать" — да, придётся всё хранить. Либо просто в массиве посимвольно, либо как-то там хранить объекты, которые у вас видны на игровом поле, так, чтобы уметь в любой момент "отрисовать" любой кусок поля.

Ка-лам-бур?

Вас понял! Да, я хочу сам без виджетов, с одним лишь crt отрисовывать окошки. И вот тут небольшой каламбур. А что если я сам создам эти виджеты(или API или библиотеку, к сожалению, мне правда недостает опыта, чтобы говорить точно, но хотелось бы выражаться ясно, прошу прощения), например, когда захочется упростить процесс рисования и буду их использовать? Тогда чем это отличается от тех виджетов?
И не могли бы вы поподробнее рассказать как "рисование окошек" может испортить мозги? В смысле, как именно, что нужно сделать/написать/придумать?

P.s. Да и в моем случае: не лучше ли оставить идею для языка Си, а по Паскалю вспомнить адреса и указатели? (полгода назад написал программу в >1500 строк на Паскале + весь 1 том прочел, но боюсь что это уже не считается).

Благодарю.

admin аватар

Если вы сами

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

не лучше ли оставить идею для языка Си

Это уж сами смотрите :-)

а по Паскалю вспомнить адреса и указатели?

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

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

Константы на чистоту

Добрый день, сперва благодарю за ваши ответы на мои вопросы. А вот и очередной из них:
Я изучаю Паскаль, т.е. нахожусь на 1 томе. И возник вопрос,
что такое константы? Чтоб вы лучше понимали, объясню все как я понимаю.
Переменные на момент написания исходного кода являются простыми "словесными" обозначениями (MyVar, WelcMsg и т.п.).
Затем, на момент компиляции, компилятор заменяет эти идентификаторы на адреса (насколько я помню виртуальные, которые потом хитро подставляются под настоящие в памяти, не суть). Вообщем, под них отводится реальные области памяти ОЗУ которые могут изменяться.
Прелюдия завершены.

Константы.
На момент написания исходного кода явл. так же простыми обозначениями как и переменные (MyConst, WelcMsg и т.п.). Понятно и логично.
Затем на момент компиляции, компилятор заменяет эти идентификаторы на ... их обозначения? Всмысле, если:
MyConst = 123;
То везде где встречается MyConst компилятор заменяет его на двоичное представление числа 123? Т.е. под константу не выделяется область памяти которая могла бы изменяться, а лишь та область памяти которая загружена как инструкция наподобие инструкций writeln, readln, которые процессор прочел-исполнил-забыл?
Ну и еще немного. Как компилятор определяет тип констант, а именно что мой MyConst integer, а не longint (или наоборот)?

Благодарю.

admin аватар

компилятор

компилятор заменяет эти идентификаторы на ... их обозначения?

Идентификатор как раз и есть "обозначение". А вот то, что справа от знака равенства — это значение. Если речь идёт конкретно о нетипизированных константах в Паскале, то да, компилятор при компиляции (это важно) заменяет идентификатор его значением.

Как компилятор определяет тип констант

А зачем? :-) Точнее, компилятор-то их как-то определяет, но вот зачем вам ответ на вопрос, как он это делает?

Если совсем честно, то этот вопрос вполне законный, и в языках вроде Си++, где имеет место перегрузка по типам аргументов, он даже встаёт во весь рост, но там и правила другие, и есть вполне внятный ответ на вопрос о типе каждго конкретного литерала, а нетипизированных констант — таких, как в Паскале — там вообще нет, приходится использовать всякие хаки вроде макропроцессора. Больше того, FreePascal вообще-то умеет перегрузку по типам, только тссссс! — не вздумайте этим начать пользоваться, это чудище туда вставили для совместимости с каким-то из безумных диалектов, не знаю даже с каким. Но в норме этот вопрос у вас не должен был возникнуть, вот мне интересно, откуда он взялся.

Из беседы с "питонистом"

Полностью согласен с обозначение != значение, и принимаю к сведению. Вашим ответом удовлетворен(ниже отмечу почему)!
Честно, ничего ни о С++, ни о всяческих перегрузках не осведомлен, так что я все равно ничего не понял, простите.
А если совсем честно, то вопрос:
Как компилятор определяет тип констант? - породил мой друг, пишущий на Python(сдаёт ЕГЭ). Раз вам интересно, то попрошу его подробно отписать вам по этому поводу :). Заодно отмечу, что ему константы не даются, да настолько, что ему удалось запутать меня, и я пришел к вам за помощью (благодарю за оную!).

P.s. возможно, всему виной этот Python (между прочим он и меня донимал в первые дни изучения ваших книг из-за своей простоты. Да, Паскаль как по мне очень строгий). Например, опять же моему другу, очень плохо дается как с пониманием так с различием функций и процедур между собой, (к сведению, он пообещал мне сделать из процедуры функцию за что я его отругал :)). Идей, откуда же взялся этот вопрос, у меня нет. С наилучшими пожеланиями!

Друг отписал

Друг отписал мне, что ему все понятно после ответа из выдачи поисковой машины:
"Компилятор определяет тип констант автоматически".

Какой-то странный друг...

Любопытно, конечно: друга, пишущего на Питоне, вдруг взволновал вопрос, откуда компилятор (sic!) узнает про тип констант. Передайте, пожалуйста, другу, что Питон, во-первых, не относится к компилируемым языкам (ну ладно, Cython, насколько я понимаю, допускает компиляцию, но в подключаемый к Питону через API модуль - это, как говорится, две большие разницы). Во-вторых, в нем НЕТ констант. Вот то есть совсем нет. Все, что там есть - некие данные, в момент выполнения конструкции типа N = 5 располагаемые где-то в памяти и снабжаемые "псевдонимом" N. Как только последний псевдоним "всё", эти данные сжирает сборщик мусора, которому пофиг, "константа" там, "переменная" (а их, строго говоря, там тоже нет, по крайней мере, в традиционном понимании) или еще чего. Существует "правило хорошего тона", требующее называть питоновские "константы" заглавными буквами; откуда оно взялось (и почему применительно к Питону выглядит дурацки), друг узнает, если почитает адекватные книги по программированию, в частности, если дойдет до 2-го тома "Введения в профессию". Но "константами" они от этого не станут, увы...

По-моему совету

По-моему совету он также изучает 1 том. Да, он пишет на Паскале и умеет их компилировать. Дошел до констант и задался таким вопросом. Про компилятор и его отличия от интерпретатора он узнал благодаря книгам Андрея Викторовича. Несмотря ни на что, ваши слова ему передам. Мало ли, тайна откроется :)
Благодарю.

admin аватар

Вот даже

Вот даже интересно стало: а что, компилятор хоть что-нибудь делает НЕавтоматически? Ну, там, останавливается и спрашивает, что делать дальше? Или как?

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

Однажды вы

Однажды вы как-то сказали что-то подобное:
"У настоящего программиста, при виде новых возможностей, начинается зуд от желания их попробовать"
Вероятно, столь "нулевое" объяснение принципа работы, смогло удовлетворить запрос незамотивированного пользователя. Иначе говоря - не захотел копать глубже, ибо "фиг с ним", ибо скучно. Как-то так :)

Андрей

Андрей Викторович, добрый день!

Интересует ваше мнение о должностях разработчиков. Сейчас многих сайтах поиска работы на должности ведущих разработчиков (т.н. "сеньоры") могут приглашаться люди, имеющие от 3 лет опыта работы. В моем понимании это маловато (в самом деле, какой-нибудь врач с 3 годами опыта после университета - интерн или ординатор, но никак не ведущий специалист). Как думаете, сколько лет опыта работы должно быть у разработчика, чтобы он считался мастером своего дела? (ясно, что на скорость развития влияет куча факторов, но усредненное мнение, наверное, можно сформировать)

admin аватар

Во-первых, и

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

Я попытался представить, как что-то подобное делает будущий врач, и мне как-то стало слегка дурно. Программист имеет дело с железякой, даже не шибко дорогой, тогда как врач — с живыми людьми. Учебные этюды на живых людях — ну я могу себе такое представить, такое в истории даже бывало, но... но. No.

Ну а во-вторых, э... хорошо бы, конечно, пригласить на должность ведущего специалиста какого-нибудь зубра с двадцатью годами стажа, только где его взять-то, зубра этого? И денег на него где взять? Особенно если учесть, что чуть менее чем все осмысленные люди давно уже в Канаде и Австралии, так что здесь программисты зачастую оказываются дороже, чем там, причём в абсолютных величинах.

Parthen аватар

Прошу помочь

Прошу помочь придумать решение следующей задачи на Pascal:
Есть программа, она должна при запуске подождать 5 секунд и вывести текст, но если пользователь нажал какую-либо клавишу -- вывести текст досрочно. Вопрос, как это сделать?
Единственное решение, которое я придумал -- лобовое и немного идиотское -- сделать цикл for, в каждой итерации которого ждать 100 мс, проверять ввод, после чего увеличить счетчик, который должен дойти до 50.
Но мне такое решение кажется крайне неудачным.

admin аватар

Как эта задача

Как эта задача решается "совсем правильно", вы узнаете из шестой части книги :-) Я не знаю, достаточно ли средств в библиотеках FreePascal, но в любом случае устраивать работу с сигналами и/или параллельными процессами на этом, в общем, учебном языке — идея так себе. Ну а без помощи операционной системы тут не обойтись.

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

Parthen аватар

>Как эта задача

>Как эта задача решается "совсем правильно", вы узнаете из шестой части книги
И так всегда, обидно.
В общем писать не-пошаговые игры на Pascal затруднительно, хех.
>Цикл, который просыпается десять раз в секунду, процессор толком не нагрузит
А какой нагрузит? Если уж делать так, я хотел бы уменьшить эту возможную задержку.

admin аватар

> А какой

> А какой нагрузит?

Ну, сто тысяч раз в секунду, возможно, уже и нагрузит, учитывая, что delay требует системного вызова. А так -- прикиньте сами. Не знаю, какая у вас тактовая частота процессора, допустим, 2GHz. Это, стало быть, 2 миллиарда тактов в секунду. Сложение проходит за один такт, умножение, если мне склероз не изменяет, за четыре. Близкая передача управления, которая имеет место в вашем цикле, что-то типа двух или трёх. На самом деле там всё сложнее, поскольку процессор выполняет команды конвейером (несколько одновременно на разных стадиях обработки), но для грубой оценки вполне сойдёт. Понятно, что в основном жрать процессор будет передача управления в ядро ОС и обратно, которая имеет место для реализации delay. Вот тут оценить труднее, но... э... грубая оценка в 1000 тактов покроет это с запасом (подозреваю, реально там меньше в несколько раз). Итого, у вас таких итераций цикла, даже если оставить оценку 1000 тактов на системный вызов, процессор успел бы сделать два миллиона в секунду.

fluorine аватар

> Ну, сто тысяч

> Ну, сто тысяч раз в секунду, возможно, уже и нагрузит
==
Странно, мой нагрузился на 3%. Не особо мощный Pentimum 1.10GHz. delay(1), то есть 1000 раз всего лишь а программа проста как два валенка, просто точка которую при долгом нажатии можно ускорять.
Ядро меньше кушает..

fluorine аватар

Я бы хотел

Я бы хотел спросить, программе вообще позволено так нагружать процессор? Там вприципе если бы было можно делать 33'000 циклов c delay, я бы нагрузил бы его полностью(если оно конечно увиличивается линейно, ну допустим). Я просто смотрю в htop, /usr/lib/xorg/Xorg также на 3% грузит, эм .. ну моя программа не делает как бы столько сколько иксы.

admin аватар

Тут не вполне

Тут не вполне понятно, что такое "позволено". Например, дебильные сайты с кучей client-size scripts, свёрстанные безрукими и очень злобными макаками, выполняясь (именно выполняясь) в браузерах, созданных не всегда злобными, но тоже макаками, и не делая при этом решительно ничего полезного, жрут процессора столько, что лично мне постоянно хочется кого-нибудь убить. "Позволено" ли им так делать? Похоже, что да, ведь никто их создателей в тюрьму не сажает и даже от работы не отстраняет, хотя вообще-то надо бы. А вот стоит ли так делать — для меня ответ очевиден: конечно, нет.

Вам вот нафиг нужно просыпаться 1000 раз в секунду? У вас ведь интерактив, а пользователь физически неспособен заметить задержку меньше одной десятой секунды. Достаточно пробудиться через каждую одну десятую, исполнить цикл while keypressed do begin readkey/реакция end, сделать что там у вас происходит с перемещениями по экрану и заснуть обратно.

Вообще-то правильнее даже не так, а пробуждаться только тогда, когда реально нужно что-то делать, но на Паскале так не получится (точнее, может, и есть в необъятной библиотеке free pascal'я что-то на эту тему, но оно не стоит того, чтобы его искать и осваивать). Когда доберётесь до Си — откройте для себя вызов select, он описан в части, посвящённой сетям.

fluorine аватар

> выполняясь

> выполняясь (именно выполняясь) в браузерах, созданных не всегда злобными
==
есть ещё такая штука electron, то же, что браузер и в этот браузер видимо просто переносять те, веб скрипты, что есть на сайте, чтобы сэкономить дорогостоящее время программистов и для переносимости: коммерческие продукты, из тех что я видел(это был универский M$ Teams для линукса) и (!) его запускают с ключом --no-sandbox. Один AppImage в форумах тоже предлагали так запустить... Вот у хрома тоже такая опция есть оказывается, когда я только что гуглил в настройках есть свойство --no-sandbox, если это свойство как-нибудь включить у юзера, злоумышленник может теперь считать себя здесь хозяином, только за существование такого, на пожизненное надо по-моему, как вообще можно дать хотя бы мизерную возможность управлять неизвестно кому в интернете свой компьютером.

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

> Вообще-то правильнее даже не так
==
Попробую на С

"Переносимость" скриптовых поделок

есть ещё такая штука electron, то же, что браузер и в этот браузер видимо просто переносять те, веб скрипты, что есть на сайте, чтобы сэкономить дорогостоящее время программистов и для переносимости

А какое отношение это поделие имеет к переносимости? "Разработка" на скриптовом языке (жабаскрипте) - это вроде как вообше диаметрально идее переносимости. "Работает везде, где есть интерпретатор" - это вообще ни разу про переносимость. Для наилучшей переносимости нужно использовать максимально близкий к железу ЯП. А чтобы портировать жабаскриптовое поделие на платформу, для которой нет интерпретатора, придётся вначале портировать сам интерпретатор. Да и не только его. Это при том, что электрон этот, далеко не только один жабаскриптовый движок.
Когда веб-макаки говорят о переносимости, они исходят из предпосылки, что весь рантайм, необходимый для работы их поделок уже портирован под конкретную архитектуру.
Как вообще можно всерьёз говорить о переносимости поделок на электроне? Куда там этот электрон портирован - на винду, линукс, и огрызок, вроде. Всё. Вот и вся "переносимость".
Но это ещё не всё. Как говорил один деятель-юмарыст из Прибалтики перед тем, как выдать очередную шутку: Готовы? Это "чудо инженерной мысли" требует ещё и наличие интерпретатора Python в системе (который тоже существует в двух разновидностях как бы). Пять веб-макак из пяти, как говорится. Отличнейшая переносимость.

admin аватар

> как вообще

> как вообще можно дать хотя бы мизерную возможность управлять неизвестно кому в интернете свой компьютером

Вообще говоря, любое исполнение только что непойми откуда приехавшего алгоритмически полного кода — это именно что "возможность неизвестно кому управлять моим компьютером", и отнюдь не мизерная. Все эти сэндбоксы в действительности вообще не выход, они, во-первых, дырявы, а во-вторых, от denial of service через выжирание проца и памяти они не защищают.

Что за это пожизненное надо давать — я полностью согласен. Вообще всех нынешних уёбразработчиков давно пора пересажать, я это говорю с тех пор, когда JS появился вообще как идея.

> такая штука electron

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

> дорогостоящее время программистов

Ну да ну да, нынче даже последняя макака дорого стоит.

admin аватар

Я не вполне

Я не вполне понимаю, что вы хотели сказать, но тут стоит, по-видимому, обратить внимание, что у вас там фигурирует "долгое нажатие". Рискну предположить, что у вас в цикле, кроме delay, есть ещё операция ввода, а она тоже, представьте себе, реализована через системный вызов, и это вам не delay, прямо скажем, системные вызовы ввода-вывода в своей реализации (внутри ядра) намного сложнее, чем тупая задержка. Что 1000 операций ввода в секунду ваш проц "нагрузили" — я не удивлён ни разу.

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

fluorine аватар

> фигурирует

> фигурирует "долгое нажатие"
==
да именно и с операцией ввода
==
Там 1000 не наберется :D. В xset скорость клавиатуры примено на 50ти стоит. А так да, не подумал про операции ввода, к тому же стало стыдно когда вспомнил, что я сказал, что ядро кушает, сколько оно кушает я замерял только под консолью свежезапущенного компа без иксов, как я читал во втором томе оно не является процессом, ну и на этом и собственно бросил эту часть, не знал что оно ещё и записывает свою работу процесу.
==
Спасибо

admin аватар

> Там 1000 не

> Там 1000 не наберется :D. В xset скорость клавиатуры примено на 50ти стоит.

Скорость клавиатуры тут вообще ни при чём. Вообще, понимаете? Совсем, никак, она просто не имеет отношения к делу. Время теряется на системном вызове, то есть обращении вашей программы к ядру ОС. Если вы, скажем, используете пресловутый keypressed из модуля crt, то, чтобы узнать, есть там что или нет, он таки вынужден дёрнуть ядро.

> оно ещё и записывает свою работу процесу.

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

А так можно?

Здравствуйте, Андрей Викторович.

Прошу уточнить Ваше мнение об уместности критики кода, выданного как результат изучения программирования по Вашим книгам. Типа вот я прочитал, написал, работает как задумано, вот сам код, похвалите/поругайте. Это вообще законно? (с)

По совпадению дошел до шестой части.
Программа в неканоническом режиме без отображения символов ждёт ввода символа или 10 секунд и прощается.

int main()
{
    int sret, flags;
    fd_set readfds;
    struct timeval timeout;
    struct termios ts1, ts2;
    int fd = 0; /* stdin */
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;

    if(!isatty(fd)) {
        fprintf(stderr, "Not a terminal\n");
        return 1;
    }

    /* preparing terminal */
    tcgetattr(fd, &ts1);
    memcpy(&ts2, &ts1, sizeof(ts1));
    ts1.c_lflag &= (unsigned int)~ICANON;
    ts1.c_lflag &= (unsigned int)~ECHO;
    tcsetattr(fd, TCSANOW, &ts1);

    /* setting stdin as nonblock */
    flags = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);

    printf("press any key to exit\n");
    while(1) {
        FD_ZERO(&readfds);
        FD_SET(fd, &readfds);
        sret = select(1, &readfds, NULL, NULL, &timeout);
        if(sret == -1) {
            printf("select error\n");
            exit(sret);
        }
        /* data in stdin or timeout */
        if(FD_ISSET(fd, &readfds) || sret == 0) {
            printf("Goodbye!\n");
            tcsetattr(0, TCSANOW, &ts2);
            return 0;
        }
    }
}
admin аватар

Идея-то

Идея-то правильная — действительно для этого нужно select применять. Но... гм. Зачем же настолько всё делать по шаблону, во-первых, а во-вторых, зачем же этот шаблон, если уж по нему делаете, так уродовать? :-)

Под "уродовать" в данном случае -- заполнение структуры таймаута. Сто раз сказано, её select имеет право испортить. Значит -- что? Значит, заполнять её надо не один раз в начале, а непосредственно перед вызовом select.

Иной вопрос, что в вашем конкретном случае это ни на что не влияет, поскольку ваш "бесконечный" (!) цикл выполняется всего один раз. Ровненько. Куда ему ещё деваться-то? Обрабатываемых сигналов у вас в программе нет, а если вдруг select решит ошибку выдать (ну мало ли) -- вот тогда ваш цикл пойдёт крутиться до бесконечности (вряд ли это то, чего вы хотели). Впрочем, не пойдёт, тут select'у ошибаться толком не на чем.

Далее, а вот переменная fd вам накой чёрт? Она же не меняется.

Ну и последнее, но, пожалуй, самое серьёзное. Где ваши рефлексы на декомпозицию функций? Что за длинющий main на три экрана? Очевидным образом тут можно вынести в отдельные функции установку и сброс канонического режима, например. Сохранённый termios либо сделать глобальной (нехорошо), либо таки описать в main и передавать в обе функции адрес. Либо ещё можно вообще передавать адрес указателя типа void*, а сами эти функции чтобы через него общались, тогда main вообще ничего не будет знать про termios.

Больше выносить толком нечего, но после удаления цикла и if'а там и не останется ничего.

> вот тогда ваш

> вот тогда ваш цикл пойдёт крутиться до бесконечности

Эм, а можно объяснить, как тут может бесконечный цикл возникнуть, если select -1 вернёт?

PS: ещё когда это обсуждение шло хотел задать этот вопрос, но забыл :D

admin аватар

А никак :-) Я не

А никак :-) Я не заметил там exit.

select и poll

Тут такая мысль возникла на счёт этой задачи. Вам не кажется, что в приведённых решениях select смотрится немного неуклюже, из-за двух параметров, равных NULL, и отслеживанием одного дескриптора из 1024 возможных? Имхо, poll тут смотрелся бы более элегантно, например так:

static void wait_for_press(int seconds, int *res)
{
    struct pollfd pfd;
    char buf;
    pfd.fd = 0;
    pfd.events = POLLIN;
    pfd.revents = 0;
    *res = poll(&pfd, 1, seconds*1000);
    if(*res == -1)
        perror("poll");
    else if(res > 0 /* && pdf.revents & POLLIN */)
        read(0, &buf, 1);
}
admin аватар

Дело не в том,

Дело не в том, кто из них "элегантнее" смотрится в отдельно взятом примере. Дело в том, какой из них рассказывать в книге.

Так вот, select/pselect тупо проще объяснить, нежели эти poll/ppoll. Заметим, я и signal вместо sigaction рассказываю по той же самой причине.

Да,

Да, действительно, учебный момент из головы вылетел.

А ещё в мой кусок кода грубейшая ошибка закралась, которую только при помощи флага -Wextra найти удалось :)

на пересдачу :-)

void setnonblock(void);
void prep_term(void **tp);
void restore_term(void *tp);
void prep_select(fd_set *rdfds, struct timeval *tv);

int main()
{
    int sret;
    fd_set readfds;
    struct timeval timeout;
    void *tp = NULL;

    /* preparing terminal */
    prep_term(&tp);

    /* setting stdin as nonblock */
    setnonblock();

    printf("press any key to exit\n");
    prep_select(&readfds, &timeout);
    sret = select(1, &readfds, NULL, NULL, &timeout);

    /* data in stdin or timeout */
    if(FD_ISSET(0, &readfds) || sret == 0) {
        printf("Goodbye!\n");
        restore_term(tp);
    }
    return 0;
}

void prep_term(void **tp)
{
    struct termios ts;
    if(!isatty(0)) {
        fprintf(stderr, "Not a terminal\n");
        exit(1);
    }
    *tp = malloc(sizeof(struct termios));
    tcgetattr(0, &ts);
    memcpy(*tp, &ts, sizeof(ts));
    ts.c_lflag &= (unsigned int)~ICANON;
    ts.c_lflag &= (unsigned int)~ECHO;
    tcsetattr(0, TCSANOW, &ts);
}

void restore_term(void *tp)
{
    tcsetattr(0, TCSANOW, tp);
    free(tp);
}

void setnonblock()
{
    int flags = fcntl(0, F_GETFL);
    fcntl(0, F_SETFL, flags | O_NONBLOCK);
}

void prep_select(fd_set *rdfds, struct timeval *tmout)
{
    FD_ZERO(rdfds);
    FD_SET(0, rdfds);
    tmout->tv_sec = 5;
    tmout->tv_usec = 0;
}
admin аватар

Так, ну на этот

Так, ну на этот раз основная претензия будет такая: ладно, я уж не говорю про то, что if после select'а у вас прямо-таки не может никак оказаться ложным, но допустим такое всё-таки произошло (уж не знаю как, но вот что-то сдурел select) -- так теперь что, не надо пользователю говорить good bye и не надо режим терминала восстанавливать? Каков смысл этого if'а, ну хоть сами себе попробуйте объяснить.

Дальше, setnonblock я бы всё-таки сделал зависящей от параметра fd, заодно и её вызов будет понятнее выглядеть. Так пришлось комментарий писать, а то было бы setnonblock(0), ёжику понятно, что non-block бывает дескриптор, а нолик -- это stdin.

Комментарий /* preparing terminal */ перез вызовом prep_term выглядит как троллинг :-)

Крайне странно выглядит prep_select. Тот случай, когда декомпозиция оказывается мнимой. Чтобы понять, что она делает и зачем, нужно знать, как устроен вызывающий, а чтобы понять в вызывающем, что происходит, нужно знать, что там такое написано внутри вызываемого. К тому же она заполняет данными две разные структуры, никак друг с другом не связанные (!), если, опять же, не знать, что будет дальше делать вызывающий. В общем, это не подзадача вынесена в функцию, а просто кусок кода, и от такой декомпозиции становится хуже, а не лучше. Особо хочется подчеркнуть, что про три другие функции такого никак не скажешь, там именно что всё как надо.

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

Последнее замечание уже чистая вкусовщина, но вот как не понимал, так и не понимаю, зачем вот эти вот сначала прототипы всех функций, потом main, потом сами функции. Если main будет в конце программы, это чем-то плохо? Ну то есть вот постоянно такой стиль вижу, и даже вроде он ничем не криминален, просто трудозатраты (хоть и небольшие, прямо скажем), но вот что он даёт? Должен же что-то давать, раз людям не лень эдак вот прототипы выписывать.

зачем вот эти

зачем вот эти вот сначала прототипы всех функций
В некоторых книгах и всяческих "гайдах", меж тем, упорно советуют держать main ближе к началу файла, при этом описанные ниже функции, естественно, из неё не видимы, что вынуждает помещать прототипы до main. Вредный совет какой-то... Но, вообще, можно, наверное, привести пример ситуации, где такой подход более-менее оправдан - если программа, задуманная на сотню-другую строк, вдруг начнет разрастаться, в таком виде (мухи прототипы отдельно, сами функции отдельно) её несколько проще будет растащить по файлам. Хотя, кмк, если "абстрактный автор" запускает код до такого состояния, его едва ли будут волновать подобные мелочи.

<зачем вот эти

<зачем вот эти вот сначала прототипы всех функций, потом main, потом сами функции>
Некоторые (вроде меня) считают, что так становится проще читать код, мол, сначала читаем основное, а потом углубляемся в детали. А не листать в конец, разыскивая заголовок мэйна.
А и в плане написания это парадигма такая - сначала решаем задачу несуществующими функциями, а потом реализуем их в том порядке, в каком "вызвали".

admin аватар

А не листать в

А не листать в конец, разыскивая заголовок мэйна.

Вот уж чего мне вообще не понять. Зачем его "разыскивать"? Переходим в конец файла, это обычно одно нажатие (например, в vim'е Shift-G) и после этого заголовок main должен оказаться на экране. Если не оказался -- значит, main слишком длинный, т.е. программа написана чёрт-те как и её надо срочно рефакторить.

На том же Паскале "главная часть программы" в конце чисто синтаксически, и вроде никому это не мешает.

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

Это не парадигма, это стратегия реализации, называется "нисходящая пошаговая детализация". Ну да, классика жанра. И что, кто-то мешает писать не заголовки функций, а сами функции с пустыми телами или с return'ами (так называемые заглушки, англ. stubs), а потом, когда руки дойдут, эти тела заполнять? Между прочим, при этом всё будет компилироваться, линковаться и запускаться, что позволит в ходе написания тестировать те части, которые уже реализованы, тогда как это вот "сначала напишем прототипы" на линковке обломается, всё равно придётся stub'ы делать, чтобы запустить недописанную программу.

Ах да, я ещё

Ах да, я ещё кое-что вспомнил. В некоторых языках функции видны вне зависимости от порядка их объявления. Необходимость писать прототипы исчезает, и мэйн вначале оказывается более удобен. А в некоторых мэйна вообще нет, и если писать основное тело после функций (или вперемешку, как иные советуют), прога превращается в наваристую кашу.
Например, Python. Я начинал с него, и две привычки въелись намертво: отступы в 4 пробела и вот такой вот стиль "второстепенное в конце". Остальное, видимо, попытки подвести логическое обоснование под то, что обосновывается привычкой и только ей.

admin аватар

А в некоторых

А в некоторых мэйна вообще нет, и если писать основное тело после функций (или вперемешку, как иные советуют), прога превращается в наваристую кашу

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

зачет?

static void prepare_terminal(void **tp)
{
    struct termios ts;
    if(!isatty(0)) {
        fprintf(stderr, "Not a terminal\n");
        exit(1);
    }
    *tp = malloc(sizeof(struct termios));
    tcgetattr(0, &ts);
    memcpy(*tp, &ts, sizeof(ts));
    ts.c_lflag &= (unsigned int)~ICANON;
    ts.c_lflag &= (unsigned int)~ECHO;
    tcsetattr(0, TCSANOW, &ts);
}

static void restore_terminal(void *tp)
{
    tcsetattr(0, TCSANOW, tp);
    free(tp);
}

static void setnonblock(int fd)
{
    int flags = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}


static void *prepare_timeout_in_seconds(int seconds) {
    void *to = malloc(sizeof(struct timeval));
    ((struct timeval *)to)->tv_sec = seconds;
    ((struct timeval *)to)->tv_usec = 0;
    return to;
}

static int run_and_wait(void *tmout) {
    int ret;
    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(0, &readfds);
    ret = select(1, &readfds, NULL, NULL, tmout);
    return ret;
}


int main()
{
    int sret;
    void *timeout = NULL, *term_saved_state = NULL;
    timeout = prepare_timeout_in_seconds(5);
    prepare_terminal(&term_saved_state);
    setnonblock(0);
    printf("press any key to exit\n");
    sret = run_and_wait(timeout);
    if(sret == -1) {
        printf("error\n");
        exit(1);
    }
    printf("Goodbye!\n");
    restore_terminal(term_saved_state);
    return 0;
}

функцию setnonblock() имеет смысл разместить внутри prepare_terminal()?

admin аватар

Я бы сказал, в

Я бы сказал, в этот раз вы перемудрили с таймаутом. Кто заставляет в run_and_wait передавать этот пресловутый таймаут, а не просто число секунд? :-) Минус объект в динамической памяти, минус неочевидная связь между prepare_timeout_in_seconds и run_and_wait (и кстати сама prepare_timeout_in_seconds тоже в минус), минус заминка на malloc'е, для которого таки нету free (когда функция создаёт объект в динамической памяти, сразу возникает вопрос, кто и когда этот объект убирает, и потеря времени на поиске ответа).

Ну и, опять же, с этой вот ошибкой, которой на самом деле не бывает. "Error", гм. Да ещё в stdout. И терминал оставили в неканоне, замечу.

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

А, ещё вот это:

static void *prepare_timeout_in_seconds(int seconds) {
static int run_and_wait(void *tmout) {

После заголовка функции, извините, скобка таки сносится. После операторов -- да, можно принять решение не сносить, сам так пишу, но после заголовка функции -- сносится. Что характерно, у вас это только на двух функциях, на всех остальных нормально.

> Я бы сказал, в

> Я бы сказал, в этот раз вы перемудрили с таймаутом. Кто заставляет в run_and_wait передавать этот пресловутый таймаут, а не просто число се
кунд? :-)

Принимается.

Минус объект в динамической памяти,
А как его еще на void повесить?

минус неочевидная связь между prepare_timeout_in_seconds и run_and_wait (и кстати сама prepare_timeout_in_seconds тоже в минус),

минус заминка на malloc'е, для которого таки нету free

вопрос, кто и когда этот объект убирает, и потеря времени на поиске ответа).
free для saved_term_state в restore_terminal(), но это неочевидно, принимается.
Для timeval free нету, согласен.
пойдет приготовить таймаут на стэке внутри run_and_wait?

Ну и, опять же, с этой вот ошибкой, которой на самом деле не бывает.
ну это из-за выше "но вот что-то сдурел select" :-)

"Error", гм. Да ещё в stdout.
Принимается. В stderr?

И терминал оставили в неканоне, замечу.
Сохраненная структура копируется обратно в restore_terminal()

Но если уж хотели, чтоб я докопался
Да, хотел. Спасибо, что докопались :-)

А, ещё вот это:
Принимается.

admin аватар

А как его еще на

А как его еще на void повесить?

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

В stderr?

Да, и с помощью perror. В данном случае будет perror("select"), хотя это не очень красиво, поскольку сам select в одном месте, а сообщение с его упоминанием будет в другом. Можно как-нибудь извратиться и написать что-то вроде perror("waiting failed").

Сохраненная структура копируется обратно в restore_terminal()

Я имел в виду -- оставили в неканоне в случае, когда select сдурел. В этом варианте у вас restore_terminal не вызывается.

Перенес timeval на

Перенес timeval на стэк в run_and_wait(), количество секунд передаю параметром.
Если select сдурнёт - perror().
restore_terminal() вывел как необходимый.

Заметил, что anykey, которого ожидает run_and_wait(), появляется в строке нового шелла после выхода из программы. Подавляю его вывод read()`ом в stub буфер прямо в run_and_wait(), норм?

static void prepare_terminal(void **tp)
{
    struct termios ts;
    int flags;
    if(!isatty(0)) {
        fprintf(stderr, "Not a terminal\n");
        exit(1);
    }
    /* free in restore_terminal */
    *tp = malloc(sizeof(struct termios));
    tcgetattr(0, &ts);
    memcpy(*tp, &ts, sizeof(ts));
    ts.c_lflag &= (unsigned int)~ICANON;
    ts.c_lflag &= (unsigned int)~ECHO;
    tcsetattr(0, TCSANOW, &ts);

    /* set stdin to nonblock mode */
    flags = fcntl(0, F_GETFL);
    fcntl(0, F_SETFL, flags | O_NONBLOCK);
}

static void restore_terminal(void *tp)
{
    tcsetattr(0, TCSANOW, tp);
    free(tp);
}

static int run_and_wait(int seconds)
{
    int sret;
    char dummybuf[1];
    fd_set readfds;
    struct timeval tmout;
    tmout.tv_sec = seconds;
    tmout.tv_usec = 0;
    FD_ZERO(&readfds);
    FD_SET(0, &readfds);
    sret = select(1, &readfds, NULL, NULL, &tmout);
    if(sret == -1)
        return sret;
    read(0, dummybuf, 1);
    return sret;
}


int main()
{
    int ret = 0;
    void *term_saved_state = NULL;
    printf("** press anykey to exit **\n");
    prepare_terminal(&term_saved_state);
    ret = run_and_wait(5);
    if(ret == -1)
        perror("waiting failed");
    else
        printf("******** Goodbye! ********\n");
    restore_terminal(term_saved_state);
    return ret;
}
admin аватар

Зря установку

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

Впрочем, до меня тут дошло, вы же записи туда не делаете и готовности по записи не проверяете, ну и зачем тогда неблокирующий режим? Ну то есть я бы просто выкинул установку неблокирующего режима, а read делал только в случае, если select вернул единицу (или, для наглядности, если FD_ISSET(0, &readfds) вернёт истину). Остальное вроде нормально, я бы, наверное, что-то сделал иначе, но всерьёз тут уже докапываться не до чего.

Parthen аватар

Посоветуйте программ для своего сервера

Я пару дней пытался себе поднять пару программ на сервере и, что интересно, нормально у меня запустился только телеграм-бот на питончике. А остальное я не осилил, в общем:
Посоветуйте мне: а) прокси сервер б) почтовый сервер в)xmpp сервер
Пофигу на мощность и возможности, желательно как можно проще в использовании и настройке.
P.S. Если кто предложит что еще можно сделать с сервером -- я не против, предлагайте.

admin аватар

С почтой всё

С почтой всё понятно, это postfix. Всё остальное слишком монструозно для индивидуального узла.

С xmpp всё сложнее. Всё, что написано на всякой джаве, луа, эрланге и прочей нечисти, я вообще отказываюсь рассматривать, остаются jabberd14 и jabberd2. Лично сам я ставил только jabberd2, вроде нормально, живёт вон уже больше десяти лет. Проблема только в том, что, кажется, он слегка unmaintained. jabberd14 я не пробовал, но ощущение такое, что это единственный оставшийся вариант.

По поводу прокси -- смотря что нужно. Я имел дело ровно с двумя вариантами -- squid (но он ещё 15 лет назад был overbloated, сейчас мне даже подумать страшно, во что его превратили) и tinyproxy. Последняя, когда я её активно использовал, была вроде вполне себе ничего. Только я её так и продолжаю в той версии использовать, а версии той не знаю сколько лет, но точно больше десяти. Что там с современными версиями, не знаю.

С почтой всё

С почтой всё понятно, это postfix. Всё остальное слишком монструозно для индивидуального узла.

Прошу прощения, а что конкретно входит в список "всё остальное"? OpenSMTPD там тоже есть?

admin аватар

В основном под

В основном под "всем остальным" я имел в виду exim и классический sendmail. OpenSMTPD я не пробовал, ничего не могу про него сказать.

Parthen аватар

>По поводу

>По поводу прокси -- смотря что нужно
Нужно не светить IP-шником, пусть я и за NAT-ом, и обходить блокировки "любимого" РКН.
По остальному спасибо, посмотрю.

Вообще достаточно простого SSH туннеля

Если нужно просто сидеть в интернете через другой сервер, то можно без какого-либо дополнительного ПО просто организовать tun туннель через ssh и всё.

admin аватар

Чего только не

Чего только не узнаешь, уже и настоящие VPNы поверх ssh запустили, а я всё с openvpn вожусь :-) До сегодняшнего дня был уверен, что ssh годится только форвардить фиксированные порты, например до той же прокси.

admin аватар

Тогда tinyproxy в

Тогда tinyproxy в самый раз, она не кеширующая, но вроде кеш в задачу не входит.

Практика на асм

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

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

Если кто-нибудь сообщит буду бесконечно благодарен. Испишу тысячи строчек! На диске места не хватит!

admin аватар

Слинковаться с

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

Что касается управления терминалом, то это делается через функции семейства termios (см. man 3 termios), основное тут -- tcgetattr и tcsetattr. В принципе ничего супер-сложного, они обе работают через системный вызов ioctl, единственная проблема -- структура данных, которая называется struct termios. Во втором томе всему этому посвящена целая глава, а конкретно termios -- параграф 5.4.3. Я только боюсь, что, когда вы освоите материал этого параграфа, продолжать писать на асме вам уже не захочется.

Хорошая ли идея

Хорошая ли идея писать под dos 32-bit. Узнал что там ввод с клавиатуры довольно низкоуровневая штука. Тем более можно напрямую работать с видеопамятью.

admin аватар

Отвратительная

Отвратительная идея. Зачем вообще писать программы, которыми заведомо никто никогда не воспользуется?

"Странный" икс

Том 1 стр 498 вы привели пример теста. Страницей ранее вы рекомендовали перепрочесть 1.2.15 про Bourne Shell. Прочел. Но ни тут ни там не нашел объяснения 2-м странным `x` в:

if [ x"$c $d" != x"$res" ]; then ...

Искал в Adv. Bash-Scripting Guide, но нашел такое только в одном из примеров, объяснения так и не попались.

Пробовал писать без них, т.е. :
if [ "$c $d" != "$res" ]; then ...

Все работает отлично. Что еще больше вгоняет в ступор. Я срочно требую объяснений! :-D

admin аватар

Насколько я

Насколько я понимаю, некоторые старые версии sh не поддерживали понятие пустого слова, после чего test (a.k.a. команда с именем "["), не видя одного, а то и обоих операндов сравнения, сходил с ума. Странный икс (или любая другая буква) добавляется, чтобы не допустить пустого операнда.

И все же bash или не bash?

В таком случае х представляет из себя обычный литерал, который склеивается с операндом? Звучит да и выглядит в целом как-то "костыльно" что ли :(
Предугадывая ваши слова, раз bash может оказаться таким-сяким, то что можете посоветовать за место него, что не травмировало бы мышление и при этом позволяло бы писать тесты для программ на Паскале и Ассемблере? На ум почему-то приходит Tcl, вероятно где-то вы его уже упоминали :)
А за прошлый ответ мои благодарности, с уважением.

admin аватар

Tcl не годится в

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

По поводу bash или не bash — ну тут я могу поделиться собственным негативным опытом. Когда я учился на втором курсе (1993-1994 у/г), нам рассказывали csh, и в терминальном классе (это была Besta с подключёнными к ней тремя десятками текстовых терминалов — настоящих, никакой эмуляции) у всех шеллом по умолчанию стоял именно csh. И я, увы, за пару семестров успел к нему привыкнуть. А осенью следующего года я как раз в лабе поставил Linux (ту самую Slackware) и долго не мог понять, как устроены системные скрипты и как их править, ведь они все были на классическом Bourne Shell. Тех, кто придумал нас сажать на csh, я не раз поминал "добрым словом".

В общем, bash может быть и такой, и сякой, но знать его — обязательно. А вот захочется ли, умея обращаться с bash'ем, при этом в повседневных сеансах работы использовать какой-нибудь tcsh, zsh, ksh или что там ещё есть — это вопрос. Мне не захотелось.

Tcl и fish

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

Почему с трудом?

В интерактивной сессии tclsh похоже даже пайпы работают. Есть же процедура unknown куда можно свой код запихать, и этот код может как раз обрабатывать вшешние команды.

А ещё тут fish не упомянули. Тоже шелловский язык, не совместим с bourne shell. но зато имеет простой синтаксис при достаточно неплохих возможностях и более сфокусированный на интерактиве.

Хотя мне лично кажется, что смысла нету на него переходить с баша. Но тут уже фломастеры.

admin аватар

Почему с

Почему с трудом?

Потому что так жизнь устроена, что я ещё могу сказать.

В интерактивной сессии tclsh похоже

А давайте без "похоже". Запустите себе tclsh и попробуйте в нём пожить часок вместо bash'а. Можно, впрочем, не тратить целый час, могу подсказать сразу: попробуйте из этой интерактивной сессии запустить что-нибудь текстовое-полноэкранное, хоть тот же vim.

не совместим с bourne shell

Ну и нафиг он тогда? Пардон, тут вроде бы уже пришли к согласию, что иметь один язык для интерактива, другой для скриптинга — неудобно, скрипты в любом случае придётся писать на Bourne Shell, так что намного проще оставаться в bash'е, ну или, возможно (я сам не пробовал) в какой-то ещё версии командного интерпретатора, основанной на Bourne Shell.

попробуйте из

попробуйте из этой интерактивной сессии запустить что-нибудь текстовое-полноэкранное, хоть тот же vim.

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

А у вас, Андрей, наблюдаются проблемы при запуске чего-нибудь текстово-полноэкранного из интерактивной сессии tclsh?

admin аватар

Попробовал.

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

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

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

Чего я не знал,

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

С весьма давних. Смутно помню, что я запускал ls и получал список файлов в интерактивной сессии tclsh больше десятка лет назад.

admin аватар

Ну, мой период

Ну, мой период активной практической работы с Tcl — это несколько месяцев 2001 года, т.е. ровно двадцать лет назад. И у меня есть чёткое ощущение, что тогда tclsh такого не умел.

Стало

Стало любопытно. Скачал, собрал (собралось без проблем), запустил:

$ wget -q ftp://ftp.tcl.tk/pub/tcl/tcl8_0/tcl8.0.5.tar.gz
$ tar -xzf tcl8.0.5.tar.gz -C /tmp
$ head -n3 /tmp/tcl8.0.5/changes
Recent user-visible changes to Tcl:

RCS: @(#) $Id: changes,v 1.41 1999/02/03 19:12:25 stanton Exp $
$ cd /tmp/tcl8.0.5/unix && ./configure && make
[skip ...]
$ ./tclsh
% pwd
/tmp/tcl8.0.5/unix
% ls -F ..
README           doc/             license.terms    unix/
changes          generic/         mac/             win/
compat/          library/         tests/

99-й год. Таки tclsh уже тогда это всё умел.

admin аватар

Н-да. Вряд ли я

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

Кстати,

Кстати, наверное не совсем корректно ставить в один ряд tcsh, zsh, ksh и bash. Потому что bash, zsh и ksh -- надмножества Bourne shell, тогда как tcsh -- весьма другой язык.

Так что, зная и умея повсеместно распространённый Bourne shell, tcsh использовать, конечно же, не захочется. А вот bash, ksh или zsh -- вполне может захотеться.

admin аватар

С этим, пожалуй,

С этим, пожалуй, даже соглашусь.

А вот захочется

А вот захочется ли, умея обращаться с bash'ем, при этом в повседневных сеансах работы использовать какой-нибудь tcsh, zsh, ksh или что там ещё есть — это вопрос.

Мой ответ на этот вопрос — да.

Соотношение монструозность/функциональность говорит совсем не в пользу bash'а. Тот же zsh, например, не менее монструозен, но гораздо более функционален. А опенбсдшный ksh (его порт на линукс называется oksh) исключительно компактен, но при этом функционален не намного менее bash'а.

Это всё про интерактивное использование, разумеется. Что касается шелл-скриптов, то их надлежит писать исключительно на чистом POSIX-shell'е.

PS. В контексте комментария, на который вы отвечаете, ваш ответ, Андрей, можно понять так, что tcl не годится для того, чтобы "писать тесты для программ на Паскале и Ассемблере", а bash годится. Уточните, пожалуйста, вы действительно это имели в виду?

admin аватар

Что касается

Что касается шелл-скриптов, то их надлежит писать исключительно на чистом POSIX-shell'е.

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

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

что tcl не годится для того, чтобы "писать тесты для программ на Паскале и Ассемблере", а bash годится. Уточните, пожалуйста, вы действительно это имели в виду?

Такого прочтения я не предполагал. Имелось в виду ровно одно: Tcl не годится в роли командного интерпретатора для обычной работы с компьютером. Впрочем, я не уверен, что писать тесты на Tcl — хорошая идея. В обратном я тоже не уверен.

Лично меня

Лично меня ситуация, когда для интерактива используется один язык, а для скриптинга — совсем другой, не устраивает.

Совершенно согласен. Но в случаях с bash, zsh или ksh для интерактива используется надмножество sh, а вовсе не совсем другой язык. Да и все эти расширения sh, по большому счёту, не так важны для интерактива, как некоторые специфические штуки, вроде истории команд или автодополнения.

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

admin аватар

Пожалуй, в

Пожалуй, в главном мы тут согласились — csh/tcsh не подойдёт :-)

Надо будет попробовать ksh как-нибудь, поскольку от bash я в целом тоже совершенно не в восторге.

Надо будет

Надо будет попробовать ksh как-нибудь

Только учтите, что у ksh есть несколько реализаций. Я говорю исключительно об опенбсдшной (как я уже говорил, её порт на линукс называется oksh), за другие вписываться не готов.

А, хотя нет. Вспомнил, что ещё есть mksh, тоже неплохая. Именно на неё я когда-то давно сбежал с bash'а.

деньги за биты и байты

Здравствуйте. Хотел бы уточнить точку зрения автора.

Вы в 1м томе говорили что за электронные книги можно платить разве что электронными сканами же денег. Я лично против продажи электронных книг копирастами ибо DRM и они создают насилие запрещая всему миру (!) делится полученной информацией. А что если человек не копираст и например продаёт свои книги у себя на сайте, но никому не запрещает их копировать. Разве в этом есть что-то плохое? То же самое с софтом.

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

admin аватар

Вопрос сложнее, чем кажется

если человек не копираст и например продаёт свои книги у себя на сайте, но никому не запрещает их копировать

Что, вот прямо совсем не запрещает? То есть вот прямо-таки разрешает? И даже не просит никого воздержаться от их копирования? Совсем-совсем? И когда его книжки растаскивают по всему интернету и выкладывают на сайтах бесплатно, его это не беспокоит? Прям вот вообще не беспокоит?

Если хотя бы что-то из этого "не совсем так", то этот ваш "не копираст" — именно что копираст, т.е. случай, скорее всего, не заслуживает отдельного рассмотрения. Ну, точнее будет сказать, что бывает-то, конечно, всякое, но в целом это та же копирастия, просто в light-варианте. А вот если реально так — всё оказывается довольно сложно.

Господствующая точка зрения на эту тему — что таки да, в таком случае в этой продаже нет ничего плохого. Потерял куда-то ссылку, но были даже специальные разъяснения аж от "самого" Столлмана (нет, я не фанат Столлмана, если что), что продать GPL-ную программу за миллион баксов — это нормально, если только при этом не нарушается GPL, то есть тому, кто купил, программа отдаётся под GPLем и никто от него не требует, не просит и даже не намекает ему, что не надо программу распространять дальше.

В целом я эту точку зрения даже до определённой степени разделяю. Вот у меня есть информация, вот у кого-то есть деньги, мы с ним готовы поменяться, никто никого ни к чему не принуждает. Копирастия плоха именно тем, что присутствует принуждение, причём принуждение сразу всех — а ну не сметь копировать ваши (!) собственные (!) носители, поскольку на них, видите ли, "моё" (мой объект авторского права).

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

Замечу, что в действительности, т.е. "в реальной жизни", сложность этого вопроса компенсируется его сугубо академическим характером. Попросту говоря, так никто не делает, все ведь прекрасно понимают, что публика в такой ситуации не станет платить деньги, а пойдёт на соседние сайты, где всё то же самое доступно бесплатно. Я имею наглость утверждать, что в реальности (а не в теории) во всех случаях, когда за скачивание "оригинальной" копии нужно платить деньги, принимаются те или иные меры к ограничению её дальнейшего распространения. Иначе не так чтоб совсем никто не купил, но купят только те, кто прямо-таки вот считает своим долгом материально поощрить автора. То есть это будет такой сбор пожертвований, который зачем-то называется продажей. А зачем совершенно безобидный сбор донэйтов называть страшным словом "продажи"? Какой, пардон, смысл казаться хуже, чем ты есть?

Кстати, ещё один момент, раз уж я ваш коммент раскрыл.

я сам либертарианец и против любого насилия.

Что, совсем против любого? Например, когда убийцу, насильника или грабителя ловят и сажают за решётку, это тоже насилие — вы и тут будете против? :) Если так, то это не либертарианство, это совсем иначе называется.

Parthen аватар

Вот между прочим

Делаем мы значится с парой знакомых игру. Игра с вложениями, а вложения надо как-то окупать.
Долго я сидел и думал. С одной стороны да, деньги сильно нужны, но копирастить что-то меня совесть замучает, я тут у себя на компьютере запускаю труды кучи людей, которые мне дали все бесплатно, а главное свободно.
Решил просто: исходники открыты, все по свободной лицензии. (А сильно утаить их не получится, спасибо Renpy на питоне. Вот если кто-то только закончил Си изучать и думает чем бы заняться -- напишите гребанный движок для визуальных новелл, я заколебался с ним. А аналогов не существует юзабельных в принципе, даже проприетарных. Готов даже немного профинансировать это дело.) Более того, я даже скомпилирую игру все под всяческие *nix.
Так вот живем мы, к сожалению, в мире идиотов, а потому большинство пользуются виндой. Вот ее версию уже будем продавать под копирасткой лицензией. Ибо: 1) Виндусятники мне и так сильно портят жизнь, 2) Если они пользуются виндой, свобода им нафиг не уперлась. Пусть компилируют и запускают из исходников, посмотрю на их мучения
Фиг его знает как с этим лицензированием разбираться, но думаю можно это как-то сделать.

Так вот живем

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

-------------------------------------------------------

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

Наша (то есть пользователей Юникс систем) задача именно состоит в том, чтобы распространять свой взгляд на вещи среди пользователей Виндовс при удобном случае, рассказывая им о плюсах того же Линукс над Виндовс и убеждая их в привильных вещах. Ведь и Вы лично, например, возможно и не пересели бы на Линукс, не найди Вы книгу уважаемого автора сайта: то есть, причиной того, что Вы для себя открыли Линукс, стал отнюдь ни какой-то особенный умственный дар у Вас, а человек, который помог сделать сей шаг. Я - уверен, что очень многие пользователи Виндовс тоже сделают этот переход с удовольствием, когда найдется кто-то, кто им поможет сделать сей шаг, покажет, что есть системы лучше чем Виндовс, что можно не бежать в магазин за новым компом каждый раз, когда выходит новая версия Виндовс, можно работать в операционной среде, где данные не пропадают из-за вирусов и.т.д. Возможно я - не исправимый оптимист, но как-то так мне кажется... Хотя, разумеется, есть среди пользователей Виндовс особенно тяжелые случаи, но речь сейчас идет не о них.

Parthen аватар

Я это, идиот не

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

>Так что спрос - с тех, кто посадил их на Виндовс и убедил их в том, что Виндовс - это почти что синоним слова "компьютер", сделав их пользователми Виндовс.
Вина конечно мизерная, но и у пользователей все же есть. А если вы думаете, что винда = PC это заслуга только маркетологов, то не полностью правы. Это заслуга в том числе минобра, который зачем-то учит пользоваться виндой и офисом (хотя нужно учить пользоваться компьютером). Серьезно, дали бы школьникам пару раз собрать-разобрать компьютер, поустанавливать системы, настраивать домашнюю сеть. Но нет блин, мы будем в 2021 году учиться пользоваться Paint и работать в Кумире.
Благодаря минобру у нас есть учителя, которые линукс в глаза не видели (я когда просил у себя на машине линукс, мол, чтобы работать во FreePascal, мне выдали виндовый графический FreePascal, жуть.)

>Наша (то есть пользователей Юникс систем) задача именно состоит в том, чтобы распространять свой взгляд на вещи среди пользователей Виндовс при удобном случае, рассказывая им о плюсах того же Линукс над Виндовс и убеждая их в привильных вещах.
И получить статус фанатиков и красноглазиков, проходили. Я лучше помогу тем, кто сомневается в переходе, чем буду убеждать пофигистов.

> Ведь и Вы лично, например, возможно и не пересели бы на Линукс, не найди Вы книгу уважаемого автора сайта: то есть, причиной того, что Вы для себя открыли Линукс, стал отнюдь ни какой-то особенный умственный дар у Вас, а человек, который помог сделать сей шаг.
Крайне мимо :) Я Линуксом увлекся давно, потому что в детстве думал, что это система чисто с консолью, а я хотел себе чисто консоль, как в моем тогдашнем любимом фильме "Трон: Наследие". https://yewtu.be/watch?v=e8E2pX8YkCk
И это я даже не знал, что SolarOS это юникс :)
Между прочим, кто-нибудь может опознать с чего они это все рисовали? Я хоть выполню свою мечту, поставлю такое окружение.

>Я - уверен, что очень многие пользователи Виндовс тоже сделают этот переход с удовольствием, когда найдется кто-то, кто им поможет сделать сей шаг, покажет, что есть системы лучше чем Виндовс, что можно не бежать в магазин за новым компом каждый раз, когда выходит новая версия Виндовс, можно работать в операционной среде, где данные не пропадают из-за вирусов и.т.д. Возможно я - не исправимый оптимист, но как-то так мне кажется
Для начала надо бы нормальный дистрибутив, который будет выглядеть свежо, иметь адекватное устройство. Я советовал Минт, он был моим первым, но там DE громоздкие, SystemD (раньше бы добавил PulseAudio, но после недельных разбирательств с хрипами микрофона я теперь на их стороне.) Я вообще думал собрать на базe Devuan собственный дистр, запилить по нему уроки и сделать форум. Но знаний у меня об этом маловато, хотя если кто найдется помочь, я бы занялся.

>Наша (то есть

>Наша (то есть пользователей Юникс систем) задача именно состоит в том, чтобы распространять свой взгляд на вещи среди пользователей Виндовс при удобном случае, рассказывая им о плюсах того же Линукс над Виндовс и убеждая их в привильных вещах.
И получить статус фанатиков и красноглазиков, проходили. Я лучше помогу тем, кто сомневается в переходе, чем буду убеждать пофигистов.

-----------------------------------------------------

Не обязательно, а если кто-то считает Вас фанатиком, не по барабану ли на это?!

-------------------------------------------------------

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

Я думаю, для начала надо человеку показать, что вне Виндовс есть жизнь, а далее он сам разберется с дистибутивом. А из (по-моему скромному мнению, разумеется) не полохих дистров я бы упомянул MX Linux: в нем по умолчанию системой инициализации является SysVinit. Установил на него i3wm и сижу на нем.

admin аватар

Таки влезу.

Таки влезу. Нет, не "по барабану". От мнения других индивидов о вашей скромной персоне напрямую зависят ваши возможности влиять на окружающий мир.

Parthen аватар

>Не

>Не обязательно, а если кто-то считает Вас фанатиком, не по барабану ли на это?!
Предыдущий пост все сказал.
>MX Linux
Неплохой, соглашусь. Но не для юзверя, там много глюкобагов, да и выглядит он так себе. Ну и опять жи, это надо как в PopOS делать магазин приложений (у людей от консоли глаза на лоб лезут), хотя бы для приличия.
Понимайте, чтобы людей завлечь нужно чтобы все было вылизано и красиво, как тортик (вы видели виндовс 11? Там ВООБЩЕ ничего не переделывали, просто дизайн поменяли и просят как за новую версию).
Так что даже если всучивать терминал, то это должен быть какой-нибудь пестрый zsh с автодополнением.

надо как в PopOS

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

-----------------------------

MX Linux имеет свою программу с GUI для установки софта... Так что для тех, кому на первых порах хочется продолжать устанавливать/удалять программы, клацая кнопкой мыши, там все есть. Раз уж Вы считаете, что это нужно, чтоб не отпугнуть человека с Виндовс от Линукса.

admin аватар

> чтобы людей

> чтобы людей завлечь нужно чтобы все было вылизано и красиво

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

Parthen аватар

Ну не род

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

admin аватар

Я бы сказал, что

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

admin аватар

Что-то вы

Что-то вы слишком многое готовы людям простить. "Не виноватая я, меня так научили" — а что, по сторонам поглядеть и понять, что тебя учат чему-то не тому, мы никак не можем? Ну да, подавляющее большинство людей не могут, факт. Ну так они и есть, гм... возможно, всё-таки не идиоты, поскольку "идиот" — это вроде бы официальный медицинский диагноз; но не так уж предыдущий оратор и сильно преувеличивает.

А аналогов не

А аналогов не существует юзабельных в принципе
Ну так раз не можете победить беспорядок - возглавьте его, как говорится. И для вас хорошая тренировка в плане прокачки того же Паскаля будет - вам ведь где-то тут подкидывали, кажется, идеи, в какую сторону посмотреть. Пусть сырой, пусть кривой, пусть "тільки для себе", но свой движок, кмк, будет всяко полезнее, чем готовая игра на Renpy, уж в плане опыта точно.

admin аватар

Я не пробовал

Я не пробовал трогать графику во Free Pascal и совершенно не уверен, что трогать её — вообще хорошая идея.

Подозреваю,

Подозреваю, "подкидывание идей" — это про мой комментарий по поводу библиотеки gfx и прикручивания к Паскалю соответствующего сишного модуля. А Graph на сайте Free Pascal обозначен как This unit is deprecated, так что идея да, не очень, да там и на изрядных костылях придется попрыгать, как при инициализации, так и по ходу дела.

Parthen аватар

Вообще я

Вообще я пробовал сделать cli-шный Renpy, прям с TUI интерфейсом и спрайтами в виде ASCII-арта. Так вот, не особо получилось, это выглядит немного убого.
Ну и да, не буду я графику делать, пока на Си не переберусь. Мне достаточно травм от непостепеннного изучения программирования.

admin аватар

Ну в принципе

Ну в принципе да, хотите — вот вам исходники бесплатно, компиляйте сами как хотите, а не хотите — покупайте откомпилированную версию.

Вы только не обольщайтесь слишком сильно, вложения всё равно не отобьёте. Только ещё больше потратите на инфраструктуру приёма денег. NB: пожертвования физлиц физлицам налогами не облагаются, а вот всё остальное — ещё как облагается.

Parthen аватар

Тут еще дело в

Тут еще дело в том, что лично я ничего не вкладываю (кроме своего труда). И очень надеюсь разубедить того кто вкладывает. Потому что даже самые отъявленные копирасты таки поняли, что продавать платные игры -- заведомо гиблое дело.
Продавать всяческие DLC, фан-паки, материалы разработки в разы выгоднее.
Но тут еще такой момент, что тот же пресловутый Steam организует распродажи, так что можно и цену на 99% снизить -- многие так делают.
>Вы только не обольщайтесь слишком сильно, вложения всё равно не отобьёте. Только ещё больше потратите на инфраструктуру приёма денег.
Так это, не будем же громоздить собственный сайт и там продавать, это и в правду придется еще и ООО заводить. Через площадки разные будем.
Понимая к чему вы клоните -- я точно не знаю, разрешают ли они раздавать бесплатно, но множество знакомых, да и компании так делают, им ничегошеньки не было.
Насчет налогов... Если прям делать все с буквой закона, то надо регистрировать ООО, платить всем зарплаты, открывать представительства в Китае и США, и там еще платить налоги. Это не говоря о том, что в Китае что-то делать можно только с территории Китая, а я туда ехать не собираюсь.
Да и технически я просто не могу этого всего сделать -- в 16 лет мне не то ООО, даже ИП не светит.

пресловутый

пресловутый Steam
Буэ... Это ж DRM "ихний" пихать себе придется. Нацеливайтесь уж тогда на GOG, там такой хрени не требуется, да и по формату ВН, имхо, к ним ближе будут.

Parthen аватар

Не одной

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

admin аватар

Так вы

Так вы считаете, что на Steam — "можно"? По мне так проще нырнуть в бочку с дерьмом.

admin аватар

Собственный

Собственный сайт как раз очень даже стоит "взгромоздить". А вот если хотите с этого получить денег — то на сайте не следует ничего продавать, будет правильнее собирать пожертвования. Что характерно, "правильнее" в данном случае сразу в двух смыслах — и этически, и материально. То есть на пожертвованиях вы и денег больше соберёте, и копирастами не станете.

А вот про скидки на 99% — это вообще не про то. Совершенно неважно, сколько денег требовать в режиме копирастии, тут не бывает "мало" или "недорого", принципиально тут одно: это больше, чем ноль.

На всякий случай, как показывает мой опыт, ИП намного удобнее, чем ООО (если не нанимать сотрудников), только нужно иметь хотя бы 700 тысяч в год входящих платежей, чтобы взносы в ПФР и ФОМС покрыть из налогов. А два года, которые вам остались до совершеннолетия, пролетят намного быстрее, чем вы ожидаете. Подозреваю, что за эти два года вы начисто потеряете интерес к проекту.

<взносы в ПФР и

<взносы в ПФР и ФОМС покрыть из налогов>
Не совсем правильно - это налоги покрываются за счёт взносов. То есть платим страховые за себя и пишем в декларации, что налогов государству должны меньше или ноль. Как действующий ИП говорю.
Ограничения на регион у самозанятых убрали. Теперь по всей РФ можно.
Ах да. В 16 лет регать ИП можно - сам так делал. Но нужно письменное (насчёт нотариально заверенного не помню) согласие родителей или документ об эмансипации.

admin аватар

Я тоже

Я тоже действующий ИП, и чо? Налоги мы уменьшаем на сумму взносов, то есть платим ту сумму, которую бы заплатили в виде налога, просто часть её перечисляем на другой КБК (заметим, даже счёт тот же — налоговая инспекция; но попробуй ошибись в этом проклятом КБК, замаешься потом). Т.е. взносы платим, но при этом платим настолько же меньше налогов. Что из чего при этом покрывается — это, я бы сказал, какой-то вопрос из области схоластики :-) Факт тот, что сумма налога на доход у нас должна быть больше либо равна сумме взносов, иначе таки придётся эти взносы просто вынуть из кармана и отдать.

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

Что в 16 лет уже можно ИП зарегистрить — это довольно интересно, но нашему потенциальному предпринимателю я бы настоятельно советовал с этим не торопиться.

<Факт тот, что

<Факт тот, что сумма налога на доход у нас должна быть больше либо равна сумме взносов, иначе таки придётся эти взносы просто вынуть из кармана и отдать.>
Я сидел на ЕНВД, и налог был заметно меньше страховых. Сейчас есть возможность сделать то же самое на патенте. Так что вопрос довольно важен в ряде случаев.
У самозанятых есть ещё одно неудобство: чеки, чеки, чеки. И все через приложуху на смартфоне, которая временами просто не работает.

admin аватар

У меня странное

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

Parthen аватар

Простенький

Простенький сайтик я само собой сделаю, хоть и не особо хочется (после близкого знакомства с Gemini и его gemtext желание делать что-то на HTML отпадает напрочь).
А вот сделать оплату через него... Этак придется делать логику на сервере, а это изучать PHP (ну не на питоне же блин писать). Вроде помню пару сайтов, которые позволяли пожертвования принимать, и при этом без JS и рекламы.
>А вот про скидки на 99% — это вообще не про то.
Так тут не про свободу речь, а про хомячков, которые ринутся покупать игру, думая, что они эти 99% "сэкономят".
>нужно иметь хотя бы 700 тысяч в год входящих платежей
Хорошо если хотя бы 1/10 часть этой суммы вернется, у нас тогда даже нехилая прибыль будет.

admin аватар

после близкого

после близкого знакомства с Gemini и его gemtext желание делать что-то на HTML отпадает напрочь

Не в том направлении мыслите, молодой человек :-) Делайте на здоровье сайт на gemini, а в HTML сделайте конвертор, это очень и очень просто; ну а результат конверсии сделайте доступным через http/(s?). Зато сайт будет доступен через оба протокола, то есть его смогут прочитать более-менее все, а не только продвинутые пользователи gemini (NB: лично я ни одной сколько-нибудь пристойной реализации gemini-клиента не заметил, так что сайт на gemini при текущем положении дел прочитать не смогу, хотя я вроде бы отношусь к категории продвинутых).

А вот сделать оплату через него...

А вот нафига? Берите пример с меня, где тут у меня "оплата через сайт"?

Этак придется делать логику на сервере, а это изучать PHP

Ещё лучше. А нормальные языки всё, уже не надеемся изучить?

Хорошо если хотя бы 1/10 часть этой суммы вернется,

Куда вернётся, откуда вернётся? Что-то вы не о том. 700 тысяч годовой "грязной" выручки даёт при 6%-ной "упрощёнке" 42000 налогов, что покрывает обязательные "фиксированные" взносы "за себя", которые обязан перечислять в фонды каждый ИП, но, к счастью, может вычесть их из налогов. Так вот, при годовой выручке ниже, КМК, работать в качестве ИП становится слишком накладно. Хотя есть ещё т.н. "самозанятые", с них в фонды ничего не дерут, но это вроде бы доступно не во всех регионах. И там верхний лимит годовой выручки 2.4 миллиона, на первых порах хватит, потом может стать тесно.

Parthen аватар

>Не в том

>Не в том направлении мыслите, молодой человек :-) Делайте на здоровье сайт на gemini, а в HTML сделайте конвертор
Оно так можно, но сайт "немодный" и "некрасивый" будет. Хотя вот вообще-то такой сайт у меня есть -- parthen.smol.pub.

>NB: лично я ни одной сколько-нибудь пристойной реализации gemini-клиента не заметил, так что сайт на gemini при текущем положении дел прочитать не смогу, хотя я вроде бы отношусь к категории продвинутых
Я пользуюсь Lagrange, он GUI-шный и на C написан. Там куча плюшек, по типу встроенного парсера новостей и отображения темы читаемого текста.
Консольные есть, но они все новомодные, да. Но без шуток, возьмите да напишите свой, по правилам полноценный клиент должен уложиться в 50 строчек на высокоуровневом языке. А так я пользовался AV-98 на питоне и Amfora на го, вроде нормально. Но советовать не буду :)

>А вот нафига? Берите пример с меня, где тут у меня "оплата через сайт"?
Хмм, так конечно можно, но постоянный наплыв средств на мою карту может смутить налоговую. Хотя да, и вправду так можно.

>Ещё лучше. А нормальные языки всё, уже не надеемся изучить?
Что, прям на С бекенд писать? Я его еще не знаю, к сожалению. Хех, хотя попробовать на Pascal сделать велосипед с генерацией страниц можно попробовать.

>Куда вернётся, откуда вернётся? Что-то вы не о том.
Я про то, что мне даже оборот таких сумм не светит, я уж молчу про входящие платежи.

smol.pubСлушайте,

smol.pub
Слушайте, ну для меня каждый ваш комментарий как праздник - столько интересных ссылок мимоходом подкидываете, да и вообще пищи для всяческих размышлений. Вот не слышал до вчерашнего вечера ни о Gemini, ни о gemtext - спасибо, расширил кругозор. Увидел теперь живой пример и , как говорится, "понял, что это хорошо".

Parthen аватар

Да не за что,

Да не за что, сам таким был :)
Достаточно сидеть в тусовках людей, которым не плевать на безопасность. Тут уже проскакивали ссылки на tolstoevsky.ml и digdeeper.neocities.org, я у них все и нашел.

*neocities.org тоже,

*neocities.org тоже, кстати, был из той же оперы - полезных ссылок :-D

admin аватар

Сайт можно

Сайт можно сделать и "модный", и "красивый" — нужно просто осознать, что оформление и контент — это разные (и не пересекающиеся!) вещи. Контент брать из gem'овских текстов путём их конверсии, а с оформлением развлекаться, как душе угодно.

Про Lagrange — нет уж, увольте-с. C11, CMake и толпа внешних зависимостей, каждая из которых в десятки раз жирнее основной программы. Поубивал бы. На сборку подобных вещей я свою жизнь тратить не согласен, а в дистрах пока что этого пакета нет.

> постоянный наплыв средств на мою карту может смутить налоговую.

Вроде не должен. Для этого придумано поле текстового сообщения получателю — там надо не забывать писать "пожертвование", в смысле чтобы все, кто посылают, не забывали. Как показывает мой опыт, если на сайте объяснить, почему так надо, большинство народу всё делает правильно. А получателем пожертвований быть в 16 лет вроде никто не запрещает.

> прям на С бекенд писать?

На чистом Си умаетесь, но вот если дойти-таки до подмножества Си++, рассмотренного в третьем томе, то на нём, по мне, в самый раз.

> даже оборот таких сумм не светит

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

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

Parthen аватар

>Про Lagrange — нет

>Про Lagrange — нет уж, увольте-с. C11, CMake...
Я не компилил, не знаю про все это. Я через собранный Appimage хожу. (Или вы не любите такое?)

admin аватар

Пардон, как

Пардон, как такое можно любить?!

Parthen аватар

Для начала мне

Для начала мне бы понять, что это такое вообще. Как я понял при первом знакомстве, это аналог виндового portable exe, когда все зависимости запихиваются вместе с программой.

admin аватар

Насколько я

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

Того, кто первым придумал шареные либы, надо было пристрелить.

как "взгромоздить" свой собственный сайт

Я пока новичок, но тоже хочется поднять свой сайт, не давать же работадателям ссылку на свой гитхаб, которого нет. И очень даже хочется показать свои проекты. Чтобы с оформлением и прочее. Блог вести. Нужно ли знать для этого материалы со второго тома про сокеты, ос, сети и прочее? Или хватит знаний из инструкций в интернете. Ещё очень хотелось бы иметь почтовый сервис. Чтобы не пользоваться бесплатными. Мне пока инструкция видится так, купить VPS, домен и дальше... Можете дать хотя бы краткую инструкцию другим бы тоже было бы интересно прочитать.

Не могу не поделиться

Не могу пройти мимо и не поделиться следующей ссылкой:
https://landchad.net/
Также у автора сайта, Luke Smith, есть видео на данную тему, начиная от того, зачем каждому свой сайт, заканчивая созданием сайта, своей почты и git сервера. К тому же он написал свой скрипт для быстрого создания и настройки почты -- emailwiz. В общем, там много всего, рекомендую!

admin аватар

Берёте VPS,

Берёте VPS, смиряетесь со вздохом, что там systemd, регистрируете домен, поднимаете DNS (да, он должен быть свой, про размещение secondary договариваетесь с кем-нибудь, многие регистраторы доменов это предлагают бесплатно как приложение к домену), ставите postfix, настраиваете его (только аккуратно, не сделайте случайно open relay), дальше ставите Apache (ну или nginx, тут я опасаюсь советовать, сам его не трогал) и поднимаете сайт. Да, на всё есть инструкции в интернете. Надо только знать Unix.

Какие проблемы

Какие проблемы купить vps без системды? Сервисов предоставляющих выбор ос более чем достаточно.
К примеру я пользуюсь услугами https://cockbox.org, а vps-ка у меня с фряхой на борту.

admin аватар

Всё бы хорошо,

Всё бы хорошо, только ссылка у меня не открылась :-)

А почём там VPSки? Linux без systemd там тоже есть?

> Всё бы хорошо,

> Всё бы хорошо, только ссылка у меня не открылась :-)

Думаю, Вы можете познакомиться с сайтом через их тор-зеркало
http://dwtqmjzvn2c6z2x462mmbd34ugjjrodowtul4jfbkexjuttzaqzcjyad.onion/

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

> А почём там VPSки?

Цены начинаются от 10 баксов.

> Linux без systemd там тоже есть?

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

feriman аватар

В Gentoo

В Gentoo присутствует systemd. Просто есть возможность выбора. То же касается Arch (можно поменять дефолтный systemd на openrc). А еще есть LFS.

admin аватар

> я не могу

> Цены начинаются от 10 баксов.

Честно говоря, я предпочту платить 4 бакса за VPS с systemd, чем 10 баксов за VPS без такового. К счастью, от VPS обычно нужно не так много, "особенности" systemd выпирают редко.

> я не могу назвать ни одного линукса

https://www.devuan.org/

feriman аватар

А как же призыв

А как же призыв на главной "Be wise: Boycott systemd"?

admin аватар

Всё с призывом

Всё с призывом в порядке, я сейчас никому за VPSки не плачу, ни с ним, ни без него. Но платить втрое больше только за то, что чуваки сподвиглись предоставить образ без systemd — это слегка перебор.

feriman аватар

Резонно. В

Резонно. В принципе и дядька Линус говаривал что "they doing many things in right way". Думаю, проблема не в самом systemd, а в том, что большинство дистрибутивов скопом перешли на эту систему.

admin аватар

Тут всё не так

Тут всё не так просто. Если бы "топовые" дистры не принялись "это" форсить с энергией, достойной лучшего применения, то этой дрянью никто бы никогда не стал пользоваться, про неё бы просто никто ничего не знал, кроме несчастных людей, вынужденных по какой-то причине использовать Redhat Enterprize или как он там сейчас называется. Публика вообще довольно консервативна. Мне представляется совершенно очевидным, что имели место некие административные (т.е. среди начальства, рулящего деньгами, а не среди технических специалистов) договорённости о таком вот практически синхронном "прыжке в будущее", то есть по факту некая достаточно узкая группа манагеров (ни бельмеса, заметим, не понимающих в компьютерах) навязала systemd всему линуксовому миру. И это — безобразие, терпеть которое можно только если совсем себя не уважать.

А Торвальдс — ну что Торвальдс? Думаете, он не продаётся за деньги? Так он вроде себя никогда не позиционировал в роли этакого неподкупного идейного героя, как, например, тот же Столлман. В последнее время Торвальдс что-то совсем странно отмалчивается, сначала вон systemd — вместо того чтобы просто предать анафеме и поцтеринга, и его поделье, начал изобретать обтекаемые формулировки; а теперь вон гугл собирается ядро на расте переписывать, а Торвальдс вообще молчит в тряпочку. Нет, тут явно нужна поправка на то, что у корпораций есть много бабла.

feriman аватар

Мне кажеться,

Мне кажеться, что тут явно политика замешана. Взять тот же раст. У них в технической документации встречаются формулировки типа: "... если компилятор выдает ошибку то это не значит что вы плохой программист ..." и тому подобный бред сумасшедшего. Комьюнити - три с половиной калеки.
Насколько мне известно, в России некоторые гос. учреждения переходят на Linux, а в европах уже давно перешли. Раст - для вашей "безопасности" -- говорили они. Ага-ага.
Думается мне, тут нужна отечественная альтернатива. А то опять в один прекрасный день что-то навяжут для "безопасности".
Хотя может быть я и не понимаю что происходит...

admin аватар

Вот уж что мне

Вот уж что мне категорически не нравится, так это вообще любые разговоры об "отечественных альтернативах", "отечественном ПО" и т.п. Я, конечно, корпорации не люблю, но "наши" (в смысле российские) госструктуры представляют для любого из нас куда как большую опасность, нежели любые западные корпорации.

Альтернативы должны быть, но уж точно не "отечественные". И, кстати, альтернативы есть, тут недавно обсуждались те же *BSD. А гугл и прочие корпорасты анноят не только нас, но и людей на Западе тоже, и ещё неизвестно, кого в большей степени. С теми, кого тот же гугл уже достал до печёнок, следует сотрудничать вне всякой зависимости от того, в каких странах они живут.

feriman аватар

С

С отечественными альтернативами я, пожалуй, действительно погорячился. Извините.

Сам уже шестой год пользуюсь Gentoo. Читал у вас обсуждение *BSD систем. Думаю таки попробовать OpenBSD. Хорошо что swap-раздел на 32 Гб создал когда Gentoo устанавливал -- теперь есть возможность установить OpenBSD в дуал бут.

Parthen аватар

А разве нельзя

А разве нельзя на VPS просто свой образ загрузить?

admin аватар

Теоретически

Теоретически можно, практически ни разу не видел, чтобы провайдеры это давали.

Не стоило так мне разбрасывать я фразами :)

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

Ещё один вопрос. А если имущественные авторские права уничтожат. То тогда могут ли люди ваши книги распечатывать неограниченным тиражом и продавать бумагу. Ведь например у Чехова никто ничего не спрашивает, да и как там спросить :). Или это уже к неимущественным авторским правам относится и надо брать личное разрешение автора, пока он жив?

admin аватар

Если убрать

Если убрать насилие совсем

Рекомендую взять на вооружение термин "инициированное насилие". Позволяет снять кучу дебильных "аргументов".

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

Да, несомненно. Бумага — такой же носитель, как и любой другой. Так что тут я потеряю источник дохода :-) Но профита от отмены интеллектуальной собственности я получу намного больше, чем потерь. Это не говоря уже о тех людях, которые не являются авторами и одновременно собственниками произведений, имеющих ненулевой рынок сбыта — то есть вообще почти обо всех.

Не-ASCII символы в коде

Я тут программку одну встретил. В исходнике в одной из первых строк упоминается имя автора, которое содержит буквы расширенной латиницы (диакритические знаки). Всё остальное кроме этого имени — на английском языке.

Как вы думаете, даже в этом случае они недопустимы? И если так, что с именем делать?

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

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

Мне кажется, что UTF-8 достаточно уже набрал популярности, чтобы в отдельных случаях такие символы допускать. Проблема разве что в том, что такие символы я замечаю как раз когда они не в UTF-8, а в какой-нибудь iso-8859-1 или чём-то подобном — тогда они сразу видны. А если файл в UTF-8, то типографский апостроф можно и не отличить от обычного, если не всматриваться.

admin аватар

> Как вы

Как вы думаете, даже в этом случае они недопустимы? И если так, что с именем делать?

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

в английском языке встречаются слова, содержащие диакритики

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

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

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

Мне кажется, что UTF-8 достаточно уже набрал популярности

Unicode в целом представляет собой очередного комитетского бастарда, имеющего прав на существование ровно столько же, сколько и любой другой комитетский бастард — то есть ноль. Utf8 можно с натяжкой рассматривать как некое «меньшее зло», но только в сравнении с другими юникодными кодировками, и, самое интересное, только благодаря тому, что utf8 до определённой степени "совместима" с ASCII (sapienti sat). О каком бы то ни было применении utf8 речь может идти (хотя по мне так и не должна — лично я с koi8 слезать не собираюсь) лишь в случае, если наличие в тексте разнообразных символов является частью условия решаемой задачи — то есть, собственно говоря, при представлении текстов на естественных языках, использующих расширенную латиницу или нелатинские алфавиты (вот только не надо про математику, с представлением математических формул utf8 в любом случае не справляется, да и не пытается справляться, это другой вид спорта).

И вот что — вон с моего сайта. Мне тут пропагандисты юникода не нужны.

Спасибо вам большое

Здравствуйте, Андрей Викторович! Спасибо, вам большое за ваши книги особенно за первую часть с Паскалем. Меня на первом курсе учили плюсам и меня не покидала мысль что я пишу ненастоящие программы, мы просто присылали решения на олимпиадные задачки. А "изучал" я его просто зубря формулы из STL. Дело дошло до того, что я взялся за книжку Страуструпа "Программирование Принципы и практика с использованием C++" и взялся за эту книжку с неимоверным желанием достичь до 17 главы где рассматриваются оконные приложения, ибо приложения мои были не настоящие. А оказывается мне даже не нужны были окошки! Даже попытался в ООП, ибо все "крутые программисты" пишут в таком стиле. Сейчас пишу на Паскале разные клёвые штучки и даже нет желания бросать. Теперь С++ вспоминается как страшный сон. Я даже не подозревал что с знаниями которыми я обладал для решения олимпиадных задач можно было пользоваться для написания настоящих программ. Теперь я олимпиадки бросил, и заинтересовался написанием прикладных программ. Тех же игр и разных фильтров даже есть идея написать компилятор, но мне наверное пока далеко :-). Привет вам из Алматы

admin аватар

На самом деле

На самом деле никуда вы от Си++ не денетесь, просто, во-первых, не надо с него начинать (жуть какая, блин... поубивал бы ваших преподов) и, во-вторых, сначала язык, потом примочки (сейчас чуть менее чем все пытаются людей "учить" наоборот). Так или иначе, если есть возможность не спешить — не спешите. Вы сами поймёте, когда придёт время вернуться к Си++.

Приступить к Си

Зарегистрироваться на вашем сайте оказалось легче чем я думал. Теперь одним анонимом меньше. Мои программы на паскале достигли 1-2.5к строк и я освоился с ассемблером. Мне кажется если я вообще не буду спешить то там можно и 10к строк спокойно достичь. Главное добавлять фишки к программам делать юзабельнее и читать доки fpc. Стоит ли приступать к Си? Мне кажется с нового учебного года нам снова будут показывать плюсы или им придётся все-таки показать людям Си. Но я не уверен, что они смогут объяснить людям указатели, благо я освоился. Я в интернете читал в "учителях" в таком случае пробуждается большое желание смешивать эти два языка, на одной паре показывая <iostream>, а на второй printf().

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

admin аватар

Я бы

Я бы посоветовал сначала всё-таки ассемблер :-) Си тогда пойдёт хотя бы чуточку легче.

Use after free

program use_after_free;
var
	p: ^string;
begin
	new(p);
	p^ := 'This is a string, located in dynamic memory. By this time it''s already disposed.'^J;
	dispose(p);
	write(p^);
	p^ := 'The string has changed value, even though it''s disposed.'^J;
	write(p^);
	writeln('Static string');
end.

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

$ ./use_after_free 2> /dev/null 
q�p.g, located in dynamic memory. By this time it's already disposed.
The string has changed value, even though it's disposed.
Static string
Segmentation fault

Начало первой строки портится, причём перезаписывается каждый раз 15 байт, из них первые 5 — это какие-то 4 случайных байта и 7f, остальные нули. Судя по всему, перезаписывается она именно процедурой dispose (интересно, зачем?), так как, если разместить dispose сразу после new, то строка не портится.

Остальные строки не портятся, так как, видимо, write не используют динамическую память или она выделяется им где-то в другом месте, а кроме них, ничего нет.

Но самое странное в конце — почему программа пытается обратиться к чужой памяти, когда всё уже завершилось, и достаточно вызвать exit()? Если не перенаправлять 2> в /dev/null, то вылезает ещё 75 тысяч строк на тему Runtime error 216. Опять же, откуда так много? Ну ладно бы одна ошибка, ну две... Но почему их 19700 с лишним штук?

В общем, что-то странное происходит. А как заставить fpc вставить нормальные символы не очень понятно. С опцией -g мало что выводится даже в дебаггере.

admin аватар

Что, вот прямо

Что, вот прямо так сложно догадаться?

Ваша ошибка заключается вот в этом предположении:

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

runtime-библиотека, то есть тот код, который собственно и обеспечивает работу new и dispose, никакой магией не обладает и должен (вот именно что должен) как-то поддерживать для себя информацию о свободных (в том числе высвобожденных) блоках. Я не знаю, как конкретно это реализовано в FPC RTL, но самая кондовая реализация этого — объединить блоки в список. А в каждом элементе списка, как мы знаем, должен быть указатель на следующий элемент. А ещё там должна быть некая служебная информация, ну хотя бы размер данного блока. Вот это всё вы и наблюдаете в начале "вашей" (в действительности давно уже не вашей) строки.

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

Что касается -g, то по ней fpc вставляет в объектники символы, относящиеся к вашему коду, но никак не к RTL, а бабах происходит именно в RTL. Только не спрашивайте меня, как RTL пересобрать с дебаг-символами. Это возможно, но я не полезу в очередной раз ковыряться в этой страшенной помойке.

runtime library

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

$ ./use_after_free; echo $?
This is a string, located in dynamic memory. By this time it's already disposed.
The string has changed value, even though it's disposed.
Static string
1

Сделал так. Теперь никаких сообщений об ошибке нету, но почему-то код завершения всё равно 1, а не 0. Может не тот системный вызов?

program use_after_free;
var
	p: ^string;
begin
	new(p);
	dispose(p);
	p^ := 'This is a string, located in dynamic memory. By this time it''s already disposed.';
	writeln(p^);
	p^ := 'The string has changed value, even though it''s disposed.';
	writeln(p^);
	writeln('Static string');
	{$ASMMODE intel}
	asm
		mov rax,60
		xor rbx,rbx
		syscall
	end;
end.
admin аватар

Сисколл тот,

Сисколл тот, регистр не тот -- если я правильно помню конвенцию для 64 бит, то там первый параметр кладут в rdi. А в целом вы творите полный бред. Не нравится реализация new/delete из Free Pascal (хотя она там вполне корректна) — ну, либо переписывайте RTL (благо исходники доступны), либо бросайте уже Паскаль, переходите на Си и там делайте свой вариант стандартной библиотеки, благо там это совершенно штатная возможность. Ещё можно сделать свою реализацию Паскаля, это даже правильно — должна же в мире быть хотя бы одна вменяемая реализация (хотя её вменяемость определяется уж точно не тем, что там конкретно RTL делает с содержимым освобождённой памяти).

Паскаль

Спасибо. Действительно, при замене rbx на rdi всё работает.

Интересно, а это в каком-то мане или доке из Documentation в исходниках линукса описано? grep мне нашел только такое в Documentation/networking/filter.txt:737-738:
... since x86_64 ABI mandates rdi, rsi, rdx, rcx, r8, r9 for argument passing and rbx, r12 - r15 are callee saved.

> Не нравится реализация new/delete из Free Pascal

Да нет, с этим у меня проблем нет, в конце концов освобождённую память действительно не стоит использовать.

Мне не ясно, зачем стандартной библиотеке что-то пытаться делать после того как в основном коде управление дошло до end. Ну разве что буфера ввода-вывода слить.

А ещё исполнимые файлы получаемые великоваты, begin end. даёт бинарник на 191056 байт.

Хотя... gcc даёт 744160 байт с ключом -static на int main(){} даже после strip -s, так что, наверное, я зря этим недоволен.

> переходите на Си и там делайте свой вариант стандартной библиотеки

Смысла нету, уже сделали musl. Гораздо полезнее было бы разобраться, каким образом скомпилировать свою программу статически, линкуясь с ней, вместо glibc. Наверное нужно использовать что-то вроде -nostdlib и -L ../musl/lib

> Ещё можно сделать свою реализацию Паскаля, это даже правильно — должна же в мире быть хотя бы одна вменяемая реализация

А вы смотрели на GNU Pascal? Он правда то ли сдох, то ли собирался, но сделал он это сравнительно недавно, в исторических масштабах времени и может ещё ожить. Вдруг там что-то сделано лучше, чем в fpc?

Но да, zero-runtime версия паскаля была бы, наверное, полезна, но тогда придётся попрощаться с магическими функциями {write,read}{,ln} или создать несовместимое расширение, позволяющее их определять.

-

Если установлены man-pages, смотрите "man 2 syscall". Можно ещё "man 2 syscalls", лишним не будет.

Номера системных вызовов:
x86: arch/x86/entry/syscalls/syscall_32.tbl
x86_64: arch/x86/entry/syscalls/syscall_64.tbl
arm: arch/arm/tools/syscall.tbl
arm64: include/uapi/asm-generic/unistd.h [1]

Все остальные архитектуры вам не потребуются.

>>> Хотя... gcc даёт 744160 байт с ключом -static на int main(){} даже после strip -s, так что, наверное, я зря этим недоволен.

У меня статический 'int main(){}' с Musl, при использовании ld, выходит равным 15KB. Интересно, что ld.gold даёт 7.5KB, а ld.lld - 5KB. Вы не зря недовольны.

Также интересно следующее. Если 'int main(){}' написать всухую на ассемблере, то даже с "ld.lld -s" получаем файл размером немного большим 600 байт, при полезной нагрузке в 12 байт. Если писать elf бинарник вручную, то, по моим прикидкам, потребуется менее 150 байт (Elf Header, один Elf PHeader и один сегмент).

>>> Гораздо полезнее было бы разобраться, каким образом скомпилировать свою программу статически, линкуясь с ней, вместо glibc. Наверное нужно использовать что-то вроде -nostdlib и -L ../musl/lib

Я когда-то давно написал скрипт, который компилирует и устанавливает Musl в нужную директорию (обычно это local в корневой директории проекта). И этот самый скрипт, вместе с архивом Musl'а, вставляю в каждый свой проект, а в Makefile дописываю цель, которая запускает скрипт. В итоге мои программы получаются статически скомпилироваными на Musl вне зависимости от libc host'а. При этом один раз приходится скомпилировать сам Musl, но это не является проблемой; с "-j8", на моём i5 2017-го года, он компилируется менее чем за 10 секунд. При следующих вызовах скрипта, скрипт, перед тем как что-либо сделать, проверяет директорию на наличие желаемого.

Вы верно предположили насчёт "-nostdlib ...". Если сборка происходит с непосредственным вызовом редактора связей, то компилятор модулей вы вызываете с "-nostdinc -I [muslincdir]", а редактор связей вызывается в следующей форме: "[ld] -nostdlib -L [musllibdir] /path/to/musllibdir/crt1.o [your modules] -lc".

1. Сам не проверял, взял из https://reverseengineering.stackexchange.com/questions/16917/arm64-sysca....

admin аватар

Про конвенцию

Про конвенцию — не знаю как насчёт Documentation/, вот есть файл реализации, если его промотать вниз на пару экранов, там обнаруживается огроменный комментарий, подробно описывающий, что куда кладётся и зачем:

https://github.com/torvalds/linux/blob/v5.0/arch/x86/entry/entry_64.S

У musl вроде есть пошаговая инструкция, как с ней собираться, но не помню, где. Почему-то там всё несколько сложнее.

А про Паскаль — ну, zero runtime pascal будет уже не совсем Паскаль, хотя мысль-то, конечно, очень даже правильная.

Вот какая странная ситуация

Пишется игра на crt. И почему-то иногда в процессе игры меняется значение цвета в одной из записей, хотя ни одного присваивания кроме присваивания в начале на это поле нет. Игра сырая (то есть с багами) и я не понимаю почему так, может указатели не туда стреляют и они каким то образом меняют значение в этом поле, то ли ещё что-то другое. Кстати crt выдаёт runtime error при большом размере окошка, пробовал на ваших программах из архива (ни colordemo.pas, ни бегающая звездочка там не работают).

admin аватар

Насчёт отладки

Насчёт отладки — рекомендую вашему вниманию параграф, озаглавленный «Отладка в жизни программиста»; во втором издании это пар.2.13.1. Не волнуйтесь, не вы первый, не вы последний, кто «не понимает, почему так». Почему crt не работает на больших размерах окон и каковы эти размеры — вопрос не ко мне, а к авторам Free Pascal.

Use after free: исследование

Только что прочитал эту главу (да, про CRT спрашивал не я) и как раз закончил чтение части про паскаль. Впрочем, не в первый раз, поскольку я её читал ещё в первом издании, когда оно только вышло.

В общем хорошо, теперь хоть что-то понятно в gdb, но в главе мало инфы. Вот как например вывести карту памяти процесса? Я не нашел ничего лучше чем cat /proc/1234/maps в другой вкладке терминала.

Теперь хочу, скажем, вывести содержимое одной из секций в формате hexdump -C, то есть с дублированием hex и ascii и пропуском повторяющихся строк. Как это сделать в gdb даже после гугления и беглого чтения кусочка мануала непонятно. Я там нашел вариант x /64xb 0xADDRESS, но только так оно без ASCII, можно вывести строки по x /1sb 0xADDRESS, но тогда будет без хекса. Нули выводит все, хотя там этих нулей полно.

Хотелось всю кучу посмотреть, чтобы понять что там за структуры данных. В целом что-то получается через x /64xg 0x... хоть и не совсем в таком виде как хотелось бы. Ещё пришлось сделать set pagination off, чтобы оно просто выдавало всё на экран и не мучалось.

В итоге при пошаговом выполнении видно, что интервал 8192 байт в heap возникает сразу, затем при первом вызове new возникает ещё одна секция, уже на 32 килобайта и в совсем другом диапазоне адресов, в этой секции можно увидеть указатели на первую секцию и структуры данных похожие на двусвязный список. В первой секции по этим адресам видно вот такое:
<U_$SYSTEM_$$_FREELISTS>: 0x00000000

Не очень понятный символ, занимающий 240 байт, но даёт возможность хоть что-то поискать. С помощью grep по исходникам fpc нашел такое в fpcsrc/rtl/inc/heap.inc:

  pfreelists = ^tfreelists;

  poschunk = ^toschunk;
  toschunk = record
    size : 0..high(ptrint); {Cannot be ptruint because used field is signed.}
    next_free : poschunk;
    prev_any : poschunk;
    next_any : poschunk;
    used : ptrint;          { 0: free, >0: fixed, -1: var }
    freelists : pfreelists;
    { padding inserted automatically by alloc_oschunk }
  end;
...
  tfreelists = record
    oslist : poschunk;      { os chunks free, available for use }
    fixedlists : tfixedfreelists;
    oscount : dword;        { number of os chunks on oslist }
    { how many oschunks have been allocated in this thread since
      the last time we doubled the locgrowheapsizesmall size }
    fixedallocated: dword;
    { the size of oschunks allocated for fixed allocations in this thread;
      initialised on thread creation with the global growheapsizesmall setting }
    locgrowheapsizesmall: ptruint;
    oslist_all : poschunk;  { all os chunks allocated }
    varlist : pmemchunk_var;
    { chunks waiting to be freed from other thread }
    waitfixed : pmemchunk_fixed;
    waitvar : pmemchunk_var;
    { heap statistics }
    internal_status : TFPCHeapStatus;
  end;

Не знаю, то это или нет, но похоже на то.

В любом случае, можно применить такой хак, чтобы не трогать структуру данных:

var
	p: ^string;
begin
	new(p);
	dispose(p);
	p  := p+16;
	p^ := 'This is a string, located in dynamic memory. By this time it''s already disposed.';
	writeln(p^);
end.

В этом случае тоже никакой ошибки не возникает и программа корректно завершается даже без ассемблерной вставки.

admin аватар

> в главе мало

> в главе мало инфы

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

> <U_$SYSTEM_$$_FREELISTS>

Тут как раз всё понятно, это глобальная переменная freelists в модуле system. Наверняка имеет как раз такой тип, как вы цитируете.

> можно применить такой хак

Конечно, мне до вас уже не достучаться, но всё же попробую. Поймите одну вещь: нельзя применять такой хак. Падать ваша программа перестала, но правильней она от этого не стала ни на миллиметр. Вопрос о том, почему заведомо неправильная программа ведёт себя именно так, падает именно с таким грохотом, а не с другим, и как сделать так, чтобы она не падала, невзирая на свою неправильность — это не тот вопрос, который должен нас интересовать. А правильный вопрос состоит в том, как написать правильную программу.

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

UPD: И ещё: когда я советовал (вам? или не вам? запутался уже в анонимах, хоть бы краткими никами подписывались...) параграф 2.13.1, я имел в виду не освоение gdb, хотя и это тоже полезно. Но gdb описан тремя параграфами позже, в пар.2.13.4. Я же хотел обратить ваше (или не ваше) внимание на описание отладки как вида деятельности — особенно на тезисы, перечисленные в самом начале параграфа и на первый взгляд кажущиеся шуткой.

Эксперименты с ассемблером и gdb

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

Зато, теперь я знаю кое-что о том, как работает динамическая память и new/dispose, хотя до конца я всё-таки не стал разобираться. Более важно, что я научится работать с gdb получше.

Оказывается, если дизассемблировать главную часть программы, можно найти названия функций из RTL, которые вызываются из неё даже без пересборки RTL. А делается это командой disassemble main и ещё можно написать set disassembly-flavor intel и set pagination off.

А вот такой командой можно дизассемблировать бинарник и посмотреть, что там получилось:

objdump -M intel -h -d hello

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

Ещё для эксперимента, тот же ассемблерный hello world, я засунул в паскаль и скомпилировал. Итоговый бинарник всё равно весит 187 килобайт, а с символами и все 390.
Интересно, а другие компиляторы паскаля (GNU, Turbo, Delphi) умеют вкомпиливать в исполнимый файл только нужные кусочки RTL или нет?

Хотя и с nasm файл получился довольно большим, около 5 килобайтов, но там в основном нули. Для минимизации размера можно собирать вот такой командой:
nasm -g -f elf64 hello.asm; ld -s -n -o hello{,.o}
Тогда размер файла уменьшается до 392 байт. А если вдруг захочется дальше уменьшать размер файла, то это уже надо вручную ковыряться с ELF-форматом, на этот счёт я где-то статью видел.

Parthen аватар

Немного доставило

"Участник команды Google Open Source Security Team Кейс Кук заявил, что ядро Linux «терпит неудачу». Число уязвимостей в нём растёт с каждым месяцем, многие из них годами остаются без внимания."
Теперь, внимание:
"Кейс Кук видит несколько путей решения проблемы. Во-первых, можно увеличить количество программистов, чтобы они активнее находили и исправляли ошибки — как минимум на 100 человек. Это наиболее сбалансированное решение с точки зрения затрат, хотя оно имеет неясные перспективы ввиду постоянного роста кодовой базы — сейчас в ядре Linux больше 25 миллионов строк кода.

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

В-третьих, массу проблем приносит текущий язык программирования С, который не умеет безопасно работать с памятью и потому приводит к огромному количеству ошибок и уязвимостей. По мнению Кейса Кука, хорошим решением может стать перевод ядра Linux на безопасные языки программирования вроде Rust."

Кто-то даже предлагает переписать на плюсах

Я вот на Хабре то и дело встречаю людей, которые предлагают переписать ядро на плюсах. Продвинутый язык не нужно придумывать заново: vector, list, string, ... Можно ещё исключения и шаблоны в ядро пустить...

admin аватар

Мне даже

Мне даже интересно, откуда берутся люди, не понимающие, что такое runtime library, что такое zero runtime и почему в ядре бригады добрых гномиков не в почёте.

откуда берутся

откуда берутся люди, не понимающие, что такое runtime library
Если вдруг узнаете - расскажите, пожалуйста, чтобы случайно там на них не наткнуться... :(
Вообще, конечно, есть несколько маргинальный вариант использования C++ - с -fno-exceptions и -fno-rtti, с классами, содержащими только статические поля и методы исключительно для структурирования кода, без создания экземпляров оных, и с шаблонами. Он вполне может быть использован для низкоуровневого программирования, даже для жесткого реалтайма на микроконтроллерах, причем со вполне ощутимым профитом, но вот только нужно очень ОЧЕНЬ хорошо понимать, как, и, главное, зачем это делается - в таком виде он ни разу не "безопаснее" голого Си. Увы, таких вот понимающих людей (а их, если они есть в команде, сильно берегут и абы кому не показывают, чтобы не сглазили переманили), гораздо меньше, чем восторженных хомячков, топящих за ядро на Питончике и прочем. А уж идея переписать ядро - это вообще нонсенс.

Parthen аватар

> Если вдруг

> Если вдруг узнаете - расскажите, пожалуйста, чтобы случайно там на них не наткнуться... :(
Дайте человеку С++ как первый язык, учите его по урокам на ютубе и обрящете.
>восторженных хомячков, топящих за ядро на Питончике
Такие существуют? Вот без шуток, они реально есть? Даже как бывший питонист я не могу себе такого представить.

admin аватар

> Такие

> Такие существуют?

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

Python на голом железе

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

На микроконтроллерах есть какой-то microPython, ещё есть такая штука:

https://github.com/AsahiLinux/m1n1/

Выполняет команды на python, но как это работает я тоже не вникал.

Но понятно, что или написан какой-то очень мелкий интерпретатор или всё-таки сделали компилятор подмножества питона.

admin аватар

Руки бы

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

admin аватар

Экземпляры

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

Иной вопрос, что хомячков-то, очевидно, набор флагов, отрубающих жирный рантайм, будет раздражать, и они эти флаги будут пытаться убрать при каждом удобном случае. Короче, Си++ в ядро допускать нельзя, это в любом случае плохо кончится. Расставшись с Zero Runtime, этот язык стал для голого железа непригоден.

buq аватар

Окончательно свихнулись

В итоге разговор снова про Раст. Понятно, что гугл хочет уничтожить Линукс, но не понятно почему Линус Торвальдс достойно не отвечает на это. Это не он говорил "Nothing better than C" ?.
И вообще, что значит "безопасный" язык? Я не понимаю. Если человек не знает что такое программирование, он не сможет написать ничего хорошего ни на каком либо языке.

Неумение программировать(или тупизм) приводит к стремлению использовать такие языки как раст.

feriman аватар

Десять веков

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

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".