LINUX.ORG.RU

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

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

Форум — Development

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

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

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

 , ,

dsxl
()

очень хочется поделиться ))

Форум — Development

хук на бранч, gitlab vs jenkins

1. в дженкинсе наплодить джобиков (dev, test, master) и на каждый ждобик выставить галку Trigger builds remotely (e.g., from scripts). написать туда ключик, всем разные.

2. добавить в корень проекта .gitlab-ci.yml типа такого:

stages:
- build_developer
- build_test
- build_master



build_developer_job:
  stage: build_developer
  only:
  - develop
  script:
  - curl http://jenkins.url/job/project-develop/build?token=token_develop



build_test_job:
  stage: build_test
  only:
  - test
  script:
  - curl http://jenkins.url/job/project-test/build?token=token_test



build_master_job:
  stage: build_master
  only:
  - master
  script:
  - curl http://jenkins.url/job/project-master/build?token=token_master

ну и конечно добавить раннер: https://docs.gitlab.com/runner/register/index.html

и волосы будут здоровые и шелковистые.

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

 ,

Rastafarra
()

Debian 9 Stretch + dwm

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

Достался мне для ремонта нетбук Acer Aspire One D255 c 1GB RAM на борту.

Поменял порванную WiFi-антенну и корпус (по счастливому стечению обстоятельвств нашел на avito за копейки), заменил планку памяти на 2GB.

Ранее установленный и работающий отнюдь не быстро на таком железе Linux Mint 17 с XFCE решил заменить на Debian 9 Stretch с dwm 6.1.

Установил с netinstall-образа со всеми необходимыми компонентами, задействовал zswap c lz4/zsmalloc, дисплейный менеджер не используется - работает автовход в сессию иксов.

Cобрал dwm с учетом патчей:

dwm-resizecorners-6.1.diff
dwm-fancybar-6.1.diff
dwm-pertag-6.1.diff
dwm-6.1-save_floats.diff
dwm-6.1-systray.diff
dwm-attachaside-6.1.diff
dwm-push-6.1.diff
dwm-r1615-selfrestart.diff

Шрифты: в системе и в панели - Cantarell 9, Font Awesome 9 для значков тегов, в терминале - Ubuntu Mono 10.

Терминал - urxvt, текстовый редактор - geany, файловый менеджер - PCmanFM.

GTK Theme - Espresso 0.1 (модифицированная), иконки - Vivacious-NonMono-Light-Yellow.

Скриншоты: PCmanFM+SMPlayer, Geany, PaleMoon+LOR.

 ,

mad_austronaut
()

Совместное использование ресурсов

Форум — Development

Есть проблема доступа к совместным ресурсам. Я вот не пойму, это реальная проблема, или она надумана?

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

Пусть есть условная ячейка памяти, которую разные процессы могут инкрементить. Как принято представлять эту модель? Процесс №1 считывает текущее значение из памяти(допустим - это 0), прибавляет к нему единицу, а затем записывает в память получившееся значение вместо предыдущего. Соответственно пока процесс №1 производит операцию сложения, процесс №2 может считать значение памяти, и начать свою операцию сложения. Затем, после того как процесс №1 записал результат(1) в память, процесс № 2 также записывает свой результат(1) в память, и результат 2-х инкрементов — 1.

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

Это все выглядит уродливо, как кровавое месиво.

Давайте посмотрим на это с другой стороны.

Есть условная ячейка, к которой имеет доступ только один процесс, который умеет ее инкрементить. Остальные процессы могут послать сообщения этому процессу, с «просьбой» инкрементации. При этом, эти мессенджеры абстрагированны от текущего значения счетчика, нет нужды считывать значения и производить собственные операции над этим значением, их дело — послать собщение и все. Они не имеют никакого доступа к этой памяти.

То есть, обычная инкапсуляция. И нет никакой проблемы.

Если это так просто, то зачем городить огород? Зачем решать несуществующие проблемы? Может это выгодно всякого рода горе-дезигнерам, делать вид, что существует проблема, нет проблемы — нет и хлебушка с маслицем?

Перемещено tailgunner из development

Перемещено jollheef из job

 , ,

vikingfilmtracker
()

Убираю status bar. Всё перекрашивается в странные цвета.

Форум — Development

Задача: убрать status bar и ничего не сломать.
Нюанс: Использую Qt, поэтому могу это сделать лишь из Manifest.xml.
Итого прописываю:

android:theme="@android:style/Theme.NoActionBar.Fullscreen"

Получаю: status bar действительно скрывается, но цвета плывут. Похоже на то, что Андроид мне подсовывает какую-то тёмную тему. А я хочу чтобы он просто никуда не лез и ничего не трогал, а просто убрал то, что приказано.
В общем что мне делать?

 ,

Stahl
()

PIMPL без указателя

Форум — Development

Всем хорошо известен паттерн PIMPL через скрытие реализации за указателем. С известными же проблемами неоптимального исполнения, когда нужно дополнительно аллоцировать память под сам указатель. Сходу нашёл в интернете варианты вместо указателя использовать заранее большой массив, на котором вызывается placement new, но такой подход вызывает ещё больше вопросов.

В самом C++ для скрытия реализации есть абстрактные интерфейсы без данных, реализация которых создаётся через фабрику или статический метод вместо конструктора. Однако с абстрактными интерфейсами одна беда — если наследовать один интерфейс от другого, то их реализации будут иметь ромбовидное наследование — один раз от наследуемого интерфейса, второй раз от реализации базового интерфейса. Ложку дёгтя добавляет необходимость замены конструкторов фабриками и руками делать правильные вызовы родительских конструкторов. Добавим сюда необходимость писать для каждого класса фактически два: один обстрактный, второй с реализацией. Получим достаточно неудобный подход, недостатки которого устраняет PIMPL.

Возьмём к примеру библиотеку Qt, объектная модель которой полностью построена на PIMPL и наследовании от базового QObject. При этом сами объекты на стеке или по значению создаются крайне редко, в повальном случае экземпляры QObject выделяются в куче. Получаем двойную аллокацию: первую для самого указателя, вторую для данных по указателю. Также при использовании подобных экземпляров будет двойное разименование, что также негативно скажется на производительности. При этом подсознательно понимаешь, что подобный подход бессмысленнен, ведь PIMPL-указатель никогда не подменяет реализацию на этапе выполнения, он создаётся исключительно в конструкторе и удаляется исключительно в деструкторе объекта.

А что если вообще без указателя и данных в интерфейсе? Вместо дополнительного указателя на данные использовать указатель на интерфейс. Аллокацию же переопределять операторами new и delete.

Вот простой пример, нарисованный на коленке:

#pragma once

#include <cstddef>

class A
{
public:
	A(int value = 42);

	int value() const;
	void setValue(int value);

	DECLARE_PRIVATE(A)
};

class B : public A
{
public:
	B(int data);

	int data() const;

	DECLARE_PRIVATE(B)
};
#include "lib.h"

class A::Private
{
public:
	int value;
};
DEFINE_PRIVATE(A)

A::A(const int value)
{
	to_private()->value = value;
}

int A::value() const
{
	return to_private()->value;
}

void A::setValue(const int value)
{
	to_private()->value = value;
}


class B::Private : public A::Private
{
public:
	int data;
};
DEFINE_PRIVATE(B)

B::B(const int data)
{
	to_private()->data = data;
}

int B::data() const
{
	return to_private()->data;
}

DECLARE_PRIVATE и DEFINE_PRIVATE переопределяют операторы new и delete и определяют методы приведения реализации к интерфейсу:

#define DECLARE_PRIVATE(T) \
public: \
	void * operator new(std::size_t size); \
	void operator delete(void * ptr); \
	class Private; \
private: \
	const Private * to_private() const { return reinterpret_cast<const Private*>(this); } \
	Private * to_private() { return reinterpret_cast<Private*>(this); }

#define DEFINE_PRIVATE(T) \
	void * T::operator new(const std::size_t size) \
	{ \
		return new Private; \
	} \
	\
	void T::operator delete(void * const ptr) \
	{ \
		delete static_cast<Private*>(ptr); \
	}

Ограничения данного подхода очевидны: объекты нельзя создавать на стеке или в виде переменной-члена класса. Аллоцировать их можно только через new, к примеру:

std::unique_ptr<B> b(new B(95));
b->setValue(33);

Сравним с традиционным подходом в Qt:

  • Объявление класса: Qt — Q_DECLARE_PRIVATE(classname), в нашем случае то же самое — DECLARE_PRIVATE(classname).
  • Определение класса: Qt — наследование реализации, то же самое у нас + DEFINE_PRIVATE(classname).
  • Аллокация класса: Qt — явный вызов базового класса с передачей указателя на реализацию
    MyObject::MyObject() : MyParentObject(*new MyObjectPrivate)
    у нас — неявный вызов базового класса без лишних телодвижений.
  • Обращение к реализации: Qt — d_func(), у нас — to_private().
  • Аллокация объекта в куче: Qt — две аллокации, в нашем случае — одна.
  • Аллокация объекта на стеке: Qt — одна аллокация, в нашем случае тоже одна, через явный operator new.

Осталось только понять как запретить создавать объекты на стеке на этапе компиляции, но это уже детали.

Я догадываюсь, что всё выше есть велосипед, но почему-то я нигде не встречал подобной реализации (кроме исходников Андроида). Собственно, какие у есть минусы у данного подхода? Какие известные проекты практикуют подобный подход вместо традиционного PIMPL?

 

Dendy
()

Есть ли лоровцы, заинтересованные в продолжении развития QtWebKit?

Форум — Development

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

 , ,

annulen
()

Игровые сервера L.O.R.

Форум — Games

Благодаря Вкусносерверу у нас есть сервера, где можно собраться и поиграть.
Запущено:

  • UT2004, dm;
  • teeworlds - instagib/vanilla;
  • Openarena;
  • Warsow.

На очереди к запуску:

  • Openttd;
  • Xonotic;
  • Hedgewars.


Маленькая просьба: добавляйте к нику [Lor], чтобы мы могли друг друга узнавать :)

Списки запущенных серверов:

ut2004, dm, deck17 (maprotate автоматический, карты дефолт). Версия игры должна быть 3369, то есть последняя. Для коннекта используем либо tazhate.ru, либо 217.73.58.123, либо 217.73.56.129. Настраиваем ник/скин игрока в settings и прочее, что надо, потом вызываем консоль по ~, пишем туда open 217.73.58.123. Должно подключиться.

teeworlds instagib, maprotate по стандартным картам + пара веселых, версия должна быть 0.6.1. Искать по поиску (сняв все галки справа) по словам linux либо lor. Либо коннектитесь напрямую, любой из айпи выше + порт 8303.

teeworlds vanilla, maprotate по стандартным картам + пара веселых, версия должна быть 0.6.1. Искать по поиску (сняв все галки справа) по словам linux либо lor. Либо коннектитесь напрямую, любой из айпи выше + порт 8304.
Модератор обоих серверов teeworlds - z00ke, для киков/банов каких-нибудь гуманоидов обращайтесь к нему.

Облегчаю себе (и другим) касту:
Играющие в ut2004:

[user]tazhate[/user], [user]Spirit_of_Stallman[/user],[user]nihil[/user],[user]Gary[/user], [user]Worron[/user], [user]kostian[/user], [user]tekk[/user],[user]DrF[/user],[user]Darth_Revan[/user], [user]abyz[/user],[user]lorovec[/user], [user]LinuxUser[/user],[user]stevejobs[/user]

Играющие в teeworlds:
[user]tazhate[/user], [user]z00ke[/user],[user]ei-grad [/user], [user]nickionn[/user], [user]HunOL[/user], [user]dikiy[/user], [user]Paused[/user], [user]aidan[/user], [user]i_gnatenko_brain[/user],[user]stevejobs[/user]

Играющие в Openarena:
[user]tazhate[/user],[user]stevejobs[/user]
Играющие в Warsow:
[user]tazhate[/user],[user]gavlig[/user],[user]santic[/user],[user]stevejobs[/user]
Если кто хочет в список - просите добавить в комментариях.


ps: игры не нужны, да.
pps: для minetest|minecraft есть http://ttyh.ru

 ,

tazhate
()

О чем вы говорите, кроме как о делах?

Форум — Talks

Сабж. Как-то я поймал себя на том, что умею говорить лишь о чем-то конкретном, обсуждать проблему, новость, придумывать что-то определенное. А вот разговоры помимо таких вообще не даются, разве что собеседник(и) сам полностью ведет разговор и не забыват, что я присутствую и дает слово.

И что характерно, я потом практически не могу толком вспомнить, о чем же собственно говорили?

Я бы не беспокоился, но «женщины любят ушами». И наличие плюсов у меня в виде денег/внешности вменяемой/интересных (мне) увлечений помогает довольно мало. Т.е. иногда на ночь-две. Потом всё. Каких-то близких отношений нет.

Потому вопрос: а о чем вы говорите, кроме как о делах? В частности с женщинами.

 

cvs-255
()

Обновился инструмент для работы с агентами в C++: SObjectizer 5.5.0

Форум — Development

SObjectizer — это реализация модели акторов для C++, позволяющая программировать на C++ с использованием работающих на разных нитях агентов, общающихся между собой посредством сообщений. SObjectizer существенно упрощает разработку событийно-ориентированных приложений, для параллельной и независимой обработки событий в которых требуется многопоточность и/или распределенность. SObjectizer использовался для создания как для мелких утилит, так и серьезных распределенных приложений, работающих под большой нагрузкой в режиме 24x7.

Последние несколько лет SObjectizer развивается на SourceForge как OpenSource проект под BSD-лицензией. Подробнее об истории, текущем состоянии и направлении движения SObjectizer можно прочитать здесь.

Версия 5.5.0 является результатом очередного, очень значимого этапа развития проекта.

Главное отличие v.5.5.0 от предыдущих версий — это отсутствие зависимости от ACE Framework. Т.е. теперь ACE в коде ядра SObjectizer не используется вообще, для SObjectizer достаточно наличия стандартной библиотеки C++11. Это означает, что SObjectizer уменьшился в размере, нужно меньше времени на сборку SObjectizer-проектов, упрощается поддержка различных компиляторов и платформ. В частности, эта версия SObjectizer тестировалась посредством MSVS2013 (Windows), GCC 4.8/4.9 (Windows, Linux), Clang 3.5.0 (Linux).

Из более мелких изменений можно отметить прямую поддержку std::chrono при работе с отложенными/периодическими сообщениями, а так же небольшое изменение названий некоторых классов/функций (с сохранением старых имен для обеспечения совместимости). Более подробная информация о нововведениях в v.5.5.0 доступна в соответствующем разделе Wiki проекта. Так же увеличилось количество страниц с описаниями базовых вещей SObjectizer.

Версия 5.5.0 может быть загружена из раздела Files или получена из Subversion-репозитория.

Примечание. Этот релиз содержит только ядро SObjectizer (т.е. проект so_5). Никакие другие подпроекты (вроде so_log или so_sysconf) в релиз не включены. Возможно, сборка SObjectizer Assembly со всеми подпроектами будет сформирована и опубликована позже (если она действительно кому-то потребуется).

PS. Анонс делается просто для того, чтобы уведомить, что такой проект есть, живет, развивается. Доступен под BSD-лицензий, т.е. даром, в том числе и для коммерческих проектов. Это не просьба сделать code review. И не попытка кому-то что-то «продать».

PPS. Специально для желающих постебаться над синтаксисом и посравнивать программирование на C++ с Perl-ом. Вот классический пример Hello, World. В традиционном, ООП-шном варианте, с созданием класса агента и переопределением виртуальных методов (хотя есть и более модерновый вариант, с использованием С++ных лямбда-функций):

#include <iostream>

// Main SObjectizer header files.
#include <so_5/all.hpp>

// Definition of an agent for SObjectizer.
class a_hello_t : public so_5::rt::agent_t
{
	public:
		a_hello_t( so_5::rt::environment_t & env )
			: so_5::rt::agent_t( env )
		{}

		// A reaction to start of work in SObjectizer.
		virtual void
		so_evt_start() override
		{
			std::cout << "Hello, world! This is SObjectizer v.5."
				<< std::endl;

			// Shutting down SObjectizer.
			so_environment().stop();
		}

		// A reaction to finish of work in SObjectizer.
		virtual void
		so_evt_finish() override
		{
			std::cout << "Bye! This was SObjectizer v.5."
				<< std::endl;
		}
};

int
main( int, char ** )
{
	try
	{
		// Starting SObjectizer.
		so_5::launch(
			// A function for SO Environment initialization.
			[]( so_5::rt::environment_t & env )
			{
				// Creating and registering single agent as a cooperation.
				env.register_agent_as_coop( "coop", new a_hello_t( env ) );
			} );
	}
	catch( const std::exception & ex )
	{
		std::cerr << "Error: " << ex.what() << std::endl;
		return 1;
	}

	return 0;
}

PPPS. Специально для желающих узнать, чем SObjectizer лучше libcppa/CAF. В двух словах — это две совершенно разные разработки, ставящие перед собой разные цели и достигающие их разными способами. Подробнее здесь и здесь.

 , , ,

eao197
()

Awesome Pro Themes

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

Переработал серию тем для Awesome 3.5: Pro

Большой модный скриншот в перспективе.

Теперь тема идёт в 4х вариантах:

Нестандартное решение для тегов: пустой - пустой, полузатухший - занятый тег, яркий - фокус, красного/желтого - urgent. В комплекте два вида тегов, как на скриншотах hexagon, а также прямоугольники.

Интегрированный плеер (управление и отображение трека), MPD через mpc/ncmpcpp, но можно управлять и DeaDBeeF'ом, который также умеет отдавать трек и предоставлять управление через cmd.

Кто захочет попробовать, ознакомьтесь с важной информацией.

Пользуясь случаем, всем желаю мира и добра, особенно друзьям пользователям Awesome.

 

vim
()