Главная Отключить капчу Каталог NSFW Настройки

Дневники

Ответить в тред Ответить в тред
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 24 49 9
МОНОЛОГ.md monoloque  Вт 09 июл 2024 23:54:52 271637 1
4c19554e-e167-4[...].jpeg 138Kb, 735x729
735x729
798b40db-8209-4[...].jpeg 73Kb, 563x563
563x563
_.jpeg 63Kb, 400x564
400x564
085acfdf-4d86-4[...].jpeg 42Kb, 736x603
736x603
МОНОЛОГ
=======

Общаюсь с самим собой, пишу заметки. Держу руку на пульсе.
Аноним  Пн 15 июл 2024 01:38:46 284096 2
image.png 1924Кб, 800x976
800x976
## Прочитал книгу Никколо Макиавелли "Государь"
Четыре года назад, эту книгу мне советовал один анон с двача. Мы сидели в общем чате, и он рассказывал аудитории что-то про психологию и манипуляции. Я придуривался, и надсмехался над ним по-большей части. Весь этот психологический булшит мне всегда казался откровенным мошенничеством. Публика чата скорее слушалась его, нежели меня, но это нормально, ведь я не особо харизматичен.
И вот, спустя четыре года решил приоткрыть занавесу. Неужели можно манипулировать людьми, преобретатть черты тёмной триады, вступить в тёмное братство, открывать себе третий глаз, вычислять псиопов в интернете?! Надо проверить!
Книга неплохая. Информация в ней, может быть полезна для составления сюжета к рассказам или фильмам. Но быть хоть немного государём, она меня не научила.
К примеру, вот отрывок:
>Хорошо направленными жестокостями, я назову такие, к которым прибегают в случае необходимости, для укрепления своей власти. Дурно же направленная жестокость - та, которая не будучи особенно ощущительно сначала, с течением времени не только уменьшается, но даже усиливается
Интерпритация данного отрывка может быть разной, но даже просто интуитивно, это не соотвествует реальности. К примеру, существует такое явление как "выученная беспомощность". Заключается оно в том, что в результате постоянной неоправданной жестокости, жертва становиться послушной как марионетка. Работает это так, за любое волевое действие человека наказывают, вызывают у него отрицательное подкрепление. В скором времени утакого человека не будет стимула принимать самостоятельные решения. Такой человек будет выполнять всё, что ему скажут. Выученную беспомощность используют в армиях и сектах, наказывая новичков в порядке очереди. Что это если не проявление "дурной жестокости" по Макиавелли? Тем не менее, это положително работает, и даёт власть.
Можно найти и обратный пример, когда проявление "хорошей жестокости" даёт совсем негативный результат. Допустим, в офисе, тебя оскорбила уборщица. Так что? Прописать ей чёткую двоечку между глаз? Такое действие вряд-ли будет расценено коллегами как положительное. Проявив открытую жестокость, люди скорее начнут тебя ненавидеть, и сомневаться в твоём ментальном благополучии. Обычно, всегда когда кого-то бьют, нападающий стремиться показать, что он всего лишь обороняется или наводит порядок, то есть делает действие обратное жестокости. Таким образом, даже малая жестокость - несёт ущерб.
Если посмотреть ещё дальше, то ведь есть и примеры опровергающие мой пример. Далеко ходить не нужно: никого из сограждан не смутила бомбардировка Охматдет, и даже наоборот, люди требуют больше крови. Но почему? Почему избить бабку на улице - недопустимое преступление, а уничтожить сотню младенцев - подвиг? Ответ на этот вопрос осознать невозможно, не будучи Чезаре Борджиа.
>Страх и ненависть - главнейшие двигатели обращающие людей в наших врагов
И это правда. Чезаре Борджиа - настолько хитёр и ловок, что кажется будто-бы он мифический персонаж. Что-то типо Тома Бомбадила из Властелина колец, или Артаса из варкрафта. Живой человек не может быть настолько хорош.
Получается, я был чертовски прав: попытки развивать в себе черты "тёмной триады" - это в людях играет детское желание стать спайдер-меном.
Аноним  Вс 21 июл 2024 21:00:12 302455 3
𝘱𝘪𝘯 - (𝘢𝘮𝘢𝘺𝘢_𝘭𝘰𝘷𝘦).jpg 100Кб, 675x1200
675x1200
b0b0df4d-60e0-4[...].gif 2753Кб, 400x300
400x300
2395908c-3086-4[...].jpg 51Кб, 735x1248
735x1248
##Универсальность VS Эффективность.
Столяров выпустил новый ролик. Причём в трезвом состоянии. На этот раз ролик неплохой, поднимает настроение.

