Время от времени на форумах по программированию всплывает вопрос о том, что такое хороший дизайн проекта. В одной из наиболее любимых мной книг Agile Principles, Patterns, and Practices in C# - by Robert C. Martin автор приводит признаки плохого дизайна (если переводить более дословно – “запахи загнивающего проекта”). Эти признаки могут быть прекрасной основой для выведения признаков хорошего дизайна, что мы и сделаем в конце данного поста. Итак, начнём с рассмотрения признаков плохого дизайна.
( Read more... )Siam Ocean World - самый большой океанариум в Юго-Восточной Азии. Находится он в Бангкоке, в торговом центре Siam Paragon. Площадь океанариума - 10000 кв.м., а общий объем воды в аквариумах - около 5 миллионов литров.
01. На входе в океанариум можно увидеть вот такую вот вывеску, с приветствием и на русском языке. А после покупки билетов нас спросили откуда мы, и по-русски ответили "спасибо" :)

( Read more... )
( Read more... )
Если сначала скопировать куда-нибудь полностью working copy, после чего удалить каталог с working copy и сделать свежий check out, то могут всплыть некоторые проблемки. Например, может оказаться что в репозитории не хватает какой-то 3rd party dll из-за чего проект не билдится, или что какой-нибудь автотест не проходит, т.к. использует в работе каталог, который по умолчанию после check out'а не создается.
Похожая ситуация с бэкапами. Если предварительно скопировать содержимое системного раздела на другой диск, после чего отформатировать системный раздел и поставить заново систему и софт, то может оказаться, что не вся важная информация бэкапилась.
В общем-то ничего сложного и сверхъестественного, но иногда полезно устроить такую проверку для выявления скрытых проблем.
SomeMethod(xxx someArgument) { ... switch(someArgument.SomeEnumProperty) { case xxx: ... case yyy: ... default: throw new ???????????????? // какой тип? } ... }
Т.е. в метод передается некоторый объект, свойство которого (типа Enum) имеет недопустимое для данного метода значение. Такая ситуация может быть, когда метод сознательно допускает только определенные значения перечисления (и не может быть выполнен/не должен вызываться при других значениях); либо когда делается "перестраховка на будущее", т.е. если в будущем добавится новый элемент перечисления, не поддерживаемый данным методом, то метод сразу об этом сообщит с помощью исключения, после чего разработчик сможет либо исправить вызывающий код, либо этот метод, так чтобы он стал поддерживать новое значение перечисления.
Ситуация должна быть понятна, так что вернемся к главному вопросу: какой тип исключения выбрать в такой или в аналогичной ситуации?
( Read more... )
http://jsfiddle.net
На нем можно писать html/css/js-код, проводить автоматическую валидацию javascript-кода, и сразу же видеть результат. При этом можно указать используемый javascript фреймворк, например jQuery (любую версию), которым можно будет пользоваться в коде, т.е. не придется закачивать jQuery.js.
В общем, очень удобно. Далее код можно сохранять, показывать другим, обновлять.
Краткое описание проекта из интервью с разработчиком сайта:
One of the great code sharing tools was pastebin. It was simple and straight-forward but quickly grew out of its usefulness. That's where jsFiddle comes in. jsFiddle is a fresh tool that not only displays the code and highlights it but also executes its code within the browser for even better debugging.
...
JsFiddle is a playground for web developers, a tool which may be used in many ways. One can use it as an online editor for snippets build from HTML, CSS and JavaScript.
The code can then be shared with others, embedded on a blog, etc. Using this approach, JavaScript developers can very easily isolate bugs. We aim to support all actively developed frameworks - it helps with testing compatibility.Вот, например, ненавязчивое мигание ссылки, сделанное с помощью jQuery:
http://jsfiddle.net/nKFEh/1/
Вкратце о юникоде.
Disclaimer: Данный пост не является и не имеет цели быть исчерпывающим руководством по unicode. Цель поста в том, чтобы читатель быстро получил минимальный набор знаний о unicode. На текущий момент данный пост является черновым вариантом, который позже будет исправлен и доработан.
Думаю не секрет, что до сих пор многие разработчики не до конца понимают что такое юникод и как он устроен. У них есть только отдаленное представление, что-то типа "Ну, юникод - это новая кодировка, используется для того, чтобы отобразить любой символ, для хранения одного символа используется 2 байта". Такое представление о юникоде мягко говоря не совсем правильное.
Итак, что же такое unicode?
( Read more... )
Поставить и заставить все работать у меня получилось с 3-го или 4-го раза. Позже, поискав в интернете, я увидел, что я не один такой, что некоторые мучаются аж по неделе :), другие просто забивают, так и не добившись работоспособности. Я также пробовал пакетный инсталлятор от Bitnami, который по задумке должен был сделать все за меня, но на деле не получилось (сначала он вис, потом, когда я разобрался с зависанием, то были ошибки при установке mysql и т.д.).
Потратив 3 часа, я решил поделиться опытом и написать пошаговую инструкцию по установке Redmine на Windows.
( Read more... )
Проверял на реальном сайте на удаленном хостинге. Сайт на PHP, веб-сервер - Apache.
Итак, 2 режима:
а) Режим по умолчанию, т.е. в ответе заголовок:
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Т.е. ответ с сервера сообщает браузеру о том, что кешировать не нужно. Правда браузер дальше уже сам будет решать, как ему себя вести.
б) Режим с включенным кешированием, когда из PHP вызываю session_cache_limiter("private_no_expire"
Cache-Control: private, max-age=10800, pre-check=10800
Т.е. ответ с сервера говорит, что прокси-сервер (если таковой имеется) кешировать не должен, а браузер - может. И что время жизни кеша должно быть ограничено 10800 секундами, т.е. 3 часами.
Поведение браузеров такое:
( Read more... )
Какие основные варианты у нас имеются?
1) Написать простое GUI-приложение которое будет запущено на сервере и будет выполнять наши задачи.
2) Написать службу Windows (windows service), которая будет запускаться вместе с загрузкой Windows и так же выполнять наши задания.
3) Использовать Планировщик заданий windows (scheduled tasks) для запуска написанных нами приложений, которые будут выполнять что нужно.
Давайте разберем основные плюсы и минусы (на мой скромный субъективный взгляд) каждого подхода:
( Read more... )