Всякая мелочь одним постом

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

Побывал на Yii Day. Сумбурно, но очень здорово для первого раза. И душевно. Непременно поддержу продолжение традиции.

Недавно обнаружил шикарную формулировку: код в стиле барокко. Возьму на вооружение.

Задумал цикл статей на тематику «Интернет для самых маленьких»: от простейших и грубейших приближений вплоть до тонкостей и подробностей протоколов. Насколько терпения хватит.

Сформулировал для себя позицию в бурлении вокруг Google Glass и privacy: я считаю, что быть открытым — это хорошо и правильно. Ситуацию, когда человек что-то делает, а потом своих поступков стыдится и желает их скрыть, общепринята, но ненормальна с моей точки зрения. Google Glass — это индикатор того, что ситуация выправляется, и я могу только приветствовать как тенденцию, так и её проявления. Позицию обозначаю здесь, так как в само бурление втягиваться не намерен.

Анатолий Воробей попытался описать и сформулировать одну из особенностей мышления нормального программиста. Не могу не поделиться.

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

Рубрика: Личное | Метки: | 1 комментарий

Кое-что о неявной типизации

Отгремели холивары. Герои починяют копья и готовятся к будущим битвам. Ну, а я выскажусь.
На мой взгляд, Илья выступил в пользу повсеместного использования неявной типизации в C# очень мощно и сурово, но абсолютно неубедительно.
Во всяком случае, с моей точки зрения.
Посудите сами→

Рубрика: Разработка | Метки: , | Комментарии (5)

2012

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

Год получился богат на крупные события (во всяком случае, по сравнению с предыдущими).

Читать далее

Рубрика: Личное | Метки: | Комментарии (4)

Когда мне плохо, я работаю

И тогда Вечеровский произнес вторую тираду — на этот раз в прозе.
— Когда мне плохо, я работаю, — сказал он. — Когда у меня неприятности, когда у меня хандра, когда мне скучно жить, — я сажусь работать. Наверное, существуют другие рецепты, но я их не знаю. Или они мне не помогают. Хочешь моего совета — пожалуйста: садись работать. Слава богу, таким людям, как мы с тобой, для работы ничего не нужно кроме бумаги и карандаша…

Аркадий и Борис Стругацкие. За миллиард лет до конца света

Рубрика: Личное | Метки: | 1 комментарий

Коллекция граблей

Наткнувшись сегодня в статье Александра Галкина «Немного об интерфейсах в .Net (по мотивам одного интервью)» на тот факт, что массив в .NET, оказывается, реализует многие члены интерфейса IList выбрасыванием NotSupportedException, я крайне удивился. Удивился, потому что привык, что .NET страхует программиста, не давая ему наступать на грабли, но в данном случае грабли лежат в основе основ фреймворка, в наисистемнейшем классе System.Array.  В чём же грабли, если эта недореализация недоступна в публичной области видимости? В возможности неявного приведения без каких-нибудь предупреждений.

Объявляет, к примеру, какой-нибудь программист интерфейс:

interface I
{
    void Test(IList<int> collection);
}

Имеет, в общем-то, право.

Далее, какой-нибудь другой программист (ну, или тот же, неважно) реализует этот интерфейс:

class C : I
{
    public void Test(IList<int> collection)
    {
        collection.Clear();
        // разные другие манипуляции
    }
}

И тоже имеет на это полное право.

Но потом приходит третий программист (ну, или тот же самый, но спустя пару месяцев), и пытается использовать этот интерфейс:

    C c = new C();
    c.Test(new[] { 1, 2, 3 });

И… получает NotSupportedException без объявления войны.
Особенно грустно становится, если вспомнить о том, что некоторые разработчики питают нездоровое пристрастие к неявной типизации (впрочем, про неё лучше отдельно как-нибудь), что чревато подобными участками кода:

    var integers = SomeFarObject.GetSomeCollectionOfIntegers(); // int[] GetSomeCollectionOfIntegers()…
    c.Test(integers);

Ой. А стукнет по лбу уже в рантайме — эксепшен вылетит прямо в лицо тестировщику (хорошо, если не клиенту). Неприятно.
Кто-нибудь в курсе, зачем System.Array реализует IList, с какой целью?

Рубрика: Разработка | Метки: , | Комментарии (2)

Использование атрибутов безопасности для контроля доступа к коду

Довелось мне недавно перерабатывать модель безопасности на немаленьком проекте с трудной судьбой. Модель получилась удобная, изящная, практичная, в ней по уму реализованы и красиво вписаны в бизнес-логику всякие участники, удостоверения и роли, и единственное, чего не хватало до полного счастья — атрибутов для лаконичного контроля использования кода вида «этот метод запускается только если у текущего пользователя есть такая-то роль». У меня внезапно нашлось несколько часов времени на исследования в этой области, и при ближайшем рассмотрении не менее внезапно оказалось, что для моей ситуации в .NET уже всё есть, осталось только научиться этим пользоваться. И тут внезапно оказалось (снова!), что готовый и полный howto на эту тему нагуглить неожиданно сложно — по крайней мере, мне не удалось этого сделать. Целостную картину пришлось собирать по кусочкам, и вот что получилось…

Рубрика: Разработка | Метки: , | Комментарии (2)

Это так, чтобы не быть слишком уж серьёзным

Рубрика: Без рубрики | Метки: | Добавить комментарий

Такие разные одиночки

Данная запись является вольным переводом статьи Джона Скита «Implementing the Singleton Pattern in C#» (англ.), которая чрезвычайно понравилась мне как полнотой материала, так и манерой его подачи (с объяснением причин, особенностей и последствий).

Введение

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

Рубрика: Разработка | Метки: , , , | Добавить комментарий

Настройка IPv6 на CentOS 6

Уже довольно давно Хетцнер (англ.) раздаёт IPv6-подсети для каждого дедика, что весьма приятно. Ну, попробуем воспользоваться.
Для CentOS 5 всё отлично расписал в своё время Павел Одинцов, но для CentOS 6 есть один маленький нюанс.
Что ж, делаем как написано:
Добавляем NETWORKING_IPV6=yes в /etc/sysconfig/network (это включит системную поддержку IPv6)
Конфигурируем сетевку: добавляем /etc/sysconfig/network-scripts/ifcfg-eth0 IPV6INIT=yes и IPV6ADDR=2a01:4f8:162:54c3::2 (подобно Павлу возьму ::2 в качестве основного адреса)
Настраиваем маршрутизацию: создаём /etc/sysconfig/network-scripts/route6-eth0 и прописываем в него: fe80::1 dev eth0 и
default via fe80::1 dev eth0 (где fe80::1 — шлюз по умолчанию)
В этом и заключается нюанс: интерфейс следует указать явно, иначе работать не будет:
# ip -6 route add fe80::1 dev eth0
# ip -6 route add default via fe80::1
RTNETLINK answers: Invalid argument

Спасибо неизвестному сисадмину, который не поленился запостить решение проблемы в созданный им тред (англ.) после того, как сам разобрался с ней.

Рубрика: Администрирование | Метки: , , | Добавить комментарий

Используя using

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

using (MyClass myClass = new MyClass() { Prop = p })
{
    myClass.Use();
}

Выглядит вполне невинно — до тех пор, пока не начинаешь задумываться в том, как это устроено внутри→

Рубрика: Разработка | Метки: , | Добавить комментарий