LINUX.ORG.RU

Избранные сообщения shooter93

дорога развития системного программиста (язык си)

Форум — General

мой основной язык питон, как основной для низкого выбрал чистый си

знание\опыт низкого примерно след:

  • насм и немного реверса (ida, r2)
  • с++11, stl
  • читал: r&k, липпмана, sicp, таненбаума (сети, архитектуру и операционки), сокеты биджа, стивенс разработка сетевых приложений, столярова
  • пара простых сетевых приложений и дебагер по туториалу

хочу спросить у опытных товарищей, которые пишут на си, куда двигаться дальше, какие сложные проекты делать что бы вкатится в системное\сетевое? какие книги читать и в каком порядке?

на данный момент начал читать advanced programming in the unix

 ,

heretek
()

Есть огнепоклонники OpenBSD?

Форум — Development

Что-то у меня мозоли от попыток задействовать IPC-семафоры:

  • shared posix mutexes - нету (из всех «бздей» есть только у FreeBSD и то с выкрутасами);
  • POSIX.1 семафоры отключены еще в v5.5 (Revert to return EPERM for sem_init(3) pshared until it works properly). Причем в NetBSD и DragonFly эти семафоры больные (вплоть до сore dump).
  • SysV семафоры похоже глючат.

На самом деле сложно понять что именно глючит (может у меня руки кривые) без допиливания теста. Но тот-же код работает на Linux, FreeBSD, NetBSD, DragonFly, Darwin и Solaris (OpenIndiana).

На этом фоне были замечены глюки ядра OpenBSD. Например, после заполнения /tmp (tmpfs), после последующей очистки и до перезагрузки semget() стабильно выдавала «no space left on device», а ipcs выдавала встроенный help вместо обработки опций.

На OpenBSD еще есть futex-ы (aka benaphores) портированные из Linux. Соответственно, можно попробовать их в IPC-блокировках. Но я уже сомневаюсь - стоит ли тратить время на это «унылое говно»? (уж извините).


Вскрытие стюардессы показало, что причина уже не в SysV-семафорах (они работают), а в Buffer/Page Cache.

Технически происходит следующее:

  1. файл mmap-ится в память несколькими процессами в режиме read-only.
  2. один из процессов обновляет фрагмент файла, например через pwrite() или writev() и затем инвалидирует mmap и/или кэш CPU.
  3. все процессы видят изменения в своих mmap-регионах.

Упомянутая инвалидация mmap не требуется во всех актуальных операционках. Только MIPS требует инвалидировать кэш CPU. Но на всякий случай попробовал и с msync().

Так вот, проблема в том, что на OpenBSD третий пункт выполняется не всегда. Даже если явно пнуть ядро посредством msync(MS_INVALIDATE).

При этом, если mmap-ить файл в read-write режиме и менять данные не через запись файл, а непосредственно в памяти то всё работает.

Короче, диагноз ясен. Напишу в bugs@openbsd.org, может-быть поправят.


Добавлено 2019-11-14: На сабмит в bugs@openbsd.org был получен ответ «это не баг, а фича». Лично для меня открытие, что оказывается в OpenBSD «by design» либо mmap, либо write(fd).

https://marc.info/?l=openbsd-bugs&m=157373953304874

https://github.com/leo-yuriev/libmdbx/issues/67

 , ,

Deleted
()

Покритикуйте, пожалуйста, код

Форум — Development

Написал свой первый hello world на nasm'е. Покритикуйте, пожалуйста.

Изначально писалось чтобы быть зашифрованным выхлопом для IOCCC, но по размеру в декодер не влезло, поэтому открываю сорс и ищу критику.

https://github.com/codemeow/freelancer/blob/master/freelancer.asm

 ,

PPP328
()

Perl прямиком из 1987 года

Галерея — Скриншоты

Прочитав новость «Код интерпретатора Perl официально перенесён на GitHub» я решил взглянуть на репозиторий Perl 5, который теперь уже находится на GitHub’е.

Удивительно, как трепетно и качественно его перенесли, сохранив не только абсолютно всю 32-летнюю историю проекта, но и багрепорты (Issues), патчи (PRs), релизы и ветки. Надпись «32 years ago» рядом с файлами вызывает улыбку.

Что ещё делать в этот унылейший пятничный вечер, когда на улице неприятно моросит дождь со снегом, а все дорожки погрязли в осенней слякоти? Правильно, красноглазить! Так что я ради эксперимента и интереса решил взять и собрать древний Perl на современной x86_64-машинке с gcc (GCC) 9.2.0 в качестве компилятора. Сможет ли такой старый код пройти проверку временем?

Чтобы было совсем уж аутентичненько и некрофильненько, я развернул виртуальную машину с голыми иксами и twm, который тоже родом из 1987 года. Кто знает, может быть Larry Wall писал свой Perl используя именно twm, так сказать bleeding edge technology того времени. Используемый дистрибутив – Arch Linux. Просто потому что в его репозитории есть некоторые полезные вещи, которые впоследствии мне пригодились.

( читать дальше... )

 , , , ,

EXL
()

Немного исправленный квейк 2

Форум — Development

У меня вейленд без xwayland, и мне захотелось поиграть в quake2. Для начала нашел единственный работающий порт (games/quake2lnx) — тот вариант, что лежит на сайте icculus.org.

Вывод графики там через кучу либ, плюс есть софтовый и opengl рендереры (opengl аж в 2 вариантах, один по графону похож на оригинал, второй улучшенный, типа с партиклами).

Я взял и выпилил все лишнее, а часть работающую на sdl 1.2 перевел на sdl2. В итоге на вейланде игра заработала. Олсо, теперь она компиляется более-менее без варнингов на clang и gcc.

Код q2 — просто ад, куча выходов за пределы массива, куча глобал стейта, размазанного по коду итд. Обнаружил сдедующие проблемы:

1) В софтварном рендерере падение при отрисовке прозрачных поверхностей (не пофиксил, просто выключил).

2) Там же баги при отрисовке, когда камера под водой (пофиксил).

3) Там же иногда баги, связанные, что кординаты спроецированного на экран объекта выходят за пределы экрана (не пофиксил).

4) Падение при выводе звука, если вывод графона притормаживает (пробовал запускать через remmina).

А тут на тебе, поменял работу, так что комплюктеры больше видеть не могу))) Поэтому выкладываю как есть и жду пул реквестов. Игра играбельна при использовании OpenGL рендерера (который по графену сильно уступает софтварному, на мой взгляд).

https://github.com/shamazmazum/quake2sdl

Устанавливаете, а потом ставите оригинальный pak0.pak в /usr/local/share/quake2/baseq2 (или /usr/share/quake2/baseq2, смотря куда ставили игру) При компиляции с -DRETEX=ON ставите другие паки отсюда http://icculus.org/quake2/files/. При компиляции с -DQMAX=ON ставите maxpak.pak в /usr/local/lib/quake2sdl/baseq2

Для FreeBSD есть порт https://github.com/shamazmazum/freebsd-ports/tree/master/games/quake2sdl (скопируйте в /usr/ports/games)

 

deadplace
()

Сравнение Rust и C++ на примере трассировщика путей

Форум — Development

Тут как-то была тема про то, что хочется нормальное сравнение C++ и Rust. Вот эта серия статей, как мне кажется, вполне себе кандидат:

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

Разработка трассироващика путей на Rust`е, часть 7: Заключение

Чтобы изучить Rust, я портировал свой спекртальный трассировщик путей Luculentus на язык Rust. Результат я выложил на Github. В процессе я также немного обновил Luculentus, переведя его на более современный C++. Детали вы можете прочитать в прошлых постах. В этом же посте я хочу подвести итоги и сравнить результаты.

Картинка

Для начала, пример вывода трассировщика путей! Захардкоженная сцена выглядит вот так:

http://ruudvanasseldonk.com/images/robigo-luculenta.png

Если вам интересно что-то в ней изменить, то смотрите set_up_scene в app.rs.

Начало работы с Rust

В настоящий момент, вы можете установить компилятор Rust`а и Cargo за пару минут, даже в Windows. Да и заставить их работать было намного проще, чем, например, Scala и sbt.

Сообщество Rust`а показалось мне очень дружелюбным. Когда я не знал что делать, мне очень помогали IRC канал и /r/rust. Члены основной команды разработки языка есть и там и там, так что часто советы были весьма профессиональными.

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

Владение

Если бы мне надо было описать Rust одним словом, это было бы «владение». Для меня, это то, что отличает Rust от остальных языков. В большинстве языков владение неявно и это приводит к нескольким типам ошибок. Когда в Си функция возвращает указатель, кто ответственен за освобождение памяти? Вы можете ответить на этот вопрос без подглядывания в документацию? И даже если вы знаете ответ, то все равно легко забыть освободить память или освободить ее дважды.

Проблема относится не только к указателям, она касается все ресурсов. Может показаться, что сборка мусора это отличное решение, но она работает только для памяти. Тогда вам нужен другой способ для освобождения ресурсов (вроде файловых дескрипторов) и все проблемы возвращаются. Например, сборщик мусора в C# спасает от ошибок «использования после освобождения» (use after free), но ничего не спасает вас от ошибок «использования после удаления» (use after dispose). Разве ObjectDisposedException намного лучше сегфолта? Из-за явного времени жизни и системы владения в Rust нет этих типов ошибок.

прим. ozkriff: поскольку я с C# знаком мало, то пришлось загуглить про этот ObjectDisposedException. Вот пример кода:

using System;
using System.IO;

public class ObjectDisposedExceptionTest 
{
   public static void Main()
   {     
      MemoryStream ms = new MemoryStream(16);
      ms.Close();
      try 
      {
         ms.ReadByte();
      }
      catch (ObjectDisposedException e) 
      {
         Console.WriteLine("Caught: {0}", e.Message);
      }
   }
}

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

Обновление Luculentus

Сами по себе достоинства явного владения не уникальны для Rust`а. Такой же код можно написать на современном C++, который очень сильно отличается от С++ до-2011. Когда я писал Luculentus, C++11 поддерживался только частично. Я использовал много простых указателей, которые сегодня уже не нужны. Я заменил большинство простых указателей в Luculentus на shared_ptr или unique_ptr, а массивы на векторы. Как следствие, все ручные деструкторы пропали. (Раньше их было шесть). Раньше было 11 операторов удаления, теперь их нет. Все управление памятью стало автоматическим. Это сделало код не только короче, но и снизило вероятность появления ошибок.

Портирование трассировщика путей на Rust улучшило его дизайн. Если ваше управление ресурсами некорректно, то код не скомпилируется. В C++ вы можете, например, взять адрес элемента вектора и, когда вектор уничтожится, указатель на элемент станет некорректным. Но код скомпилируется. Rust не позволяет таких «срезов» и это открыло мне глаза на то, о чем я не думал до этого. Теперь, даже работая с другими языками, я думаю, что если эта конструкция не скомпилировалась бы в Rust`е, то надо поискать путь получше.

Но все же, обновление демонстрирует, что возможно писать относительно безопасный код и на С++. Вы получаете безопасность и автоматическое управление памятью практически без накладных расходов. Единственной проблемой является то, что вы должны очень настойчиво стремиться к этому. Вы можете использовать unique_ptr, но так же можете и простой указатель. Все опасные инструменты «старого» С++ все еще доступны и вы можете смешивать их с новым С++. Конечно, есть определенная ценность в возможности собирать старый код (Бьерн называет это достоинством), но я бы предпочел не смешивать неявно эти две парадигмы и не поддерживать старые ошибочные решения. Требуется некоторое время, что бы разучиться использовать new и delete, но даже тогда старые API останутся с нами на очень долгое время.

Новое начало

Хорошим моментом в Rust является то, что он может начать все практически с чистого листа и учиться на ошибках старых языков. C++11 немного лучше своего предшественника, но он только добавляет новое и обязан поддерживать обратную совместимость. Одна из вещей, на которой это хорошо видно - синтаксис. В Rust, типы идут после имени и возвращаемый функцией тип идет после списка аргументов, что очень разумно. Синтаксис анонимных функций в Rust короток и в нем меньше повторения. Но я так и не могу привыкнуть к египетским скобкам, они до сих пор выглядят как-то не так.

Другим моментов, в котором Rust сделал правильный выбор, является мутабельность. В Rust`е все по-умолчанию неизменяемо, когда как в C++ наоборот. В коде Luculentus 535 раз появляется «const» (на момент написания). В Robigo Luculenta всего 97 «mut». Конечно, в C++ больше дублирования, но это все равно показывает, что неизменяемость по-умолчанию - лучше. Так же, компилятор Rust выдает предупреждение о переменных, которым не нужно быть изменяемыми, это тоже хорошо.

