воскресенье, августа 14, 2016

Ubuntu 16.04.1 LTS

Я уже около двух лет сижу на Ubuntu 14.04. Система мне нравится, пользоваться удобно. Примерно неделю назад получил оповещение о доступности релиза 16.04.1, и позавчера, наконец, обновился на новую версию. Обновление длилось около 8 часов. Трафика, в моём случае, потребовалось примерно 2.7Gb. Всё прошло гладко.

После обновления:

0. Пришлось проверить все сторонние репозитории подключенные к APT на предмет поддержки новой версии. Тут ясно, без этого никуда.

1. Начал отваливаться Wi-Fi. Выяснил, что дело в управлении энергосбережением сетевого адаптера - он перестал просыпаться. Вылечилось отключением энергосбережения для Wi-Fi.

2. Явно изменился рендеринг шрифтов. Шрифт Ubuntu Mono 11, используемый мною в терминале, стал выглядеть слишком широким. Пробовал использовать шрифты из версии 14.04 - не помогло. Заменил его на Hack 9 (версия 2.010. Текущая версия 2.020, но он выглядит немного приплюснутым). Этот же шрифт я использую и в Delphi IDE.

3. Новый Software Center не понравился, старый был лучше, хоть и тормознее.

4. Ускорились анимации в Unity, и в целом система кажется более отзывчивой.

5. Файловый менеджер лучше справляется с большим количеством файлов в директориях.

6. MC, внезапно, перестал считать запятую разделителем паттернов в диалоге поиска файлов. Теперь в качестве разделителя используется символ вертикальной линии "|".

7. В том же MC появилась поддержка скинов, что позволяет подобрать цвета и оформление под себя, а также выбрать отдельное оформление для рута.

8. gnome-terminal перестал поддерживать параметр --title. Как теперь заголовок-то поменять?

9. Можно поменять положение таскбара в Unity. Впрочем, я делать этого не стал. После винды я, наконец, понял, как можно работать со скрывающимся таскбаром.

В целом я доволен и обновлением и тем как оно прошло.

пятница, марта 11, 2016

Delphi ARC такой ARC...

Проверил на Андроиде. Delphi 10 Seattle Update 1.

Procedure Run;
Var

 Proc : Procedure Of Object;

Begin

 TObj.Create('1');              // will be destroyed
 TObj.Create('2').Test;         // will be never destroyed
 Proc := TObj.Create('3').Test; // will be never destroyed

End; 


А будущий компилятор для линукса обещает быть ARC enabled по дефолту...
[RSP-13934]

вторник, марта 08, 2016

Позитивчик из стана FreePascal

Вчера появилась новость о том, что во FreePascal реализованы перегружаемые операторы класса для инициализации и финализации. Ждём скорейшего интегрирования в транк, а также возможность перегрузки оператора копирования. Ура! Кстати, запрос на аналогичную функциональность в Delphi уже 10 лет висит в QC.

четверг, ноября 06, 2014

Пространства имен. Неработающая фича Delphi.

В процессе очередного рефакторинга обнаружилось, что пространства имен в Delphi, которые для нативных дельфей стали доступны еще в Delphi 2006, если не раньше, попросту не работают. Как именно они не работают я отписал в QC#128737. А также оформил небольшой фич-риквест QC#128740. Не сочтите за труд, поддержите голосованием.

воскресенье, апреля 13, 2014

Эмуляция перегружаемых дефолтных свойств во FreePascal 2.7.1

В настоящий момент FreePascal не поддерживает перегружаемые дефолтные свойства (на что есть соответствующий запрос), поддержка которых появилась в Delphi после седьмой версии. Нельзя сказать, что это киллер-фича, но иногда она бывает очень полезной. Однако, с появлением поддержки улучшенных записей (advanced records) и перегрузки операторов появилась возможность немного сгладить этот досадный недостаток. От слов к коду:

program project1;

{$IFNDEF FPC}

{$APPTYPE CONSOLE}
{$DEFINE HAS_OVERLOADABLE_DEFAULT_PROPERTIES}

{$ELSE}

{$MODE DELPHI}

{$ENDIF}

Type

//
TContainer = Record

{$IFNDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}

Strict Private

Type

//
StringNameOrIntegerId = Record

FKind : (ikName, ikId);
FName : String;
FId : Integer;

Class Operator Implicit(Const AName : String) : StringNameOrIntegerId;
Class Operator Implicit(Const AId : Integer) : StringNameOrIntegerId;

End;
//

{$ENDIF}

Private

Function GetItemByName(Const AName : String) : TObject;
Function GetItemById(Const AId : Integer) : TObject;

{$IFNDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}

Function GetItem(Const ANameOrId : StringNameOrIntegerId) : TObject;

{$ENDIF}

Public

{$IFDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}

Property Items[Const AName : String] : TObject Read GetItemByName; Default;
Property Items[Const AId : Integer] : TObject Read GetItemById; Default;

{$ELSE}

Property Items[Const ANameOrId : StringNameOrIntegerId] : TObject Read GetItem; Default;

{$ENDIF}

End;

{$IFNDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}

{ TContainer.StringNameOrIntegerId }

//
Class Operator TContainer.StringNameOrIntegerId.Implicit(Const AName : String) : StringNameOrIntegerId;
Begin

Result.FKind := ikName;
Result.FName := AName;

End;
//

//
Class Operator TContainer.StringNameOrIntegerId.Implicit(Const AId : Integer) : StringNameOrIntegerId;
Begin

Result.FKind := ikId;
Result.FId := AId;

End;
//

{$ENDIF}

{ TContainer }

//
Function TContainer.GetItemByName(Const AName : String) : TObject;
Begin

Result := TObject(1); // stub

End;
//

//
Function TContainer.GetItemById(Const AId : Integer) : TObject;
Begin

Result := TObject(2); // stub

End;
//

{$IFNDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}

//
Function TContainer.GetItem(Const ANameOrId : StringNameOrIntegerId) : TObject;
Begin

Case ANameOrId.FKind Of

ikName : Result := GetItemByName(ANameOrId.FName);
ikId : Result := GetItemById(ANameOrId.FId);

End;

End;
//

{$ENDIF}

Var

cnt : TContainer;

begin

Assert(cnt['name'] = TObject(1));
Assert(cnt[1024] = TObject(2));

WriteLn('Overloadable default properties works fine!');
ReadLn;

end.


 



Это готовый пример который можно собрать в Delphi и FreePascal 2.7.1. Из кода видно, что проблему решает новый тип – улучшеная запись выступающий в качестве типа индекса дефолтного свойства и инкапсулирующий реальный тип индекса. Прикладной код, при этом, остается полностью совместимым с Delphi и возможной поддержкой перегружаемых дефолтных свойств во FreePascal в будущем.



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

четверг, марта 20, 2014

QPS в действии?

18 марта, баг-репорт QC#121566, которому были посвящены четыре поста “с ассемблером”, получил статус Resolved. Это, конечно, еще не Closed, но... Будем надеяться :) Хотя сам по себе факт решения проблемы довольно будничный, но не упомянуть о нем после широкой огласки было-бы несправедливо. Хочу поблагодарить всех, кто проголосовал, а также тех, кто способствовал распространению информации о данной проблеме. Спасибо.

Напомню, что в обновленной дорожной карте RAD Studio, Delphi and C++Builder на 2014 год, одним из пунктов декларируется QPS (Quality, Performance, Stability). Давно пора!