LINUX.ORG.RU

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

GNOME on Wayland на Nvidia-блобе. История успеха

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

Итак, свершилось! Мне наконец-то удалось запустить Wayland-сессию Гнома на проприетарном драйвере Nvidia. Для тех, кто не в теме: начиная с версии драйвера 364.12, Nvidia реализовала в нём начальную поддержку Wayland, однако несовместимую с тем, что используется в Mesa. В Mesa применяется библиотека GBM - Generic Buffer Manager, аллокатор буферов изображений. Реализация Nvidia основана на расширениях EGLStreams и EGLDevice, являющихся кроссплатформенным открытым стандартом Khronos. В списке рассылки разработчиков Wayland, Nvidia представила патчи для композитного менеджера Weston, однако разработчики их не приняли и, можно сказать, послали Nvidia подальше. Зато эти патчи адаптировали для Mutter и Sway, но о качестве работы будет ниже. Nvidia же в прошлом году анонсировала новый аллокатор, разрабатываемый совместно с разработчиками Mesa, но с момента последней новости - тишина. Nvidia не хочет создавать что-то платформоспецифичное, так как ей проще поддерживать единую кодовую базу для всех ОС.

Поддержка EGLStreams обеспечена в GNOME 3.24, однако для этого, оконный менеджер Mutter должен быть собран с --enable-egl-device Как оказалось, в Fedora 26 он собран без этой опции, также из-за применения библиотеки GLvnd, получаются лютые тормоза и лаги мышки. Аналогично в Arch Linux.

Поэтому для тестов я выбрал альфа-версию Ubuntu 17.10. Итак, что для этого нужно проделать:

1) установить драйвер Nvidia (sudo apt install nvidia-375)
2) включить DRM/KMS (по умолчанию в блобе он выключен из-за недоделанности и проблем со SLI-конфигурациями). Для этого в /etc/default/grub, в секцию параметров ядра, добавляем строку nvidia-375-drm.modeset=1 Номер драйвера указывать только для Ubuntu! Признаком успешного запуска DRM/KMS является Xorg, запущенный от юзера (в этом можно убедиться в менеджере процессов)

По идее, если всё сделано правильно, но сразу после перезагрузки Гном должен запуститься на Wayland, однако меня встречало окно входа в систему, и сеанс с Wayland никак не грузился. Поэтому я переключился на пятую tty-консоль, и стартанул сессию командой dbus-run-session -- gnome-shell --display-server --wayland

И о чудо! Оно запустилось! Начну с приятных моментов. Отрисовка значительно быстрее, чем с блобом на иксах. Курсор не отстаёт от окна ни на пиксель, анимации плавненькие, ресайз окон не тормозит. Может немного лагануть меню приложений, но я грешу на старый тормозной HDD, на котором я всё тестировал. Flatpak-приложения работают, но не все. Видео работает без проблем. Собственно, на этом приятное заканчивается. Далее оглашаю список ограничений:

1) Первое и самое главное - не работает Xwayland. В большинстве приложений. Из иксовых приложений успешно запустились лишь Firefox, Clementine и Chromium, остальные падают в корку с ошибкой Could not initialize GLX Потому запуск возможен только нативных Wayland-приложений. Чтобы запустить что-то на Qt5, нужно добавить переменную окружения export QT_QPA_PLATFORM=wayland, но тут тоже есть неприятные моменты.

2) Не запускается панель управления Nvidia (потому на скринах её нет), не работают приложения, юзающие веб-камеру (правда я только Cheese запускал), и как следствие предыдущего пункта - не работает ни одна игра (кроме встроенных гномовских) или эмулятор игровых консолей.

3) Иногда грузит CPU на 100%. Баг широко известен в сети, но я не знаю что думает на этот счёт Nvidia. От апстрима Гнома ответа не дождался.

4) KMS работает частично, в частности переключение между виртуальным консолями происходит секунды 2, а возврат в графическую может проходить и все 5. На свободном драйвере всё происходит мгновенно. Да, если вдруг кто спросит - нет, KMS в блобе не даёт высокое разрешение в консоли. Нету драйвера для fbdev, хотя с efifb вроде как разрешение высокое.

5) Родная панель управления Гнома не работает в такой конфигурации, потому запускается её сильно кастрированный вариант (скрин ниже)

