Какая операционная система лучше для ноутбука?

Апрель 12, 2024, 13:04 - Время чтения: ~1 минут

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

При выборе операционной системы для ноутбука первое, что следует учитывать, является цель использования устройства. Linux может быть хорошим выбором для тех, кто занимается разработкой программного обеспечения, аналитикой данных или другими техническими задачами. Большинство программ работают на современных ноутбуках. Многие дистрибутивы Linux на базе ядра доступны в России. Лучшие варианты — Alt Linux и Astra Linux. Вам могут подойти Ubuntu, Linux Mint и Majaro, а также отечественные варианты. Кроме того, не забывайте использовать системы на альтернативных ядрах, похожих на Unix. Как OpenBSD.

Windows может быть лучшим вариантом, если вам нужна совместимость с продуктами Adobe, играми и офисным пакетом Microsoft.

Для тех, кто использует продукты Apple, у кого уже есть устройства этой компании, macOS может быть оптимальным выбором. macOS хорошо интегрируется с другими устройствами Apple, обеспечивает высокий уровень безопасности и производительности.

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

Linux - отличный выбор для тех, кто предпочитает открытые и свободные системы. Linux предлагает пользователю полный контроль над системой, обширные возможности настройки под индивидуальные потребности, а также доступ к бесплатным обновлениям и широкому выбору программного обеспечения. Хорошим выбором среди отечественных решений станет: Alt Linux, Astra Linux. В будущем список совместимых с Linux/BSD операционных систем пополнит система Синапс ОС.

Windows остается популярным среди тех, кто ценит удобство использования и широкий выбор приложений. Платформа Microsoft обеспечивает поддержку игр и программ, что делает ее привлекательным выбором для работы и развлечений.

macOS предлагает интеграцию с другими продуктами Apple, высокую производительность и стильный дизайн. Операционная система от Apple подходит тем, кто уже использует устройства этой компании и ценит их экосистему.

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


Brainfuck примеры реализаций

Март 26, 2024, 12:03 - Время чтения: 3 минуты

Python

def brainfuck_interpreter(code):
    tape = [0] * 30000
    pointer = 0
    output = ""

    brackets = find_brackets(code)

    code_ptr = 0
    while code_ptr < len(code):
        instruction = code[code_ptr]

        if instruction == ">":
            pointer += 1
        elif instruction == "<":
            pointer -= 1
        elif instruction == "+":
            tape[pointer] += 1
        elif instruction == "-":
            tape[pointer] -= 1
        elif instruction == ".":
            output += chr(tape[pointer])
        elif instruction == ",":
            tape[pointer] = ord(input()[:1])
        elif instruction == "[" and tape[pointer] == 0:
            code_ptr = brackets[code_ptr]
        elif instruction == "]" and tape[pointer] != 0:
            code_ptr = brackets[code_ptr]

        code_ptr += 1

    return output

def find_brackets(code):
    brackets = {}
    stack = []

    for i, char in enumerate(code):
        if char == "[":
            stack.append(i)
        elif char == "]":
            open_bracket = stack.pop()
            brackets[open_bracket] = i
            brackets[i] = open_bracket

    return brackets

bf_code = ">+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.>++++++++++."
output = brainfuck_interpreter(bf_code)
print(output)

C

#include <stdio.h>

#define MEMORY_SIZE 30000

void brainfuck_interpreter(char *code) {
    char memory[MEMORY_SIZE] = {0};
    char* ptr = memory;

    while (*code != '\0') {
        switch (*code) {
            case '>':
                ++ptr;
                break;
            case '<':
                --ptr;
                break;
            case '+':
                ++(*ptr);
                break;
            case '-':
                --(*ptr);
                break;
            case '.':
                putchar(*ptr);
                break;
            case ',':
                *ptr = getchar();
                break;
            case '[':
                if (*ptr == 0) {
                    int loop_count = 1;
                    while (loop_count > 0) {
                        ++code;
                        if (*code == '[') {
                            ++loop_count;
                        } else if (*code == ']') {
                            --loop_count;
                        }
                    }
                }
                break;
            case ']':
                if (*ptr != 0) {
                    int loop_count = 1;
                    while (loop_count > 0) {
                        --code;
                        if (*code == ']') {
                            ++loop_count;
                        } else if (*code == '[') {
                            --loop_count;
                        }
                    }
                }
                break;
        }

        ++code;
    }
}

