суббота, 6 февраля 2010 г.

The Good Girl

The Good Girl poster Название: Хорошая девочка
Ориг. название: The Good Girl
Год: 2002
Страна: Германия, США, Нидерланды
Режисер: Мигель Артета
Сценарий: Майк Уайт
Жанр:
В ролях: Дженнифер Энистон, Дебора Раш, Майк Уайт, Джон Кэрролл Линч
Ссылки: Kinopoisk, Imdb

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

Такое случилось и с главной героиней этого фильма, Джастин. Ей надоела её работа, муж пьяница и наркоман, и то, что она видит что её жизнь это ад. Она перестает уважать и любить своего мужа, и легко умудряется влюбится в славного парня с работы, которому столь же тяжко жить. Её жизнь начинает потихоньку наполняться счастьем… чтобы рухнуть в пропасть.

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

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

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

суббота, 23 января 2010 г.

Как найти интересный блог?

Наверное, уже пару лет прошло с тех пор как я завел себе RSS-агрегатор. Сначала там была всего парочка лент, таких как: Bash.org.ru, Виви и Вагнер, Гарфилд. Сейчас количество лент перевалило за пол сотни, и количество развлекательных лент относительно небольшое.

Чтение RSS лент имеет две стороны. С одной стороны это довольно удобный способ читать разные интересные блоги и получать интересную информацию. Но это ведет к тому, что количество лент постоянно растет, и растет количество времени проводимого в чтении не всегда действительно важных/полезных статей. То есть, по сути, увеличивает бесполезно проводимое вами время.

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

Самый просто рецепт нахождения интересного блога – выбрать одного из колумнистов в интересующей тематике и дальше серфить по его записям и их комментариям. Зачастую в читателях интересных людей встречаются интересные люди. Второй хороший способ – blog-roll (список рекомендуемых автором блогов).

Приятными блогами последнего времени стали:

Сейчас играет [?]: RammsteinFuhre mich (с альбома Liebe ist fur alle da CD2)

четверг, 21 января 2010 г.

Директоры

Слово “директор” происходит от лат. director «проводник, руководитель», от гл. dirigereвыстраивать в прямую линию, направлять; бросать; определять”. Мне всегда казалось, что директором любого предприятия должен быть тот человек, который умеет управлять людьми. По сути это и есть одна из основ всех обязанностей директора. Неправильное управление фирмой может привести даже самое прибыльное дело к краху.

Не столь давно, ко мне обратились с предложением автоматизации некоторых аспектов работы ISP. Первоначально предложение исходило от ведущего инженера ISP и представляло собой систему интеграции существующих инструментов в единый, более удобный, интерфейс. А затем предполагалось начать написание системы, представляющей собой более качественный аналог существующих отдельных инструментов.

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

Весьма удивительным для меня стало знакомство с директором этого провайдера. Он вообще слабо представлял зачем могут понадобиться все те инструменты автоматизации, которые я описал выше. Ещё большее непонимание у него вызывал вопрос окупаемости. Факт того, что, к примеру, техник тех. поддержки на каждого клиента будет тратить не 10 минут, а 5 вызывал у него скептику. Мол, пока клиентов все равно мало… Более удобная координация бригад монтажников тоже осталась за рамками понимания. В общем и целом для него был не понятен тезис о том, что сердцем интернет провайдера является технический отдел.

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

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

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

Сейчас играет [?]: Gamma RayMr. Outlaw (с альбома Heading For Tomorrow)

четверг, 14 января 2010 г.

NHibernate – хранение Enum в БД

Тема маппинга перечислений в NHibernate для хранения в БД довольно заезженная тема. При попытке поискать вы найдете множество различных статей которые описывают как это сделать, предлагая те или иные пути. Занимаясь одним из своих проектов я столкнулся с необходимостью использования перечислений и прочитав несколько статей реализовал решение. Я не претендую на авторство или что-то подобное, это лишь применение тех знаний которые я почерпал из прочитанных статей.

Перечислением в моем маленьком проекте являлась роль пользователя, определяя является ли он администратором или простым пользователем:

public enum UserRoleEnum
{
    [Description("Администратор")]
    Administrator,
    [Description("Пользователь")]
    User
}

Дальше этот Enum оборачивается в специфический ValueType (в контексте предметной области):

public class UserRole : IEquatable<UserRole>
{
    public UserRoleEnum Role { get; private set; }
    public string Name { get { return Role.ToString(); } }
    public string Description { get { return Role.ToDescription(); } }

    private UserRole()
    {
        
    }

    public UserRole(UserRoleEnum role)
    {
        Role = role;
    }

    public static UserRole Administrator { get { return new UserRole(UserRoleEnum.Administrator); } }
    public static UserRole User { get { return new UserRole(UserRoleEnum.User); } }

