Блог

.NET компонент созданяи отчетов

Сегодня обновил сайт Heapar Software. Причем обновлен не только дизайн небольшой косметикой, но и обновлен компонент для создания отчетов Heapar Small Report . Изменения небольшие, но удобные. Сам их использую в своих утилитах под маркой CyD, которые так же недавно серьезно обновил. Но об этих утилитах чуть позже, потому что версия еще не стабильна. Изменений много, и я наверно поторопился выкладывать ее.

Но вернемся к компоненту Small Report. В нем исправлен глюк с отображением, если для скроллинга использовать колесико. Добавлена возможность скролла с клавиатуры клавишами стрелок и Page Up Page Down, а так же возможность скролла на определенную строку. Это будет удобно для создания закладок в тексте. Опять же, на эту идею меня подтолкнул собственный проект. Я сам использую то, что создаю, иначе нафига создавать?

Глобальные переменные в C#

Сегодня задали интересный вопрос - как и где хранить глобальные переменные. Человек привык создавать в Delphi отдельный модуль, в котором хранил глобальные переменные и методы. Это большая проблема Delphi, что он умеет создавать глобальные переменные. По правилам OOP не должно быть такой возможности, и в C# такой возможности нет!

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

1. Действительно ли нужно, чтобы к переменной мог быть доступ откуда угодно? Если нет, то создайте свойство у какого-нибудь самого подходящего класса.

Управлени исходным кодом будущего

Сегодня читал статью Джоила Спольски о том, что программы контроля версий класса git - это будущее. Я тоже впервый раз не понял, что это за фигня, и почему нельзя было просто использовать SubVersion или что-то подобное, но уже через месяц я написал на твитере, что git - это сила.

Если ты работал с классическими программами контроля версий, то при переходе на git будут проблемы потому, что у него совершенно другой подход к хранению изменений. А точнее, он хранит именно изменения в файле, а не создает версии, как это делают классические системы. Чтобы к этому привыкнуть и понять, нужно время. Это как переход с Windows XP на Vista - это не эволюция, а революция. Нужно сделать усилие и заставить себя разок по бренчить код и мерджить его.

Столько лет мы жили вневедении, как слепые кроты, и думали, что нужно хранить именно версии. Но это серьезное заблуждение, которое делает разработку и управление исходным кодом только дороже. Попробую объяснить силу git на примере. Допустим, что у вас есть основная ветка кода, которую вы компилируете в исполняемый файл версии 1.0. На определенном этапе вы создали новую ветку для работы над новой версией программй 2.0. Теперь нужно пофиксить один баг, который есть в обеих ветках. Вы создаете новую подветку для 2.0 и называем ее "branch2-0/fix1". Фиксим код в этой ветке и в ней будут храниться только изменения fix1, а не весь код. Теперь вы можете смёрджить (даже не знаю, какое тут лучше слово придумать английскому merge, может слить или объединить) фикс с веткой исходников версии 2.0 и веткой исходников версии 1.0, и одним разом зафиксить обе ветки.

Новая информация на Hackish Code

Вчера я залил свежак на английскую версию сайта Hackish code, а сегодня сразу три статьи на русской версии:

Статьи хоть и старые, но кому-то могут показаться интересными. В DirectX 11 все очень сильно изменилось, поэтому в современной версии инициализация идет по другому, но некоторые вещи еще актуальны.

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

P.S. Недавно приобрел Final Fantasy 13. Очень даже интересная игра. Хотя игрой я ее называю с натяжкой, потому что больше похоже на отличное интерактивное кино. Более подробно об игре читай: Обзор Final Fantasy 13.

Количество мониторов для программиста

У нас на работе почему-то используют мониторы 19-го размера максимум, а большинство мониторов 17 дюймов. Не знаю почему так, но этого пространства капитально не хватает. На предыдущей работе использовались ноутбуки от Apple, но у каждого на столе стояли еще мониторы, размером с телевизор. Я как-то не смотрел, сколько там люймов, но 22 точно будет. Рабочего пространства становится немеренно, если объеденить экран ноутбука с экраном монитора.