int main() {
    char bf_code[] = ">+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.>++++++++++.";

    brainfuck_interpreter(bf_code);

    return 0;
}

C++

#include <iostream>

#define MEMORY_SIZE 30000

void brainfuck_interpreter(char* code) {
    char memory[MEMORY_SIZE] = { 0 };
    char* ptr = memory;

    while (*code != '\0') {
        switch (*code) {
        case '>':
            ++ptr;
            break;
        case '<':
            --ptr;
            break;
        case '+':
            ++(*ptr);
            break;
        case '-':
            --(*ptr);
            break;
        case '.':
            std::cout << *ptr;
            break;
        case ',':
            std::cin >> *ptr;
            break;
        case '[':
            if (*ptr == 0) {
                int loop_count = 1;
                while (loop_count > 0) {
                    ++code;
                    if (*code == '[') {
                        ++loop_count;
                    }
                    else if (*code == ']') {
                        --loop_count;
                    }
                }
            }
            break;
        case ']':
            if (*ptr != 0) {
                int loop_count = 1;
                while (loop_count > 0) {
                    --code;
                    if (*code == ']') {
                        ++loop_count;
                    }
                    else if (*code == '[') {
                        --loop_count;
                    }
                }
            }
            break;
        }

        ++code;
    }
}

int main() {
    char bf_code[] = ">+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.>++++++++++.";

    brainfuck_interpreter(bf_code);

    return 0;
}

Пишем свой антивирус с нуля часть 2

Март 25, 2024, 15:03 - Время чтения: 2 минуты

Как и обещал в предыдущей статье - вот простейший сканер:

import os
import hashlib
from sqlalchemy import create_engine, Column, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

db_path = "file_hashes.db"

engine = create_engine(f"sqlite:///{db_path}")
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

class FileHash(Base):
    __tablename__ = "file_hashes"
    id = Column(String, primary_key=True)
    filename = Column(String)
    sha256 = Column(String)

Base.metadata.create_all(engine)

def calculate_sha256(file_path):
    hasher = hashlib.sha256()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hasher.update(chunk)
    return hasher.hexdigest()

def add_file_to_db(file_path):
    filename = os.path.basename(file_path)
    sha256 = calculate_sha256(file_path)

    existing_hash = session.query(FileHash).filter_by(sha256=sha256).first()

    if existing_hash:
        print(f"Файл {file_path} уже существует в базе данных.")
        return
    file_hash = FileHash(id=sha256, filename=filename, sha256=sha256)
    session.add(file_hash)
    session.commit()
    print(f"Файл {file_path} успешно добавлен в базу данных.")

def scan_directory(directory):
    n = 0
    v = 0
    for root, dirs, files in os.walk(directory):
        for filename in files:
            file_path = os.path.join(root, filename)
            sha256 = calculate_sha256(file_path)

            existing_hash = session.query(FileHash).filter_by(sha256=sha256).first()
            n += 1
            if existing_hash:
                v += 1
                print(f"{file_path}: Вероятно вирус!")
    return n, v

if __name__ == "__main__":
    directory_to_scan = "/test/"
    n, v = scan_directory(directory_to_scan)

    print(f"Просканировано: {n} файлов")
    print(f"Найдено: {v} угроз")

Для теста написал неприятную программку которая сильно кушает процессорное время:

#include <stdlib.h>

int main() {
    for (;;) { fork(); free(malloc(4096)); }
    return -3;
}

Лучше не запускать её, но я скомпилировал и проверил :) Теперь нужно добавить в базу это недоразумение:

if __name__ == "__main__":
    directory_to_scan = "/test/"
    add_file_to_db('/test/a.out')
    n, v = scan_directory(directory_to_scan)

    print(f"Просканировано: {n} файлов")
    print(f"Найдено: {v} угроз")