Несмотря на то, что синтаксис является делом вкуса, есть и измеряемые величины. Если я сравню количество непробельных символов в коде, то у С++ будет примерно 109 тысяч символов (не считая файлы, которые я не портировал на Rust), а у Rust - 74 тысячи. Почти на треть меньше.

C++ славится своими информативными и понятными сообщениями об ошибках, когда что-то идет не так в шаблонном коде. Ошибки в Rust`е, в основном, намного более понятны, но некоторые тоже могут напугать:

error: binary operation `/` cannot be applied to type `core::iter::Map<'_,f32,f32,core::iter::Map<'_,&[f32],f32,core::slice::Chunks<'_,f32>>>`

Производительность

Я добавил базовые счетчики производительности в Luculentus и Robigo Luculenta. Они считают количество завершившихся задач трассировки (trace tasks) в секунду. Вот результаты:

Компилятор              платформа           производительность

GCC 4.9.1*              Arch Linux x64      0.35 ± 0.04
GCC 4.9.1               Arch Linux x64      0.33 ± 0.06
rustc 0.12 2014-09-25   Arch Linux x64      0.32 ± 0.01
Clang 3.5.0             Arch Linux x64      0.30 ± 0.05
msvc 110                Windows 7 x64       0.23 ± 0.03
msvc 110*               Windows 7 x64       0.23 ± 0.02
rustc 0.12 2014-09-23   Windows 7 x64       0.23 ± 0.01