После такой поляны, как-то неуютно себя чувствовал с одним монитором в 17-ть люймов. Задолбался переключаться между окнами и попросил второй монитор. Мне принесли моник чуть больше в 19 дюймов, но за счет того, что он старее, разрешение экрана такое же, как у семнашки. Да, теперь у меня два раза по 1280 точек, но все равно я задалбливаюсь переключаться между окнами. У меня постоянно запущено как минимум 12 окон, из которых я постоянно работаю с большинством из них, и хочется, чтобы эти окна были на виду, но тут даже и четырех мониторов не хватит.

Оптимизация SQL запросов - курсоры

Как же я ненавижу курсоры в SQL запросах. Меня просто колбасит, и конвульсит когда я вижу запросы, в которых для банального обновления данных используются курсоры. курсоры тормозят выполнения запросы и базы данных очень сильно ограничены в попытках оптимизировать их выполнения, поэтому к данному способу работы с данными нужно прибегать в самую последнюю очередь.

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

Блокировки чтения SQL запросом with nolock

Продолжаем тему SQL. Однажды с одним программистом зашел разговор о блокировках, и я вскользь сказал, что есть такие блокировки на чтение данных. Он не поверил, а я доказать наличие блокировок не смог. Почему я вспомнил? Да просто в последнее время что-то у нас на сайте участились блокировки. За последние два дня пришлось решать 5 подобных проблем и в одном случае снова пришлось объяснять человеку, который проверяет качество кода, когда можно использовать антиблок, а когда нельзя.

Итак, любители Oracle просто закрывают эту заметку и высоко задрав нос спокойно пинают Microsoft обеими ногами. Их такая проблема не волнует. Почему? Даже по умолчанию Oracle работает так, что никакие блокировки не блокируют данные от чтения. Это значит, что вы можете держать открытыми транзакции столько, сколько душе угодно. Допустим, что вы запустили большую транзакцию, в которой обновили данные в таблице:

begin transaction
update tablename
set column1 = column1 * 10

Написать простейшую игру

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

Когда дело доходит до реальных дел, то вот тут уже свое понимание я использую для того, чтобы писать реальный код и выполнять поставленные задачи. И даже в этот момент я не пытаюсь запоминать что-то. Когда выполняешь много раз одни и те же задачи в разных контекстах, все самое необходимое запомнится само. Я никогда не пытался запомнить функции, но когда меня поставили в жесткие условия и посадили не просто за компьютер без интернета, а даже за язык программирования который я не знал и заставили писать тесты в блокноте (читай мою заметку собеседование в канадскую компанию), я сдал тест успешно и уже пол года работаю в этой компании и продолжаю писать в Notepad++ без помощи подсказок среды разработки, без мега отладчиков и даже без файлов помощи.

Явные транзакции при обновлении данных

Что-то я часто стал писать про SQL. Наверно потому, что очень много интересных вещей с ним замечаю. Недавно наткнулся на модуль на работе, где любая операция округлялась в явную транзакцию. Не понял, нафига это нужно, когда любая модификация данных итак автоматически запихивается в неявную транзакцию. От явности в банальных операциях UPDATE кажется толку нету. Даже если ты не написал begin transaction, операция все равно в случая ошибки откатывается полностью, а не с того места, где запрос закончил обновление.

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

.NET на платформе Linux

На мой взгляд, одна из самых мощнейших технологий, .NET - это WPF. Это реальная весчь, которая должна была появиться раньше. Именно так должны строиться современные интерфейсы приложений. Реализация так же на высоком уровне и за эту технологию я готов пожать разработчикам и дружескую руку. Если WPF не плучит распространения и умрет вместе с Windows, то будет другая технология на этой же основе для других платформ. Интересно, а для Linux и андроида уже такое есть? Mono пока не поддерживает эту технологию, а о других я не слышал.

Если это мощная платформа, то какое же будущее ждет .NET и WPF в частности на других платформах. Да практически никакое. Вероятность того, что кто-то будет развивать их без Microsoft на данный момент стремится к нулю. Без WPF вся платформа .NET превращается всего лишь в очередную технологию, которая не на много лучше Java. Лично я не вижу смысла в ее поддержки на Linux или на MacOS. Без Microsoft или любого другого богатого и влиятельного покровителя все это дело загнеться и будет гнить, как сейчас это происходит с Java.

О блоге

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

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне