воскресенье, 28 декабря 2008 г.

MacOS X на VMWare

Заинтересовала меня Mac OS X, порылся в инете нашел статью, как его поставить на виртуальную машину. С трудом нашел в местной сети образ "Mac OS X 10.4.8 [JaS AMD-Intel-SSE2-SSE3 with PPF1 & PPF2].iso". Делал вроде все как написано, и все вроде даже начало ставится ,но при загрузке виснет и часами шуршит СД и винтом.
Попытка номер раз не удалась. :(
Удивительно что не удалось найти не одного готового образа.

пятница, 26 декабря 2008 г.

Виртуализация

Сейчас посчитал что в моем проекте используется 7 физических стоечных серверов ,при этом на них около 35 виртуальных машин.
Причем каждая виртуальная машина требует весьма приличных ресурсов т.к. практически на каждой из них стоит Win2k3,MSSQL,Sharepoint и наш продукт и под каждую выделено около 1.5G RAM.
Для виртуализации мы используем VMware Server, причем, как я понимаю это бесплатная версия.
Использование виртуализации помимо экономии ресурсов, удобно тем что все манипуляции с кучей машин можно производить не вставая со своего кресла. Так же очень удобна возможность сделать Snapshot виртуальной машины ,после чего все изменения в ней можно откатить одним кликом.
Именно с помощью большого количества виртуальных машин которые автоматически перегружаются, откатываются и ставится последняя версия продукта у нас реализуется автоматическое тестирование, которое позволяет в течении полутора часов получить информацию о том что последние изменения не сломали всего того, что мы делали почти 2 года до этого.

среда, 24 декабря 2008 г.

Главное в сети

Вечером запустил Strong DC с целью скачать пару фильмов и от нечего делать запустил "Поиск шпион" в нем , был удивлен результатами - на самом верху запросов находится, с большим отрывом "порно" и "xxx" и лишь на 3ем месте мультик "Вольт" причем отрыв от первого почти в 2 раза.
Вот оказывается что главное в сети!

понедельник, 22 декабря 2008 г.

ICQ и работа

Во многих организациях ,в том числе и в нашей использование служб доставки мгновенных сообщении либо полностью запрещено, либо ограничено одним - "официальным" клиентом. В ряде случаев это делается для того, чтобы пользователи не "отвлекались" от работы, в ряде же дабы предотвратить или как минимум поставить под контроль утечку информации.
Я последние 7 лет пользуюсь исключительно сервисом ICQ и тем или иным не официальным клиентом (сейчас это QIP2005) и так получилось что пользуюсь в основном на работе и 80% контакт листа это люди с которыми я работал и работаю. Среди этих людей множество превосходных профессионалов в тех или иных областях, к которым в любой момент я могу обратиться за краткой справкой по той или иной теме (как и они ко мне). На мой взгляд это позволяет ускорить и улучшить мою работу, а следовательно не мешает, а наоборот помогает мне работать.

четверг, 18 декабря 2008 г.

Человеческий фактор

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

Выплывет - хорошо , не выплывет - возьмем нового и дадим шанс выплыть ему.

среда, 17 декабря 2008 г.

Полуспамеры

Есть куча сайтов на которых приходиться регистрироваться , практически все из них начинают слать разные рассылки, иногда даже первое время эти рассылки интересны ,но через какое то время достают , да и сайт на котором регистрировался давно уже не интересен. Но практически НИКТО в своих рассылках не утруждается указать ссылку на отписку при которой не надо вспоминать логин ,лазать по их чертовым настройкам и искать где нужно снять эту чертову галочку.
Приходится вместо отписки эти долбанные рассылки добавлять в блэк лист.

понедельник, 29 сентября 2008 г.

Коммандная работа

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

воскресенье, 28 сентября 2008 г.

Google Chrom

Скачал и установил дома и на работе новый браузер от Google - Chrome. Первые впечатления были весьма положительными. Из недостатков стоит отметить что на работе через проксю совершенно не работает с гуглевыми же сервисами т.к. не может пройти авторизацию ,так же постоянно что то шуршит винтом. Достоинства же вполне заметны - быстр и занимает мало памяти (особенно это актуально на моей домашней машине где ее всего 128М). Надеюсь на дальнейшее развитие.
Скачал его исходные коды и почитал про методики его разработки ,постараюсь как-нибудь описать свой впечатления.
В любом случае поднять новый браузер так быстро это большая заслуга.

суббота, 27 сентября 2008 г.

Google Android

После того как Palm OS по сути говоря скончалась, а Windows Mobile как то мне не приглянулся, приглядываюсь к анонсам операционной системы для мобильников от Google - Android. Совсем недавно вышло первое устройство на ее основе и я решил что пришло время не только посмотреть красивые ролики, но и пощупать руками, пока правда лишь виртуально. Пользуясь инструкцией на сайте я скачал SDK и поставил IDE Eclipse. Что либо написать пока не успел ,но зато поглядел эмулятор входящий в SDK. Пока нравится. Нравится хотя бы идеологией выполнения программ сходной с Palm OS т.е. отсутствием толпы запущенных приложений, по словам мудрых коллег подобная же идеология применена в IPhone.

четверг, 3 июля 2008 г.

Опыт

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

среда, 2 июля 2008 г.

Добавление митинга в MeetingWorkspace

Появилась необходимость создавать митинги используя SharePoint Object Model (SOM). В MSDN для этого существует ф-я SPMeeting.Add, с совершенно невразумительным прототипом принимающим все параметры в виде строчек (будь то числа ,GUID или даты). При попытке ее использовать вот в таком варианте:

static void Main(string[] args)
{
SPSite oSite = new SPSite("http://mmsp7");
SPWeb webRootWeb = oSite.RootWeb;
SPWeb Web = webRootWeb;
string weburl = "tmeet";
SPWeb MettWeb = null;
MettWeb = Web.Webs[weburl];

var MettInf = SPMeeting.GetMeetingInformation(MettWeb);
short mettcount =0;

var StartDate = DateTime.Now;
StartDate.AddDays(15);

var EndDate = DateTime.Now;
EndDate.AddDays(17);

int res = MettInf.Add(
null,
System.Guid.NewGuid().ToString(),
0,
DateTime.Now.ToString(),
"New Meetin",
"Room 5",
StartDate.ToString(),
EndDate.ToString(),
false,
out mettcount);
}


Я неизменно получал исключение вида:
Unhandled Exception: System.ArgumentException: Value does not fall within the ex pected range.
at Microsoft.SharePoint.Library.SPRequestInternalClass.AddMeeting(...


При этом создать тот же самый митинг используя ф-ию WebService Meetings.AddMeeting получалось без проблем:
static void Main(string[] args)
{
ICredentials cred = new NetworkCredential("Administrator", "1", "VELASKEC");

var meetingsWs  = new Meeting.Meetings();
meetingsWs.Credentials = cred;
meetingsWs.Url =  @"http://mmsp7/tmeet/_vti_bin/meetings.asmx";

var StartDate = DateTime.Now;
StartDate.AddDays(5);

var EndDate = DateTime.Now;
EndDate.AddDays(7);

meetingsWs.AddMeeting(
"",
System.Guid.NewGuid().ToString(),
0,
DateTime.Now.ToUniversalTime(),
"New Meetin",
"Room 5",
StartDate.ToUniversalTime(),
EndDate.ToUniversalTime(),
false);
}


C точки зрения логики ясно что ф-я AddMeeting вызывает внутри себя SPMeeting.Add ,а следовательно ф-я Add в принципе как то должна работать. Поиски в инете никаких результатов не дали , такое ощущение что с этой ф-ей никто ещё вообще не работал.

Когда уже руки опускались пришла идея посмотреть с помощью Reflector for .NET библиотеки самого веб сервиса и там нашелся вот такой вот замечательный вызов:
public SoapXml.SoapXmlElement AddMeeting(string organizerEmail, string uid, uint sequence, DateTime dateStamp, string title, string location, DateTime dateStart, DateTime dateEnd, bool nonGregorian)
{
SoapXml.SoapXmlElement element = this.AddMeetingCore(organizerEmail, null, uid, sequence, this.DateToISO8601BasicDATE(dateStamp), title, location, this.DateToISO8601BasicDATE(dateStart), this.DateToISO8601BasicDATE(dateEnd), nonGregorian);
return element;
}





четко видно что перед передачей дат в функцию они подвергаются конвертации с помощью ф-ии DateToISO8601BasicDATE. В ней как оказалось и кроется вся соль.
После изменения кода вот так ,все замечательно заработало :
static private string DateToISO8601BasicDATE(DateTime dt)
{
string format = "yyyyMMdd'T'HHmmss'Z'";
return dt.ToUniversalTime().ToString(format, DateTimeFormatInfo.InvariantInfo);
}

static void Main(string[] args)
{
SPSite oSite = new SPSite("http://mmsp7");
SPWeb webRootWeb = oSite.RootWeb;
SPWeb Web = webRootWeb;
string weburl = "tmeet";
SPWeb MettWeb = null;
MettWeb = Web.Webs[weburl];

var MettInf = SPMeeting.GetMeetingInformation(MettWeb);
short mettcount =0;

var StartDate = DateTime.Now;
StartDate.AddDays(15);

var EndDate = DateTime.Now;
EndDate.AddDays(17);

int res = MettInf.Add(
null,
System.Guid.NewGuid().ToString(),
0,
DateToISO8601BasicDATE(DateTime.Now),
"New Meetin",
"Room 5",
DateToISO8601BasicDATE(StartDate ),
DateToISO8601BasicDATE(EndDate),
false,
out mettcount);
}





Заметьте внутри ф-ии уже осуществляется конвертация в UTC так что дополнительно конвертировать не надо.

В результате всего этого остается только вопрос к MS зачем было так все усложнять и почему нельзя было хотя бы описать это в MSDN.

пятница, 27 июня 2008 г.

Мотивация разработчиков

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

Приведу наш пример, мы занимаемся разработкой программного обеспечения в одной крупной американской компании. Изначально процесс работы был построен так что разработчики находились очень далеко от пользователей , т.е. были люди которые проверяли наш продукт (тестеры) , люди которые писали нам что делать (product managment), команда осуществляющая продажи и команда обеспечивающая поддержку. При этом как не трудно заметить разработчики были окружены огромным бюрократическим аппаратом закрывающим их от любых недовольств с любой стороны. Если разработчикам говорили что они что то не так сделали то ответ чаще всего был "нам так поставили задачу" , если находили баги то виноваты были тестеры , если продукт не зарабатывал денег то продавцы или те кто его придумал. Разработчики же всегда были "белыми и пушистыми".

В результате ряда течении у нас не стало тестеров , и мы сами начали заниматься автоматизацией тестирования , как то в рамках TDD так и используя механизмы автоматического приемочного тестирования (FitNesse). Так же пропали люди которые принимали на себя удар пользователей , и каждый в команде вынужден был лично общаться с покупателями, разбираться с трудностями и решать их.

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

воскресенье, 22 июня 2008 г.

Вставка фрагментов исходного кода в блог

Частенько возникает необходимость вставить в блог тот или иной исходник или фрагмент конфигурационного фаила , причем функционал станадртных тегов code и pre явно недостаточне ибо теряет всякую возможность подсветки.
После некоторых поисков в инете и подсказок коллег нашел вот такой вот сервис Syntax Colorizer который позволяет делать вот такие вот вставочки:

public void Write(params object[] objs)
{
if (objs == null) return;
string result;
if (objs.Length > 1 &&
objs[0] is string &&
(objs[0] as string).Contains("{0}"))
{
object[] args = cutFirstArg(objs);
result=string.Format((objs[0] as string), args);
}
else
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < objs.Length; i++)
{
object obj = objs[i];
if (obj != null)
{
sb.Append(obj.ToString().Trim()).Append(' ');
}
}
result = sb.ToString();
}
lock (logSyncRoot)
{
Out(result.Trim());
}
}

суббота, 21 июня 2008 г.

Google Docs

Последнее время я сильно увлекся продуктами Google в частности хочу отметить удобство сервиса Google Docs с помощью которого можно быстро и удобно хранить простенькие таблички и документы при этом имея к ним доступ с любого компьютера в независимости от наличия офиса и Windows вообще.
Омрачает немного лишь то что сервис этот работает не со всеми браузерами , в частности не работает с оперой.
Мне кажется что идея переноса рабочего пространства в интернет в скором времени станет очень популярной и домашние компьютеры начнут превращаться в терминалы имеющие в своем распоряжении лишь браузер с помощью которого можно будет подключаться к своим ресурсам и работать.

четверг, 19 июня 2008 г.

Opera 9.5

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

четверг, 29 мая 2008 г.

Ubuntu 8.04 desktop

Товарищи разрекламировали новый дистрибутив Ubuntu. Решил поставить на виртуальную машинку. Был приятно удивлен очень простым интуитивно понятным и полностью русифицированным сетапом. Дальше пока посмотреть не успел.

среда, 28 мая 2008 г.

Первый опыт работы WPF

Последнее время у нас в конторе наблюдается тотальное увлечение WPF. Я тоже решил с ним познакомится.
Для начала поставил себе задачу отобразить простейшее дерево созданное из вот таких вот структурок:

public class SPObject
{
public string Title{get;set;}
public Guid ID {get;set;}
public List Childs = new List();
}

я нашел даже пример того как это делается ,но как я не бился у меня это не работало. Я просто получал окно где отображался лишь первый уровень дерева.

Вот XML которым я это описал

<Window x:Class="WPF_FirstProject.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:WPF_FirstProject"
Title="Main window" Height="300" Width="300" Loaded="Window_Loaded">
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type src:SPObject}" ItemsSource="{Binding Path=Childs}">
<TextBlock Margin="10,0,10,0" Text="{Binding Title}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView Name="SPTreeView">
<TreeViewItem ItemsSource="{Binding Path=Childs}" Header="{Binding Title}"> </TreeViewItem>
</TreeView>
</Grid>
</Window>


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


public class SPObject
{
public string Title{get;set;}
public Guid ID {get;set;}
public List Childs { get; set; }
}


Очень не очевидная особенность WPF. :(

вторник, 27 мая 2008 г.

WordPress-блог на XP

Заинтересовала меня CMS система для организации блога - WordPress. В частности то что на ней можно быстро поднять достаточно навороченный блог. Интерес это возник у меня после того как я стал обращать внимание на тенденцию ухода блогов с общих ресурсов типа ЖЖ в индивидуальные. Кстати многие хостеры приспособились к этому и уже предлагают пользователям тарифы с предустановленными CMS и в частности с WordPress.
Прежде всего мне хотелось посмотреть самому этот WordPress с точки зрения его настроек и возможностей ,но меня пугало то что для его установки нужна Linux-машина, которой у меня под рукой нет. Но как оказалось существует способ поднять WordPress и на WinXP. Делается это с помощью установки простенького набора XAMPP который содержит Apache, MySQL, PHP , Perl etc. Занимает он всего 18М и ставится на XP за каких-то пару минут без всяких хитростей. После этого на него так же легко распаковывается дистрибутив WordPress и через 5 минут получается локальный, полностью рабочий блог.