Программирование: введение в профессию. Издание второе, в трёх томах.

1st volume cover 2nd volume cover 3rd volume cover

Аннотация

Учебник «Программирование: введение в профессию» ориентирован на самостоятельное изучение и предполагает использование систем семейства Unix (в т.ч. Linux) в роли сквозной среды для обучения.

Публикация в бумажном варианте

Первое издание публиковалось издательством МАКС Пресс (Москва) с 2016 по 2020 г.

Второе издание опубликовано издательством МАКС Пресс в 2021 году.

  • ISBN 978-5-317-06573-7 (книга в целом)
  • ISBN 978-5-317-06574-4 (том I)
  • ISBN 978-5-317-06575-1 (том II)
  • ISBN 978-5-317-06576-8 (том III)

Электронная версия

Электронные версии каждого из трёх томов, идентичные печатному изданию, доступны по следующим адресам:

Статус бумажной версии

Имеется в продаже.

Архив примеров программ

Архив, содержащий примеры программ, можно скачать здесь: progintro_e2_examples.tgz. Напоминаем, что раскрыть этот архив можно командой
   tar -xzf progintro_e2_examples.tgz

Файл stud_io.inc, используемый в начальных примерах третьей («ассемблерной») части, можно взять здесь: http://www.stolyarov.info/books/extra/stud_io_inc. Не забудьте переименовать файл! Это делается так:

  mv stud_io_inc stud_io.inc

Errata

Список найденных в тексте ошибок и опечаток находится здесь.

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

Здравствуйте! Остановился на Паскале, есть идея написать одну программу, но... Уже как месяц (вместе с учебой) пытаюсь соблюсти все принципы адекватного кода + чтобы все это было понятным (не более 4 параметров, подпрограмма решает одну, независимую от других подпрограмм, задачу и т.д.).
Так вот вопрос: я параноик (месяц обдумываю, пишу, а никакого рабочего прототипа нет)?

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

admin аватар

> вопрос: я

> вопрос: я параноик (месяц обдумываю, пишу, а никакого рабочего прототипа нет)?

Сложный вопрос :-) точнее, вопрос простой, а ответ на него сложный.

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

Во-вторых, месяц обдумывать — это в целом нормально.

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

Да, ещё один момент:

> речь идет о буквах и числах одновременно

Мне почему-то кажется, что вы путаете "числа" и "цифры".

Ок, спасибо)>

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

Читал комментарии, где вы говорили про systemd:
> Вообще если уж залезли так глубоко, попробуйте сразу сползти с systemd, эта штука мертворожденная и неизбежно в какой-то момент начинает жутко мешать
Почитал про инициализаторы в интернете; Узнал, что один инициализатор прост в использовании и следует философии UNIX (init), а другой - в точности наоборот - сложен и не следует философии UNIX;
В этом ли все дело? То есть это является причиной, из-за которой люди не любят systemd?
Возможно, лезу вперед, но стало интересно, почему все сложилось именно так.

admin аватар

Философия - фигня

Философия — фигня, хотя, конечно, всё именно так. Но — за всех, конечно, не поручусь, а лично я systemd "не люблю" (если быть точным, с удовольствием пристрелил бы всех, кто имеет отношение к его созданию и раскрутке) по одной простой причине: его навязывают. Если дистрибутив переходит на systemd, в нём вся основа, всё то, что мы называем "системой", становится повязана на systemd, то есть выкинуть его оказывается невозможно; при этом systemd от пользователей требует усилий на переобучение и траты времени на это, но не решает никаких реально существующих проблем. Попросту говоря, эта публика — RedHat и все, кто за ними последовали — решили, что они вправе отнимать моё время. Как мы понимаем, такое понравиться не может.

Ну и плюс к тому — решать-то проблем systemd не решает, а вот создавать — создаёт. Если моя система на старте работает как-то не так, я минут за десять разберусь, почему это происходит, поскольку у меня SysVinit, в котором всё, что происходит, задано простыми shell-скриптами. Если система на основе systemd "работает как-то не так", разобраться нереально: нужно лезть в потроха самого systemd, а там, пардон, многобукв и контринтуитивное построение архитектуры.

Более того, в

Более того, в дистрибутивах, где "нет systemd", он таки есть. Просто не весь. udev например.

admin аватар

udev, заметим,

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

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

О нужности udev

Прошу не думать, что я являюсь фанатом udev или чем-то вроде, но, он делает вот это вот:

1. При втыкании устройства создаёт файлы в /dev, а при вытыкании удаляет. В той же OpenBSD приходится каждый раз писать cd /dev; sh MAKEDEV sd или что-то такое.

Как предложите это делать без udev?

2. Предположим у меня есть устройство и при каждом его втыкании я хочу выполнить команду. Как это сделать без udev? Например подключить кастомную раскладку клавиатуры но только к одной конкретной клавиатуре.

В той же OpenBSD

В той же OpenBSD приходится каждый раз писать cd /dev; sh MAKEDEV sd или что-то такое.

Не вводите в заблуждение несведущих, для создания нового файла устройства MAKEDEV нужно написать лишь один раз.

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

OpenBSD

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

Безусловно, в

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

admin аватар

Подозреваю, в

Подозреваю, в исходном комментарии про "один раз" речь шла всё-таки о системе, инсталлированной на жёсткий диск. Что все эти "live" ничего не запоминают из того, что было сделано — не новость.

admin аватар

При втыкании

При втыкании устройства создаёт файлы в /dev,

Вообще-то нет, в Linux'ах нынче devfs, в ней ядро само показывает файлы всех имеющхся в наличии устройст. Но даже если бы не она, да, все эти вещи прекрасно скриптуются, во-первых, а во-вторых, до нашествия udev и devfs в /dev просто присутствовали файлы для большинства возможных устройств, и крайне редко случалось так, что их не хватало.

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

А давайте без "предположим"? Мне за всю мою практику использования Linux (т.е. с 1994 года) ни разу ничего подобного не хотелось, нахрен мне нужен тогда ваш udev?! Пусть его тогда ставят себе те, кому вот такое вот надо, (и если бы лично мне вдруг потребовалось именно команды выполнять по втыканию дивайса, то я бы тоже поставил), а по умолчанию чтоб его не было. Так ведь нет же, вяжут на него половину системы зачем-то, только время отнимают у нормальных людей.

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

udev или не udev

> Вообще-то нет, в Linux'ах нынче devfs

Ну, честно говоря, я не очень понимаю как эта фигня работает. Мне казалось, что файлы в ней создаёт именно udev, но может я и не прав. Да, она называется devtmpfs, а не devfs, по крайней мере у меня.

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

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

> Пусть его тогда ставят себе те, кому вот такое вот надо

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

Кроме того я сделал экспериментальную клавиатуру с кастомной раскладкой, переставив клавиши. Хотелось чтобы на этой клавиатуре была кастомная раскладка, а на всех остальных обычная qwerty. С тем как сделать свою раскладку я разобрался, а с тем как сделать правило udev, которое бы выполняло команду установки раскладки при её втыкании (setxkbmap something) — пока нет. Но вроде не особо сложно.

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

Ну, кроме случаев когда меня не устраивали автоматически создаваемые файлы устройств, с udev мне пришлось столкнуться в ситуации, когда я переставил жесткий диск из одного ноутбука в другой. Тогда у меня появились устройства eth1 и wlan1, а все настройки были на eth0 и wlan0. Пришлось удалить пару файлов udev, чтобы он про эти устройства забыл и назначил им имена с нулём. А потом при переставлении обратно ещё раз так сделал.

Ещё пришлось погуглить и вернуть классические имена устройств вместо неудобочитаемых. У меня всего одна проводная сетевуха, та которая встроена в материнку ноута. Гораздо удобнее когда она называется eth0, а не какой-то там esp1s2 или как там было. Тоже делалось через правила udev но я забыл как.

admin аватар

она называется

она называется devtmpfs

