LINUX.ORG.RU

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

 , , ,

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

4

4

Тихо и незаметно 30 апреля 2026 года вышло издание 2.92, которое наконец включает в себя читаемый текстовый слой.

Исправлены опечатки и ошибки, обнаруженные в предыдущих изданиях, в частности 2.91 (где введена кликабельная навигация) и 2.9 (первое чисто электронное издание).

Книга предназначена для самообучения основам программирования и в отличии от многих других изданий предполагает фундаментальный подход — вначале основы дискретной математики и использования GNU/Linux или BSD с командной строкой, затем паскаль, потом ассемблер и только потом Си, системное программирование и альтернативные парадигмы (функциональное, логическое и так далее).

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

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

>>> Ссылка на страницу издания

>>> Альтернативные способы скачивания

>>> Новость на сайте автора

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 10)
Ответ на: комментарий от VIT

Это авторская задумка, обсудили где-то на первой странице.

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

wandrien ★★★☆
()
Ответ на: комментарий от VIT

Номер издания - десятичное число. Но мне запятая как десятичный разделитель не нравится и в самом тексте я написал с точкой.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от firkax

У нас в технаре так же было. На втором курсе учили паскаль, на третьем началось ООП, и весь паскалевский опыт нам перенесли на C++ буквально за одну пару.

Playermet
()
Ответ на: комментарий от Manhunt

В Си есть всё перечисленное, кроме модулей.

вроде массивов

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

строк

Их нет.

thunar ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Если бы мне хотелось возразить адепту одноядерности, я бы привёл в пример вкладки браузера. Пример с make -j только подтверждает тезис автора.

Вот беда, нормальный человек не знает, что такое «вкладка в браузере». У него «в интернете» всегда только одна страница открыта, та что на экране. А про обратный Амдал не все инженеры то слышали.

VIT ★★
()
Ответ на: комментарий от wandrien

Я только проснулся, читаю обсуждение!

VIT ★★
()
Ответ на: комментарий от thunar

Можешь писать как get-filehash, там регистронезависимый язык.

vbr ★★★★★
()
Ответ на: комментарий от liksys

На саныче обучи, я скучаю по его секретаршам.

vbr ★★★★★
()
Ответ на: комментарий от soomrack

Чушь какая-то.

Не уследил за полётом мысли? Ок, давай ещё разок, медленно и занудно, по шагам:
1. Твоя программа хранит свое персистентное состояние в файлах. С файлами работает с использованием стандартной библиотеки для работы с файлами (для Си это FILE *fp = fopen ...., но язык и конкретная библиотека тут принципиальны);
2. По замыслу, программа должна дописывать новые данные файл при нажатии на кнопку «save». При запуске программа должна парсить этот файл и продолжать работу с того места, где сохранились;
3. Файл большой, так что пересоздавать его «с нуля» всякий раз при нажатии на «save» - не вариант, надо дописывать новые данные к старым в старый файл;
4. Как обрабатывать ошибки записи в такой файл? Откат уже выполненных fwrite из-за ошибки очередного fwrite посреди процедуры сохранения - задача нетривиальная, логика сложная. Ты допустил логический изъян в коде, который обрабатывает ошибку записи. (Вообще, какой процент программистов не забывает написать содержательную обработку ошибки для fclose?) Покрытие обработки ошибок тестами было не исчерпывающим, и изъян этот не выявило;
5. В момент записи на диске у пользователя закончилось место, новые данные в файл записаны только наполовину и перемешаны с мусором. Программа падает при попытке чтения этого файла. Пользовательские данные просраны, пользователь тебя ненавидит.

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

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

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

Manhunt ★★★★★
()
Ответ на: комментарий от Xenius

Понял, лавры Кнута не дают покоя. Нормальный ход, дюже не понятный, поскольку цифирки не вызывают ассоциации. Взял бы последовательность корня из 7, а то 2.9, 2.91, 2.92. После 2.9 в моей математике идёт 2.10.

VIT ★★
()
Ответ на: комментарий от amm

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

ИМЯ
    Get-FileHash

ОПИСАНИЕ
    Computes the hash value for a file by using a specified hash algorithm.


СИНТАКСИС
    Get-FileHash [-Algorithm <System.String>] [-Path] <System.String[]> [<CommonParameters>]

    Get-FileHash [-Algorithm <System.String>] -LiteralPath <System.String[]> [<CommonParameters>]

    Get-FileHash [-Algorithm <System.String>] -InputStream <System.IO.Stream> [<CommonParameters>]


ОПИСАНИЕ
    The `Get-FileHash` cmdlet computes the hash value for a file by using a specified hash algorithm. A hash value is a unique value that
     corresponds to the content of the file. Rather than identifying the contents of a file by its file name, extension, or other designa
    tion, a hash assigns a unique value to the contents of a file. File names and extensions can be changed without altering the content
    of the file, and without changing the hash value. Similarly, the file's content can be changed without changing the name or extension
    . However, changing even a single character in the contents of a file changes the hash value of the file.

    The purpose of hash values is to provide a cryptographically-secure way to verify that the contents of a file have not been changed.
    While some hash algorithms, including MD5 and SHA1, are no longer considered secure against attack, the goal of a secure hash algorit
    hm is to render it impossible to change the contents of a file -- either by accident, or by malicious or unauthorized attempt -- and
    maintain the same hash value. You can also use hash values to determine if two different files have exactly the same content. If the
    hash values of two files are identical, the contents of the files are also identical.

    By default, the `Get-FileHash` cmdlet uses the SHA256 algorithm, although any hash algorithm that is supported by the target operatin
    g system can be used.