Итог: я не знаю почему в Mesa выбрали GBM вместо открытого стандарта. Ведь Нвидию, по сути, обвинить не в чем. В кое-то веки смогла в стандарты. Я не думаю что будут какие-либо серьёзные улучшения как работы блоба с EGLStreams, так и оконных менеджеров куда эти патчи добавили, ибо апрстрим не принял, и тестировать некому. Хотя посмотрим как оно будет. На данный момент вердикт - неюзабельно.

Ещё скриншоты:

Firefox и LibreOffice
Activities
SMplayer (Qt5) нативно в Wayland
Панель управления
Nautilus и Clementine

>>> Просмотр (1600x900, 453 Kb)

 , , , ,

Sunderland93
()

Реальное время выполнения кода

Форум — Development

Как правильно замерить реальное время выполнения какой-нибудь функции на С/C++ и с какой максимальной точностью?

 , ,

anonimka
()

Cloud-разработка в Chrome OS на ASUS Chromebit и Kubernetes+CoreOS

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

У меня давно настроен Kubernetes+CoreOS на одной машине и это позволяет мне экспериментировать с разработкой распределенных приложений дома и запускать разные сервисы вроде торрентов и транскодинга в условиях жесткой изоляции среды и ресурсов.

Я решил попробовать устроить себе среду разработки, которая будет соответствовать определенным критериям

  • Будет глобально доступна с любой машины в мире без установки софта кроме браузера.
  • При работе с другого континента не будет ощущаться задержка при печати как было бы в vim+tmux. mosh скорее всего бы не решил проблему с vim.
  • Глобально доступны по HTTPS веб-приложения запущеные в этой среде
  • В Linux среде где запускается разрабатываемое приложение можно заменить дистрибутив на другой за несколько минут, но сохранить home.

Чтобы эксперимент был чистым все это тестируется на ASUS Chromebit со стоковой ChromeOS, 2 ГБ памяти и ARM Rockchip Quad-Core RK3288C, которая размером с большую флешку и воткнута в телевизор LG 49LB550V. Потому шрифты могут быть чуть больше чем обычно, чтобы было лучше видно на телевизоре. Устройство очень маломощное, но работает быстро потому что в ChromeOS нету дискового swap, только RAM+zRAM и если что-то не влезает, то выгружается.

Скриншоты

  • Редактор Codiad в полноекранном режиме. В принципе можно установить любой другой, но для обычного редактирование текста он подходит. Если найду такой, который потребляет мало памяти и умеет режим vim, поставлю его.
  • tmux. Вот так выглядит контейнер для разработки. Он совершенно отдельный от Codiad и я могу менять в нем дистры простым редактированием Dockerfile. В него и в Codiad примонтирован один и тот-же каталог с исходным кодом. При смене контейнера home тоже сохраняется. В данном случае в контейнере последняя версия Ubuntu, но ядро как всегда остается хостовым от CoreOS. В контейнер заранее установлены средства разработки на C++, Go, Python, NodeJS.
  • Caddy, который вы видели запущеным в контейнере. Интересная часть заключается в том, что для него создается виртуальный хост, создается Let's Encrypt сертификат и производится авторизация. Это умеет делать и сам Caddy, но он тут просто для демо. Суть в том, что в данном случае это будет делаться на уровне nginx фронтенда для любого приложения открывшего порт 8080 в контейнере
  • tmux+vim. Если работать не издалека, то вполне можно просто пользоваться tmux+vim. Плагины на него устанавливаются в home и в основном продолжают работу при смене дистра, кроме тех, которым нужна перекомпиляция.
  • Внутренности. Это Kubernetes Dashboard. В ней вы видите некоторые из упомянутых выше контейнеров и еще много чего. Для временных изменений некоторые параментры контейнеров можно менять прямо в UI, но лучше конечно через файл конфигурации.

Изначально CoreOS машина разворачивается сама по iPXE на голый диск. Если система уже была установлена, то она просто загружается. После этого по SSH необходимо загрузить ключи и некоторый набор базовых сервисов Kubernetes. Теперь кластером можно пользоваться удаленно через kubectl. Я запустил там локальный docker реестр, потому вы видите localhost в названии некоторых контейнеров. На моей машине различные сервисы работают на Alpine Linux, Ubuntu или CentOS в зависимости от того, на чем было проще настроить конкретное приложение. Если разницы нету, то я использую Alpine, так как тогда контейнеры наиболее компактны.

Цепочка загрузки такая

  • BIOS
  • PXE
  • iPXE
  • Ядро CoreOS
  • systemd
  • Docker
  • Kubernetes
  • Сервисы из публичных образов и локальный Docker реестр
  • Сервисы из локального Docker реестра

В качестве сервера использую старый Dell ноутбук с Core i7-2630QM, 8GB RAM и сломаной батареей, ибо нечего ему пылиться с таким процессором.

Если я захочу подключить второй сервер, то мне нужно сделать два действия: сделать для второго сервера облегченный конфиг без части Kubernetes демонов и придумать как монтировать диски удаленно. Пока что персистентные каталоги монтируются в хост систему, что не будет работать если сервисы будут случайно мигрировать между машинами. Но если я это сделаю, то полностью програмная виртуальная сеть на flannel будет работать полностью прозрачно и контейнеры на разных будут общаться друг с другом так же просто как и раньше. Из того что можно настроить дома поддерживаются GlusterFS+Heketi, Ceph и NFS

Среди дополнительных удобств на сервере есть связка Transmission+Plex, интерфейсы которых тоже доступны глобально. Потому я могу пойти в гости, поставить torrent дома с телефона, а потом транскодированый и оптимизированый фильм можно посмотреть на телевизоре например через Chromecast, AppleTV, PS4, XBox, Android, Windows Phone или другой способ отобразить браузер с компьютера на телевизор.

В качестве заключения скажу что мне понравился такой способ настройки домашнего сервера. Использование Docker контенеров позволяет уравнять в легкости настройки опакеченый софт из дистрибутивов и софт, который устанавливается скриптом сборки на github. Они оба могут быть завернуты в контейнер на любом дистрибутиве и потом когда более не нужны могут быть аккуратно удалены. Kubernetes очень облегчил работу с виртуальными хостами, шифрованием, перенаправлением портов, изоляцией ресурсов, перезапуском упавших сервисов и проверкой их здоровья.

>>> Просмотр (1920x1080, 1069 Kb)

 , , ,

vertexua
()

Пара вопросов об использовании CMake

Форум — Development

Редко имею дело с CMake, поэтому многих связанных с CMake вещей, не понимаю. Буду признателен за разъяснения или указания где именно можно найти нужную информацию.

Первый непонятный момент. Допустим, есть простая ситуация: Linux и всего два компилятора — gcc и clang. Мне нужно пользоваться то тем, то другим. При этом компилироваться как в release-режиме, так и в debug. Правильно ли я понимаю, что каноническим решением является вот такое:

cd ~/develop/my-project
mkdir build_gcc_release
cd build_gcc_release
cmake -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=Release ..
cd ..
mkdir build_gcc_debug
cd build_gcc_debug
cmake -DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=Debug ..
mkdir build_clang_release
cd build_clang_release
cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release ..
cd ..
mkdir build_clang_debug
cd build_clang_debug
cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Debug ..

Второй непонятный момент. Допустим, мне нужно использовать три внешних проекта (p1, p2, p3), у которых сборка делается через CMake. При этом я хочу, чтобы результаты компиляции всех трех подпроектов (т.е. исполнимые файлы и so-ки) сбрасывались в одни и те же каталоги. Т.е. вместо того, чтобы иметь что-то вроде p1/build/lib b p1/build/bin, p2/build/lib и p2/build/bin, p3/build/lib и p3/build/bin, я хочу иметь my-project/build/lib и my-project/build/bin.

Правильно ли я понимаю, что в этом случае у меня получается что-то вроде:

cd ~/develop/my-project
wget https://p1.home/download/p1-some-ver.tar.gz
tar -xf p1-some-ver.tar.gz
cd p1-some-ver
mkdir build_gcc_release
cd build_gcc_relese
cmake -DCMAKE_INSTALL_PREFIX=~/develop/my-project/build -DCMAKE_BUILD_TYPE=Release ..
make install
cd ../..

wget https://p3.home/download/p2-some-ver.tar.gz
tar -xf p2-some-ver.tar.gz
cd p2-some-ver
mkdir build_gcc_release
cd build_gcc_relese
cmake -DCMAKE_INSTALL_PREFIX=~/develop/my-project/build -DCMAKE_BUILD_TYPE=Release ..
make install
cd ../..

...
Т.е. я создаю compiler-specific makefiles для каждого из подпроектов, но при этом для всех подпроектов указываю общее значение CMAKE_INSTALL_PREFIX?

 ,

eao197
()

И снова вопрос об об awesome (завершающий в серии)

Форум — General

Вот здесь вот описано, как сделать так, чтоб акселераторы (всевозможные контрол цэ, контрол бэ) работали и при русской раскладке, то есть чтоб кнопка, нажатая одновременно с контролом или альтом, принудительно воспринималась, как нажатая в US раскладке, но заклинание приведено для старой версии осома, и, во-вторых, непонятно, в какое место вышеописанного по ссылке виджета его пихать. причём, что комментарии в /usr/share/X11/xkb/compat/basic я впилил:

//    group 2 = AltGr;
//    group 3 = AltGr;
//    group 4 = AltGr;

Спасибо за внимание.

 , ,

piyavking
()

Запуск Steam в отдельных иксах: нужен оконный менеджер

Форум — Desktop

Всем привет! Имею Debian 8 с KDE. Хочу запускать Steam и несколько других полноэкранных приложений в отдельных иксах. Но при стандартном запуске через xinit, у меня запускается Kwin. Да и работает всё это как-то анально. Наткнулся в интернете на совет запускать не просто отдельные иксы, а отдельный оконный менеджер с ними. Из всех оконных менеджеров (в голом виде), я юзал только Openbox. Сейчас стою перед выбором: Openbox, i3 или PekWM. Что посоветуете?

 , , ,

Sunderland93
()

Лучший моноширинный шрифт для редактора кода

Голосования — Голосования

В связи с недавними новостями хочу провести топ моноширинных шрифтов для редактора кода на ЛОРе.

В комментариях также приветствуются названия лучших моноширинных шрифтов для терминала.

P.S. Monospace(d) — это не шрифт, а лишь алиас к системному моноширинному шрифту по умолчанию (чаще всего DejaVu)

  1. Terminus 264 (29%)

    ********************************************************************************************************************************************************************************************************************************************************************************************************************************

  2. DejaVu / Hack 144 (16%)

    ******************************************************************************************************************************************************************************

  3. Consolas 130 (14%)

    *************************************************************************************************************************************************************

  4. Ubuntu 129 (14%)

    ************************************************************************************************************************************************************

  5. Другой 111 (12%)

    **************************************************************************************************************************************

  6. Droid / Roboto 105 (11%)

    *******************************************************************************************************************************

  7. Liberation 103 (11%)

    ****************************************************************************************************************************

  8. Pragmata Pro 58 (6%)

    **********************************************************************

  9. Courier New 54 (6%)

    *****************************************************************

  10. Lucida Console 47 (5%)

    ********************************************************

  11. Source Code Pro 47 (5%)

    ********************************************************

  12. Anonymous Pro 41 (4%)

    *************************************************

  13. X11 fixed 30 (3%)

    ************************************

  14. Fira Mono 24 (3%)

    *****************************

  15. Courier 16 (2%)

    *******************

Всего голосов: 1303, всего проголосовавших: 919

 

KennyMinigun
()

Скрин-каст.

Форум — Games

Нужна нормальная программа ( не SimpleScreenRecorder и ей подобные ) которая может запись игры не влияя на fps в игре. При SSR fps в Guild Wars 2 катастрофически падает. В общем жуть.

 , ,

x86th
()

XMonad и dzen2 очень затюнены :)

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

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

>>> Просмотр (2560x1600, 595 Kb)

 , , ,

pasl
()

Awesome - Переключение по тегам сразу на 2х мониторах

Форум — Desktop

Как переключатся по тегам сразу на 2х мониторах

Например

Есть 2 монитора

на 1 теги

A B C - 3шт

на 2 теги

A1 B1 C1 - тоже 3шт

как сделать так когда по нажатию modkey + 6 переклся на тег C1 на 2ом мониторе? (активный монитор чтоб при этом был - 1)

тоесть с 1го монитора управлять тегима 2х мониторов


в идеале хочется

когда нахожусь на 2ом мониторе то по его тегам переключалось по modkey + 1,2,3 а на 1ом монеторе по 4,5,6

а когда перехожу на 1 монитор то по его тегам по 1,2,3 а на 2ом по 4,5,6

 

GGUseR
()

Обновился инструмент для работы с агентами в 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
()

Веб-разработка в Vim

Форум — Web-development

Предлагаю обсудить и поделиться опытом по веб-разработке в Vim.

Я использую Vim в терминале termite (со своими патчами для дефолтного копипаста и прочее) с цветовой схемой gruvbox: как для терминала, так и для Vim.

Этот клавиатура-ориентированный vim-like терминал я упомянул не столько потому, что у него реализованы режимы как Vim (insert mode, selection mode, выделение клавиатурой включая блочное), а потому, что у него есть приятная фича (которую можно наблюдать в iTerm2 для OS X) при работе Vim'а в нём, а именно цвет курсора изменяется в зависимости от цвета символа, на котором находится курсор, а также при выделении цвет выделения повторяет цвет слов/строк (но без инвертирования где нужно, может еще допилят), скриншот.

Менеджер плагинов:

Перед обсуждением плагинов и настроек, хочу подчеркнуть почему я использую менеджер плагинов vim-plug: перепробовав все известные менеджеры плагинов, включая недоменеджер pathogen, остановился именно на vim-plug потому, что он самый быстрый (параллельная установка/обновление, к-во потоков настраивается), имеет приятный интерфейс, краткий синтаксис, а самое главное позволяет настроить загрузку или отключение плагинов по filetype и/или первому вызову самого плагина, это не только ускоряет старт/работу Vim, но и помогает разрулить конфликты некоторых плагинов, простой пример:

Plug 'tpope/vim-endwise',   { 'for': [ 'ruby','vim','sh','zsh' ] }
Плагин endwise будет загружен только для ft=ruby,vim,sh,zsh, т.к. если этот полезный плагин работает одновременно с не менее полезным плагином delimitMate, то возникает конфликт в файлах с ft=css,js и везде, где после открытия скобки нужен автоматический переход на следующую строку и автозакрытие скобки.

Кроме всего прочего, отдельно от веб-разработки-related для самого вима у меня такое:

Автоматическое переключение на английский в Normal mode и обратно на предыдущий в Insert mode:

Конечно же нужно решать проблему с локалями (т.к. веб-разработка, в отличие от программирования иногда ведется на отличных от английского языках), а именно с неудобством при их переключении в Normal mode и обратно, самое лучшее решение, это установка в систему xkb-switch + плагин в Vim для него.

Plug 'lyokha/vim-xkbswitch'
let g:XkbSwitchEnabled       = 1
let g:XkbSwitchLib           = '/usr/lib64/libxkbswitch.so'
let g:XkbSwitchIMappings     = ['ru']
let g:XkbSwitchSkipIMappings = {'*' : ['[', ']', '{', '}', "'"]}
Теперь не нужно переключать на английский входя в Normal mode и на русский обратно в Insert mode, переключение происходит автоматически. Очень удобно.

Линейка номеров строк:

set nu
set nuw=4
autocmd InsertEnter * set nornu
autocmd InsertLeave * set rnu
в Insert mode - с номерами строк всё как обычно, в Normal mode (точнее после первого входа в insert и выхода обратно в normal) включается типа линейки: скриншот.

Автоматическая паста с отступами:

Чтобы навсегда забыть эту проблему и не включать перед пастой каждый раз режим пасты или использовать хитрые хоткеи, можно просто добавить настройку:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Замена заменяемого без удаления (проблема забивания иксового буфера обмена):

Чтобы заменить слово или кусок окруженный делиметрами без удаления в иксовый буфер, можно использовать такую настройку на хоткей S :

nnoremap <silent> S :set opfunc=PasteReplace<CR>g@
function! PasteReplace(type, ...)
    if a:0
        silent exe "normal! `<" . a:type . "`>p"
    elseif a:type == 'line'
        silent exe "normal! '[V']p"
    elseif a:type == 'block'
        silent exe "normal! `[\<C-V>`]p"
    else
        silent exe "normal! `[v`]p"
    endif
endfunction
nmap SS S$
Теперь если нужно заменить слово без его удаления, можно просто: Sw , Si" , Si( , и т.п.

Проекты/сессии:

Плагин vim-startify - стартовый экран, можно настроить на сессии и букмарки, чтобы каждый раз не открывать то же самое в сплиты/табы/буферы.

Документация:

Для открытия документации в браузере (как минимум для того, что нас интересует: HTML, JavaScript, CSS, SCSS, LESS, Ruby, Rails, Django, PHP и т.п.) исходя из из ft= и положения курсора, удобно замапить на F1:

Plug 'Keithbsmiley/investigate.vim'
nnoremap <F1> :call investigate#Investigate()<CR>

Автокомплит и сниппеты:

В отличие от YouCompleteMe, автокомплитер neocomplete не тормозит (при работе и старте), не нужен питон (но нужен lua), а всё остальное такое же (для веб-разработки). Интегрируется с родным движком сниппетов neosnippet, который работает как с родными, так и универсальными vim-snippets (объединенные Snipmate & UltiSnip).

Настройка для навигации по комплиту через Tab (сам комплит всплывает автоматически, можно настроить обратное):

imap <expr><TAB> neosnippet#expandable_or_jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "\<C-n>" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable_or_jumpable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
if has('conceal')
  set conceallevel=2 concealcursor=i
endif

ZenCoding/Emmet:

Полнофункциональный Emmet для Vim: emmet-vim

Работает как нужно, но по дефолту неудобный (как по мне) хоткей <c-y>, , я настроил себе на jk . Т.е. Esc у меня kj , а дополнить jk . Первое время пользовался F4, привожу настройки, но jk намного удобнее. Просто на Tab настроить нельзя (иначе как пользоваться Tab?).

Plug 'mattn/emmet-vim',           { 'for': ['html','xhtml','css','sass','scss','less'] }
au FileType html,css,sass,scss,less imap <expr><F4> emmet#expandAbbrIntelligent("\<tab>")
au FileType html,css,sass,scss,less imap <expr>jk   emmet#expandAbbrIntelligent("\<tab>")
au FileType html                    imap <C-\>      <CR><CR><Esc>ki<Tab>
Плагин MatchTag - для отображения парных тегов.

Кроме Emmet'а для Vim существует аналог: Sparkup (нужен питон, не пробовал).

Отображение отступов:

Можно настроить каким символом и цветом отображать линии отступов, я настроил на хоткей <A-i> , альт как непечатаемый символ, так что проще посмотреть настройку склонировав репу на гитхабе и заглянув в .vimrc (или нажать C-v A-хоткей), скриншот.

