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

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

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

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

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

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)

Константы при раздельной трансляции

Здравствуйте. Допустимо ли создание одного заголовочного файла со всеми константами, заданными через 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 тыр, для сравнительно небольшой фирмы это может оказаться весьма чувствительно. Могу вам даже рассказать, куда направлять письменные жалобы (в виде заказных писем по обычной почте). А следующий вопрос очень простой: вы это реально делать будете? Или, как все, поленитесь?

Посимвольный ввод

Здравствуйте, Андрей Викторович. Не могу понять, как работает процедура на странице 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 делает что-то полезное и в середине строки тоже, хотя читал несколько статей про работу терминала. А вы как узнали про эту фичу?

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
Привет :)
> Но мой друг хочет именно этот хоррор (именно эту яму), более того, он готов добровольно заплатить за него (за эти биты). И платит.
Заодно платит издателям-копирастам, площадке и т.д.
А потом разрабы поймут, что это все выгодно, и будут еще больше клепать игр, заодно заплатят издателям, рекламщикам и прочей нечисти.
>"игры - отдельная категория", "одно дело код, другое дело сюжет и краски".
Тут в том плане, что современные игры как фильмы, их фиг выпустишь без вышеописанной нечести. Это плохо, и без этого даже можно обойтись -- краундфандинг вам в помощь. Но из меня оратор, как из толстяка балерина, так что переубеждать я никого не умею, не хочу и не буду. Просто мое скромное условие -- все что я разрабатываю я на линуксе раздаю бесплатно.
Ну вот вообще я не считаю особым злом людей, которые это все продают. Зло намного большее кто научил людей, что можно все это продавать. А между прочим, вся это копирасткая хрень принадлежит Биллу Гейтсу "Открытое письмо любителям". Вот прям точь-в-точь аргументы копирастов: "Бесплатное делают любители, а платное оно хорошее", "Вы обесцениваете труд программистов" и проч.

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 тактов на системный вызов, процессор успел бы сделать два миллиона в секунду.

А так можно?

Здравствуйте, Андрей Викторович.

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

По совпадению дошел до шестой части.
Программа в неканоническом режиме без отображения символов ждёт ввода символа или 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'а там и не останется ничего.

на пересдачу :-)

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 аватар

Десять веков

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

Настройки просмотра комментариев

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

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <ins> <del> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <pre>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

CAPTCHA
Проверка на бота
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.