Spread the love

Специально для ITBlogs — НГ

Вопрос к ITBlogs — а мы будем встречаться до НГ? Обсудить, так сказать, что было, что будет, чем сердце успокоится? Или в разных заведениях уже все капитально забронировано?
Думаю, надо или на следующей неделе, или отказать.

p.s. организацию на себя не возьму, увы, но примкну обязательно.

Читать на сайте автора.

Здравствуй …, Новый Год?

В октябре я запорол статистику своего сайта в Google Analytics. Случилось это когда Yandex вдруг включил проверку на вирусы в своем «вебмастере», и из-за одной древней затесавшейся страницы с вирусом весь сайт был помечен как нежелательный к посещению.

Ситуация ужасная, потому что вот все было ок, а тут вдруг яндекс посылает, а гугл молчит, и что делать — непонятно. Я начал метаться, и поскольку уже давно не заглядывал в код страниц, мне показалось что гугловская аналитика и есть вирус (из-за слова unescape). Я ее удалил, потом восстановил, причем делал это на основных страницах, обновляемых одним шаблоном.

Через некоторое время я обнаружил, что Гугль Аналитика сообщает мне о 2-3 кратном снижении посещений сайта. Удар ниже пояса. На то чтобы догадаться о причине, ушла примерно неделя. Т.е. я связывал всю эту историю с падением посещаемости, но думал что это естественная, а не искусственная причина.
Оказалось все более чем прозаично — в том шаблоне при восстановлении кода GA я перепутал и воткнул идентификатор другого сайта. Отличие было всего в одной цифре -1 вместо -9, но гугл стал игнорировать неверную статистику.

Собственно, после исправления «циферок» все вернулось на свои места. Фух. Надо признать, что я забыл одно из основных правил «определения проблем» — если что-то пошло не так, то нужно искать, что происходило и делалось в самом начале этого «не так».

Читать на сайте автора.

Back to GPL

Буквально вчера мне прислали интересную ссылку:
«Именное лицензионное соглашение на Ubuntu Desktop»
Сильно удивившись, я начал копать, и обнаружил, что компания Инфра Ресурс продает не только лицензии, но и комплекты типа
OpenOffice.org pro Бизнес Пак (DVD, Краткое руководство, Лицензия, Наклейка).

Волшебно, не находите?
То есть, мы сделаем по образцу и подобию MS, а как там на самом деле с лицензией, проверять никто не будет. Ну и зарабатывают свою копеечку…

В реальности, GPL запрещено переводить, совершенно официально. Причем мотивация отсутствия легальных переводов — натуральный «отмаз», если не сказать хуже:

The reason the FSF does not approve these translations as officially valid is that checking them would be difficult and expensive (needing the help of bilingual lawyers in other countries)

Дорого, видите ли. Примерно 2-3 года назад я занимался этим вопросом, сделать заверенный перевод стоит примерно 200-300 баксов. То есть, мы за бесплатное ПО, поэтому денег на переводы у нас нет.

Однако, любые переводы, даже заверенные нотариально, но выполненные третьими сторонами, не имеют никакого значения (ничтожны), поскольку нет подтверждения оригинальности текста лицензии от ее инициатора. Впрочем, выше я уже сказал, что любой перевод «does not legally state the distribution terms for software that uses the GNU GPL», и должен содержать в самом начале текст, который однозначно указывает на юридическое бессилие этого перевода.

Вот еще, ГНУ/Линуксцентр тоже предлагает «именную лицензию Ubuntu 8.10 с печатью и подписью (такую лицензию вы сможете предъявить проверяющим органам в случае осуществления ими проверки лицензионности ПО)«.
Какую лицензию, с чьей печатью и подписью? Кто видел, сообщите, пожалуйста.
Если имеется в виду вот это, то при всем моем уважении к ЛинуксЦентру это филькина грамота (в части «лицензии на ubuntu).

Ну и, на закуску, напомню что с лицензиями на MySQL все так же плохо: или GPL с требованием открыть исходники, или покупать платную закрытую лицензию. Я это к тому, что сегодня мне прислали ссылку на поставщика системы на MySQL, который ставит клиентам бесплатный MySQL вместе со своей системой, напропалую. А ведь совершенно однозначно написано:
OEMs, ISVs and VARs that want the benefits of embedding commercial binaries of MySQL software in their commercial applications but do not want to be subject to the GPL and do not want to release the source code for their proprietary applications should purchase a commercial license from Sun.
http://www.mysql.com/about/legal/licensing/oem/#3

Читать на сайте автора.

Вебинар — зачем он нужен?

Интернет в регионах становится все быстрее и дешевле. И правда, если 2 года назад в Калуге безлимитных тарифов не было, то сейчас мегабитный безлимит стоит 750 руб в месяц, а год назад 900 рублей стоил безлимит 128к.

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

В пятницу мы провели тестовый вебинар на 20 минут, через Microsoft Live Meeting. Вышло неплохо. После вебинара на форуме пошла дискуссия, в какое время лучше организовывать такие мероприятия, и вообще.

И тут меня посетила мысль. А зачем вообще делать вебинар (вместо семинара)? Ведь можно записать (!) материал в любом формате, отредактировать его (!), и выложить хоть на ютуб.

Вернее, так: вебинары вместо семинаров мне кажутся бессмысленными. То есть, вебинары вполне имеют смысл, когда группе людей нужно обменяться мнениями, например, это может быть общение головной фирмы с филиалами, или общение фирмы с партнерами, и т.п. Ну а если аудитория вебинара превышает 20-30 человек? Ведь вебинар имеет определенные неудобства, даже в отношении очного семинара:

  • докладчик все равно должен в конкретное время все показать и рассказать, точно так же как на очном семинаре
  • слушатель не «привязан» посещением очного семинара, поэтому может легко сорваться с места, и не участвовать в вебинаре (по разным причинам, включая разницу во времени)
  • «рулить» вопросами «из зала» очень тяжело, т.к. управление микрофонами на вебинаре сложнее, чем на очном семинаре
  • из-за специфики конкретного канала звук докладчика у слушателя может быть плохим

И при всем этом большинство вебинаров можно просмотреть в записи после их проведения.
Так может проще записать мероприятие, и сразу выложить его для всеобщего доступа, не «проводя»?

Вот смотрите, обычный семинар преследует ряд целей:

  1. привлечь внимание аудитории и медиа
  2. собрать N слушателей
  3. дать возможность слушателям общаться с докладчиком и между собой

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

В проведении вебинара есть пункты 1 и 2, а пункт 3 или отсутствует или сильно ограничен. Кроме того, если после вебинара доступна запись, то на него совершенно «необязательно ходить».

В общем, пока я вижу вебинар как некий «суррогат», или даже если хотите, трансляцию стереотипа обычных семинаров в интернет. Но если вебинар не проводить, то тогда получается, что пропадает событие как таковое — ведь не будут же СМИ сообщать, что «компания X выложила новый ролик про свой продукт N на сайте»?

Читать на сайте автора.

Очень мне понравилось работать с таким замечательным компонентом, как Fast Report!
Задача — дать возможность пользователям визуально настроить внешний вид чека, печатаемого на кассовом аппарате. И чтобы можно было использовать выражения
и запросы к БД. Решил проблему за 2 часа!
Производится настройка путем создания отчетной формы Fast Report, в поля которого занесены команды управления фискальным регистратором. Применение такого способа позволяет очень гибко настроить внешний вид чека, а так же производить вычисления арифметических и логических выражений прямо в форме.
При печати в отчетную форму передаются данные текущего чека. После формирования отчета вывод его на экран не производится, а делается экспорт отчета в текстовый файл во временный каталог. После этого файл обрабатываются программой печати чека с разбором введенных команд, вычисленных выражений и формата строк.

Применение tagged values в БД

   Применение стандартных методов проектирования баз данных не всегда удовлетворяет запросы программиста. Одно из ограничений – невозможность изменить набор атрибутов объекта после создания БД, что, при постоянно изменяемых требованиях заказчика, приводит к необходимости менять структуру БД (не потеряв при этом введенные данные), менять и заново отлаживать код программы, поля ввода/редактирования и т.д.
   Вашему вниманию предлагается один из способов решения этой проблемы — применение tagged values (TV , тэг-значений, или именованных значений).  
Сами значения хранятся в БД в строковом формате, но могут интерпретироваться в приложении по-разному, в зависимости от заданного типа значения. Аналог – всем известные ini-files! Основное преимущество применения TV – это возможность расширения списка значений в процессе исполнения приложения, без изменения структуры БД!
(image placeholder)