    public override int GetHashCode()
    {
        return Role.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as UserRole);
    }

    public bool Equals(UserRole other)
    {
        if (other == null)
            return false;

        return Role.Equals(other.Role);
    }

    public static bool operator ==(UserRole left, UserRole right)
    {
        return Equals(left, right);
    }

    public static bool operator !=(UserRole left, UserRole right)
    {
        return !Equals(left, right);
    }
}

Для маппинга используется специальный класс UserRoleEnumStringType<T> который маппит указанный Enum:

public class UserRoleEnumStringType : EnumStringType<UserRoleEnum>
{
    public override object GetValue(object enm)
    {
        if (null == enm)
            return String.Empty;

        switch ((UserRoleEnum)enm)
        {
            case UserRoleEnum.Administrator: return UserRoleEnum.Administrator.ToString();
            case UserRoleEnum.User: return UserRoleEnum.User.ToString();
            default: throw new ArgumentException("Invalid UserRoleEnum.");
        }
    }

    public override object GetInstance(object code)
    {
        return Enum.Parse(typeof (UserRoleEnum), Convert.ToString(code));
    }
}

В XML файле меппинга, запись выглядит следющим образом (7-9 строки):

<class name="User" table="[User]">
    <id name="ID">
      <generator class="native" />
    </id>    
    <property name="Login" column="login" not-null="true" length="50" unique="true" />
    <property name="PasswordHash" column="passwordHash" not-null="true" length="100" />
    <component name="UserRole">
      <property name="Role" column="role" not-null="true" type="ReportsStock.Persistence.CustomTypes.UserRoleEnumStringType, ReportsStock.Persistence" />
    </component>
  </class>

В базе данных это выглядит как строка, значение которой совпадает с именем поля перечисления.

А код использования этого решения выглядит весьма и весьма просто:

var myUser = new User();
myUser.Login = "SaD";
myUser.UserRole = UserRole.Administrator;

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

P.S. Проблемы с прямым путем сохранения Enum в Int описаны в блоге Gray's Matter.

Сейчас играет [?]: EpicaThe divine conspiracy (с альбома The Divine Conspiracy)

Липецк транспорт

Я как-то упоминал о том, что проезд в общественном транспорте, с нового года, у нас будет автоматизирован. В конце декабря, во всех видах некоммерческого общественного транспорта, стояли терминалы для выдачи билетов. А так же были созданы пункты продажи транспортных карт.

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

В общем-то, вроде бы, кажется, что это наконец свобода от хамства кондукторов, ожидания сдачи и неудобства, когда кондуктор протискивается в переполненном транспорте. Однако сделать что либо до конца хорошо у нас не могут.

Внедрение этой системы началось задолго до запуска, я видел первые терминалы ещё в начале осени (а система, очевидно, началась разрабатывается как бы не за год, а то и больше). Наш город имеет население в более чем 500 тысяч человек, и где-то наверное тысяч 200 пользуются общественным транспортом (очевидно больше, но я думаю что это достаточная цифра). Следовательно в январе 2010 года у большей части этих людей должна быть уже транспортная карта. Должна была быть.

На январь 2010 года мы имеем лишь 8 пунктов продаж для 200 тысяч человек. Из них лишь 2 (sic) пункта продаж для студентов и пенсионеров (льготная категория населения, у них именные транспортные карты). Очереди в пункте продаж для пенсионеров поражают воображения молодежи и напоминают старое пенсионерам.

Да, о вводе новой системы предупреждали за несколько месяцев. Но я не понимаю одного – что мешало сделать возможность продажи карт, заранее пополненных на пару проездок, кондукторами? Это намного сильно снизило бы очереди в пунктах продажи и увеличило заинтересованность в покупке граждан. С одной стороны они получили больше прибыли (каждая поездка без карты – 10 рублей), но с другой негатив граждан.

По сути, карта используется до потери или порчи, поэтому основная цель – быстро продать много карт. Поэтому много пунктов продаж не требуется, в них никто не будет ходить спустя некоторое время. Несколько быстро разворачиваемых пунктов для людей пользующихся льготами и продажи карт кондукторами сделали бы распространение на порядок эффективнее. А так же стоило бы увеличить пункты пополнения карт – на данный момент я видел в одном автобусе и на одной остановке.

Несколько забавных фактов:

  • стоимость проекта, в рамках которого реализована система, около 105 миллионов рублей;
  • стоимость системы – 65 миллионов рублей;
  • стоимость карты на неограниченное число поездок и ограниченное время – 1200 рублей за 1 месяц (безумная цифра);
  • кондукторы работают на линии практически так же как и раньше. Только вместо обычных билетов – они выдают новые, пользуясь своей транспортной картой. Но теперь им приходит сначала собрать деньги, дойти до терминала, получить билеты, вернуться и раздать билеты гражданам.

P.S. Я пока предпочитаю тратить 10 рублей и ездить на более быстром и удобном коммерческом транспорте, чем стоять часами в очереди или же платить те же 10 рублей за некоммерческий транспорт.

Сейчас играет [?]: Gamma RayGamma Ray (с альбома Insanity & Genius )