Pull to refresh
3
0
Send message
Русские православные

И не русские, но тоже православные, так же не платят. Мне об этом сказал коллега-копт.
Укажите, пожалуйста, вы приводите зп до вычета или после. А то у нас принято считать «на руки», а за рубежом все сами считают. Из текста статьи — не очевидно.
Рассказывать о нем долго не буду.
Подход интересный и почему не хотите о нем подробно рассказывать — не понятно.

Параметры запуска, грамматика, система уравнений, — в статье указаны. А вот кода очень не хватает. Можно ссылку?
И вопрос: почему bigConst — не (1,200]?
Сила воли. Как развить и укрепить
Келли Макгонигал
either vi

Это еще что за зверь?
Если все-таки переводите, то ссылку на первоисточник будьте добры.
Установка Linux и прощание с твоей любимой ОС
Логическое противоречие же. Или автор был любителем FreeBSD? ;-)
Желание/потребность изучать асм или, хотя бы, Си, возникает рано или поздно у любого специалиста, мало знакомого с работой низкого уровня. И это — хорошо.
Книга же может учить более или менее эффективно, быть скучной или не очень - из текста статьи Эвана Миллера никак не понятно, стоит ли читать книгу Зеда Шоу.

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

Я к тому, что у автора
Абсолютно первые шаги
Начинаем работу: войти и выйти
Убедитесь, что точно знаете, как запустить шелл и как из него выйти.
Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно.

Вместе с тем, что, как мы с вами установили,
tree в убунту и не идет по-умолчанию
и команда в самом распространенном linux-дистрибутиве выведет указанный мной результат. В лучшем случае, сферический новичек в вакууме пойдет гуглить…

Более того, ни до, ни после я не увидел команд для работы ни с менеджерами зависимостей, ни с менеджерами пакетов. А это, в данном контексте, уже явный косяк.
~$ lsb_release -d
Description:	Ubuntu 15.04
~$ tree
The program 'tree' is currently not installed. You can install it by typing:
sudo apt-get install tree

Для «полного новичка» может быть непонятно, что вообще происходит.

Отмечу важный приятный момент — упражнения! Именно их обычно не хватает в обучающих статьях.

Но в целом, статья — «галопом по Европам». Про shell если уж и писать, то обстоятельно, лучше задерживаясь на узкой сфере: или работа с процессами, или работа с файловой системой, или обработка содержимого файлов. Так можно набрать приличный цикл статей, куда уже и отсылать новичков.

З.Ы. на ЛОРе было замечательное введение в shell, но сейчас не могу его найти.
На opennet, конечно же, тоже стоит поискать. Например, раз, два.
В качестве шпаргалки
Ожидал увидеть ссылку или хотя бы упоминание о работе Кнута.
И больше формул и схем.
Оговорюсь, что видео не смотрел. Может быть, вся соль там.
Давайте уж по порядку

Спасибо за труд и популяризацию unix и bash.

~$ m4
The program 'm4' is currently not installed. You can install it by typing:
sudo apt-get install m4
~$ pv
The program 'pv' is currently not installed. You can install it by typing:
sudo apt-get install pv

Я так понимаю, где-то половины из описанного в linux не стоит «из коробки».

Тогда логичнее описать coreutils, так как
The GNU Core Utilities are the basic file, shell and text manipulation utilities of the GNU operating system.
These are the core utilities which are expected to exist on every operating system.
(отсюда)

К примеру, в тексте ни слова о pwd и basename, а они, порой, гораздо важнее в скриптах, чем, например, factor, и входят в те самые coreutils.
Может, зря смеетесь. Я пробовал bc — не понравился.
В итоге считаю на питоне. И конверсии в системы счисления есть и многое другое.
разницы между
echo 4*4|bc
и
echo 'print 4*4'|python

не так и много, а при вызове repl — тем более.
По сети ходит вот такое милое жизнеописание, если кто еще не видел:

«Самая лучшая пара в истории все-таки: она физик, он математик, он ради нее забил на гомосексуализм и стал католиком, хотя точно знал, что Бога нет, поженились, он тут же сошел с ума, сбежал от ЦРУ заграницу, она его нашла, поймала, насильно сдала в дурку, его там лечили электорошоком, он вылечился, проклял ее, они развелись, он ушел к медсестре, ебанулся еще раз, год жил на помойке, потом она его поселила у себя в чулане, где он 20 лет чертил крестики, потом вылечился, они опять поженились, он получил Нобелевку, и вот ей 80 с чем-то, ему под 90, и они оба не пристегиваются в такси. Боги.»