Plug 'Yggdroot/indentLine'
let g:indentLine_enabled    = 0
let g:indentLine_char       = '¦'
let g:indentLine_color_term = 239
let g:indentLine_color_gui  = '#A4E57E'
nmap ^[i :IndentLinesToggle<CR>

Подсветка синтаксиса:

Plug 'tpope/vim-haml',            { 'for': 'haml'   }
Plug 'wavded/vim-stylus',         { 'for': 'stylus' }
Plug 'groenewege/vim-less',       { 'for': 'less'   }
Plug 'digitaltoad/vim-jade',      { 'for': 'jade'   }
Plug 'slim-template/vim-slim',    { 'for': 'slim'   }
Plug 'othree/html5-syntax.vim',   { 'for': 'html'   }
Plug 'cakebaker/scss-syntax.vim', { 'for': 'scss'   }

Plug 'hail2u/vim-css3-syntax',    { 'for': ['html','css'] }
augroup VimCSS3Syntax
  autocmd!
  autocmd FileType css setlocal iskeyword+=-
augroup END

Проверка синтаксиса:

Для проверки синтаксиса используется Syntastic + сторонние чеккеры:

Plug 'scrooloose/syntastic', { 'for': ['ruby','html','css', 'javascript', 'haml'] }
let g:syntastic_auto_jump           = 1
let g:syntastic_error_symbol        = '✖'
let g:syntastic_warning_symbol      = '►'
let g:syntastic_javascript_checkers = ['jshint'   ] " sudo npm install -g jshint
let g:syntastic_html_checkers       = ['jshint'   ] " sudo npm install -g jshint
let g:syntastic_ruby_checkers       = ['rubylint' ] " gem install ruby-lint
let g:syntastic_haml_checkers       = ['haml-lint'] " gem install haml-lint
let g:syntastic_css_checkers        = ['csslint'  ] " sudo npm install -g csslint
let g:syntastic_css_csslint_args    = "--ignore=zero-units"

Деобфускация / beautify'еры:

Плагин vim-autoformat работает со сторонними 'formatprograms', например js-beautify для HTML, CSS и JavaScript. autopep8 для питона и т.д. Всё это должно быть установленно.

Plug 'Chiel92/vim-autoformat'
let g:formatprg_args_javascript = "-j -q -B -f -"
noremap  <F8>   :Autoformat<CR><CR>
vnoremap <C-F8> gq

JavaScript:

Дефолтная поддержка JavaScript в Vim на довольно низком уровне, так что необходимы плагины как для самого JS, так и для библиотек, плагин javascript-libraries-syntax поддерживает почти все основные либы: jQuery, underscore.js, Backbone.js, AngularJS, RequireJS, Sugar.js, Jasmine и т.д.

Plug 'moll/vim-node'
Plug 'pangloss/vim-javascript',      { 'for': 'javascript' }
Plug 'jelera/vim-javascript-syntax', { 'for': 'javascript' }
let javascript_enable_domhtmlcss = 1
let g:html_indent_inctags        = "html,body,head,tbody"
let g:html_indent_script1        = "inc"
let g:html_indent_style1         = "inc"

Plug 'othree/javascript-libraries-syntax.vim', { 'for': 'javascript' }
let b:current_syntax       = 'javascript'
let g:used_javascript_libs = 'angularjs'

Также полезен tern_for_vim (сам Tern должен быть установлен), который умеет в 'Jump to the definition', 'Find the type' и т.д.

Пробельные символы:

По A-w показывает, по \-dw удаляет. Перевести все табы в пробелы (вдруг кто не знает), в Vim: :retab .

Plug 'ntpeters/vim-better-whitespace'
let g:better_whitespace_enabled = 0
nmap ^[w :ToggleWhitespace<CR>
nmap <Leader>dw :StripWhitespace<CR>

И кое-какие настройки по-мелочи:

set splitbelow
set splitright
inoremap  kj           <Esc>
map       gm           :call cursor(0, virtcol('$')/2)<CR>
nnoremap  <F12>f       :exe ':silent !firefox %'<CR><C-l>
nnoremap  <F12>c       :exe ':silent !chromium-browser %'<CR><C-l>
1-2 строки: для нормального открытия (слева направо) сплитов.
3: Esc на kj - мегаудобно.
4: для попадания на средину строки.
И последние две для предпросмотра в браузерах.

Мой ~/.vimrc

Кто что использует и как, кроме вышеуказанного?

 

VimCasts
()

Что почитать по concurrency и memory model в С++11

Форум — Development

Интересуют atomics, CAS, memory barriers, false sharing detection and prevention, lock-free структуры данных, разные примеры happens before и т.д.

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

Статьи тоже сойдут, хотя я уже их начитался.

 

vertexua
()

Awesome disable DPMS when fullscreen: solution

Форум — Desktop

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

Сделал правило для awesome, которое вызывается когда окно входит или выходит в фуллскрин/из фуллскрина. Если есть окна в фуллскрине - DPMS отключается. Если нет окон в фуллскрине - включается.

Может кому пригодится:

client.connect_signal("property::fullscreen", function(c)
    local fullscreened = false
    for key,value in pairs(client.get()) do
        if(value.fullscreen == true) then
            fullscreened = true
            break
        end
    end
    if fullscreened then
        disable_powersaving()
    else
        enable_powersaving()
    end

end)

function disable_powersaving()
        awful.util.spawn("xset s off")
        awful.util.spawn("xset -dpms")
end

function enable_powersaving()
        awful.util.spawn("xset s on")
        awful.util.spawn("xset +dpms")
end

Lua не знаю совершенно, да.

Эта штука лучше lightsOn.sh тем, что у меня оный не заработал, и он, вроде как, заточен только на флешик.

Две недели пользую на двумониторной конфигурации, полёт нормальный.

Засовывать в ~/.config/awesome/rc.lua

 , , ,

NeverLoved
()

VIM для веб-разработки

Форум — Web-development

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

Я уже больше не могу. Пробовал всякие там IDE (NetBeans, PhpStorm) и т.п. Пробовал «редакторы» (medit, bluefish, geany, sublime). Всё чем-то раздражает, не могу понять почему. Всё мне не так. Подсознательная тяга к сосноле, что ли. Остались две баррикады, видимо: vim и emacs. Emacs меня пугает сам по себе, так что начну с vim'а, серьезно начну, черт возьми.

Чего хотелось бы:

- поддержку проектов
- emmet (бывший zencoding) ((хотя спрашивать нечего, знаю, что он где-то есть, но будут ли проблемы?))
- подсветка парного тега html (наводишь на один div и он показывает, где закрывающий div, очень удобно)
- дерево каталогов слева
- подсветка ошибок PHP, html, css, javascript
- подсказки (а-ля методов класса, тупой хелп и т.п.)
- возможно быстро сменить кодировку файла и открыть файл в другой кодировке
- ваши плагины/модули по вкусу
- интеграция с git
- интеграция с ftp (залить измененное в "одно нажатие")
- возможность разделить экран на две части и открыть таким образом два файла сразу (видеть их и редактировать)
- какой шрифт для консоли рекомендуете? недавно накатил убунту (14.04), там консольный шрифт мне кажется не очень. можно ли поменять шрифт только для vim?

Внушительный список вышел, вроде бы. Крайне долгое время обходился без IDE и, похоже, сильно привык (зря?).

 

coderage
()

Опрос о знакомстве с.

Форум — Development

Систематическое программирование Вирта:

*читал, перечитываю регулярно.

*читал(и делал упражнения), понравилось.

*читал(и делал упражнения), не понравилось.

*читал, спасибо за напоминание , перечитаю.

*читал, благодарю проведение, ничего не помню.

*не читал, теперь прочту( и прорешаю).

*не читал,(спасибо что предупредил,) и не буду.

опрос ^

qulinxao
()

Кроссовки

Форум — Talks

Прошло два года. Сносил я пару Asics 1160 (беговые гелевые) и как то разочаровался в них... Для ног они прекрасны, но рвется все в глупых местах. И не только у меня но и у друзей (и такая же модель и другие).

Посоветуйте плиз то-же гелевые кроссовки (видимо беговые) для ежедневной ходьбы по 10-20 километров (преимущественно).

Сейчас присматриваюсь к ассортименту UnderArmor. Что посоветуете?

quest
()

Awesome, внешний монитор(VGA)

Форум — Desktop

Доброй ночи,господа. Итак, есть нетбук с экранчиком в 10 дюймов, разрешение 1024х600, и есть внешний монитор в 17 дюймов. Как сделать так, чтобы при подключении внешнего монитора, он автоматически подлавливался, разрешение на нем выставлялось 1280х1024, а экран нетбука прекращал свою работу?

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

Дистрибутив - Debian testing. В качестве WM awesome wm.

Буду очень признателен за помощь. Заранее спасибо.

 ,

permafrost
()

Линейный алгоритм деления узла для r-дерева

Форум — Development

Пытаюсь тут написать на C++ R-дерево для хранения графических (2d) элементов.

Столкнулась с самой неприятной проблемой - понимания написанного. На википедии в разделе «Функция linearSplit» имеется описание алгоритма, но после первой строчки мой мозг начинает кричать «я не хочу программировать, я хочу варить борщ!»

Предположим, что мы храним в дереве элементы со свойством boundingRect (x, y, width, height). Максимальное количество элементов в узле - 4, минимальное - 2. Имеем дерево:

Изображение дерева.

  • R - корень дерева
  • V1, V2, V3 - внутренние узлы, имеющие по четыре потомка (для
  • V1, V2 и V3 не отобразила для экономии места)
  • V5, V6, V7, V8 - листовые узлы имеющие по черыте элемента (для V5, V6, V7 так не отобразила для экономии места).
  • O1, O2, O3, O4 - элементы.

Все описанные выше сущности имеют mbr.

Предположим, что мы вставляем элемент O5. Самый подходящая листовая вершина для него - V8 (изменение mbr минимально).

1) Правильно ли я понимаю, что этом случае будет создана новая вершина (V’) и в функцию линейного разделения будут переданы вершины V7 и V’, в которой будет произведено рапределение элементов (O1, O2, O3, O4, O5) в соответствии с их mbr между этими вершинами (V7, V’)?

2) Правильно ли я понимаю, что так как в нашем случае происходит раскол до корня дерева, функция линейного разделения будет вызвана и для вершин V4, V’’, в которой будет произведено распределение листовых вершин (V5, V6, V7, V8, V’) по тому же алгоритму? И так далее пока не дойдем до корня?

Теперь что касается самого алгорима распределения. Вот что написано в вики:

По каждой координате…

Имеется ввиду измерение? В нашем случае x и y?

...для всего набора разделяемых вершин...

В случае, если мы добавляем O5 и производим деление узла V8 что тут является разделяемыми вершинами? Смущает фраза “для всего набора разделяемых верших”, ибо как бы говорит, что их может быть больше двух. Значит это не невршины V8, V’, а (в данном случае), элементы O1-O5?

... вычисляется разница между максимальной нижней границей прямоугольника по этой координате и минимальной верхней…

Как я понимаю выбирается максимальный (left/x+w) (bottom/y+h) и минимальный (right) (top) и вычисляется разница... Но ведь это по сути ширина и высота mbr для этой группы объектов?

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

Что здесь является исходным набором для построения всего дерева? Разница между мин. макс. координатой - это ведь тоже ширина/высота? Что значит нормализировать полученные width/height на другие width/height? И почему речь идет о полученной виличине, если мы получили две величины?

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

 

totik
()

Shadowrun: Dragonfall

Форум — Games

У кого запустилось и сколько ждали чтобы загрузилось, что нового(классы и закуп все такие же скушные?) ?

 ,

DR_SL
()