MonoDevelop

Так сложилось, что мой любимый язык программирования – C#. При этом самая нелюбимая операционка – Windows (кроме последней, пожалуй) а самая нелюбимая серверная технология – ASP.NET

Так вот, Novell и сообщество, при участии Microsoft, довели до ума свободную альтернативу Microsoft .NET Framework – кросплатформенный фрэймворк Mono. Теперь и он, и среда разработки замечательно разотают и под Mac OS X и под Linux и под Windows.

Против, как всегда, только Столлман — Why free software shouldn’t depend on Mono or C#

Будем пробовать.

Почему грузить только со своего сервера

Очень много рекомендаций в последнее время появилось, призывающей грузить сторонние скрипты с google.code или их серверов. Аргументация такая:

  • если все сайты грузят jQuery c Google Code то jQuery к’шируется в браузере один раз для всех сайтов;
  • если исправили ошибку в текущем релизе – везде автоматически заменится.

Я же рекомендую все скрипты, рекомендующие свои Hosted Version, как jQuery, jQuery Tools, nicEdit, грузить исключительно с того сервера, на котором разрабатывается проект. Таким образом:

  • вы застрахованы от падений сторонних сервисов;
  • скрипт загрузится быстрее, пинги до США ой как длинны;
  • при показе заказчику локальной копии проекта в отсутствие интеренета не будете иметь бледный вид;
  • вы сможете вносить свои изменения (например, руссифицировать nicEdit, или переопределить его кнопку загрузки изображений на собственный AJAX-загрузчик), что, по понятным причинам невозможно с hosted версией;
  • мелкое изменение или исправление hosted версии не приведёт к странному поведению вашего проекта.

В общем, всё своё носи с собой. По крайней мере, на время разработки.

jQuery потому что

Copy Source | Copy HTML

  1. function checkRadios() {
  2.         var el = document.formregions.elements;
  3.         var valueofchecked =  0;
  4.         for(var i =  0 ; i < el.length ; ++i) {
  5.             if(el[i].type == "radio") {
  6.                 var radiogroup = el[el[i].name];
  7.                 var itemchecked = false;
  8.                 for(var j =  0 ; j < radiogroup.length ; ++j) {
  9.                     if(radiogroup[j].checked) {
  10.                         itemchecked = true;
  11.                         valueofchecked = radiogroup[j].value;
  12.                         break;
  13.                     }
  14.                 }
  15.                 if(!itemchecked) {
  16.                     alert("Пожалуйста, выберите сначала регион.");
  17.                     if(el[i].focus)
  18.                         el[i].focus();
  19.                     return false;
  20.                 }
  21.             }
  22.         }
  23.         return valueofchecked;
  24.     }

=

Copy Source | Copy HTML

  1. $('#regionstree input:radio:checked').val()

Drupal в белом доме

Не верьте, господа, лжи менеджеров производителей платных CMS, особенно отечественных, о том, что их продукты надёжнее и быстрее бесплатных OpenSource аналогов. Практика и поиск доказывает прямо противоположное.

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

В портфолио бесплатной системы управления контентом Drupal кроме мелких контор типа IBM и NASA, которым на платные CMS денег не хватает (по мнению упомянутых менеджеров) добавился и скромный правительственный сайт президента США.

image

Вывод прост – меньше ходите на семинары по промывке мозга и презентации “для руководителей”, а этим самым мозгом думайте и анализируйте.

На чём пишете?

Такова натура программиста, что каждый год-два требуется душа требует сменить платформу разработки, а раз в полгода хотя бы поверхностно изучить новый язык.

Разумеется, есть индивидуумы, не меняющие платформу всю сознательную жизнь – но в основном это люди, до пенсии сидящие на окладах в госорганизациях. Знавал одного такого – файлы в Delphi копировал, запуская bat-файлы, определял, запущена ли программа по флагу, создаваемому в корне диска С, данные хранил в текстовых файлах, причём построчно, ибо кроме writeln и readln ничего не удосужился изучить. Знавал и программиста-уборщицу – перевели по знакомству из “отдела клининга”, потому что в Outlook умела письма отправлять – “значить, программист”.

Ещё есть категория кодеров – абсолютно не творческих личностей, разработкой не увлечённых, но хороших специалистов. Их сменить среду может заставить только низкий спрос на текущие знания. Работают только ради денег, о программировании “just for fun” говорить не приходится. Как правило специалисты хорошие, в своих рамках. Сроки соблюдают, пишут качественно, устойчивы к рутине. Впадают в ступор при надобности использовать самостоятельное недокументированное или нестандартное решение, пишут докладные записки о том, что из за “бага компилятора” работу выполнить в принципе невозможно.

Низкими зарплатами и такими специалистами и определяется “качество” государственного ПО.

Итак, моё знакомство с компьютерами проходило примерно так:

Logo (англоязычный)

  • Год: 1991
  • Платформа: Агат

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

image

О платформе без дрожи вспомнить не могу. Агат был первым ПК, разработанным в СССР и выпускался с 1984 года на Лианозовском электромеханическом заводе. Совместим с Apple II и дико дорог и ненадёжен. Пятидюймовый дисковод был в чугунном литом корпусе с сантиметровыми шипами радиатора и мощной пружиной, не позволявшей головке прижаться к дискете. Поэтому в процессе загрузки системный блок нужно было приподнять с одной стороны и держать под углом в 45 градусов к поверхности стола, пока не загрузится операционная система. Тогда я впервые задумался о становой тяге и пауэрлифтинге вообще.

image image

TurboPascal 5.5

  • Год: 1993
  • Платформа: MS-DOS i386

К сожалению, в школе преподавали Pascal. Сейчас я об этом очень жалею, гораздо больше толку было бы от C++. Ну про ООП и TurboVision в школе я так и не узнал, а зря, упустил много времени.

image

Читать полностью

Новость года – эпик фэйл разработчиков.

Увели исходники 3300 глобальных интернет-проектов, в том числе Яндекса, Рамблера, Лепрозория, РБК. Увели по глупому – каждый серьёзный проект использовал систему контроля версий SVN. Так вот, на сервер они все додумались выкладывать рабочую копию! То есть не делали экспорт, как подразумевается, а пустили народ прямо в рабочие исходники! Ну а кроме файлов исходников в рабочей копии содержатся служебные каталоги Subversion — .svn. И естественно, к ним доступ был не закрыт, и перейдя по ссылке вида  имя_сайта/.svn/text-base/ можно было получить все коды.

Как такого не допустить? Во первых, читать инструкцию к SVN. Прочитав, узнать, что существует команда экспорта, которая выложит в указанное место только скрипты. Если исходники выкладываются вручную, то можно использовать фильтр файлов в FTP-менеджере. В Filezilla эти фильтры даже уже настроены.

imageМеню “Вид”, пункт “Фильтры по названию файлов…”.

Постовой: разработка, создание сайтов

День программиста

В пятницу президент подписал указ об учреждении Дня программиста, 256 дня года. Соответственно, 13 сентября в невисокостные года, 12 сентября в високостные.

Поздравляю всех коллег с этой знаменательной датой! Чётких вам технических заданий, адекватных заказчиков и менеджеров, понятной документации, меньше отвлекающих факторов!

Как в NetBeans включить автодополнение CodeIgniter?

Стандартный совет: создайте в корне проекта файл autocomple.php и перечислите там классы CodeIgniter. А чтобы  автодополнение работало по всему приложению, добавьте также свои собственные модели и классы.

Copy Source | Copy HTML

  1. <?php
  2. /**
    * @property CI_Loader           $load
    * @property CI_Form_validation  $form_validation
    * @property CI_Input            $input
    * @property CI_Email            $email
    * @property CI_DB_active_record $db
    * @property CI_DB_forge         $dbforge
    * @property CI_Table            $table
    * @property CI_Session          $session
    * @property CI_FTP              $ftp
    * @property CI_Benchmark        $benchmark
    * @property CI_Calendar         $calendar
    * @property CI_Image_lib        $image_lib
    * @property CI_Email            $email
    * @property CI_Encrypt          $encrypt
    * @property CI_Exceptions       $exception
    * @property CI_Language         $language
    * @property CI_Pagination       $pagination
    * @property CI_Parser           $parser
    * @property CI_Trackback        $trackback
    * @property CI_User_agent       $user_agnet
    * @property CI_Validation       $validation
    * @property CI_Security         $security
    * @property Excel               $excel
    * @property Blog_model          $Blog_model
    * @property Test_model          $Test_model
    * @property Categoryes_model    $Categoryes_model
    * @property Gallery_model       $Gallery_model
    * @property Menu_model          $Menu_model
    * @property MPTtree             $MPTtree
    * @property Pages_model         $Pages_model
    * @property Portfolio_model     $Portfolio_model
    * @property Rights_model        $Rights_model
    * @property Users_model         $Users_model
    * ...
    */
  3. Class Controller {
  4.  
  5. }

В NetBeans меня немного раздражает, что что открывающая скобка находится на одном уровне с оператором. По гайдлайнам CodeIgniter это не приветствуется, да и мне после C# не особенно облегчает просмотр кода. Глаз быстрее находит открывающую скобку, чем оператор или объявление. Как побороть?

Идём в меню “Tools”, пункт “Options”, закладка “Formatting”. Далее выставляем всё так:

imageПосле этого используем автоформатирование кода (Alt+Shift+F). 

CodeIgniter и Ajax

Решил провести полный рефакторинг своей CMS (да-да, каждый вебразработчик просто обязан написать свою систему управления контентом), и заодно сделать панель управления удобнее.

Задача такая: есть дерево меню сайта в админке. Рядом с каждым пунктом меню — кнопка, нажав её, переходим на страницу редактирования свойств пункта меню: ссылки, активности, картинки. Задача следующая — не переходить на другую страницу, как в "суровые девяностые", а используя AJAX открыть тут же, в псевдо всплывающем окне, типа лайтбокса, который заполонил весь инет.

Начнём, как говорят "37 signals", с проектирования интерфейса. Использовать плагины и чужие скрипты не хочется, люблю, чтобы страницы загружались быстро. Поэтому обойдёмся без лайтбокса и jquery tools. Всплывающее окно будет у нас слоем с абсолютным позиционированием и следующими свойствами:

Copy Source | Copy HTML

  1. #divedit
  2. {
  3.      position: absolute;
  4.      z-index:0;
  5.      background: silver;
  6.      display: none;
  7.      top:50%;
  8.      left:50%;
  9.      width: 400px;
  10.      height: 274px;
  11.      margin-left: -200px;
  12.      margin-top: -137px;
  13.      border: gray solid;
  14. }

Читать полностью

Разговор с клиентом

Давным-давно, в далёкой, далёкой галактике…

Эпизод 1

— Здравствуйте! Мне нужно поставить синюю фару в мой автомобиль.

— Нам нужны ключи от капота.

— Зачем вам ключи? Отсоедините фару снаружи. Это же просто.

— Знаете, на самом деле, чтобы заменить фару, нужно открыть капот рычагом, который находится в салоне.

— Ладно, вот вам ключи.

Эпизод 2

— Здравствуйте, как там с фарами?

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

Мы можем провести диагностику, всё поменять, срезать болты и ввинтить нормальные, а так же подобрать крышку бензобака с ключом, поставить центральный замок и сигнализацию. Это будет стоить вам X имперских кредитов.

— Хорошо, я подумаю и согласую с начальством.

Эпизод 3

— Здравствуйте. Можете нам подробно написать, какие манипуляции нужно провести, чтобы обеспечить работу синей фары? Нас не интересует работоспособность всего автомобиля, плевать на него, нам чтоб фара светила. Сколько это времени займёт? А ещё как вариант, можно ли вместо всего этого установить фотовспышку? Я про них читал, они ярко светят, можно приклеить её к крыше и направить вперёд. Я напишу вам все параметры, насколько ярко она должна светить, куда направлена и какие торты должна печь.

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

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

Знаете, ещё один вариант могу вам предложить – купим большой светодиодный фонарь с четырьмя батарейками, и приклеим его скотчем к капоту или привинтим на крышу. Стекло заменим на синее. Похоже в нашем случае это самое быстрое решение. Когда почините машину или купите новую – фонарь не пропадёт, вещь в хозяйстве нужная.

Эпизод 4

— Здравствуйте. Я не понимаю, почему Вы не хотите быстро поставить вспышку! Это быстро и красиво. И мой знакомый кондитер говорит, что все пироги ему в пекарне печёт фотовспышка, а ему я верю!

— …

Ошибка в MPTtree для CodeIgniter

image

Для тех, кто использует модель MPTtree, реализующую вложенные множества в CodeIgniter. Не рекурсией же вы иерархические структуры читаете, смею надеяться?image

В функциях move_to_first_child_of, move_to_last_child_of закралась ошибка. Соответственно, в модели не работает перемещение узлов. Эти же функции используются ORM, поэтому проблема глобальна.

Строки

<?php
if($this->lft != || $node->orphan || $node->instance->tree_table != $this->instance->tree_table
            return 
false;
?>

бессмысленны, так левая граница перемещаемого узла всегда будет неравна единице, так как единица – это левая граница корневого узла. И наоборот, эта функция сработает, если отмечен корень, что не хорошо, ибо корень един и не изменяем.

Меняем $this->lft != 1 на $this->lft == 1 и радуемся.

Тем кто не в теме, срочно просвещаться.

P.S. В рассматриваемой модели поле уровня не используется, оно излишне. Необходимо и достаточно левой и правой границы.

image

Банальности о качестве

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

Увеличение количества ведёт к увеличению штата при сохранении уровня квалификации команды. Нет нужды платить сотрудникам больше, если задачи перед ними стоят неизменной сложности, не нужно тратится на их обучение и  сертификацию. Даже наоборот — можно организовать текучку кадров и платить на треть меньше, прикрываясь испытательным сроком, а вместо премии размещать фотографии на доске почёта, выдавать дипломы “лучшего сотрудника” и прочие “бубенчики для дикарей” вместо денег.

При таком подходе и клиент вам нужен будет специфический — нетребовательный и падкий на дешевизну, с низким культурным багажом и отсутствующими тематическими знаниями. Как такого получить? Путём отсева умных людей — давайте яркую рекламу, заказывайте спам-рассылки, сделайте корявый неудобный сайт. На сайте используйте уродскую типографику, анимацию, разноцветные огромные буквы на "кислотном фоне", неоптимизированные фотографии, слово "успех" во всех возможных вариантах, "100%", "Дёшево!", "Вернём вам деньги". Это гарантированно приведёт к вам одних идиотов.

image

Почему? Так ведь нормальному человеку от продавца возврат денег нужен в последнюю очередь — его качество товара интересует.  Например, возврат денег за неудачную турпоездку не вернёт загубленную неделю жизни, а просроченный медицинский препарат может загубить ему жизнь навсегда.

На слово "успех" клюнут, пожалуй, только НЛП-сектанты и иные психокультисты, типа этих — готовая аудитория. На цифры “100%” — те же, кто реагирует на ценник "499 рублей" вместо "500 рублей" и бирки с надписью “Распродажа”.

В итоге личный доход владельца бизнеса вырастет, а при хорошем менеджменте можно будет пустить дело на самотёк и жить в своё удовольствие.

Второй вариант — увеличение качества клиента. Качественный клиент в заведения быстрого питания не ходит, ему ресторан подавай. Платит он на порядки больше, но хочет быть уверенным в качестве и знать из чего и как делают заказанные им блюда. image

Например, заказывая сайт он понимает, что:

  • что приобретает хороший маркетинговый инструмент, который не раз себя окупит;
  • что работа, которую выполняет команда профессионалов в течении 30 дней ну никак не может стоить меньше, чем сумма заработных плат всех этих специалистов;
  • что можно оплатить заказ поэтапно или в кредит вместо урезания функционала или заказа у студентов;
  • что сайт "за сто баксов" обычно стоит 110 рублей (плата за доменное имя), остальное можно организовать самостоятельно на бесплатных сервисах.

Приятный побочный эффект — работа на качество с постоянно усложняющимися проектами ведёт к профессиональному росту имеющейся команды.

Из жизни:

"Завод сайтов" (название изменено) делает сайты по 4000 рублей. Сайты у всех клиентов одинаковы, шаблоны стандартны, выглядит отвратительно. Зато дёшево. Это как раз то, что стоит 110 рублей.

Студия самизнаетекого — от десятки зелени (по слухам) можно получить замечательный проект со стильным дизайном.