Аннотация
Учебник «Программирование: введение в профессию» ориентирован на самостоятельное изучение и предполагает использование систем семейства 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
Список найденных в тексте ошибок и опечаток находится здесь.
Первый том, посимвольный ввод
Добрый вечер, Андрей Викторович. Спасибо вам за ваш труд, вы - просто кладезь! =) Не кидайте только в меня тапками, я начал программированием заниматься в январе 2020, опыта ещё мало.
Вопрос касается стр. 322 (324 в поиске), процедура ReadLongint.
Я не понимаю до конца, что происходит внутри оператора read.
Здесь всё понятно. Мы читаем в переменную с: char каждый символ до тех пор, пока выражение не станет истиным. С позицией тоже понятно. А вот дальше вопрос:
1). Как происходит это чтение? Оно происходит в буфер куда-то? Ведь мы считываем посимвольно. Допустим, вводим число 12. Сперва вводим 1, у нас в "с" заносится цифра 1 (точнее код, который потом как-то обрабатывается, написал грубо), а когда мы вводим 2, разве не должна быть перезапись этой переменной? Как мы потом можем во втором цикле работать? Это же ведь не массив чаров.
Я попытался почитать и на freepascal про оператор read, и так погуглить. Либо я не могу сформировать вопрос грамотно, либо там только базовая информация есть.
2). И ещё вопрос: как у нас символ может одновременно быть = SPC и #10? Вроде же enter делает перенос на новую строку и возврат каретки. Это у нас двухбайтовый символ, состоящий как бы из 2 частей?
Можно просто ссылками на источники, либо кто-то из читателей откликнется и поможет.
Спасибо. Успехов вам и крепкого здоровья.
P.S. спасибо вам ещё отдельное за гостевую книгу. Я почитываю её периодически. Вчера вот допёр, как кое-что в линуксе настроить =).
Тоже сегодня
Тоже сегодня дошел до этого места и появились вопросы. Кажется по логике понятно, но ни код из книги, ни файл из архива с примерами char2num.pas не получается заставить работать как положено. Версия fpc 3.2.2
И капча тут ну очень сложная
Даже интересно
Даже интересно стало, как выглядит работа char2num "не как положено". Показать можете?
Про капчу — если не нравится, регайте себе аккаунт, аутентифицированным пользователям капчу не показывают.
Версия free pascal
Версия free pascal для windows похоже компилирует неверно. С версией для linux работает нормально. Я понял, книгу использовать только с линукс.
Дело не в
Дело не в версии паскаля, просто под виндой строки в тексте, в том числе и на вводе с клавиатуры, разделяются двумя байтами -- #13 и #10 (CR, LF). Программа, которую мы обсуждаем, на это не рассчитана, и символом #13 она благополучно давится.
Как я понимаю,
Как я понимаю, вводишь одно число, вводишь другое, получаешь произведение.
У меня же диалог с программой такой
Please type the first number: 4
'' in pos: 2`
Please type the first number: 5
'' in pos: 2`
Please type the first number:
А, винду
А, винду используем? Ну так выбросьте мои книжки и валите нахрен с моего сайта. Перейдёте под Unix -- можете возвращаться.
Ещё раз: если вы продолжаете использовать Windows, от моих книг вам никакого толку не будет. Это я вам гарантирую.
По поводу
По поводу вопроса "как происходит чтение" — это тот случай, когда американцы обычно говорят "вы не хотите этого знать". Если на стандартном вводе у вас терминал -- это одна история, если там файл -- другая, если сетевой сокет -- третья, и, кстати, после второго тома скорее всего вы все эти "истории" сможете рассказать сами. Пока что факт тот, что операционная система предоставляет пользовательским программам удобную абстракцию, именуемую "поток ввода", и ваша программа работает с этой абстракцией, а не с чем-то ещё. Всё, что можно сделать с потоком ввода -- это изъять из него очередной байт. Всё, точка. Вот read именно это и делает. Когда чтение делается посимвольно -- то по одному байту, когда как-то ещё -- то не по одному.
На самом деле, конечно, паскалевская runtime library к операционке обращается сразу за порцией данных, операционка в ответ отдаёт всё, что есть (если только хватает того буфера, который для этого использует RTL), а read потом вызов за вызовом эти данные использует, не обращаясь к системе, пока они не кончатся, и только потом снова обращается к ядру. НО это чистая оптимизация, т.е. не будь её, программа работала бы точно так же, просто медленнее.
На самом деле не должно было такого вопроса возникнуть, вот в чём проблема. Для освоения паскалевской части ответ на него не требуется. Несколько позже -- как я уже сказал, во втором томе, а может даже и раньше, при освоении ассемблера -- всё станет ясно, но это другой уровень, нельзя сразу всё постичь на всех уровнях, мозг так не умеет.
Ну а по поводу "одновременно" -- а ничего, что там неравенство, а вовсе не равенство? Вот, например, символ 'A' не равен ни пробелу, ни переводу строки, представляете? И символ '@' тоже. И вообще любой символ, кроме собственно пробела и перевода строки. Между прочим, если с ЭТИМ проблемы -- то стоит, по-видимому, вернуться к первой части, где рассматривается логика. Она там не просто так рассматривается. Вот уж чего там нет -- так это всякой странной магии насчёт двух символов сразу или что вы там удумали. Если бы там такая магия была, в книге про это было бы написано.
Затупил.
С логикой я разобрался. Про оператор while всё понятно. Допустим конкретный пример: берётся 1 байт из потока ввода, пусть будет число 5, сравнивается с пробелом - неравно, сравнивается с переводом строки - неравно. Оба уловия правдивы, значит итог - true. Следующая итерация.
А вот repeat ... until работает же пока условие ложно. Цитирую из книги (стр. 270/272): "... после слова until записывается условие выхода из цикла - логическое выражение, ложное значение которого указывает на необходимость продолжать цикл, а истиное - на то, что цикл пора прекращать".
Далее код первого цикла:
Берём то же самое число 5, вводим его. Увеличивается позиция на 1, переходим к условию: '5' <> ' ' - true, '5' <> #10 - true. Должен быть выход из цикла после первой же итерации. Или я туплю жёстко? Вроде же условия работы первого цикла должны быть такими:
Тогда то же самое число сравнивается с пробелом, потом с переводом строки, везде false - следующая итерация.
Я понимаю где-то на задворках сознаня, что вы, скорее всего, правы, но что-то не вяжется, не понимаю, где я ошибся.
По поводу первого пункта - понял в общих чертах. Понимаю, что для освоения паскалевской части это знать не обзательно, но я всё же должен понимать в общем, как это происходит, иначе тогда получается чёрный ящик, и я не могу двигаться дальше.
Асм изучал самостоятельно, но масм32 под винду и по ютубу и немного учебнику Пильщикова (пусть там и 16-разрядный асм). Есть некоторое понятие, но сами понимаете, самостоятельно познавать сложнее, хоть и увлекательнее.
Спасибо за ваш ответ и труд. + в карму.
По поводу цикла
По поводу цикла — а вы хорошо понимаете, что он делает? Он ведь, если вы не заметили, символы жрёт и ни черта с ними не делает, вот просто жрёт, ну, там, жрёт и не давится, жрёт и спасибо не говорит, жрёт как не в себя, можете сами синоним подобрать. Если условие вывернуть наизнанку, как это предлагаете вы, он начнёт так поступать со значащими символами, и я прямо даже тогда уже не знаю, как итоговое число-то вычислить. Если этот цикл все значащие символы прочитает и благополучно
похеритпроигнорирует.Если же таки оставить, как есть, то он пропустит все пробелы и переводы строк, сколько их там ему встретится, прежде чем начнётся что-то интересное. Для этого он там, собственно, и есть. А как только очередной прочитанный символ окажется чем угодно, только не пробелом и не переводом строки, цикл завершится, понимаете? А в переменной ch останется как раз этот символ. Первый встреченный значащий символ. Обрабатывать этот символ будет уже следующий цикл, вернитесь к тексту примера и посмотрите. Собственно говоря, если мы ввели ЦИФРУ (!!! а вовсе никакое не "число") '5', то из ЭТОГО цикла нужно уже вылетать как ошпаренным, потому что цифру надо обрабатывать, а не игнорить. А обработка не здесь, обработка (точнее, обработка и чтение) не здесь, а в следующем цикле.
И вот что. Я категорически настаиваю, чтобы вы привели в порядок свою терминологию. Число, цифра и символ — это три разных термина, у них совершенно разные значения, особенно недопустимо путать цифры и числа; а значение прочитанного байта вдобавок совершенно никак не равно численному значению цифры, даже если очередной прочитанный символ оказался цифрой. Бардак с терминологией всегда ведёт к бардаку в мыслях.
А вот чего я никогда не понимал, так это как можно изучать ассемблерное программирование -- под виндой с её принципиальной невозможностью статической сборки, с её системными вызовами, похороненными настолько глубоко, что никто не знает, какие они, с её окошками и прочим навязчивым хламом. Вот уж где попытки писать на асме не просто бессмысленны, они там, я бы сказал, оскорбляют здравый смысл.
Осознал.
Спасибо, я вас услышал. Буду работать дальше над собой. Теперь мне стало понятно. Я ещё обратил внимание на всю программу целиком, и меня как обухом по голове ударило))). Да, над терминологией надо поработать, а то свои мысли ясно и коротко не могу выразить.
По поводу асма под винду - я пока не до конца понимаю, о чём вы. Не тот уровень ещё. Для меня было прогресом, что я сумел откопать в аудио редакторе, где и как генерится серийный номер. Мне он нафиг был не нужен, просто было интерено, как устроено внутри. Настолько глбоко и масштабно я не мыслю пока. Линукс уже оценил, очень удобно и быстро, vim освоил на уровне вимтутора и дальше по главе в день стараюсь мануал читать и осваивать, но настолько далеко в отношении ОС ещё не продвинулся, чтобы судить. До 2020-го я даже html читать не умел и был обычным юзером =).
Спасибо за ваше время, больше не отвлекаю.
fb2 формат
Здравствуйте!
Спасибо вам за книги! Хочется уточнить один момент: пытаюсь сконвертировать в fb2, дабы разглядеть буквы на смартфоне и не могу понять кодировку. При выборе utf8 первый абзац читается по русски, но после далее уже на 2 странице после логотипа с лосем идут кракозябры.
Уважаемый автор, можно ли узнать исходную кодировку или иную полезную инфу, о том как сконвертировать 3 книги в fb2 или epub?
С уважением, человек.
Ещё один не
Ещё один не умеет лицензии читать. Слышь, найду -- урою. Я с такими вещами готов бороться вообще любыми доступными способами, и ни малейших сомнений у меня не возникнет.
Добрый день,
Добрый день, Андрей Викторович!
Дело в том, что я достаточно давно сконвертировал ваши книги в fb2 и успел прочитать уже больше половины. Естественно, никому сконвертированные файлы я не давал и никоим образом не распространял. Просто при чтении с компьютера у меня очень устают глаза, и электронная читалка на E-Ink для меня стала настоящим спасением.
Но сейчас я прочитал ваш комментарий и несколько даже испугался. Собственно, вопрос, а вернее даже просьба: разрешите ли вы мне дочитать уже сконвертированные книги до конца?
С уважением, Василий.
PS. В любом случае, спасибо за ваши книги.
К моему
К моему глубочайшему сожалению, я не могу вам этого запретить. Согласно действующему ГК РФ, в личных целях вы с объектами авторских прав можете делать что вам в голову взбредёт, если только это не программа для ЭВМ (там специальное исключение прописано). Нарушение авторских прав можно будет зафиксировать не раньше, чем оно от вас куда-то утечёт.
А вот утечь оно, увы, может. Потому я и не приветствую (мягко говоря) любые конверсии, даже если распространение не предполагается.
Необходимый уровень математики?
Здравствуйте.
Подскажите, пожалуйста, какая конкретно математика нужна (и желательна) для максимальной пользы новичку от этих книг?
Ситуация такая. У меня нет даже нормальной школьной алгебры, сейчас я подтягиваюсь по старым учебникам по математике Киселева ("Элементарная алгебра", "Элементарная геометрия"), но я слабо представляю, что делать после них. Я слышал, в программировании нужны дискретка, линал, матан, комбинаторика, но нужны ли они конкретно для старта по этим книгам? Спрашиваю не для того, чтобы с чистой совестью пытаться в программирование, отказываясь при этом подтягивать математику, а потому, что мне крайне сложно проглатывать тонны теории без каких-то веселеньких проектов, где все это можно применить на практике и что-то работающее получить - без отдачи. Если, например, при изучении интерфейса ЯП сразу можно пойти и что-то попробовать, поиграться, на ходу идеи рождаются, что можно с этим сделать и как применить с пользой для каждодневных задач, то с математикой я такого не видел и не знаю, где искать, кроме как посредством перемежения ее с программированием. Кроме того, я несколько скептически отношусь к современной программе образования по математике, поскольку сам ее испытывал и именно из-за этого сейчас учусь заново по Киселеву, который объясняет куда понятнее и интереснее. И частично из-за этого скептицизма я не уверен, что следует по современным программам тупо проглатывать школьные математики подряд - например, потому, что после алгебры там идет сразу резкий скачок в абстрактном мышлении к основам матана.
В общем, в итоге два вопроса:
Математику я в любом случае продолжу подтягивать, в любом случае докопаюсь по маленьким шажкам, что там где нужно и как все работает. Вопрос только в том, как быстро и с каким итоговым отношением к математике я этого достигну.
---
И сразу, чтоб не тратить коммент:
Могу
Могу посоветовать арифметику малинина и буренина и алгебру Маракуева, можешь почитать, что об этом говорят на этом сайте:
https://ask.profi.ru/q/kakoi-samyi-silnyi-i-interesnyi-shkolnyi-38422/
Я пробовал
Я пробовал писать калькулятор, сначала обычный, потом сделал её в стиле GDB (с командной строкой и т.п.) для умножения матриц, нахождения определителей и тому подобного.
Теория в итоге ушла в подкорку.
Дальше про то как изучать, я не преподователь, но у меня были хорошие учителя в школе, но всё равно какие-то советы "от товарища" смогут вам помочь в дальнейшем направлении.
Во первых у большой части математики нет практического применения! ДА! Буквально. Много чего создавалось для развлечения. Можно построить формальную теорию по которой 2+2 будет равно 5, но от неё может не быть никакой практической пользы.
Ну так вот, изучайте математику для "прокачки мозгов" прямо как с гантелями в спортзале. И здесь подойдёт любой её раздел, берите что больше нравится. И решайте на скорость, на нахождение наиболее изяшного решения и т.д. и т.п.
Ни в коем случае не нужно зубрить формулы, понимайте их! Представляйте себя вектором там, ложитесь на плоскость, делайте всё что помогает представлять, а не зубрить.
На этом пожалуй всё.
И да, чем дольше останетесь писать на паскале тем лучше. Вон я 3 месяца одну и ту же змейку переписывал (с перерывами). Конечный результат меня удовлетворил в достаточной степени, здесь цель именно в получении правильных привычек.
Трудно писать
Трудно писать змейку?
гм, не то чтобы
гм, не то чтобы трудно.. Я, когда на ней учился указателям на простую змейку я потратил недели два, схватив десятки сегфолтов. И я не пытался её 3 месяца подряд писать (отвлекался на другие задачки), дальше добавлял разные фишки (настройки, конфиг-файл, карта, сохранение, разные предметы, возможность играть вдвоём), приходило на ум как делать её лучше, появилось несколько реализаций. Вот так 3 месяца. А простая змейка проще пареной репы так-то (реально кнопкотоптание на вечер, но такая змейка скучная :) ).
Пока не реализовал, но хочу добавить ботов, сделать её серверную версию (что-то типа slither.io), чем не "сложно"?
Смотря кому
Ваш вопрос в такой его формулировке лишён смысла. Кому-то змейка — на один вечер потоптать кнопки, не особенно напрягаясь, а кому-то — недостижимая вершина. Дело здесь не в змейке, а в том, кто её пытается писать.
Очевидно, что я
Очевидно, что я не смогу оценить ваш уровень математики на основании одного этого комментария — но вы можете сделать это сами. В первом томе есть глава 1.3, целиком посвящённая математике. Первые три её параграфа посвящены комбинаторике, системам счисления и двоичной логике; если с их освоением будут сложности, то и со всем последующим тоже будет тяжело. Остальные четыре параграфа той же главы могут показаться "заумными", и без них в принципе можно на первых порах обойтись, но насовсем от них отказываться нехорошо — их целью является осознание самых-самых азов теории алгоритмов, причём вся эта теория вообще-то на практике не слишком критична, но без понимания именно базовых вещей программирование превращается в бездумное кнопкодавство.
Как изучать математику — вопрос не ко мне, есть много людей, умеющих её преподавать (в отличие от меня, я математику преподавать не умею).
Насчёт правильного мышления — тут всё довольно просто. Попробуйте на Паскале написать какую-то игровую программу, в которую станет играть кто-то кроме вас, причём добровольно. И постарайтесь при этом обойтись тем подмножеством средств Паскаля, которое описано в книжке (например, FreePascal поддерживает динамические массивы, вот их не трогайте, успеете ещё). Скорее всего, по итогам написания игрушки возникнет ощущение "это всё надо было с самого начала писать по-другому", вот это очень правильное ощущение — ни в чём себе не отказывайте, перепишите по-другому. Чем дольше вы провозитесь с Паскалем и чем больше кода на нём напишете, тем лучше.
ЗдравствуйтеСп
Здравствуйте
Спасибо за книги. Все также как и в первом издании невозможно скопировать текст из книги, чтобы вставить себе в конспект.
ПУБЛИЧНАЯ ЛИЦЕНЗИЯ копируется: "Учебное пособие Андрея Викторовича Столярова «Программирование: введение в профессию» в трёх томах".
А после нее со всех страниц вместо текста что-то подобное:
"DhVR^Y[ @ݷa_TaQ]]Ya_SQ^YVC SSVUV^YV S `a_eVbbYo_ ݷaYV^cY6
a_SQ^ ^Q bQ]_bc_pcV\m^_V YXdhV^YV Y `aVU`_\QTQVc Yb`_\mX_SQ^YV bY6
bcV] bV]VZbcSQ ^>9H 1S c7 h7 U9>EH2 S a_\Y b[S_X^_Z baVUl U\p _RdhV6
^Yp7 @VaSlZ c_] dhVR^Y[Q b_UVaWYc caY hQbcY5 _fSQclSQojYV RQXYb
X^Q^YZ _ `a_TaQ]]Ya_SQ^YY [Q[ SYUV UVpcV\m^_bcY7"
Пробовал в Windows 10 (работаю c 3d-редакторами) в Foxit reader, браузеры и т д. Везде так. Это у вас такая защита от копирования?
Наверное, как и с первым изданием придется прогонять pdf через распознавание текста (
А смысл? Если
А смысл? Если верить автору, то в Windows всё равно не получится научиться программированию. По крайней мере по его методике.
Кстати, а что за конспект такой? И разве назначение конспектов не в том, чтобы запомнить материал в процессе его написания? Тогда будет более эффективно прочитать нужную часть текста, затем написать своими словами, причём в идеале сверив с другими источниками и дополнив ещё и оттуда.
Слушайте, ну
Слушайте, ну достали уже одно и то же спрашивать. Текстовый слой сломан намеренно, а любая конверсия и вообще любое изменение тех файлов, которые здесь опубликованы — прямое и грубое нарушение лицензии. Найду — урою.
И да, к защите от копирования это никакого отношения не имеет. Копировать файлы, как можно заметить, никто и ничто не мешает.
Шрифт в PDF
Здравствуйте, Андрей Викторович!
Пробую читать Ваши книги в PDF. Некомфортный шрифт. Возможно он оптимизирован под бумагу, но на экране смотрится жестко, на глаза давит. Какие-то зазубрины и неровности на буквах. Причем меняющиеся при изменении масштаба. Если возможно, в следующем издании сделайте, пожалуйста, более гладкий шрифт.
С уважением, Андрей Кодинцев.
Здесь проблема
Здесь проблема не в шрифте, а в выборе программы для чтения. Используйте, например, atril, всё будет намного приятнее.
И да, шрифты семейства Computer Modern предназначены для бумаги, а те PDF-файлы, которые есть здесь на сайте — это оригинал-макеты книг, то есть прямо те файлы, с которых книги печатались в типографии. Только спереди добавлены странички с обложкой и лицензией.
Добрый день,
Добрый день, Андрей Викторович! На данный момент я пишу свою первую программу превышающую объём в 300 строк. Но проблема в том, что реализация моей программы мне кажется неправильной, не в плане оформления, а в плане эффективности. Стоит ли по этому поводу переживать?
Переживать по
Переживать по поводу эффективности следует не раньше, чем вы её запустите и она вам покажет неприемлемую скорость работы. Всё остальное — ну, есть даже название: преждевременная оптимизация.
Ну кстати тут
Ну кстати тут есть пунктик, прочитал в статьях этого товарища https://randomascii.wordpress.com/
Оказывается, есть такая ерунда — квадратичная сложность алгоритма O(n²) — это как раз такая производительность, которая достаточно небольшая, чтобы пройти тестирование и выйти в production, но зато достаточно значительная, чтобы в реальном использовании вызывать проблемы.
В винде, например, квадратичную сложность имеет алгоритм выравнивания значков на рабочем столе. Причём применяется он даже тогда, когда показ этих значков отключен. Из-за этого те кто захламляют рабочий стол потом удивляются что у них меню "пуск" открывается по двадцать секунд. И как обнаружил автор, в винде таких мест полно.
Здравствуйте!
Здравствуйте! Остановился на Паскале, есть идея написать одну программу, но... Уже как месяц (вместе с учебой) пытаюсь соблюсти все принципы адекватного кода + чтобы все это было понятным (не более 4 параметров, подпрограмма решает одну, независимую от других подпрограмм, задачу и т.д.).
Так вот вопрос: я параноик (месяц обдумываю, пишу, а никакого рабочего прототипа нет)?
P.S. Сама задача - перевод числа из одной системы счисления в другую. Делаю примерный план и тут же появляются проблемы (здесь речь идет о буквах и числах одновременно, т.к. их тоже нужно правильно переводить) по типу: "Можно считать все символы в строку, а потом перевести в нужную систему" или "можно читать символы по одному, и сразу их переводить"; У одного свои нюансы, у другого еще какие-нибудь, и из-за этого не могу соблюсти какие-либо правила в процедурах и т.д.
> вопрос: я
> вопрос: я параноик (месяц обдумываю, пишу, а никакого рабочего прототипа нет)?
Сложный вопрос :-) точнее, вопрос простой, а ответ на него сложный.
Во-первых, и в-главных, слово "параноик" у программистов (и вообще компьютерщиков) ругательным не считается; напротив, НЕ быть параноиком (ну, скажем, всё-таки скорее в бытовом смысле параноиком, не в медицинском) — для IT-специалиста означает профнепригодность. Паранойя для нас обязательное свойство.
Во-вторых, месяц обдумывать — это в целом нормально.
Но есть ещё и в-третьих. Что-то у вас задачка уж больно простая :-) чтобы её месяц обдумывать и так и не сделать ничего. Чтобы здесь сдвинуть дело с мёртвой точки, попробуйте её написать сугубо как попало, вообще без обдумывания архитектуры, имея в виду за кадром, что первую версию (пусть даже рабочую) вы выбросите и напишете программу снова, только уже "правильно".
Да, ещё один момент:
> речь идет о буквах и числах одновременно
Мне почему-то кажется, что вы путаете "числа" и "цифры".
Аудио в Linux
Я снова здесь. Наконец, закончил "переводчик", добрался до полноэкранных программ (ваш совет изменил дело в лучшую сторону, спасибо). Встал вопрос о... Воспроизведении звука; могу ли я проигрывать аудио (mp3 - хотя, без разницы, можно любой формат) на Паскале? Уж очень хочется добавить звуки в свою будущую игру. Заранее спасибо.
Я такого
Я такого никогда не пробовал (и не только на Паскале, вообще ни на каких языках), но точно знаю, что можно. Вот, например: https://wiki.freepascal.org/Audio_libraries
Только я сомневаюсь, что нужно. Разобраться с любой из этих библиотек довольно трудно, там задействуются нетривиальные части FreePascal, которые я в книге не рассматриваю принципиально (например, часть из них объектно-ориентированные, а я ООП неслучайно отложил до третьего тома). В общем это всё не для начинающих. Тот же модуль crt для начинающих вполне годится, но во FreePascal'е есть существенно более навороченные юниты для тех же целей — угадайте, чего это я про них ни слова не говорю. Всё-таки FreePascal я рассматриваю как учебное пособие, а не как инструмент.
То есть эту
То есть эту затею лучше отложить до Си/Си++?
Да, где-то так.
Да, где-то так. Не потому. что это лучше писать на Си или Си++, а просто потому, что к тому времени у вас мозги уже будут натренированы в нужную сторону и менее подвержены влиянию, извините за выражение, говнокода, которого в "профессиональных" библиотеках Free Pascal в избытке.
Понял, спасибо
Понял, спасибо
Ок, спасибо)>
Ок, спасибо)
> Мне почему-то кажется, что вы путаете "числа" и "цифры"
Да, простите.
> Чтобы здесь сдвинуть дело с мёртвой точки, попробуйте её написать сугубо как попало, вообще без обдумывания архитектуры, имея в виду за кадром, что первую версию (пусть даже рабочую) вы выбросите и напишете программу снова, только уже "правильно".
Окей, попробую.
Читал комментарии, где вы говорили про systemd:
> Вообще если уж залезли так глубоко, попробуйте сразу сползти с systemd, эта штука мертворожденная и неизбежно в какой-то момент начинает жутко мешать
Почитал про инициализаторы в интернете; Узнал, что один инициализатор прост в использовании и следует философии UNIX (init), а другой - в точности наоборот - сложен и не следует философии UNIX;
В этом ли все дело? То есть это является причиной, из-за которой люди не любят systemd?
Возможно, лезу вперед, но стало интересно, почему все сложилось именно так.
Философия - фигня
Философия — фигня, хотя, конечно, всё именно так. Но — за всех, конечно, не поручусь, а лично я systemd "не люблю" (если быть точным, с удовольствием пристрелил бы всех, кто имеет отношение к его созданию и раскрутке) по одной простой причине: его навязывают. Если дистрибутив переходит на systemd, в нём вся основа, всё то, что мы называем "системой", становится повязана на systemd, то есть выкинуть его оказывается невозможно; при этом systemd от пользователей требует усилий на переобучение и траты времени на это, но не решает никаких реально существующих проблем. Попросту говоря, эта публика — RedHat и все, кто за ними последовали — решили, что они вправе отнимать моё время. Как мы понимаем, такое понравиться не может.
Ну и плюс к тому — решать-то проблем systemd не решает, а вот создавать — создаёт. Если моя система на старте работает как-то не так, я минут за десять разберусь, почему это происходит, поскольку у меня SysVinit, в котором всё, что происходит, задано простыми shell-скриптами. Если система на основе systemd "работает как-то не так", разобраться нереально: нужно лезть в потроха самого systemd, а там, пардон, многобукв и контринтуитивное построение архитектуры.
Более того, в
Более того, в дистрибутивах, где "нет systemd", он таки есть. Просто не весь. udev например.
udev, заметим,
udev, заметим, тоже умеет исключительно мешаться, т.е. вся "польза" от него — трата нескольких часов на то, чтоб с ним начать хоть как-то справляться, когда эта дрянь начинает творить очередную дичь вроде переименования сетевых карточек, или когда оказывается, что иксы настройку клавиатуры "теперь" берут из udev.
Если помножить потерянные лично мной несколько часов на количество пользователей Linux, которых не удовлетворяет ванильная функциональность из коробки, получится, я бы сказал, такое, за что не просто убивают, а как минимум сажают на кол.
О нужности udev
Прошу не думать, что я являюсь фанатом udev или чем-то вроде, но, он делает вот это вот:
1. При втыкании устройства создаёт файлы в /dev, а при вытыкании удаляет. В той же OpenBSD приходится каждый раз писать cd /dev; sh MAKEDEV sd или что-то такое.
Как предложите это делать без udev?
2. Предположим у меня есть устройство и при каждом его втыкании я хочу выполнить команду. Как это сделать без udev? Например подключить кастомную раскладку клавиатуры но только к одной конкретной клавиатуре.
без udev
Откройте для себя сборку ядер Linux с CONFIG_DEVTMPFS=y и CONFIG_DEVTMPFS_MOUNT=y
В той же OpenBSD
В той же OpenBSD приходится каждый раз писать cd /dev; sh MAKEDEV sd или что-то такое.
Не вводите в заблуждение несведущих, для создания нового файла устройства MAKEDEV нужно написать лишь один раз.
Ну и да, если кому-то действительно нужно динамично создавать/удалять файлы устройств (и/или выполнять какие-то ещё команды, вроде вашего примера с клавиатурой), то нормальные шелл-скрипты смотрелись бы на месте udev (с его откровенно наркоманским синтаксисом) гораздо лучше.
OpenBSD
Ну, мне часто приходилось загружаться с bsd.rd и что-то там делать и там нужно было вводить эти команды именно каждый раз. В то же время в LiveCD с гнутым линуксом это было не нужно.
Безусловно, в
Безусловно, в live-системе, где файлы не сохраняются на диск, придётся делать это каждый раз. Но в вашем исходном комментарии было совсем не очевидно, что речь идёт именно о таких системах. Поэтому я и попросил вас не вводить в заблуждение людей, не знакомых с OpenBSD. Прочитав ваш комментарий они легко могли получить неверное представление.
Подозреваю, в
Подозреваю, в исходном комментарии про "один раз" речь шла всё-таки о системе, инсталлированной на жёсткий диск. Что все эти "live" ничего не запоминают из того, что было сделано — не новость.
При втыкании
При втыкании устройства создаёт файлы в /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 но я забыл как.
она называется
она называется 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), есть такой файлик:
Мне не хочется разбираться в тонкостях этого, как я уже говорил, наркоманского синтаксиса, но на первый взгляд именно udev отлавливает параметр ядра net.ifnames и переименовывает устройства в зависимости от него. То есть, если это правило удалить нахер, то параметр ядру передавать не понадобится.
То есть, если
То есть, если это правило удалить нахер, то параметр ядру передавать не понадобится.
К сожалению, это не так. Эти неудобоваримые имена вместо традиционных eth0, eth1 и т.п. — это именно конфигурируемая "фича" ядра (называется, если не ошибаюсь, predictable network interface names), и пресловутый параметр её отключает, если она была включена при сборке. Единственный дистр, в котором она включена, из тех, что я лично трогал-щупал-пользовал — таки убунту, в остальных (в том числе в дебиане) этот идиотизм, судя по всему, не прижился.
udev к именованию (точнее, к ПЕРЕименованию) устройств, несомненно, тоже имеет отношение, в нём соответствующая функциональность присутствует. Но убирать "нахер" надо не правило, а весь udev целиком, это как-то правильнее, что ли.
В Дебиане
В Дебиане прижился. Причём вроде то ли с 9 версии, то ли с 10
udev
> Но убирать "нахер" надо не правило, а весь udev целиком, это как-то правильнее, что ли.
Может кто-то и осудит такое мнение, но мне как-то пофиг. Он есть и работает, так что пусть будет. А вот если его убирать, наверняка что-то отвалиться, придётся разбираться, возможно пересобирать код с патчами, а может вообще самому эти патчи писать. Это тяжело а в итоге, ну, будет опять работать. А в чём польза, если и так работает и так работает? Какой бы не был наркоманский синтаксис у правил udev, проще разобраться с ним, чем с целой кучей программ, которые нужно править, чтобы избавиться от udev.
Кстати то же самое относится и к systemd: если бы готовых дистрибутивов, где мейнтейнеры уже позаботились о том, чтобы всё работало без systemd не существовало, я бы сидел на дистрибутиве с systemd. Но, к счастью, такие дистрибутивы есть и я использую один из них.
Впрочем не вижу ничего особо ужасного и в systemd. Приходилось пользоваться на устройстве к которому других готовых дистров не было (одноплатник). Поправить/написать юнит-файлы не намного сложнее, чем шелл-скрипты. Ну и команды нужны другие для остановки/запуска демона — systemctl какой-то. Так разве трудно прочитать man systemctl? По-моему это гораздо проще, чем разбираться в том как адаптировать без-systemd-шный дистрибутив под тот одноплатник. И я знаю, о чём говорю, поскольку ранее его и использовал, когда готового образа под тот комп не было.
Ваше
Ваше рассуждение имеет серьёзную дыру: вы наличие udev рассматриваете как исходную ситуацию, как если бы он "всегда был", и оцениваете его с точки зрения сложностей по слезанию с него. Я же начал использовать Linux за девять лет до первого релиза udev (каковой состоялся в 2003 году) и, соответственно, лет за 15 до его широкого распространения; вполне логично, что я скорее буду оценивать шаг по его внедрению (что было, что стало, чего стоило) — и тут всё очень плохо: было всё нормально, стало отвратительно, и на это ещё и потрачены силы и время.
Ну а ваша лояльность к systemd вообще ни в какие ворота не лезет. Мне не трудно прочитать man systemctl, и уже пришлось это сделать. И, увы, не раз, поскольку там контринтуитивно всё и не запоминается. Что я за это получил? А ничего — возможность справиться с треклятыми systemd'шными дистрами, которые теперь только и есть на любом VPS-хостинге, то есть де-факто я вынужден был потратить своё время на то, чтобы побороть проблему, которую мне, собственно говоря, как раз внедрение systemd и создало. Как запускать, останавливать, включать и выключать сервисы на sysVinit, я разобрался ещё тогда, в 1994 году, и писать скриптики для исходно дебиановской скриптоты, лежащей в /etc/init.d, тоже научился очень быстро, ибо там всё понятно и логично, а вот юнит для systemd — он, может, и короче чисто текстуально, но что там за мумба-юмба написана, при взгляде внутрь совершенно непонятно, приходится это всё как-то обходить, поскольку врубаться в эти поттеринговские высеры у меня нет ни малейшего желания — эта мерзость мне и так уже стоила несуразно дорого.
Потрудитесь освободить мой сайт от своего присутствия, мне тут такие не нужны.
Есть хостинги - достаточно их
> треклятыми systemd'шными дистрами, которые теперь только и есть на любом VPS-хостинге
==
https://www.vultr.com/
есть freebsd и openbsd
может кому нибудь понадобиться, и ни копейки больше за не-системдшность не просят.
UPD: Очень был тогда очень удивлен тем что там были BSD, что даже забыл добавить, что ещё можно загрузить свой образ, это думаю ещё интереснее.
Не подскажете,
Не подскажете, сколько там стоит самый простой тариф? А то взлянуть на цены можно только после регистрации.
На данный
На данный момент как пишет: самое слабое железо - High Frequency 32 GB NVMe $6/month $0.009/hour 1 CPU 1 GB Memory 1 TB Bandwidth; думаю справедливо. сам лично этим хостингом не пользуюсь, пользуюсь другим. стоит дебиан с 10GB за 3$, но мне много и не нужно, запросы у меня небольшие, не приходится мараться много об выверты systemd, раз nginx зарелоадить, раз tinyproxy также, ну и git.
К сожалению,
К сожалению, это не так. Эти неудобоваримые имена вместо традиционных eth0, eth1 и т.п. — это именно конфигурируемая "фича" ядра
Жаль. Я надеялся, что хотя бы в ядре этой фигни нет.
Но убирать "нахер" надо не правило, а весь udev целиком, это как-то правильнее, что ли.
Да, конечно. У меня даже были планы разобраться с mdev, когда ещё на линуксе жил, но руки так и не дошли. Оказалось проще перейти на OpenBSD, где всего этого дерьма изначально нет.
"(*p).next" vs "p->next"
на стр. 141 можно еще предложить пример с указателем на указатель в качестве аргумента в пользу "стрелки". Получается вообще клинопись:
"(*pp)->next" vs "(*(*pp)).next";
Вот как будто
Вот как будто без этого не клинопись. А в вашем примере вторые скобки вообще-то не нужны, так что получается не так уж и страшно, всего лишь (**pp).next.
виртуальная машина
Андрей Викторович можно узнать как переползти на другую ОС.
Просто я пользуюсь виндовс 10 и у меня много всего что на линксе работать не будет. Я прочитал что можно использовать virtualbox(все через виртуализацию ставят линукс или как ?)
> много всего
> много всего что на линксе работать не будет
Что в это "много всего" входит?
Разумеется, есть программы, которых нет под Линукс, но все-таки часто оказывается, что пользователь Виндовс запускает в своей системе программы, которые можно запустить либо на Wine под Линукс, либо для которых есть альтернатива на Линукс, либо которые на самом деле не шипко то и нужны ему, но привычка делает свое дело. Я не утверждаю, что это - именно Ваш случай, но... Я в свое время жил в Виндовс и мне казалось, что вот без некоторых программ, которые я на нем запускал, будет не просто. Я разумеется заблуждался, и когда совершал переход на Линукс, нашел для своих задач альернативу на Линукс. Оказалось, что все дело - в привычке и в моем заблуждении, что мол на Виндовс есть все, а на Линукс - нет ничего. Еще раз замечу: не берусь утверждать, что это - именно Ваш случай, я лишь делюсь своим опытом... Во всяком случае, я - очень доволен, что слез с Виндовс, потратив на это сравнительно не так уж и много усилий, чтоб изменить привычкам и отбросить свое заблуждение: потраченные усилия и время стоят того!
>много всего
>много всего что на линксе работать не будет
Прям уж?)
Просто есть такая программа, wine, и с помощью нее все прекраснейшим образом работает. Играл на ней в OSU, старые флеш игры и прочую фигню, работало *быстрее* чем на винде.
Ну и да, в это сложно поверить, но на Линуксе программ *гораздо* больше, банально потому, что консольные программы крайне просто писать.
По делу -- ставьте какой-нибудь дистр для чайников, там разберется даже домохозяйка. Можно в дуалбут (будете при загрузке ПК выбирать куда грузиться -- в Линукс или Винду), но скорее всего вы просто плюните, перезагружать каждый раз комп дело не быстрое.
> wineА как он с
> wine
А как он с современными программами справляется, не знаете?
> консольные программы крайне просто писать
Не согласен. Под unix проще и приятнее писать любые программы :)
Можно, кстати, как советует Андрей Викторович, найти или купить старый ноутбук и поставить туда linux. Если ноутбук совсем дряхлый, то это ему может буквально вторую жизнь дать.
> А как он с
> А как он с современными программами справляется, не знаете?
Смотря какими. ААА игры -- плохо без настройки, лучши стимовский протон использовать. Всякая хрень с DRM туда же. Ну а все остальное сносно :)
>Под unix проще и приятнее писать любые программы
Я с UI программ под Линукс не писал, так что говорить не буду.
Я и писал, и под
Я и писал, и под 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-х, да.
Я в подобном
Я в подобном случае ставил систему на диск, а загружался с загрузочной дискеты, которая указывала диск с системой
Вот с живыми
Вот с живыми дискетами и дисководами реально сейчас могут быть проблемы.
По моим
По моим наблюдениям сейчас живых IDE-дисков по окрестностям бегает больше, чем компов, которые их умеют и которые ещё не осыпались ржавым прахом. Неужто так трудно побольше винт найти? :-)
IDE-диск
Там он нестандартного типа. Другой достать можно, но это того не стоит
>далеко не
>далеко не каждый софт запустится под wine. Часто даже разные версии одной программы ведут себя по-разному при эмуляции.
Каждый запустится, не каждый будет работать :)
А вообще я перечислил выше, что у меня работает хорошо.
> базовая настройка wine требует определенных усилий
На минте работало из коробки, на дебиане да.
>И, пожалуй, стоит быть готовым к тому, что половина игр для винды не запустится под *nix.
Вообще да, но тут внезапно приходит осознание, что к чертям большинство игр не нужно. Я даже в OSU не играю, осталось только 0 A.D (кстати никто больше не играет?), без стратегий жить не могу, а шахматы надоели.
>дистр для чайников
Дистр, который сложно поломать, и на котором минимально нужно что-то чинить.
>Новичок, вооружившись мануалом и соответствующим настроением, поставит любую систему: от Linux Mint до OpenBSD
Ага, щас :)
Это работает если человек а) умеет читать на английском б) хорошо понимает устройство ПК, читай знает CS.
Я несколько раз не мог осилить Арч, из-за отсутствия вообще какого-либо представления о разметке диска и незнания что такое GRUB.
немного оффтопа про игры, если уважаемый хозяин не против
Есть, кстати, сильно облегчённый опенсорсный клон OSU: https://github.com/fmang/oshu
Я сам, правда, на нём почти не играл. Только собрал себе под OpenBSD и попробовал запустить пару битмапов, чтобы убедиться, что всё работает.
В OSU я поигрываю иногда на смартфоне. Как телефоном я им давно не пользуюсь, симки переставил в дешёвый кнопочный телефон, а вот под музыку пальцем потыкать оказалось прикольно. Тоже, кстати, на опенсорсном клоне, называется OPSU.
без стратегий жить не могу, а шахматы надоели.
Wesnoth?
За OSU большое
За OSU большое спасибо, попробую
>Wesnoth
Да мне как раз пошаговость в том числе и наскучила. Хотя выглядит интересно, тоже попробую
>дистр для
>дистр для чайников
Дистр, который сложно поломать, и на котором минимально нужно что-то чинить.
Неоднозначное определение. Мне, например, поломать Ubuntu проще, чем поломать Slackware. А починить поломанное, наоборот, гораздо труднее.
Про "минимально нужно чинить" то же самое. В свежеустановленной Ubuntu мне с ходу хочется починить вообще всё.
Поломать -- это
Поломать -- это и к установке относится :)
Хотя про Slackware я ничего не знаю.
Ну и да, убунта ни разу не для чайников.
Насчет поломать... Целенарпавленно ломать никто не будет, поломать можно что-то когда будешь настраивать, а значит настраивать нужно как можно меньше.
Да ладно, что
Да ладно, что такого страшного в том, чтобы сломать свежую инсталляцию? Придётся, конечно, потратить время на переустановку, но зато появится некий опыт. Вот какой-нибудь сервак в продакшне, к которому к тому же нет физического доступа, сломать реально страшно :-)
Вот у меня,
Вот у меня, вроде как всего 3 года назад, был панический страх белого текста на черном фоне. Прям страшно, без шуток.
Новичку я думаю также будет страшно
А если его
А если его зелёным сделать, как на очень многих исторических терминалах? Или вот амберным (таким приятно-оранжевым, действительно чуток на янтарь похоже), как на моём vt420? Или тут всё-таки не в цветах дело?
Нет не в цвете,
Нет не в цвете, именно что боязнь терминала.
Насчёт боязни
Я вот просто таки ненавижу если не боюсь графических установщиков. Можно галочку какую-то где то забыть или не увидеть или оно не сможет там отобразиться мало что там бывает.
А в терминале все можно зажурналировать и хоть 1000 раз потом перепроверить текстовый файл. Только терминал спасает меня от моей "ОКР", паранои и перфекционизма. И ещё я могу 2 часа выбирать имя переменной.
Привожу как просто альтернативную точку зрения.
Неужели нужно лечится и зарядится пофигизмом? И плохие ли это привычки для разработчика?
плохие ли это
плохие ли это привычки
Всё, что вы про терминал сказали, вполне себе так и есть. Что до двух часов на выбор имени переменной, то это, конечно, перебор; её же потом можно переименовать, вы её не на скрижалях высекаете.
> боязнь
> боязнь терминала.
Часто у этого нет оснований, ибо какая разница, выбирать диск для установки в GUI и нажимать на кнопку "Далее" или установливать систему в текстовом режиме и, вместо кнопки "Далее", нажать предлагаемую кнопку на клавиатуре, чтоб выбрался нужный диск для установки? Но начинающий, разумеется, об этом и не догадывается... Но боится... Да, во время установки, например, OpenBSD есть свои особенности, но если в компе - один диск и делать авто разметку диска, ну тогда там все достаточно таки просто!
Вообще же, все на самом деле просто: нужно только разобраться. Ведь все придумали такие же люди как и мы с Вами, и у них, как ни странно, тоже 1 голова...
Странно, за
Странно, за собой такого не помню. Ну хотя я с ДВК начинал :-)
> поломать Ubuntu
поломать Ubuntu проще
А ведь верно, причём в самом буквальном смысле. Там ведь по умолчанию есть sudo, и оно юзеру доступно без ограничений.
починить вообще всё
Видимо, самая главная неисправность заключается в неправильном выборе дистра перед установкой :-)
Видимо, самая
Видимо, самая главная неисправность заключается в неправильном выборе дистра перед установкой :-)
Дык! :-)
Справедливости ради, последний раз такая проблема возникала когда я ещё работал в офисе, на предустановленной убунте. Помучившись какое-то время, решил проблему именно что установкой другого дистра.
хорошо
хорошо понимает устройство ПК, читай знает CS.
Я бы не стал обобщать "понимание устройства ПК" до "знания CS". CS -- это ещё и, например, дискретная математика, алгоритмы, теория вычислимости, теория категорий, и проч. Всего этого точно не нужно, чтобы установить ОС, пусть даже это и OpenBSD с текстовым инсталлятором.
Справедливо, не
Справедливо, не знаю как назвать дисциплину, разбирающую устройство ПК.
И не просто устройство, мол, вот это диск, а это ОЗУ, а именно что такое раздел, BIOS, шина, и проч.
Кстати да.
Кстати да. Больше того, я неоднократно видел людей, вроде бы знающих CS, но которые про DPT, например, не в курсе, и компьютер разобрать-собрать не могут.
DPT
Что такое DPT? Если аббревиатура, то можно полностью словами? Гуглится что-то невнятное.
Disk Partition Table
Disk Partition Table https://en.wikipedia.org/wiki/Disk_partitioning
DPT
Это странная аббревиатура. например MBR или GPT я бы понял, а так нет
Я как-то пробовал создавать флешку с бесконечным количеством разделов. Extended Partition может ссылаться сама на себя.
Кстати эта структура данных напоминает односвязный список. Так что можно и бесконечный односвязный список сделать.
MBR не про то, это
MBR не про то, это скорее тот машинный код, который занимает начало того же (самого первого на диске) сектора, в конце которого располагается таблица разделов.
А GPT, кстати, вот я бы уже не понял. Во всяком случае, без обращения к поисковикам.
> MBR не про то,
> MBR не про то, это скорее тот машинный код
От какой машины код в карте памяти, которая вставлена в фотокамеру или портативную колонку?
От x86, причём
От x86, причём 16-битный. Если, конечно, код там есть; при создании загрузочного носителя этот кусок кода в любом случае обычно перезаписывают.
От того, куда эта карта вставлена, сие, понятным образом, никак не зависит.
Поскольку мы
Поскольку мы тут, по-видимому, обсуждаем обучение по моим книгам, я вынужден вас огорчить: если вы Linux поставите в виртуалке, ничего у вас не получится, жить вы в нём не станете и он не сыграет той роли, которая ему отведена в моей методике.
От этого "много всего", что "не будет работать", придётся отказаться. Либо отказаться от моих книг, всё равно толку не будет. Отказываться от привычного софта, впрочем, можно постепенно — например, загружать Win только в случаях, когда вот совсем никак не получается прямо здесь и сейчас что-то сделать без неё. И частота возникновения таких случаев должна постепенно падать. Linux (или другой Unix, скажем, FreeBSD или OpenBSD) следует воспринимать как основную систему, а не "учебную", в противном случае можно даже и не начинать дёргаться. Ну, или другие книги поискать, во всяком случае. Мои книги с повседневным использованием систем линейки Windows несовместимы.
Windows
Мне до сих пор приходится иногда его загружать, правда на отдельном компе физически не подключенном к интернету. Правда задачи, для которых нужен Windows почти все типа что-нибудь перепрошить:
SSD (причём можно прошить даже тот с которого загружена ОС), флешки (если сдохли их иногда можно оживить утилитой от производителя), кнопочные мобильные телефоны (андроидовские прошиваются просто копированием zip-файла в определенный каталог на карте памяти и загрузкой в режиме Recovery).
Ещё есть класс задач типа — подсказать виндузятнику как что-то там сделать в Windows. Тут тоже желательно иметь её у себя на компе.
Ну и наконец — тестирование разных программ. Например проверить воспроизводится тот или иной баг в свободной программе в Windows и добавить это в баг-репорт. Не обязательно, но почему бы и нет?
Да у меня тоже
Да у меня тоже вообще-то есть ноутбук с XP :-) Правда, задача ровно одна: запускать софтины для генерации отчётов в налоговую и ПФР. Под wine они вроде тоже запускаются, но возникают странные проблемы с русским вводом (не разбирался, скорее всего это из-за того, что у меня koi8), а тот ноут всё равно больше мне ни подо что не нужен.
Дело не в том, что Windows нужно полностью изжить и не прикасаться к ней под страхом расстрела. Дело (если речь идёт об обучении по моим книжкам) в том, что _жить_ нужно под *nix'ом, и не просто жить, а обязательно использовать в роли основного инструмента управления машиной командную строку.
ОК понял
ОК понял спасибо.
небольшое замечание
Добрый день. в третьем томе в примере на странице 194 не нужно ли передавать в качестве параметров координаты в функцию Hide(), я понимаю, что на общее восприятие примера это не влияет, но все же, откуда функция узнает, откуда ей стирать точку или окружность?
п. с.: с уважением и огромной признательностью за ваш невообразимый труд и прекрасное пособие
Ну здрасссте.
А ничего, что эта функция — метод объекта, вызывается для объекта и имеет доступ к полям объекта?
Вообще когда такие вопросы возникают, обычно это значит, что за ООП вы схватились слишком рано.
2 книга предыдущего издания
Спасибо вам огромное за ваши труды. У меня вопрос: второй том про низкоуровневое программирование не вошёл во 2-е издание. А почему так? Разве его теперь не стоит изучать, чтобы пойти дальше в сети и парадигмы? Спасибо =)
P.S. ну и капчи у вас, я и сам далеко не с первого раза отправил).
ёлки-моталки,
ёлки-моталки, смотрим сюда: 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. Или я что-то путаю?
Конечно,
Конечно, путаете:
Возьмем число 255 (1111 1111 в двоичной системе) и выполним операцию and с той же тройкой (0000 0011). В регистре останется тройка,
Ну так остаток-то мы искали не от деления на три, а от деления на четыре. И ага, остаток от деления 255 на четыре составляет таки три, тут всё верно.
Также с числом 31
Абсолютно верно, и получается остаток от деления на 32. Как это и написано в книге, собственно говоря.
В общем случае, чтобы получить остаток от деления на степень двойки, надо взять эту степень двойки, вычесть из неё единицу и полученное число наложить на первый операнд в качестве маски с помощью and.
Кстати, and никакой не оператор. В ассемблере вообще нет операторов.
and никакой не
and никакой не оператор. В ассемблере вообще нет операторов.
Ассемблеры, которые сами умеют вычислять выражения, позволяют использовать в них арифметические, побитовые и ещё какие-нибудь полезные операторы.
Рекомендую
Рекомендую уяснить разницу между английским термином operator и русским словом оператор, который, если речь идёт о программировании, по-английски будет statement. Английское operator переводится словом «операция».
А можете,
А можете, пожалуйста, подсказать, как это получается (математически), то есть откуда пошло правило ("чтобы получить остаток от деления на степень двойки, надо взять эту степень двойки, вычесть из неё единицу и полученное число наложить на первый операнд в качестве маски с помощью and")?
Ну вот
Ну вот смотрите, начнём с понятной всем десятичной системы. Чтобы получить остаток от деления на N-ю степень основания системы счисления, надо тупо и цинично взять младшие N цифр, в десятичном случае остаток от деления на 10 -- одна младшая циферка, от деления на 100 -- две младшие циферки, от деления на 1000 -- три циферки и т.д. Например, для числа 453781 соответствующие остатки будут 1, 81, 781, 3781, 53781 и (при делении на миллион и все бОльшие степени десятки) 453781.
Это правило -- при делении на N-ю степень основания системы счисления остаток можно получить, взяв N младших цифр в записи числа в этой системе -- работает для системы по любому основанию, если только она устроена так же, как десятичная (в частности, во всяких экзотических системах с отрицательными цифрами и прочим в таком духе это правило может не работать, но мы вроде таких систем не рассматриваем). В том числе и в двоичной.
Далее, в системе счисления по любому основанию B запись числа вида B^k-1 (т.е. берём основание системы, возводим в k-ю степень, вычитаем единичку) будет состоять из k максимальных цифр. Например, в десятичной системе максимальная цифра -- девятка, соответсвующие числа будут 9, 99, 999, 9999 и т.д., например 10 возвести в шестую и вычесть один будет, натурально, шесть девяток.
А вот теперь, собственно, особенность именно двоичной системы. Максимальная цифра тут -- единица. Так что два в k-й степени и вычесть единицу -- это прямо-таки k единиц. Вот прямо такая маска, которая нам нужна, чтобы выделить k младших разрядов, т.е. k младших цифр числа, которые, как мы уже разобрались, и есть остаток от деления на два а k-й степени.
Уж не знаю, насколько это "математически" :-)
Теперь понял.
Теперь понял. Огромное вам спасибо!
Здравствуйте!
Здравствуйте! Очень заинтересовал ваш трехтомник ("Программирование: введение в профессию"). Вопрос: можно ли начать восьмикласснику его читать?
Странная постановка вопроса
С одной стороны, я в целом не вижу, почему восьмикласснику может быть "нельзя" что-то читать. Если восьмикласснику не понравится, он чтение сам бросит. Возможно, позже вернётся. Единственное, что тут реально "нельзя" -- это заставлять; попытаетесь заставить (или уговорить, или "убедить", в общем любой вариант, при котором условный обучаемый книжку читает не потому, что хочет сам, а потому что "надо") -- получите ненависть к предмету, и уж точно не будет никакого толка. Мои книжки написаны в расчёте на читателя, которому интересно и который хочет это всё освоить. Сам хочет, а не кто-то "его хочет". Но здесь есть беспроигрышный вариант -- подсуньте ему первый том, станет читать -- хорошо, не станет -- значит, не надо.
С другой стороны, вам тогда надлежить быть готовыми к обеспечению материальной базы. Вряд ли обычный восьмиклассник (если только это не совсем особый случай) самостоятельно поставит на компьютер Linux. Ну а без этого мои книжки, опять-таки, бесполезны.
Простите, неправильно объяснился
Простите, неправильно объяснился; я (восьмиклассник) смог поставить linux. Сижу на нем уже как 3 месяца, но со стороны родителей и друзей идет некое "давление", мол в 21 веке нечего делать на Unix-системах ("скачай delphi и делай программы под windows, консольный интерфейс - никуда не годится"). Поэтому и был вопрос, можно ли начать изучение программирования с этих книг в этот период (может, еще рановато). Определенно, к книгам я вернусь; хотел узнать вашего мнения по этому поводу.
но со стороны
но со стороны родителей и друзей идет некое "давление"
Держитесь!
Я не говорю "никого не слушайте", но слушая кого-либо, всегда подвергайте услышанное сомнению и дальнейшему критическому осмыслению.
Даже собственные устоявшиеся взгляды или воспоминания следует регулярно подвергать сомнению и критическому анализу, чего уж там.
Но уж если, поразмыслив, приходите к выводу, что вы не ошибаетесь, то действуйте без оглядки на назойливых советчиков!
Вас понял,
Вас понял, спасибо за совет!
> Сижу на нем
> Сижу на нем уже как 3 месяца, но со стороны родителей и друзей идет некое "давление", мол в 21 веке нечего делать на Unix-системах
Сколько эти Ваши друзья и родители (при всем уважении к именно родителям) понимают из того, что советуют? Вопрос, наверное риторический, так что поступайте, как сам сочтете нужным
Отец (по
Отец (по профессии - инжинер) в юности делал программы на Delphi, говорит зарабатывал (сам я пока не преследую таких целей, да и опыта нет). По его мнению, бесплатный Linux никому не сдался, ведь большая часть сидит на винде; + по книгам программированию не учатся (бери язык и гугли проблемы).
Я знаю, что просто читать книги - бессмысленно, поэтому тренеруюсь;
В итоге, отцу не нравится интерфейс программы (а где нормальное ОКНО?).
<бери язык и
<бери язык и гугли проблемы>
С таким подходом будет специалист уровня "знаю, когда какие кнопки нажимать"
> ...бесплатный
> ...бесплатный Linux никому не сдался, ведь большая часть сидит на винде...
Сервера в мире в основном работают на именно что бесплатном Линуксе. Так что уже по этой одной причине утверждение о том, что мол бесплатный Линукс никому не нужен - не верно в корне. Да и, кроме серверов, в мире - миллионы пользвателей Линукса на десктопах. И не зря: на десктопах Линукс - также превосходит винду. Так что, это - как раз тот случай, когда бесплатный Линукс - лучше платной винды. Но среди людей бытует заблуждение, что платность винды каким-то образом делает ее лучше бесплатного Линукса. И это - одна из причин, по которой люди не спешат для себя открывать Линукс (другая - Виндовс тупо насаждается пользователям компов начиная со школьного возвраста).
Кстати, the majority
Кстати, the majority is always wrong. Конкретно в применении к инфотехнологиям -- обсуждалось тут http://stolyarov.info/guestbook/archive/2#comment-1896 А так вообще рекомендую фразу "the majority is always wrong" забить в поисковик.
Хотя, конечно,
Хотя, конечно, если брать утверждение "большинство всегда ошибается" без оговорок, то его легко довести до абсурда. Например, большинство людей ходят на двух ногах или одеваются, когда им холодно.
PS. Если что, это я оставлял ссылку на Юдковского тут два года назад. Надо бы уже зарегистрироваться, что ли...
Насчёт двух ног
Насчёт двух ног и одеваться, когда холодно — это от мнения не зависит, и от чьей-то правоты тоже, просто иначе не получается. Вот если бы было где-нибудь сообщество людей, которые ходят как-то иначе и утверждают, что это удобнее, чем на двух ногах, или которые нашли альтернативу одежде и вообще никогда не одеваются, и тоже говорят, что так удобнее — то, возможно, тут стоило бы задуматься.
Насчёт одежды
Насчёт одежды не знаю, но точно есть сообщество людей, которые ходят повсюду босиком и утверждают, что так удобнее.
Мне кажется,
Мне кажется, что правило «Majority is always wrong» имеет исключения, то есть всё-таки не всегда большинство не право.
Оно действует если у альтернативы есть какое-то более-менее значительное число последователей. Если же их какие-то сотые или тысячные доли процента или меньше, то их альтернатива не обязательно лучше.
В принципе, это понятно из рассуждения из которого выведено это правило — какая-то небольшая группа людей могут предпочесть альтернативу не потому что она чем-то лучше, а из-за общей глупости.
Вообще говоря,
Вообще говоря, фраза представляет собой литературный приём, известный как "гипербола". То есть да, имеет место (если совсем формально к делу подходить) некое небольшое преувеличение. Ну так мы тут не матлогом занимаемся вроде.
И они в
И они в принципе правы. Если бы я плевал на общественные нормы, холодную погоду и грязные улицы, я бы ходил босиком.
Я вполне
Я вполне допускаю, что они правы.
"Допускаю, что
"Допускаю, что они правы" -- это не совсем тот вывод, который логически вытекает из тезиса "the majority is always wrong". Правильным выводом, если уж мы приняли этот тезис, будет то, что я или вы, находясь в том большинстве, которое носит обувь, заведомо и однозначно ошибаемся.
Мне почему-то
Мне почему-то кажется, что всё проще: не всякую фразу следует рассматривать как формальное утверждение. Кроме формальных утверждений, бывают ещё литературные приёмы. А среди них есть такая штука "гипербола".
Но вот что касается конкретно отказа от обуви, то тут сторонники такого варианта могут реально быть правы. Дискомфорт от отсутствия обуви довольно быстро преодолевается, дальше на подошвах нарастает слой ороговевшей кожи, имеющей такую толщину, что обувь становится реально не нужна. При этом убирается масса проблем медицинского характера.
Только не надо задавать вопрос, чего же это я тогда за ними не последовал. Вот, скажем, сторонники ЗОЖ правы вообще без вариантов, видел я, какие они здоровые :-) но лично мне, увы, силы воли не хватит отказаться от бОльшей части привычной еды и ежедневно круглый год тратить минимум полтора-два часа на физические нагрузки. Да и на DVORAK я не перешёл и вряд ли перейду, это же не один месяц переучиваться надо.
Dvorak
Кстати, если посмотреть на Dvorak, то будет очевидно, что на ней исключительно неудобно набирать команду
ls
, а уж сls -l
и вовсе какое-то извращение получается.Вот прям как
Вот прям как будто сейчас (в смысле на qwerty) удобно набирать cd.
cd на qwerty
cd на qwerty неудобно набирать, серьёзно? У меня (в силу привычек) при работе с клавиатурой пальцы левой руки почти всегда находятся в районе клавиш wasd, cd набирается указательным и средним почти мгновенно.
Дык это, по
Дык это, по канонам слепой печати их обе нужно набирать средним, вот в чём проблема :-) Так-то я и сам их указательным и средним набираю, и в таком виде никаких неудобств это не доставляет.
cd на qwerty таки не
cd на qwerty таки не настолько неудобно.
На colemak'е, кстати, и ls, и cd вполне удобно набираются. Была у меня мысль, что dvorak, с его принципом чредования рук, лучше чем colemak. Но вот, видимо, для привычной работы в юниксовой консоли всё-таки не лучше.
Да и на DVORAK я не
Да и на DVORAK я не перешёл и вряд ли перейду, это же не один месяц переучиваться надо.
Я, когда решил перейти с qwerty на colemak, тоже готовился несколько месяцев страдать. А на самом деле через пару недель уже не испытывал особого дискомфорта.
Меня даже
Меня даже больше не переход пугает, а то, что на остальных компах не моя раскладка будет. Я и так торможу постоянно, а тут еще и мозги на старую раскладку возвращать.
Мозги -- очень
Мозги -- очень мощная и гибкая штука. По отзывам людей, умеющих печатать вслепую и на qwerty, и на какой-нибудь более приличной раскладке, полное переключение раскладки в мозге у них происходит максимум через несколько минут после начала печати. (Думаю, не нужно говорить, что переходить на альтернативную раскладку, но не использовать на ней touch typing, никакого смысла не имеет.)
Ну и вовсе не проблема включить нужную раскладку на компе, на котором предполагается работать дольше пяти минут или чаще раза в месяц. (А уж если регулярно, то и не только раскладку. На таком компе неплохо бы завести собственный аккаунт с привычными настройками.) Реальная проблема с раскладками, наверное, будет только у офисного эникейщика.
Меня даже больше не переход пугает, а то, что на остальных компах не моя раскладка будет.
А вообще, конечно, это вот "меня пугает, что у меня будет не как у всех" -- один из основных тормозов прогресса.
Это, как ни
Это, как ни странно, может даже не быть проблемой. Когда я учился на первом курсе (давно дело было), в какой-то момент приходилось работать с тремя (!) разными раскладками латиницы, причём бывало так, что в один день приходилось потрогать все три, и ничего, как-то выжил. Правда, я тогда всё-таки на клавиатуру смотрел.
Я на 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
Интересно
Несколько месяцев назад, у меня в голове появилась мысль -- что угодно популярное не может быть лучшим из своих альтернатив. Тогда она мне показалась глупой, но сейчас я начинаю убеждаться в ее правоте.
Ага, конечно
Действительность устроена с точностью до наоборот; если что, программисты, умеющие *nix, ценятся раза в три выше чисто по размеру зарплаты, для дельфиста сейчас 100тыр потолок, а когда в резюме имеет место, например, сочетание Linux, C++ и Qt, это запросто может быть и 350, и выше (лично я Qt люто ненавижу, как и всех монстров, но реальности это не меняет). Принципиальная разница между такими людьми в том, что вот этот вот спец по Linux, C++ и Qt, если припрёт, за дельфи сядет и всё, что надо, сваяет, потратив от силы пару дней на "освоиться", а вот в обратную сторону переход, как мы понимаем, практически нереален.
Ну а ваш отец, как мы понимаем, не программист (это ладно) и не обладает знаниями в области usability, это в данном случае намного хуже, иначе он знал бы, что оконные интерфейсы, в особенности иерархические — это такие специальные пожиратели человеческого времени и энергии.
За вас вашу жизнь никто не проживёт, стройте её сами.
А, ну тогда
А, ну тогда вообще никаких вариантов — книги читать можно, а если они вам ещё и нравятся — то, я бы сказал, даже нужно. Именно для таких, как вы, эти книги и написаны. А юный возраст — это такой недостаток, который очень быстро проходит.
Что до интерфейсов — то это как раз графические интерфейсы никуда не годятся, и в книге написано, почему. На всякий случай добавлю, что видел своими глазами, как людей брали на работу на неплохие (для них на тот момент) деньги только лишь за то, что они могли справиться с командной строкой. Человек, знающий *nix-системы и умеющий с ними обращаться, справится с чем угодно, а вот люди, уверенные, что "знают" Windows, очень часто не могут справиться и с Windows тоже, про другие системы и говорить нечего. А от Unix на самом деле сейчас совершенно некуда деваться, серверные машины, обслуживающие Интернет — это практически всегда тот или иной Unix, и когда персонаж, позиционирующий себя как "крутой айтишник", приходит в ужас и впадает в ступор от необходимости что-то сделать удалённо с серверной машиной — это было бы смешно, когда бы не было так грустно.
Так что могу только пожелать успехов. Будут вопросы — заходите сюда и задавайте :-)
Куда выкладывать программы
Снова я. Хотел уточнить, куда именно можно выкладывать свои работы (исходный код + откомпилированная программа)? Может какой сайт для этого есть?
Github? Или пока в облачном хранилище (по типу Google disk) размещать, потом кому-нибудь скинуть на него ссылку?
А с какой целью
А с какой целью вы их хотите выкладывать? Вы уже сделали что-то такое, что для других пользователей может представлять ценность? Если так, то стоит, наверное, завести свой сайт.
По поводу Google Drive, Yandex Disk и прочих подобных "файлопомоек" — ну кто как, а лично я на них принципиально не хожу. Google Drive у меня вообще заблокирован на домашнем роутере вместе с Google Docs, чтобы не попасть туда даже случайно.
Понял, спасибо)
Понял, спасибо)
А чем в этом
А чем в этом вопросе взрослый, но никогда линукса не видевший отличается от восьмиклассника?
Мне кажется, я бы поставил, если бы мне предоставили диск с линуксом и мануал на русском, где написано что и как и какие команды что значат. Но на самом деле нет, так как я вообще не знал где взять диск с ОС в то время. Вот дисков с играми для приставок, компа, музыкой, фильмами было полно — на каждом углу, а вот почему-то диск с линуксом первый я добыл только на заказ, в три раза дороже чем если бы он был с виндой и к тому же, как оказалось, устаревшей на 5 лет версии. Но сейчас-то с этим легче, не нужно искать именно с линуксом, достаточно любую флешку купить и скачать любой дистр по широкополосному инету за 20 минут.
диск с линуксом
диск с линуксом первый я добыл только на заказ, в три раза дороже чем если бы он был с виндой и к тому же, как оказалось, устаревшей на 5 лет версии.
В конце 90-х (когда дисков с игрушками, музыкой и софтом было на каждом углу) я заказывал себе дебиан по почте, если мне не изменяет память, совершенно бесплатно. Отчётливо помню, что распаковав тощую бандерольку, увидел вдребезги разбитую коробочку для диска (как раз в том месте, в котором почтовые бабушки-молотобойцы поставили на бандерольку сургучную печать), но сам диск уцелел.
А чуть позже в местном гнезде линуксоидов (они гнездились на центральном узле телефонной связи тогда у нас) мне "нарезали" (записали на CD, согласно тогдашнему жаргону) очередную свежую версию дебиана. А я в благодарность поставил им литровую пачку сока, по фидошной традиции.
А ещё позже, вроде бы, убунту рассылали по почте тоже безвозмездно, то есть даром.
>мануал на
>мануал на русском
"Это все фигня на самом деле" (с)
Я, десятиклассник возился с арчем и несчастной его вики, но вечно возникает проблема отсутствия опыта ПК, когда ты в принципе не знаешь некоторых элементарных знаний о ПК.
И таки да, научился я по роликам на ютубе, смотря как другие делают, а к вики обращался только для уточнения.
Вообще, имхо, идеальный способ -- поставить Devuan (netinstall) без DE, поставить иксы, i3wm и терминальчик по вкусу. Это все крайне просто, при этом не ставится ничего лишнего.
Вообще, имхо,
Вообще, имхо, идеальный способ -- поставить Devuan (netinstall) без DE, поставить иксы, i3wm и терминальчик по вкусу. Это все крайне просто, при этом не ставится ничего лишнего.
-------------------------------------------------------
Самому начинающему ничего более Минта/Убунту/MX Linux, например, не надо для создания соответствуюущей операционной среды, чтоб изучать программирование по книгам уважаемого автора сайта! На первых шагах пугать людей не надо!
А чтоб не было проблем с установкой дистра типо Арч, да, пригодится знать заранее некоторые вещи. Есть бесплатная книжка от Пола Коббаута: она так же состоит из несколько частей. Так вот в ней Вы и любой другой желающий найдет те базовые вещи, которые очень упростили бы лично Вам установку того же Арча.
>Самому
>Самому начинающему ничего более Минта/Убунту/MX Linux, например, не надо для создания соответствуюущей операционной среды, чтоб изучать программирование по книгам уважаемого автора сайта! На первых шагах пугать людей не надо!
Да я не спорю, но потом-то надо привыкать к нормальному.
>Да я не спорю,
>Да я не спорю, но потом-то надо привыкать к нормальному.
Ну это уже будет зависить от каждого конкретного человек.
Slackware
Начинающему наоборот лучше поставить побольше всего, чтобы было что изучать. Я бы предложил full install Slackware, тем более что как раз 15-й релиз заморозили.
А там есть несколько DE и оконных менеджеров на выбор.
Когда-то очень
Когда-то очень давно, в 1994 году, Slackware стала моей первой Linux-дистрибуцией (да, блин, ставил с дискет! да!) Но тогда и железо было попроще, и в соседней лабе присутствовал линуксовый гуру, периодически выдававший мне пинка в нужном направлении. Сейчас, я бы сказал, Slackware — это по-прежнему один из лучших дистров, но всё-таки не для новичка, да ещё восьмиклассника.
А выбор из нескольких DE и оконных менеджеров, насколько я вижу, есть практически везде.
> А выбор из
> А выбор из нескольких DE и оконных менеджеров, насколько я вижу, есть практически везде.
Да, но обычно ставится один, например третий гном, и для других надо специально их ставить.
> Но тогда и железо было попроще, и в соседней лабе присутствовал линуксовый гуру, периодически выдававший мне пинка в нужном направлении.
Ну да, гуру не помешает на первых порах. Но насчёт железа — оно конечно было попроще, но установка и настройка железа была сложнее. Сейчас например иксы в 95% случаев просто запустятся в нужном разрешении и с 3D-ускорением по команде startx без всяких modeline-в в xorg.conf. Никаких IRQ не нужно настраивать (а я даже толком не знаю что это такое), всё автоматом.
> но всё-таки не для новичка, да ещё восьмиклассника.
Ну не знаю. Не сложнее Debian с netinstall, а на мой взгляд даже намного проще. Единственная сложность — разметка диска, но она в любом дистрибутиве есть. На мой взгляд, размечать диск отдельно от установки с помощью fdisk, cfdisk или parted куда удобнее.
Ну и да, надо по-английски уметь читать.
"Специально
"Специально ставить" — это обычно одна команда.
Вообще если уж залезли так глубоко, попробуйте сразу сползти с 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-дистров проблемы те же — пакетов мало.
Я вот одного не
Я вот одного не понял, а кто вам мешает в дебиане снести ко всем чертям NetworkManager и редактировать /etc/wpa_supplicant.conf руками? Я, в общем, так и делаю, с той разницей, что у меня Devuan.
А чёрт знает,
А чёрт знает, может, и ничем не отличается. Я не так много общаюсь с восьмиклассниками.
том 1, 416-417
Довольно короткий код разорван на две страницы. Это не очень красиво.
При имеющемся
При имеющемся объёме книги выловить все подобные ситуации нереально. Окружение verbatim — штука особая и всяким clubpenalty/widowpenalty не подчиняется.
rust
Очень интересно узнать мнение автора о ЯП rust. Стоит ли на него время тратить или C++ он не заменит?
Ничего он не
Ничего он не заменит и вообще ни на что не годен, только мозги изуродуете.
Rust вроде сейчас
Rust вроде сейчас активно продвигают и даже внедряют как ЯП для разработки ядра Linux наряду с C?
Не "продвигают",
Не "продвигают", а конкретно гугл продвигает. Одновременно прогрессивная общественность гадает, чего это Торвальдс молчит и сколько ему за это заплатили, и готовится отступать на заранее подготовленные позиции в виде 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. То есть не вижу никакого противоречия.
Никаких
Никаких "дырявых индексаций". Я вообще в этой области не бог весть какой спец, но множество алгоритмов относится не просто к счётным, а к рекурсивно перечислимым, что заведомо означает разрешимость задачи о вычислении номера заданного алгоритма — в смысле, существует такое ВЗАИМНО ОДНОЗНАЧНОЕ (!) соответствие между натуральными числами и алгоритмами, что по любому алгоритму можно установить его номер. Например, тупо запустив ту "рекурсивную перечислялку", из-за которой алгоритмы рекурсивно перечислимы, и дождаться, пока она выплюнет нужный алгоритм, одновременно пересчитав все, которые она успеет выплюнуть до него. Ждать, конечно, придётся долго, но в ЭТОЙ части теории "долго ждать" никого не смущает.
Про перечислимые множества, например, тут:
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 тут непричём.
Вообще, ещё раз
Вообще, ещё раз повторю, вы тут неудачно выбрали, кому вопросы задавать. Одна фактическая ошибка в книге, конечно, есть: сказано, что вычислимых функций счётное множество, следовательно есть конструктивная нумерация; это неверно, поскольку не всякое счётное множество перечислимо, так что нужно добавить немножечко подробностей. Но дело в том, что суть от этого не изменится, поскольку любой конструктивно заданный класс/подкласс вычислимых функций будет перечислимым.
Кратко говоря, что такое вычислимые функции — неизвестно, но есть тезис Чёрча, предполагающий, что класс вычислимых совпадает с классом частично рекурсивных, а эти последние строятся через суперпозицию нескольких крайне простых операций и операторов (операторы в данном случае из одних функций делают другие). Поскольку базовых операций там меньше чем пальцев на руках (впрочем, это пофигу, достаточно того факта, что их конечное число), очевидным образом можно выстроить дерево всех возможных Ч/Р-функций и в этом дереве ввести некую нумерацию, а дальше запустить алгоритм, который это дерево будет обходить и, зайдя в очередную вершину, выплёвывать соответствующую формулу. Это ваше "индексирование" на базе такого алгоритма строится очевидным образом: функцию по номеру получаем, запустив алгоритм и проигнорировав первые N функций, а обратную операцию -- номер по функции (!) -- получаем, запустив алгоритм и дождавшись, пока он выплюнет нужную функцию. Ещё раз: да, практического смысла эти построения не имеют, поскольку для любой мало-мальски интересной с практической точки зрения функции ждать придётся, вероятно, не один миллион лет, но здесь (в теории вычислимости) такие мелочи никого не беспокоят. Так вот, точно так же будет обстоять дело и с гипотетической последовательностью всюду определённых функций, которые хочется "подставить" вместо Ч/Р в роли модели вычислимой функции, чтобы не было всей этой "фигни" с частичной неопределённостью: если мы что-то конструктивно делаем, то у нас есть вычислитель, на котором мы это делаем, а у него -- базовый набор операций, далее см. выше.
Кстати, чего я с ходу не знаю — так это как соотносится класс примитивно-рекурсивных функций к классом функций всюду определённых. Это к специалистам.
Вообще там в сноске упоминается книга В.Босса, из которой я, собственно, и взял эту последовательность f_n и прибавление единички. Подозреваю, что если вас этот предмет столь сильно интересует, стоит обратиться хотя бы к этой книжке, пусть даже она скорее из категории научпоп, чем из числа "совсем серьёзных", но уж я-то в своей книге реально рассказать теорию вычислимости даже не пытался, я сам её толком не знаю, это довольно глухая и зубодробительная математика.
Кажется понял
Кажется понял.
Вы как раз и пытаетесь доказать, что перечислить все вычислимые всюду определенные функции невозможно, потому что если бы это удалось сделать, то получилась бы фигня с g( ). А раз их нельзя перечислить, значит и придумать формальную модель, которая их описывает, нельзя, потому что, если бы такая модель была, то их можно было бы перечислить.
Значит, формальная модель вычислимых функций обязана содержать в себе глючные (не везде определенные, зависающие и тд) алгоритмы/функции, иначе простым прибавлением единицы и индексацией можно будет выйти за пределы этой модели.
Чем-то это мне теорему Гёделя напоминает. Вроде как система аксиом не может быть одновременно полна и непротиворечива.
А тут получается, что формальная модель вычислимых функций не может быть одновременно полной, то есть содержать все полностью определенные функции, и при этом непротиворечивой.
Машина Тьюринга и вычислимость
> вы тут неудачно выбрали, кому вопросы задавать.
Может быть. Я, честно говоря, эту главу из книги хоть и прочитал, но ощущения понимания у меня не возникло. Если не вдумываться, то вроде понятно, что в общем случае нельзя проверить, зависает программа или не зависает, что есть какие-то что-то-там рекурсивные функции, которые как-то связаны с лямбда-исчислением и эквивалентны машине Тьюринга и машине Поста, а так же алгорифмам Маркова и представляют на настоящий момент теоретический максимум того, что можно вычислить с помощью физического устройства... А тезис Чёрча-Тьюринга состоит в том, что ничего круче придумать нельзя, но он не доказан.
А если задуматься — вообще не понятно... Если это не будет наглостью, то у меня возникло впечатление что эту главу стоило бы вообще переписать как-то по-другому. А то для того, кто и так это всё понимает, глава бесполезна, а для того кто в первый раз читает — что-то понять сверх описанного мной выше из неё толком не выйдет.
> очевидным образом можно выстроить дерево всех возможных Ч/Р-функций и в этом дереве ввести некую нумерацию
Не, это-то мне и раньше было понятно. Но вы же обходите вообще все ч/р-функции, так? А нам требуются не все, а только те, которые определены на всём N.
То есть, вашему алгоритму нужно добавить проверку: если функция определена на всём множестве N, значит добавить её в индекс, а если есть натуральные числа, для которых она не определена — не добавлять. Так?
Вот с этой проверкой как раз у меня и затык — а не будет ли она эквивалентна той самой программе, S( ) из проблемы останова?
>Так вот, точно так же будет обстоять дело и с гипотетической последовательностью всюду определённых функций, которые хочется "подставить" вместо Ч/Р в роли модели вычислимой функции, чтобы не было всей этой "фигни" с частичной неопределённостью: если мы что-то конструктивно делаем, то у нас есть вычислитель, на котором мы это делаем, а у него -- базовый набор операций, далее см. выше.
Выше-то понятно всё. А вот это — нет. С чего вы взяли, что вычислитель, который позволяет вычислить все те и только те Ч/Р функции, которые определены на всём N в принципе можно конструктивно описать?
А если новый вычислитель не описывать, а взять скажем МТ или МП или ещё что-то такое, то нам при индексации нужно отфильтровать зависающие программы от независающих. Понятно что зависающие при хотя бы одном значении входного аргумента в индекс включать нельзя. А отфильтровать не получится из-за проблемы останова.
Надеюсь, теперь понятнее стало, в каком конкретно месте затык?
> Подозреваю, что если вас этот предмет столь сильно интересует, стоит обратиться хотя бы к этой книжке
На самом деле не настолько. Как писать программы мне вроде и без этого понятно.
Или всё-таки надо разбираться? Насколько это важно?
----
Кстати про факториал одно из ваших объяснений мне показалось непонятным. Зато я предлагаю другой вывод формулы, который, по-моему, получше:
Предположим у нас уже расставлено (k-1) объектов и мы добавляем k-й. Добавить его можно перед первым элементом (в самое начало), перед вторым, перед третьим, перед (k-1)-м и после (k-1)-го, то есть всего k возможных позиций. И каждую эту позицию можно применить к любой перестановке (k-1) элементов, то есть
k!=k*(k-1)!
. Ну а один объект, понятное дело, можно расставить только одним способом.Вообще я весь
Вообще я весь сыр-бор с этой главой затеял ради одной простой цели: донести до читателя, что определения алгоритма не существует и существовать не может. Ну вот просто достали меня авторы учебников, пытающиеся друг дружку перещеголять такими "определениями". Систематически излагать теорию алгоритмов и теорию вычислимости я не планировал и не планирую, я же говорю — я в этой области сам плаваю.
То есть, вашему алгоритму нужно добавить проверку: если функция определена на всём множестве N, значит добавить её в индекс, а если есть натуральные числа, для которых она не определена — не добавлять. Так?
Насколько я понимаю, нигде и не утверждается, что с такими функциями можно работать.
Вот с этой проверкой как раз у меня и затык — а не будет ли она эквивалентна той самой программе, S( ) из проблемы останова?
Такая программа, по крайней мере, невозможна — и да, это доказывается именно через проблему останова, ибо уж если на отдельно взятом входном слове нельзя предсказать, остановится алгоритм или нет, то сказать, применим ли он ко всем возможным входным словам, тем более нельзя. А вот "эквивалентны" ли проблемы — сказать не могу, не знаю. Вполне возможно, что проблема "применимости ко всем словам" в каком-нибудь смысле "ещё хуже", чем проблема останова.
С чего вы взяли, что вычислитель, который позволяет вычислить все те и только те Ч/Р функции, которые определены на всём N в принципе можно конструктивно описать?
Вроде как раз и доказывается, что нельзя.
По ссылке или значению?
Здравствуйте, читая 145 страницу третьего тома (о переопределении операции присваивания), наткнулся на примеры для класса Complex.
Здесь в параметрах метода вы используете константную ссылку для операнда:
На этой же странице, ниже, вы уточняете, что то же (переопределение) можно сделать и с операциями для других типов:
Но на этот раз вы передаёте в функцию параметр по значению, почему? Есть же возможность сделать его константной ссылкой, чтобы избежать копирования (как в предыдущих двух случаях), или я что-то упускаю?
Здесь стоит
Здесь стоит применить здравый смысл. Если примерно прикинуть, как всё это работает на уровне машинных команд (а именно для этого в первом томе имеется часть про программирование на языке ассемблера) и не забывать, что ссылка — это вовсе не пустое место, а аж целый адрес, то можно заметить, что накладные расходы даже на копирование 16-байтной структуры (то есть всего объекта типа Complex) могут оказаться меньше, чем косвенные обращения по адресу (в данном случае по ссылке) внутри тела функции. Что касается типа double, то на современных (читай — 64-битных) машинах он и вовсе занимает столько же места, сколько адрес, так что экономии не будет вообще никакой, при этом потери на передаче по ссылке — будут. Кроме того, стоит учесть, что компилятор эти методы, естественно, заинлайнит, и прикинуть, что и как с этим сможет сделать оптимизатор; ощущение такое, что при передаче double по значению в итоговом коде вообще получится один mov, тогда как по ссылке — может, и получится, но не факт; я не проверял, просто понимаю, что такая оптимизация сложнее.
В случае
В случае инлайнинга и оптимизаций компиляторы получат одинаковый код для передачи и по ссылке, и по значению. Как ни странно, подобная оптимизация при современном устройстве компиляторов происходит "сама собой" как побочный эффект построения SSA формы и устранения промежуточных копий.
Уточнение по практике на языке assembler'a (NASM)
Читаю первый том, часть по языку assembler. На странице 656 сказано, что программы для практического применения лучше писать на языке Си. Есть ли смысл писать большие программы (такие как "Задача о ханойской башне", "Сопоставление с образцом") на NASM? Или достаточно посмотреть как работает та или иная команда и потом перейти ко второму тому?
Минуточку, это
Минуточку, это вы задачу о ханойских башнях называете "большой программой"?!
Если так, вернитесь к части о Паскале и даже не думайте о том, чтоб двигаться дальше, пока у ваших программ (написанных на Паскале) не появятся сторонние пользователи. Тогда, надеюсь, вы поймёте (хотя бы примерно), что такое "программа" -- даже не "большая программа", до этого вам ещё далеко, а именно что просто "программа".
Задачи, перечисленные вами, вообще невозможно называть программами, тем более "большими", это не программы, а этюды. Ну а если вернуться к вашему исходному вопросу, то (как это, замечу, явным образом сказано в книге, и не один раз) период обучения — это единственный шанс получить опыт работы с языком ассемблера, ну а при отсутствии опыта программирования на языке ассемблера хороших программистов пока что ни из кого не получалось. Посему вот это ваше "посмотреть как работает та или иная команда" — ну, проще тогда вообще выкинуть мои книжки, взять какое-нибудь очередное "питон для чайников" и через полгода пополнить ряды безмозглых обезьян-кнопкодавов. Мои книги на такой подход не рассчитаны, как и на таких читателей.
Применение термина "память"
Здравствуйте, Андрей Викторович,
Во втором издании на странице 281 есть сноска под номером 6. В ней обсуждается противоречивость использования термина "память" в тексте выше. Непосредственно в тексте сноски утверждается, что памятью следует называть лишь те ЗУ, с которыми ЦП может работать "через шину без применения контроллеров".
Однако, насколько мне известно, с любым ЗУ ЦП общается именно через контроллер, и device path любого диска на шине на самом деле - путь до контроллера этого устройства. Наоборот, контроллеры могут общаться без процессора, если поддерживают DMA :)
Буду рад получить Ваш ответ и огромное спасибо за книги.
> с любым ЗУ ЦП
> противоречивость
там нет никакой противоречивости
> с любым ЗУ ЦП общается именно через контроллер,
Плюньте в глаза тому, кто вам сказал такую ахинею. Оперативная память, она же "оперативное запоминающее устройство", т.е. ОЗУ, по-английски RAM (random access memory) — разумеется, никаких контроллеров не требует и не может их требовать. ПЗУ, собственно говоря, тоже (процессор их вообще обычно не различает).
> device path
этот термин к памяти никакого отношения не имеет, подобные штуки возникают исключительно у внешних устройств
> любого диска на шине
Ещё раз, и медленно: диски — не память. Сноска, собственно говоря, об этом.
Почему я об этом вообще заговорил
Разработка аппаратуры процессора идет обычно по двум направлениям - собственно, ядро (core) и все остальное (uncore, общепринятый профессиональный сленг, если позволите). Я даже перепроверил: по запросу вроде "chip die layout of a cpu" можно посмотреть "планировку" кристалла процессора. И на этой планировке почти всегда будут ядро/ядра, система кэшей и периферийный блок.
В периферийном блоке как раз и располагаются в том числе контроллеры памяти. Поэтому меня немного и смутил текст сноски. Контроллер памяти, в том числе DDR, не перестает быть контроллером, даже если он не отдельная микросхема.
P.S.
"Противоречивость" - не совсем подходящее слово, согласен
Если под
Если под контроллером понимать схему, которая подключена к шине, поддерживает порты ввода-вывода для управления (и через них управляется), а с другой своей стороны имеет железку, которой и рулит, то "контроллер памяти" — это не контроллер. А если это часть процессора — тем более. Не следует смешивать терминологию из разных предметных областей.
Внутреннее устройство процессора, тем паче многоядерного, в книге не рассматривается.
Влезу, с вашего
Влезу, с вашего позволения. Всё же без контроллера вообще голое процессорное ядро может работать только со статической памятью, как в старых компьютерах вроде Спектрума или какой-нибудь Амиги. То есть вот, натурально, микросхема с памятью на статических регистрах, организованной в виде одномерного массива, индексируемого числом, заданным на шине адреса. Хотим читать или писать - дергаем один из двух стробов, в ответ на это микросхема либо считывает значение с шины данных, либо выдаёт. Шины процессора и памяти соединяются напрямую, без посредников. В динамической же памяти, как минимум, адресное пространство нелинейное, требуется выставлять на шине адреса сначала индекс банка и строки в нем, делать строку активной, затем выставлять индекс столбца, периодически обновлять содержимое, т.к. ячейки постепенно теряют заряд, при этом запрещать доступ к памяти либо переключать банк, засылать в микросхему служебные команды типа PRECHARGE или REFRESH, etc. Это уж точно не забота ядра, у него шины адреса и данных в "классическом" смысле, которые подключается именно к контроллеру, преобразующему запросы к себе как к памяти в команды оперативке и выдающему в обратную сторону данные (опять же, ядро вообще не при делах, для него это работа со статической памятью - выставили адрес, прочитали/записали). Другое дело, что это контроллер специфический и шина, на которой он сидит, за пределы кристалла не выходит. Но, конечно, если строго ограничить определение контроллера по принципу "не висит на общей шине и не плюётся в порты - не контроллер", то да, можем считать, что работа с памятью идёт напрямую.
Сказанного
Сказанного мной всё это никак не отменяет и ему не противоречит. В книге под термином "контроллер" подразумевается вполне определённая сущность, никоим образом не находящаяся в процессоре. Вынужден повторить два момента:
1) тонкости взаимодействия процессора с памятью, как и внутреннее устройство процессора, в книге не рассматриваются вообще;
2) не следует смешивать терминологию из разных предметных областей.
У топик-стартера, если вы не заметили, в голове полнейший бардак, он к ОЗУ пытается device path применить, а вы тут про какое-то там ядро (процессора, гм...)
Сказанного
Сказанного мной всё это никак не отменяет и ему не противоречит
Я не собирался вступать в полемику - разумеется, противоречия нет. Комментарий, скорее, в догонку к ответу на вопрос топик-стартера, просто не очень люблю добавлять комментарии перед вашим, т.к. потом трудно найти начало обсуждения, если N-ое количество человек подключается к дискуссии.
Почему Tcl?
Здравствуйте.
В третьем томе есть раздел о Tcl. Я пытался найти в вашей книге объяснение, почему именно он, а не Python, Perl? Какие у него есть преимущества?
Python, Perl, Ruby, даже
Python, Perl, Ruby, даже Lua (хотя, возможно, в меньшей степени) — это безобразно раздутые монстры, напрочь лишённые внутренней логики, и, самое главное, сделанные без понимания границ скриптового программирования.
На текущий момент Tcl — единственный из виденных мной из командно-скриптовых языков, который не вызывает у меня жёсткого отвращения, скорее даже наоборот — он кажется мне на удивление красиво спроектированным. А ещё его автор изначально не предполагал НЕскриптового использования Tcl и был крайне удивлён тем, что кто-то стал на Tcl писать программы заметного размера.
Кстати, об этом в книжке написано — в части, посвящённой скриптингу.
shell
том 1 стр 81 конструкция с фигурными скобками не работает
работает с круглыми скобками
П.С. Сравнение лучше делать двумя знаками равно ==, один знак равно это присваивание.
Для начала не
Для начала не надо путать скрипты на shell'е с Си и его наследниками, это совершенно разные языки; аналога сишной "операции присваивания" в скриптовых языках нет, так что знак равенства использовать можно и нужно (а двойное равенство в команде test поддерживается только для тех, у кого Си выжжен прямо на коре головного мозга).
А что не работает — ну да, там точка с запятой пропущена перед фигурной скобкой, должно быть так:
С круглыми, кстати, работать не будет — точнее, синтаксически оно корректно, но скрипт не завершит, поскольку круглые скобки — это subshell, вот его exit и завалит, а родитель (сам скрипт) останется.
sparse_t.cpp
Здравствуйте. В примере программы шаблона класса разреженного массива, переопределенные операторы инкремента оставлены "не шаблонными", то есть в строках 121-122 и 131-132:
int& location = Provide();
int res = ++location;
вместо "T" оставлен "int". Это сделано намеренно? Я понимаю, что для некоторых типов операция инкремента может быть не определена, но из-за этого программа не компилируется даже при использовании операции инкремента с инстанцированым типом double.
Вот не везёт же
Вот не везёт же этому примеру, а...
Нет, разумеется, это не было сделано намеренно, это эффект от преобразования обычного класса в шаблон. Ну и, увы, недостаточно серьёзного тестирования.
UPD: Выложил архив примеров с исправленным sparse_t.cpp. К счастью, в книжках (что в этой, что во "Введении в Си++") методы этого шаблона в тексте не воспроизводятся.
Про неизменяемые указатели
Если вам это понадобилось, свяжитесь с автором книги и расскажите, как вы дошли до такой жизни (речь о неизменяемых указателях из ¶4.3.15 второго тома)
Связываюсь, рассказываю :) В самом деле, для "больших компьютеров" с ходу предложить вариант использования такой конструкции довольно проблематично, но есть ведь еще и компьютеры поменьше — микроконтроллеры. Там имеет смысл использовать такие указатели для работы с регистрами отображенной в память периферии, они-то уж точно никуда не убегут и не сменят место жительства. Конечно, в стандартных заголовочниках адреса таких регистров чаще всего "дефайнят" в духе
и некоторые тащат в свой код подобные вещи. Но, например, возникает задача подключения к микроконтроллеру чего-либо с большим количеством ног - скажем, нескольких разрядов семисегментного индикатора без специализированного драйвера или внешней памяти (хотя для памяти, конечно, лучше взять специально заточенный под это дело контроллер). Хардкодить работу с индикатором, естественно, не с руки - завтра может понадобиться увеличить число разрядов или перейти с общего катода на общий анод. Разумнее использовать т.н. "виртуальные порты". Линия GPIO представляется в виде структуры с двумя полями - адресом регистра, запись в который приведет к изменению уровня на лапке МК, и собственно номера бита в регистре, за нее отвечающего. Порт - массив таких структур. Линии в ходе эксплуатации меняться не будут, поэтому логично снабдить указатели в этих структурах модификатором const и проинициализировать сразу в описании, т.е. получается конструкция в стиле (код под 32-битный контроллер, не пугайтесь)
А где-то в пользовательском коде крутятся
, "растаскивающие" или, наоборот, собирающие data по линиям порта.
Конечно, по памяти и скорости работы такой способ несколько проигрывает "захардкоженной" работе с линиями GPIO, но гораздо более гибкий: тот же семисегментник - это один восьмибитный порт на сегменты и один на общие линии разрядов; завтра нужно поменять схему его подключения - переписали инициализатор в одном месте. Если говорить об ARM Cortex-M, например (а это "сердце" подавляющего большинства современных контроллеров), то gcc-шный компилятор такие "константы" кладет во флеш-память без посторонней помощи (в отличие от AVR, кстати,
но кому они сейчас впилисьгде приходится извращаться с макросами из pgmspace.h); в оперативке они не хранятся, а пожертвовать сотней байт во флешке уже на контроллере с 8+ КБ ПЗУ ради удобства вполне можно.Не вполне
Не вполне понятно, почему не сделать "иначе":
Так никто,
Так никто, вроде, не запрещал, делайте "иначе" на здоровье, оба варианта вполне валидны. Другой вопрос, что адрес MMIO принципиально неизменяем, и в первом случае это его свойство явно закреплено за соответствующим типом; во втором - просто указан адрес области памяти, ответственность за неизменяемость которого где-то и когда-то возьмёт на себя какой-то код. Ну да о вкусах не спорят. Вот чего точно первому варианту не хватает, так это const vport в заголовках функций - "порты" по-любому будут описаны с const, и компилятор ругнется, что функции снимают этот модификатор. Здесь косяк, согласен, но пример был не о функциях.
Любое
Любое использование
const
это именно что "где-то и кто-то что-то имел в виду", а "принципиально неизменными" можно считать разве что константы вenum
. Отбросив полемику, пожалуй, остаются стилевые предпочтения: лично мне описание "неизменяемой" области памяти видаconst vport_line[] vport_name = { ... };
кажется более... идиоматичным?Вообще изначально речь была об использовании константных указателей, и я всего лишь хотел уточнить, что их использование для данной цели не является обязательным. Собственно, единственный (типичный) пример их использования, известный мне, это моделирование полиморфизма: константный указатель на таблицу функций или на (произвольного) владельца данных. Но даже в этом случае это далеко не единственный допустимый способ.
> кажется
> кажется более... идиоматичным?
ну кому как, мне оно кажется синтаксической ошибкой
Ёлки-палки const
Ёлки-палки
const vport_line vport_name[] = { ... };
Супер, спасибо :-)
Получил эстетическое наслаждение :-)
Может ли мое
Может ли мое непонимание большей части теории про перевод двоичный дробей в десятичные, кроме первого примера, и того, что такое область определения и область значений функции (со школы этого не помню) из части про двоичную логику повлиять на дальнейшее понимание материала и материала по программированию на Паскале? Могу ли я, если пока что мне это непонятно, пропустить вышеописанный материал, и освоить его позже, например, на практике, когда я с ним столкнусь? Или я все-таки обязан это освоить прямо сейчас?
В целом, почти весь материал про двоичную логику мне понятен, так как данный предмет был в колледже. Нужно только еще раз объяснить для себя "Это происходит так, потому что...". "Виды бесконечности" я на время пропущу и начну читать главу "Программы и данные".
Область
Область определения функции — множество значений, которые может принимать её аргумент (аргументы), область значений функции — множество значений, которые может принимать результат функции. Вроде просто же.
В такой
В такой формулировке это "просто" только для тех, кто знает, о чём идёт речь.
Может-может.
Может-может. Увы.
Ничего вы, впрочем, не обязаны, просто когда во что-то упрётесь, вернитесь к математической главе и попробуйте её осилить ещё раз.
Редактор
Здравствуйте, Я начал постигать emacs и уже более менее в нем ориентироваться, а потом начал читать вас и думаю, есть ли смысл пересаживаться на vim? Либо же вообще spacevim, у меня знакомый говорит, что выучи горячие клавиши емакса и потом можешь их в любую ide перенести и горя не знать
На вкус и цвет...
... все фломастеры разные.
Вот IDE лучше вообще не применять, ибо гадость. А vim или emacs — вопрос скорее религиозный :-)
Есть только один момент. Нужно уметь хотя бы базовые вещи делать в классическом vi (не в vim'е). Рано или поздно вы столкнётесь с ситуацией удалённого доступа к системе, в которой ничего другого не окажется, и лучше, если это не приведёт к полной беспомощности.
Вообще, в vi
Вообще, в vi который в busybox достаточно помнить в начале нажать i, а в конце Esc, :wq и всё. А в режиме редактирования работают стрелки и бекспейс, так что всё точно так же как в nano или notepad-е.
реализации разные бывают
В этой версии так, да. А в классическом 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": ее перевод правда выполнен не полностью, но тем не менее читать можно.
Бросьте нафиг
Бросьте нафиг старую редакцию, скачайте новую и читайте с того места, где остановились в старой. Естественно, новая намного лучше и правильнее.
А что до линукса и "user friendly", так не, Linux не дружит с пользователем. Linux подчиняется пользователю. И проявляет практически 100% лояльность к пользователю. Ну, конкретно для случая Убунты, может, не 100%, но близко.
А то, как винда с пользователем "дружит" — видали мы таких друзей, ага...
Иногда бывает,
Иногда бывает, что при последующих изданиях из книг что-нибудь убирается, иногда что-нибудь интересное/важное по тем или иным соображениям; в ситуации с вашими книгами это не так?
Вроде ничего не
Вроде ничего не убирал, по крайней мере во "Введении в профессию". Новое добавлял, параграфы местами переставлял и менял рубрикацию, материал перекидывал из одного места в другое, кое-что переделывал, но не выкидывал вроде бы ничего.
Пробелы в конце строк в stud_io_inc
В stud_io_inc, доступном по ссылке на этой странице, присутствуют пробельные символы в конце некоторых строк
$ curl -s http://www.stolyarov.info/books/extra/stud_io_inc | grep -c '\s$'
4
Спасибо
Вот чёрт, в архиве примеров поправил, а про эту копию забыл. Исправлено.
хочу учиться
Здравствуйте. Я полный ноль в этом деле, но мне безумно интересна эта сфера и хочу начать обучаться. Эти книги предназначены для таких людей как я? И был бы рад какому нибудь совету, для того кто делает первые шаги в эту сферу, от человека который проделал огромный путь.
Да, именно для
Да, именно для таких и предназначены.
Что до советов, то их, пожалуй, дам два: (1) прочитайте в первом томе "напутственное" предисловие (стр.39--43) и (2) установите Linux и переползите на него со всеми делами, которые вы делаете с помощью компьютера.
А 39 летнему с
А 39 летнему с нуля есть ли смысл их прочитать? Хотелось бы переучится на программиста.
Будет тяжело.
Будет тяжело. Но может и получиться, почему нет.
Только учтите, что это всё — на несколько лет. Сколько конкретно лет потребуется — зависит от индивидуальных особенностей, но меньше двух, по-моему, получиться не может принципиально. Верхнего предела нет вообще, поскольку может и вообще ничего не получиться.
Почитаю Ваши
Почитаю Ваши книги,хоте меня отговаривали,время зря в свои года теряешь.Лучше,мол переходить на C++ с нуля,есть хорошие учебники.Но мое мнение,полезно и эти книги почитать,потом дополнительно поизучать язык C и потом переходить на C++ изучать,ну не один год уйдет,за то интересно для меня.Не знаю появился интерес в 40 лет к этой области,каждый день думаю об этом.Пыталмя сразу начинать с C++,но наверное не верно,надо именно с начинать с Ваших учебников.Образования у меня нет в этой области,а интерес есть.
Вот если
Вот если пытаться начать с Си++, то точно ничего не выйдет, это я вам гарантирую. Причём в любом возрасте.
"Дополнительно" ничего изучать не надо, Си рассматривается во втором томе, Си++ — в третьем. Начинать ни с того, ни с другого нельзя категорически. И, самое главное, если эти или любые другие книги по программированию просто "читать", то время будет потрачено впустую. К Си можно притрагиваться не раньше, чем у ваших программ на Паскале появятся сторонние пользователи, а к Си++ — не раньше, чем объёмы ваших программ (в смысле, каждой отдельно) не выкатятся за пару тысяч строк.
А что делать тем, у кого уже есть опыт программирования?
> К Си можно притрагиваться не раньше, чем у ваших программ на Паскале появятся сторонние пользователи
В моём случае не получится. Я уже успел пописать и на паскале в школе, на C в институте, хотя там был странный гибрид с С++, причём из последнего только cout, cin и строчные комменты. Там же был курс по ассемблеру, только почему-то преподавался он на фигне, встроенной в трупный паскаль. То есть чтение данных с клавиатуры и вывод были на паскале, а алгоритм их обработки на асме.
А вот с последнего мой переход на линукс и начался. Но у меня это всё оставляло чувство неправильности. Если уж программа на ассемблере, то она вся должна быть на нём. После пары работающих hello world-ов на DOS мне захотелось написать что-нибудь на уровне голого железа, для чего нужно было после каждой пересборки записать нулевой и несколько следующих секторов на дискету, а потом перезагрузиться. Программы для этого под Windows я не нашел, но, так как интересовался другими системами, из купленной мной криво переведённой книги "юникс для чайников", я знал что там есть dd для записи произвольных секторов диска.
В общем, на настоящий момент я уже успел попытаться писать программы на паре-другой десятков разных языков, но нигде дальше программ под какую-то мелкую задачу на сотню-другую строчек дело не пошло.
Другие студенты, скопировавшие у меня програмки для решения лаб, кстати, считаются сторонними пользователями?
А ещё, один преподаватель даже заплатил мне деньги за написание программы для его диссертации. Но программа там тоже уровня хелловорда. И, насколько я знаю, в итоговую диссертацию она не попала, так как препод решил эту задачу в итоге как-то по-другому.
В общем, я уже не могу начать с паскаля и не трогать C, потому что уже трогал.
Другие
Другие студенты, скопировавшие у меня програмки для решения лаб, кстати, считаются сторонними пользователями?
нет.
один преподаватель даже заплатил мне деньги за написание программы для его диссертации. Но программа там тоже уровня хелловорда.
это тоже не то.
В общем, я уже не могу начать с паскаля и не трогать C, потому что уже трогал.
И что? :-) Паскаль-то вы трогали раньше, чем Си, и определённое эстетическое чутьё у вас есть, вон вкрапления ассемблера в Паскаль вам не понравились (и это совершенно правильно, ибо нефиг).
Читать мои книжки или не читать — подозреваю, вы разберётесь сами. Только один момент: лучше всё-таки начните с начала, а не сразу с середины второго тома, как некоторые пытаются сделать, и пытаются, замечу, совершенно зря.
Так что
Так что получается,уже не стоит даже начинать.
Почему не
Почему не стоит-то? Что жизнь после сорока есть — это вы уже и сами на своём опыте знаете, а я вам ещё могу сказать (на моём опыте), что она есть даже после сорока шести :-)
Спасибо
Спасибо большое за ответы,я просто начал раньше читать Вашу книгу 1-й том,установил Линукс.Отговорили,говорили чтобы быстрее в эту область войти,мол не нужно тебе это,сразу изучай C++.Послушал и закинул,в итоге не тут,не там,как говорят).
Ну да, добрые
Ну да, добрые друзья не дадут умереть своей смертью, куда там... Ей-богу, в последнее время что-то слишком часто попадаются такие друзья, что никаких врагов не надо.
В общем
В общем установил ксубунту и переехал со всеми делами,как вы говорите)),продолжаю изучать и практиковаться по Вашим книгам.Надеюсь все получится.Спасибо Вам,буду следить за Вашими книжными проектами.
Что делать
Что делать после прочтения второго тома книги? Предлагается полтора года-два заниматься написанием на си, получить конечного пользователя, и по сути стать полноценным программистом. Вот и вопрос: а что делать то? Есть желание, но идей нет банально, какие на нынешний момент реально можно написать программы на си, которые будут актуальны и реально нужны кому-то кроме друзей, которые попользовались ей потому-что я попросил?
Ну так пишите
Ну так пишите не то, что актуально, а то, что лично вам прикольно. Рано или поздно само собой получится что-то актуальное.
Кстати, странно, что того же вопроса не возникло после первого тома.
В задаче на
В задаче на странице 142 тома I точно ответ 340? У меня не получается этот ответ. Забавно, что с усложнённой версией у меня проблем нет.
стопудов (tm)
4+16+64+256 по-вашему сколько будет?
Линукс
Современный линуксовый GUI уже ни чем не уступает другим операционным системам, читая книги предполагается отказаться от GUI совсем и использовать консоль? В линксе тоже можно копировать файлы мышкой :)
> Современный
> Современный линуксовый GUI уже
"Уже"? Вообще-то лет двадцать как.
> ни чем не уступает другим операционным системам
Совершенно верно, и это позволяет на линукс пересаживать всяких секретарш и прочих гуманитарных девочек, даже не говоря им, что это линукс. Сам такое делал :-)
> читая книги предполагается отказаться от GUI совсем и использовать консоль?
Несомненно. Если быть точным, не "консоль", а командную строку. Графический режим как таковой вполне полезен, ну там фотки смотреть, видосики. GUI при использовании графики совершенно не обязателен. А что касается DE (вот эти вот иконочки для изображения файлов, папочки и прочее дерьмище), то для профессионала их использование неприемлемо вообще, вот то есть категорически.
Если считаете иначе, то убеждать я вас ни в чём не буду, но книжки тогда, наверное, надо другие выбрать, от моих толку не будет.
> В линксе тоже можно копировать файлы мышкой :)
А зачем делать мышкой то, что можно сделать без мышки в разы быстрее и без вреда для правого плечевого сустава?
Кстати, вы сайтом-то не ошиблись? Может, надо куда-нибудь в другое место пойти?
А вот на
А вот на андроиде я копирую и перемещаю файлы с помощью файлового менеджера. Хотя у меня там установлен терминал в приложениях. Зря?
Зря вы вообще
Зря вы вообще андроидом пользуетесь, вот это точно.
А так — когда нет клавиатуры, работа с терминалом превращается в пытку. Так что тут не вполне понятно, что зря, а что не зря.
Короче, у компьютера должна быть клавиатура — и не виртуальная, а настоящая. Если её нет — такой компьютер годится только в мусорный бак.
А нафига нужна
А нафига нужна клавиатура для чтения электронных книг? Ну кроме двух боковых клавиш (по умолчанию громкости, но в книге они листают страницы).
Специальная читалка книг оказалась неудобной из-за медленного экрана. У мобильника хоть и нет такой продолжительности работы без подзарядки, зато экран гораздо контрастнее и откликается на листание страниц почти мгновенно.
При работе в режиме музыкального плеера, кнопки управления как правило вынесены на гарнитуру (play/pause, next, previous)
Но да, работа с терминалом на андроиде — мазохизм, хотя команды вроде ifconfig иногда ввожу что бы IP-адрес посмотреть.
Кстати даже клавиатура бы не особенно помогла, в андроиде сейчас нет не busybox, ни coreutils, к тому на половине команд permission denied, если не от рута.
Вот я и говорю,
Вот я и говорю, зря вы андроидом пользуетесь. Всем изделиям от Google место в мусорном баке.
Получается, что
Получается, что если выбросить android и iOS, остается только "кнопочная звонилка", "городской телефон" (его вроде бы правильно называть ip-телефония) и, может быть, рация, так? Других ОС на смартфонах, вроде как, нет. Да и нужны ли они (смартфоны)?
Я, честно говоря, не против такого исхода и для меня лично смартфон и планшет никогда не заменит ноутбук или ПК.
А вы, Андрей Викторович, еще пользуетесь "городским телефоном" или "звонилка" заменяет его?
Совершенно
Совершенно верно, в настоящее время в природе не существует таких смартфонов, которыми можно пользоваться. Вот когда появится смартфон с полностью открытой операционкой, при этом стопроцентно лояльный своему пользователю, вплоть до возможности поменять IMEI, ежели пользователь этого хочет (и плевать, что это запрещено, видите ли, стандартами GSM, суть лояльности железяки пользователю именно в том и состоит, что единственный закон для железяки — воля пользователя) — тогда можно будет на эту тему подумать.
У меня да, "звонилка", она же "бабушкофон". Даже не один :-) Городской телефон в квартире есть (ветхозаветный проводной, то есть это даже не ip-телефония), я за него по иннерции плачу абонентку, но сам по нему не звоню (идти до него далеко, лень, проще с мобилки звякнуть), на входящие звонки не отвечаю, ибо звонят на него исключительно спаммеры. Нафиг он нужен, уже не вполне понятно, но что-то мне этот номер дорог как память, всё-таки самый первый телефонный номер, который я в раннем детстве запомнил :-) Вообще-то были у меня мысли взять какую-нибудь ip-телефонную железку, чтобы можно было через asterisk устроить всякое управление через тональный набор и интегрировать это всё с имеющейся системой умного дома. Но пока дальше мыслей не продвинулось.
Пользуюсь
Пользуюсь кнопочными мобильниками всю жизнь. И пока что не собираюсь менять привычку. После долгих лет, недавно сменил телефон, купив кнопочник Nokia 2720 Flip: это - смартфон, который работает на KaiOS - свободной ОС. Правда вот не знаю пока что о том, какие возможности у пользователя в ней менять тот же IMEI. Моэет Вас заинтересует.
>А зачем делать
>А зачем делать мышкой то, что можно сделать без мышки в разы быстрее и без вреда для правого плечевого сустава?
Не всегда. Один кейс я так и не нашёл, как эффективно делать в консоли.
Есть куча фоток в директории, много дубликатов и "неудачных" - стандартная картина при копировании с фотика.
Удобно иметь искизы всего этого, выделять ненужное и удалять. В командной строке бы пришлось каждый файл открывать-rm name.
Там где нужно не текстовая, а визуальная фильтрация с командной строкой не всё так хорошо.
Ну и?
Для сортировки фоток я сам применяю konqueror, и это единственный случай, для которого я его применяю. Но моей фразе, которую вы цитируете, сие не противоречит:
зачем делать мышкой то, что можно сделать без мышки
ну вот фотки нельзя, во всяком случае, имеющимся софтом, сортировать "без мышки". А файлы копировать и перетаскивать — очень даже можно.
GUI
Иначе я не считаю, я с вами согласен.
А как относитесь к тайловым оконным менеджерам(i3, xmonad, и т.д)
Тайловые
Тайловые оконники вот только что обсуждались:
http://www.stolyarov.info/guestbook#comment-3437
Кратко -- не знаю, не пробовал. Пробовать некогда :-)
Качество печати
Здравствуйте.
Меня интересует качество печати данных книг. Каково оно?
Просто, для сложных (для меня) книг, я предпочитаю их бумажное воплощение. Но крайне не приятно держать в руках и работать с книгой с плохой бумагой и полиграфией.
Странный вопрос, честно говоря
Мне вот что интересно, вы на какой ответ рассчитываете? В каком виде? Книги вышли в твёрдом полноцветном переплёте, корешок плоский, скрепление клеевое (да, не шитое, звиняйте), бумага, если не ошибаюсь, 65 гр/м2. Печать типографская, тип печатного станка мне не известен (но это не ризограф, если вас этот момент интересует, а вот офсет это или что-то другое -- извините, понятия не имею). Что вас может не устроить -- ну, базовый шрифт 10й, можете любую страницу из PDFок распечатать, посмотреть, подходит вам такой шрифт или нет. Больше мне ничего в голову не приходит, что можно было бы ответить, но если у вас конкретные вопросы есть, задайте их.
Здравствуйте,
Здравствуйте, очень сильно замотивирован в прочтении данных пособий, но сразу возник общий опрос по поводу того, когда лучше это собственно сделать:
1) Прямо сейчас, без выпущенного задачника (хотя бы по первому тому), придумывая себе задачки, закрепляя знания (По моему мнению, в таком случае можно опустить важные детали и как результат не понять какую-либо ключевую концепцию)
2) Дождаться полноценного задачника и после этого приступать к прочтению
Ясное дело что ответ зависит от временных рамок выпуска самого задачника. Хотелось бы узнать Ваше мнение по этому поводу )
Заранее Спасибо!
Вообще-то я
Вообще-то я изначально не планировал делать задачник, и то, что он сейчас стоит в планах, есть результат занудства публики :-) Мне всегда казалось, что задачник по программированию не нужен тем, кто собирается быть программистом, поскольку у будущих программистов получаемые знания о доступных инструментах вызывают натуральный зуд и желание немедленно это всё попробовать на машине.
Так что задачник-то, конечно, будет, раз я обещал, но там прямо в предисловии будет сказано, что намного лучше и правильнее решать такие задачи, которые хочется решать, чем такие, которые какой-то добрый дядя сформулировал в задачнике. И уж, конечно, ждать его выхода не надо, особенно если получается придумывать заморочки для себя самостоятельно.
А как насчёт
А как насчёт https://projecteuler.net ?
Есть и другие подобные сайты, но этот первым в голову приходит.
Это не о том
Задачи, которые там, к практическому программированию никакого отношения не имеют. Там, во-первых, сплошная математика (ну то есть вроде бы надо программу написать, но чтобы её написать, нужно проникнуть в математическую суть), а во-вторых, по-моему, это всё-таки именно что специально подобранные ситуации, когда "лобовое" решение оказывается на хренову прорву порядков медленнее решения, написанного с применением мозгов.
Не скажу, что в практическом программировании так не бывает — бывает, конечно. Просто редко. Зато намного чаще приходится бить себя по рукам, вспоминая словосочетание "преждевременная оптимизация".
А у меня и
А у меня и брутфорс на тех задачах срабатывает. Ну подумаешь подожду 2 минуты вместо 0.02 секунд, зато потрачу на написание 20 минут вместо 2 часов.
Я давно туда не
Я давно туда не лазил, но если правильно помню, то отбрутфорсить там можно первые примерно полсотни задач, а дальше уже лобовые решения получаются на год машинного времени или что-нибудь вроде того.
В любом случае, если задачи из projecteuler брутфорсить, то зачем на них вообще время терять? Польза-то от них где? Между прочим, где-то в сети валяются ответы на все тамошние задачи, ну вот вбить их по одному и всё, чего там.
Брутфорс
Польза от решения брутфорсом в том, что бы потом сделать diff вывода с "правильным" решением, и узнать, действительно ли оно правильное.
Там нет
Там нет "правильных" решений, в смысле они там не опубликованы, а если бы и были, diff бы не помог.
projecteuler
> Там нет "правильных" решений, в смысле они там не опубликованы, а если бы и были, diff бы не помог.
Вы просто не поняли, что я имел в виду. Попробую ещё раз:
В любом случае, написать решение брутфорсом имеет смысл до того как думать над "правильным" решением. Когда "правильное" решение будет готово, можно сделать вот так:
И узнать, правильное ли на самом деле "правильное" решение. Если в задаче мощности компа не хватает на полное решение задачи, то всё равно можно ограничить вывод и того и другого теми значениями, на которые компа хватает.
Ответом на
Ответом на любую из задач на projecteuler является целое число, так что использование diff бессмысленно. И брутфорс тоже никакого смысла не имеет, поскольку узнать, правильный ответ или нет, можно намного проще — отправив ответ на сайт. А если очень хочется узнать правильный ответ, не решая задачу — то список ответов можно найти в поисковиках.
Поздравляю Вас,
Поздравляю Вас, Андрей Викторович! Блестящее достижение! А ведь еще говорили в анонсе 2-го издания, что через год ждать ничего не следует. Но нет, дождались :)
P.S.: Перечитывать то, что уже много раз читал в первом издании и находить новый текст, новые мысли - это удивительное удовольствие! Отдельное спасибо за это.
Спасибо
На эти темы как правило, книги пишут словно справочники или документацию, но для начинающих не так важно знать абсолютно всё, гораздо важнее хорошо разобраться в ключевых концепциях.
Cпасибо!
+ в карму и спасибо!