Задать вопрос
Ответы пользователя по тегу Программирование
  • В чем суть maillist'ов и по какому принципу они работают?

    @abcd0x00
    В чем суть? Это же довольно нечитаемо получается.

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

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

    Так что вот эти рассылки - это такой привет из прошлого. Сейчас мы с тобой общаемся через web-приложение, а раньше их не было, все общались через почту. Поэтому сегодня вся движуха идёт в вебе, а из почты все ушли. А ещё раньше, до почты, были группы новостей.
    Ответ написан
    1 комментарий
  • Как запомнить классы, функции и методы в программировании и сэкономить время?

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

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

    Потом делаешь одну html-страницу для всех своих html-страниц. (Прямо на диске переходишь между ними, никаких интернетов не надо.)

    Подробности

    Почему надо проходить полностью? Потому что если ты не пройдёшь все нюансы, ты не будешь знать их. А когда ты не знаешь нюансы, ты начинаешь писать всякую лишнюю хрень. Очень часто при открытии файла на чтение в питоне пишут 'r'. А почему? А потому что не читали полное описание open(), в котором написано, что по умолчанию там всегда 'r'. А когда точно не знают, начинают писать на всякий случай. То же самое касается кодировки в третьем питоне. Вот человек не знает, что там кодировку по умолчанию поменяли, и пишет там всегда "#encoding: utf-8", и удалить боится, потому что не знает, можно ли удалить. А чтобы знать, надо читать PEP, а он не читал.
    Ответ написан
    Комментировать
  • Разработчик языка программирования создает только стандарт?

    @abcd0x00
    Язык ведь определяет его транслятор?

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

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

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

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

    @abcd0x00
    По стандарту C89 (и до C11), при сдвиге вправо знакового отрицательного числа результат зависит от реализации.


    3.3.7 Bitwise shift operators

    ...

    The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1
    has an unsigned type or if E1 has a signed type and a nonnegative
    value, the value of the result is the integral part of the quotient of
    E1 divided by the quantity, 2 raised to the power E2 . If E1 has a
    signed type and a negative value, the resulting value is
    implementation-defined.


    То есть отрицательные числа вообще нельзя свдигать вправо, так как результат непредсказуем.
    Ответ написан
    Комментировать
  • Как в Python считать по кругу?

    @abcd0x00
    >>> import collections
    >>> 
    >>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> n = 5
    >>> 
    >>> deq = collections.deque(enumerate(lst))
    >>> 
    >>> while len(deq) > 1:
    ...     deq.rotate(-n)
    ...     print(deq.pop())
    ... 
    (4, 5)
    (0, 1)
    (6, 7)
    (3, 4)
    (2, 3)
    (5, 6)
    (8, 9)
    (1, 2)
    >>> print(deq)
    deque([(7, 8)])
    >>>
    Ответ написан
    Комментировать
  • Верить ли Макконнелу?

    @abcd0x00
    Он дело говорит или забить?

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

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

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

    @abcd0x00
    Получается тогда нам нужно в начале размер файла прочитать, а потом уже все содержимое или как оно все происходит?

    Размер файла записан на диске (в файловой системе). Сам файл хранится в виде кусочков в разных местах диска. Кусочки связаны друг с другом по очереди (в каждом кусочке записано, где следующий кусочек).

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

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

    Файлы бывают огромные, даже больше, чем оперативная память, но ты их спокойно можешь читать.
    Ответ написан
    4 комментария
  • Как правильно следить за последовательным ходом выполнения работ консольных утилит?

    @abcd0x00

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

    У тебя прямо в скриптах должно быть завершение с кодом. Если ошибок не было, нужно завершать скрипт через exit 0. Если произошла ошибка, нужно завершать скрипт через exit 1.
    Когда у тебя скрипты так сделаны, ты можешь проверять их код завершения.

    А потом ты можешь написать скрипт со строками
    { script1.sh && echo "script1 - ok"; } || echo "script1 - fail"
    { script2.sh && echo "script2 - ok"; } || echo "script2 - fail"
    { script3.sh && echo "script3 - ok"; } || echo "script3 - fail"


    Пример
    { echo x1 && echo "script1 - ok"; } || echo "script1 - fail"
    { cat x && echo "script2 - ok"; } || echo "script2 - fail"
    { echo x2 && echo "script3 - ok"; } || echo "script3 - fail"
    { touch /x && echo "script4 - ok"; } || echo "script4 - fail"


    [guest@localhost ~]$ { echo x1 && echo "script1 - ok"; } || echo "script1 - fail"
    x1
    script1 - ok
    [guest@localhost ~]$ { cat x && echo "script2 - ok"; } || echo "script2 - fail"
    cat: x: Нет такого файла или каталога
    script2 - fail
    [guest@localhost ~]$ { echo x2 && echo "script3 - ok"; } || echo "script3 - fail"
    x2
    script3 - ok
    [guest@localhost ~]$ { touch /x && echo "script4 - ok"; } || echo "script4 - fail"
    touch: невозможно выполнить touch для «/x»: Отказано в доступе
    script4 - fail
    [guest@localhost ~]$



    Можно сделать и так
    { script1.sh && echo "script1 - ok"; } || { echo "script1 - fail"; exit 1; }
    { script2.sh && echo "script2 - ok"; } || { echo "script2 - fail"; exit 1; }

    Тогда он в случае успеха будет выводить успешную фразу и продолжать, а в случае ошибки он будет выводить сбойную фразу и сразу выходить (с кодом ошибки).
    Ответ написан
    Комментировать
  • Кто хочет поломать немного мозг?

    @abcd0x00
    Проходим циклом по оси X, и в каждой клетке (по оси Х) проверяем все ячейки по оси У (снизу вверх).

    Представь себе спаянную фигуру в виде лестницы из квадратов. При этом она спаяна целиком. И как ты её будешь проверять?

    Тут нужно саму фигуру делать объектом, который состоит из квадратов. А каждый квадрат должен знать, можно ли его сдвинуть в любую сторону. Тогда, чтобы сдвинуть всю фигуру, она должна будет просто опросить все свои квадраты.
    Ответ написан
    Комментировать
  • Как bash terminal парсит комманду и какие параметры ей передать?

    @abcd0x00
    Мне интересен сам алгоритм как BASH сохраняет алиасы, парсит параметры и т.д чтобы воспроизвести что-то подобное на PHP.

    Ну, это надо сделать цикл, в котором принимать ввод по одной строке, а при вводе строки разбирать её на составляющие и сохранять нужные части в хеш-таблицу (если про алиасы речь). В bash'е алиасы тоже нужно записывать в файл, который выполняется при каждой загрузке интерпретатора. То есть нет там какого-то секретного места, они просто загружаются в память и висят там.
    Ответ написан
    1 комментарий
  • Как открыть ссылки из файла в браузере?

    @abcd0x00
    Для Firefox (в Linux)
    [guest@localhost tmp]$ cat urls 
    http://www.yandex.ru
    http://www.toster.ru
    [guest@localhost tmp]$ firefox `cat urls`
    [guest@localhost tmp]$
    Ответ написан
    Комментировать
  • С чего начать изучение MySQL для веб-проекта?

    @abcd0x00
    Ответ написан
    Комментировать
  • Как изучить язык приближенно к 100%?

    @abcd0x00
    Думаю, что лучшим способом будет просто перелопатить всю документацию от А до Я и забить на другие ресурсы. Это правильные мысли?

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

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

    @abcd0x00
    Как создаются линии?

    https://ru.wikipedia.org/wiki/European_Article_Number
    https://ru.wikipedia.org/wiki/Universal_Product_Code

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


    Много нюансов там, связанных с аппаратурой и человеческим фактором. Поэтому логика кодирования такая, немного странноватая.
    Ответ написан
    Комментировать
  • Как из html вытащить url по определенной маске?

    @abcd0x00
    Нужно выбрать все ссылки, а потом из них выбрать те, которые удовлетворяют критерию. Именно так, по частям, потому что как источник ссылок может поменяться независимо от критерия, так и критерий выбора может поменяться независимо от источника.
    Ответ написан
    Комментировать
  • Создание программы по преобразованию текста в изображение. В каком направлении искать решение?

    @abcd0x00
    Обычно цифры-картинки записываются в ряд в изображении, а программа просто вырезает из этого ряда нужную.

    Есть начальные навыки программирования (Делфи, лет 10 назад), и интерес создать штуку самому.

    Можешь использовать C++/Qt. Для создания оконных приложений - Qt Creator.
    Ответ написан
    Комментировать
  • Как вывести первые буквы слов строки?

    @abcd0x00
    Выводит первые буквы слов.
    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
        int c, wassp;
    
        wassp = 1;
        while ((c = getchar()) != EOF) {
            if (isspace(c))
                wassp = 1;
            else if (wassp) {
                wassp = 0;
                putchar(c);
            }
        }
        putchar('\n');
        return 0;
    }


    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ echo "abcd efgh ijkl" | ./t
    aei
    [guest@localhost c]$
    Ответ написан
    Комментировать
  • Откуда узнавать о библиотеках?

    @abcd0x00
    Свежие черновики стандартов C
    www.open-std.org/JTC1/SC22/WG14

    Стандарт C89 (черновик)
    flash-gordon.me.uk/ansi.c.txt

    Прочитай английские страницы по C
    https://en.wikipedia.org/wiki/C_%28programming_lan...
    https://en.wikipedia.org/wiki/ANSI_C

    Это FAQ по вопросам из comp.lang.c
    c-faq.com

    Ещё можешь на канал #c зайти на irc.freenode.net, там обычно собирают всю последнюю информацию по языку.
    Ответ написан
    Комментировать
  • Как осуществить фукцию по добавлению элемета в конец списка?

    @abcd0x00
    >>> class UnorderedList:
    ...     def __init__(self):
    ...         self.head = None
    ...     
    ...     def append(self, item):
    ...         newnode = Node(item)
    ...         if self.head is None:
    ...             self.head = newnode
    ...             return
    ...         current = self.head
    ...         while True:
    ...             nextnode = current.getNext()
    ...             if nextnode is None:
    ...                 break
    ...             current = nextnode
    ...         current.setNext(newnode)
    ...     
    ...     def print(self):
    ...         current = self.head
    ...         while current is not None:
    ...             print(current.getData(), end=' ')
    ...             current = current.getNext()
    ...         print()
    ... 
    >>> class Node:
    ...     def __init__(self, data):
    ...         self.data = data
    ...         self.next = None
    ...     
    ...     def getData(self):
    ...         return self.data
    ...     
    ...     def getNext(self):
    ...         return self.next
    ...     
    ...     def setData(self, data):
    ...         self.data = data
    ...     
    ...     def setNext(self, node):
    ...         self.next = node
    ... 
    >>> lst = UnorderedList()
    >>> lst.append(1)
    >>> lst.append(2)
    >>> lst.append(3)
    >>> lst.print()
    1 2 3 
    >>>
    Ответ написан
  • Python: format str float - как прятать дробную часть, если она равна нулю?

    @abcd0x00
    Цену надо хранить в виде целого числа, иначе из-за округления она может становиться недостоверной.
    Ответ написан
    Комментировать