ПАРАМЕТРЫ
    -Algorithm [<System.String>]
        Specifies the cryptographic hash function to use for computing the hash value of the contents of the
        specified file or stream. A cryptographic hash function has the property that it is infeasible to
        find two different files with the same hash value. Hash functions are commonly used with digital
        signatures and for data integrity. The acceptable values for this parameter are:

        - SHA1
        - SHA256
        - SHA384
        - SHA512
        - MACTripleDES
        - MD5
        - RIPEMD160

        If no value is specified, or if the parameter is omitted, the default value is SHA256.

        For security reasons, MD5 and SHA1, which are no longer considered secure, should only be used for
        simple change validation, and should not be used to generate hash values for files that require
        protection from attack or tampering.

    -InputStream <System.IO.Stream>
        Specifies the input stream.

    -LiteralPath <System.String[]>
        Specifies the path to a file. Unlike the **Path** parameter, the value of the **LiteralPath**
        parameter is used exactly as it is typed. No characters are interpreted as wildcard characters. If
        the path includes escape characters, enclose the path in single quotation marks. Single quotation
        marks instruct PowerShell not to interpret characters as escape sequences.

    -Path <System.String[]>
        Specifies the path to one or more files as an array. Wildcard characters are permitted.

    <CommonParameters>
        Этот командлет поддерживает общие параметры: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable и OutVariable. Дополнительные сведения см. в статье
        about_CommonParameters (https:/go.microsoft.com/fwlink/?LinkID=113216).

    --------- Example 1: Compute the hash value for a file ---------

    This example uses the `Get-FileHash` cmdlet to compute the hash value for the `powershell.exe` file.
    The hash algorithm used is the default, SHA256. The output is piped to the `Format-List` cmdlet to
    format the output as a list.

    ```powershell
    Get-FileHash $PSHOME\powershell.exe | Format-List
    ```

    ```Output
    Algorithm : SHA256
    Hash      : 908B64B1971A979C7E3E8CE4621945CBA84854CB98D76367B791A6E22B5F6D53
    Path      : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    ```

     --------- Example 2: Compute the hash value for an ISO file ---------

    This example uses the `Get-FileHash` cmdlet and the **SHA384** algorithm to compute the hash value
    for an ISO file that an administrator has downloaded from the internet. The output is piped to the
    `Format-List` cmdlet to format the output as a list.

    ```powershell
    Get-FileHash C:\Users\user1\Downloads\Contoso8_1_ENT.iso -Algorithm SHA384 | Format-List
    ```

    ```Output
    Algorithm : SHA384
    Hash      : 20AB1C2EE19FC96A7C66E33917D191A24E3CE9DAC99DB7C786ACCE31E559144FEAFC695C58E508E2EBBC9D3C96F21FA3
    Path      : C:\Users\user1\Downloads\Contoso8_1_ENT.iso
    ```

     --------- Example 3: Compute the hash value of a stream ---------

    For this example, we get are using **System.Net.WebClient** to download a package from the
    [PowerShell release page](https://github.com/PowerShell/PowerShell/releases/tag/v6.2.4). The release
    page also documents the SHA256 hash of each package file. We can compare the published hash value
    with the one we calculate with `Get-FileHash`.

    ```powershell
    $wc = [System.Net.WebClient]::new()
    $pkgurl = 'https://github.com/PowerShell/PowerShell/releases/download/v6.2.4/powershell_6.2.4-1.debian.9_amd64.deb'
    $publishedHash = '8E28E54D601F0751922DE24632C1E716B4684876255CF82304A9B19E89A9CCAC'
    $FileHash = Get-FileHash -InputStream ($wc.OpenRead($pkgurl))
    $FileHash.Hash -eq $publishedHash
    ```

    ```Output
    True
    ```

     --------- Example 4: Compute the hash of a string ---------

    PowerShell does not provide a cmdlet to compute the hash of a string. However, you can write a
    string to a stream and use the **InputStream** parameter of `Get-FileHash` to get the hash value.

    ```powershell
    $stringAsStream = [System.IO.MemoryStream]::new()
    $writer = [System.IO.StreamWriter]::new($stringAsStream)
    $writer.Write("Hello world")
    $writer.Flush()
    $stringAsStream.Position = 0
    Get-FileHash -InputStream $stringAsStream | Select-Object Hash
    ```

    ```Output
    Hash
    ----
    64EC88CA00B268E5BA1A35678A1B5316D212F4F366B2477232534A8AECA37F3C
    ```

 ЗАМЕЧАНИЯ
    Для просмотра примеров введите: "get-help Get-FileHash -examples".
    Для получения дополнительных сведений введите: "get-help Get-FileHash -detailed".
    Для получения технических сведений введите: "get-help Get-FileHash -full".
    Для получения справки в Интернете введите: "get-help Get-FileHash -online"

Для тех кто не умеет в консоль, классика офтопа -? приведет вас к нужным заклинаниям

Get-FileHash -?
Morin ★★★★★
()
Ответ на: комментарий от Manhunt

Ты путаешь то, за что отвечает СУБД и то, за что отвечает ФС.

Проблемы на уровне отключения питания в момент записи решаются ФС, это ее область ответственности, для этого есть журналы, параметры подтверждения записи (data={journal|ordered|writeback}) и пр., плюс еще работа самого дискового массива.

Реляционные СУБД это в первую очередь поддержание целостности данных, т.е. чтобы отношения между данными сохранялись. СУБД PostgreSQL и MySQL и пр., используют файловую систему для хранения данных, поэтому если ФС подвержена озвученным тобой проблемам (обнуление файла при пропадании эл-ва при записи), то и СУБД будет иметь те же проблемы. То, что в некоторых случаях СУБД лучше сохраняет данные при отключении питания связано с тем, что запить в СУБL обычно по умолчанию writeback, а опции монтирования – journal.

soomrack ★★★★★
()
Ответ на: комментарий от Xenius

А может ты прочитаешь раздел 4.8.4 (Программирование на языке Си->Язык Си и стиль кода->Возвращаемые значения и выходные параметры) целиком?

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

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

rOgret
()
Ответ на: комментарий от Manhunt

питание у компьютера внезапно пропало, новые данные в файл записаны только наполовину

Операция записи в фс атомарна, нельзя записать половину файла.

Lusine
()

Так, длину страниц уже обсудили, это весело. А что со шрифтами https://ibb.co/rKXmdVkk ?

Прочитал в книге ага, отличная идея

mega_venik ★★★★
()
Последнее исправление: mega_venik (всего исправлений: 1)
Ответ на: комментарий от rOgret

Концепцию побочных эффектов ты в целом тоже не понял

Ну если ты лучше понял, возьми на себя спор с @liksys что ли. Я это всё читал давно уже и половину забыл.

Xenius ★★★★★
() автор топика

а с нормальным форматом страниц нет?

Welle
()
Ответ на: комментарий от vbr

лолкек именно в том что указатель в изводе Паскаля(ну или лиспа по двух томнику финов Мир Лиспа где ваще в первых страницах очень эффектно и эффективно проводят различие между глифой 2 и числом 2 и подчёркивают что семантика глифы 2 может быть и число 3 - с примечанием что гамак и стоя не для всех а уж лыжи совсем для эстетов) ваще мало отличимы от индекса массива Mem :)

засада сишных указателей именно в том что синтаксис изначального K&R имеет несколько патерно сокращений приводящее в частности к если f это функция то *f тождественно *****f что очевидно придаёт неизгладимый шарм

qulinxao3 ★☆
()
Ответ на: комментарий от soomrack

Он ничего не путает. Он предлагает проблему целостности сделать проблемой СУБД, а не решать её самостоятельно. Здраво, если в программе как он и написал 100 файлов различной надобности, оверинжиниринг для простых случаев. Можно вообще пойти дальше и делать СУБД частью файловой системы. Чем сложнее тем лучше. Этим решается масса проблем, а заодно и джоб секьюрити.

VIT ★★
()
Ответ на: комментарий от Lusine

Операция записи в фс атомарна, нельзя записать половину файла.

Ой, что это?!

VIT ★★
()
Ответ на: комментарий от qulinxao3

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

А что, в C реально нельзя объявить указатель на указатель на функцию? Никогда не пробовал.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)

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

Rodegast ★★★★★
()
Ответ на: комментарий от Rodegast

дэньги нужны

Он же бесплатно выложил, при чём тут деньги? Нужны были бы деньги - продавал бы.

vbr ★★★★★
()
Ответ на: комментарий от Manhunt

ох лёл

указатели сложны(нее) буквально в Сяшке ибо там очень своебразный синтаксис обусловленный в частности тем что у Ричи его докторская о частично рекурсивных функциях

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

с не прошедшими не обязательно вон из профессии

так что концепция указателей ваще очевидно если начинать с асма обычных(без теговых) машин где вс1ё есть набор битов заданой длины (обычно кратной уосьми)

qulinxao3 ★☆
()
Ответ на: комментарий от VIT

Ну такое. Не особо хорошо, т.к. ФС это часть ЯДРА ОС, а СУБД это пространство пользователя.

Хотя подобные решения есть – тот же Oracle позволяет использовать сырые диски. Но речь шла в его примере все-таки по PostgreSQL и пр.

soomrack ★★★★★
()
Ответ на: комментарий от vbr

вот тут и собачка порылась

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

т.е. если правильно обьяснить Память(которая массив ячеек) то указатели ваще не магия

а вот наворачивать даже связные списки без предварительно модельной Памяти это реально «ща поверьте поймёте потом»

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

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

Я не буду тратить время на еще один тред, чтобы объяснить столяровским сектантам, что такое побочный эффект и с чем его едят. Ссылки на мои объяснения есть в посте.

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

liksys ★★★★
()
Ответ на: комментарий от vbr

я там косякнул подразумевалось тождественность &f и &&&&&&f

ибо «так надо»

qulinxao3 ★☆
()
Ответ на: комментарий от Rodegast

Ой! А это тогда что такое

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