Знатоки биографии — насколько правдиво?
Я бы свел статью к
«Все прикручиваете модули к CMS? Откройте для себя Мэтта Зандру и Symfony Book».
Не так категорично и подталкивает людей к (хорошим, добрым, вечным) лучшим практикам.
+---------+--------+--------------+---------------+
|             | WebP | JPEG-XR  | JPEG 2000 |
+---------+---------+--------------+--------------+
| Firefox |     -      |         -       |          -         | 
+---------+---------+-------------+----------------+
| Vivaldi  |     +    |          -       |        - (?)      | 
+---------+---------+---------+-----------+-------+

Немного посмотрел, что с поддержкой:

JPEG XR — «Открытые браузеры (например, Mozilla Firefox) являются лицензионно несовместимыми c JPEG XR. Поддержка возможна только на основе плагина, но он будет работать исключительно в Windows;» (вики)
JPEG 2000 — «всё равно не может соответствовать Debian Free Software Guidelines (тест на свободность программного обеспечения). Это может затруднить адаптацию JPEG 2000 к требованиям веба, так как это исключит свободные веб-браузеры (особо отметим браузеры, основанные на Gecko)» (вики)
«Существует также порт библиотеки libwebp под названием libwebpjs/libwebpas на JavaScript и ActionScript, позволяющий использовать WebP во всех популярных браузерах (поддержка IE6+ осуществляется с помощью дополнительного модуля Adobe Flash)» (вики)

Я так понимаю, проблема с лицензиями. Все тянут одеяло на себя, изобретая свои патентованные форматы.
Читают теги. Список хабов тоже читают.
И после прочтения возникает вопрос — почему в блоге mail.ru перевод статьи о PHP7?
Насколько понимаю, в компании используется Perl, Python, C++, Java на бэкенде.
Вот не хочется переписывать итерации в рекурсивные вызовы, еще и с динамически задаваемой глубиной вызова. Каждый вызов — новый стек и риск переполнения, сами понимаете.

Можно ли как-то переписать через те же map и reduce?
Как это решаете в продe? Или не решаете?

Прим. map и reduce внутри вполне себе императивные и проблемой переполнения вызова страдать не должны:

bltinmodule.c
static PyObject *
builtin_map(PyObject *self, PyObject *args)
{
    typedef struct {
        PyObject *it;           /* the iterator object */
        int saw_StopIteration;  /* bool:  did the iterator end? */
    } sequence;

    PyObject *func, *result;
    sequence *seqs = NULL, *sqp;
    Py_ssize_t n, len;
    register int i, j;

    n = PyTuple_Size(args);
    if (n < 2) {
        PyErr_SetString(PyExc_TypeError,
                        "map() requires at least two args");
        return NULL;
    }

    func = PyTuple_GetItem(args, 0);
    n--;

    if (func == Py_None) {
        if (PyErr_WarnPy3k("map(None, ...) not supported in 3.x; "
                           "use list(...)", 1) < 0)
            return NULL;
        if (n == 1) {
            /* map(None, S) is the same as list(S). */
            return PySequence_List(PyTuple_GetItem(args, 1));
        }
    }

    /* Get space for sequence descriptors.  Must NULL out the iterator
     * pointers so that jumping to Fail_2 later doesn't see trash.
     */
    if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
        PyErr_NoMemory();
        return NULL;
    }
    for (i = 0; i < n; ++i) {
        seqs[i].it = (PyObject*)NULL;
        seqs[i].saw_StopIteration = 0;
    }

    /* Do a first pass to obtain iterators for the arguments, and set len
     * to the largest of their lengths.
     */
    len = 0;
    for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
        PyObject *curseq;
        Py_ssize_t curlen;

        /* Get iterator. */
        curseq = PyTuple_GetItem(args, i+1);
        sqp->it = PyObject_GetIter(curseq);
        if (sqp->it == NULL) {
            static char errmsg[] =
                "argument %d to map() must support iteration";
            char errbuf[sizeof(errmsg) + 25];
            PyOS_snprintf(errbuf, sizeof(errbuf), errmsg, i+2);
            PyErr_SetString(PyExc_TypeError, errbuf);
            goto Fail_2;
        }

        /* Update len. */
        curlen = _PyObject_LengthHint(curseq, 8);
        if (curlen > len)
            len = curlen;
    }

    /* Get space for the result list. */
    if ((result = (PyObject *) PyList_New(len)) == NULL)
        goto Fail_2;

    /* Iterate over the sequences until all have stopped. */
    for (i = 0; ; ++i) {
        PyObject *alist, *item=NULL, *value;
        int numactive = 0;

        if (func == Py_None && n == 1)
            alist = NULL;
        else if ((alist = PyTuple_New(n)) == NULL)
            goto Fail_1;

        for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
            if (sqp->saw_StopIteration) {
                Py_INCREF(Py_None);
                item = Py_None;
            }
            else {
                item = PyIter_Next(sqp->it);
                if (item)
                    ++numactive;
                else {
                    if (PyErr_Occurred()) {
                        Py_XDECREF(alist);
                        goto Fail_1;
                    }
                    Py_INCREF(Py_None);
                    item = Py_None;
                    sqp->saw_StopIteration = 1;
                }
            }
            if (alist)
                PyTuple_SET_ITEM(alist, j, item);
            else
                break;
        }

        if (!alist)
            alist = item;

        if (numactive == 0) {
            Py_DECREF(alist);
            break;
        }

        if (func == Py_None)
            value = alist;
        else {
            value = PyEval_CallObject(func, alist);
            Py_DECREF(alist);
            if (value == NULL)
                goto Fail_1;
        }
        if (i >= len) {
            int status = PyList_Append(result, value);
            Py_DECREF(value);
            if (status < 0)
                goto Fail_1;
        }
        else if (PyList_SetItem(result, i, value) < 0)
            goto Fail_1;
    }

    if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
        goto Fail_1;

    goto Succeed;

Fail_1:
    Py_DECREF(result);
Fail_2:
    result = NULL;
Succeed:
    assert(seqs);
    for (i = 0; i < n; ++i)
        Py_XDECREF(seqs[i].it);
    PyMem_DEL(seqs);
    return result;
}



_functoolsmodule.c
/* reduce() *************************************************************/

static PyObject *
functools_reduce(PyObject *self, PyObject *args)
{
    PyObject *seq, *func, *result = NULL, *it;

    if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result))
        return NULL;
    if (result != NULL)
        Py_INCREF(result);

    it = PyObject_GetIter(seq);
    if (it == NULL) {
        PyErr_SetString(PyExc_TypeError,
            "reduce() arg 2 must support iteration");
        Py_XDECREF(result);
        return NULL;
    }

    if ((args = PyTuple_New(2)) == NULL)
        goto Fail;

    for (;;) {
        PyObject *op2;

        if (args->ob_refcnt > 1) {
            Py_DECREF(args);
            if ((args = PyTuple_New(2)) == NULL)
                goto Fail;
        }

        op2 = PyIter_Next(it);
        if (op2 == NULL) {
            if (PyErr_Occurred())
                goto Fail;
            break;
        }

        if (result == NULL)
            result = op2;
        else {
            PyTuple_SetItem(args, 0, result);
            PyTuple_SetItem(args, 1, op2);
            if ((result = PyEval_CallObject(func, args)) == NULL)
                goto Fail;
        }
    }

    Py_DECREF(args);

    if (result == NULL)
        PyErr_SetString(PyExc_TypeError,
                   "reduce() of empty sequence with no initial value");

    Py_DECREF(it);
    return result;

Fail:
    Py_XDECREF(args);
    Py_XDECREF(result);
    Py_DECREF(it);
    return NULL;
}


LFS когда-то так и не собрал. Ставил на debian 6 или ubuntu (не помню точно, что стояло тогда).
После 4 или 5 попытки собрать gcc забросил. В процессе гугления очередной проблемы особенно неожиданны были сообщения с форумов вроде «у вас не получится нужным образом собрать эту утилиту с помощью gcc 2.8, даунгрейдте до 2.6».

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

Возможно, ключ в версиях. К тем, кто все же собрал LFS, вопрос:
В какой версии какого дистрибутива и по какой версии мануала собирали? И сколько заняло времени в итоге (включая/не включая время сборки)
player.play принимает 3 аргумента (нота, длительность, надоЛиСдвигатьВремя).
Если время сдвигать надо — время = время + длительность (та самая, которая второй аргумент).
Можно также сдвинуть в ручном, так сказать, режиме.
    player.play('G3', 1/12, true);
    player.play('C4', 1/12, true);

аналогично
    player.play('G3', 1/12);
    player.move(1/12);
    player.play('C4', 1/12);
    player.move(1/12);
1

Information

Rating
Does not participate
Registered
Activity