С этим согласен :-) А работает она очень просто: ядро там создаёт файлы для всех устройств, которые есть, а когда устройство исчезает, файл автоматически пропадает. Их можно создавать из userspace обычным способом (mknod'ом), тогда devtmpfs сей факт запоминает и данный файл устройства больше не трогает. Вот тут оригинальное, как я понял, описание: https://lwn.net/Articles/345480/

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

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

> Правда я не понял, как в udev это сделать толком

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

> чтобы при втыкании некоторых устройств, права на них были у простых юзеров

Если это про флешки, то решается соответствующими строчками в fstab'е. Если не про флешки, то для своих дивайсов я специальную программу написал как-то раз (вот тут вот: http://www.unicontrollers.com/downloads сама программка называется unc_chown, там архив исходников есть, можете глянуть, если интересно). Обычный suid'ный бинарник, который юзер может руками дёрнуть, либо те программы, которые с дивайсами работают, могут, не видя дивайса, сначала дёрнуть эту штуку.

Кроме того я сделал экспериментальную клавиатуру с кастомной раскладкой, переставив клавиши. Хотелось чтобы на этой клавиатуре была кастомная раскладка, а на всех остальных обычная qwerty. С тем как сделать свою раскладку я разобрался, а с тем как сделать правило udev, которое бы выполняло команду установки раскладки при её втыкании (setxkbmap something) — пока нет. Но вроде не особо сложно.

Это, пардон, в таком виде не получится. setxkbmap работает только с иксами и должен знать, какие из иксов окучивать (ибо X-серверов может быть больше одного). У udev средства работы с раскладкой свои — и да, по мне так тоже наркоманские.

Что характерно, я в своё время убил не меньше часа, разбираясь, куда делась возможность пришибать X-сервер по Ctrl-Alt-Backspace, и почему закомментаривание опции DontZap в конфиге иксов теперь не даёт ровно никакого эффекта. Точнее, час ушёл просто на то, чтобы осознать, что оно тепербь в конфигах udev. Вопрос, кому классическое поведение X-сервера не давало покоя, наверное, всё-таки риторический (собственно, от таких вот "улучшателей" все проблемы в IT и есть).

появились устройства eth1 и wlan1, а все настройки были на eth0 и wlan0

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

классические имена устройств вместо неудобочитаемых

Это не в udev'е дело, это ядро так сконфигурено. Убунту, что ли, используете? Так или иначе, где проблема, там должно быть и решение — их не udev'ом надо переименовывать, а параметрами ядра в загрузчике. Если у вас grub, то вот так: GRUB_CMDLINE_LINUX="net.ifnames=0"

Это не в udev'е

Это не в udev'е дело, это ядро так сконфигурено. Убунту, что ли, используете? Так или иначе, где проблема, там должно быть и решение — их не udev'ом надо переименовывать, а параметрами ядра в загрузчике. Если у вас grub, то вот так: GRUB_CMDLINE_LINUX="net.ifnames=0"

Всё так, но хочу отметить, что таки udev определённо имеет отношение к этому именованию устройств. Вот, на одной из линукс-систем, которые я поддерживаю (а на основной машине у меня по-прежнему OpenBSD), есть такой файлик:

$ cat /lib/udev/rules.d/80-net-name-slot.rules
# do not edit this file, it will be overwritten on update

ACTION!="add", GOTO="net_name_slot_end"
SUBSYSTEM!="net", GOTO="net_name_slot_end"
NAME!="", GOTO="net_name_slot_end"

IMPORT{cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="net_name_slot_end"

NAME=="", ENV{ID_NET_NAME_ONBOARD}!="", NAME="$env{ID_NET_NAME_ONBOARD}"
NAME=="", ENV{ID_NET_NAME_SLOT}!="", NAME="$env{ID_NET_NAME_SLOT}"
NAME=="", ENV{ID_NET_NAME_PATH}!="", NAME="$env{ID_NET_NAME_PATH}"

LABEL="net_name_slot_end"

Мне не хочется разбираться в тонкостях этого, как я уже говорил, наркоманского синтаксиса, но на первый взгляд именно udev отлавливает параметр ядра net.ifnames и переименовывает устройства в зависимости от него. То есть, если это правило удалить нахер, то параметр ядру передавать не понадобится.

admin аватар

То есть, если

То есть, если это правило удалить нахер, то параметр ядру передавать не понадобится.

К сожалению, это не так. Эти неудобоваримые имена вместо традиционных eth0, eth1 и т.п. — это именно конфигурируемая "фича" ядра (называется, если не ошибаюсь, predictable network interface names), и пресловутый параметр её отключает, если она была включена при сборке. Единственный дистр, в котором она включена, из тех, что я лично трогал-щупал-пользовал — таки убунту, в остальных (в том числе в дебиане) этот идиотизм, судя по всему, не прижился.

udev к именованию (точнее, к ПЕРЕименованию) устройств, несомненно, тоже имеет отношение, в нём соответствующая функциональность присутствует. Но убирать "нахер" надо не правило, а весь udev целиком, это как-то правильнее, что ли.

К сожалению,

К сожалению, это не так. Эти неудобоваримые имена вместо традиционных eth0, eth1 и т.п. — это именно конфигурируемая "фича" ядра

Жаль. Я надеялся, что хотя бы в ядре этой фигни нет.

Но убирать "нахер" надо не правило, а весь udev целиком, это как-то правильнее, что ли.

Да, конечно. У меня даже были планы разобраться с mdev, когда ещё на линуксе жил, но руки так и не дошли. Оказалось проще перейти на OpenBSD, где всего этого дерьма изначально нет.

"(*p).next" vs "p->next"

на стр. 141 можно еще предложить пример с указателем на указатель в качестве аргумента в пользу "стрелки". Получается вообще клинопись:
"(*pp)->next" vs "(*(*pp)).next";

admin аватар

Вот как будто

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

виртуальная машина

Андрей Викторович можно узнать как переползти на другую ОС.
Просто я пользуюсь виндовс 10 и у меня много всего что на линксе работать не будет. Я прочитал что можно использовать virtualbox(все через виртуализацию ставят линукс или как ?)

> много всего

> много всего что на линксе работать не будет

Что в это "много всего" входит?

Разумеется, есть программы, которых нет под Линукс, но все-таки часто оказывается, что пользователь Виндовс запускает в своей системе программы, которые можно запустить либо на Wine под Линукс, либо для которых есть альтернатива на Линукс, либо которые на самом деле не шипко то и нужны ему, но привычка делает свое дело. Я не утверждаю, что это - именно Ваш случай, но... Я в свое время жил в Виндовс и мне казалось, что вот без некоторых программ, которые я на нем запускал, будет не просто. Я разумеется заблуждался, и когда совершал переход на Линукс, нашел для своих задач альернативу на Линукс. Оказалось, что все дело - в привычке и в моем заблуждении, что мол на Виндовс есть все, а на Линукс - нет ничего. Еще раз замечу: не берусь утверждать, что это - именно Ваш случай, я лишь делюсь своим опытом... Во всяком случае, я - очень доволен, что слез с Виндовс, потратив на это сравнительно не так уж и много усилий, чтоб изменить привычкам и отбросить свое заблуждение: потраченные усилия и время стоят того!

Parthen аватар

>много всего

>много всего что на линксе работать не будет
Прям уж?)
Просто есть такая программа, wine, и с помощью нее все прекраснейшим образом работает. Играл на ней в OSU, старые флеш игры и прочую фигню, работало *быстрее* чем на винде.
Ну и да, в это сложно поверить, но на Линуксе программ *гораздо* больше, банально потому, что консольные программы крайне просто писать.
По делу -- ставьте какой-нибудь дистр для чайников, там разберется даже домохозяйка. Можно в дуалбут (будете при загрузке ПК выбирать куда грузиться -- в Линукс или Винду), но скорее всего вы просто плюните, перезагружать каждый раз комп дело не быстрое.

> wineА как он с

> wine
А как он с современными программами справляется, не знаете?

> консольные программы крайне просто писать
Не согласен. Под unix проще и приятнее писать любые программы :)

Можно, кстати, как советует Андрей Викторович, найти или купить старый ноутбук и поставить туда linux. Если ноутбук совсем дряхлый, то это ему может буквально вторую жизнь дать.

Parthen аватар

> А как он с

> А как он с современными программами справляется, не знаете?
Смотря какими. ААА игры -- плохо без настройки, лучши стимовский протон использовать. Всякая хрень с DRM туда же. Ну а все остальное сносно :)
>Под unix проще и приятнее писать любые программы
Я с UI программ под Линукс не писал, так что говорить не буду.

admin аватар

Я и писал, и под

