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

Offtopic. Offtopic. О "пропаганде"

Киселёв тут "брякнул" безответственное "Украинской армии больше нет"... Как когда-то он "брякнул", не менее безответственное "Майдана больше нет"...
И там же он "брякнул" - "у украинской армии ничего не ездит и ничего не стреляет"...
А потом дал сюжет о "ковровых бомбардировках и артиллерийских обстрелах"...
Хочется спросить - "если ничего не ездит и не стреляет, то что наносило бомбарировки и артобстрелы"....
Нет.. Я конечно - "патриот".. Если не "ура-патриот", то "эхблин-патриот" - уж точно, но против логики - сложно идти...
Так "стреляет" или "не стреляет"?

Журнализды блин...

P.S. Скажете - "а Путин мол".. Отвечу - вы слушали Пескова? Он ведь ПРЯМО сказал - "Россия не сторона конфликта и НЕ МОЖЕТ давать ОБЕЩАНИЯ". ЧЁТКО и ЯСНО.И грамотно.
А вот журнализды...
И ещё.. "Наёмничество"... Оно ведь в УК прописано "в соответствии с международными нормами"... И там про"добровольцев" и "деньги" - слов нету... Есть только про то, что "не являются гражданами одной из противоборствующих сторон"...
Т.е. всех добровольцев Россия теоретически может потом "посадить"?
Или как?
Или воспринимать тот факт, что "статью за наёмничество" не отменили в спешном порядке - как "доказательство того", что Россия к участию в конфликте не готовилась?

Хотя нет - http://www.zakonrf.info/uk/359/ - "1. Вербовка, обучение, финансирование или иное материальное обеспечение наемника, а равно его использование в вооруженном конфликте или военных действиях -

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

2. Те же деяния, совершенные лицом с использованием своего служебного положения или в отношении несовершеннолетнего, -

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

3. Участие наемника в вооруженном конфликте или военных действиях -

наказывается лишением свободы на срок от трех до семи лет с ограничением свободы на срок до одного года либо без такового.

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


И в родном гаранте посмотрел (http://ivo.garant.ru/SESSION/PILOT/main.htm) - там - ТАКОЙ ЖЕ текст.

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


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

И ещё вопрос - если Киселёв говорит, что "у украинцев ничего не ездит и не стреляет", а "у ополченцев всё ездит и стреляет" - это означает, что у "украинцев руки из жопы, а у ополченцев - из правильного места"? Или это означает, что "ополченцам кто-то помогает"? У меня вот лично - только такие варианты.. А у вас? Журнализды.. такие журнализды.. они думают "что говорят"? Или это такая "игра"?

Нет.. я конечно - ватник... и "эхблин-патриот"... но всё же.. Где логика?

Так "ездит и стреляет" или НЕ "ездит и НЕ стреляет"?

P.P.S. https://www.facebook.com/vladimir.pereverzin/posts/543942309068644?fref=nf - вот так и делается "пропаганда" - человек "забыл" или "не захотел" опубликовать ПРИМЕЧАНИЕ. Ну или я что-то не так понял...

Черновик. Коротко. Для себя

Черновик. Коротко. Для себя.

Про переделку IStorage

1. (done) Перенести Lock/Unlock в HeaderData.

2. Лочить HeaderData в конструкторе/деструкторе ТОЛЬКО если открываем НА ЗАПИСЬ.

3. Во всех остальных Read/Write лочить только непосредственно при "доступе к диску". Вложенно. Со счётчиком f_Lock.

4. Избавиться от aNeedLock. Заменить его на фабрику HeaderData, где параметром является aPosition. С владением HeaderData->HeaderDataFactory и Subscibe/Unsubscribe. Чтобы не держать РОДИТЕЛЬСКИЙ IStorage ЛИШНЕЕ ВРЕМЯ.

5. Проверить стратегию MainStorage и GetVersionsStorage. Если УЖЕ что-то открыто на ЗАПИСЬ,а мы хотим на ЧТЕНИЕ, то и это нам подходит.

6. Проверить Tm3StorageIndexStream на предмет Access. Если Storage требует только Read (а не Create/Delete), то открывать Tm3StorageIndexStream на ЧТЕНИЕ и не более того.

7. Проверять в Tm3Storage.Create данные Access vs. FRootStream.Access. Чтобы не открыли на ReadWrite поверх FRootStream. который открыт на ТОЛЬКО Read.

8. (done) Писать Lock/Unlock в log-файлы рядом с хранилищем - *.stg.log, *.sav.log, *_bkp.sav.log. С именем станции (ComputerName) и именем приложения (ParamStr(0)). Чтобы можно было "читать глазами", когда вдруг получаем Lock Violation.

9. Писать данные HeaderData НЕПОСРЕДСТВЕННО в методах pm_SetXXX. Чтобы не было рассинхронизации данных.

10. (done) Унаследовать RootStreamManager и HeaderData от "примеси" с Losk/Unlock. И защищать FRootStream и Data.

11. НУ и конечно же -ДОУБРАТЬ ВСЕ with из m3StgCla.

Я вот перечитываю то, что написал выше и ОДИН только вопрос меня тревожит - "как это всё работало 15 лет +". Наверное "вероятность попадания в ошибочную ветку - очень маленькая". Эх. Посчитать бы вероятность.

пятница, 5 сентября 2014 г.

Коротко. О солидных и кусочных решениях

По мотивам:

О расширенном делегировании
Расширенное делегирование: Протокол освобождения объекта и контроль ссылок

Не считайте критикой. Считайте "заметками на полях".

Это мне напоминает вот что:

О собственных фреймворках

"Я тоже когда-то шёл по пути универсальных решений".

Я пытался использовать ОДНИ "кошерные" строки. Один "кошерный" класс с итератором и т.д. и т.п.

Один "кошерный" базовый класс.

А потом в какой-то момент понял, что универсальных решений не бывает.

А бывает - "множество мелких решений" собранных по"Це из Эн по Ка".

И тогда я начал "делить код на мелкие кирпичики", а потом "собирать из кирпичиков нужное".

Вот ссылки:

Коротко. И ещё о фабриках
Собственная реализация IUnknown и подсчёт ссылок. И примеси
Generic'и без Generic'ов....
Абстрактные контейнеры

Т.е. я не делаю "расширенное делегирование" для ВСЕХ классов или "не задумываюсь о протоколе освобождения ссылок" вообще.

Я делаю множество "решений" в духе АОП.

Делаю всякие разные реализации Publisher/Subscriber, Changing/Changed, Refcounted, FactoryMethod, Visitor, Facade и т.д. и т.п.

А потом из "этих кирпичиков" собираю то, что нужно.

Я стараюсь делать классы и примеси - максимально короткими и "непохожими на швейцарский нож".

"Швейцарские ножи" я делаю уже как "комбинацию классов и примесей".

Я не использую "универсальные" решения, а использую, конкретные, собранные из "кирпичиков".

Возможно кому-то это будет интересно.

А вообще - "на вкус и цвет" - конечно "все фломастеры разные".

четверг, 4 сентября 2014 г.

Коротко. И ещё о фабриках

По мотивам:

Коротко. Ещё о фабриках

Я там писал - "фабрики, скажем так - это "полиморфизм в квадрате"".

Так вот.

Я сегодня сделал "полиморфизм в кубе".

Как?

Сделал "фабрику фабрик".

Примерно так:

type
 TSomeDataToDecide = record
  ...
 end;//TSomeDataToDecide

 TUsedBaseClass = class abstract (TObject)
  public
   constructor Create(const aSomeDataToDecide: TSomeDataToDecide);
 end;//TUsedBaseClass

 RUsedBaseClass = class of TUsedBaseClass;

 TUsedImpl1 = class(TBaseClass)
 end;//TUsedImpl1

 TUsedImpl2 = class(TBaseClass)
 end;//TUsedImpl2

 TBaseClass = class abstract (TObject)
  private
   f_Used : TUsedBaseClass;
  public
   constructor Create(aUsed: RUsedBaseClass; const aSomeDataToDecide: TSomeDataToDecide);
 end;//TBaseClass

 TImpl1 = class(TBaseClass)
 end;//TImpl1

 TImpl2 = class(TBaseClass)
 end;//TImpl2

 TBaseClassFactory = class abstract (TObject)
  public
   class function Make(aUsed: RUsedBaseClass; const aSomeDataToDecide: TSomeDataToDecide): TBaseClass; virtual; abstract;
 end;//TBaseClassFactory

 RBaseClassFactory = class of TBaseClassFactory;

 TFactory1 = class(TBaseClassFactory)
  public
   class function Make(aUsed: RUsedBaseClass; const aSomeDataToDecide: TSomeDataToDecide): TBaseClass; override;
 end;//TFactory1

 TFactory2 = class(TBaseClassFactory)
  public
   class function Make(aUsed: RUsedBaseClass; const aSomeDataToDecide: TSomeDataToDecide): TBaseClass; override;
 end;//TFactory2

 TBaseClassFactoryFactory = class abstract (TObject)
  public
   class function Make(const aSomeDataToDecide: TSomeDataToDecide): RBaseClassFactory; virtual; abstract;
   class function Used(const aSomeDataToDecide: TSomeDataToDecide): RUsedBaseClass; virtual; abstract;
 end;//TBaseClassFactoryFactory

 RBaseClassFactoryFactory = class of TBaseClassFactoryFactory;

 TFactoryFactory1 = class (TObject)
  public
   class function Make(const aSomeDataToDecide: TSomeDataToDecide): RBaseClassFactory; override;
 end;//T1FactoryFactory1

 TFactoryFactory2 = class (TObject)
  public
   class function Make(const aSomeDataToDecide: TSomeDataToDecide): RBaseClassFactory; override;
 end;//T1FactoryFactory2

...

constructor TBaseClass.Create(aUsed: RUsedBaseClass; const aSomeDataToDecide: TSomeDataToDecide);
begin
 f_Used := aUsed.Create(aSomeDataToDecide);
 ...
end;

...
 
class function TFactory1.Make(aUsed: RUsedBaseClass; const aSomeDataToDecide: TSomeDataToDecide): TBaseClass;
begin
 if SomeCondition(aSomeDataToDecide) then
  Result := TImpl1.Create(aUsed, aSomeDataToDecide)
 else
 if SomeOtherCondition(aSomeDataToDecide) then
  Result := TImpl2.Create(aUsed, aSomeDataToDecide)
 else
 begin
  Assert(false);
  Result := nil;
 end;
end;

class function TFactory2.Make(aUsed: RUsedBaseClass; const aSomeDataToDecide: TSomeDataToDecide): TBaseClass;
begin
 if SomeCondition(aSomeDataToDecide) then
  Result := TImpl2.Create(aUsed, aSomeDataToDecide)
 else
 if SomeOtherCondition(aSomeDataToDecide) then
  Result := TImpl1.Create(aUsed, aSomeDataToDecide)
 else
 begin
  Assert(false);
  Result := nil;
 end;
end;

...

class function TFactoryFactory1.Make(const aSomeDataToDecide: TSomeDataToDecide): RBaseClassFactory;
begin
 if SomeCondition(aSomeDataToDecide) then
  Result := TFactory1
 else
 if SomeOtherCondition(aSomeDataToDecide) then
  Result := TFactory2
 else
 begin
  Assert(false);
  Result := nil;
 end;
end;

...

class function TFactoryFactory2.Make(const aSomeDataToDecide: TSomeDataToDecide): RBaseClassFactory;
begin
 if SomeCondition(aSomeDataToDecide) then
  Result := TFactory2
 else
 if SomeOtherCondition(aSomeDataToDecide) then
  Result := TFactory1
 else
 begin
  Assert(false);
  Result := nil;
 end;
end;

...
var
 l_FF : RBaseClassFactoryFactory;
 l_BC : TBaseClass;
 l_SD : TSomeDataToDecide;
begin
 ...
 l_SD := TSomeDataToDecide.Create(SomeParams);
 ...
 if SomeCondition(l_SD) then
  l_FF := TFactoryFactory1
 else
 if SomeOtherCondition(l_SD) then
  l_FF := TFactoryFactory2
 else
 begin
  Assert(false);
  l_FF := nil;
 end;
 l_BC := l_FF.Make(l_SD).Make(l_FF.Used(l_SD), l_SD);
 try
  ...
 finally
  FreeAndNil(l_BC):
 end;//try..finally
end;

Зачем всё это? Чтобы охватить "Це из Эн по Ка".

Для меня лично - всё вокруг реализации IStorage вертится.

Там есть блоки "такой системы" и блоки "другой системы". А ещё есть "блоки в заголовком" и "блоки без заголовка". А ещё есть блоки "такого размера" и есть "блоки другого размера".

Вот там и возникает "Це из Эн по Ка". Которая решается "фабриками фабрик".

Может быть кому-нибудь мысль понравится.

P.S. Понятно, что тут всё "не так линейно". Конечно в реале появляются "циклы" и "списки фабрик". Особенно там где написано SomeConditionXXX.

Могу и про это детально написать. Если вдруг интересно.

Реальный пример (а не "коня в вакууме") - я тоже постараюсь описать.

Но пока может быть кому-то и "конь в вакууме" понравится.

Ссылка. Разработка руководства пользователя в MS Word с VBA

Offtopic. Про нас про всех...

Бывал я в 97-м, 98-м, 99-м годах в киргизско-узбекском городе Ош... И там мне ВСЕ, что "киргизы", что "узбеки" рассказывали про "резню конца восьмидесятых"... И ВСЕ с ПЕНОЙ у рта говорили, что "резня больше не повторится"... Потому что мол "нахлебались"... ВСЕ... И хотелось верить в это.. Что БОЛЬШЕ НЕ ПОВТОРИТСЯ...

Но! Прошло без малого 10-ть лет... И? Резня в Оше повторилась... С НЕМЕНЬШЕЙ жестокостью..

Я звонил тогда знакомым в Ош.. Спрашивал - "как вы там".. Мне отвечали - "беда.. катастрофа.. как мы их не удержали"...

Всего 10-ть лет прошло...

И резали другие люди...

Которые "молодые"...

Другое поколение...

Что хочу сказать?

"История учит тому, что ничему не учит"..

Вот как-то так...

Выросло "поколение" и резня началась по-новой...

Что хочется сказать?

"Люди, будьте бдительны"

http://ru.wikipedia.org/wiki/%D0%A4%D1%83%D1%87%D0%B8%D0%BA,_%D0%AE%D0%BB%D0%B8%D1%83%D1%81

"Люди, будьте доверчивы"?

http://www.bards.ru/archives/part.php?id=4082

https://ru.wikipedia.org/wiki/%D0%9E%D1%88%D1%81%D0%BA%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F_1990_%D0%B3%D0%BE%D0%B4%D0%B0

https://ru.wikipedia.org/wiki/%D0%91%D0%B5%D1%81%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%8E%D0%B3%D0%B5_%D0%9A%D0%B8%D1%80%D0%B3%D0%B8%D0%B7%D0%B8%D0%B8_(2010)

Коротко. Delphi XE7

Прислали ключ. Буду пробовать.

Update.

При запуске инсталлятора "зависание" это НОРМАЛЬНО. Попереключайте Alt-Tab И найдите окно выбора языка.