Причём это видно даже на фотке, где кусок лицензии вошел вместе с обложкой.

И ещё это первое издание, тогда как в сабже 6-е (1, 2, ДМК, 2.9, 2.91, 2.92).

Официально печатные книги вообще более не продаются. Единственный вариант - подержаные.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от sunjob

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

Характерно, что ни в Rust, ни в Go, ни даже в JavaScript эту наркоманию тащить не стали, там для функций отдельные ключевые слова, как и в паскале, только короче.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от Vidrele

Вот раньше были хорошие матричные принтеры. На рулоне можно было печатать.
Как ЭТО печатать? А как читать?
Ну и нахрена такие учебники? Особенно на новичков. Сразу учат плохому, или отбивают всякую охоту заниматься программированием. Хрень какая-то.

vada ★★★★★
()
Ответ на: комментарий от Manhunt

А модули не имеют отношения к азам, с ними можно познакомиться гораздо позже, без ущерба для чего-либо

Вот только всё это время вместо модулей придётся знакомиться со страшными костылями на инклудах и Codeguard-ах, которые в c и c++ впилены за отсутствием нормальных модулей. Да в сишке даже хеллоуворлд без #include <stdio.h> не напишешь.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от Xenius

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

А вот это не важно, они платят автору. Иначе они явно нарушают лицензию которая почему то явно запрещает подобную деятельность без «письменного разрешения автора и правообладателя».

Rodegast ★★★★★
()
Ответ на: комментарий от Rodegast

Да он снакркоманился. Судя по форматированию своего творения, пригодного для печати на рулоне туалетной бумаги.

vada ★★★★★
()
Ответ на: комментарий от VanyaZay

Прэлэстно, значит, самокритика ему не чужда.

hobbit ★★★★★
()
Ответ на: комментарий от vbr

А что, в C реально нельзя объявить указатель на указатель на функцию?

можно

void f1(){};
void f2(){};

typedef void F(void);
F* p[2] = { f1, f2 };
F** fp = p;
Lusine
()
Ответ на: комментарий от vbr

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

Отруби палец.

Lusine
()
Ответ на: комментарий от soomrack

Проблемы на уровне отключения питания в момент записи решаются ФС

Никто не использует упомянутые тобой опции монтирования, как установшик ОС разметил по дефолту - так и едут. В результате, на практике ФС обеспечивает целостность своих метаданных, и на этом всё.

Реляционные СУБД это в первую очередь поддержание целостности данных, т.е. чтобы отношения между данными сохранялись. СУБД PostgreSQL и MySQL и пр., используют файловую систему для хранения данных, поэтому если ФС подвержена озвученным тобой проблемам (обнуление файла при пропадании эл-ва при записи), то и СУБД будет иметь те же проблемы.

Взрослые СУБД работают с файлами очень специфическим образом. Поэтому у них - не нулится и не мусорится (а где мусорится, там котрольные суммы, wal, и тд). В прикладном коде ты так не будешь делать, да и не протестируешь его так, как тестируют СУБД.

Даже если реляционность не очень нужна, всё равно есть смысл пользоваться СУБД, а не ФС напрямую.

То, что в некоторых случаях СУБД лучше сохраняет данные при отключении питания связано с тем, что запить в СУБL обычно по умолчанию writeback, а опции монтирования – journal.

Да, разумеется, опции монтирования – дефолтные, т.е. data=ordered

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 3)
Ответ на: комментарий от Rodegast

На каких основаниях ты сделал подобный вывод?

Исходя из комментариев самого автора в своей гостевой. Собственно тут спрашивали зачем он сделал страницы в три раза длиннее A4 — вот как раз чтобы не печатали. Но они всё равно печатают - только старые издания.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от firkax

Скорее всего и нарушают. Озону пофиг на это всё, он что угодно будет продавать.

Озону может и пофиг. Но эти книги там продаются много лет, автор наверняка про это знает и никаких претензий не предъявил ;)

Rodegast ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)