Ответы пользователя по тегу Программирование
  • Как написать кастомный софт под мой смартфон?

    @nirvimel
    После заливки непротестированной прошивки прямо в живой телефон с вероятностью 99.99% он превратится в кирпич.
    Так прошивки не разрабатывает никто, включая тех, кто их разрабатывает профессионально.

    С чего начинать? - С покупки специальной Development Board под целевой SoC, например.
    Ответ написан
    Комментировать
  • На чем основан принцип обучаемости нейронных сетей?

    @nirvimel
    Нейронная сеть (как природная, так и искусственная) по сути своей представят функцию (да, Y=F(X) только очень сложную), выходом Y которой является некоторое поведение субъекта (или программы), а входом X служит некоторая императивная информация (от органов чувств, например). Суть обучения в поиске оптимального значения F(X), при котором достигается наилучшая приспособленность субъекта/программы к поставленной задаче (для живых существ задача - выживание). Обучение происходит путем мелких итеративных шагов от менее оптимальных вариантов функции F к более оптимальным (а не перебором всех возможных вариантов). Подавая на вход F различные значения X, учитель (или естественный отбор) "поощряет" варианты, при которых F дает на выходе более точные значения Y (лучше соответствующие поставленной задаче) и "наказывает" за худшие (относительно предыдущих достижений) варианты. "Поощрение" и "наказание" происходит путем (нерезкого) усиления/ослабления тех нейронных связей, которые были более других задействованы в ходе последней итерации, то есть внесли в успех/неудачу наибольший вклад. Таким образом в ходе мелких последовательных итераций "интеллект" (возможно даже без кавычек) нейронной сети постепенно затачивается под решаемую задачу (простой перебор не дал бы таких результатов и за 100500 лет).
    Ответ написан
    3 комментария
  • Сервер для сети чатов (как Slack, например)?

    @nirvimel
    Архитектура высоких нагрузок - недавно мелькала на Тостере эта ссылка.
    Ответ написан
    Комментировать
  • Неоплачиваемая стажировка, без знаний. Реально ли?

    @nirvimel
    Эникей -> Заправка принтеров -> Установка Windows -> 1С.
    В былые времена 95% админов начинали с этого и проходили этот путь.

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

    @nirvimel
    Если бы присутствовали жесткие условия типа того, что объем данных 10 гигабайт и надо уложиться в 10 секунд обработки, тогда выбор рабочего инструмента сужался бы. А так, в том виде, в котором задача поставлена, она решается на любом языке программирования общего назначения (а, возможно, даже удастся обойтись вообще без программирования, например в Excel).
    Ответ написан
    3 комментария
  • Клиент хочет автоматизировать загрузку каталога на сайт через CSV, как это сделать если есть сложные описания?

    @nirvimel
    Вот qwerty.csv с длинными строками, разметкой, тегами и кавычками. Приготовлен он в LibreOffice Calk (пусть будет Excel). При сохранении заданны параметры: "разделитель полей": ,, "разделитель текста": ", "выделять кавычками все текстовые ячейки".
    1,"Тайтл","<h1 itemprop=""name "" class=""question__title"">
      Клиент хочет автоматизировать загрузку каталога на сайт через CSV, как это сделать если есть сложные описания?</h1>"
    2,"Теги","<ul class=""tags-list"">
                  <li class=""tags-list__item subscribed tag_158794"">
              <a href=""https://toster.ru/tag/csv"">
                Csv          </a>
            </li>
                        <li class=""tags-list__item subscribed tag_152707"">
              <a href=""https://toster.ru/tag/программирование"">
                Программирование          </a>
            </li>
                        <li class=""tags-list__item  tag_260"">
              <a href=""https://toster.ru/tag/php"">
                PHP          </a>
            </li>
                    </ul>"

    Вот скрипт на Python (извините, PHP на сегодня закончился), который выводит в консоль содержимое qwerty.csv построчно, раздельно все поля (№, Name, Description).
    import csv
    with open('qwerty.csv', 'rb') as csvfile:
        for row in csv.reader(csvfile, delimiter=r',', quotechar=r'"'):
            print ("# %s\nName: %s\nDescription: %s\n" % tuple(row))

    Как видите все обрабатывается корректно, включая большие куски HTML, никакие строки и поля не смешиваются:
    # 1
    Name: Тайтл
    Description: <h1 itemprop="name " class="question__title">
      Клиент хочет автоматизировать загрузку каталога на сайт через CSV, как это сделать если есть сложные описания?</h1>
    # 2
    Name: Теги
    Description: <ul class="tags-list">
                  <li class="tags-list__item subscribed tag_158794">
              <a href="https://toster.ru/tag/csv">
                Csv          </a>
            </li>
                        <li class="tags-list__item subscribed tag_152707">
              <a href="https://toster.ru/tag/программирование">
                Программирование          </a>
            </li>
                        <li class="tags-list__item  tag_260">
              <a href="https://toster.ru/tag/php">
                PHP          </a>
            </li>
                    </ul>
    Ответ написан
    Комментировать
  • Как выглядит 128 битное число?

    @nirvimel
    340282366920938463463374607431768211455 - это максимальное беззнаковое.
    Можно получить из консоли командой:
    python -c 'print (2**128 - 1)'
    Ответ написан
    1 комментарий
  • На сколько ресурса затратно операция получения даты - микросекунд с 1970 в современных языках?

    @nirvimel
    На большинстве (всех?) современных ОС получение времени - это функция ядра. Следовательно для пользовательского процесса в userspace это требует ровно один вызов в ядро, который представляет собой syscall, то есть программное прерывание. На стороне ядра код обычно тривиальный и заключается в получении значения переменной, в которой хранится время (эта переменная инкрементируется из обработчика прерывания таймера), и возврате этого значения через sysret, то есть возврат из прерывания. Поэтому основные временные затраты сводятся к исполнению syscall/sysret и сохранению/восстановлению контекста пользовательского процесса при входе/выходе в/из ядра.
    От единиц измерения (нано/мирко/милли) скорость вызова практически не зависит. Конвертация одних единиц в другие происходит на стороне пользовательского процесса, за это отвечают библиотеки и окружение конкретного языка, но эти вычисления составляют всего несколько машинных инструкций и не вносят значительный вклад общее время вызова.

    В Linux существуют несколько таймеров в ядре: высокого/обычного разрешения и переводимые/непереводимые назад, но получение времени происходит через одну функцию clock_gettime как бы по-разному это не выглядело в разных ЯВУ.

    В Windows стандартные механизмы GetSystemTime и GetTickCount выдают время только с миллисекундной точностью. А таймер высокого разрешения QueryPerformanceCounter предназначен только для измерения временных интервалов, его абсолютное значение не имеет смысла.

    Историческая справка: В реальном режиме работы x86 до тех пор, пока BIOS владеет аппаратным прерыванием таймера и таймер настроен по умолчанию (его еще можно перенастраивать), то есть с интервалом в 55ms и частотой в 18.2 герц, на каждый тик таймера инкрементируется четырехбайтное значение по абсолютному адресу 0:046C. Так что пользовательская программа (термин процесс тут не совсем применим) может получить значение времени мгновенно простым считыванием этого значения из памяти без каких-либо вызовов.
    Стоит отметить, что данный функционал не имеет никакого отношения к DOS или какой-либо ОС вообще, а прошит в BIOS любого x86-совместимого (даже современного) компьютера и действителен каждый раз при загрузке машины вплоть до момента перевода процессора в защищенный режим в момент загрузки ядра современной ОС.
    Ответ написан
    Комментировать
  • Есть ли учебники по программированию (JS, PHP и пр.) в таком же музыкально-развлекательном формате?

    @nirvimel
    Глядя на этих плясунов, я понял смысл всех массовых танцев в мире: все это - не доведенные до завершения, попытки исполнения bogosort.
    Ответ написан
    Комментировать
  • Что происходит, если не закрыть подключение к БД?

    @nirvimel
    Каждое подключение к СУБД - это открытый сокет (TCP, IPC, или UNIX-сокет), плюс на обеих сторонах (клиент и сервер) структуры данных, в которых хранится состояние этого соединения, и (самое главное) кеши данных, которые могут вырастать до довольно больших размеров (например, если там застряли результаты всех выборок данных, выполненных через это соединение, такой вариант возможен). Но это не самое страшное. Гораздо хуже то, что в конфигах почти любой СУБД обозначен лимит активных подключений, после достижения которого сервер перестает принимать новые подключения. И этот лимит задан с расчетом на то, чтобы сервер справлялся с соответствующим количеством реально активных (то есть относительно нагруженных) подключений, не зависал при этом и не вычерпывал бы всю память при попытке выполнить запросы от всех подключений одновременно. Соответственно этот лимит задан довольно низко и не рассчитан на то, чтобы зависшие подключения накапливались десятками тысяч.
    Но есть и приятная новость: короткоживущим процессам (типа скриптов на веб-сервере), можно не заботится о закрытии соединений вообще, потому что при уничтожении процесса в любом случае закрываются все открытые дескрипторы в том числе и сокеты, а при разрыве одной стороны сокета, автоматически закрывается и другая, все функции висящие в ожидании на этом сокете, вылетают с ошибкой, сервер безусловно рассчитан на это, он сразу освобождает все выделенные ресурсы, относящиеся к соединению, сокет которого оказался разорван.
    Следует иметь в виду, что в зависимости от реализации веб-сервера сам процесс может и не уничтожаться по завершению работы скрипта.
    Ответ написан
    Комментировать
  • Каким способом сделать свой графический векторный редактор?

    @nirvimel
    легко будет сделать такое из программ с открытым кодом: Inkscape, Sk2.0, Skensil?

    Нет.
    Гораздо легче будет написать консольный скрипт, который берет на вход файл с картинкой в векторном формате, предварительно подготовленной в профессиональном редакторе, при помощи поворотов и отражений, делает из нее снежинку, и сохраняет результат в выходной файл.
    Ответ написан
    4 комментария
  • Обработка потоков на сервере мессенджера?

    @nirvimel
    Количество потоков не равно количеству открытых сокетов. Расходовать на каждое подключение отдельный поток ни в коем случае нельзя. Но синхронно закрывать сокет после обработки подключения совсем не обязательно. Сокет - просто значение ячейки массива (или карты) будет взято и использовано когда понадобится в любом потоке (работа с конкретным сокетом, конечно, должна быть обернута в соответствующий синхроблок). Единственно, о чем не следует забывать это - KeepAlive пинги (отдельный пул потоков и таймера под них, например), которые обеспечивают сразу две задачи: 1) помогают удержать неактивное соединение (умные роутеры любят закрывать "мертвые" соединения, и клиент, в зависимости от реализации, может делать то же). 2) очищают список сокетов от реально мертвых.
    Ответ написан
    2 комментария
  • Чтение Excel файлов. Какой выбрать язык программирования?

    @nirvimel
    100500 различных версий формата файла - это не проблема языка программирования и библиотеки, это проблема только самого Excel, и не более. Надо заставить его самого решать свои проблемы - написать скрипт, который заставляет Excel открывать свои поделки и экспортировать их содержимое в человеческий формат. После чего можно уже нормально программно работать с данными в удобном формате удобными инструментами без перерасхода памяти. В качестве формата данных можно взять CSV, например, хотя выбор вариантов огромный.
    Ответ написан
    1 комментарий
  • Как реализовать точный алгоритм правильной раскраски рёбер графа?

    @nirvimel
    Существуют алгоритмы полиномиального времени, создающие оптимальную раскраску двудольных графов и раскраску простого не двудольного графа с числом цветов {\Delta}+1.

    Однако, в общем случае, задача поиска оптимальной рёберной раскраски NP-полна и самый быстрый из известных алгоритмов для неё работает за экспоненциальное время.

    Рёберная раскраска

    Итак, можно найти раскраску в Delta + 1 цветов за полиномиальное время (что тоже может оказаться совсем не быстро). Но чтобы доказать, что не существует раскраски (иначе, найти ее) ровно в Delta цветов, необходимо решить NP-полную задачу за экспоненциальное время.
    (Delta - максимальная степень вершины).
    Ответ написан
  • Генерация случайного математического выражения на основе результата?

    @nirvimel
    Ваш алгоритм нужно совсем немного доработать: К каждому из чисел в полученном выражении рекурсивно применить ту же функцию генерации выражения, и, полученные последовательности действий, склеить как склеивают строки (удобно для этого использовать связанные списки).
    Настройка сложности может заключаться в задании фиксированной глубины рекурсии или в задании коэффициента распределения случайной величины, которая определяет, следует ли на конкретном шаге уходить дальше в глубь рекурсии, или вернуть текущий результат наверх.
    И расстановку скобок совсем несложно прикрутить.
    Ответ написан
    Комментировать