Pull to refresh
22
0
Георгий Шепелёв @gshep

Пользователь

Send message

Почему нам необходима рефлексия в C++1y

Reading time4 min
Views17K
Программам необходимы данные. Программы выдают лишь настолько хороший результат работы, насколько полны и валидны были входные данные. Для некоторых программ входными данными являются обычные файлы или полученная из сети информация (пример — ваш браузер). Другие программы оперируют исходными кодами. Эти вторые «мета-программы» тоже нуждаются в данных. Чем они будут качественнее — тем качественнее будет и результат.

Что же за данные мы «скармливаем» таким программам? Ну, в С++ более важным чем «что?» является вопрос «когда?» (помните Морфеуса?). Программа на С++ это всего-лишь последовательность битов, которые компилятор пытается прочитать и понять. И вот в процессе этого «понимания» компилятор преобразует код на С++ в машинные инструкции и (что особенно интересно!) выполняет некоторую часть кода вашей программы. Да, мы говорим о мета-программировании на этапе компиляции.

Возвращаемся к вопросу «что?». Мы хотим иметь доступ ко всем сущностям, которые только теоретически могут быть доступны на этапе компиляции: типы, члены классов, функции, аргументы, пространства имён, номера строк кода, имена файлов — и всё это хорошо бы иметь в «чистом виде», без каких-либо странных препроцессорных хаков или использования сторонних утилит. Кроме того, хорошо бы получить и менее очевидные вещи: информацию о конвертируемости одних типов в другие, отношениям наследования и агрегации, дружественных классах и функциях и т.д.

Компилятор языка С++ уже имеет всю эту информацию! Но, к сожалению, не в доступной для мета-программирования форме. Получается странная такая ситуация — мы можем выполнить кое-какой код на этапе компиляции — но вот большинства данных у нас нет. Ну и здесь было бы логично задаться вопросом «А как же мы можем эти данные получить?».
Читать дальше →
Total votes 37: ↑31 and ↓6+25
Comments73

Подглядываем за метаниями нейронной сети

Reading time8 min
Views32K


В комментариях к моей предыдущей статье о происходящем в нейронной сети проскользнула фраза, что, к сожалению, визуализация процессов обучения редко бывает возможна на реальных задачах с большими данными. Действительно очень жаль. Давайте же попытаемся это исправить. Под катом я предлагаю простую и, как ни удивительно, информативную визуализацию процесса обучения нейронной сети, не зависящую ни от характера задачи, ни от свойств самой сети, то есть доступную для сколь угодно сложной задачи.
Читать дальше, с картинками
Total votes 42: ↑40 and ↓2+38
Comments17

Изолирование приложения с IP-адресом из VPN другой страны на примере Steam

Reading time7 min
Views67K
Abstract: Изоляция приложения на уровне сети использованием network namespaces Линукса. Организация SSH-туннелей.

Традиционно, большая часть статьи будет посвящена теории, а скучные скрипты — в конце статьи. В качестве субъекта для экспериментов будет использоваться Steam, хотя написанное применимо к любому приложению, включая веб-браузеры.

Вместо вступления. Я просто покажу эту картинку:

147%… Что-то мне это напоминает. Впрочем, хабр не для политики.

Цена на игры в Стиме зависит от региона. Регион — от IP'шника. Есть желание иметь цены в рублях, а не в евро.

Для этого мы используем VPN через SSH с использованием tun-устройств, плюс network namespaces для изоляции приложения от всех остальных сетевых устройств.

Network namespaces


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

Более того, большинство десктопных приложений вообще ничего не понимает в интерфейсах, так как предполагают, что у системы есть только один сетевой интерфейс и не даёт возможности указать, каким из интерфейсов надо пользоваться. Серверное ПО обычно имеет эту опцию (какой адрес использовать в качестве адреса отправителя), но для десктопов это непозволительная роскошь.

Если у нас есть несколько интерфейсов (один из которых относится к VPN), то нет штатных методов сказать стиму, что надо использовать его, а не eth0/wlan0. Точнее, мы можем «завернуть» весь трафик в VPN, но это не всегда желательно. Как минимум — рост latency и снижение скорости (даже если VPN ведёт на супербыстрый сервер, увеличение latency, оверхед от туннеля и фиксированная ширина локального канала ставят TCP в положение, когда приходится резать скорость). Как максимум — одно дело «покупать через русский VPN», другое дело — пускать туда весь трафик. Меня совсем не прельщает использование VPN для получения защиты роскомнадзором от оппозиции и вольнодумства.

В этих условиях возникает большое желание оставить один на один конкретное приложение и заданный сетевой интерфейс. Один. Сконфигурированный для нужд только этого приложения.

Для решения этой задачи в Linux, уже довольно давно (аж с 2007 года) существует технология, называемая network namespaces, то есть пространства имён для сетей. Суть технологии: над сетевыми интерфейсами создаётся подобие «каталогов», в каждом каталоге может быть несколько сетевых интерфейсов и приложений. Приложение, оказавшееся в заданном сетевом пространстве имён, может использовать (и видит) только те сетевые интерфейсы, которые отнесены к этому пространству.

Картинка ниже поясняет происходящее:

Читать дальше →
Total votes 111: ↑105 and ↓6+99
Comments84

Настройка поддержки русского языка в GVim (windows)

Reading time4 min
Views26K


Привет, Хабр!

Хочу поделиться с сообществом опытом допиливания поддержки русского языка в GVim под Windows 7. GVim — очень мощный текстовый редактор, но в текущей Windows-реализации без тонких настроек он выглядит гадким утёнком по сравнению c GVim под Linux или MacVim.

Что будет в данной статье? Исправление локализации для Unicode в Windows-версии GVim, настройка переключения раскладки клавиатуры, включение проверки орфографии. Предполагается, что вы владеете азами работы в Vim. На хабре уже есть статья, затрагивающая тему поддержки русского языка, и хотя она всё ещё остаётся полезной, но на данный момент немного устарела.

В принципе русский язык в интерфейсе Windows версии GVim работает «из коробки», но есть небольшой нюанс: при выставленном Unicode редактор не отображает кириллицу в сообщениях и меню, поэтому либо приходится переключать GVim на английскую локализацию, либо мириться с этими «кракозябрами» в меню и «ять»-ями в приветствии программы. И это в наше время, когда подавляющие большинство программ и даже стандартный блокнот в Windows по умолчанию работает с Unicode текстом! Ситуация усугубляется ещё тем, что в сети просто нет руководств, как исправить эту проблему. Словно прекрасная девушка, танцующая красивый танец и громко пускающая газы при каждом новом па.

Исправим же это недоразумение!
Читать дальше →
Total votes 28: ↑26 and ↓2+24
Comments4
12 ...
17

Information

Rating
Does not participate
Location
Ульяновск, Ульяновская обл., Россия
Registered
Activity