[Козья морда для форточек] (http://www.infoviolence.org/ru/vblog/video079.html)

[Crystal Castles - Reckless] (https://youtube.com/watch?v=thflPl1-4uE&pp=ygUYY3J5c3RhbCBjYXN0bGVzIHJlc3RsZXNz)

Ранее я сделал хэндлер для алгоритма Брезенхема.
[предыдущие посты] (https://arhivach.top/thread/973446/)
Идея была в том, чтобы создать графический язык. То есть интерфейс, который позволяет рисовать линии, вне зависимости от того чем их рисовать. В придачу к этому интерфейсу планировалось сделать несколько "отработчиков", например в ascii основанная на ncurses, в tga, на основе моего tgatool.c, и на vga драйвер монитора. Более того, планировалось, что линия может быть не обязательно графической. Линией может быть какая-нибудь зависимость, пускай хоть скорость от расстояния.
Аноны из /pr/ не оценили моих идей, и назвали меня глупым. И похоже, я понял почему.
>Чем больше универсальность модуля, тем хуже его эффективность.
Мысль кажется не очень очевидной. Для пояснения можно привести пример на трансформаторах напряжения. Существует два вида трансформаторов: литые и разборные. Литой трансформатор, как следует из названия, заливается эпоксидной смолой. Работает он надёжно, долго, и механически практически не убиваем. Однако, если произошло межвитковое короткое замыкание, то такой трансформатор годится только на металлолом, потому что разобрать и починить такой трансформатор невозможно. Разборный трансформатор, соответственно полная противоположность - если что-то сломалось, то это всегда можно заменить.
Примерно такая же ситуация и с кодом на С. Чем более универсальным получается интерфейс, тем больше он требует памяти: требуется стыковать множество callback-функций, то есть хранить ещё один стековый фрейм. Требуется создавать структуры с множеством полей, чтобы описать такой объект как "точка" и "линия".
В то же время, программа предназначеная исключительно для рисования линий на tga-холсте, не нуждается в "точках" и "линиях". Да и умещается она в одну функцию, то есть ей достаточно всего одного стекового фрейма. Такая программа работает более надёжно и предсказуемо.
Получается, что смысла стремится к абсолютной универсальности нет никакого. Это ничего полезного не даст. Напротив, нужно по возможности делать всё грубым и однозначным, а к универсальным решениям прибегать вынужденно. Для компьютерной графики, алгоритм брезенхема имеет смысл делать только для драйвера монитора. Остальные отработчики по сути и не нужны вовсе, я их сделал только чтобы доказать что я могу сделать и что-то универсальное. А линейные зависимости лучше наверное вычислять каким-нибудь другим алгоритмом, который больше для этого подходит.
Аноним  Пн 22 июл 2024 00:24:38 302968 4
85efb7e7-22c7-4[...].jpg 21Кб, 480x480
480x480
edaf18c4-10aa-4[...].jpg 46Кб, 640x480
640x480
=error4☹4=.gif 1211Кб, 500x700
500x700
i(12).jpg 20Кб, 472x228
472x228
##Ножницы на Unix
Многим кажется что работать под операционной системой FreeBSD ужасно неудобно. Эти люди правы. И это надо исправить. Благо, все возможности для этого есть.
Пока я писал диплом, я ощутил нехватку такого инструмента как "ножницы" (Snipping Tool, в английской локализации). Основное удобство этой стандартной программы в том, что можно выделить часть экрана, и снимок сразу же помещается в буфер обмена. Остаётся нажать ctrl+v, и снимок уже в Word. Всего три клика и нужный фрагмент картинки загружен, и не нужно даже елозить мышкой в поисках нужной картинки. Как сделать аналогичные махинации на FreeBSD я не знал. Поэтому приходилось делать скниршот всего экрана, затем обрезать его в gimp, и только уже потом загружать в Libre Office. Мучительно.
Итак, как сделать "ножницы", под Unix? Для этого нам понадобится всего две небольшие программы:
1. Scrot - удобная программа для скриншотов. Не имеет графического интерфейса, но при этом имеет очень много удобных функций.
2. Xclip - утилита для работы с буфером обмена Xorg.
Осталось совместить эти две программы в простом скрипте:
```bash
#!/bin/sh
scrot -s -F - | xclip -selection clipboard -t image/png -i $f

```
И готово. Сохраняем этот скрипт в /usr/local/bin, и теперь можно запускать этот скрипт из любого места, хоть из dmenu.
В отличии от "ножниц", данный скрипт не замораживает экран во время скриншота. Если такая заморозка необходима, то можно добавить флаг -f, после команды scrot, тогда все будет как на Windows.
Аноним  Чт 01 авг 2024 14:15:27 330142 5
image.png 180Кб, 785x753
785x753
##В дополнение к №734090
Почему-то до меня только сейчас долшло, как же выводится это соотношение:
>x0 + y1 = x1 + y0
Это же ничто иное как:
y1 - y0 = x1 - x0
где x0, y0 - смещение относительно нуля координат.
Таким образом, это просто выражение x = y, которое является линией под 45o.
Этот очевидный факт я выводил целый день наблюдая за изменениями координат. И в итоге результат получил случайно, даже толком не поняв, почему именно такие соотношения справедливы.
Я глупый.
Аноним  Пн 12 авг 2024 21:04:12 351551 6
60e09589-11c3-4[...].jpeg 32Кб, 370x373
370x373
,.jpeg 118Кб, 736x1308
736x1308
4b28b012-6eb6-4[...].jpeg 121Кб, 736x736
736x736
_ (2).jpeg 102Кб, 735x898
735x898
##Консоль
Продолжаю писать заметки по более удобному управлению ОС семейства Unix.

1.Массовое переименование.
Утилита Renamex, позволяет массово переименовывать файлы. Вот, я накачал альбом группы Crystal Castles. Сайт с которого я скачивал нафигачил в имя файла свой адрес. Избавиться от мусора можно с помощью команды:
`$ renamex -t -s/"Y2Meta.app"/"CrystalCasles" Y2M`
С флажком -t эта команда ничего не сделает. Только выведет список того, что будет переименовано. Когда мы убедились, что файлы которые мы хотим переименовать именно те, что нам нужны, убираем флажок -t, и вызываем команду заново.
Синтаксис следующий:
`$ renamex -t -s/"Фрагмент"/"На_что_его_заменить" Файлы`
Теперь все файлы можно перенести в папку ~/music:
`$ mv CrystalCastles ~/music`


2.Перенаправление ввода-вывода
Часто, для получения логов об ошибках, было полезно перенаправлять вывод в файл, или же наоборот, направлять ввод из файла в программу. Кратко перечислю все стандартные действия:
`$ ./program.bin > log.txt`
Перенаправляет стандартный вывод программы в файл. При этом файл перезаписывается.
`$ ./program.bin >> log.txt`
Перенаправляет стандартный вывод программы в файл, без перезаписи (новые данные добавляются в конец).
`$ ./program.bin < data.txt`
Напротив, открывает файл и направляет данные из него на ввод программы.
```
#!/bin/sh
./program.bin << END
A B C D 1 2 3 4
E F G H 5 6 7 8
END
```

В данном случае, программа работает как будто входной файл "встроен" в текст самой программы. Начиная со слова END это всё направляется на ввод.
`$ ./program1.bin | ./program2.bin`
Это "конвеер". Он перенаправляет вывод не в файл, а на вход друйгой программы. Например, частный случай использования, запустить программу ls вместе с grep:
`$ ls /usr/local/lib | grep "libm"`
Утилита ls - выводит список файлов в папке. И весь этот список попадает на ввод команде grep. Команда grep в свою очередь фильтрует список, и выводит в stdio только те строки что содержат сочетание "libm".
Почему же тогда не получается сделать что-то подобное:
`$ echo < ~/data.txt`
Дело в том, что команда echо, выводит в стандартный вывод свой аргумент. А на из стандартного ввода ничего не берёт. Для того, чтобы проделать что-то похожее в примере, можно использовать утилиту cat, которая выводит содержимое файла в стандартный вывод:
`$ cat~/data.txt`
К слову, о стандартных выводах. Зачастую, бывает ситуация, когда ты делаешь, казалось бы стандартное действие:
`$ gcc ./program.c > log.txt`
Открываешь log.txt, а внутри пусто. Вместо этого, вся информация выводится на экран.
Дело в том, что gcc,для вывода ошибок, использует не стандартный вывод (stdio), а вывод для ошибок (stderr)
Решить проблему в оболочке bash, легко - можно явно указать из какого потока выводить:
`$ gcc ./program.c 2> log.txt`
Тут 0 - стандартный ввод, 1 - стандартный вывод, 2 - вывод для ошибок.
Иногда, может потребоваться вывести результат как в терминал, так и в файл. В этом может помочь утилита tee, которая позволяет ввод перенаправить сразу на два вывода.
`$ ./program.bin | tee file.txt`

3.Счёт и поиск файлов.
Я узнал пару утилит, для удобного поиска файлов.
Утилита find:
`$ find /usr/local/lib -name "libm.so"`
ищет в каталоге во всех подкаталогах файл с заданым именем.
Утилита wc:
`$ find /usr/local/lib -name "libm.so" | wc -l`
считает количество строчек из ввода. Как уже понятно из предыдущего пункта, на ввод мы её подаём результат работы find. Тем самым команда wc, считает сколько всего файлов нашлось.
Флаг -h у команды ls. Попробуйте сделать:
`$ ls -lh file.txt`
и вам будет дана информация о файле, которая, помимо названия, включает ещё и его размер, и права доступа.

4.Управление доступом.
Для управления доступом к файлу есть вде утилиты -chown и chmod.
Как разботает чмод, известно всем:
`$ chmod 0777 file.txt`
цифру 0 можно опустить, она отвечает за выполнение от лица другого пользователя. Три остальные цифры, соответственно права для: владельца(7) группы(7) всех(7). Цифра тут отвечает насколько много мы прав выдаём:
1 - права на исполнение; 2 - права на запись; 4 - права на чтение;
Тогда производные:
1+2 = 3 - права на исполнение и запись,
1+4 = 5 права на чтение и исполнение,
2+4 = 6 права на запись и чтение,
4+2+1 = 7 права на всё.
Не спешите сразу же применять три топора 777, ко всем файлам в систме. Тут сразу не совсем понятно, а что за "владелец" и "группа". На Unix, для удобства есть так называемые "группы" и "пользователи". Так, что порой, у файла может быть указано, что он принадлежит не твоему пользователю, и поэтому при чтении возникает ошибка "в доступе отказано". Намного более логично, просто назначить себя, в качестве владельца файла, а не разрешать файлу доступ всем, когда у него нет ни одного владельца.
Для этого есть утилита човн:
`$ chown user:group file.txt`
в результате, файл будет считаться под владением пользователя user. и группы group (указание группы необязательно).
Если вы уже забыли к какой группе вы принадлежите, или хотите изменить информацию о принадлежности к, то можете воспользоваться утилитой чпас:
`# chpass user`
теперь можете редактировать информацию как угодно (по-умолчанию стоит редактор vi).

5.Поиск и справка
Иногда хочется узнать, о том, о чём ещё даже не догадываешься. Для этого тоже есть утилита. Называется apropos.
Собственно:
` $apropos libm`
найдёт все упоминания о libm на страницах мануала.
Также, полезной может оказаться утилита pkgconf. Она находит пакет, и выдаёт по нему информацию. Например, решили вы откомпилировать программу на ncurses с ключем -static (подключение статических библиотек). Вероятнее всего, сразу же начнёт ругаться линкер. И правильно, ведь при статической компиляции нужно указать абсолютно все модули.
` % pkgconf -libs -static ncurses
-fstack-protector-strong -Wl,-rpath,/usr/local/lib -lncurses -ltinfo`

Полученные в результате флаги, можно подставлять компилятору, и тогда всё будет работать.
Аноним  Пн 12 авг 2024 21:06:15 351555 7
Не учёл что звёздочки - курсив.
`$ renamex -t -s/"Y2Meta.app"/"CrystalCasles" Y2M*`
Аноним  Вт 13 авг 2024 17:10:06 352923 8
17121793962640.png 739Кб, 1920x1080
1920x1080
##Продолжаю изучать функционал FreeBSD
Теперь покажу, как удобно в консоли можно запускать сразу несколько программ.
Для запуска программ в фоновом режиме, существует команда bg. Вначале приостанавливаем программу путём ctrl+Z, затем водим bg. Теперь программа работает в фоновом режиме, и мы можем запускать другие программы. Есть и более быстрый вариант запустит программу в фоновом режиме, для этого достаточно добавить & вконце программы:
` $ xnedit &`
Узнать, какие программы сейчас находятся в фоновом режиме возволяет команда jobs. Её вывод выглядит так:
```
$ jobs
[1] + Выполняется sleep 500
[2] Выполняется xnedit
[3] - Выполняется leafpad
```

В квадратных скобках указаны индексы, по которым мы можем идентифицировать программы. Зная индекс, мы можем поставить программу снова на передний план, с помощью команды fg:
` $ fg 1`
Данные процедуры работают в каноничном режиме терминала. Когда речь заходит об полноэкранных программах на ncurses, то "приостановить" текущий процесс нажатием ctrl+Z не всегда удаётся возможным: банально, разработчик программы не позаботился о такой функции. Так, что если вызвать ee (easy editor) в режиме bg, то пользы от него не будет, ведь обратно переключится - проблематично. Однако, некоторый редакторы (например nano), дают возможность переключить программу в фоновый режим.
Для того, чтобы уничтожить какой-то из фоновых процессов, необязательно переключать его на передний план. Можно воспользоваться командой kill:
```
$ kill %2
[2] Прервано xnedit
```

Это, что касается процессов в одном терминале.
Чтобы узнать общее количество процессов, можно воспользоваться утилитой ps:
` $ ps axd`
Флаг d, придаёт списку древовидный внешний вид. Это значит, что вместо просто списка процессов, будет ещё и показано графически, какой процесс чьим потомком является.
Тажже, на FreeBSD есть что-то типо "диспечера задач", на винде. Называется эта программа top. В отличии от ps, она мониторит процессы в режиме реального вемени, и позволяет посмотреть, сколько памяти какой процесс занимает, и какой приоритет имеет.

Забавно. Почему-то незнание этих простых команд, вызывает бугурт у обитателей /s/, и Столярова.
Собственно вопрос: а как эти команды я должен узнать? Часть из них, конечно же была в книге. Но я имел ввиду, каким образом, случайный пользователь с улицы должен понять, как запусать процессы в фоновом режиме? Мануал? Хорошо, согласен, при запуске BSD и вправду даётся инструкция как запустит мануал. Пишем "man bg", и он нам выдаёт просто справочную страницу где перечисленны все встроенные команды. Возмутительно. Это никак не отвечает на вопрос "что такое БГ и как мне его запустить". Гуглить и ползать по тонне сайтов (которые, к слову, зачастую без JS не работают), я не обязан. Вызвав bg, мне никакой подсказки не даёт. Следовательно, как разумный человек, я забиваю на это и устанавливаю Windows.
Пользоваться терминалом и вправду удобнее. Но если уж быть честным, то Unix системы недоброжелательны к пользователям. Во-первых, на документацию часто забивают. Разработчикам лень писать длинные нудные выкладки про то какие команды что делают, поэтому всё ограничивается общими словами. Информацию приходится искать в интернете, что само по себе уже требует как минимум интернета, а как максимум ещё и пропатченой kde с браузером. Во-вторых, среди самих пользователей имеют популярность интерфесы, максимально похожие на windows: xfce, kde, gnome. Пожалуй, никто не рассматривает работу в терминале как основной инструмент. Как минимум по той причине, что даже посмотреть картинку из терминала - невозможно. Не существует никакого легковесного приложения, для просмотра картинок чисто на софте за счёт драйверов монитора. В это же время, прослушивать музыку, и грузить html страницы чисто из терминала возможно (links и moc). То есть преград, для создания приложений в текстовом режиме - нет.
Надо признать, что пока что не существует никакой минималистичной системы, для работы с графикой под Unix. Всё либо работает под набором мешанины из xlib+qt+gtk+FOXkit+ftlk+openmotif+opengl, либо не работает вообще. Программ чисто на xlib, критически мало, уже не говоря о том, что сам по сбе xlib вещь весьма раздутая и не минималистичная. Весь этот франкинштейн "современного интерфейса", зачастую потребляет больше ОЗУ чем тот же интерфейс windows. При этом, качество такого интерфейса, примерно как качество андроидов. Меня часто уверяют в том, что работать из под терминала - не рационально, и вообще, "прошлый век". Текстовый режим, якобы, остался только для того, чтобы сделать графику необязательной, и систему более надёжной. Во время таких рассказов, те же самые пользователи додумываются ставить себе в rc.conf строчку "slim=ENABLE". А это, вообще-то червато тем, что при любой ошибке xserver'a или драйвера видеокарты компьюетр превращается в кирпич, отладить который можно только через Live USB или Putty. К чему все эти разговоры в пользу бедных?!
Также, мне неоднократно говорили: "Чел.. ты только что немного Wayland". Да, мне нравиться Wayland. Но софта под wayland, я не видел. Весь софт под Wayland - это портированный софт с исков+Qt/Gtk.
Фреймворки это хорошо. Просто, я не могу понять зачем моему калькулятору целый Qt, когда калькулятор мог бы спокойно работать и из консоли. Что такое калькулятор? это программа которой на вход даёшь выражение, а она его вычисляет. Просто как 2+2. Но вместо того, чтобы работать из консоли, оно требует qt. По закону подлости, калькулятор - это единственное что вообще требует Qt. Все остальное работает под GTK. Но чего нет на GTK, так это удобного блокнота. Удобный блокнот есть только на Motif. И вот это всё разнообразие снова заполняет компьютер. Получается, что одним переходом на Wayland, проблема не решается.
Кстати, я было хотел переделать калькулятор speedcrunch под текстовый режим, но отказалось, что он даже не с открытым исходным кодом. Он просто Freeware.
Аноним  Пт 16 авг 2024 00:23:18 359032 9
IMG_20240816_00[...].jpg 28Кб, 603x343
603x343
##Файловый менеджер - не нужен
Если необходимо массово перекинуть картинки в папку, достаточно выполнить команду:
`$ mv ⚹. jpg pictures/`
Ассоциацию программ по-умолчанию можно реализовать написав для этого скрипт. Например тот, что изображён на картинке open.sh
`$ ~/open.sh music/Purpure_rage.mp3`
Откроет файл в программе vlc.
А вот файл с расширением .pdf:
`$ ~/open.sh stolyarov3book.pdf`
откроет уже в xpdf reader.
Для того чтобы выборочно переместить файлы, можно организовать простой цикл прямо в терминале:
```
$ i=0
$ for i in file1.txt myfatdick.jpg log5.txt program.c
〉do
〉mv $i /mnt/DataTraveler/
〉done
```

Согласен, что не так уж удобно. При желании, можно сделать скрипт, который бы перемещал файлы под именами всех аргументов, кроме последнего.
Поиск можно осуществлять уже известной утилитой find.
Для поиска по-сожержимому, можно выполнить:
`$ grep 'phrase' ⚹`
Получается, что файловый менеджер и не нужен вовсе.
Аноним  Чт 22 авг 2024 10:49:47 369385 10
2.jpeg 12Кб, 300x250
300x250
унитаз-дизайнер[...].gif 708Кб, 480x265
480x265
,.jpeg 118Кб, 736x1308
736x1308
>>359032
>>351551
Дополню, что переименовать файлы с добавлением цифры как на windows, можно следующим образом:
``` tcsh
user@ASUS_N56VB:~ % setenv i 0
user@ASUS_N56VB:~ % setenv j 0
user@ASUS_N56VB:~ % foreach i ( ⚹.jpeg )
foreach? @ j = $j + 1
foreach? mv "$i" "$j.jpeg"
foreach? end
user@ASUS_N56VB:~ % unsetenv i
user@ASUS_N56VB:~ % unsetenv j
```
Пригодилось. Через Renamex долго разбираться во всех этих регулярных выражениях, и как там сделать от 1 до 10. А тут простым циклом всё можно сделать.
Аноним  Пт 23 авг 2024 22:30:29 372937 11
solarpunk.jpeg 163Кб, 736x920
736x920
http___30000fps_com_.gif 2538Кб, 540x540
540x540
dqwd12.jpeg 229Кб, 736x901
736x901
x << n ⇔ x·2n

x >> n ⇔ x·2-n ⇔ x // (2n)
Аноним  Пн 26 авг 2024 00:56:19 377728 12
image.png 10Кб, 643x343
643x343
f3c43189-04bd-4[...].jpeg 72Кб, 736x775
736x775
0369b311-0dac-4[...].gif 1098Кб, 400x300
400x300
image.png 548Кб, 600x448
600x448
##Реализация чисел, с фиксированной точкой
Числа с плавающей точкой занимают довольно длительное время для вычисления. Согласитесь, для некоторых вычислений точность не важна. Например, если мы хотим примерно спроецировать точку, то использовать float довольно затратно. При этом, никакого другого выхода кроме как использовать float у нас нет, ведь коэффициент пропорциональности y = k*x может быть и дробным. В результате целочисленного деления дробь получится не может. Однако, есть одна хитрость, которая позволяет обойти это ограничение.
Операции над целыми числами выполняются гораздо быстрее чем над float'ами. Дробные числа, можно представить в виде чисел с фиксированной точкой, особым образом её закодировав.
Так, в чём суть? Начнём с простого. Вот число 17,3. Попытаемся сделать так, чтобы вся информация об этом числе была представлена в виде целых:
17,3 = 173 · 10-1
Отлично. Получается, что для представления любого дробного числа, нам достаточно знать его цифры без запятой и степень десятки:
x · 10n...x · 10-n
Таким образом уже можно закодировать все числа, и сделать операции над ними. Например:
a/b ⇔ a' · b' · 10i - j
Тут заметна следующая проблема. Дело в том, что следующие числа эквивалентны:
5000000 · 100 ⇔ 5 · 106
Как можно понять, вариант слева менее выигрышный для нас, ведь умножив это число хотя бы на 2, можно получить переполнение. В это же время, вариант справа, переполнения не получит вообще.
Для разрешения этой проблемы можно придумать алгоритмы "нормализации", то есть способы отбросить ненужные нули, переводя их в степень. Это работает, вот только... такие числа оказываются гораздо менее эффективными. Я проводил тесты, и умножение на такой форме записи составляли 91% от времени выполнения пустой программы. Это значит, что на вызов функций тратится всего 8% времени, а всё остальное время тратится на вычисления. Для сравнения, те же float оставляли 74% от выполнения программы, то есть на главную программу уходило 26% времени.
А всё потому, что числа которые я описал выше, это скорее числа с плавающей точкой чем с фиксированной запятой. Настоящие числа с плавающей точкой считаются аппаратно, на специальном математическом сопоцессоре (FPU). Поэтому, фактически, мы просто создали неоптимизированный софтверный алгоритм чисел с плавающей точкой.
Зачем мы это сделали? Да просто, чтобы показать принцип того, как можно закодировать число. Сейчас, перейдём уже к числам фиксированной точкой.
Подобно тому, как мы записывали числа в форме x · 10n, мы можем записать их в другой форме, например:
x · 2n...x · 2-n
Казалось бы, в чём преимущество такой формы? Это ведь довольно неинтуитивная формула. Если в форме "степень десятки" можно наглаз узнать какое число, то тут ведь ничего не видно. А преимущество в следующем. Умножение на степень двойки эквивалентно операции битового сдвига.
x << n ⇔ x·2n
x >> n ⇔ x·2-n ⇔ x / (2n)
То есть, таким образом, мы хоть и теряем возможность делить на 10, зато мы можем просто делать сдвиг на n бит, чтобы изменить степень.
Что дальше? Дальше, мы можем разделить переменную какого-либо типа данных на две части, одну из них выделить под дробную часть, другую под целую. Например, 32 бита, можно разделить пополам, оставив 16 под дробную и 16 под целую. Для нас это означает, тоже что и
1 = 1·216
То есть, за единицу принято число 1·216. Целые числа больше единицы будут соответственно:
x·216
А у всех чисел меньше единицы, степень двойки будет меньше 16. Таким образом 17,3 можно расписать как:
17,23 · 216 = (17 + 0,23) · 216 =
= (17 · 216) +( 0,23 · 216) = (17 << 16) + 0,23 · 216=
= (17 << 16 )+ 23/100 · 216 =
= (17 << 16 )+ 23/102 · 216 =
= (17 << 16 )+ 23 · 10-2 · 216 =
= (17 << 16 )+ 23 · (2·5)-2 · 216 =
= (17 << 16 )+ 23 · 2-2·5-2 · 216 =
= (17 << 16 )+ 23 · 5-2 · 212 =
(17 << 16 )+ (23 / 52 << 12 )
Далее можно продолжить, но суть ясна.
Операции умножения и деления над такими числами следует выполнять с учётом степеней:
a·2n · b·2n = c·2n · 2n
То есть, результат умножения следует сдвинуть на n бит, для компенсации повторной двойки.
Тут присутствует проблема переполнения. Допустим у нас целая часть числа занимает 16 бит. Умножение 65536·65536 даст число 4294967296! А это вообще-то максимальное число для данного типа. Поэтому, для защиты от переполнения, мы вынуждены принять число 65536 за максимальное, чтобы исключить даже возможность переполнения.
Операции над числами выше 65536 - не допустимы.
Зато, благодаря такому ограничению, у нас образуется восьмибитный "подвал". Если масимальное число 65536, то получается переменная используется лишь наполовину. И в остальную половину, мы можем сдвигать число, для повышения точности операции деления.
Собственно, эффективность такого метода намного более оправдана. Скорость главной программы занимает 60%. Это значит, что вызов функций длиться намного дольше чем их выполнение.
Аноним  Вс 01 сен 2024 22:25:43 392159 13
f382955d-541e-4[...].gif 3166Кб, 450x338
450x338
💀.jpeg 13Кб, 384x288
384x288
Доска Настроения.jpeg 28Кб, 393x404
393x404
@girlfeedgoals.jpeg 55Кб, 736x729
736x729
##Шифрование
Ещё одним непонятным термином для меня было "шифрование". Что это? Зачем вообще что-то шифровать? Мы же не шпионы. А если уж шифровать, то зачем столько разных методов?
Оказалось, как таковое "шифрование" в обывательском смысле, весьма полезно и может применяться для разных целей.

"Сжатие". Сжатие используется для уменьшения размера файла, при его хранении. Сжать файл - это значит зашифровать его так, чтобы добиться наименьшего размера шифра. Сложность взлома тут не важна, и больше того, полезнее чтобы расшифровать файл было как можно меньшим количеством действий, потому что так процесс "разжатия" будет производительнее.
Для демонстрации можно привести пример RLE-сжатие. Суть такого сжатия - заменить все повторяющиеся элементы на их серии. Например, строка ABOOOOBA занимала бы 8 байт. Но зачем писать повторяющиеся "O", когда можно просто указать их количество. При RLE сжатии строка хранилась бы как AB4OBA, то есть было бы сэкономлено целых два байта.
Существуют и более сложные алгоритмы для сжатия, некоторые из которых даже могут давать потери целостности информации в угоду скорости (для хранения картинок такое вполне допустимо), но суть ясна, главное закодировать так, чтобы добиться короткой формы записи.

"Хэширование". Это шифрование, цель которого, получить наиболее уникальный шифр. То есть сделать так, чтобы некоторые данные можно было однозначно идентифицировать по этому шифру. Обратно такой шифр расшифровать нельзя. То есть, можно получить "хэш" каких-то данных, но получить данные из хэша обратно невозможно.
Пример можно найти на различных сайтах где скачивают програмное обеспечение. Часто пользователи запрашивают SHA сумму, это и есть хэш этого файла. Если хэши сошлись, значит файл был передан достоверно. Если хэши расходятся - значит, скорее всего файл был повреждён.

"Шифрование". Строго говоря, всё перечисленное выше, шифрованием не называют. Настоящее шифрование, ставит целью именно защиту информации от несанкционированого доступа. Например, можно хранить все пароли в зашифрованном виде, чтобы в случае их кражи, злоумышленник получил бессмысленный набор байтов. В отличии от предыдущих методов, у шифрования помимо шифра, есть ещё и "ключ". Шифр - эта сама зашифрованная информация, а "ключ" - это необходимые данные, для алгоритма , чтобы правильно расшифровать шифр. Ключ может храниться либо в операционной системе, либо вовсе у пользователя в голове.
Симметричное шифрование - это тот случай, когда шифровка и расшифровка выполняются одинаково (расшифровка симметрично в обратном порядке). Самый распостранённый алгоритм симметричного шифрования, это AES, он обеспечивает довольно сильную защиту от взлома, и применяется практически везде.

"Кодирование". Часто, особенно на linux, при отправке почты, встречается такая штука как base64. А что это? Зачем что-то шифровать при отправке почты, если сам по себе протокол должен что-то шифровать? Ещё и каким-то base54, а не привычным AES. Дело в том, что Base64 это не шифрование, а "кодирование". В результате такого кодирования, шифр получается исключительно из ASCII символов. В этом и заключается суть. При передачи данных по текстовым каналам, необходимо использовать только органиченный набор символов. Символы типо '\0' применять нельзя, так как это означало бы конец строки. Поэтому, некоторые бинарные файлы, или файлы в других кодировках получается невозможным передать через электронную почту. Но вот если их зашифровать так, чтобы они состояли только из ASCII символов, то тогда их можно будет спокойно передать по почте, а на стороне получателя расшифровать.
Аноним  Сб 07 сен 2024 16:12:56 409124 14
_.jpeg 18Кб, 342x512
342x512
##Начал изучать С++
Думаю, я достаточно накодил, чтобы иметь какое-то базовое представление о языке С. Практика позволяет уточнить изученную информацию, сделать её более конкретной.
Например, я стал более свободно пользоваться вводом-выводом, поток (stream) стал представляться как указатель, а функции perror(), fprintf(stderr,"") и printf() как особые модификации системного вызова write().
Также, потренировался в событийно-ориентированном программировании. Более точно разобрался какие есть подходы для обработки "событий". Итого, выделил из них 3:
I.Вечный цикл. Череват активным ожиданием, зато прост. Может быть в редких случаях применим.
II. Обслуживающие процессы. Работает отлично, права требует отдельного процесса для каждого события, что довольно затратно.
III. На основе системного вызова select(), который позволяет разблокироваться, когда один из потоков доступен на запись или на чтение. Самый универсальный метод.
Входе этого, я освежил знания работы с односвязными списками, структурами и указателями на указатель. Ситуация часто вынуждала меня проводить декомпозицию кода, потому что нечитаемые функции обычно долго не живут - просто на просто, уже через неделю начинает лень читать всю вот эту пасту, поэтому, весь нечитаемый код безжалостно стирается, и начинается попытка создать более компактный. В результате, я принял несколько для себя принципов оформления функций. Например, процедуры стоит оформлять в виде void func(). В случае когда процедура возвращает что-то - внешний вид такой процедуры вводит в заблуждение. Как бы заставляет задумываться "а что она вернёт?", когда над таким вопросом думать не нужно. Для сравнения, когда функция ничего не возвращает, сразу же становиться понятно что перед тобой именно процедура, а не функция. Возвращение ошибок имеет смысл исключительно тогда, когда предполагается использовать эту функцию в коде. Функци которые возвращают код ошибки, это что-то типо логических выражений. Например int out_of_canvas() которая проверяет принадлежность точки к прямоугольному холсту, явно может быть задействована во многих условиях с разными холстами и точками. При этом такая функция по-совместительству и является процедурой, ведь она ещё и "проецирует" точку на границы холста, но это уже следует считать побочным эффектом, ведь проецирует она точки только лишь потому, что если уж мы вообще начали проверку , от точек "вне холста" нет никакого толку. В случаях когда функция должна что-то делать, когда это её прямое назначение, а не побочный эффект, то лучше уж пусть она возвращает void, а условия для её корректного вызова проще создать во внешней программе.
Вообще, условия проверки ошибок должны быть максимально приближены к главной программе. Ранее, я пихал проверку чуть ли не в каждую функцию, но это ничего полезного не делает, ведь тогда проверок становиться много, значит фукнции становятся больше, и работают они чуть медленее (хотя, визуальное неудобство тут главнее). Поэтому желательно проверок в функциях вообще не делать, за исключением тех случаев, когда отсутствие проверки вызовет явный segfault. Например, функции экспорта и импорта каких-нибудь объектов, сами в себе содержат проверку имени. При этом, получается некрасивая ситуация, что в главной функции приходится дублировать проверку, проверяя то что вернёт сама функция по экспорту. Проблему, конечно можно решить вообще-то вызовом exit(), но это черевато путаницой с "точками входа и выхода". Если реализовывать ошибку как return NULL, и проверять её повторно в главной функции, то становиться проще последовательно "отлавливать" ошики. Впрочем, в функциях "приближенных" к главной, использовать exit() вполне допустимо, потому что будет легко найти причину выхода.

У Столярова, как у преподавателя, есть положительная фишка. При рассказе, он часто берёт "противоположную ситуацию" и демонстрирует её недостатки, чтобы прийти к исходной. Мне такой стиль повествования нравиться, поскольку он не оставляет вопросов после себя.
Например, когда нам на дополнительных курсах начали преподавать ООП, меня вводило в недоумение слово "конструктор". Преподаватель, конечно объяснил, что это для того, чтобы задавать экземпляру класса начальные значения. Но почему мы не можем сделать это вручную? Что, разве сложно пару операций прописать? Суть оказывается в инкапсуляции. Само по себе слово "инкапсуляция" звучит как "инцельство", и на русский переводят его не менее странно, как "сокрытие". Когда слышишь слова типо "сокрытие", начинает казаться, что тебе советуют какую-то глупость, ведь зачем что-то от кого-то скрывать? Оказывается, что инкапсуляция это вообще не про скрытие, это скорее про разделении отвественности. Мы "скрываем" реализацию какой-нибудь функции, не в том смысле, что запрещаем смотреть на неё, а в смысле что "пользователю не обязаетльно смотреть на неё, чтобы ей пользоваться". Пользователь может знать, как устроена эта функция чисто в своих интересах, но пользоваться он ей может и ничего о ней не зная. В этом суть "инкапсуляции". Это скорее позволяет делить программу на зоны "контекста". предполагается, что вот "в данной зоне мы оперируем конкретно этими переменными, а в другой зоне мы их видим только в качестве прокси". Обращение к переменным напрямую, влечёт за собой необходимость ответить на вопрос: "а что это за переменная, и как её использовать нельзя". Ответ на этот вопрос будет содержать описание самой функции и принципа её устройства, что нарушает "зону отвественности" пользователя функции. Получается, что пользователь обязан сам немного быть разработчиком того модуля, которым пользуется. Всё это черевато "неповоротливостью" кода: сложно отделить пользовательскую программу от модуля, когда пользовательская программа зависима от конкретной реализации модуля. Простой мысленный эксперемент: в первой версии модуля, у структуры display было поле "x", а во второй его заменили на "w", и получается что во второй версии, пользователь не может откомпилировать программу, ведь у него везде понатыкано display->x. В таких случаях на С, обычно делают макрос, например GET_X(d) d->x, но этот подход тоже не идеален, ведь макропроцессор С довольно беден на конструкции. Поэтому, в классах существует "конструктор". Он позволяет настроить инициализацию для экземпляра класса, с помощью функции в самом классе. Таким образом, пользовател просто создаст экземпляр класса display, и у него уже будет что-то там в переменной display->x, вместо того чтобы копаться в этом самостоятельно.
Тут нельзя не заметить, что инкапсуляция присутствует и в чистом С. Когда мы выделяем набор функция в отдельный модуль, мы также подготавливаем набор функций и макросов для работы с новыми типами. Например, при реализации парсера wavefront_obj, кроме главных функций по экспорту и импорту трёхмерной модели, также существуют функции типо wavefront_free(), которая осуществляет уничтожение всей выделенной памяти. Существуют макросы типо VERTEX() и FACE, которые заменяются на конструкции доступа к соответствующим полям трёхмерного объекта (точка и плоскость). При оформлении модуля, подсознательно возникает, что вот "оставлять модуль без макросов - не комильфо". Тот кто будет использовать модуль, знать не знает как удалить объект, или выделить точку. Не заставлять же его читать код? Код хоть и маленький, но если пользователь прочитает код, то получается зачем тогда я кодил? Ведь с тем же успехом, пользователь мог бы свой код сам себе и написать, ему же всё равно приходится читать мой код, так почему бы тогда проще не написать свой? Читать то по времени дольше выходит.
Не смотря на это, наличие инкапсуляции никак не вляет на наличие ООП. Более того, ООП можно реализовать на чистом С, награмодив структур из указателей на функции. Ведь ООП это именно, что парадигма, а не свойсво языка. Парадигма - это то, под каким углом мы рассматриваем составление кода, а не какой-то конкретный инструмент. И рассматривать сишный код в парадигме ООП весьма неудобно, потому что конструкции для реализации такого кода становятся всё более уродливыми и громадными. Для того, чтобы начать осваивать ООП, лучше начать изучать С++, потому что в нём имеется поддержка необходимых конструкций, синтаксисом самого языка, чем я собственно и занимаюсь.
Аноним  Ср 11 сен 2024 21:52:34 418840 15
_.jpeg 44Кб, 480x611
480x611
d9587b9b-9d94-4[...].jpeg 33Кб, 564x428
564x428
2024-09-11 15-07-46.mp4 10649Кб, 1280x720, 00:00:34
1280x720
image.png 16Кб, 667x666
667x666
##Прямой доступ к видеопамяти
На FreeBSD есть файл /dev/mem - это вся физическая память в данный момент. Мы можем считать этот файл при помощи cat, и тем самым получим дамп памяти.
Задолго до начала изучения книг Столярова, мне было интересно, а как выводится графика на экран монитора? Как мне что-то вывести самому без сторонних библиотек. И вот, я нашёл ответ на вопрос (хотя конечно функции стандартной библиотеки и ОС тут присутствуют).
Начнём с того, куда вообще мы можем вывести? Можем ли мы напрямую дать команду монитору закрасить один из пикселей? Овет на этот вопрос: скорее нет. Монитор подключен к компьютеру VGA кабелем. Последняя буква "А" в названии, означает, что сигнал который передаётся по этому интерфейсу - аналоговый. В компьютере же, как мы знаем, все сигналы цифровые. То есть VGA кабель нельзя напрямую вотнуть в шину. Необходим как минимум аналого-цифровой преобразователь. В качестве такого преобразователя выступает видеокарта (или в общем случае видеоустройство, т.е. если графика встроенная в процессор). Помимо преобразования сигнала, видеокарта на самом деле может производить довольно много вычислений, и даже иметь свою память.
Так или иначе, для взаимодействия программ, в любом случае процессы пользуются разделяемой памятью, то есть могут посылать какие-нибудь управляющие действия отдельным устройствам, помещяя переменные в память, которую затем читает контроллер устройства. Посмотреть все устройства, подключённые к PCI шине можно командой:
`$ pciconf -lv`
Нам выдаст название устройства, его идентификатор, и прочую информацию. Среди всей информации, мы также можем узнать адреса памяти, котороые занимает конкретная железяка:
`$ pciconf -lb`
В моём случае, встроенная графика Intel выдаст следующий результат
```
vgapci1@pci0:0:2:0: class=0x030000 rev=0x09 hdr=0x00 vendor=0x8086 device=0x0166 subvendor=0x1043 subdevice=0x1477
bar [10] = type Memory, range 64, base 0xf7400000, size 4194304, enabled
bar [18] = type Prefetchable Memory, range 64, base 0xd0000000, size 268435456, enabled
bar [20] = type I/O Port, range 32, base 0xf000, size 64, enabled

```
Как мы знаем из книжки столярова, стандартные средства Unix, позволяют нам "отобразить" файл в память. То есть позволить нам иметь доступ к некоторым данным из файла, которые будут представлены как память. Так и сделаем, добавив флаг SHARED, чтобы память была разделяемой. Теперь, мы можем записать байты памяти напрямую в видеобуфер.
Как и предполгалалось, смысла в этом никакого нет. Выводить что-то таким образом, довольно сложно, и требует большого ума, чтобы организовать доступ к разделяемой памяти. Это почти как написать свой драйвер для видеоустройства. И преимуществ никаких: написав такую гарфическую программу, она будет несовместима с другими видеоустройствами. Поэтому, на практике для вывода на экран графики, лучше использовать API графической системы, например xlib в моём случае. Зато, этот эксперемент позволяет показать, что я ЛИЧНОСТЬ и я хозяин своего компьютера, а не раб чужих api.
Аноним  Ср 11 сен 2024 22:06:29 418904 16
image.png 327Кб, 815x501
815x501
Забыл добавить, что для текстового режима это тоже работает. Поэтому собственно, в учебниках это и называется "эмулятор терминала", а не "терминал". Терминал - это только иммитация. По-настоящему компьютер работает с видеокартой. Почему так? Почему бы сразу не выводить всё в графику как нормальные люди? Видимо, для совместимости с настоящими терминалами. На настоящих терминалах нет никакой графики. На настоящих терминалах драйвер воспринимает только алфавит, а буквы которые появляются на экране заготовлены заранее (причём, иногда во вполне физической форме в виде бумажных шаблонов для просвета). И поэтому, для сохранения совместимости и традиций, FreeBSD даунгрейдит экран, то есть просто-напросто, имеет такой драйвер, который имитирует вывод в графику как в терминал. Но как видно из этого эксперемента, на уровне "железа" это всё-таки графика.
Изначально у меня была идея сделать программу, которая бы позволяла смотреть картинки в терминале. Но идея довольно провальная уже на первом этапе. Во-первых, для записи в физическую память нужно иметь root-права. Было бы глупо логинться в root ради каждой картинки. Однако, мы можем изменить sicky bit, и запускать программу от имени администратора, для таких действий. Вот тогда вопрос: а чем это отличается от SVGAlib?! Эта идея буквально была реализована до меня. Вот только SVGAlib более универсальный так как поддерживает больше устройств. А моя програмка бы работала только для моего устройства. Так, что в целом - бесполезно.
Аноним  Ср 13 ноя 2024 22:33:34 536254 17
image.png 432Кб, 1920x1080
1920x1080
>>271637 (OP)
##Виртуализация при помощи bhyve
Раз уж я решил навсегда использовать FreeBSD, надо бы запастись виртуалкой. QEMU тут не работает, да к тому же грех не пользоваться фирменными фишечками FreeBSD, поэтому я решил посвятить эти два дня установке и настройке bhyve.

Что такое bhyve? Судя по всему, это низкоуровневая виртуальная машина. Низкоуровневая в том смысле, что она близка к аппаратному обеспечению.

Как запустить Windows 10 при помощи bhyve?
Итак, по этапам.

1. Загрузка bhyve.
1.1 Загрузим виртуальную машину bhyve, а также uefi прошивку из пакетов:
` #pkg install vm-bhyve bhyve-firmware`
1.2 Создадим папку для виртуальной машины в корневом каталоге:
` #mkdir /vm`
1.3 Добавим в автозагрузку модуль ядра для виртуализации:
` #sysrc vm_enable="YES"
#sysrc vm_dir="/vm"`

1.4 Перезагружаем систему, либо подгружаем ядро при помощи kldload vmm и добавляем переменную окружения vm_dir="/vm". Проверяем работоспособность виртуальной машины:
` #vm init`
в результате в каталоге виртуальной машины должны появится скритые папки: .config, .img, .templates, .iso.

2. Устанавливаем Windows 10.
2.1 Для начала нам необходимо скачать iso-образ Windows 10. Можно скачать его с оффициального сайта, либо с интернет архива. После того, как необходимая версия Windows находится на нашем компьютере, перемещаем iso-образ в папку /vm/.iso/
` # mv /path_to_windows.iso /vm/.iso`
Проверяем, что файл обнаружается системой:
` # vm iso`
Результат выполнения этой команды выглядит как список из файлов в папке .iso.
2.2 Найдём шаблон конфигурации vm для ОС типа windows:
` #find /usr/ -name 'windows.conf' `
Нужный нам файл лежит по пути, что-то типо:
/usr/local/share/examples/vm-bhyve/windows.conf
Копируем его в папку для шаблонов
`# cp /usr/local/share/examples/vm-bhyve/windows.conf /vm/.templates `
2.3 Теперь, создадим новую пустую виртуальную машину:
` # vm create -t windows -s G50 win10`
где G50 - количество места на жёстком диске, выделенного под машину, а win10 - название виртуальной машины.
2.4 Стандартная конфигурация как правило не работает. Нужно её немного подровнять. Открываем конфиг нашей виртуальной машины:
` # ee /vm/win10/win10.conf`
И меняем network0_type на виртуальный, а мост на bridge0
```
loader="uefi"
graphics="yes"
xhci_mouse="yes"
cpu=4
memory=8G
ahci_device_limit="8"
network0_type="virtio-net"
network0_switch="bridge0"
disk0_type="ahci-hd"
disk0_name="disk0.img"
utctime="no"
```

2.5 Впринципе, можно установаить систему. Сеть пока не настроена, а bridge0 и вовсе отсутствует, но так как драйверов virtio-net пока нет, особо заниматься настойкой сети смысла не имеет. Итак, установим систему, указав образ iso который поместили в папку .iso ранее:
` # vm install win10 windows10_repack.iso`
Сам по себе аргумент "install" просто говорит, что при загрузке виртуальной машины следует присоединить iso файл в качестве cd-rom. Иногда это можно использовать совсем не для установки.
После ввода команды, мы можем посмотеть состояние нашей виртуальной машины:
` # vm list`
В графе state должно быть либо Running либо Bootloader. Если в графе state написано слово Stop, это означает что виртуальная машина не запустилась, т.е. смотрите лог ошибкок:
` # cat /vm/win10/vm-bhyve.log`
2.6 Подключиться к виртуальной машине можно как в текстовом, так и в графическом режиме. Для того, чтобы продолжить установку в текстовом режиме:
` # vm console win10`
где win10 - название виртуальной машины.
Для того, чтобы подключиться к системе в графическом режиме, необходимо использовать сторонние способы, например VNC. Устанавливаем vnc из пакетов:
` # pkg install tigervnc-server tigervnc-viewer`
Затем, уже известной командой vn list узаём порт который прослушивает виртуальную машину. Он находится в графе VNC (последние цифры, по-умолчанию это 5900).
Подключаемся к самому себе же (127.0.0.1) по данному порту:
` $ vncviewer 127.0.0.1:5900`
Обычно при загрузке WIndows должно выдать что-то типо "Press any key to boot CD". Если вы пропустили это сообщение, или вообще вместо него сразу увидели ">shell", то запустите бутлоадер вручную:
```
# fs0:
# \EFI\BOOT\BOOTX64.efi
```

(при наличии файла загрузчика, обычно срабатывает автодополнение пути в командной строке).
!!!Не забудьте нажать кнопку когда снова увидите надпись "Press any key to boot CD". Я потратил под-дня не понимая в чём проблема, почему загрузчик у меня не запускается автоматически. Оказалось, что нужно всего лишь нажать "enter".
Далее, должен запустится обыденный процесс загрузки Windows. Всё как обычно. Обратите внимание, что при каждой перезагрузке соединение с vnc будет разорвано, но это совсем не значит что виртуальная машина выключена. В большинстве случаев достаточно просто заново присоединится к ней по vnc. Стоит запомнить 3 полезные команды:
` # vm list` - выдаёт список и состояние всех виртуальных машин.
` # vm stop win10` - завершает работу виртуальной машины.
` # vm start win10` - запустить виртуальную машину.
` # vm destroy win10` - удалить виртуальную машину.

3. Установка драйверов. Запустив win10, нельзя не заметить, что мало того что интернет не работает, так и адаптер для интернета вовсе отсутствует в устройствах. Надо это исправить.
Необходимо скачать в интернете первый попавшийся iso-образ драйверов VirtIO. Далее, помещаем образ с драйверами в папку /vm/.iso и делаем вот так:
` # vm install win10 virtio-drivers(1).iso`
Запустится наша операционная система win10, но при этом в папке "мой компьютер" будет подключен скачайнный iso-образ в качестве cd-rom. Находим на этом cd-rom, установщик и кликаем на него, устанавливаем драйвера по-пунктам. По-итогу установки, в "диспечере устройсв" должно появится устройство "Red Hat VirtIO Ethernet Adapter"
Тем не менее, соединение от этого не появится.

4. Настраиваем маршрутизацию.
4.1 Для начала, создадим "мост" который будет перекидывать пакеты из FreeBSD в Windows. Вам следует самостоятельно узнать через какой интерфейс вы подключены к шлюзу. Для этого посмотрим все устройства:
` # ifconfig`
Если у вас к компьютеру присоеденён кабель, то скорее всего у вас интерфейс em0. В моём случае это беспроводное соединение wlan0. Если среди устройств вы увидите tap0 - запомните его, это сетевой интерфейс вашей виртуальной машины.
Собственно создаём мост:
` # vm switch create bridge0`
Теперь, список ifconfig пополнило новое устройство vm-bridge0. Однако, в контексте команд vm оно всегда называется без пристави vm-. Посмотреть все созданные мосты можно командой:
` # vm switch list`
Важно, что к мосту будет подключатся наше устройство tap0, каждый раз при запуске виртуальной машины, так как мы в самом начале обозначили свич для win10 как "bridge0" (см конфиг win10.conf)
4.2 Далее, добавим к свичу наше устроство, из которого мы на FreeBSD подключаемся к интернету. В моём случае это wlan0:
` # vm switch add bridge0 wlan0`
Посмотреть всех участников моста можно также ifconfig (там внутри vm-bridge0, есть поле member).
4.3 Необходимо присвоить нашему свичу ip-адерес. Взять можно любой, например 192.168.100.100.
` # vm switch address bridge0 192.168.100.100`
Отлично. Этот адрес является адресом шлюза внутри нашей виртуальной машины.
4.4 Добавляем маршрутизацию в фаервол. Для этого открываем конфиг (или создаём его если он отсутсвует):
` # ee /etc/pf.com`
и прописываем:
```
nat on wlan0 from 192.168.100.0/24 to any -> (wlan0)
```

тут 192.168.100.0/24 - это весь диапазон адресов нашей машины, от 192.168.100.0 до 192.168.100.99.
4.5 Прописываем фаервол в автозапуск:
` #sysrc pf_enable="YES"
#sysrc gateway_enable="YES" `

Перезагружаем систему. Проверить, работает ли фаервол можно командой:
` # pfctl -sr`
В случае если что-то не работает, следует перезапустить фаервол:
` # service pf restart`
На этом настройка на стороне FreeBSD завершена.
4.6 Запускаем виртуальню машину:
` # vm start win10`
Если интернет до сих пор не работает, то откроем power shell, и пропишем
` C:\\ ipconfig /all`
Если Default Gateway отличается от того, что мы создали, то его придётся настроить вручную.
Прописываем в power shell:
` C:\\ ncpa.cpl`
Откроется окно "сетевые подключения". Выбираем наш адаптер "Red Hat VirtIO" и щёлкаем правой кнопкой, выбираем вкладку "Свойства". Далее находим в списке IPv4 (IP протокол версии v4), выделяем его и нажимаем ещё раз "Свойства".
Устанавливаем следующие параметры:
```
IP: 192.168.100.14 (Любой кроме 192.168.100.100)
Mask: 255.255.255.0 (так как 192.168.100.100/24 - 24 бита под адрес)
Gate: 192.168.100.100 (тот что указали в bridge0)
DNS: 8.8.8.8
DNS2: 8.8.4.4
```

Сохраняем настройки. После этого всё должно заработать, значек соединения должен изменится на "подключено к сети интернет".
Успехов.
Аноним  Пт 15 ноя 2024 23:26:23 539277 18
image.png 165Кб, 320x274
320x274
image.png 275Кб, 736x1092
736x1092
##IP и Mac
Этот вопрос мне явно приелся, но я отвечу на него ещё раз. Мне с детства было не понятно, зачем нужен протокол "IP". У нас цель - соединить компьютеры в сеть. Так у нас уже есть адреса всех компьютеров, зачем что-то ещё?
Ранее у меня были догадки, что якобы IP адрес сам себя маршрутизирует. Но это оказалось далеко от действительности.
На самом деле всё по-проще. Достаточно провести сравнение MAC с IP.

1. Фиксированность.
MAC адрес изменить сложно, потому что он вшит в железо. Для изменения MAC адреса приходилось бы выключать устройство и ковыряться в EEPROM.
IP адрес изменить можно програмно, прямо во время работы устройства.

2. Однородность.
Все MAC-адреса равнозначны по смыслу. Маршрутизацию mac-адресов можно представить как односвязный список. Листать этот список, придётся до тех пор, пока не найдётся нужный адрес. Нет никакого способа заранее вычислить нужный адрес.
IP адрес, состоит из двух частей: сеть и подсеть. То есть таким образом, мы заранее можем узнать, принадлежит ли адрес к нужной сети. Маршрутизацию в таком случае можно представить в виде структуры дерева. Кстати, этот факт ранее вводил меня в заблуждение, я не понимал, почему "адрес подсети", когда я адрес присваиваю компьютеру. Как я понял, ничего необычного в этом нет, это чисто такой unix-стиль, когда "всё есть файл". Также и тут "всё есть подсеть". На основании того, что компьютер может организовывать свою сеть (например, если этот компьютер - роутер), уже можно сказать, что компьютер может иметь адрес подсети. И даже если он реальной сети не образует, он всё равно может иметь адрес подсети, который используется как адрес для идентификации компьютера. Такой подход на самом деле более правильный, более общий.

Важное отличие от предыдущих моих рассуждений, я пришёл к выводу что всё же ни IP ни MAC не заняты маршрутизацией. Эти протоколы постулируют чисто приземлённые вещи, рассказывающие об самом устройстве ip-адреса, о том как организованы пакеты для данного протокола (т.е как при помощи него что-то получить или отправить).
Вообще, как подправил меня один анон, самой маршрутизацией занимаются программы, а не протоколы. Это конечно, очевидно, ведь протокол это практически как спецификация - там просто написано что-то, что описывает некоторую технологию. Но для маршрутизации тоже существуют свои протоколы.
Например OSPF - протокол кратчайшего пути. Он задаёт вид карты маршрутизации, приводит алгоритмы Дейкстры для расчёта маршрутов.
BGP - протокол для внешней маршрутизации. Он также содержит какую-то свою систему для хранения маршрутов, завязанную уже на провайдеа и страну. Он содержит описание своих алгоритмов поиска маршрута, рассчитаных на автономные системы, т.е тут вводится рассчёт, что адрес провайдера может не менятся десятилетиями.
Как можно заметить, маршрутизация сети, и организация её устройства - зона отвественности совершенно разных протоколов.
Аноним  Сб 30 ноя 2024 20:33:49 567160 19
17329809330400.png 297Кб, 480x480
480x480
#ПЕРЕЕЗД В КАЗАХСТАН
В РФ на работу не берут без документов военного учёта. Особенно во время призыва. Да и надоело постоянно задумываться мыслями "а что там по реестру? Введут в этот раз, или снова пугают. А введут ли в январе? А если не введут то что дальше делать?". Последний вопрос особенно волновал меня. Жить дома, не работать и не учиться это, конечно классно, но какой это имеет смысл?
Мне часто мама говорила, что мне следовало бы больше общаться с людьми. К россиянам я начал относиться крайне предвзято, ведь в стране где садят за слова могут существовать только стукачи и пособники государственного произвола. Никому нельзя доверять. Из-за этого общение становится каким-то скомканным, социальные связи не складываются.
Кстати, вспомнил ролик на эту тему
[Вечный Думатель] https://youtu.be/ng3ptaH2ZFY?feature=share
Мать это объективизирует через "внутреннюю свободу". Считает что хоть говорить ей и запретили, но она "держит фигу в кармане". А толку? Может быть как раз поэтому и происходит то, что происходит, потому, что единственное что сознательный гражданин может противопоставить это даже не газовый пистолет, а просто фига из пальцев. Государство не боится пальцев. Как и сказал столяров, то что ты "свободен в голове" - это предусмотрено государством, своей "фигой в кармане" ты сам себе вредишь, обрекаешь себя на отсутствие социальных связей. Сам себя уничтожаешь. А вот гордо махал бы зеткой - имел бы куда большее эволюционное преимущество.
Кто вот действительно представляет собой русскую оппозицию, это РДК и Сибирский Батальон, ведь они то как раз нашли рычаги давления, и пользуются ими. В знак солидарности передал им 300$ по etx. Остальная оппозиция, просто напросто отсутствует. Слышал наивное. Мнение, что якобы все эти световы, кацы и варламовы вернутся на родину после окончания войны и проведут свои реформы. Более смешной мысли я ещё не слышал. Никаких реформ не будет, разумеется, вся эта "оппозиция" - говорящие головы. Они ни в чем не компетентны, и ничего не умеют кроме как убедительно говорить. Если для вас они представляюся какими-то политиками, то с тем же успехом вы можете считать что илья мэддисон - гениальный политик. Ах да, такое же уже было в реальности. Помнится, у меня пол-группы в университете решили вступить в лдпр, потому что посмотрели илью жопича.
Ах да, о чем это я? В общем, я решил что полезнее было бы переехать куда нибудь. Дома я только раздражаю мать своим затворничеством.
По-началу рассматривал Грузию и Черногорию, по понятной причине. В этих двух странах бюрократия сведена на минимум: приезжай, живи сколько хочешь, отпечатки сдавать не нужно, никакой слежки, никаких электронных систем, никакого информационного насилия. Но, оказалось, что в этих странах ужасная безработица. Поэтому выбрал что поближе, чтобы язык не нужно было учить.
Казахстан практически как Россия. Есть правда пару минусов. Тут довольно высокие цены на жилье, примерно как в Москве. Также, тут страна больше цифровизированна, камеры на каждом углу, требуются отпечатки для трудоустройства, всё работает через информационные системы и эцп, даже в автобусах кондуктора нет - наличкой не оплатишь, оружие максимально под запретом., даже перцовые баллончики не такие мощные продают, криптовалюта под запретом. Ненавижу все это. Чем вам бумажные деньги не устраивают? Ну, посчитать намного нужно, зато не нужны ни карточки ни телефоны - простота и удобно.
Но, зато может тут буду развиваться. Может грин-карту выиграю, рано или поздно перееду в СШП. Всяко лучше чем ничего не делать.
Аноним  Сб 07 дек 2024 20:12:26 579958 20
>>567160
>В знак солидарности передал им 300$ по etx
РЕС
ПЕКТ
Аноним  Пн 16 дек 2024 06:32:52 598307 21
>>567160
просто купи военник 😅
от 300 к начинается
Аноним  Чт 19 дек 2024 14:33:09 603264 22
17345497182400.png 1691Кб, 1024x1024
1024x1024
RMS_Richard_M_S[...].gif 2089Кб, 320x240
320x240
>>598307
Почему бы тебе просто не посидеть на бутылке и не пойти нахуй? В чём проблема, стекломойный?

#TELNET
В учебнике столярова (второй том, глава 6), есть фрагмент, посвящённый отправке почты по Telnet. Ранее, он мне показался довольно бесполезным. Я гневное возражение в своём дневнике на харкаче, в стиле "а зачем эта глава нужна и зачем мы пользуемся телнет". Приношу за свои гневные посты извинения, я был не прав. Глава не лишена смысла, я просто, видимо невнимательно читал, и не особо понял, что хотел сказать автор.
После недавнего собеседования, выяснились некоторые нюансы оностительно Telnet. Оказывается, это совсем не клиент для отпраки почты. Это клиент для работы с протоколами TCP/UDP. Таким образом, телнет работает на уровне сокетов и дейтаграмм. Телнет ничего не знает о прикладных протоколах. И команды типо EHLO и GET, относятся к протоколам smtp и http соотвественно. Таким образом, при подгрузке страницы при помощи телнет, мы "иммитируем" работу браузера вручную! То же самое происходит и с почтой. Вместо того чтобы пользоваться готовым почтовым клиентом, мы работает с протоколом SMTP вручную, отправляя почтовому серверу dovecot те байты, которые обусловлены протоколом.
Вот примерно так, оказывается это и работает.

Искринне рад, что устроится на работу. Что бы там не говорил столяров, а энтерпрайс, всё-таки сильно отличается от любительского программирования. Искринне не понимаю столярова. Он ведь либертарианец. Стало быть, он за свободный рынок. Но почему он не учитывает, что свободный рынок как раз и порождает довольно сомнительные технологии типо Java Script. Может быть, они и вредны, и бесполезны, но почему это должно заботить предпринимателя? Для него важнее гибкость, скорость разработки, и дешевизна. Его мало волнует, что сайт будет уязвим, что сайт будет тормозить. Зарабатывает деньги не тот кто делает качественный продукт, зарабатывает тот кто эффективно удовлетворяет спрос. Что-то я не видел в магазине лакшери блюд из франции по доступной цене. Потому, что такие продукты - это вряд ли что-то что нужно большинству. Большинство людей просто включат компьютер и тыкнут на кнопку. Windows отлично подходит под такое поведение. Поэтому, я думаю виндоус не масдай. Виндоус рождён мертвым, как продук коммерции, и поэтому умереть не может. Не вижу в этом ничего плохого, особенно что никто не запрещает пользоваться FreeBSD.
Аноним  Пн 06 янв 2025 19:35:43 632289 23
Ungern-Sternber[...].jpg 79Кб, 423x599
423x599
IMG_20250104_11[...].jpg 24Кб, 350x238
350x238
IMG_20250104_11[...].jpg 142Кб, 960x1280
960x1280
IMG_20250104_11[...].jpg 189Кб, 960x1280
960x1280
#МУЖЕСТВО ВЕДЁТ НА НЕБЕСА

Пояснение будет позже.

Если вы гражданин РФ, советую вам просто переехать в Казахстан.
Не верьте пропаганде. В Казахстане много работы в IT отрасли. Никакого национализма тут нет. Зарплаты тут не ниже чем в РФ.

Ну, а мне пожелайте удачи.
Аноним  Вт 11 фев 2025 21:11:28 705913 24
>>603264
о, нихуя, моя пикча из DALl-E треда на сосаче, мир тесен

Отреагировавшие постеры X
Настройки X
Ответить в тред X
15000
Sage
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов