Шило на мыло или вопрос об эмиграции

24 дек. 2012 г. | | |

Сначала этот пост планировался как небольшая подборка ссылок, посвещённых теме эмиграции. В итоге получился небольшой размышлизм.
И так, эмиграция - довольно актуальная тема  среди специалистов IT-мира (и не только it) стран пост-советского пространства: там, за бугром, и зарплаты выше, и дороги без ям, и вобще всё лучше. На фоне "Российские программисты недовольны зарплатой и готовы покинуть страну" русский иммигрант во Франции делится собственной статистикой доходов/расходов и в заключение даёт ценный совет:

Прежде чем устремлять свой взор в сторону Запада, сначала снимите розовые очки!

3 плагина для Sumblime Text, которые облегчат работу с javascript и jQuery

22 дек. 2012 г. | | |

Как ни крути, а Sublime Text 2 классный, удобный, гибкий за счет мощной системы плагинов и просто прекрасный. Хвалить его можно долго, лучше перейти сразу к делу.

В преддверии армагедона

21 дек. 2012 г. | | |

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

Jquery.Inputmask

17 дек. 2012 г. | | |

Jquery.Inputmask - крутой (да-да, именно) плагин, добавляющий гибкости в работу с обычным текстовым полем для ввода. Плагин является усовершенствованной версией Masked Input Plugin, полностью совместим с ui-datepicker и поддерживает кучу расширений. Этот плагин - настоящая находка для всех фанатов MaskedTextBox из Winforms.

Ion Auth: Call to undefined function inet_pton()

2 дек. 2012 г. | | |

У замечательной библиотеки для авторизации Ion Auth под CodeIgniter кроме несомненных плюсов и достоинств присутствуют также и недостатки. Например, использование методов php, которые недоступны на windows-платформах. Такая ситуация сложилась с методом inet_pton(), который доступен в windows-версии php только начиная с релиза 5.3.

Pickdate.js - удобный datetime picker

1 дек. 2012 г. | | |

Знакомьтесь: Pickdate.js. Минималистичный, легковесный и просто классный datetime picker на javascript.

Универсальный интерфейс

21 нояб. 2012 г. | | |

Говорят, универсального интерфейса не существует, но, мне кажется, это неправда:

Пост восторга, здравого смысла, недоумения и паники или образчик anti-usability

9 окт. 2012 г. | | |

Пользовательский интерфейс (GUI) - это лицо продукта. А usability - его душа. Так уж устроен человек, что клюёт на всё красивое. И даже наука есть, использующая этот баг человеческий. [1] Именно поэтому часто рисуется красивая обложка, а на проработку действительно важного аспекта продукта - usability - сил уже не хватает. И получаются монстры. Я не хочу сказать, что лучше делать что-то страшненькое, но удобное: среди пользователей встречаются не только гики, выросшие в консоли. Важен разумный компромис. Идеал - отличный GUI и проработанное usability. Но мы же реалисты и по поводу идеалов всё понимаем правильно. К сожалению, в последнее время слишком часто стали попадаться “странные штуки в красивых бумажках”. Но этот продукт - это верх какашности!

Послушать, посмотреть, почитать

1 окт. 2012 г. | | |

Накопилась очередная порция интересных ссылок на подкасты и не только.

tdd?

19 сент. 2012 г. | | |

Через конструктор или через свойство?

10 сент. 2012 г. | | |

Инверсия управления (Inversion of control) - один из полезнейших приёмов при разработке в ОО стиле. Инверсия управления позволяет уменьшить связанность модулей приложения, за счет инъекций объектов-зависимостей в объекты-клиенты. Клиенты должны знать минимум о своих зависимостях - в пределах реализуемого интерфейса, если такой имеется - и совершенно ничего о процессе создания объектов-зависимостей. Существует несколько вариантов внедрения зависимостей. 
Под катом - перевод статьи Krzysztof Koźmi "To constructor or to property dependency?", в которой автор рассуждает, как лучше передавать объектам зависимости.
В [ ] находятся заметки переводчика.

Меньше знаешь - крепче спишь.

7 сент. 2012 г. | | |


Парное программирование. Особое мнение.

31 авг. 2012 г. | | |

Принципы Эмерсона

30 авг. 2012 г. | | |



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

Лжец

29 авг. 2012 г. | | |

Всё же род деятельности сильно влияет на стиль жизни :)

Prefixr

27 авг. 2012 г. | | |

Ещё один замечательный плагин для Sublime Text 2 - Sublime Prefixr
Этот делает написание кросс-браузерного css в разы легче. Лёгким нажатием Ctrl+Alt+X следующий код
div { 
    transform: rotate(90deg); 
}
превращается в
div { 
    -webkit-transform: rotate(90deg);
    -moz-transform: rotate(90deg); 
    -o-transform: rotate(90deg); 
    -ms-transform: rotate(90deg); 
     transform: rotate(90deg); 
}
На сайте плагина можно найти ещё много полезностей для Sublime Text 2, например, Package Control и Sublime Tortoise.

IE6. Зачем?

17 авг. 2012 г. | | |

Нет, это не пост ненависти к IE6. Это пост удивления, чистого и неподдельного, возникающего каждый раз, когда я вижу в описании нового чудо-js-скрипта строчку типа "Cross-browser – supports Firefox №n+, Internet Explorer 6+, Google Chrome №n+, Apple Safari №n+, Opera №n+..." Какой IE6? Вы что, шутите? Что за некрофилия? Этому браузеру 27 августа будет 11 лет. Многие компании уже списали его со счетов: Google отказалась от поддержки в сервисах Google Docs, Google Sites, Google Apps, Youtube, 37signals в Basecamp, Highrise, Campfire и др. веб-сервисах, Wordpress, Вконтакте и другие, даже Microsoft в 2010 году (2 года назад!!!) уже сама активно начала рекомендовать пользователям отказаться от IE6, а в 2011 запустила обратный отсчет мгновений жизни ИЕ 6. И, несмотря на обилие других браузеров, несмотря на наличие новых версий того же Internet Explorer, до сих пор остается 6% (на июль 2012) регрессивного человечества, пользующегося мертвячиной.
И вот он вопрос: ради этих шести процентов пользователей, которые с большой вероятностью даже никогда не посетят ресурс, использующий новый прогрессивный js-скрипт из эры HTML5, стоит, надрываясь хаками с преподвыпертами, встраивать поддержку ИЕ 6 в свой скрипт? Или это делается ради фразы cross-browser? Ради чего это?

Obsolete

15 авг. 2012 г. | | |

В одном небольшом, но сложном проекте, в неком простом, но важном классе жил-был обычный, но востребованный метод. Шло время, старые баги закрывались, добавлялись новые фичи, и настал день, когда метод устарел. Однако несколько классов, написанных другим разработчиком,  использовали его для своих тёмных делишек. “Разберусь с этим потом,” - подумал создатель метода, - “есть много дел поважне, чем эта ерунда,” Может быть, и закончилась бы эта история хэппи эндом, если б не ошибки в данных, которые начали материализовываться самым загадочным образом. Вот тогда-то и вспомнил хозяин метода про свой должок...

Субботнее чтение

11 авг. 2012 г. | | |

Одна за другой попались две статьи о превращениях. В первой статье баг успешно превратился в фичу, во второй - наоборот. И, если баг хорошо вжился в новое амплуа, то фича, замеченная в столь неподобающем поведении, превратилась в пятно на репутации.
Первая (перевод). Непреднамеренная концепция или "одно маленькое упущение, случившееся 40 лет назад".
Вторая. ICollection<T> и массивы или "Why the hell some read-only collection implements the Add() method?"

Zen Conding

10 авг. 2012 г. | | |

Про то, что SublimeText 2 - мега крутая вещь, знает, наверно, каждый. Да, я тоже в восторге от этого редактора, незамедлительно включила его в свой арсенал разработчика и стала всячески обустраивать плагинами. И наткнулась на хвалебные песни о ZenCoding. Хм, что же это плагин? Сходим к проекту на github, почитаем реадми, проясним ситуацию:
This plugin will evetually replace current plugin: https://github.com/sublimator/ZenCoding
Как-то понятнее не стало. Один Zen Coding заменяется другим. И хабр как-то не сильно прояснил ситуацию: смесь невалидного html и css. Что ж это за.... магия?

Загрузка файлов на сервер: php+C#

31 июл. 2012 г. | | |

Сценарий простой: клиент (winforms) хочет править миром загружать файлы на сервер (php). Первая мысль - использовать WebClient, у которого есть замечательный метод UploadFileAsync. На сервер вместе с файлом нужно передать пару-тройку дополнительных параметров, т.е. отправить стандартную форму типа:
<form action="http://localhost/uplad.php" enctype="multipart/form-data" method="POST">
<input type="text" name="title" value="" />
<input type="text" name="description" />
<input type="FILE" name="uploadfile" />
<input type="submit" name="send" value="Upload" />
</form>
И тут начинаются проблемы. Теоретически, это можно сделать, используя QueryString у WebClient:
If the QueryString property is not an empty string, it is appended to address. [MSDN]
Но практически тут нужен бубен:
Unfortunately, most file upload scenarios are HTML form based and may contain form fields in addition to the file data. This is where WebClient falls flat. After review of the source code for WebClient, it is obvious that there is no possibility of reusing it to perform a file upload including additional form fields.  [CodeProject]

FuckMeGentlyWithAChainsaw

| | |

 Код из клиента одной онлайн игрушки, процитирован дословно. via http://govnokod.ru/11504

WTF?

28 июл. 2012 г. | | |


Загадки старого кода

26 июл. 2012 г. | | |

Иногда очень занятно копаться в старом коде. Особенно в своём. Порой натыкаешься на гениально загадочные вещи, как-то:
if (level <= 5 && level > 4){ ... }
else
{
          if (level <= 6 && level > 5) { ... }
          else
                 if (level > 6) { ... }
 };
Давайте не будем обращать внимание на количество if-else операторов, на "магические числа"  и сфокусируем взгляд на проверяемых значениях в условных операторах. Этот феномен можно было бы попытаться  объяснить, если код был бы написан на языке с нестрогой типизацией, например, на том же php или javascript: в диапазон (4.0; 5.0] могло попасть множество значений (даже строка "4.098" т.к. в момент сравнения она будет автоматически преобразована в число с плавающей точкой - для php [1]). Но нет же!
C# является строго типизированным языком. Каждая переменная и константа имеет тип, как и каждое выражение, результатом вычисления которого является значение. Каждая сигнатура метода задает тип для каждого входного параметра и для возвращаемого значения.  [MSDN]
Остаётся мучиться в догадках, что за мистическая цифра могла бы находиться в целочисленном диапазоне (4; 5] кроме цифры 5. :)

[1] http://it2.php.net/manual/en/language.types.string.php см. раздел "String conversion to numbers":
When a string is evaluated in a numeric context, the resulting value and type are determined as follows.
If the string does not contain any of the characters '.', 'e', or 'E' and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer. In all other cases it will be evaluated as a float.

Бунт строковых функций, нечувствительных к регистру, и явное указание локали в PHP

| | |

Простая задача: сделать поиск по каталогу продуктов на сайте, если б не возникла проблема - функции для работы со строками stripos, strripos, preg_replace (с ключом i ) и иже с ними вдруг стали чувствительны к регистру. В документе явно прописана кодировка и язык: 
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<meta name="language" content="Russian"/>
<meta http-equiv="content-language" content="ru-RU" />
Решилась проблема явным указанием локали в скрипте перед вызовом выше обозначенных функций:
 setlocale(LC_ALL ,'ru_RU.CP1251');

Активный отдых мозгами

| | |

Я обожаю всякие квесты, особенно те, что связаны с профессией. Поэтому, с удовольствием прошла тест и поучаствовала в квесте ко дню сисадмина на admin2012.ru от компании Ideco.

Размышления о пиратстве

5 июн. 2012 г. | | |

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

Из жизни багов

31 мая 2012 г. | | |


Маленький нюанс сортировки дат в MySql

16 мая 2012 г. | | |

Задачка

5 апр. 2012 г. | | |


Типичный рефакторинг

30 мар. 2012 г. | | |

Под катом gif на 2.3Мб

LocalDB

27 мар. 2012 г. | | |

Вместе с новым  MS SQL Server 2012 под кодовым именем Denali разработчики представили нам отпрыска линейки SQL Server Express – LocalDB, который ориентирован на single-user приложения и не требует установки, предварительной конфигурации и запуска сервиса сервера (в отличие от полноценного MS SQL Server) и. Напоминает MS SQL Server CE?

Где разница?


А разница в том, что LocalDB – это полноценный SQL Express, который поддерживает все возможности MS SQL Server, в отличие от SQL CE, который предоставляет очень урезанный T-SQL и другие возможности (различия см. тут http://msdn.microsoft.com/en-us/library/bb896140.aspx). К тому же, LocalDB работает как дочерний процесс приложения, используя тот же sqlservr.exe, что и обычный SQL Express: приложения могут использовать стандартные провайдеры (ADO.NET, ODBC, PDO и др.) для работы с БД. А Sql Server CE – это inproc dll.

Хорошо, в чем же тогда отличие от   SQL Express? Во-первых, как уже было сказано, для LocalDB не требуется создание сервиса. Процесс LocalDB стартует при подключении приложения к нему и завершается автоматически, если подключений больше нет. Кроме того, есть такая фича, как  AttachDbFileName, которая позволяет разработчику указывать расположение файла БД, к которому нужно подключиться.

Что же выбрать? 

Очевидно, что для небольшого portable-приложения LocalDB - это слишком. Но если важна совместимость с MS SQL Server и в дальнейшем планируете переходить на полноценный MS SQL Server, только не хочется устанавливать еще один сервис, то LocalDB – ваш выбор. MS Sql CE выигрывает, если важно:

1) Размер БД (например, приложения для мобильных девайсов): 18 Мб на диске (Sql CE 4.0) против 160 Мб (LocalDB). (хорошая таблица сравнения параметров http://erikej.blogspot.com/2011/01/comparison-of-sql-server-compact-4-and.html)

2) Возможность распространения приложения через XCOPY: LocalDB требует установки через msi, SQL Server CE работает, если скопированы нужные файлы


Есть ли жизнь после сдачи проекта?

21 мар. 2012 г. | | |


History of Software Testing

16 мар. 2012 г. | | |

Visual Studio 11: запуск xUnit.Net без боли

14 мар. 2012 г. | | |

Бета-версия одиннадцатой cтудии вызвала много охов и ахов. Чтобы там ни говорили, работать в ней приятно, хоть по началу немного необычно. На несколько шагов впёред продвинулась поддержка юнит тестирования. Чего только стоит новый Unit Test Explorer. Но я хочу рассказать о новой фиче, которая меня особо порадовала: Visual Studio 11 beta поддерживает сторонние фреймворки для тестирования! Ура! Ура! Ура! Теперь Unit Test Explorer можно сконфигурировать для запуска тестов xUnit.NET, MbUnit и NUnit. И даже не стоит расстраиваться, если фреймворка, который вы используете для тестирования, нет среди вышеперечисленных - ведь всего-то нужно написать свой адаптер (Unit Test adapter). Список существующих адаптеров можно посмотреть тут.
А пока, не откладывая в долгий ящик, запустим xUnit.net-тесты без TestDriven.Net.

MySql, даты и WTF

| | |

Тянуть не буду, сразу в бой:
SELECT TO_DAYS('05.03.2012') as `05.03.2012`,TO_DAYS('01.02.2012') as `01.02.2012`, TO_DAYS('28.02.2012')  as `28.02.2012`
Результат:

Опаньки. Нужно отформатировать даты:
SELECT TO_DAYS('2012-03-05') as `05.03.2012`,TO_DAYS('2012-02-01') as `01.02.2012`, TO_DAYS('2012-02-28')  as `28.02.2012`
Результат:

Это уже похоже на правду. Заюзаем DATE_FORMAT т.к. даты приходят от клиента:
SELECT TO_DAYS(DATE_FORMAT('05.03.2012', '%Y-%m-%d')) as `05.03.2012`,
TO_DAYS(DATE_FORMAT('01.02.2012', '%Y-%m-%d')) as `01.02.2012`,
TO_DAYS(DATE_FORMAT('28.02.2012', '%Y-%m-%d')) as `28.02.2012`
Результат:

WTF? Как из даты в феврале получилось дней больше, чем из даты в марте? И вобще, что за удивительная разница в 9861 день между 1-м и 28-м февраля? Как он это делает?
Интуиция подсказывает проверить DATE_FORMAT:
SELECT DATE_FORMAT('05.03.2012', '%Y-%m-%d') as `05.03.2012`,
DATE_FORMAT('01.02.2012', '%Y-%m-%d') as `01.02.2012`,
DATE_FORMAT('28.02.2012', '%Y-%m-%d') as `28.02.2012`
Результат:
А потому что
Although MySQL tries to interpret values in several formats, date parts must always be given in year-month-day order (for example, '98-09-04'), rather than in the month-day-year or day-month-year orders commonly used elsewhere (for example, '09-04-98', '04-09-98'). [мануал]
и даты форматировать надо на клиенте, не за чем лишний раз мускул качать!

UML Toolbox for Visual Studio

16 февр. 2012 г. | | |

Интересный и очень удобный плагин для студии, который добавляет в тулбокс набор шаблонов паттернов для быстрого создания UML-диаграмм. В тулбоксе шаблоны для паттернов разбиты по категориям, как в классической книге большой четверки, на структурные, порождающие и поведенческие.
Теперь, чтобы воссоздать структуру какого-либо из паттернов на uml-диаграмме, нужно всего лишь выбрать нужный шаблон в тулбоксе и вуаля!

Пост создателя расширения.
Расширение в VisualStudio Gallery

Box Selection and Multi-Line Editing in Visual Studion 2010

15 февр. 2012 г. | | |

Love via soap I: asmx + php

14 февр. 2012 г. | | |

Задача очень простая: есть сервис на ASP.NET (asmx-сервис) и есть клиент на php, и нужно научить их общаться по http. Всё это просто реализуется через протокол SOAP.

Мотивация

4 февр. 2012 г. | | |


Да, эта статья, именно, о мотивации. Нет, это не очередные  «стопицот способов замотивироваться». И не очередное тыканье пирамидой Маслоу (хотя с неё, наверное, стоило бы начать, ведь именно потребности являются основными двигателями). Все мы знаем свои потребности – именно те недостающие детали мозаики наших поступков, объясняющие всё – и на них останавливаться не будем.  
 Есть цель, определяющаяся потребностями, есть дорога к цели, состоящая, например, из тасков в проекте или материалов к экзамену, и есть мотивация, которая и заставляет нас, двигатель, работать. Но порой двигатель глохнет. Вроде и дорога не ухабистая, вроде и ехать не далеко, а вот не едется. То ли бензин закончился, то ли бак вообще не заправляли, то ли слил кто-то весь бензин. Бывало? У всех бывало. И не раз. Ведь слабая мотивация занимает третье место в перечне причин, препятствующих росту бизнеса*. 

Чужой код

1 февр. 2012 г. | | |


Over engineering

30 янв. 2012 г. | | |

Загадка: "На столе сидело три мухи. Я взял тапок и прибил им одну муху. Сколько мух осталось на столе?"
Официальная отгадка: одна (две других улетели).
Неофициальная отгадка умного человека:
"Если она не прилипла к тапку, то 3;
Если 2 улетели от страха, а одна прилипла к тапку - 0;
Если 2 бесстрашно остались сидеть, и одна не прилипла к тапку - 3;
Если 2 улетели, а одна не прилипла к тапку- 1;
Если 1 прилипла к тапку, а 2 бесстрышно остались сидеть - 2"
Вывод: умные люди даже в простых загадках всегда рассматривают проблему не поверхностно и проводят глубокий анализ ситуации:)"
Дополнение:
Также возможно, что одна муха улетает, другая бесстрашно сидит на столе, а третья прилипает/не прилипает к тапку.
Еще не рассмотрены варианты прилета новых мух, не зарегестрированных на столе в начальный момент времени.
Так же в условии задачи не говорится какую именно муху убили. Может быть случайно мимо пролетавшую, и эти три даже ничего не заметели (а трупик убитой мухи кстати мог упасть на стол).
Так же автор почему-то не рассматривает (что я нахожу крайне странным) возможность встречи стола с антистолом и их анигиляции. В этих условиях поиск решения становится довольно затруднительным.
bash.org.ru 

Возвращение блудных шаблонов в VS

25 янв. 2012 г. | | |

Постигла такая беда: пропали все шаблоны создания новых файлов / проектов в Visual Studio.
Лечится так: в Visual Studio Comand Prompt запускаем команду devenv /installvstemplates.
 

Рейтинг языков программирования

20 янв. 2012 г. | | |

По ежегодному рейтингу языков программирования от компании TIOBE C# поднялся аж на три позиции вверх и занял третье место, догоняя Java,  которая так же остается на первом месте (хотя, если взглянуть на график рейтингов за последние 10 лет, то видно, что она медленно, но уверено теряет). Интересно, что годовая дельта для Java оказалась отрицательной (-0.29%), несмотря на популярность ОС Android как платформы для мобильных приложений. На втором месте восседает С. Поднялся рейтинг и у Objectiv-C, что вполне естественно с ростом спроса на рынке  разработки под айфоны и айпады. PHP сдал аж на две позиции. Но кто меня действительно удивил - так это Delphi/Object Pascal, который умудрился стать более популярным за последний год.


Размышления о качестве

18 янв. 2012 г. | | |

Читаю Э.Голдрат "Цель. Процесс непрерывного совершенствования". Долго откладывала эту книгу в сторону, но пришло и её время. Действительно, хорошая книга. Хоть и не it-тематики, но точки соприкосновения есть. Почитать эту книгу полезно всем, не только управленцам.

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

Это далеко не новость. Но что такое качественный продукт? Первое, что приходит в голову, это программа без ошибок, т.е. тщательно оттестированный функционал, когда пользователь не переживает, что, ткнув не туда, можно завалить программу. Всю качественность функционала может затмить интерфейс, который не позволяет использовать продукт на все 100%. Т.е. интерфейс тоже должен быть качественным, продуманным, позволяя пользователю не тратить много времени на освоение. Это всё? Нет. Бек-сайд продукта - это код. И качественный код != код без багов. Качественный код - это совокупность характеристик, где одно из первых мест занимает качественная архитектура, позволяющая легко и безболезненно развивать продукт. Это тестируемость (testability) кода как подтверждение качества архитектуры.
И, конечно же, качественный продукт в состоянии выпустить только здоровая команда! (Однако обратное выражение не всегда верно) О влиянии отношений внутри команды на продукт была хорошая цитата тут

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

Качество продукта всегда коррелируется временем (сроками) и бюджетом (это внешние факторы) и профессионализмом команды (это внутренние факторы), и эти факторы очень тесно связаны. Бюджет прямо пропорционально влияет на профессионализм команды, а если ужать время, то даже профессионалы не смогут выдать качественный продукт. Тут вспоминается Ф.Брукс и его высказывание "9 женщин не родят ребёнка за 1 месяц" ("Мифический человеко-месяц").  А за то время, что команда новичков будет набираться опыта, продукт успеет устареть или надобность в нём отпадёт.
И напоследок - зачем вобще нужно это качество? Оно является одной из главных составляющих жизнеспособности - т.е. конкурентоспособности продукта, а значит, и успеха проекта.