May 2011 Blog Posts

Стихи

31 May 2011 |

Немного стихов, Александр Блок, почему бы не отвлечься.

Фабрика 

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

И глухо заперты ворота,
А на стене - а на стене
Недвижный кто-то, черный кто-то
Людей считает в тишине.

Я слышу всё с моей вершины:
Он медным голосом зовет
Согнуть измученные спины
Внизу собравшийся народ.

Они войдут и разбредутся,
Навалят на спины кули.
И в желтых окнах засмеются,
Что этих нищих провели.

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

И вот - в столовых и гостиных,
Над грудой рюмок, дам, старух,
Над скукой их обедов чинных -
Свет электрический потух.

К чему-то вносят, ставят свечи,
На лицах - желтые круги,
Шипят пергаментные речи,
С трудом шевелятся мозги.

Так - негодует всё, что сыто,
Тоскует сытость важных чрев:
Ведь опрокинуто корыто,
Встревожен их прогнивший хлев!

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

Пусть доживут свой век привычно -
Нам жаль их сытость разрушать.
Лишь чистым детям - неприлично
Их старой скуке подражать.

Brain And Life (another view)

29 May 2011 |

Любопытное, немного псевдо научное видео. Псевдо научное – потому что обоснованность предпосылок вызывает сомнения. Может мы что-то пропустили но “достаточно хорошей” модели мозга/разума/рассудка/интеллекта/и т.д. нет. Разговоров много, а модели/теории нет, наверное потому что уж очень хорошая почва для различных шарлатанов.

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

Лекция Дмитрия Шаменкова на XVII Всемирном Трансперсональном Конгресс from syz on Vimeo.

C# Constructors and .NET 4.0 Optional Parameters

21 May 2011 |

Недавно возникло обсуждение: допустимо ли использование необязательных аргументов в конструкторах класса. Действительно сначала возникает ощущение, что такое использование может затруднить понимание и изменение кода. Если не поддаваться чувствам, а рассмотреть аргументацию за и против, то выясниться что аргументы “против” сводятся к тому что это непривычно. Непривычно – плохой аргумент, сегодня это не привычно/ново завтра это повсеместная практика. Так что используйте на здоровье, косвенно это подтверждается примерами из MSDN.

RAM I(E)Business

16 May 2011 |

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

Первая вывеска у метро “Ремонт диагностика компьютеров” – зашел более менее прилично выглядящей ларек – ответ – сейчас нет можно завтра – но цена вот в 2 РАЗА больше чем в интернет магазине – какой-то бутик. Модель ясна – сидят “бизнесмены” и разводят народ на деньгу… На вопрос что так дорого – подорожание… потом ещё дороже будет.

Дальше по очереди сетевой магазин Эльдорадо – тут все просто – такого класса товаров не держим, мобильный телефон продать могут, а оперативная память и продавца не найти и не тот target group. Дальше магазин сети М-Видео – тоже самое.

Стало возникать любопытство – неужели в шаговой доступности таки не удастся приобрести оперативную память для ноутбука. Все оказалось не так грустно – магазине сети Polaris – было то что нужно и по цене лишь на несколько десятков рублей отличающийся от цен интернет магазина (без учета доставки). Все нормально, все хорошо, конкуренция заставляет offline рынок следовать за online.

PS Из-за профилактических работ в ближайшие 2-3 недели блог будет работать с перебоями. Но навряд ли это важно и кто-то заметит.

Generation П (фильм)

07 May 2011 |

О плохом говорят чаще чем о хорошем – психология человека такая. Как подтверждение отзыв Фильм: Обитаемый Остров. Но в этот раз наоборот – фильм “Generation П”, хорош, действительно хорош. Трудно оценить как он будет смотреться человеком не читавшим книгу, должно быть нормально. Это тот случай когда прочтение книги не заменяет фильм и наоборот. Но все таки чтобы получить максимум удовольствия, нужно прочесть книгу.

Резюме – все в кино… И на всякий случай – фильм не семейный – детей брать не нужно.

WPF ComboBox SelectionChanged Delay

06 May 2011 |

Распространённая задача: есть список (ListBox, TreeView, ComboBox…), при навигации (выделение элемента) должна выполнятся достаточно долгая операция (>0,3 сек). В этом случае использую для навигации клавиатуру пользователь будет испытывать дискомфорт из повисания/дерганья UI. Решить проблему поможет DispatcherTimer. Пример реализации для ComboBox (исходный код):

public class CustomComboBox : ComboBox
{
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += new EventHandler(timer_Tick);            
        this.SelectionChanged += comboBox_SelectionChanged;
    }

    public TimeSpan KeyboardNavigationDelay 
    {
        get { return timer.Interval; }
        set { timer.Interval = value; } 
    }

    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        selectedByKey = true;
        base.OnPreviewKeyDown(e);
    }
    protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
    {
        selectedByKey = false;
        base.OnPreviewMouseDown(e);
    }

    private DispatcherTimer timer;

    public event EventHandler SmartSelectedItemChanded;
    private void OnSmartSelectedItemChanded()
    {
        if (SmartSelectedItemChanded == null) return;
        SmartSelectedItemChanded(this, EventArgs.Empty);
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        timer.Stop();
        OnSmartSelectedItemChanded();
    }
    
    private bool selectedByKey;
    void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (SmartSelectedItemChanded == null) return;
        if (!this.ItemsSource.Cast<object>().Any(i => i == this.SelectedItem)) return;

        timer.Stop();
        if (selectedByKey)
            timer.Start();
        else
            OnSmartSelectedItemChanded();            
    }

}