Везде выставлены самые высокие уровни оптимизации. Компиляторы со звездочкой использовали PGO (Profile-guided optimization - оптимизация, управляемая профилированием https://ru.wikipedia.org/wiki/Profile-guided_optimization). Единственный вывод, который я могу сделать из этого, что вам, наверное, не стоит использовать Windows для сильно нагружающих процессор приложений.

Во второй статье из этой серии я отметил, что код на Rust`е собирается очень быстро, но тогда было не много кода. Сейчас время сборки вот такое (в секундах):

Компилятор             Время

rustc 0.12 2014-09-26  7.31 ± 0.05
Clang 3.5.0            13.39 ± 0.03
GCC 4.9.1              17.3 ± 0.5
msvc 110               20.4 ± 0.3

Сборка теперь не так быстра, но все равно быстрее С++.

Заключение

Изучать Rust было интересно. Мне понравился язык и портирование привело к нескольким озарениям, которые могут улучшить и оригинальный код. Владение часто неявно в других языках, что увеличивает чувствительность кода к человеческим ошибкам. Rust делает владение явным, убирая возможность допущения подобных ошибок. Все безопасно по умолчанию. Все это сдвигает Rust намного ближе к краю «стабильность» на спектре, чем к краю «быстрая разработка». Я не написал на Rust`е достаточно кода, что бы быть на 100% уверенным, но пока что достоинства Rust`а перевешивали его недостатки. Если бы я выбирал между C++ и Rust`ом для своего следующего проекта, то выбрал бы Rust.

Ну как, это тянет на «нормальное» сравнение? По-моему, в любом случае интересно почитать.

 ,

ozkriff
()

BTRFS, может кому пригодится для восстановления

Форум — Admin

Debian 10. Раздел с btrfs 3.6Tb для данных пользователей.
После перезагрузки вдруг перестал монтироваться, опции монтирования recovery,ro не помогали.
SMART пишет GOOD, но Victoria показывает 198-Offline_Uncorrectable красным.

btrfs check /dev/sda4 завершалась аварийно
btrfs rescue zero-log /dev/sda4 выполнился, но раздел не смонтировался

Помогло следующее: из ветки testing установил btrfs.progs версии 5
btrfs check /dev/sda4 стал нормально сыпать ошибками
btrfs check --repair /dev/sda4 стал ремонтировать. Ждать не стал, прервал ремонт. Раздел смонтировался в ro и удалось все переписать.
Ради эксперимента запустил снова btrfs check --repair /dev/sda4 , ремонт продолжился, прождал три дня, окончания не дождался, прервал. Раздел переформатировал в btrfs.

Мои ошибки: Оказалось, что metadata и system были single. В UPS батарея тест проходила, но не держала.

PS. Есть ли возможность подключить второй диск к разделу btrfs и настроить так, чтобы metadata и system были raid1, data=single и при этом все данные писались бы исключительно на первый диск, не залезая на второй,
т.е. второй диск только для raid1 для metadata и system, а все данные только на первом диске?

 , ,

Valdim777
()

★ #pragma pack VS #pragma не`pack ★

Форум — Development

Расскажите про реальные минусы, плюсы. Подводные камни.

Ну упаковали мы структуру, ну стала она меньше памяти занимать. Как бы всё. Но допустим мы не экономим на памяти (допустим!) если ещё реальный смысл паковать? Где-то говорят что промахи кеша уменьшаются и от того код работает быстрее ведь как следствие конвеер не перезапускается, но я не верю.

UDP: На заметку (Всем спасибо за советы! (•◡•)/ )

Утилита pahole для выявления дыр в структурах и их реорганизации в Debian утилита доступна из пакета dwarves sudo apt install dwarves

gcc/clang c опцией -g3 -Wpadded + -Wextra -Wall -Werror не пропустят код с дырявыми структурами

Например для такой структуры

typedef struct {
  bool collided;
  float time;
  vec3 point;
  vec3 norm;
  int flags;
} collision;


Clang выдаёт чуть более информативно

./include/physics.h:13:9: error: padding struct 'collision' with 3 bytes to align 'time' [-Werror,-Wpadded]
  float time;

GCC же просто указывает на предмет «проблемы»

./include/physics.h:13:9: error: padding struct to align ‘time’ [-Werror=padded]
   float time;
         ^~~~

Прогон pahole же при компиляции с -g3 даёт чёткое указание на «проблему»

ничего :D

И это «ничего» меня поставило в ступор сначала, но дело в том что я использую typedef и по какой то причине pahole игнорирует не именованные структуры, если исправить так

typedef struct collision{
  bool collided;
  float time;
  vec3 point;
  vec3 norm;
  int flags;
} collision;

То pahole выдаёт чёткие подробности

struct collision {
	_Bool                      collided;             /*     0     1 */

	/* XXX 3 bytes hole, try to pack */

	float                      time;                 /*     4     4 */
	vec3                       point;                /*     8    12 */
	vec3                       norm;                 /*    20    12 */
	int                        flags;                /*    32     4 */

	/* size: 36, cachelines: 1, members: 5 */
	/* sum members: 33, holes: 1, sum holes: 3 */
	/* last cacheline: 36 bytes */
};

Исправление на

typedef struct collision {
  vec3  point;
  vec3  norm;
  float time;
  int   flags;
  bool  collided;
} collision;

Убирает предупреждения/ошибки из gcc/clang, а pahole репортует что в целом всё впорядке

struct collision {
	vec3                       point;                /*     0    12 */
	vec3                       norm;                 /*    12    12 */
	float                      time;                 /*    24     4 */
	int                        flags;                /*    28     4 */
	_Bool                      collided;             /*    32     1 */

	/* size: 36, cachelines: 1, members: 5 */
	/* padding: 3 */
	/* last cacheline: 36 bytes */
};

Но, для полного счастья было бы хорошо заполнить 3 байта для выравнивания структур (массивы структур или дву/одно связные списки к примеру) в данном случае можно заменить bool на int или добавить заполнение char pad[3] если изменение типа структуры выливается в геморой ползания по коду или нарушает читабельность.

При окончательном изменении на

typedef struct collision {
  vec3  point;
  vec3  norm;
  float time;
  int   flags;
  bool  collided;
  char  __unused_struct_padding__[3];
} collision;

получаем репорт от pahole что всё ok


struct collision {
	vec3                       point;                /*     0    12 */
	vec3                       norm;                 /*    12    12 */
	float                      time;                 /*    24     4 */
	int                        flags;                /*    28     4 */
	_Bool                      collided;             /*    32     1 */
	char                       __unused_struct_padding__[3]; /*    33     3 */

	/* size: 36, cachelines: 1, members: 6 */
	/* last cacheline: 36 bytes */
};

Заполнять пустотой это конечно такое себе, но зато на будущее есть понимание что практически бесплатно можно будет в эту структуру засунуть ещё три флага например, таким образом использовать для дела в пустую в данном случае гоняемую память.

Ну вот как то так.

 , , ,

LINUX-ORG-RU
()

gRPC vs AMQP vs Kafka

Форум — Development

Всем привет, запутался когда что стоит использовать, сейчас использую EventBus в Vert.x для коммуникации между микросервисами и gRPC в качестве API для клиента (веб приложения). Собственно у меня имеется RealTime стримы, которые клиент получает, к примеру - баланс кошелька либо изменения лога. Все это успешно реализовал средствами только gRPC, вроде бы работает отлично все, но под нагрузкой еще не тестировал. Сейчас думаю добавить AMQP для микросервиса генерации документов, т.к. он дает определенные гарантии. В интернетах часто вижу, что люди используют либо kafka либо amqp либо и то и другое для коммуникации между микросервисами либо для реализации real-time изменений. Сейчас по поводу AMQP и Kafka у меня такие мысли - их стоит использовать, когда у тебя много микросервисов и всем им нужно раздать однинаковые команды, либо когда много микросервисов пишут в один и тот же топик. У меня же ситуация пока другая - у меня много одинаковых микросервисов только для генерации документов, собственно туда я и хочу прикрутить AMQP. Но вот микросервис биллинга и аукциона - это синхронные микросервисы у которых по одному инстансу на каждый, для аукциона критически важна скорость, для биллинга - надежность, аукцион в итоге может отправлять команды биллингу и там скорость уже не будет так важна, потому-что там идет и тяжелая верификация. Но изменения аукцион получает быстро. В будущем конечно возможно будет множество биллинг сервисов, но аукцион точно будет один. Еще читал, что к kafka и gRPC могут дополнять друг друга.

В общем-то мое переживание сейчас - это то что все пользуются kafka и amqp, а я нет, и есть беспокойство, что я делаю что-то не правильно.

 , , , ,

Int64
()

Когда починят «ускоренное» копирование файлов в Linux?

Форум — Talks

Итак, дано: Ubuntu 16.04.4, Fedora 27.

И там и там есть один баг, которому уже много лет, я даже честно не знаю сколько.

Суть бага: прогресс показывает сначала очень высокую скорость копирования, доходит до отметки примерно в 60% и врубает тормоза. У меня бывало так, что на Ubuntu 2-3 гигабайта копировались на флешку за пару секунд, а потом удовольствие растягивалось еще на 20 минут, при этом объем передаваемых данных равен 8 гб, понятное дело, что это баг, но ему уже сколько лет! Когда починят то? Забавно, но cp при этом показывает равномерную скорость копирования и в серверной Ubuntu я спокойно копирую данные в 500 гигабайт между ЖД без проблем.

Но у меня Linux на десктопе и черт побери, он в 2018 еще не готов для массового пользования, когда такие детские баги вылезают.

 ,

fman2
()

Запуск докер контейнера в ОЗУ

Форум — Admin

Вопрос в следующем, у меня Jenkins с помощью плагина Kubernetes, запускает сборку контейнеров внутри подов в среде Kubernetes с помощью kaniko, хочу ускорить это дело, так как основная проблема скорости сборки в IO диска, при сборке контейнера kaniko распаковывает основной образ и все слои в / (root директори), из-за этого просто примонтировать рам диск в определенный каталог я не могу, как быть в таком случае? Может кому то удавалось решить такую проблему, что бы файловая система контейнера была полностью в ОЗУ сервера.

 , , , ,

BartMan
()

Сервер видеонаблюдения Bluecherry полностью открыт под GPL 2.0

Новости — Open Source
Группа Open Source

Bluecherry — комплекс DVR (Digital Video Recorder) для видеонаблюдения, состоящий из сервера, работающего на GNU/Linux, и клиента — приложения, работающего на GNU/Linux, MacOS и Windows, а также через сторонние мобильные приложения для Android и iOS.

( читать дальше... )

>>> Подробности

 , ,

anonymous
()

Объясните сишную магию

Форум — Development

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

Вот что это за ужас (src):

static unsigned char clampByte(int c)
{
    unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
    unsigned uc = static_cast<unsigned>(c);
    return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
}

Я так понимаю, они проверяют что int в 0..255 диапазоне, но уж слишком странным образом.

UPD: коммит, который добавил этот код.

 ,

RazrFalcon
()

А как по-нормальному установить GTK3 на Windows?

Форум — General

Вариант с msys это не здорово. Вот сделал я приложение на gtk (на .net), хочу чтобы можно было и в linux и в windows запускать. И честно говоря, предлагать тем, кто будет пользоваться им, инструкцию вида «скачайте msys2, там вбейте такую-то команду, добавьте путь в PATH, после чего вы сможете запустить мое кросплатформенное приложение» это не здорово.

 ,

cvs-255
()

Как понять суть spring

Форум — Development

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

 , ,

crutch_master
()

Курс по компиляторам

Форум — Development

В 14-м году на курсере был классный курс, который я упустил. А сейчас понял что очень хочется его пройти. После гуглежа оказалось, что курс доступен бесплатно без смс прямо на сайте стенфорда.

Вот, выкладываю ссылку (может будет полезно кому-нибудь) https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/

Если есть ещё слоупоки кроме меня, то давайте вместе проходить!

 , ,

dsxl
()

Куда лезет фаерфокс сразу после старта? Как это прекратить?

Форум — Security

Старт и запрос 192.168.0.1 — а чего оно забыло на амазоне и чёрти где ещё???

173.194.44.* — google (кто его просил?) 52.222.226.* — amazon

Как это (и другое) отключить? Понятно, там много траффика на незапрашиваемые ресурсы, но кто его просил?

17:54:21.446543 IP 192.168.0.100.47058 > 173.194.44.81.https: Flags [S], seq 1977460891, win 29200, options [mss 1460,sackOK,TS val 169013130 ecr 0,nop,wscale 7], length 0
17:54:22.563150 IP 192.168.0.100.54198 > 52.222.226.76.https: Flags [S], seq 305898223, win 29200, options [mss 1460,sackOK,TS val 169013409 ecr 0,nop,wscale 7], length 0
17:54:23.350950 IP 192.168.0.100.39798 > ec2-54-77-38-116.eu-west-1.compute.amazonaws.com.https: Flags [S], seq 983447588, win 29200, options [mss 1460,sackOK,TS val 169013606 ecr 0,nop,wscale 7], length 0
17:54:24.097911 IP 192.168.0.100.47514 > 192.168.0.1.http: Flags [S], seq 4231223268, win 29200, options [mss 1460,sackOK,TS val 169013793 ecr 0,nop,wscale 7], length 0
17:54:27.350394 IP 192.168.0.100.36732 > ec2-52-40-179-197.us-west-2.compute.amazonaws.com.https: Flags [S], seq 703735864, win 29200, options [mss 1460,sackOK,TS val 169014606 ecr 0,nop,wscale 7], length 0
17:54:28.037909 IP 192.168.0.100.59944 > 52.222.171.186.https: Flags [S], seq 2756436483, win 29200, options [mss 1460,sackOK,TS val 169014778 ecr 0,nop,wscale 7], length 0
17:54:29.458365 IP 192.168.0.100.59946 > 52.222.171.186.https: Flags [S], seq 2224463378, win 29200, options [mss 1460,sackOK,TS val 169015133 ecr 0,nop,wscale 7], length 0

 

fk0
()

Как постичь дзен по отношению к ORM?

Форум — Development

Думаю, все мы тут умеем писать SQL-запросы голыми руками. И тем не менее многие из нас при разработке используют или пытаются использовать те или иные библиотеки для ORM или Active Record.

Мы сейчас на работе пишем веб-приложуху на Питоне, и для ORM используем SQLAlchemy. SQLAlchemy была выбрана после того, как оказалось, что по паре критериев наша легаси-база совершенно, видите ли, непригодна для имеющихся абстракций в Django ORM. Ну окей, хорошо, что код всё равно только-только начали переписывать, так что смогли себе позволить быстро переделать написанные модели с Django на SQLAlchemy и дальше работать с ней. Ну окей, освоили её не очень привлекательный синтаксис построения запросов. И вот спустя некоторое время обнаруживаем очередную глухую стену. Специально не буду говорить, какую: я пока ещё не выяснил, возможно ли решить мою задачу средствами SQLAlchemy или нет, и не хочу быть дураком, утверждая, что невозможно.

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

Вопрос знатокам: доколе? Сколько настоящий, правильный, постигший дзен веб-разработки лоровец стал бы терпеть прихоти своего ORM-фреймворка? Выкинул бы в тот же миг, как потребовалось залезть глубже пяти страничек туториала и зубрить хитроспелетения методов вместо того, чтобы SQL в зубы и делом заниматься? Или выкинул бы в тот момент, когда провозился больше дня? Или изначально не стал бы брать, если точно знал (мой случай!), что в приложении будет что-то посложнее, чем простой CRUD без джойнов? Или терпел бы до последнего? Но где оно – последнее, после которого нужно признать, что фреймворк всё только портит?

И насколько (в процентах, в количестве запросов, в попугаях) допустимо мешать в одном проекте ORM-модели с простым SQL-кодом?

В общем, ЛОР, научи уму-разуму. Или подсунь что-нибудь почитать на эту тему. Только не про сам SQL – его-то я знаю на адекватном для конкретно моих задач уровне, – а именно про методологию, про умение выбирать или не выбирать инструменты, чтобы проект не превратился в месиво.

 , ,

greatperson
()

Divinity Original Sin Enhanced Edition @ Mesa r600g

Галерея — Скриншоты

Я таки заставил эту игру работать 😊

В процессе была куча сегфолтов и адовые артефакты.

По сути проблемы всего три (конкретно для r600g, в целом для месы – 2):

  1. Контекст OpenGL 4.2. Драйвер r600g рапортует версию 3.3, а движок игры, в свою очередь, работает по принципу segfault driven error handling. Решается просто:
    MESA_GL_VERSION_OVERRIDE=4.2 
    MESA_GLSL_VERSION_OVERRIDE=420
  2. Невалидные шейдеры. Тут сразу:
    • Во-первых, разрабы используют расширение ARB_shading_language_include, которое не поддерживается ничем кроме невидиевской проприетарщины. Но во имя амдшной проприетарщины они запилили в движок fallback режим, в котором это расширение реализуется прямо в движке на коленке, однако включается этот fallback режим (немного) через жопу – они (только) проверяют возвращаемое значение функции glXGetProcAddressARB на nullptr. А glXGetProcAddressARB не обязан возвращать nullptr, кроме адреса надо смотреть еще в список расширений, чего они не делают, а месовская реализация никогда не возвращает nullptr -> segfault driven error handling. Чинится этот баг подстановкой костыля в LD_PRELOAD.
    • Во-вторых, в шейдерах постобработки SMAA/FXAA у них где-то в дебрях кода обложенное ifdef'ами лежит включение очередного расширения, что, блджад, не правильно. После обнаружения этой фигни месовский GLSL компилятор совершенно справедливо прерывает компиляцию, а так как ребята не умеют в обработку ошибок — см. выше. Этот баг обходится с помощью месовского механизма подмены шейдеров в рантайме и костыля-решейпера их кода шейдеров. файла drirc, в который нужно добавить
      <application name='Divinity Original Sin Enhanced Edition' executable='EoCApp'>
          <option name='allow_glsl_extension_directive_midshader' value='true' />
      </application>
  3. Графические артефакты. У них в движке (насколько я понял) есть две принципиально разные ветки кода/рендеринга, которые разделяются по (внимание!) строке в GL_VENDOR: если в этой строке что угодно кроме "ATI Technologies Inc.", то активируется невидиевская ветвь, что на месе приводит к аду, если же доставить в LD_PRELOAD еще один костыль с этой строкой, то рендеринг становится мягким и шелковистым.

TL;DR: Gentoo, дефолтные кеды, ШГ, панелька с автоскрытием.

 ,

Stil
()

Установка Arch с шифрованием разделов на SSD, UEFI.

Форум — Linux-install

Привет. Помогите с последовательностью установки.

1. Начинаю с шифрования, создания разделов, монтирования (тут добавляю поддержку TRIM для SDD?)

2. Выбираю фс на разделы (здесь же ставлю fat32 на /boot и пр (для efi), потом правлю загрузчик для uefi и ставлю саму систему.

3. Какую таблицу разделов спланировать, чтобы не возникало проблем в будущем (типа нехватки места для обновлений и т.д.).

4. При шифровании какую утилиту для создания разделов использовать? cgdisk для создания разделов GPT покатит? или необходимо все в LVM запиливать? Кажется, проще и надежнее выполнить разметку через LVM+luks, но как? Шифрировать весь диск целиком, или определенные разделы? Какие нюансы при таком раскладе?

Диск чистый, на 160gb. Использовать Arch собираюсь как единственную систему.

Вики арча изучилал, запутался. Ноутбук X220.

 , , , ,

kokonoe
()