Список тэг-значений хранятся в таблице TaggedValue.

  • DefaultValue – это значение будет использоваться, если не задано действующее значение.
  • DefaultValueAlias – соответственно, значение для локализации.
  • ValueType – тип значения. Кроме стандартных типов, можно использовать свои, все зависит от фантазии разработчика. В зависимости от типа значения выбирается встроенный редактор значений. Например, для типа «OCL» используется редактор OCL-выражений. Для перечислимого типа производится выбор значений, которые хранятся в таблице TV_ValueSet. Возможен выбор из списка объектов БД – тогда надо задать ValuesListName.
  • Hint – подсказка при выборе/редактировании значения.
  • HintAlias – локализованная подсказка.
  • IsReadOnly – ну, это понятно.
  • ValuesListName – название класса объектов, из списка значений которых будет производиться выбор. Например «City», и тогда будет предложен выбор из списка ClassByExpressionName(‘City’).

   Список значений для набора объектов – в таблице TV_ValueSet. Например, для логического типа можно задать значения «True/False», а возможно и «Можно/Нельзя».
  Сами значения TV хранятся в таблице TV_Value. StringValue – действительное значение, значение, StringValueAlias – то, которое используется для локализации программы (или для показа юзеру ().

(image placeholder)

Для того, чтобы подключить к объекту тэг-значения, нужно создать ассоциацию типа n-n – OverridenTagedValues. Вся прелесть в том, что таким образом хранятся только переопределенные значения! Если нет значения – будет использоваться значение по-умолчанию! Классом такой ассоциации будет TV_Value, то есть, экземпляр класса – тэг-значение будет создан только при действительном вводе информации! Если грамотно подобрать умолчания, можно существенно сэкономить на размере БД!

Программная реализация.

Эта функция возвращает действующее тэг-значение по его имени. Если значение не было переопределено – возвращается значение по умолчанию.

function TMetaActorProperty.ActualValueByName(Tag: String): String;
var
  _TaggedValue:TTaggedValue;
  _TV_Value:TTV_Value;
begin
  _TaggedValue:=Self.TaggedValues.EvaluateExpressionAsDirectElement(‘self->select(name=’+QuotedStr(Tag)+’)->first’) as TTaggedValue;
  if Self.OverridenTaggedValues.Includes(_TaggedValue) then begin
    _TV_Value:=Self.TV_Value.BoldObjects[Self.OverridenTaggedValues.IndexOf(_TaggedValue)];
    Result:=_TV_Value.StringValue;
  end
  else
    Result:=Self.TaggedValues.EvaluateExpressionAsString(‘self->select(name=’+QuotedStr(Tag)+’)->first.defaultValue’, 1);
end;

Эта процедура устанавливает тэг-значение.

procedure TMetaActorProperty.SetTVByName(Tag: String; Value: String);
var
  _TaggedValue:TTaggedValue;
  _TV_Value:TTV_Value;
  Overriden: Boolean;
begin
  _TaggedValue:=LocateInList(Self.TaggedValues, ‘name’, Tag) as TTaggedValue;
  if not Assigned(_TaggedValue) then begin
     MsgError(Self.Name+’: Not found TV=’+Tag);
     Exit;
  end;  
  Overriden:=Self.OverridenTaggedValues.Includes(_TaggedValue);
  if Overriden then begin //Ранее было переопределено
    _TV_Value:=           //Найдем переопределенное значение
      Self.TV_Value.BoldObjects[Self.OverridenTaggedValues.IndexOf(_TaggedValue)];
    if (Value=_TaggedValue.DefaultValue) then //Если ввели значение по умолчанию — удалим переопределенное
       Self.OverridenTaggedValues.Remove(_TaggedValue)
    else  //Ранее было переопределено и изменили значение
      _TV_Value.StringValue:=Value;
  end
  else   //Ранее было по умолчанию
  begin
    Assert(Assigned(_TaggedValue), ‘SetTVByName’);
    Self.OverridenTaggedValues.Add(_TaggedValue);
    _TV_Value:=           //Найдем переопределенное значение
      Self.TV_Value.BoldObjects[Self.OverridenTaggedValues.IndexOf(_TaggedValue)];
    _TV_Value.StringValue:=Value;
  end;
end;

Функция дает список подключенных тэг-значений.

function TMetaActorProperty.TaggedValues: TTaggedValueList;  //Find TaggedValueList
var
  expr: string;
begin
  Result:=nil;
  if not Assigned(Self) then Exit;
  expr:=’TV_Section.allInstances->select(name=’+QuotedStr(Self.MetaClassName)+’)->first.taggedValues’;
  Result:=TBoldSystem.DefaultSystem.EvaluateExpressionAsDirectElement(expr)as TTaggedValueList;
end;

Такие тэг-значения удобны для сохранения в БД настроек программы, быстрого создания прототипов проекта для согласования с заказчиком и добавления/изменения атрибутов на «лету» (в дальнейшем, после обкатки приложения, легко все оформить в виде «настоящих» атрибутов).

Для  создания/редактирования тэг-значений применяется редактор на основе компонента TCommonInspector из пакета Greatis — http://www.greatis.com.

Работа с мультимедийным таймером на Win API

Читать на сайте автора.

Построение графиков с использованием компонента gl.ocx

Читать на сайте автора.

Работа с таймером на Win API

Читать на сайте автора.

Работа со шрифтами на Win API

Читать на сайте автора.