Я и писал, и под Win/* перетаскивал. И нативные виндовые когда-то тоже писал. Подтверждаю, под *nix GUI программировать намного менее противно, чем под win :-)

мне кажется, вы

мне кажется, вы несколько категоричны ("...все прекраснейшим образом работает"), а ваш совет может навредить новичку:
1. далеко не каждый софт запустится под wine. Часто даже разные версии одной программы ведут себя по-разному при эмуляции.
2. даже запустившись, программа часто падает и ведет себя не стабильно.
3. базовая настройка wine требует определенных усилий.
PS: лично мне сложно найти альтернативы в *nix для систем сканирования-распознавания документов и программ для редактирования специфичной документации. И, пожалуй, стоит быть готовым к тому, что половина игр для винды не запустится под *nix.
PSS: я не очень понял, что значит "дистр для чайников"? Отдает снобизмом, не находите? Думаю, проблема не в конкретной *nix системе, а в отсутствии привычки читать мануалы (RTFM). Новичок, вооружившись мануалом и соответствующим настроением, поставит любую систему: от Linux Mint до OpenBSD. И, скорее всего, на первых порах, будет делать это несколько раз подряд.

OpenBSD для чайников

Пробовал я поставить OpenBSD на старый комп с одно-гигабайтным IDE-диском. Если не ставить иксовые группы и компиляторы — то оно, конечно работает. А вот если ставить (для чего применить внешний USB-диск) — то вот фиг вам:

BIOS загрузчик OpenBSD с него грузит, но загрузчик не видит файлов с ядром.

Тогда я попробовал для файлов с ядром создать на IDE-диске небольшой раздел OpenBSD.

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

Если дать ядру параметр -a, то оно будет спрашивать какой взять корневой раздел, но когда оно это спрашивает, оно не видит USB-клавиатуру. Хотя в BIOS и в загрузчике OpenBSD и даже после загрузки она работает.

При этом в Slackware грузится с USB-диска и работает штатно причём с ядром 5.x на древнем компе начала 2000-х, да.

admin аватар

По моим

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

IDE-диск

Там он нестандартного типа. Другой достать можно, но это того не стоит

Parthen аватар

>далеко не

>далеко не каждый софт запустится под wine. Часто даже разные версии одной программы ведут себя по-разному при эмуляции.
Каждый запустится, не каждый будет работать :)
А вообще я перечислил выше, что у меня работает хорошо.
> базовая настройка wine требует определенных усилий
На минте работало из коробки, на дебиане да.
>И, пожалуй, стоит быть готовым к тому, что половина игр для винды не запустится под *nix.
Вообще да, но тут внезапно приходит осознание, что к чертям большинство игр не нужно. Я даже в OSU не играю, осталось только 0 A.D (кстати никто больше не играет?), без стратегий жить не могу, а шахматы надоели.
>дистр для чайников
Дистр, который сложно поломать, и на котором минимально нужно что-то чинить.
>Новичок, вооружившись мануалом и соответствующим настроением, поставит любую систему: от Linux Mint до OpenBSD
Ага, щас :)
Это работает если человек а) умеет читать на английском б) хорошо понимает устройство ПК, читай знает CS.
Я несколько раз не мог осилить Арч, из-за отсутствия вообще какого-либо представления о разметке диска и незнания что такое GRUB.

немного оффтопа про игры, если уважаемый хозяин не против

Есть, кстати, сильно облегчённый опенсорсный клон OSU: https://github.com/fmang/oshu
Я сам, правда, на нём почти не играл. Только собрал себе под OpenBSD и попробовал запустить пару битмапов, чтобы убедиться, что всё работает.

В OSU я поигрываю иногда на смартфоне. Как телефоном я им давно не пользуюсь, симки переставил в дешёвый кнопочный телефон, а вот под музыку пальцем потыкать оказалось прикольно. Тоже, кстати, на опенсорсном клоне, называется OPSU.

без стратегий жить не могу, а шахматы надоели.
Wesnoth?

Parthen аватар

За OSU большое

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

>дистр для


>дистр для чайников
Дистр, который сложно поломать, и на котором минимально нужно что-то чинить.

Неоднозначное определение. Мне, например, поломать Ubuntu проще, чем поломать Slackware. А починить поломанное, наоборот, гораздо труднее.

Про "минимально нужно чинить" то же самое. В свежеустановленной Ubuntu мне с ходу хочется починить вообще всё.

Parthen аватар

Поломать -- это

Поломать -- это и к установке относится :)
Хотя про Slackware я ничего не знаю.
Ну и да, убунта ни разу не для чайников.
Насчет поломать... Целенарпавленно ломать никто не будет, поломать можно что-то когда будешь настраивать, а значит настраивать нужно как можно меньше.

admin аватар

Да ладно, что

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

Parthen аватар

Вот у меня,

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

admin аватар

А если его

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

Parthen аватар

Нет не в цвете,

Нет не в цвете, именно что боязнь терминала.

Насчёт боязни

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

А в терминале все можно зажурналировать и хоть 1000 раз потом перепроверить текстовый файл. Только терминал спасает меня от моей "ОКР", паранои и перфекционизма. И ещё я могу 2 часа выбирать имя переменной.

Привожу как просто альтернативную точку зрения.

Неужели нужно лечится и зарядится пофигизмом? И плохие ли это привычки для разработчика?

admin аватар

плохие ли это

плохие ли это привычки

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

> боязнь

> боязнь терминала.

Часто у этого нет оснований, ибо какая разница, выбирать диск для установки в GUI и нажимать на кнопку "Далее" или установливать систему в текстовом режиме и, вместо кнопки "Далее", нажать предлагаемую кнопку на клавиатуре, чтоб выбрался нужный диск для установки? Но начинающий, разумеется, об этом и не догадывается... Но боится... Да, во время установки, например, OpenBSD есть свои особенности, но если в компе - один диск и делать авто разметку диска, ну тогда там все достаточно таки просто!

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

admin аватар

Странно, за

Странно, за собой такого не помню. Ну хотя я с ДВК начинал :-)

admin аватар

> поломать Ubuntu

поломать Ubuntu проще

А ведь верно, причём в самом буквальном смысле. Там ведь по умолчанию есть sudo, и оно юзеру доступно без ограничений.

починить вообще всё

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

Видимо, самая

Видимо, самая главная неисправность заключается в неправильном выборе дистра перед установкой :-)
Дык! :-)

Справедливости ради, последний раз такая проблема возникала когда я ещё работал в офисе, на предустановленной убунте. Помучившись какое-то время, решил проблему именно что установкой другого дистра.

хорошо

хорошо понимает устройство ПК, читай знает CS.

Я бы не стал обобщать "понимание устройства ПК" до "знания CS". CS -- это ещё и, например, дискретная математика, алгоритмы, теория вычислимости, теория категорий, и проч. Всего этого точно не нужно, чтобы установить ОС, пусть даже это и OpenBSD с текстовым инсталлятором.

Parthen аватар

Справедливо, не

Справедливо, не знаю как назвать дисциплину, разбирающую устройство ПК.
И не просто устройство, мол, вот это диск, а это ОЗУ, а именно что такое раздел, BIOS, шина, и проч.

admin аватар

Кстати да.

Кстати да. Больше того, я неоднократно видел людей, вроде бы знающих CS, но которые про DPT, например, не в курсе, и компьютер разобрать-собрать не могут.

DPT

Что такое DPT? Если аббревиатура, то можно полностью словами? Гуглится что-то невнятное.

admin аватар

Disk Partition Table

DPT

Это странная аббревиатура. например MBR или GPT я бы понял, а так нет

Я как-то пробовал создавать флешку с бесконечным количеством разделов. Extended Partition может ссылаться сама на себя.

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

admin аватар

MBR не про то, это

MBR не про то, это скорее тот машинный код, который занимает начало того же (самого первого на диске) сектора, в конце которого располагается таблица разделов.

А GPT, кстати, вот я бы уже не понял. Во всяком случае, без обращения к поисковикам.

admin аватар

Поскольку мы

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

От этого "много всего", что "не будет работать", придётся отказаться. Либо отказаться от моих книг, всё равно толку не будет. Отказываться от привычного софта, впрочем, можно постепенно — например, загружать Win только в случаях, когда вот совсем никак не получается прямо здесь и сейчас что-то сделать без неё. И частота возникновения таких случаев должна постепенно падать. Linux (или другой Unix, скажем, FreeBSD или OpenBSD) следует воспринимать как основную систему, а не "учебную", в противном случае можно даже и не начинать дёргаться. Ну, или другие книги поискать, во всяком случае. Мои книги с повседневным использованием систем линейки Windows несовместимы.

Windows

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

SSD (причём можно прошить даже тот с которого загружена ОС), флешки (если сдохли их иногда можно оживить утилитой от производителя), кнопочные мобильные телефоны (андроидовские прошиваются просто копированием zip-файла в определенный каталог на карте памяти и загрузкой в режиме Recovery).

Ещё есть класс задач типа — подсказать виндузятнику как что-то там сделать в Windows. Тут тоже желательно иметь её у себя на компе.

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

admin аватар

Да у меня тоже

Да у меня тоже вообще-то есть ноутбук с XP :-) Правда, задача ровно одна: запускать софтины для генерации отчётов в налоговую и ПФР. Под wine они вроде тоже запускаются, но возникают странные проблемы с русским вводом (не разбирался, скорее всего это из-за того, что у меня koi8), а тот ноут всё равно больше мне ни подо что не нужен.

Дело не в том, что Windows нужно полностью изжить и не прикасаться к ней под страхом расстрела. Дело (если речь идёт об обучении по моим книжкам) в том, что _жить_ нужно под *nix'ом, и не просто жить, а обязательно использовать в роли основного инструмента управления машиной командную строку.

ОК понял

ОК понял спасибо.

небольшое замечание

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

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

admin аватар

Ну здрасссте.

А ничего, что эта функция — метод объекта, вызывается для объекта и имеет доступ к полям объекта?

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

2 книга предыдущего издания

Спасибо вам огромное за ваши труды. У меня вопрос: второй том про низкоуровневое программирование не вошёл во 2-е издание. А почему так? Разве его теперь не стоит изучать, чтобы пойти дальше в сети и парадигмы? Спасибо =)
P.S. ну и капчи у вас, я и сам далеко не с первого раза отправил).

admin аватар

ёлки-моталки,

ёлки-моталки, смотрим сюда: http://www.stolyarov.info/books/programming_intro проматываем полэкрана вниз, видим текст, выделенный фоном и жирным шрифтом:

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

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

Язык ассемблера, побитовые операции, оператор and

В вашей книге есть примеры с оператором and:
Так, с помощью команды and можно получить остаток от деления беззнакового числа на степень двойки (от 1 до 32 степени); например, "and eax, 3" оставит в eax остаток от деления его исходного значения на 4, а "and eax, 1fh" - остаток от деления на 32.
Не могу понять, как это получается;
Возьмем число 255 (1111 1111 в двоичной системе) и выполним операцию and с той же тройкой (0000 0011). В регистре останется тройка, так как только на первых двух позициях в обоих числах есть единицы. Также с числом 31. Или я что-то путаю?

admin аватар

Конечно,

Конечно, путаете:

Возьмем число 255 (1111 1111 в двоичной системе) и выполним операцию and с той же тройкой (0000 0011). В регистре останется тройка,

Ну так остаток-то мы искали не от деления на три, а от деления на четыре. И ага, остаток от деления 255 на четыре составляет таки три, тут всё верно.

Также с числом 31

Абсолютно верно, и получается остаток от деления на 32. Как это и написано в книге, собственно говоря.

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

Кстати, and никакой не оператор. В ассемблере вообще нет операторов.

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

Здравствуйте! Очень заинтересовал ваш трехтомник ("Программирование: введение в профессию"). Вопрос: можно ли начать восьмикласснику его читать?

admin аватар

Странная постановка вопроса

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

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

Простите, неправильно объяснился

Простите, неправильно объяснился; я (восьмиклассник) смог поставить linux. Сижу на нем уже как 3 месяца, но со стороны родителей и друзей идет некое "давление", мол в 21 веке нечего делать на Unix-системах ("скачай delphi и делай программы под windows, консольный интерфейс - никуда не годится"). Поэтому и был вопрос, можно ли начать изучение программирования с этих книг в этот период (может, еще рановато). Определенно, к книгам я вернусь; хотел узнать вашего мнения по этому поводу.

но со стороны

но со стороны родителей и друзей идет некое "давление"

Держитесь!

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

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

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

Вас понял,

Вас понял, спасибо за совет!

> Сижу на нем

> Сижу на нем уже как 3 месяца, но со стороны родителей и друзей идет некое "давление", мол в 21 веке нечего делать на Unix-системах

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

Отец (по

Отец (по профессии - инжинер) в юности делал программы на Delphi, говорит зарабатывал (сам я пока не преследую таких целей, да и опыта нет). По его мнению, бесплатный Linux никому не сдался, ведь большая часть сидит на винде; + по книгам программированию не учатся (бери язык и гугли проблемы).
Я знаю, что просто читать книги - бессмысленно, поэтому тренеруюсь;
В итоге, отцу не нравится интерфейс программы (а где нормальное ОКНО?).

<бери язык и

<бери язык и гугли проблемы>
С таким подходом будет специалист уровня "знаю, когда какие кнопки нажимать"

> ...бесплатный

> ...бесплатный Linux никому не сдался, ведь большая часть сидит на винде...

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

admin аватар

Кстати, the majority

Кстати, the majority is always wrong. Конкретно в применении к инфотехнологиям -- обсуждалось тут http://stolyarov.info/guestbook/archive/2#comment-1896 А так вообще рекомендую фразу "the majority is always wrong" забить в поисковик.

Хотя, конечно,

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

PS. Если что, это я оставлял ссылку на Юдковского тут два года назад. Надо бы уже зарегистрироваться, что ли...

admin аватар

Насчёт двух ног

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

Насчёт одежды

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

Мне кажется,

Мне кажется, что правило «Majority is always wrong» имеет исключения, то есть всё-таки не всегда большинство не право.

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

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

admin аватар

Вообще говоря,

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

Parthen аватар

И они в

И они в принципе правы. Если бы я плевал на общественные нормы, холодную погоду и грязные улицы, я бы ходил босиком.

admin аватар

Я вполне

Я вполне допускаю, что они правы.

"Допускаю, что

"Допускаю, что они правы" -- это не совсем тот вывод, который логически вытекает из тезиса "the majority is always wrong". Правильным выводом, если уж мы приняли этот тезис, будет то, что я или вы, находясь в том большинстве, которое носит обувь, заведомо и однозначно ошибаемся.

admin аватар

Мне почему-то

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

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

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

Да и на DVORAK я не

Да и на DVORAK я не перешёл и вряд ли перейду, это же не один месяц переучиваться надо.

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

Parthen аватар

Меня даже

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

Мозги -- очень

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

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

Меня даже больше не переход пугает, а то, что на остальных компах не моя раскладка будет.

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

admin аватар

Это, как ни

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

Я на colemak'е

Я на colemak'е печатаю вслепую touch typing'ом. А на qwerty беспорядочно и подгядывая иногда на клавиатуру. На qwerty, конечно, получается медленнее. Но всё равно быстрее среднестатистического пользователя, печатающего двумя с половиной пальцами. И да, раскладки у меня в голове не путаются, и друг другу не мешают, лежат отдельно друг от друга.

majority is always wrong

“Whenever you find yourself on the side of the majority, it is time to reform (or pause and reflect).”
― Mark Twain

Parthen аватар

Интересно

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

admin аватар

Ага, конечно

Действительность устроена с точностью до наоборот; если что, программисты, умеющие *nix, ценятся раза в три выше чисто по размеру зарплаты, для дельфиста сейчас 100тыр потолок, а когда в резюме имеет место, например, сочетание Linux, C++ и Qt, это запросто может быть и 350, и выше (лично я Qt люто ненавижу, как и всех монстров, но реальности это не меняет). Принципиальная разница между такими людьми в том, что вот этот вот спец по Linux, C++ и Qt, если припрёт, за дельфи сядет и всё, что надо, сваяет, потратив от силы пару дней на "освоиться", а вот в обратную сторону переход, как мы понимаем, практически нереален.

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

За вас вашу жизнь никто не проживёт, стройте её сами.

admin аватар

А, ну тогда

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

Что до интерфейсов — то это как раз графические интерфейсы никуда не годятся, и в книге написано, почему. На всякий случай добавлю, что видел своими глазами, как людей брали на работу на неплохие (для них на тот момент) деньги только лишь за то, что они могли справиться с командной строкой. Человек, знающий *nix-системы и умеющий с ними обращаться, справится с чем угодно, а вот люди, уверенные, что "знают" Windows, очень часто не могут справиться и с Windows тоже, про другие системы и говорить нечего. А от Unix на самом деле сейчас совершенно некуда деваться, серверные машины, обслуживающие Интернет — это практически всегда тот или иной Unix, и когда персонаж, позиционирующий себя как "крутой айтишник", приходит в ужас и впадает в ступор от необходимости что-то сделать удалённо с серверной машиной — это было бы смешно, когда бы не было так грустно.

Так что могу только пожелать успехов. Будут вопросы — заходите сюда и задавайте :-)

Куда выкладывать программы

Снова я. Хотел уточнить, куда именно можно выкладывать свои работы (исходный код + откомпилированная программа)? Может какой сайт для этого есть?
Github? Или пока в облачном хранилище (по типу Google disk) размещать, потом кому-нибудь скинуть на него ссылку?

admin аватар

А с какой целью

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

По поводу Google Drive, Yandex Disk и прочих подобных "файлопомоек" — ну кто как, а лично я на них принципиально не хожу. Google Drive у меня вообще заблокирован на домашнем роутере вместе с Google Docs, чтобы не попасть туда даже случайно.

Понял, спасибо)

Понял, спасибо)

А чем в этом

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

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

диск с линуксом

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

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

А чуть позже в местном гнезде линуксоидов (они гнездились на центральном узле телефонной связи тогда у нас) мне "нарезали" (записали на CD, согласно тогдашнему жаргону) очередную свежую версию дебиана. А я в благодарность поставил им литровую пачку сока, по фидошной традиции.

А ещё позже, вроде бы, убунту рассылали по почте тоже безвозмездно, то есть даром.

Parthen аватар

>мануал на

>мануал на русском
"Это все фигня на самом деле" (с)
Я, десятиклассник возился с арчем и несчастной его вики, но вечно возникает проблема отсутствия опыта ПК, когда ты в принципе не знаешь некоторых элементарных знаний о ПК.
И таки да, научился я по роликам на ютубе, смотря как другие делают, а к вики обращался только для уточнения.
Вообще, имхо, идеальный способ -- поставить Devuan (netinstall) без DE, поставить иксы, i3wm и терминальчик по вкусу. Это все крайне просто, при этом не ставится ничего лишнего.

Вообще, имхо,

Вообще, имхо, идеальный способ -- поставить Devuan (netinstall) без DE, поставить иксы, i3wm и терминальчик по вкусу. Это все крайне просто, при этом не ставится ничего лишнего.

-------------------------------------------------------

Самому начинающему ничего более Минта/Убунту/MX Linux, например, не надо для создания соответствуюущей операционной среды, чтоб изучать программирование по книгам уважаемого автора сайта! На первых шагах пугать людей не надо!

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

Parthen аватар

>Самому

>Самому начинающему ничего более Минта/Убунту/MX Linux, например, не надо для создания соответствуюущей операционной среды, чтоб изучать программирование по книгам уважаемого автора сайта! На первых шагах пугать людей не надо!
Да я не спорю, но потом-то надо привыкать к нормальному.

>Да я не спорю,

>Да я не спорю, но потом-то надо привыкать к нормальному.

Ну это уже будет зависить от каждого конкретного человек.

Slackware

Начинающему наоборот лучше поставить побольше всего, чтобы было что изучать. Я бы предложил full install Slackware, тем более что как раз 15-й релиз заморозили.

А там есть несколько DE и оконных менеджеров на выбор.

admin аватар

Когда-то очень

Когда-то очень давно, в 1994 году, Slackware стала моей первой Linux-дистрибуцией (да, блин, ставил с дискет! да!) Но тогда и железо было попроще, и в соседней лабе присутствовал линуксовый гуру, периодически выдававший мне пинка в нужном направлении. Сейчас, я бы сказал, Slackware — это по-прежнему один из лучших дистров, но всё-таки не для новичка, да ещё восьмиклассника.

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

> А выбор из

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

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

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

Ну да, гуру не помешает на первых порах. Но насчёт железа — оно конечно было попроще, но установка и настройка железа была сложнее. Сейчас например иксы в 95% случаев просто запустятся в нужном разрешении и с 3D-ускорением по команде startx без всяких modeline-в в xorg.conf. Никаких IRQ не нужно настраивать (а я даже толком не знаю что это такое), всё автоматом.

> но всё-таки не для новичка, да ещё восьмиклассника.

Ну не знаю. Не сложнее Debian с netinstall, а на мой взгляд даже намного проще. Единственная сложность — разметка диска, но она в любом дистрибутиве есть. На мой взгляд, размечать диск отдельно от установки с помощью fdisk, cfdisk или parted куда удобнее.

Ну и да, надо по-английски уметь читать.

admin аватар

"Специально

"Специально ставить" — это обычно одна команда.

Вообще если уж залезли так глубоко, попробуйте сразу сползти с systemd, эта штука мертворожденная и неизбежно в какой-то момент начинает жутко мешать. Если уже более-менее освоились с Debian, попробуйте вместо него Devuan взгромоздить — всё то же самое, только никакого systemd. Ну а если уже сидите на Slackware, то на ней и оставайтесь, лучше, пожалуй, сейчас мало что есть.

Slackware

Подозреваю, что лучше нет вообще ничего. По крайней мере, когда я пробовал Debian (до перехода на systemd), он был хуже. Там например сегфолтилась графическая фигня из гнома для настройки Wi-Fi, тогда как в Slackware Wi-Fi настраивался через прямое редактирование /etc/wpa_supplicant.conf и там было просто нечему сегфолтиться. Потом поставил Ubuntu 10.04 и она оказалась стабильнее чем дебиан, ничего не падало, не смотря на те же примерно версии софта. Инсталлятор дебиана тоже какой-то кривой и неудобный.

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

install-system --root /dev/sda1 --root-size 12G --swap /dev/sda2 --swap-size 2G --home /dev/sda3 --filesystem /tmp --filesystem-size 1G --filesystem-type tmpfs --install full --save-log /root/install.log && reboot

И уходишь пить чай, например, а когда возвращаешься — всё уже установлено, перезагружено, и можно работать в уже установленной системе. Размер /home не указан, значит он займёт всё свободное место после swap-раздела.

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

Slackware правда этому идеалу не очень соответствует в плане установщика, но подобный установщик я видел только у CRUX, а там свои проблемы. главным образом в том что мейнтенеров и пакетов мало и почти весь софт нужно собирать, вникая в детали сборки из исходников. А так он бы был лучше чем Slackware. А у всяких kiss-дистров проблемы те же — пакетов мало.

admin аватар

Я вот одного не

Я вот одного не понял, а кто вам мешает в дебиане снести ко всем чертям NetworkManager и редактировать /etc/wpa_supplicant.conf руками? Я, в общем, так и делаю, с той разницей, что у меня Devuan.

admin аватар

А чёрт знает,

А чёрт знает, может, и ничем не отличается. Я не так много общаюсь с восьмиклассниками.

том 1, 416-417

Довольно короткий код разорван на две страницы. Это не очень красиво.

admin аватар

При имеющемся

При имеющемся объёме книги выловить все подобные ситуации нереально. Окружение verbatim — штука особая и всяким clubpenalty/widowpenalty не подчиняется.

rust

Очень интересно узнать мнение автора о ЯП rust. Стоит ли на него время тратить или C++ он не заменит?

admin аватар

Ничего он не

Ничего он не заменит и вообще ни на что не годен, только мозги изуродуете.

Rust вроде сейчас

Rust вроде сейчас активно продвигают и даже внедряют как ЯП для разработки ядра Linux наряду с C?

admin аватар

Не "продвигают",

Не "продвигают", а конкретно гугл продвигает. Одновременно прогрессивная общественность гадает, чего это Торвальдс молчит и сколько ему за это заплатили, и готовится отступать на заранее подготовленные позиции в виде BSD-систем. Поскольку ядро Linux после внедрения туда раста станет тоже ни на что не годно.

Что-то сдаётся мне, зря вы на мой сайт забрели, в интернете много других сайтов.

Том 1, страница

Том 1, страница 191
> Рассмотрим теперь функцию g(n)=f_n(n) + 1. Ясно, что в любом разумном смысле такая функция вычислима

А вот не ясно. То есть, +1-то конечно вычислимо, но мы тут используем ещё одну операцию — индексацию, то есть выбор функции из множества вычислимых функций по её номеру.

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

Если же мы возьмём дырявую индексацию, которая точно вычислима (например каждый алгоритм представим в виде 256-ричного числа, соответствующего байтам его записи в UTF-8), то далеко не всякому натуральному числу будет соответствовать осмысленный алгоритм, поскольку мы нумеруем все возможные последовательности байт, соответственно для многих n, посчитать g(n) будет невозможно, поскольку мы как правило не сможем скомпилировать какие-то случайные байты.

То есть, даже если все f_n вычислимы и их множество счётное, g() не вычислимо, и не входит в последовательность f_n. То есть не вижу никакого противоречия.

admin аватар

Никаких

Никаких "дырявых индексаций". Я вообще в этой области не бог весть какой спец, но множество алгоритмов относится не просто к счётным, а к рекурсивно перечислимым, что заведомо означает разрешимость задачи о вычислении номера заданного алгоритма — в смысле, существует такое ВЗАИМНО ОДНОЗНАЧНОЕ (!) соответствие между натуральными числами и алгоритмами, что по любому алгоритму можно установить его номер. Например, тупо запустив ту "рекурсивную перечислялку", из-за которой алгоритмы рекурсивно перечислимы, и дождаться, пока она выплюнет нужный алгоритм, одновременно пересчитав все, которые она успеет выплюнуть до него. Ждать, конечно, придётся долго, но в ЭТОЙ части теории "долго ждать" никого не смущает.

Про перечислимые множества, например, тут:

https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B8%D1%81...

UPD: пардон, вы про функции, я про алгоритмы — но сути это не меняет, вычислимые функции тоже рекурсивно перечислимы.

Вычислимые функции

> но сути это не меняет, вычислимые функции тоже рекурсивно перечислимы.

Вычислимые функции в определении (которое вы пытаетесь опровергнуть) должны быть определены на любом аргументе принадлежащем N.

А вот насчёт того что можно перечислить все такие функцию по порядку — вот тут мне кажется, что не выйдет. Множество-то их счётное, но как вы их проиндексируете? Именно функции, определенные на всём множестве N и при этом вычислимые.

Пример функции которую будет трудно проиндексировать — функция first_twin(n), возвращающая первое число из n-ой пары простых чисел близнецов. До сих пор математики не знают, конечно количество близнецов или бесконечно, значит мы не знаем, входит ли эта функция в нашу последовательность {f_n}. Например, модифицированное решето Эратосфена, которое отсеивает не-близнецов может на каком-то n зависнуть, если окажется, что близнецов больше нет.

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

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

То есть, ваша g() действительно невычислима, и +1 тут непричём.

admin аватар

Вообще, ещё раз

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

Кратко говоря, что такое вычислимые функции — неизвестно, но есть тезис Чёрча, предполагающий, что класс вычислимых совпадает с классом частично рекурсивных, а эти последние строятся через суперпозицию нескольких крайне простых операций и операторов (операторы в данном случае из одних функций делают другие). Поскольку базовых операций там меньше чем пальцев на руках (впрочем, это пофигу, достаточно того факта, что их конечное число), очевидным образом можно выстроить дерево всех возможных Ч/Р-функций и в этом дереве ввести некую нумерацию, а дальше запустить алгоритм, который это дерево будет обходить и, зайдя в очередную вершину, выплёвывать соответствующую формулу. Это ваше "индексирование" на базе такого алгоритма строится очевидным образом: функцию по номеру получаем, запустив алгоритм и проигнорировав первые N функций, а обратную операцию -- номер по функции (!) -- получаем, запустив алгоритм и дождавшись, пока он выплюнет нужную функцию. Ещё раз: да, практического смысла эти построения не имеют, поскольку для любой мало-мальски интересной с практической точки зрения функции ждать придётся, вероятно, не один миллион лет, но здесь (в теории вычислимости) такие мелочи никого не беспокоят. Так вот, точно так же будет обстоять дело и с гипотетической последовательностью всюду определённых функций, которые хочется "подставить" вместо Ч/Р в роли модели вычислимой функции, чтобы не было всей этой "фигни" с частичной неопределённостью: если мы что-то конструктивно делаем, то у нас есть вычислитель, на котором мы это делаем, а у него -- базовый набор операций, далее см. выше.

Кстати, чего я с ходу не знаю — так это как соотносится класс примитивно-рекурсивных функций к классом функций всюду определённых. Это к специалистам.

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

Кажется понял

Кажется понял.

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

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

Чем-то это мне теорему Гёделя напоминает. Вроде как система аксиом не может быть одновременно полна и непротиворечива.

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

Машина Тьюринга и вычислимость

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

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

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

> очевидным образом можно выстроить дерево всех возможных Ч/Р-функций и в этом дереве ввести некую нумерацию

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

То есть, вашему алгоритму нужно добавить проверку: если функция определена на всём множестве N, значит добавить её в индекс, а если есть натуральные числа, для которых она не определена — не добавлять. Так?

Вот с этой проверкой как раз у меня и затык — а не будет ли она эквивалентна той самой программе, S( ) из проблемы останова?

>Так вот, точно так же будет обстоять дело и с гипотетической последовательностью всюду определённых функций, которые хочется "подставить" вместо Ч/Р в роли модели вычислимой функции, чтобы не было всей этой "фигни" с частичной неопределённостью: если мы что-то конструктивно делаем, то у нас есть вычислитель, на котором мы это делаем, а у него -- базовый набор операций, далее см. выше.

Выше-то понятно всё. А вот это — нет. С чего вы взяли, что вычислитель, который позволяет вычислить все те и только те Ч/Р функции, которые определены на всём N в принципе можно конструктивно описать?

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

Надеюсь, теперь понятнее стало, в каком конкретно месте затык?

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

На самом деле не настолько. Как писать программы мне вроде и без этого понятно.

Или всё-таки надо разбираться? Насколько это важно?

----

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

Предположим у нас уже расставлено (k-1) объектов и мы добавляем k-й. Добавить его можно перед первым элементом (в самое начало), перед вторым, перед третьим, перед (k-1)-м и после (k-1)-го, то есть всего k возможных позиций. И каждую эту позицию можно применить к любой перестановке (k-1) элементов, то есть k!=k*(k-1)!. Ну а один объект, понятное дело, можно расставить только одним способом.

admin аватар

Вообще я весь

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

То есть, вашему алгоритму нужно добавить проверку: если функция определена на всём множестве N, значит добавить её в индекс, а если есть натуральные числа, для которых она не определена — не добавлять. Так?

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

Вот с этой проверкой как раз у меня и затык — а не будет ли она эквивалентна той самой программе, S( ) из проблемы останова?

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

С чего вы взяли, что вычислитель, который позволяет вычислить все те и только те Ч/Р функции, которые определены на всём N в принципе можно конструктивно описать?

Вроде как раз и доказывается, что нельзя.

По ссылке или значению?

Здравствуйте, читая 145 страницу третьего тома (о переопределении операции присваивания), наткнулся на примеры для класса Complex.

Здесь в параметрах метода вы используете константную ссылку для операнда:


  1 class Complex {
  2     // ...
  3     const Complex& operator=(const Complex& c) 
  4         { re = c.re; im = c.im; return *this; }
  5     const Complex& operator+=(const Complex& c)
  6         { re += c.re; im += c.im; return *this; }
  7     // ...
  8 } 

На этой же странице, ниже, вы уточняете, что то же (переопределение) можно сделать и с операциями для других типов:


  1 class Complex {
  2     // ...
  3     void operator=(double x) { re = x; im = 0; }
  4     // ...
  5 }   

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

admin аватар

Здесь стоит

Здесь стоит применить здравый смысл. Если примерно прикинуть, как всё это работает на уровне машинных команд (а именно для этого в первом томе имеется часть про программирование на языке ассемблера) и не забывать, что ссылка — это вовсе не пустое место, а аж целый адрес, то можно заметить, что накладные расходы даже на копирование 16-байтной структуры (то есть всего объекта типа Complex) могут оказаться меньше, чем косвенные обращения по адресу (в данном случае по ссылке) внутри тела функции. Что касается типа double, то на современных (читай — 64-битных) машинах он и вовсе занимает столько же места, сколько адрес, так что экономии не будет вообще никакой, при этом потери на передаче по ссылке — будут. Кроме того, стоит учесть, что компилятор эти методы, естественно, заинлайнит, и прикинуть, что и как с этим сможет сделать оптимизатор; ощущение такое, что при передаче double по значению в итоговом коде вообще получится один mov, тогда как по ссылке — может, и получится, но не факт; я не проверял, просто понимаю, что такая оптимизация сложнее.

В случае

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

Уточнение по практике на языке assembler'a (NASM)

Читаю первый том, часть по языку assembler. На странице 656 сказано, что программы для практического применения лучше писать на языке Си. Есть ли смысл писать большие программы (такие как "Задача о ханойской башне", "Сопоставление с образцом") на NASM? Или достаточно посмотреть как работает та или иная команда и потом перейти ко второму тому?

admin аватар

Минуточку, это

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

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

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

Применение термина "память"

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

Во втором издании на странице 281 есть сноска под номером 6. В ней обсуждается противоречивость использования термина "память" в тексте выше. Непосредственно в тексте сноски утверждается, что памятью следует называть лишь те ЗУ, с которыми ЦП может работать "через шину без применения контроллеров".

Однако, насколько мне известно, с любым ЗУ ЦП общается именно через контроллер, и device path любого диска на шине на самом деле - путь до контроллера этого устройства. Наоборот, контроллеры могут общаться без процессора, если поддерживают DMA :)

Буду рад получить Ваш ответ и огромное спасибо за книги.

admin аватар

> с любым ЗУ ЦП

> противоречивость

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

> с любым ЗУ ЦП общается именно через контроллер,

Плюньте в глаза тому, кто вам сказал такую ахинею. Оперативная память, она же "оперативное запоминающее устройство", т.е. ОЗУ, по-английски RAM (random access memory) — разумеется, никаких контроллеров не требует и не может их требовать. ПЗУ, собственно говоря, тоже (процессор их вообще обычно не различает).

> device path

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

> любого диска на шине

Ещё раз, и медленно: диски — не память. Сноска, собственно говоря, об этом.

Почему я об этом вообще заговорил

Разработка аппаратуры процессора идет обычно по двум направлениям - собственно, ядро (core) и все остальное (uncore, общепринятый профессиональный сленг, если позволите). Я даже перепроверил: по запросу вроде "chip die layout of a cpu" можно посмотреть "планировку" кристалла процессора. И на этой планировке почти всегда будут ядро/ядра, система кэшей и периферийный блок.

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

P.S.
"Противоречивость" - не совсем подходящее слово, согласен

admin аватар

Если под

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

Внутреннее устройство процессора, тем паче многоядерного, в книге не рассматривается.

Влезу, с вашего

Влезу, с вашего позволения. Всё же без контроллера вообще голое процессорное ядро может работать только со статической памятью, как в старых компьютерах вроде Спектрума или какой-нибудь Амиги. То есть вот, натурально, микросхема с памятью на статических регистрах, организованной в виде одномерного массива, индексируемого числом, заданным на шине адреса. Хотим читать или писать - дергаем один из двух стробов, в ответ на это микросхема либо считывает значение с шины данных, либо выдаёт. Шины процессора и памяти соединяются напрямую, без посредников. В динамической же памяти, как минимум, адресное пространство нелинейное, требуется выставлять на шине адреса сначала индекс банка и строки в нем, делать строку активной, затем выставлять индекс столбца, периодически обновлять содержимое, т.к. ячейки постепенно теряют заряд, при этом запрещать доступ к памяти либо переключать банк, засылать в микросхему служебные команды типа PRECHARGE или REFRESH, etc. Это уж точно не забота ядра, у него шины адреса и данных в "классическом" смысле, которые подключается именно к контроллеру, преобразующему запросы к себе как к памяти в команды оперативке и выдающему в обратную сторону данные (опять же, ядро вообще не при делах, для него это работа со статической памятью - выставили адрес, прочитали/записали). Другое дело, что это контроллер специфический и шина, на которой он сидит, за пределы кристалла не выходит. Но, конечно, если строго ограничить определение контроллера по принципу "не висит на общей шине и не плюётся в порты - не контроллер", то да, можем считать, что работа с памятью идёт напрямую.

admin аватар

Сказанного

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

1) тонкости взаимодействия процессора с памятью, как и внутреннее устройство процессора, в книге не рассматриваются вообще;

2) не следует смешивать терминологию из разных предметных областей.

У топик-стартера, если вы не заметили, в голове полнейший бардак, он к ОЗУ пытается device path применить, а вы тут про какое-то там ядро (процессора, гм...)

Сказанного

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

Почему Tcl?

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

В третьем томе есть раздел о Tcl. Я пытался найти в вашей книге объяснение, почему именно он, а не Python, Perl? Какие у него есть преимущества?

admin аватар

Python, Perl, Ruby, даже

Python, Perl, Ruby, даже Lua (хотя, возможно, в меньшей степени) — это безобразно раздутые монстры, напрочь лишённые внутренней логики, и, самое главное, сделанные без понимания границ скриптового программирования.

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

Кстати, об этом в книжке написано — в части, посвящённой скриптингу.

shell

том 1 стр 81 конструкция с фигурными скобками не работает

 
[ "$1" = "" ] && { echo "No dir name" ; exit 1 }

работает с круглыми скобками

[ "$1" == "" ] && ( echo "No dir name" ; exit 1 )

П.С. Сравнение лучше делать двумя знаками равно ==, один знак равно это присваивание.

admin аватар

Для начала не

Для начала не надо путать скрипты на shell'е с Си и его наследниками, это совершенно разные языки; аналога сишной "операции присваивания" в скриптовых языках нет, так что знак равенства использовать можно и нужно (а двойное равенство в команде test поддерживается только для тех, у кого Си выжжен прямо на коре головного мозга).

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

 
[ "$1" = "" ] && { echo "No dir name" ; exit 1 ; }

С круглыми, кстати, работать не будет — точнее, синтаксически оно корректно, но скрипт не завершит, поскольку круглые скобки — это subshell, вот его exit и завалит, а родитель (сам скрипт) останется.

sparse_t.cpp

Здравствуйте. В примере программы шаблона класса разреженного массива, переопределенные операторы инкремента оставлены "не шаблонными", то есть в строках 121-122 и 131-132:

int& location = Provide();
int res = ++location;

вместо "T" оставлен "int". Это сделано намеренно? Я понимаю, что для некоторых типов операция инкремента может быть не определена, но из-за этого программа не компилируется даже при использовании операции инкремента с инстанцированым типом double.

admin аватар

Вот не везёт же

Вот не везёт же этому примеру, а...

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

UPD: Выложил архив примеров с исправленным sparse_t.cpp. К счастью, в книжках (что в этой, что во "Введении в Си++") методы этого шаблона в тексте не воспроизводятся.

Про неизменяемые указатели

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

#define PERIPH_REG *((volatile uint32_t *)(0xDEADBEEF))

и некоторые тащат в свой код подобные вещи. Но, например, возникает задача подключения к микроконтроллеру чего-либо с большим количеством ног - скажем, нескольких разрядов семисегментного индикатора без специализированного драйвера или внешней памяти (хотя для памяти, конечно, лучше взять специально заточенный под это дело контроллер). Хардкодить работу с индикатором, естественно, не с руки - завтра может понадобиться увеличить число разрядов или перейти с общего катода на общий анод. Разумнее использовать т.н. "виртуальные порты". Линия GPIO представляется в виде структуры с двумя полями - адресом регистра, запись в который приведет к изменению уровня на лапке МК, и собственно номера бита в регистре, за нее отвечающего. Порт - массив таких структур. Линии в ходе эксплуатации меняться не будут, поэтому логично снабдить указатели в этих структурах модификатором const и проинициализировать сразу в описании, т.е. получается конструкция в стиле (код под 32-битный контроллер, не пугайтесь)

typedef struct vport_line_td {
    volatile uint32_t * const port;
    const uint32_t line_number;
} vport_line;

typedef struct vport_td {
    vport_line * const lines;
    const uint32_t width;
} vport;

А где-то в пользовательском коде крутятся

    void vport_write(vport *p, uint32_t data);
    uint32_t vport_read(vport *p);

, "растаскивающие" или, наоборот, собирающие data по линиям порта.
Конечно, по памяти и скорости работы такой способ несколько проигрывает "захардкоженной" работе с линиями GPIO, но гораздо более гибкий: тот же семисегментник - это один восьмибитный порт на сегменты и один на общие линии разрядов; завтра нужно поменять схему его подключения - переписали инициализатор в одном месте. Если говорить об ARM Cortex-M, например (а это "сердце" подавляющего большинства современных контроллеров), то gcc-шный компилятор такие "константы" кладет во флеш-память без посторонней помощи (в отличие от AVR, кстати, но кому они сейчас впились где приходится извращаться с макросами из pgmspace.h); в оперативке они не хранятся, а пожертвовать сотней байт во флешке уже на контроллере с 8+ КБ ПЗУ ради удобства вполне можно.

Не вполне

Не вполне понятно, почему не сделать "иначе":

typedef struct vport_line_td {
    volatile uint32_t * port;
    uint32_t line_number;
} vport_line;

typedef struct vport_td {
    const vport_line * lines;
    uint32_t width;
} vport;

void vport_write(const vport *p, uint32_t data);
uint32_t vport_read(const vport *p);

Так никто,

Так никто, вроде, не запрещал, делайте "иначе" на здоровье, оба варианта вполне валидны. Другой вопрос, что адрес MMIO принципиально неизменяем, и в первом случае это его свойство явно закреплено за соответствующим типом; во втором - просто указан адрес области памяти, ответственность за неизменяемость которого где-то и когда-то возьмёт на себя какой-то код. Ну да о вкусах не спорят. Вот чего точно первому варианту не хватает, так это const vport в заголовках функций - "порты" по-любому будут описаны с const, и компилятор ругнется, что функции снимают этот модификатор. Здесь косяк, согласен, но пример был не о функциях.

Любое

Любое использование const это именно что "где-то и кто-то что-то имел в виду", а "принципиально неизменными" можно считать разве что константы в enum. Отбросив полемику, пожалуй, остаются стилевые предпочтения: лично мне описание "неизменяемой" области памяти вида const vport_line[] vport_name = { ... }; кажется более... идиоматичным?

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

admin аватар

> кажется

> кажется более... идиоматичным?

ну кому как, мне оно кажется синтаксической ошибкой

Ёлки-палки const

Ёлки-палки const vport_line vport_name[] = { ... };

admin аватар

Супер, спасибо :-)

Получил эстетическое наслаждение :-)

Может ли мое

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

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

Область

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

admin аватар

В такой

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

admin аватар

Может-может.

Может-может. Увы.

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

Редактор

Здравствуйте, Я начал постигать emacs и уже более менее в нем ориентироваться, а потом начал читать вас и думаю, есть ли смысл пересаживаться на vim? Либо же вообще spacevim, у меня знакомый говорит, что выучи горячие клавиши емакса и потом можешь их в любую ide перенести и горя не знать

admin аватар

На вкус и цвет...

... все фломастеры разные.

Вот IDE лучше вообще не применять, ибо гадость. А vim или emacs — вопрос скорее религиозный :-)

Есть только один момент. Нужно уметь хотя бы базовые вещи делать в классическом vi (не в vim'е). Рано или поздно вы столкнётесь с ситуацией удалённого доступа к системе, в которой ничего другого не окажется, и лучше, если это не приведёт к полной беспомощности.

Вообще, в vi

Вообще, в vi который в busybox достаточно помнить в начале нажать i, а в конце Esc, :wq и всё. А в режиме редактирования работают стрелки и бекспейс, так что всё точно так же как в nano или notepad-е.

admin аватар

реализации разные бывают

В этой версии так, да. А в классическом vi, например, удалить backspace'ом можно только то, что введено в ходе последней операции ввода (то есть после нажатия того самого i, или a, или o, или O).

Том1 старой ревизии

Здравствуйте Андрей Викторович, я где то в середине первого тома уже нахожусь, по сути почти в самом начале практики, недалеко ушел, занимаюсь в свободное время после дел и работы, пытаюсь перейти в линукс, очень больно конечно иногда, особенно при установке свежих версий пакетов некомпилированных версий программ в деб пакеты и без баш скрипта инсталл и тд, прям вызывает боль и ступор иногда, с пакетом fpc 3.2.0 с оф сайта например были трудности, в репозитории убунту была версия но только старая, а у новой не поймешь толи установилась, толи нет, но компиляцию из командной строки не делала, может не туда установилась куда нужно было, потом что то нагуглил и установил из фтп какого то командой и ручной простановкой папок и пути вроде, короче пока очень больно в линукс. Учу команды сд рм пердж лс судо эко и тд, распечатал листов чит шитов с командами чтобы иногда поглядывать, чуток еле еле узнал про настройки vimrc и выбрал прекрасную тему с гитхаба, добавил нумерацию строк и тд. Убунту выбрал англ версию естественно, может поэтому мне чуть чуть сложнее чем на русской, технический англ где то около 0 уровня, чисто кино и общаться могу. Все это печатал слепым набором(пока в процессе изучения тоже, правый мизинец плачет иногда), относительно медленно правда, но я стараюсь, почему то у меня на ноутбуке не работает в убунту прямая черта которая у вас в примере была про ввод и вывод данных когда перенаправляли ввод на текстовый файл кажется, у меня она чуток наклонена почему то вправо, а так | в виндовс красивая прямая черта, в линукс как с наклоном, так и не исправил эту уродину. Еще пока что не очень верится вам про супер дружелюбность линукс систем и удобство =)) где то в ютуб прочитал фразу - Линукс это очень дружелюбная юзер-френдли система, просто она очень тщательно выбирает себе друзей, думаю эту фразу можно было бы добавить в вашу книгу, смеялся аж с нее. Ну это вводные данные были, да и просто поделиться с другими читателями вашего сайта, теперь
begin
Заметил что вы новые издания книг выпустили, а я дурак скачал старую еще до выпуска новых или не заметил в тот раз, даже не знаю теперь, хочу спросить совет что делать, ну и про отличие первой версии тома 1 от переиздания, я читал давно о ваших планах про переиздание мол вы совершили ошибку создавая сишность мозга что то такое, но по идее язык си же во втором томе появится, если новый том лучше, то перечитаю, просто хотелось бы узнать у автора, ну и заодно сказать спасибо вам за пинок в сторону линукс(хоть я пока и не согласен с тем что он дофига удобный), все таки учитывая то, что все сервера на нем, знать его на базовом уровне все таки обязательно. Ну и отдельное спасибо за референсы в книге !!! Очень юзер френдли кстати, например если вы тут не поняли то шуруйте в параграф № x.y. и перечитайте. Ну и если я закончу первый том 1 издания, то переходить на второй том 1 издания или уже второго свежего издания, не потеряю ли связь?

Терпение, только терпение!

Я тоже в свое время переполз на Линукс с Виндовс. По своему опыту могу сказать, что Линукс (лично для меня) - в разы проще чем Виндовс. И дружелюбнее.

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

По поводу команд в Линукс, название каждой команды (она же - утилита Линукс) расшифровывается. Ну, например, cd - change directory, cp - copy и.т.д. Мне, на первых порах, это помогало их проще запомнить. Да и сегодня помогает! А еще есть такая утитила apropos: советую освоить ее, и тогда проблем с командами в Линукс у Вас будет меньше.

А по поводу вот этой | черты, у меня на Линукс с ней никогда не было проблем. Я устанавливал и пробовал зарличные Линукс дистртибутивы, но вот этой проблемы не имел.

На последок могу посоветовать пару книг по Линукс. Для фундаментов мне не плохой кажется книга Пола Коббаута "Фундаментальные основы Linux": она доступна бесплатно и на английском, и на русском языках. Кроме нее, если вы используете систему с пакетами формата .deb, также бесплатно доступна книга "Настольная книга администаратора Debian": ее перевод правда выполнен не полностью, но тем не менее читать можно.

admin аватар

Бросьте нафиг

Бросьте нафиг старую редакцию, скачайте новую и читайте с того места, где остановились в старой. Естественно, новая намного лучше и правильнее.

А что до линукса и "user friendly", так не, Linux не дружит с пользователем. Linux подчиняется пользователю. И проявляет практически 100% лояльность к пользователю. Ну, конкретно для случая Убунты, может, не 100%, но близко.

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

Иногда бывает,

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

admin аватар

Вроде ничего не

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

Пробелы в конце строк в stud_io_inc

В stud_io_inc, доступном по ссылке на этой странице, присутствуют пробельные символы в конце некоторых строк

$ curl -s http://www.stolyarov.info/books/extra/stud_io_inc | grep -c '\s$'
4

admin аватар

Спасибо

Вот чёрт, в архиве примеров поправил, а про эту копию забыл. Исправлено.

хочу учиться

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

admin аватар

Да, именно для

Да, именно для таких и предназначены.

Что до советов, то их, пожалуй, дам два: (1) прочитайте в первом томе "напутственное" предисловие (стр.39--43) и (2) установите Linux и переползите на него со всеми делами, которые вы делаете с помощью компьютера.

А 39 летнему с

А 39 летнему с нуля есть ли смысл их прочитать? Хотелось бы переучится на программиста.

admin аватар

Будет тяжело.

Будет тяжело. Но может и получиться, почему нет.

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

Почитаю Ваши

Почитаю Ваши книги,хоте меня отговаривали,время зря в свои года теряешь.Лучше,мол переходить на C++ с нуля,есть хорошие учебники.Но мое мнение,полезно и эти книги почитать,потом дополнительно поизучать язык C и потом переходить на C++ изучать,ну не один год уйдет,за то интересно для меня.Не знаю появился интерес в 40 лет к этой области,каждый день думаю об этом.Пыталмя сразу начинать с C++,но наверное не верно,надо именно с начинать с Ваших учебников.Образования у меня нет в этой области,а интерес есть.

admin аватар

Вот если

Вот если пытаться начать с Си++, то точно ничего не выйдет, это я вам гарантирую. Причём в любом возрасте.

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

А что делать тем, у кого уже есть опыт программирования?

> К Си можно притрагиваться не раньше, чем у ваших программ на Паскале появятся сторонние пользователи

В моём случае не получится. Я уже успел пописать и на паскале в школе, на C в институте, хотя там был странный гибрид с С++, причём из последнего только cout, cin и строчные комменты. Там же был курс по ассемблеру, только почему-то преподавался он на фигне, встроенной в трупный паскаль. То есть чтение данных с клавиатуры и вывод были на паскале, а алгоритм их обработки на асме.

А вот с последнего мой переход на линукс и начался. Но у меня это всё оставляло чувство неправильности. Если уж программа на ассемблере, то она вся должна быть на нём. После пары работающих hello world-ов на DOS мне захотелось написать что-нибудь на уровне голого железа, для чего нужно было после каждой пересборки записать нулевой и несколько следующих секторов на дискету, а потом перезагрузиться. Программы для этого под Windows я не нашел, но, так как интересовался другими системами, из купленной мной криво переведённой книги "юникс для чайников", я знал что там есть dd для записи произвольных секторов диска.

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

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

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

В общем, я уже не могу начать с паскаля и не трогать C, потому что уже трогал.

admin аватар

Другие

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

нет.

один преподаватель даже заплатил мне деньги за написание программы для его диссертации. Но программа там тоже уровня хелловорда.

это тоже не то.

В общем, я уже не могу начать с паскаля и не трогать C, потому что уже трогал.

И что? :-) Паскаль-то вы трогали раньше, чем Си, и определённое эстетическое чутьё у вас есть, вон вкрапления ассемблера в Паскаль вам не понравились (и это совершенно правильно, ибо нефиг).

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

Так что

Так что получается,уже не стоит даже начинать.

admin аватар

Почему не

Почему не стоит-то? Что жизнь после сорока есть — это вы уже и сами на своём опыте знаете, а я вам ещё могу сказать (на моём опыте), что она есть даже после сорока шести :-)

Спасибо

Спасибо большое за ответы,я просто начал раньше читать Вашу книгу 1-й том,установил Линукс.Отговорили,говорили чтобы быстрее в эту область войти,мол не нужно тебе это,сразу изучай C++.Послушал и закинул,в итоге не тут,не там,как говорят).

admin аватар

Ну да, добрые

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

В общем

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

Что делать

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

admin аватар

Ну так пишите

Ну так пишите не то, что актуально, а то, что лично вам прикольно. Рано или поздно само собой получится что-то актуальное.

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

В задаче на

В задаче на странице 142 тома I точно ответ 340? У меня не получается этот ответ. Забавно, что с усложнённой версией у меня проблем нет.

admin аватар

стопудов (tm)

4+16+64+256 по-вашему сколько будет?

Линукс

Современный линуксовый GUI уже ни чем не уступает другим операционным системам, читая книги предполагается отказаться от GUI совсем и использовать консоль? В линксе тоже можно копировать файлы мышкой :)

admin аватар

> Современный

> Современный линуксовый GUI уже

"Уже"? Вообще-то лет двадцать как.

> ни чем не уступает другим операционным системам

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

> читая книги предполагается отказаться от GUI совсем и использовать консоль?

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

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

> В линксе тоже можно копировать файлы мышкой :)

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

Кстати, вы сайтом-то не ошиблись? Может, надо куда-нибудь в другое место пойти?

А вот на

А вот на андроиде я копирую и перемещаю файлы с помощью файлового менеджера. Хотя у меня там установлен терминал в приложениях. Зря?

admin аватар

Зря вы вообще

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

А так — когда нет клавиатуры, работа с терминалом превращается в пытку. Так что тут не вполне понятно, что зря, а что не зря.

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

А нафига нужна

А нафига нужна клавиатура для чтения электронных книг? Ну кроме двух боковых клавиш (по умолчанию громкости, но в книге они листают страницы).
Специальная читалка книг оказалась неудобной из-за медленного экрана. У мобильника хоть и нет такой продолжительности работы без подзарядки, зато экран гораздо контрастнее и откликается на листание страниц почти мгновенно.
При работе в режиме музыкального плеера, кнопки управления как правило вынесены на гарнитуру (play/pause, next, previous)
Но да, работа с терминалом на андроиде — мазохизм, хотя команды вроде ifconfig иногда ввожу что бы IP-адрес посмотреть.
Кстати даже клавиатура бы не особенно помогла, в андроиде сейчас нет не busybox, ни coreutils, к тому на половине команд permission denied, если не от рута.

admin аватар

Вот я и говорю,

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

Получается, что

Получается, что если выбросить android и iOS, остается только "кнопочная звонилка", "городской телефон" (его вроде бы правильно называть ip-телефония) и, может быть, рация, так? Других ОС на смартфонах, вроде как, нет. Да и нужны ли они (смартфоны)?

Я, честно говоря, не против такого исхода и для меня лично смартфон и планшет никогда не заменит ноутбук или ПК.

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

admin аватар

Совершенно

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

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

Пользуюсь

Пользуюсь кнопочными мобильниками всю жизнь. И пока что не собираюсь менять привычку. После долгих лет, недавно сменил телефон, купив кнопочник Nokia 2720 Flip: это - смартфон, который работает на KaiOS - свободной ОС. Правда вот не знаю пока что о том, какие возможности у пользователя в ней менять тот же IMEI. Моэет Вас заинтересует.

>А зачем делать

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

Не всегда. Один кейс я так и не нашёл, как эффективно делать в консоли.

Есть куча фоток в директории, много дубликатов и "неудачных" - стандартная картина при копировании с фотика.

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

Там где нужно не текстовая, а визуальная фильтрация с командной строкой не всё так хорошо.

admin аватар

Ну и?

Для сортировки фоток я сам применяю konqueror, и это единственный случай, для которого я его применяю. Но моей фразе, которую вы цитируете, сие не противоречит:

зачем делать мышкой то, что можно сделать без мышки

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

GUI

Иначе я не считаю, я с вами согласен.
А как относитесь к тайловым оконным менеджерам(i3, xmonad, и т.д)

admin аватар

Тайловые

Тайловые оконники вот только что обсуждались:
http://www.stolyarov.info/guestbook#comment-3437
Кратко -- не знаю, не пробовал. Пробовать некогда :-)

Качество печати

Здравствуйте.
Меня интересует качество печати данных книг. Каково оно?
Просто, для сложных (для меня) книг, я предпочитаю их бумажное воплощение. Но крайне не приятно держать в руках и работать с книгой с плохой бумагой и полиграфией.

admin аватар

Странный вопрос, честно говоря

Мне вот что интересно, вы на какой ответ рассчитываете? В каком виде? Книги вышли в твёрдом полноцветном переплёте, корешок плоский, скрепление клеевое (да, не шитое, звиняйте), бумага, если не ошибаюсь, 65 гр/м2. Печать типографская, тип печатного станка мне не известен (но это не ризограф, если вас этот момент интересует, а вот офсет это или что-то другое -- извините, понятия не имею). Что вас может не устроить -- ну, базовый шрифт 10й, можете любую страницу из PDFок распечатать, посмотреть, подходит вам такой шрифт или нет. Больше мне ничего в голову не приходит, что можно было бы ответить, но если у вас конкретные вопросы есть, задайте их.

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

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

Ясное дело что ответ зависит от временных рамок выпуска самого задачника. Хотелось бы узнать Ваше мнение по этому поводу )

Заранее Спасибо!

admin аватар

Вообще-то я

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

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

А как насчёт

А как насчёт https://projecteuler.net ?

Есть и другие подобные сайты, но этот первым в голову приходит.

admin аватар

Это не о том

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

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

А у меня и

А у меня и брутфорс на тех задачах срабатывает. Ну подумаешь подожду 2 минуты вместо 0.02 секунд, зато потрачу на написание 20 минут вместо 2 часов.

admin аватар

Я давно туда не

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

В любом случае, если задачи из projecteuler брутфорсить, то зачем на них вообще время терять? Польза-то от них где? Между прочим, где-то в сети валяются ответы на все тамошние задачи, ну вот вбить их по одному и всё, чего там.

Брутфорс

Польза от решения брутфорсом в том, что бы потом сделать diff вывода с "правильным" решением, и узнать, действительно ли оно правильное.

admin аватар

Там нет

Там нет "правильных" решений, в смысле они там не опубликованы, а если бы и были, diff бы не помог.

projecteuler

> Там нет "правильных" решений, в смысле они там не опубликованы, а если бы и были, diff бы не помог.

Вы просто не поняли, что я имел в виду. Попробую ещё раз:

В любом случае, написать решение брутфорсом имеет смысл до того как думать над "правильным" решением. Когда "правильное" решение будет готово, можно сделать вот так:

diff <(./bruteforce) <(./good_solution)

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

admin аватар

Ответом на

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

Поздравляю Вас,

Поздравляю Вас, Андрей Викторович! Блестящее достижение! А ведь еще говорили в анонсе 2-го издания, что через год ждать ничего не следует. Но нет, дождались :)

P.S.: Перечитывать то, что уже много раз читал в первом издании и находить новый текст, новые мысли - это удивительное удовольствие! Отдельное спасибо за это.

Спасибо

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

Cпасибо!

+ в карму и спасибо!

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

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

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

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны 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.