• На чём написан язык программирования C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Учтите, что язык программирования - это просто набор спецификаций и правил. Он написан на английском языке.

    Если же вас интересует на чем запрограммированы компиляторы языка С, то самые популярные нынче развивающиеся компиляторы написаны на C и C++ соответственно:
    gcc: https://github.com/gcc-mirror/gcc
    clang: https://github.com/llvm/llvm-project/tree/main/clang

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

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

    А так, наверно, есть куча неподдерживаемых устаревших компиляторов Си на всевозможных языках.
    Ответ написан
    2 комментария
  • Как задать единый стиль в Finder?

    @ifau
    apple.stackexchange.com/a/122652
    Пункт 3 можно выполнить командой killall Finder.
    Ответ написан
    Комментировать
  • Как называются "составляющие" URL-а отделенные друг от друга слэшем?

    @m-haritonov
    Если не ошибаюсь, то "path segment".
    A path consists of a sequence of path segments separated by a slash
    ("/") character.

    https://tools.ietf.org/html/rfc3986#page-23
    Ответ написан
    Комментировать
  • Как вывести первый ключ из словаря?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Как вывести первый ключ из словаря?

    Как вывести только 'Pomidorka' из словаря?

    Вы спрашиваете как вывести первый ключ, а потом говорите про помидорку, а это третий ключ. Так чего именно вы хотите?

    Если речь о том, чтобы вообще получить все ключи из словаря, то воспользуйтесь учебником, по питону и там вы увидите:
    list(users.keys())  # ['Ivan', 'Anton', 'Pomidorka', 'Ananas']

    Такой порядок для вашего кода будет в питоне начиная с 3.6.

    Если нужно взять именно первый ключ, то так:
    list(users.keys())[0]

    Если речь о современном питоне (начиная с 3.6), то порядок ключей в словаре сохраняется при добавлении элементов, поэтому помидорку получать придётся запрашивая 2 (третий по счету) элемент списка ключей:
    list(users.keys())[2]

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

    Короче. Бесят эти лентяи, которые вместо чтения крошечной книжки для чайников задают тут тупые бестолковые и неконкретные вопросы, на которые, чтобы нормально ответить, нужно тратить уйму времени. ХВАТИТ ЭТО ТЕРПЕТЬ!
    Даёшь дизлайки за вопросы и за ответы!
    Ответ написан
    Комментировать
  • Циклический импорт в Джанго. Как избежать?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Циклический импорт - это всегда сигнал плохой архитектуры. Однако обойти это можно, задав в ForeignKey строку имени модели, вместо класса.
    Ответ написан
    6 комментариев
  • Зачем нужен celery?

    danial72
    @danial72
    flutter dart.
    Стоит использовать фреймворки из-за того, что они создают унифицированную среду, которую смогут понять все, кто прочитал документацию. К своему решению вы не напишите документации. Фреймворки дают базовый и скучный код, который никто не любит писать.
    Ответ написан
    Комментировать
  • Зачем нужен celery?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Например, очередь заданий по конвертации видео для веб-приложения на Django.

    Попытка выполнять такую задачу в Django непосредственно при обработке запросов по-умолчанию будет приводить к 504 Gateway Timeout (слишком долгий запрос) со стороны Nginx или иного HTTP-сервера.

    Попытка делать это с помощью Cron и произвольных команд Django -- немного неудобна. Допустим, Cron выполняет произвольную команду Django раз в 1 минуту:
    python3 path/manage.py convert_next_video
    , при этом первый видео файл будет конвертироваться 5 минут, после этого будет помечен в базе данных как is_converted (конвертирован) и команда на этом завершится. Через минуту cron снова запустит команду для конвертации следующего файла.

    Но за 5 минут файл ещё не будет помечен как конвертированный, поэтому cron за 5 минут создаст 4-5 процессов, которые будут конвертировать один и тот же файл.

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

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

    И что если пользователи загрузят 10 файлов каждый из которых будет конвертироваться 30 минут? Через 10-11 минут на сервере будут работать 10 процессов конвертирующих видео. Большая нагрузка на сервер. Можно завести в базе данных таблицу в которой отмечается сколько файлов конвертируется в данный момент.

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

    @MEDIOFF
    Python Developer
    Вы только учитесь, не парьтесь насчет железа, с нуля вы не будете обучать модели, так что делайте на том что есть, есть площадки типу google colab.

    P.S: для машинного обучения смотрите на видеокарту и количество CUDA ядер
    Ответ написан
    Комментировать
  • Как выбрать железо для обучения нейронной сети?

    Вашего компьютера достаточно для выхода в интернет и работы в Google Colab: обучения моделей на их ресурсах, в т.ч. с GPU.

    Для оценки требований к ресурсам можно посмотреть на общее число весов в модели. Чем больше в видеокарте CUDA-ядер и памяти, тем лучше. Но и без NVidia GPU, на слабом CPU можно тренировать и гонять модель. Просто медленнее. Много медленнее.
    Ответ написан
    Комментировать
  • Как выбрать железо для обучения нейронной сети?

    @12rbah
    Зависит от того на каком уровне вы хотите заниматься.
    Вот хорошая статья, если лень читать в конце есть TL;DR
    На проце можно обучать, но хз до какого уровня, если денег нет, то хотя бы 1050ti можно присмотреть(для начала точно хватит), с Google Colab можно работать, но там как повезет.
    Заинтересовало сделать свой проект по машинному обучению по теме human pose estimation.
    Это можно через opencv сделать, вашего железа хватит скорее всего.
    Ответ написан
    Комментировать
  • Как выбрать железо для обучения нейронной сети?

    Jump
    @Jump
    Системный администратор со стажем.
    Делайте на том что есть - указанной конфигурации прекрасно хватит для обучения.
    Если же будет конкретный реальный проект работающий с большими данными для которого мощностей не хватит - то уже под него и будете подбирать необходимый сервер.

    Другое дело что работать за компьютером с процессором 1.6 ГГц банально некомфортно - но это уже другой вопрос. Как подобрать железо для комфортной работы....

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

    @rPman
    Размер и архитектура сети плюс размер обучающей выборки.

    Не всегда количество ядер GPU оказываются решающими, большее влияние имеет размер и скорость GPU RAM.

    Первая метрика, точнее граница, ниже которой скорость обучения максимальная - объем весов сети плюс обучающая выборка должны вмещаться в оперативную память GPU.

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

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

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

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

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

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

    в общем это процесс творческий и каких то гарантий без собственно исследования дать нельзя.
    Ответ написан
    Комментировать
  • Какой регистр использовать в HTTP заголовках?

    Согласно спецификации RFC 2616, «Hypertext Transfer Protocol — HTTP/1.1», §4.2, «Message Headers»: имя заголовка регистронезависимо
    Ответ написан
    Комментировать
  • В чем отличие команд "sudo -i" и "sudo su -"?

    martin74ua
    @martin74ua Куратор тега Linux
    Linux administrator
    sudo su - полностью выполняется логин от имени рута.
    sudo -i логин эмулируется.

    Внешне разница выглядит как то так:
    [martin@martin ~]$ sudo -i
    [root@martin ~]# id
    uid=0(root) gid=0(root) группы=0(root)
    [root@martin ~]# export
    declare -x DISPLAY="localhost:10.0"
    declare -x HISTCONTROL="ignoredups"
    declare -x HISTSIZE="1000"
    declare -x HOME="/root"
    declare -x HOSTNAME="martin.office.lds.ua"
    declare -x KDEDIRS="/usr"
    declare -x LANG="ru_UA.UTF-8"
    declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
    declare -x LOGNAME="root"
    declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd                                                                       =40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=3                                                                       0;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:                                                                       *.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=0                                                                       1;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;                                                                       31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01                                                                       ;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ea                                                                       r=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31                                                                       :*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01                                                                       ;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.ti                                                                       f=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;3                                                                       5:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.og                                                                       m=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:                                                                       *.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01                                                                       ;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=                                                                       01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.                                                                       au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;                                                                       36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf                                                                       =01;36:"
    declare -x MAIL="/var/spool/mail/root"
    declare -x OLDPWD
    declare -x PATH="/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
    declare -x PWD="/root"
    declare -x QTDIR="/usr/lib64/qt-3.3"
    declare -x QT_GRAPHICSSYSTEM_CHECKED="1"
    declare -x QT_PLUGIN_PATH="/usr/lib64/kde4/plugins:/usr/lib/kde4/plugins"
    declare -x SHELL="/bin/bash"
    declare -x SHLVL="1"
    declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
    declare -x SUDO_COMMAND="/bin/bash"
    declare -x SUDO_GID="1000"
    declare -x SUDO_UID="1000"
    declare -x SUDO_USER="martin"
    declare -x TERM="linux"
    declare -x USER="root"
    declare -x USERNAME="root"
    [root@martin ~]# logout
    [martin@martin ~]$ sudo su -
    Последний вход в систему:Срд Окт 28 18:58:48 MSK 2015на pts/1
    Последняя неудачная попытка входа в систему:Пнд Ноя  2 08:51:38 MSK 2015с 211.99                                                                       .249.89на ssh:notty
    Число неудачных попыток со времени последнего входа: 30.
    [root@martin ~]# export
    declare -x HISTCONTROL="ignoredups"
    declare -x HISTSIZE="1000"
    declare -x HOME="/root"
    declare -x HOSTNAME="martin.office.lds.ua"
    declare -x KDEDIRS="/usr"
    declare -x LANG="ru_UA.UTF-8"
    declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
    declare -x LOGNAME="root"
    declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd                                                                       =40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=3                                                                       0;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:                                                                       *.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=0                                                                       1;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;                                                                       31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01                                                                       ;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ea                                                                       r=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31                                                                       :*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01                                                                       ;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.ti                                                                       f=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;3                                                                       5:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.og                                                                       m=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:                                                                       *.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01                                                                       ;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=                                                                       01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.                                                                       au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;                                                                       36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf                                                                       =01;36:"
    declare -x MAIL="/var/spool/mail/root"
    declare -x OLDPWD
    declare -x PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin                                                                       :/usr/sbin:/usr/bin:/root/bin"
    declare -x PWD="/root"
    declare -x QTDIR="/usr/lib64/qt-3.3"
    declare -x QTINC="/usr/lib64/qt-3.3/include"
    declare -x QTLIB="/usr/lib64/qt-3.3/lib"
    declare -x QT_GRAPHICSSYSTEM_CHECKED="1"
    declare -x QT_PLUGIN_PATH="/usr/lib64/kde4/plugins:/usr/lib/kde4/plugins"
    declare -x SHELL="/bin/bash"
    declare -x SHLVL="1"
    declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
    declare -x TERM="linux"
    declare -x USER="root"
    declare -x XDG_SESSION_ID="13889"
    [root@martin ~]# id
    uid=0(root) gid=0(root) группы=0(root)
    [root@martin ~]#


    как видно - при sudo su - выполнились все файлы инициализации рута, система вывела информацию о предыдущих логинах, при sudo -i - нет
    ну и environment не совпадают...
    Ответ написан
    Комментировать
  • Как в Django реализовать множественное наследование шаблонов?

    @coalesce Автор вопроса
    index.html
    {% extends 'base.html' %}
    
    {% block content %} 
        # Заполняем сейчас какие-то данные
    
        # Блок, который будем заполнять далее при наследовании необходимо помещать внутри блока который заполняется при "первом" наследовании. 
        <h1>Заголовок:
        {% block for_child %} 
            # для заполнения в будущем при наследовании
        {% endblock %}</h1>
    {% endblock %}


    спасибо Pavel Denisov
    Ответ написан
    Комментировать
  • Навигация по pgAdmin 4, просмотр записей таблиц?

    @mezhuev
    Системный администратор
    Через контекстное меню таблицы:
    4038b3f76392a2db5481262932949bcf.png
    Ответ написан
    5 комментариев
  • В чем различие == и IS в Python?

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

    Python (CPython, если быть точнее) в целях производительности кеширует короткие строки и малые целые числа, поэтому возможны такие казусы:

    >>> str1 = 'hello'
    >>> str2 = 'hello'
    >>> str1 == str2
    True
    >>> str1 is str2
    True
    >>>


    Но стоит сделать строку длиннее и всё встаёт на свои места:

    >>> str1 = 'hello, my crazy world'
    >>> str2 = 'hello, my crazy world'
    >>> str1 == str2
    True
    >>> str1 is str2
    False
    Ответ написан
    2 комментария
  • Как спроектировать связи в MongoDB?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Решил БД карточной игры перевести на MongoDB

    Зачем? Если у вас есть хотя бы 10% вероятность того что между записями появятся отношения/связи, то монга вам не подходит.

    Монгу стоит использовать исключительно для хранения денормализованных данных. То есть обычно все хранят в реляционной базе и потом делают агрегации данных в денормализованном виде что бы ускорить выборки. В этом случае у нас может быть одна база данных в нормализованном виде (mysq/postgres/etc) и много инстансов монги из которой данные только читаются, но ничего не пишется (кроме как агрегации инициированные изменением данных в реляционной бд.

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

    p.s. говорит человек который не понаслышке знает о том, насколько плохо живется если на проекте монга была выбранна основным хранилищем данных при наличии связей между ними.
    Ответ написан
    3 комментария
  • В каких случаях лучше использовать NoSQL, а в каких SQL?

    ifaustrue
    @ifaustrue
    Пишу интересное в теллеграмм канале @cooladmin
    *если в демагогию*
    NoSQL подходит для хранения, где логику взаимосвязей между объектами задаёт программист выше уровнем, SQL же напротив, обязывает описать логику хранения на уровне БД.
    Тот и другой подход имеют право на жизнь и могут быть производительней один другого в зависимости от ситуации.
    Модная тенденция перехода во многих аспектах разработки на NoSQL исходит из того, что большинство фреймворков (да и отрасль разработки в целом) созрела для перехода на эту парадигму.

    *если в практику*
    NoSQL - это чаще всего хранение типа ключ:значение, т.е. вы можете очень быстро записывать и читать парные значения, можете их быстро реплицировать, распределять, можете масштабировать эту конструкцию, всё что вам нужно в таком подходе, дак это поверх, выше уровнем абстракций описать логику связей между этими записями \ таблицами.
    В таком хранении у вас, на уровне БД, не будет возможности сказать, что поле A в таблице Аа должно быть заполнено значением из таблицы Бб и поля Б, вам придётся писать код, который сам определит эту логику.
    Само собой, вам придётся и писать логику всех запросов к данным, все джойны и так далее (хотя некоторые фреймворки облегчают или нивелирую это).
    Ответ написан
    4 комментария
  • Почему Safari не запоминает последние открытые вкладки?

    Prognosticator
    @Prognosticator
    TODO: Здесь будут ворованные умные мысли, типа мои
    Cистема Mac OS?
    Закрывайте браузер через "Safari" -> "Завершить Safari"
    Не красной пимпой в левом углу.
    И будут вкладки.
    Ответ написан