Вот примерный вывод программы:

Файл /test/a.out успешно добавлен в базу данных.
/test/a.out: Вероятно вирус!
Просканировано: 4 файлов
Найдено: 1 угроз

В следующей статье будет более наглядный и правильный пример антивирусной программы


Стрибог

Март 25, 2024, 15:03 - Время чтения: ~1 минут

"Стрибог" - российская хеш-функция, разработанная для обеспечения криптографической защиты информации. Она использует 512-битное состояние и 10 раундов вычислений, что обеспечивает надежность и безопасность данных. Функция использует различные методы суммирования и конструкцию Миагути - Пренели для защиты от атак.

"Стрибог" был подвергнут криптоаналитическим атакам, и результаты проведенного конкурса свидетельствуют о его высокой степени стойкости. Быстродействие "Стрибога" исследовалось и сравнивалось с другой хеш-функцией ГОСТ Р 34.11-94, и оно оказалось вполне удовлетворительным.

Значимость "Стрибога" подтверждается его использованием в реализации системы ДЭГ на выборах президента России. Это свидетельствует о высокой доверенности и надежности данной хеш-функции.


Смена раскладки клавиатуры Kubuntu

Октябрь 22, 2023, 01:10 - Время чтения: ~1 минут

Параметры системы -> Устройства ввода -> клавиатура -> дополнительно-> Switching to another layout -> выбираем удобные сочетания клавиш для смены языка ввода


БМПОС 0.1.231

Октябрь 22, 2023, 01:10 - Время чтения: ~1 минут

Выпущен релиз ядра БМПОС(Базовая Модульная Платформа Операционных Систем) 0.1.231

Что нового?

  • Поддержка экранов загрузки формата TGA
  • Улучшение менеджера памяти
  • Исправление определения кэша L2
  • Обновление списка проверок CPUID
  • Добавлены инструкции по сборке и запуску

В работе:

  • Менеджер задач
  • Потоки ввода-вывода

Скриншот вывода ядра в эмуляторе Qemu

Источник vk


Элиза

Август 29, 2023, 11:08 - Время чтения: ~1 минут

ELIZA – это нечто вроде чат-бота, который может "разговаривать" с людьми. ELIZA была создана Джозефом Вейценбаумом в 1966 году. Знаете, как некоторые приложения на вашем телефоне могут отвечать на ваши вопросы и выполнять различные команды (как Сири или Алиса)? ELIZA делает подобное, только ещё более простым образом

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

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

В общем я реализовал эту программу и вскоре в моём телеграм канале появится ссылка на скачивание и веб версию этой программы.


BIOS: Один длинный, два коротких

Август 17, 2023, 11:08 - Время чтения: ~1 минут

Недавно я собрал себе наконец компьютер. Купил хороший монитор и был доволен как слон (а мои глаза наконец расслабились). Я ненавижу когда кто-то использует мою технику без спроса. На компьютере у меня пароль и 3 диска. Установлено 2 ОС (Kubuntu 23 и Windows 10). Моя далекая от технологий сестра попыталась включить компьютер кнопкой питания монитора и в итоге выключила монитор (да и сбросила на нем все настройки). Когда я пришел домой и включил компьютер, я услышал один длинный и два коротких сигнала. Я мгновенно вспотел, мне стало не по себе. Как же так? Он ведь шикарно работал! Я полез в интернет искать причину проблемы. Я был слишком взволнован чтобы заметить отключенный монитор. Вариантов проблемы было множество: от проблем с ОЗУ до выхода из строя материнской платы или видеокарты. Я прочистил абсолютно все компоненты и даже заменил термопасту которая еще даже месяц не отслужила.

Когда я наконец очистил видеокарту (которая и так была чистая) я заметил что светодиод на мониторе не горит. Оказалось что если кабель не подключен или монитор выключен - UEFI считает что проблемы с видеокартой.

В общем будьте внимательны. Всем всего доброго!