Задать вопрос
  • Какие права выставить на файл sqlite базы?

    shurshur
    @shurshur
    сергей кузьмин, я использовал с внешним lock-файлом, сделал многопроцессный клиент для разового прогона вызовов в некоторый API по огромному списку, нормально работало и не надо было переоткрывать базу после каждой операции.
  • Какие права выставить на файл sqlite базы?

    shurshur
    @shurshur
    freeExec, это особенность винды, а не sqlite.
  • Как восстановить пароль к установленной программе в Windows?

    shurshur
    @shurshur
    В общем случае задача не имеет решения, так как у каждой программы может быть свой абсолютно уникальный механизм хранения пароля. А так надо бы называть конкретные программы, может и помогут. Со сферической в вакууме - вряд ли.
  • Как получить путь до рабочего стола пользователя Ubuntu?

    shurshur
    @shurshur
    Alexey Zolotarev, какие есть идеи:

    1. Просто игнорировать по имени:

    if [ $(basename $dir) != "lost+found" ]

    2. Проверять существование пользователя с таким именем (кавычки вокруг BASENAME, так как в имени каталога могут быть пробелы и всякие другие символы):

    BASENAME=$(basename $dir)
    if [ -n "$(getent passwd \"$BASENAME\")" ]


    3. Можно вообще плясать от имён пользователей, фильтруя по uid и можно даже дополнительно по shell (в примере только bash, хотя хорошо бы проверять все из списка в файле /etc/shells) реальных от системных, заодно обрабатывая home в нестандартных расположениях:

    getent passwd|while read line
    do
      USER=$(echo "$line"|cut -d : -f 1)
      USER_ID=$(echo "$line"|cut -d : -f 3)
      HOME=$(echo "$line"|cut -d : -f 6)
      SHELL=$(echo "$line"|cut -d : -f 7)
      ## или так:
      ##IFS=: read USER DUMMY_PASS USER_ID GROUP_ID GECOS HOME SHELL < <(echo "$line")
      if [ $USER_ID -ge 1000 -a $USER_ID -le 2000 -a "$SHELL" = "/bin/bash" ]
      then
        do_something_with_user_and_home $USER $HOME
      fi
    done


    В общем, в bash можно много прикольных вещей делать...
  • Бот проверки подписки в телеграм работает не корректно, как исправить?

    shurshur
    @shurshur
    IllIDan3, да, на кавычки я не обратил внимание. Ещё удивлялся, что по вопросу там 2 сообщения, а не 3. Но надо переделать, ибо всё равно плохо было.
  • Как получить путь до рабочего стола пользователя Ubuntu?

    shurshur
    @shurshur
    lost+found это НЕ пользователь. Это каталог для потерянных файлов, который создаёт mkfs или fsck. И у пользователя может не быть "рабочего стола", если он никогда не совершал графический вход в систему. А также он может называться иначе, если его локаль отличается от русской.

    Правильнее добавлять .desktop-файлы в общее меню через каталог /usr/share/applications (точное расположение может зависеть от дистрибутива). Но это больше для разработчиков пакетов конкретного дистриба. Для всяких скриптиков и самописных инсталляторов лучше добавлять конкретному пользователю через xdg-desktop-menu / xdg-desktop-icon. А если очень хочется получить доступ к правильному локализованному пути к рабочему столу текущего пользователя, то это делается так:

    xdg-user-dir DESKTOP
  • Как сделать из int str?

    shurshur
    @shurshur
    Артём Смирнов, конструкция

    x is y == z

    будет в зависимости от приоритета операторов (я наизусть не помню) разбираться одним из двух способов:

    (x is y) == z
    x is (y == z)

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

    В каждом из двух случаев в скобках будет True или False (думаю, чаще всего False). В итоге будет выполняться проверка по одному из четырёх сценариев:

    True == z
    False == z
    x is True
    x is False

    Поскольку, как я думаю, ни mem, ни adm не являются булевыми значениями, эта проверка будет возвращать False ВСЕГДА. Поэтому неудивительно, что она не работает.
  • Как сделать из int str?

    shurshur
    @shurshur
    Артём Смирнов,
    Что означает эта конструкция?

    if mem is role[2] == adm
  • Что делать дальше?

    shurshur
    @shurshur
    Api tulanof, django достаточно монструозный и предполагает использование ORM. Много где его использование будет сродни покупки дорогого сложного профессионального инструмента для забивания пары гвоздей.
  • Как сделать из int str?

    shurshur
    @shurshur
    Артём Смирнов, у INSERT есть, грубо говоря, два основных синтаксиса:

    INSERT INTO имя_таблицы VALUES (значение1, значение2, значение3...);


    - это вставит значения в таблице по порядку следования колонок в оригинале, то есть если там три поля id, name, birthdate, то три поля в INSERT должны идти в строго таком порядке. И ничего нельзя пропустить - ругнётся.

    INSERT INTO имя_таблицы (колонка1, колонка2, колонка3) VALUES (значение1, значение2, значение3...);


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

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

    Из других способов использования можно делать insert from select. Например, пусть есть таблица vip_users с датой окончания вип-статуса, тогда выдать vip всем пользователям с некоторым условием (в примере - зарегистрировавшимся с 1 мая) можно так:

    INSERT INTO vip_users (user_id, name, vip_end_date) SELECT id, name, '2022-12-31' FROM users WHERE register_date >= '2022-05-01';


    (Это, как всегда, чисто пример. Возможно, вип-статус может быть интереснее хранить непосредственно в основной таблице users, и похожий пример будет чуть ниже)

    Что касается CAST, то его можно использовать так. Пусть у нас простая таблица:

    CREATE TABLE test (x INT, y TEXT);
    INSERT INTO test (1, 2);
    INSERT INTO test (2, 'a');


    Тогда в таком запросе:

    SELECT * FROM test;

    мы получим в своей программе: (1, '2'), (2, 'a') - то есть первое будет числом, второе строкой.

    SELECT CAST(x AS TEXT), y FROM test;

    - оба будут строками: ('1', '2'), ('2', 'a').

    SELECT x, CAST(y AS INT) FROM test;

    - тут первая строка может быть приведена к числам (1, 2), а во второй есть нюанс (тм) который разные движки баз данных могут решить по-разному. Например, sqlite3 (только что проверил) заменит значение на 0 и получится (2, 0). А вот Postgres или Oracle, насколько я помню, грязно ругнутся.

    Так вот, CAST - это приведение типов. И CAST (admin AS TEXT) приводит admin из его основного типа к текстовому. Вопрос в том, где этот admin взять, если его использовать в части ЗНАЧЕНИЙ в INSERT. Там должны быть именно значения, а не отсылки к каким-то другим колонкам, тем более что вставляемая строка новая и никаких значений у неё ещё нет.

    Если надо не новую строку вставить, а изменить существующую, то это делается через UPDATE:

    UPDATE users SET vip_status=1,vip_end_date='2022-12-31'; -- поменяет все строки таблицы
    UPDATE users SET vip_status=1,vip_end_date='2022-12-31' WHERE register_date>='2022-05-01'; -- поменяет строки по указанному условию
    UPDATE users SET vip_status=0 WHERE id IN (SELECT user_id FROM banned_users); -- поменяет для списка id, взятых из запроса по другой таблице


    Я советую всё же отвлечься и почитать по любому наглядному объяснению основы SQL и реляционных баз данных: что такое SELECT/INSERT/UPDATE, как использовать JOIN и чем он отличается от LEFT JOIN и FULL JOIN. Многое станет понятнее. Тем более что знания SQL сами по себе очень полезны.
  • Как объединить строки в bash скрипте?

    shurshur
    @shurshur
    xotkot, ну похоже автор решил без переносов строк. Что странно. Я на это не обратил внимание. А попытка складывать всё во временный файл с фиксированным именем меня впечатлила сразу и я пошёл там объяснять.

    Я awk использую крайне редко и больше для тривиального форматирования вывода (впрочем, я им часто даже cut заменяю по привычке), потому что никаких преимуществ перед набросать скрипт на более универсальном языке я для себя не вижу. То же самое с sed - его использую для in-place редактирования, а так в случае чуть более сложной регулярки перехожу на perl -pne.
  • Как объединить строки в bash скрипте?

    shurshur
    @shurshur
    xotkot, ну, я думаю что автор вопроса дальше придёт с вопросом как вставить между "строками" пробелы :)

    В любом случае, использование awk выглядит довольно странно для этой задачи. И хорошо ещё, что он в $0 не сохраняет перенос строки, на что регулярно напарываются люди с однострочниками на perl/python.
  • Как вывести массив одним сообщением чтобы значение было с новой строчке?

    shurshur
    @shurshur
    Zhenia Bel, а вот это уже никак не исправить, нельзя обойти лимит. Только делить на несколько сообщений. Например, можно поделить на части по 10 строк как-то так:

    for ...:
       answer_message_list.append(...)
    ...
    [await message.answer("\n".join(answer_message_list[i:i+10]) for i in range(0, len(answer_message_list), 10)]


    Но надо учитывать, что есть rate limit, если там будет 1000 сообщений, то так не получится.

    Вообще, если ответ не влезает в одно-два сообщения, то скорее всего лучше пересмотреть, как его выводить. Примеры решений:

    1. Выводить первые N и кнопку "показать следующие.

    2. Сделать просто постраничный вывод с кнопками листания.

    3. Показывать первые N и сообщение типа "уточните условия поиска", а для них какую-нибудь команду /search.
  • Как объединить строки в bash скрипте?

    shurshur
    @shurshur
    xotkot, а чего бы не почитать мои комментарии к этому "ответу", где я объясняю, что это не работает?
  • Как объединить строки в bash скрипте?

    shurshur
    @shurshur
    mayton2019, а если исходный файл будет размером в террабайт, то от временного файла толку будет ещё меньше. При работе через pipe хотя бы всё ограничивается размером буфера...
  • Как интегрировать Яндекс Диск?

    shurshur
    @shurshur
    А у яндекса его уже совсем закрыли? Я когда-то пользовался...

    В камментах пишут, что да, уже всё...

    Судя по сайту яндекса, они только разработчикам приложений дают доступ после review...
  • Как объединить строки в bash скрипте?

    shurshur
    @shurshur
    mayton2019, ах да, самое главное: зачем делать cat файла и строки, которую в него добавляем? Надо делать echo $line >> $file_name.
  • Как объединить строки в bash скрипте?

    shurshur
    @shurshur
    mayton2019, спасение есть. Во-первых, можно каждому скрипту использовать свой файл, используя PID процесса, который будет уникален:

    temp_file_name=temp$$.txt

    Во-вторых, для временных файлов есть специальная команда mktemp

    temp_file_name=$(mktemp)

    или если хочется чтобы файл был в более предсказуемом месте и с более понятным именем:

    temp_file_name=$(mktemp /tmp/temporary_file_XXXX.txt)


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

    В-третьих и самых главных - вообще не нужно никаких временных файлов для решения этой задачи...
  • Как объединить строки в bash скрипте?

    shurshur
    @shurshur
    xotkot, зачем использовать awk для задачи, которую быстрее и проще делает cat?