12 июня 2013 г.

Немного о дизайне iOS 7

Смотрел трансляцию WWDC 2013, и нахожусь сейчас в недоумении. На видео iOS 7 смотрится еще ничего, но при близком рассмотрении это какой-то тихий ужас... Как будто кто-то в спешке набросал эскизы UI в векторном редакторе, а потом случайно инвертировал все цвета. Навскидку несколько скриншотов:

Home Screen Входящий звонок
Control Center  Секундомер и Круг

Иконки уже обругали по-моему все, кому не лень, особенно жуткие у Safari, Settings и Game Center. На экране входящего звонка красный текст на белых кнопках вообще нечитаемый. Control Center вещь полезная (вызывается свайпом снизу-вверх, как панель Charms в Windows 8), но кто эти иконки рисовал? Бритва, пицца, домофон?

10 января 2013 г.

Какую версию Windows 8 выбрать?

Купил себе недавно лицензионную Windows 8, перерыв при этом гору материалов в сети, касающихся отличий разных редакций системы, лицензий и расшифровки всяких там VUP, SL и OEM. В этом посте я решил собрать всю самую важную инфу, которую получил, в том числе опытным путем. Надеюсь, кому-то она пригодится!

30 декабря 2012 г.

WPF кнопки в Windows 8

Стандартный WPF контрол Button на Windows 8 выглядит ужасно. Куда смотрели дизайнеры и тестировщики? О чем это я... Думаю всем известно, что в Windows Presentation Foundation, в простонародье «Дабью-Пи-Эф», изучением которого я занимаюсь в последнее время с помощью замечательной книги Адама Натана (да уж, немного опоздал), старый ламповый GDI, за некоторыми редкими исключениями, не используется вообще. Стало быть, внешний вид (по умолчанию) всех стандартных элементов управления — это «пародия» на родные для системы кнопки, флажки, списки и меню. По характерным внешним признакам любой .NET программист невооруженным глазом отличит родное для системы приложение от WPF. Для примера, я набросал стандартных элементов на формочки в WinForms (GDI) и WPF, и заскриншотил:

WinForms WPF

Так (справа) выглядит стандартная тема WPF на Windows 7. Неплохо, но могло быть лучше. Что здесь не так? Если вы ср**ый эстет как и я, то заметите неуместный градиент в системном меню, размытые полоски на скролл-баре, намного более светлый цвет прогресс-бара, неправильные тени при нажатии на кнопки и выпадающие списки, нестандартный цвет выделения текста. Но это, в принципе, мелочи. Пережить можно. У WinForms (слева) тоже не все так гладко как хотелось бы, отчасти из-за жуткого шрифта Microsoft Sans Serif, который достался в наследие системе чуть ли не от Windows 3.x. Согласно гайдлайнам Microsoft, в Windows 7 шрифт по-умолчанию должен быть Segoe UI, но в WinForms жуткий MS Sans Serif захардкоджен (эта проблема и пути ее решения подробно расписаны здесь и здесь).
Справедливости ради, у JavaFX, Swing и FireMonkey (клон WPF от разработчиков Delphi) дела с имитацией родных тем Windows обстоят еще хуже, чем у WPF. Но WPF делает сама Microsoft, так что с нее спрос будет повыше.

Чуть выше я упомянул про неправильные тени на кнопках в WPF. Давайте сравним кнопки WinForms и WPF на Windows 7 чуть поближе:

23 января 2010 г.

MVC в примере на С++ (консольное приложение)

Знаменитый шаблон проектирования MVC за свои 30 с лишним лет истории стал настоящим эталоном, «классикой жанра». При поиске в сети обнаруживается масса примеров реализаций MVC на PHP, C# и Java. Обычно это большие программы с листингами на 2-3 экрана, массивными UML диаграммами, в которых и так новичку трудно разобраться, не говоря уже о каких-то там шаблонах. Я предлагаю свой, максимально упрощенный вариант реализации MVC на примере консольного приложения на С++.

Задачка про выстрел в ногу

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

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

Задача: прострелить себе ногу.

  • C: Вы простреливаете себе ногу.
  • C++: Вы случайно создаете дюжину экземпляров объекта «вы» и всем им простреливаете ногу. Срочная медицинская помощь оказывается невозможной, так как вы не можете разобраться, где настоящие объекты, а где — те, которые только указывают на них и говорят: «А вот — я!».
  • Java: После импорта java.awt.right.foot.* и java.awt.gun.right.hand.*, записи классов и методов, необходимых для этих классов, вы забываете, что вы, чёрт возьми, делаете.
  • С#: Вы подсмотрели как Java выстрелила себе вногу, и теперь объясняете, как бы вы сделали это лучше.
  • JavaScript: Вы прочитали 3 книги, изучили 10 нагядных примеров, разработали потрясающий интерфейс и теперь, кажется, готовы к тому, чтобы выстрелить себе в ногу. Но потом вы понимаете, что в вашем пистолете отключены пули.
  • Ruby: Ваша нога готова к выстрелу через приблизительно пять минут, но вы не знаете, куда выстрелить.
  • PHP: Вы стреляете себе в ногу из пистолета, сделанного из 500 частей других пистолетов.
  • ASP.NET: Вы нашли пистолет, он разваливается. Вы чините его, он опять разваливается. Вы пробуете использовать GUN.Framework, он разваливается. Вместо этого вы режете себе ногу.
  • Perl: Вы стреляете себе в ногу и никто не может понять, как вы сделали это. Через шесть месяцев не можете и вы.
  • CSS: Вы стреляете с одной руки в правую ногу, потом меняете руку, чтобы выстрелить в другую ногу и обнаруживаете, что пистолет превратился в банан.
  • Fortran: Итеративно вы простреливаете каждый палец ноги, а когда пальцы заканчиваются, загружаете следующую ногу и продолжаете. Когда пули заканчиваются, вы все равно продолжаете попытки прострелить себе ноги, потому что не имеете возможности обработать такую особую ситуацию.
  • Pascal: Компилятор не позволит вам прострелить себе ногу.
  • Ada: После тщательного описания пакета «нога», вы пытаетесь одновременно зарядить пистолет, нажать курок, завопить и выстрелить себе в ногу. В ходе попыток обнаруживается, что вас постигла неудача, так как ваша нога оказалась неверного типа.
  • Cobol: Hаводите ПИСТОЛЕТ COLT 45 на HОГА.СТОПА, Затем помещаете РУКА.КИСТЬ.ПАЛЕЦ на ПИСТОЛЕТ.КРЮЧОК и HАЖИМАЕТЕ. Затем возвращаете ПИСТОЛЕТ в КОБУРУ. ПРОВЕРЬТЕ, нуждаются ли шнурки в повторном связывании.
  • LISP: Вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который…
  • Пролог: Вы сообщаете вашей программе, что вы хотите иметь простреленную ногу. Программа разрабатывает способ этого достичь, но синтаксис языка не позволяет объяснить этот способ вам.
  • Basic: Вы простреливаете себе ногу из водяного пистолета. В расширенных реализациях языка продолжайте, пока вся нижняя часть тела не промокнет.
  • Visual Basic: Hа самом деле вы только сделаете вид, что прострелили себе ногу. Потому что в процессе реализации вы получите столько удовольствия, что подобные мелочи вас не озаботят.
  • HyperTalk: Поместите первую пулю пистолета в ступню левой ноги вас. Сообщите результат.
  • Motif: Вы затрачиваете несколько дней на построение UIL-описания вашей ноги, пули, ее траектории и замысловатой резьбы по слоновой кости на рукоятке пистолета. Когда вы наконец-то управились и готовы нажать на курок, пистолет закупоривается.
  • APL: Вы простреливаете себе ногу, затем тратите весь день на то, чтобы представить себе, как это сделать с меньшим количеством символов.
  • Snobol: Если вам удастся, прострелите себе левую ногу. Если не удастся, то прострелите себе правую ногу.
  • Unix:
    % ls
    Foot.c foot.h foot.o toe.c toe.o
    % rm * .o
    rm: .o no such file or directory
    % ls
    %
  • SQL:
    SELECT @ammo:=bullet FROM gun WHERE trigger = ‘PULLED’;
    INSERT INTO leg (foot) VALUES (@ammo);
  • IBM/370: Вы посылаете свою ногу в управляющую информационную систему с приложением документа на 400 страниц, точно описывающего, как именно вы хотите быть простреленным. Через три года ваша нога возвращается с глубоким ожогом.
  • Paradox: не только вы можете прострелить себе ногу, но и ваши пользователи.
  • Access: Вы пытаетесь прицелиться в вашу ногу, но в результате простреливаете все Борландовские дистрибутивные дискеты.
  • Revelation: Вы уверены, что сможете прострелить себе ногу, как только разберетесь, для чего служат эти маленькие хорошенькие пульки.
  • Модула-2: После того, как вы понимаете, что фактически ничего не можете сделать на этом языке, вы простреливаете себе голову.
  • Python: Вы пытаетесь выстрелить себе в ногу, но то и делаете, что попадаете промеж пальцев.
  • ActiveX: Как только вы попытаетесь достать пистолет, вас убьют удаленно через Интернет.
  • Assembler: Вы пытаетесь прострелить себе ногу, но обнаруживаете, что прежде вам придется изобрести пистолет, пулю, курок и вашу ногу.