Search
Write a publication
Pull to refresh
3
0
Send message

C#: Внутреннее строение инициализаторов массивов

Reading time6 min
Views30K
Наверняка почти каждому, кто имел дело с C#, известна подобная конструкция:

int[] ints = new int[3] { 1,2,3 };//А если уж вдруг и не была известна, то отныне и впредь уж точно

Вполне логично было-бы ожидать превращение этой конструкции в нечто подобное:

int[] ints = new int[3]; 
ints[0] = 1; 
ints[1] = 2; 
ints[2] = 3;

Увы и ах, на деле орех гораздо более морщинист, чем кажется с первого взгляда, и имеются некоторые тонкости, на которые будет указано позже. А до тех пор, наденем ношеную «IL freak» майку (у кого имеется) и погрузимся в недра реализации.
Погрузись, и ты узнаешь насколько глубока кроличья нора

Почему OpenVPN тормозит?

Reading time3 min
Views187K
Описанная проблема присуща только ветке OpenVPN 2.3, в 2.4 размеры буферов не меняются без требования пользователя.

Время от времени, мне встречаются темы на форумах, в которых люди соединяют несколько офисов с использованием OpenVPN и получают низкую скорость, сильно ниже скорости канала. У кого-то это может быть 20 Мбит/с при канале в 100 Мбит/с с обеих сторон, а кто-то еле получает и 400 Кбит/с на 2 Мбит/с ADSL/3G и высоким пингом. Зачастую, таким людям советуют увеличить MTU на VPN-интерфейсе до чрезвычайно больших значений, вроде 48000, или же поиграться с параметром mssfix. Частично это помогает, но скорость внутри VPN все еще очень далека от канальной. Иногда все сваливают на то, что OpenVPN — userspace-решение, и это его нормальная скорость, учитывая всякие шифрования и HMAC'и. Абсурд!

Немного истории

На дворе июль 2004 года. Типичная скорость домашнего интернета в развитых странах составляет 256 Кбит/с-1 Мбит/с, в менее развитых — 56 Кбит/с. Ядро Linux 2.6.7 вышло не так давно, а 2.6.8, в котором TCP Window Scale включен по умолчанию, выйдет только через месяц. Проект OpenVPN развивается уже 3 года как, к релизу готовится версия 2.0.
Один из разработчиков добавляет код, который устанавливает буфер приема и отправки сокета по умолчанию в 64 КБ, вероятно, чтобы хоть как-то унифицировать размер буфера между платформами и не зависеть от системных настроек.
Читать дальше →

Assembler в 30 строк на Excel

Reading time2 min
Views78K
В заголовке порядок слов не перепутан.



Живет в Венгрии юный программист Адам Кишш. Он участвует в чем-то типа онлайн-олимпиады KöMaL. Для решения заданий по информатике предлагается использовать несколько обычных языков программирования: С, С++, Python и некоторые другие. В одном из заданий требовалось написать Сапер и бота для игры в него. Такая задача очень легко решается средствами табличного процессора — того же Excel, например, и пачки макросов. Однако же, макросы использовать нельзя. Адам выкрутился необычным способом: реализовал в книге Excel простенький виртуальный компьютер, который программируется на Ассемблере — Excembler.
Читать дальше →

Грязные трюки с макросами C++

Reading time10 min
Views149K
В этой статье я хочу сделать две вещи: рассказать, почему макросы — зло и как с этим бороться, а так же продемонстрировать пару используемых мной макросов C++, которые упрощают работу с кодом и улучшают его читаемость. Трюки, на самом деле, не такие уж и грязные:
  • Безопасный вызов метода
  • Неиспользуемые переменные
  • Превращение в строку
  • Запятая в аргументе макроса
  • Бесконечный цикл

Заранее предупреждаю: если Вы думаете увидеть под катом что-то крутое, головоломное и сногсшибательное, то ничего такого в статье нет. Статья про светлую сторону макросов.
Читать дальше →

Сравнение версий Windows Server

Reading time40 min
Views162K
Тема завершения поддержки Windows Server 2003 на Хабре поднималась уже несколько раз. В продолжении серии статей, посвященных окончанию поддержки и предложений по переходу на более новые версии Windows Server (а именно, на Windows Server 2012 R2). В этой статье я проведу сравнение различных версий Windows Server (2003 R2, 2008 R2, 2012 R2), а вы уже сможете посмотреть и решить, что выбрать для своей компании. Всех заинтересовавшихся жду под катом, но предупреждаю: вся сравнительная информация содержится в больших и длинных таблицах, которые вы сможете увидеть, нажав на спойлеры.

Читать дальше →

С чего началось использование [x] в дизайне графических интерфейсов

Reading time6 min
Views53K
Немалую роль в дружественном взаимодействии пользователя и сайта играют привычные элементы управления. Например, крестик для закрытия окна. Последние несколько дней в интернете широко обсуждалась одна статья об истоках возникновения этого элемента пользовательского интерфейса и она даже привлекла внимание одного из первых разработчиков Windows 95, но об этом ниже.

В пользовательских интерфейсах мы видим X повсеместно. Этот могущественный символ способен закрывать рабочие и всплывающие окна, панели инструментов и вкладки, а также убрать вообще все, что только может создать вам помехи на экране.

Использование нажатия на [x] для того, чтобы закрыть тот или иной элемент превратилось в один из основных инстинктов, связанных с использованием компьютера и стало стандартом в дизайне веб-сайтов и компьютерных приложений. Может показаться, что вездесущий [x] всегда был частью интерфейсов, однако этот короткий и увлекательный экскурс в историю пользовательских графических интерфейсов показывает, что на самом деле дела обстоят иначе.

Итак, где и когда [х] впервые попал в лексикон интерфейсов?
Читать дальше →

Каверзные кватернионы

Reading time3 min
Views187K


Отгадайте загадку: в четырёх измерениях сидит и комплексными числами воротит?

Подсказка: это вектор со скаляром. И вещественная матрица. И придумал его Гамильтон.

Не помогло? Ну что вы, это же элементарно! Это кватернион! Кватернионы используют для записи вращений в робототехнике, игровых движках, ПО для моделирования и вообще везде, где не нужны проблемы с углами Эйлера или матрицами. Если вас испугала путаница выше с разными представлениями кватерниона, то можете быть спокойны. Кватернионы очень просты в использовании и их внутреннее строение может понадобиться только в очень редких случаях, где нужна тонкая оптимизация. В остальное время с помощью кватернионов можно крутить всё что угодно и как угодно, и оно будет плавно и красиво интерполироваться без шарнирных замков.
Что же такое кватернион?

PyOpenGL для начинающих и немного новогоднего настроения

Reading time8 min
Views128K
image

Благодаря своей гибкости и простоте, язык Python позволяет легко и быстро писать целый ряд приложений и утилит. Мною данный язык, в основном, используется для написания небольших скриптов, облегчающих выполнение различных задач, связанных с системным администрированием. Как оказалось, Python можно использовать и для не совсем «традиционных» задач, например, для вывода 3D графики. Об этом и будет мой небольшой предновогодний пост.
Читать дальше →

Именованные параметры в современном C++

Reading time14 min
Views30K
Из Википедии: "Именованные параметры в языках программирования означают поддержку указания явных имен параметров в вызове функции. Вызов функции, принимающей именованные параметры, отличается от обычного вызова функции, в котором передаваемые аргументы ассоциируются с параметрами функции лишь только по их порядку в вызове функции"

Давайте посмотрим на пример:

createArray(10, 20); // Что это значит? Что за "10" ? Что за "20" ?
createArray(length=10, capacity=20); // О, вот теперь понятнее!
createArray(capacity=20, length=10); // И наоборот тоже работает.


И еще один пример на выдуманном псевдо-языке:
window = new Window {
   xPosition = 10,
   yPosition = 20,
   width = 100,
   height = 50
};


Этот подход особенно полезен для функций с большим количеством опциональных параметров, при вызове которых нужно изменить лишь некоторую часть дефолтных значений. Некоторые языки программирования поддерживают именованные параметры (C#, Objective-C, ...), но не С++. В этом посте мы рассмотрим пару классических способов эмуляции именованных параметров в С++, ну и попробуем придумать что-то новое.
Читать дальше →

Подборка космических твиттеров от Зеленого Кота

Reading time9 min
Views13K


Недавно у нас в гостях побывал хабраавтор Zelenyikot, ограниченному кругу лиц известный как Виталий Егоров. Он сделал себе имя в качестве популяризатора космической тематики не только на Хабре и Гиктаймсе, но и в соцсетях. Да что уж там, пожалуй, Зелёный Кот сейчас один из самых активных космоблогеров в рунете. У Виталия очень большой список twitter-блогов, откуда он черпает всевозможную информацию о космосе. Из них он выбрал самые, на его взгляд, интересные и дал свои комментарии. Так что все желающие углубиться в космическую тематику могут взять на вооружение подборку ссылок от Зелёного Кота.
Читать дальше →

О переводе времени 2 / Не забываем пропатчить XP и 2003, иначе будет сюрприз в ночь с 6 на 7 января

Reading time4 min
Views39K
Извините за подъем несколько некрофильской темы, когда все обсуждают Windows 10. Если вы по каким-то причинам ещё используете системы десятилетней давности и до сих пор не обновили Windows 2003/XP, возможно, это пост позволит вам сэкономить время и нервы в новогодние каникулы.

Итак, вышло декабрьское обновление таймзон kb3013410. Если его (или эквивалентные изменения реестра) не установить на 2003/XP с установленным kb2998527, они и дальше продолжат переводить время. Причина — неполная поддержка Dynamic DST, значения в реестре есть, но для действий по переводу времени времени они не используются. Грубо говоря, переводить стрелки в каждый год по-разному научилась только Vista и выше (ядро 6.0). Конкретно в 2015 году, если ничего не предпринимать, 2003/XP с установленным kb2998527 переведут стрелки на летнее время (+1 час) в ночь с 6 на 7 января, и на зимнее (-1 час) 25 октября.

Чтобы этого не произошло, есть простой способ — заранее снять галку перевода времени (она опять появилась после установки kb2998527), и правильный способ — установить kb3013410 (или эквивалентные ему изменения реестра). На домашнем компьютере никаких дополнительных действий не надо, сервера я бы советовал перезапустить, т.к., как выяснилось 26 октября, некоторые приложения, а так-же службы (например, IIS в Exchange) не понимают изменения таймзон до рестарта службы.
Читать дальше →

Решение задачи коммивояжера с помощью метода ветвей и границ

Reading time3 min
Views99K
Здравствуй, Хабр! Реализовывая различные алгоритмы для нахождения гамильтонова цикла с наименьшей стоимостью, я наткнулся на публикацию, предлагающую свой вариант. Попробовав в деле, я получил неправильный ответ:



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

Под катом вас будет ждать исправленный алгоритм и онлайн-калькулятор.
Читать дальше →

Немного о том, как не надо защищать учетные записи в Active Directory

Reading time4 min
Views42K
Написать этот текст меня побудило периодическое появление на Хабре статей администраторов Windows, авторы которых, на мой взгляд, не очень хорошо понимают, что делают. Последний из таких постов — о защите служебных учетных записей.

Прежде всего хочется сказать следующее — уважаемые коллеги, защита учетных записей — хотя и типовая, но ни в коем случае НЕ простая задача, особенно для среднего системного администратора, не являющегося специалистом по информационной безопасности. Если вам повезло и вы попали в организацию, где все регламенты и процессы разработаны до вас — вам, конечно, будет довольно просто воспользоваться плодами чужого труда. Но если всё, что у вас есть на руках — свежеподнятый (или, что ещё хуже, поднятый не пойми кем и как) домен AD и гугл, не стоит подходить к задаче в стиле «прочитаю Best practices, сделаю как там пишут, и всё будет пучком».
Читать дальше →

Квантовая онлайн-песочница от Google

Reading time4 min
Views60K

(возможно вы уже видели эту картинку, хотя странно, что на хабре так мало материалов по квантовой информатике)

Спасибо гениальным инженерам Google, теперь мы все дружно можем превратить наши настольные ПК в квантовые компьютеры. Ну, хорошо, не совсем так: подразумевается лишь моделирование работы квантового компьютера на его младшем собрате путем запуска веб-приложения для Chrome. Quantum Computing Playground позволяет прогонять известные квантовые алгоритмы (такие как алгоритм Гровера, Шора) и писать собственных квантовые программы.

За исключением непосредственного приобретения квантового компьютера — что, несмотря на заявления D-Wave, вряд ли когда-нибудь удастся — решение от Google является наиболее удачным шагом в сторону популяризации квантового зверя. Если хочется лично встать на первую ступеньку вычислений будущего, это тот самый шанс. У вас есть дети? Вы обязаны посадить их в эту песочницу как минимум на шесть часов, чтобы они научились всем тонкостям квантовых вычислений.
Читать дальше →

Встраивание в ядро Linux: перехват системных вызовов

Reading time17 min
Views27K
Под термином «системный вызов» в программировании и вычислительной технике понимается обращение прикладной программы к ядру операционной системы (ОС) для выполнения какой-либо операции. Ввиду того что такое взаимодействие является основным, перехват системных вызовов представляется важнейшим этапом встраивания, т.к. позволяет осуществлять контроль ключевого компонента ядра ОС — интерфейса системных вызовов, что, в свою очередь, даёт возможность инспектировать запросы прикладного ПО к сервисам ядра.

Данная статья является продолжением анонсированного ранее цикла, посвящённого частным вопросам реализации наложенных средств защиты, и, в частности, встраиванию в программные системы.

Читать дальше →

Ёжик во фрактальном тумане

Reading time5 min
Views48K
Эта статья — последняя из серии моих хабрастатей о фракталах. В хабрастатье «Рисуем картинки с помощью кривой Гильберта» рассказывалось о котёнке по имени Гав, в хабрастатье «Кош на комплексной плоскости» — о перетекании фракталами в горизонт, в хабрастатье «Ночь фракталов» — об алгоритме времени убегания. В этой статье пойдёт речь о ёжике в тумане и, конечно же, о коте.



Читать дальше →

Рисуем картинки с помощью кривой Гильберта

Reading time5 min
Views46K
В субботу на прошлой неделе «дело было вечером, делать было нечего», и мы с хабраюзером sourcerer разговаривали не понятно о чём. И почему-то речь зашла речь о задаче обратной к задаче построения графика функции по её выражению. То есть, например, у нас есть выражение y(x) = (cos0,5x ⋅ cos 200x + |x|0,5 − 0,7)(4 − x2)0,01. График такой функции чем-то напоминает сердечко. Но нам был интересен обратный вопрос, как, имея, например, изображение сердечка, получить выражение для функции, графиком которой будет это самое сердечко.

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



Если интересно как такое сделать, а также узнать про формулу конопли, формулу, график которой является этой же формулой, то добро пожаловать под хабракат. (Будет много картинок.)

Читать дальше →

Кош на комплексной плоскости

Reading time6 min
Views66K
В какой-то из весенних дней этого года я ехал в троллейбусе и листал комикс о Коше. В одном из выпусков была такая фраза «НО! Её можно понять, она же фракталами в горизонт перетекает, я бы тоже замешкался...». После этого я посмотрел в окно и понял, что если мы возьмём два подходящих дробно-линейных преобразования комплексной плоскости a(z) и b(z), и рассмотрим систему итерированных функций для a(z), b(z), a−1(z), b−1(z), взяв в качестве начального множества картинку с Кошем, то Кош будет перетекать фракталами в горизонт!

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

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



Читать дальше →

С# для AS3 разработчиков. Часть 2: Расширение классов и реализация Интерфейсов

Reading time4 min
Views7.6K
image

Перевод статьи From AS3 to C#, Part 2: Extending Classes and Implementing Interfaces

Эта статья продолжает серию "C# для AS3 разработчиков", и сегодня мы рассмотрим устройство классов в C# с точки зрения AS3 разработчика (наследование классов, реализация интерфейсов и наследование интерфейсов).
Читать дальше →

Несколько интересных особенностей MySQL

Reading time8 min
Views63K
В не очень далеком прошлом мне пришлось покопаться немного в исходном коде MySQL, и разобраться в некоторых аспектах его работы. В ходе работы лопаткой, и эксперимeнтов, я наткнулся на несколько очень интересных особенностей, часть из которых просто забавна, а в случае некоторых бывает очень интересно понять, чем руководствовался программист, который принимал решение сделать именно так.

Начнем с такого интересного типа, как ENUM.

mysql> CREATE TABLE enums(a ENUM('c', 'a', 'b'), b INT, KEY(a));
Query OK, 0 rows affected (0.36 sec)

mysql> INSERT INTO enums VALUES('a', 1), ('b', 1), ('c', 1);
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0


Итак, у нас есть таблица, в ней есть два столбца. У первого, a, тип ENUM, у второго, b, INT. В таблице три строки, у всех трех значение b равно 1. Интересно, чему равны минимальный и максимальный элементы в столбце a?

mysql> SELECT MIN(a), MAX(a) FROM enums;
+--------+--------+
| MIN(a) | MAX(a) |
+--------+--------+
| c      | b      |
+--------+--------+
1 row in set (0.00 sec)


Кажется странным, было бы разумно, если бы самым маленьким был 'a', а самым большим — 'c'.
А что если выбрать минимум и максимум только среди тех строк, где b = 1? То есть, среди всех строк?

mysql> SELECT MIN(a), MAX(a) FROM enums WHERE b = 1;
+--------+--------+
| MIN(a) | MAX(a) |
+--------+--------+
| a      | c      |
+--------+--------+
1 row in set (0.00 sec)


Вот так мы заставили MySQL поменять свое мнение о том, как сравнивать поля в ENUM, просто добавив предикат.
Разгадка такого поведения заключается в том, что в первом случае MySQL использует индекс, а во втором нет. Это, конечно, не объясняет, почему MySQL сравнивает ENUMы по разному для сортировки в индексе, и при обычном сравнении.

Второй пример проще и лаконичнее:

mysql> (SELECT * FROM moo LIMIT 1) LIMIT 2;
+------+
| a    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)


Когда я показал этот запрос своему коллеге, который занимается разработкой парсера SQL, его вопрос был не «почему этот запрос возвращает две строки», а «как надо написать SQL парсер так, чтобы такой запрос был валидным, без того, чтобы написать правило, специально разрешающее такой запрос».

Интересно, что далеко не любой SELECT в скобках сработает, в частности, UNION в скобках — это синтаксическая ошибка:

mysql> (SELECT * FROM moo UNION ALL SELECT * FROM hru) LIMIT 2;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION ALL SELECT * FROM hru) LIMIT 2' at line 1


Еще несколько интересных примеров под катом
Читать дальше →

Information

Rating
4,241-st
Location
Кызыл, Тува (Тувинская Респ.), Россия
Registered
Activity

Specialization

Software Developer, Application Developer
Senior
From 150,000 ₽
Python
C++
Linux
Docker