• Где можно найти описание классов java?

    @nirvimel
    В IntelliJ IDEA курсор на интересующий класс/метод и Ctrl+B == все что нужно для глубокого понимания внутренней структуры.
    Ответ написан
    1 комментарий
  • Сохранение древовидной структуры в файл, best way?

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

    Это в любом случае неизбежно. Единственно что можно сделать для сокращения дискового I/O - это, вместо записи множества кусков (через seek->write->seek->write), использовать встроенные в ОС механизм memory mapping (в Java он реализован через MappedByteBuffer), тогда проблема оптимизации кеширования и сброса буферов на диск ложится полностью на ОС.
    Ответ написан
    2 комментария
  • Может ли кто-то получить доступ к файлам сайта кроме хостинг провайдера?

    @nirvimel
    На ум приходит только несколько простых действий по настройке .htaccess, robots.txt

    robots.txt - не имеет никакого отношения к разграничению доступа, это просто некое соглашение между гугл-ботом и владельцем сайта, позволяющие не усложнять жизнь друг другу.
    .htaccess - это и есть конфиг Apache, определяющий как веб-сервер обрабатывает HTTP-запросы и что, как и кому (авторизация/сессии юзеров) отдает в ответ. Веб-сервер можно заставить отдавать/не_отдавать содержимое файловой системы как угодно. В общем случае содержимое "сайта" (такое расплывчатое понятие) "показываемое" (доступное) HTTP-клиенту совсем не обязательно повторяет структуру каталогов в файловой системе сервера (представление о том что веб-сервер "открывает" содержимое файловой системы в Сеть исторически сложилось благодаря соответствующей архитектуре Apache, который изначально разрабатывался для статических сайтов).
    Даже без всякого конфигурирования .htaccess на всех серьезных хостингах по умолчанию публично открыто только содержимое public_html (только на совсем школьных хостингах публичный доступ идет от корня по умолчанию), все что находится выше по уровню недоступно со стороны Сети (если только специально не открыть через .htaccess).

    spoiler
    Могут ли идейные люди ...

    Много таких "идейных" по весне оттаяло. Везде они могут получить доступ (на словах), хацкеры диванные, попугаи-попугайчики.
    Ответ написан
    Комментировать
  • Законность предоставления провайдером данных о пользователе правоохранительным органам, после отзыва обработки персональных данных?

    @nirvimel
    Провайдер по запросу правоохранительных органов выдает сведения о пользователях.

    В РФ ничего подобного нет: ни запросов, ни головной боли у провайдеров по поводу их исполнения. Тут все происходит гораздо проще и элегантнее: чтобы получить лицензию на соответствующий вид деятельности, провайдер покупает за свои деньги оборудование СОРМ, устанавливает его у себя в качестве шлюза (весь трафик идет через него), ему опечатывают это оборудование так, чтобы он сам не мог там копаться. Дальше полная автоматика, никаких официальных запросов, никаких бумаг, никакой бюрократии. Внутри самой СОРМ любая информация доступна сотрудникам по одному клику, без срока давности (хранение полного лога трафика, конечно, ограничено техническими возможностями, но метаданные хранятся практически вечно). Список лиц (а существует ли он вообще), за которыми ведется наблюдение является секретной информации и не предоставляется гражданским лицам без соответствующего уровня допуска (то есть всем, кроме самих сотрудников и их руководства), именно так обычно и значится во всех официальных ответах на любые попытки гражданских запросить свой статус (под наблюдением или нет).

    Незаконно добытые сведения не могут быть доказательством в суде, верно же?

    Смеялись всем отделением. Поверьте, никто не станет напрягаться, чтобы собирать какие-то доказательства, все доказательства человек предоставит сам, как только окажется в отделении (вы сомневаетесь? а сами вы там бывали?). Есть только одна проблема - найти того самого человека. Для решения этой проблемы и существует СОРМ.
    Ответ написан
    4 комментария
  • Отказ возврата товара Юлмартом со статусом "мех повреждение" законно ли?

    @nirvimel
    Эх, Юлмарт.Дисконт, сколько воспоминаний... Однажды в 2014 я писал для одной конторы бота, который должен был перехватывать "горячие" позиции выставляемые по неадекватно низким ценам. Бот проводит оперативную оценку по Яндекс.Маркету ("горячие" варианты случаются, только по тем позициям, которые уже отсутствуют в их собственном ассортименте на момент уценки, по тем позициям, которые еще торгуются, они никогда не ошибаются с ценами) и перемножает на коэффициент, вычисляемый от заявленного состояния товара.
    Так вот за первые двое суток его боевого применения случилось больше десяти срабатываний (и это только в одной товарной категории! правда, это был конец декабря). Подобных "горячих" позиций я никогда не видел при ручном серфинге, подозревал, что это сказки. Я выключил бота когда мелких заказов оформилось где-то на 35к руб. на разные аккаунты. Забирать все это поехал один коллега, вернулся ни с чем - из всех заказов не доставлено ни одного! (все заказы в ЛК в актуальном состоянии, дата получения - это число). Единственное, что смог сказать ему менеджер, что так бывает очень редко, когда две заявки приходят одновременно, то обе могут забронироваться до того, как произойдет списание с остатков (похоже, эти индусы не слышали про атомарные транзакции), а логистика исполняет ту, у которой отметка времени чуть раньше.
    Я задумался: мой бот проверяет обновления раз в минуту и сразу оформляет заказ, как только находит подходящий вариант, но из более десяти заказов ему не достался ни один, у него увели из под носа все, это значит, что кто-то парсит и бронирует быстрее его, намного быстрее! Кто бы это мог быть? Только другой чей-то бот! Похоже, на тот момент у кого-то уже был построен на этом свой бизнес. Мы опоздали.
    С тех под я не занимался Юлмарт.Дисконт-ом, не имею понятия, как там сейчас обстоят дела.
    Ответ написан
    1 комментарий
  • Каким способом сделать свой графический векторный редактор?

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

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

    @nirvimel
    1) На DO я как бы арендую себе комп, который будет моим сервером, верно? Потом устанавливаю туда, скажем, nginx, и трачу пару ночей и кучу нервов на настройку.

    Да.
    VPS - Это, с одной стороны, что-то вроде виртуальной машины, кучу которых можно запускать/останавливать на одной физической. С другой стороны, все, что говорят про более низкую производительно ОС в виртуальной машине (по сравнению с ОС на живом железе), это практически не относится к VPS (причина - разные принципы виртуализации).

    2) Нужно будет скинуть на сервер исходники моего проекта, например, посредством клонирования репозитория с github'а. И зависимости установить + со статикой разобраться. Статику сам nginx должен раздавать, а не django (использую этот фреймворк), тк это эффективнее.

    При разработке на интерпретируемом языке это неизбежно.

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

    Да.

    4) Для связи с сервером лучше иметь Линукс на локальной машине.

    Управление сервером идет по SSH. ОС на локальной машине может быть любая. Из-под Windows, например, можно работать через PuTTy.
    Ответ написан
    2 комментария
  • Допустимо ли пользоваться часть исходного кода, под mit license?

    @nirvimel
    500-800 строк кода - это ничто (особенно, если речь о рыхлом коде JavaScript).
    Пройтись по нему мощный рефакторингом с переименованием всех идентификаторов, размазать логику функций по нескольким функциям, вывернуть наружу все методы классов, настрочить новых классов и завернуть туда куски, которые оказались снаружи. На все уйдет пару часов. То что в итоге останется от кода, мать родная не узнает.
    Ответ написан
    Комментировать
  • Как подключить зашифрованный виртуальный диск virtualbox?

    @nirvimel
    Никак.

    Images which have the data encrypted are not portable between VirtualBox and other virtualization software.
    9.31. Encryption of disk images
    Ответ написан
    Комментировать
  • Включение кипятильника?

    @nirvimel
    Конечно же реле! Симистор вообще для других задач, там где нужны частоты начиная от десятков герц хотя бы. Например, в блоках питания, во всяких силовых преобразователях. А, если нужен просто ключ, не нужна частота выше пары герц и нет жестких требований (в миллисекундах) на задержки переключения, то для этого (очень давно) существует реле.
    Ответ написан
    Комментировать
  • Что выбрать с++, с или go для алгоритма?

    @nirvimel
    А я подобные числодробилки пишу на Python (не спешите смеяться) с применением Numba.
    700 млн * 64бит == 5.6Гб памяти. У меня столько нет, поэтому я возьму половину.
    Итак, выборка 100 тысяч 64-битных значений из 350 миллионов пролетает за 0.315 секунд, значит с 700 миллионами я почти уложился бы в 0.6 секунд. Все это на довольно дешевом Pentium.
    Это явно предел производительности железа и никакие ассемблеры не смогут ускорить решение этой задачи (более, чем на несколько процентов).
    import numba as nb
    import numpy as np
    import time
    
    max_value = np.iinfo(np.intc).max
    
    
    @nb.jit(nopython=True)
    def search(src, dst):
        src_size, = src.shape
        dst_size, = dst.shape
        factor = max_value / src_size * dst_size
        dst_ptr = 0
        for src_ptr in range(src.size):
            value = src[src_ptr]
            if value < factor and dst_ptr < dst_size:
                dst[dst_ptr] = value
                dst_ptr += 1
    
    
    def search_and_time_it(from_size, to_size):
        src = np.random.randint(max_value, size=from_size)
        dst = np.empty((to_size,))
        t1 = time.time()
        search(src, dst)
        t2 = time.time()
        print('search {0:,d} values from {1:,d} takes {2:.3f} seconds'.format(to_size, from_size, t2 - t1))
    
    
    # search 100 000 values from 350 000 000
    search_and_time_it(350 * 1000 * 1000, 100 * 1000)

    Результат:
    search 100,000 values from 350,000,000 takes 0.315 seconds
    Ответ написан
    4 комментария
  • Как проводить продвижение инновационных источников света в теплицах?

    @nirvimel
    Теплицы с искусственным освещением приобретают актуальность при переходе на интенсивное земледелие. В России, как и в большей части стран СНГ, в настоящий момент такой переход еще не произошел (даже необходимость его еще не осознанна) и земледелие продолжает вестись в основном экстенсивными методами. Это обуславливает низкий интерес к внедрению высоких технологий в этой сфере. По этой причине традиционные средства рекламы мало эффективны. Но в следствии высоких уровней коррупции и традиционной восприимчивости менеджеров среднего и звена к "импульсам сверху", весьма эффективным может оказаться "кабинетный" способ продвижения на "рынок" гос.закупок, а через него и на коммерческий рынок, благодаря привычке к подражательству, распространенной также среди коммерческих директоров, вышедших из среды фермеров.

    spoiler
    Инновация = синий+красный светодиод.
    Ответ написан
    1 комментарий
  • Обработка потоков на сервере мессенджера?

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

    @nirvimel
    В документации реализация этих функций записана в императивном стиле видимо для наглядности (ИМХО, наглядность довольно спорная). Можно попробовать записать их в функциональном стиле - это не сложно (напомню, что all - это конъюнкция всех элементов списка/итератора, приведенных к логическому типу, а any - соответственно, дизъюнкция).
    import operator
    
    all = lambda xs: reduce(operator.__and__, map(bool, xs), True)
    any = lambda xs: reduce(operator.__or__, map(bool, xs), False)

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

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

    @nirvimel
    Я пользуюсь pyuic4. Во всех рекомендациях пишут тоже в основном про этот метод. Про возможность прямого подключения *.ui слышал только в одном месте.
    Ответ написан
    1 комментарий
  • Как перебрать все различные ходы в тетрисе?

    @nirvimel
    У фигуры 4 возможных положения поворота. Количество различных положений для каждого поворота равно ширине поля минус ширина фигуры. Для каждого различного положения по X существует только одно конечное положение по Y. Это значение Y - глубина, до которой падает фигура, она равно минимальному из значений глубины, до которой может упасть каждая точка фигуры, а эти значения равны суммам y(x) формы нижнего края фигуры и y(x) формы верхнего края "мусора", лежащего на поле.
    Ответ написан
    2 комментария
  • Как проверять загрузку файла по ссылке?

    @nirvimel
    В числе заголовков HTTP ответа есть Content-Type, который принимает значение одного из MIME-типов. Значение text/html соответствует HTML-странице, а значение application/octet-stream соответствует загружаемому файлу.
    import requests
    
    if __name__ == "__main__":
        r = requests.get('https://toster.ru/q/303883')
        r.raise_for_status()
        mime_type = r.headers['content-type']
        if mime_type == 'application/octet-stream':
            print('It is a binary file')
        if mime_type.startswith('text/'):
            print('It is a text')
    Ответ написан
    Комментировать
  • Как запаковать папку с файлами с помощью BitesIO в Python?

    @nirvimel
    import os
    import io
    import zipfile
    
    
    def zip_directory_into_bytes(path):
        bio = io.BytesIO()
        with zipfile.ZipFile(bio, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
            abs_path = os.path.abspath(path)
            for dir_name, sub_dirs, files in os.walk(path):
                for filename in files:
                    abs_name = os.path.abspath(os.path.join(dir_name, filename))
                    file_name = abs_name[len(abs_path) + 1:]
                    zf.write(abs_name, file_name)
        return bio.getvalue()
    
    
    if __name__ == "__main__":
        with open('test.zip', 'wb') as f:
            f.write(zip_directory_into_bytes('.'))
    Ответ написан
    Комментировать
  • Почему пишут вот так?

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