четверг, 31 июля 2014 г.

Об "авторах"

http://programmingmindstream.blogspot.ru/2014/07/vs.html?showComment=1406836507934#c2729950709432350840

Раз уж "пошло такое дело".

Назову своих "авторитетов":

1. Gunsmoker (что-то давно не пишет) - http://www.gunsmoker.ru/.
2. Сергей Тепляков - http://sergeyteplyakov.blogspot.ru/
3. Александр Бындю - http://blog.byndyu.ru/

Ну и из "классиков":

1. Джоэл Спольски - http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B8,_%D0%94%D0%B6%D0%BE%D1%8D%D0%BB
2. GoF - http://ru.wikipedia.org/wiki/Design_Patterns
3. Болье.
4. Хоор.
5. Кент Бек (выборочно) - http://ru.wikipedia.org/wiki/%D0%91%D0%B5%D0%BA,_%D0%9A%D0%B5%D0%BD%D1%82
6. Мартин Фаулер - http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D1%83%D0%BB%D0%B5%D1%80,_%D0%9C%D0%B0%D1%80%D1%82%D0%B8%D0%BD

Ну и:

http://18delphi.blogspot.ru/2013/03/blog-post_2036.html

Наверное что-то забыл, но это уже не суть.

Одно могу сказать - "наши авторы" - для меня всё равно ЦЕННЕЕ. Они как-то "больше в теме". Западные люди всё больше "про лозунги" пишут, а не про "мотивацию".

Извините.

Черновик. Как скрипты "сами себя" обрабатывают

Возникла задача - отклассифицировать тестовые скрипты про прецедентам.

Решается она более, чем просто.

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

CONST "Имя файла" 'Имя файла'

OBJECT VAR Код

Код := "Откомпилировать скрипт из файла" "Имя файла"

: "Обработать слово" OBJECT IN Слово
 Если ( Слово .Имя РАВНО Маске ) то
  ( "Вывести в набор" "Имя файла" )
 Слово "Перебрать слова и выполнить" "Обработать слово"
;

Код "Перебрать слова и выполнить" "Обработать слово"

Реальный код конечно не такой, но близок к тому. Я его скоро опубликую.

Говорят, что что-то подобное УЖЕ описано в "программисте прагматике" (http://javawebdeveloperblog.blogspot.ru/2012/01/blog-post.html).

Был бы кстати благодарен за более подробную ссылку.

Кстати оттуда же:
"Тестирование состояний, вместо тестирования только строк кода"

Вот прислали ссылку:

http://coollib.com/b/168246/read#t85

"

20 Генераторы текстов программ

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

Подсказка 29: Пишите текст программы, которая пишет текст программы

Существует два основных типа генераторов текста:
1. Пассивные генераторы текста запускаются один раз для достижения результата. Начиная с этого момента результат становится независимым – он отделяется от генератора текста. Мастера, обсуждаемые в разделе «Злые волшебники», вместе с некоторыми средствами CASE являются примерами пассивных генераторов текста.
2. Активные генераторы текста используются всякий раз, когда возникает необходимость в результатах их работы. Этот результат создается по принципу «выбросить и забыть» – он всегда может быть воспроизведен с помощью генератора текста. Зачастую активные генераторы считывают некоторую форму сценария или управляющего файла для получения конечного результата.

Пассивные генераторы

Пассивные генераторы текста экономят время, необходимое на набор текста. Как только результат получен, он становится полностью приспособленным для использования в качестве исходного файла в данном проекте; он должен быть отредактирован, скомпилирован и передан системе управления исходным текстом, как и любой другой файл. О его происхождении никто и не вспомнит. Пассивные генераторы текста применяются во многих случаях:
• Создание новых исходных файлов. Пассивный генератор текста может создавать шаблоны, директивы управления исходным текстом, сведения об авторских правах и стандартные блоки комментариев для каждого нового файла в некотором проекте. Мы настроили наши редакторы на выполнение этого действия всякий раз при создании нового файла: при редактировании новой программы на языке Java в новом буфере редактора автоматически окажутся уже заполненные блок комментариев, директива пакета и описание структурного класса.
• Осуществление двоичных преобразований в языках программирования. Мы начали писать эту книгу, используя систему troff, но после пятнадцатого раздела перешли на LaTeX. Мы написали генератор текста, который считывал исходный текст из troff и преобразовывали его в формат LATЈX. Точность составила 90 %; остальное мы делали вручную. Это является интересной особенностью пассивных генераторов текста: они не должны отличаться абсолютной точностью. Вы выбираете, какое усилие необходимо вложить в генератор, в сравнении с энергией, которую вы тратите на устранение ошибок в выходной информации.
• Создание таблиц поиска и других ресурсов, вычисление которых является дорогой операцией. Вместо того, чтобы вычислять тригонометрические функции, во многих старых графических системах использовались таблицы синусов и косинусов. Обычно эти таблицы создавались пассивным генератором текста и затем копировались в исходный текст программы.

Активные генераторы текста

Пассивные генераторы текста являются не более чем удобством, но их активные родственники являются необходимостью, если вы хотите следовать принципу DRY. С помощью активного генератора текста вы можете использовать представление некоторого фрагмента знания и преобразовать его во все формы, необходимые вашему приложению. Это не является дублированием, поскольку эти формы являются расходным материалом и создаются генератором текста по мере необходимости (отсюда термин «активный»).
Когда бы вам ни приходилось организовывать совместную работу двух совершенно разных сред, стоит подумать об использовании активных генераторов текста.
Допустим, вы разрабатываете приложение БД. В этом случае вы имеете дело с двумя средами – базой данных и языком программирования, который используется для доступа к БД. У вас есть схема, и вам необходимо определить низкоуровневые конструкции, отражающие компоновку определенных таблиц БД. Вы могли бы просто запрограммировать их напрямую, но при этом нарушается принцип DRY: знание схемы было бы выражено дважды. Если схема меняется, вам необходимо помнить и о соответствующем изменении текста программы. Если из таблицы удаляется столбец, а база текста программы не меняется, то может статься, что ошибка не проявится даже при компиляции. Первый раз вы узнаете об этом во время тестирования, когда начнутся сбои (или же от пользователя).

Рис. 3.3. Активный генератор создает текст программы из схемы базы данных
Альтернативой этому является использование активного генератора текста – берется схема и используется для генерации исходного текста конструкций, как показано на рисунке 3.3. Теперь при любом изменении схемы будет происходить и автоматическое изменение программы, используемой для доступа к ней. При удалении столбца исчезает и соответствующее поле в конструкции, и любая высокоуровневая программа, использующая этот столбец, не пройдет компиляцию. Ошибку удалось заметить во время компиляции, а не в процессе сборки. Конечно, эта схема работает только в том случае, если вы сделаете генерацию текста частью самого процесса сборки [24].
Другим примером слияния сред с помощью генераторов текста является случай, когда в одном и том же приложении использованы различные языки программирования. Для того чтобы общаться, каждой программной базе необходима некоторая общая информация – например, структуры данных, форматы сообщений и имена полей. Вместо того, чтобы дублировать эту информацию, используйте генератор текста. В ряде случаев можно проводить синтаксический анализ информации из исходных файлов на одном языке и использовать ее для генерации текста на другом. Хотя зачастую легче выразить ее более простым, независимым от языка представлением и сгенерировать программу для обоих языков, как показано на рисунке 3.4. Также можно посмотреть ответ к упражнению 13 (см. Приложение В) в качестве примера того, как отделить синтаксический анализ представления плоского файла от генерации текста.

Генераторы текста не должны быть слишком сложными

Весь этот разговор об активном «этом» и пассивном «том», может создать у вас впечатление, что генераторы текста – сложные звери. Им не надо быть сложными. Обычно самой сложной частью является синтаксический анализатор, который обрабатывает входной файл. Не усложняйте входной формат, и генератор текста станет простым. Обратите внимание на ответ к упражнению 13 (см. Приложение В): в реальности генерация текста представляет собой в основном операторы print.

Рис. 3.4. Генерирование теиста из представления, независимого от языка. Строки во входном файле, начинающиеся с буквы М, означают начало определения сообщения, буква F означает строки с определениями полей, а буква Е – конец сообщения.

Генераторы текста не всегда генерируют тексты программ

Хотя многие и примеров, приведенных в данном разделе, демонстрируют тексты программ, которые производят исходные тексты программ, на практике это не всегда так. Вы можете применять генераторы текстов для создания выходного файла в любом формате (HTML, XML, простой текст) – любого текста, который является входной информацией в какой-либо части вашего проекта.
Другие разделы, относящиеся к данной теме:
• Пороки дублирования
• Преимущество простого текста
• Злые волшебники
• Вездесущая автоматизация
Упражнения
13. Напишите генератор текста, который обрабатывает входной файл, изображенный на рисунке 3.4, и генерирует выходной файл на двух языках по вашему выбору. Попытайтесь упростить добавление новых языков. (Ответ см. в Приложении В.)"

Вот я про "это же"...

Ссылка. ОЧЕНЬ. Контракты vs. Монады?

http://sergeyteplyakov.blogspot.ru/2014/07/contracts-vs-monads.html#more

Процитирую, то, что мне ОСОБЕННО нравится:

"

Три уровня обороны

Когда мы говорим о продакшн коде статически-типизированного мейнстрим языка, у нас есть три уровня обороны, которые защищают нас от багов и делают наш код более выразительным и сопровождаемым:
  1. Система типов
  2. Контракты
  3. Юнит-тесты
Чем "выше" линия обороны, тем раньше она срабатывает и "докладывает" нам о возможной проблеме в коде. Если мы что-то можем выразить с помощью системы типов, то именно с ее помощью мы должны выражать свои намерения. Именно поэтому в С++ обязательные входные значения передаются по константной ссылке, необязательные входные значения – по константному указателю и т.п.
Аналогично, если методу для успешной работы нужен список, то обычно нет смысла приниматьobject и кастить его к списку, внося потенциальную ошибку времени исполнения.
API класса/метода должен быть таким, чтобы его легко было пользовать правильно и сложно использовать неправильно!
Но что, если мы не можем выразить что-то через систему типов (ибо она недостаточно выразительна)? Например, в языке C# мы не можем выразить, что аргумент метода ссылочного типа является обязательным, поскольку любой ссылочный тип может принимать значение null. Иногда, когда это возможно, мы можем заменить его на тип-значение (value type) и уйти от проблемы, но далеко не всегда это возможно (ну и вы же помните о проблеме изменяемых значимых типах, правда?)
Когда система типов бессильна, нам на помощь приходят контракты: инструмент, который помогает выразить наши намерения в более явном виде. Как выразить с помощью системы типов, что метод Addинтерфейса ICollection<T> может не добавлять еще один элемент, а метод Add любой реализации класса IList<T> обязана это сделать? (Помните обсуждение этого вопроса в статье "Принцип замещения Лисков и контракты"?).
Контракт располагается в самом методе и формально является частью его "сигнатуры", что делает его (метод) более описательным. При этом некоторые нарушения контрактов могут детектиться на этапе компиляции (с помощью статик-чекера, или инструментов, таких как R#), а некоторые – на этапе исполнения.
Помните о том, что код сам по себе не может быть корректным, или не корректным. Понятие корректности (т.е. наличие ошибки в коде) возможен лишь при наличии намерений этого кода (известного в быту под названием "спецификация", которая может быть формальной или неформальной).
Контракты по своей природе тоже не могут выразить все тонкости ожидаемого поведения. Когда их выразительности становится недостаточно, нам на помощь приходит следующая линия обороны – юнит-тесты. Так, например, в контрактах невозможно выразить, что третьим числом Фибоначчи будет 2, или что при вызове метода Save вью-модели будет вызван метод SaveEmployee нашего сервиса.
Тест еще сильнее отдален от кода, ведь он находится во внешней сборке, так что его связь с продашкн кода становится менее очевидной, а время обнаружения ошибки увеличивается со времени компиляции до времени запуска тестов. При этом роль тестов пересекается с ролью контрактов: тесты также выражают ожидаемое поведение, несоответствие которому говорит о наличии в коде багов (или же говорит об изменении ожидаемого поведения, которое еще не было отражено в тесте)."

и ЕЩЁ:

"Наши инструменты не должны скрывать ошибки, а должны следовать идиоме Fail Fast и бросать исключения, или прерывать исполнение как можно раньше (помните, нарушение контрактов может вести себя аналогично нарушению Debug.Assert!).
Почему нужно следовать идиоме Fail Fast? Чтобы избавиться от того самого эффекта бабочки, когда изменение в одной части системы проявится на несколько слоев ниже, или на несколько модулей правее, от места возникновения ошибки! (Мы просто будем сидеть и думать, а какого лешего при обработке этого запроса мы сохранили null в этом поле базы данных?)"

КАК МОЖНО РАНЬШЕ!

ПОВТОРЮ!

КАК МОЖНО РАНЬШЕ!

и ещё раз ПОВТОРЮ!

КАК МОЖНО РАНЬШЕ!

Да..

И ещё...

(Надеюсь что меня не упрекнут в излишнем цитировании)

Вот:
"

Так что насчет Контракты vs. Монады?

Да, кажется я несколько отвлекся от исходной темы. Так вот, проясню в качестве заключения: всяческие монады, и методы расширения для упрощения обхода графов объектов упрощают control flow, но они не имеют никакого отношения к тому, что делают контракты!
Контракты призваны придать дополнительный смысл безликим методам там, где система типов языка не справляется, и четко определить, за что отвечает каждая из сторон, и кто виноват, если эти соглашения не выполняются. Контракты – ловят ошибки, а монады и оболочки за счет своей выразительности стараются свести их количество к минимуму. Но эти подходы не конкуренты, каждый из них отлично подходит для решения своих проблем.
Не нужно с помощью монад прятать ошибки, возвращая None на переданный null, а контракты не нужно использовать для валидации данных от пользователя. Не предавайтесь культу карго, и используйте инструмент по назначению!"

вторник, 29 июля 2014 г.

Offtopic. Про "Украину" и не только.. Про ВСЕХ НАС..

Про "Украину" и не только.. Про ВСЕХ НАС..

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

Кадиш — это еврейская поминальная молитва, которую произносит сын в память о покойном отце.
Эта поэма посвящена памяти великого польского писателя, врача и педагога Якова Гольдшмидта (Януша Корчака), погибшего вместе со своими воспитанниками из школы-интерната "Дом сирот" в Варшаве в лагере уничтожения Треблинка.
                  Александр Галич

Как я устал повторять бесконечно все то же и то же,
Падать и вновь на своя возвращаться круги.
Я не умею мольться, прости меня, Господи Боже,
Я не умею молиться, прости меня и помоги...
А по вечерам все так же,как ни в чем не бывало, играет музыка:

        Сан-Луи блюз - ты во мне как боль, как ожог,
        Сан-Луи блюз - захлебывается рожок!
        А вы сидите и слушаете,
        И с меня не сводите глаз,
        Вы платите деньги и слушаете,
        И с меня не сводите глаз,
        Вы жрете, пьете и слушаете,
        И с меня не сводите глаз,
        И поет мой рожок про дерево,
        На котором я вздерну вас! Да-с, да-с...

            "Я никому не желаю зла, не умею, просто не знаю,
            Как это делается".
                   [Януш Корчак. Дневник]

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

Цыган был вор, цыган был врун,
Но тем милей вдвойне,
Он трогал семь певучих струн
И улыбался мне,
И говорил:"Учись, сынок,
Учи цыганский счет -
Семь дней в неделе создал Бог,
Семь струн в гитаре - черт,
И он ведется неспроста
Тот хитрый счет, пойми,
Ведь даже радуга, и та,
Из тех же из семи
Цветов..."

Осенней медью город опален,
А я - хранитель всех его чудес,
Я неразменным одарен рублем,
Мне ровно дважды семь, и я влюблен
Во всех дурнушек и во всех принцесс!

Осени меня своим крылом,
Город детства с тайнами неназванными,
Счастлив я, что и в беде, и в праздновании
Был слугой твоим и королем.
Я старался сделать все, что мог,
Не просил судьбу ни разу: высвободи!
И скажу на самой смертной исповеди,
Если есть на свете детский Бог:
Всё я, Боже, получил сполна,
Где,в которой расписаться ведомости?
Об одном прошу, спаси от ненависти,
Мне не причитается она.

И вот я врач, и вот военный год,
Мне семью пять, а веку семью два,
В обозе госпитальном кровь и пот,
И кто-то, помню, бредит и поет
Печальные и странные слова:
"Гори, гори, мою звезда,
Звезда любви приветная,
Ты у меня одна заветная,
Другой не будет..."

Ах, какая в тот день приключилась беда,
По дороге затопленной, по лесу,
Чтоб проститься со мною, с чужим, навсегда,
Ты прошла пограничную полосу.
И могли ль мы понять в том году роковом,
Что беда обернется пощадою,
Полинявшее знамя пустым рукавом
Над платформой качалось дощатою.
Наступила внезапно чужая зима,
И чужая, и все-таки близкая,
Шла французская фильма в дрянном "синема"
Барахло торговали австрийское,
Понукали извозчики дохлых коняг,
И в кафе, заколоченном наглухо,
Мы с тобою сидели и пили коньяк,
И жевали засохшее яблоко.
И в молчаньи мы знали про нашу беду,
И надеждой не тешились гиблою,
И в молчаньи мы пили за эту звезду,
Что печально горит над могилою:
"Умру ли я, и над могилою
Гори, сияй..."

Уходят из Варшавы поезда,
И скоро наш черед, как ни крути,
Ну, что ж, гори, гори, моя звезда,
Моя шестиконечная звезда,
Гори на рукаве и на груди!

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

...Звезда в окне и на груди - звезда,
И не поймешь, которая ясней,
Гудят всю ночь, прощаясь, поезда,
Глядит в окно вечерняя звезда,
А я прощаюсь с памятью моей...


         А еще жила в "Доме  сирот" девочка  Натя. После
         тяжелой  болезни она  не  могла ходить, но она
         очень хорошо рисовала и сочиняла песенки - вот одна
         из них - ПЕСЕНКА ДЕВОЧКИ НАТИ ПРО КОРАБЛИК

Я кораблик клеила
Из цветной бумаги,
Из коры и клевера,
С клевером на флаге.
Он зеленый, розовый,
Он в смолистых каплях,
Клеверный, березовый,
Славный мой кораблик,
Славный мой кораблик.

А когда забулькают ручейки весенние,
Дальнею дорогою, синевой морской,
Поплывет кораблик мой к острову Спасения,
Где ни войн, ни выстрелов, - солнце и покой.

Я кораблик ладила,
Пела, словно зяблик,
Зря я время тратила, -
Сгинул мой кораблик.
Не в грозовом отблеске,
В буре, урагане -
Попросту при обыске
Смяли сапогами...
Смяли сапогами...

Но когда забулькают ручейки весенние,
В облаках приветственно протрубит журавль,
К солнечному берегу, к острову Спасения
Чей-то обязательно доплывет корабль!


        Когда-нибудь, когда вы будете вспоминать имена
        героев, не забудьте, пожалуйста, я очень прошу
        вас, не забудьте Петра Залевского, бывшего
        гренадера, инвалида войны, служившего сторожем
        у нас в "Доме сирот" и убитого польскими
        полицаями во дворе осенью 1942 года.


Он убирал наш бедный двор,
Когда они пришли,
И странен был их разговор,
Как на краю земли,
Как разговор у той черты,
Где только "нет" и "да" -
Они ему сказали:"Ты,
А ну, иди сюда!"
Они спросили:"Ты поляк?"
И он сказал :"Поляк".
Они спросили:"Как же так?"
И он сказал:" Вот так".
"Но ты ж, культяпый, хочешь жить,
Зачем же , черт возьми,
Ты в гетто нянчишься, как жид,
С жидовскими детьми?!
К чему, - сказали, - трам-там-там,
К чему такая спесь?!
Пойми, - сказали, - Польша там!"
А он ответил:"Здесь!
И здесь она и там она,
Она везде одна -
Моя несчастная страна,
Прекрасная страна".
И вновь спросили:"Ты поляк?"
И он сказал:"Поляк".
"Ну, что ж , - сказали,- Значит, так?"
И он ответил:"Так".
"Ну, что ж, - сказали, - Кончен бал!"
Скомандовали:"Пли!"
И прежде, чем он сам упал,
Упали костыли,
И прежде, чем пришли покой
И сон, и тишина,
Он помахать успел рукой
Глядевшим из окна.
...О, дай мне, Бог, конец такой,
Всю боль испив до дна,
В свой смертный миг махнуть рукой
Глядящим из окна!


           А потом наступил такой день,когда "Дому сирот",
           детям и воспитателям было приказано явиться с
           вещами на Умшлягплац Гданьского вокзала (так называлась
           площадь у Гданьского вокзала при немцах).


Эшелон уходит ровно в полночь,
Паровоз-балбес пыхтит - Шалом! -
Вдоль перрона строем стала сволочь,
Сволочь провожает эшелон.

Эшелон уходит ровно в полночь,
Эшелон уходит прямо в рай,
Как мечтает поскорее сволочь
Донести, что Польша - "юденфрай".

"Юденфрай" Варшава, Познань, Краков,
Весь протекторат из края в край
В черной чертовне паучьих знаков,
Ныне и вовеки - "юденфрай"!

А на Умшлягплаце у вокзала
Гетто ждет устало - чей черед?
И гремит последняя осанна
Лаем полицая - "Дом сирот!"

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

Знаменосец, козырек заломом,
Чубчик вьется, словно завитой,
И горит на знамени зеленом
Клевер, клевер, клевер золотой.

Два горниста поднимают трубы,
Знаменосец выпрямил грифко,
Детские обветренные губы
Запевают грозно и легко:
        "Наш славный поход начинается просто,
        От Старого Мяста до Гданьского моста,
        И дальше, и с песней, построясь по росту,
        К варшавским предместьям, по Гданьскому мосту!
        По Гданьскому мосту!

        По улицам Гданьска, по улицам Гданьска
        Шагают девчонки Марыся и Даська,
        А маленький Боля, а рыженький Боля
        Застыл, потрясенный, у края прибоя,
        У края..."

Пахнет морем, теплым и соленым,
Вечным морем и людской тщетой,
И горит на знамени зеленом
Клевер, клевер, клевер золотой!

Мы проходим по-трое, рядами,
Сквозь кордон эсэсовских ворон...
Дальше начинается преданье,
Дальше мы выходим на перрон.

И бежит за мною переводчик,
Робко прикасается к плечу, -
"Вам разрешено остаться, Корчак",-
Если верить сказке, я молчу.

К поезду, к чугунному парому,
Я веду детей, как на урок,
Надо вдоль вагонов по перрону,
Вдоль, а мы шагаем поперек.

Рваными ботинками бряцая,
Мы идем не вдоль, а поперек,
И берут, смешавшись, полицаи
Кожаной рукой под козырек.

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

Может, в жизни было по-другому,
Только эта сказка вам не врет,
К своему последнему вагону,
К своему чистилищу-вагону,
К пахнущему хлоркою вагону
С песнею подходит "Дом сирот":

        "По улицам Лодзи, по улицам Лодзи,
        Шагают ужасно почтенные гости,
        Шагают мальчишки, шагают девчонки,
        И дуют в дуделки, и крутят трещотки...
        И крутят трещотки!

        Ведут нас дороги, и шляхи, и тракты,
        В снега Закопани, где синие Татры,
        На белой вершине - зеленое знамя,
        И вся наша медная Польша под нами,
        Вся Польша..."


           ...И  тут  кто-то, не выдержав, дал сигнал к
           отправлению - и эшелон Варшава - Треблинка задолго
           до назначенного срока, (случай совершенно невероятный)
           тронулся в путь...


Вот и кончена песня.
Вот и смолкли трещетки.
Вот и скорчено небо
В переплете решетки.
И державе своей
Под вагонную тряску
Сочиняет король
Угомонную сказку...

Итак, начнем, благословясь...
Лет сто тому назад
В своем дворце неряха-князь
Развел везде такую грязь,
Что был и сам не рад,
И, как-то, очень рассердясь,
Призвал он маляра.
"А не пора ли, - молвил князь,-
Закрасить краской эту грязь?"
Маляр сказал:"Пора,
Давно пора, вельможный князь,
Давным-давно пора".
И стала грязно-белой грязь,
И стала грязно-желтой грязь,
И стала грязно-синей грязь
Под кистью маляра.
А потому что грязь - есть грязь,
В какой ты цвет ее ни крась.

Нет, некстати была эта сказка, некстати,
И молчит моя милая чудо-держава,
А потом неожиданно голосом Нати
Невпопад говорит:"До свиданья, Варшава!"

И тогда, как стучат колотушкой по шпалам,
Застучали сердца колотушкой по шпалам,
Загудели сердца:"Мы вернемся в Варшаву!
Мы вернемся, вернемся, вернемся в Варшаву!"

По вагонам, подобно лесному пожару,
Из вагона в вагон, от состава к составу,
Как присяга гремит:"Мы вернемся в Варшаву!
Мы вернемся, вернемся, вернемся в Варшаву!

Пусть мы дымом истаем над адовым пеклом,
Пусть тела превратятся в горючую лаву,
Но дождем, но травою, но ветром, но пеплом,
Мы вернемся, вернемся, вернемся в Варшаву!"

А мне-то, а мне что делать?
И так мое сердце - в клочьях!
Я в том же трясусь вагоне,
И в том же горю пожаре,
Но из года семидесятого
Я вам кричу:"Пан Корчак!
Не возвращайтесь!
Вам страшно будет в этой Варшаве!

Землю отмыли добела,
Нету ни рвов, ни кочек,
Гранитные обелиски
Твердят о бессмертной славе,
Но слезы и кровь забыты,
Поймите это, пан Корчак,
И не возвращайтесь,
Вам стыдно будет в этой Варшаве!

Дали зрелищ и хлеба,
Взяли Вислу и Татры,
Землю, море и небо,
Всё, мол, наше, а так ли?!

Дня осеннего пряжа
С вещим зовом кукушки
Ваша? Врете, не ваша!
Это осень Костюшки!

Небо в пепле и саже
От фабричного дыма
Ваше? Врете, не ваше!
Это небо Тувима!

Сосны - гордые стражи
Там, над Балтикой пенной,
Ваши? Врете, не ваши!
Это сосны Шопена!

Беды плодятся весело,
Радость в слезах и корчах,
И много ль мы видели радости
На маленьком нашем шаре?!
Не возвращайтесь в Варшаву,
Я очень прошу Вас, пан Корчак,
Не возвращайтесь,
Вам нечего делать в этой Варшаве!

Паясничают гомункулусы,
Геройские рожи корчат,
Рвется к нечистой власти
Орава речистой швали...
Не возвращайтесь в Варшаву,
Я очень прошу Вас, пан Корчак!
Вы будете чужеземцем
В Вашей родной Варшаве!


А по вечерам все так же играет музыка.  Музыка,
музыка, как ни в чем не бывало:
        Сэн-Луи блюз - ты во мне как боль, как ожог,
        Сэн-Луи блюз - захлебывается рожок!
        На пластинках моно и стерео,
        Горячей признанья в любви,
        Поет мой рожок про дерево
        Там, на родине, в Сэн-Луи.

        Над землей моей отчей выстрелы
        Пыльной ночью, все бах да бах!
        Но гоните монету, мистеры,
        И за выпивку, и за баб!

        А еще, ну, прямо комедия,
        А еще за вами должок -
        Выкладывайте последнее
        За то, что поет рожок!

        А вы сидите и слушаете,
        И с меня не сводите глаз,
        Вы платите деньги и слушаете,
        И с меня не сводите глаз,

        Вы жрете, пьете и слушаете,
        И с меня не сводите глаз,
        И поет мой рожок про дерево,
        На котором я вздерну вас!
        Да-с! Да-с! Да-с!

Я никому не желаю зла, не умею,просто не знаю,
как это делается.
Как я устал повторять бесконечно все то же и то же,
Падать, и вновь на своя возвращаться круги.
Я не умею молиться, прости меня, Господи Боже,
Я не умею молиться, прости меня и помоги!..

1970

понедельник, 28 июля 2014 г.

Ссылка. Еще одна книга по паттернам? Дайте две!

http://sergeyteplyakov.blogspot.ru/2014/07/blog-post.html?showComment=1406575142584#c5986731531109546200

Я лично "из уважения к Теплякову" - готов пару-тройку килорублей "занести" в качестве "жеста" того, что книга нужна. "За базар" - отвечаю.

воскресенье, 27 июля 2014 г.

Хочу сделать "рисовалку всего"

Хочу сделать "рисовалку всего".

"Макет приложения" тут - https://bitbucket.org/ingword/mindstream/commits/all

С кодогенерацией "всего".

Ориентированную на "мобильные устройства".

Скажем так... На программистов ориентироваться "для начала" - НЕ ХОЧУ. Они - "жадины".

С них ни "денег", ни нормальной "обратной связи" - не дождёшься.

Хочу попробовать сделать что-то "для рисования структур" например "структуры отделов" или "структуры бизнес процессов" с "кодогенерацией" в "отчёты". Текстовые или вордовые.

Ориентированную на "менеджеров". Или "около того".

Ну скажем так - "пока" - там где сейчас применяется Visio. Только ПРОЩЕ и легче. Ну и с "кодогенерацией".

Основная "идея" - это "настройка возможных примитивов" и настройка "кодогенерации этих примитивов" во всякого рода "отчёты".

Пока делаем под Delphi для FMX, но я что-то не уверен, что это правильно. Пару багов в FMX я кстати УЖЕ нашел.

Update. Вот "макет" - http://programmingmindstream.blogspot.ru/2014/07/mindstream-uml.html

суббота, 26 июля 2014 г.

Хвалёный git разочаровывает с каждым днём. Особенно в условиях нестабильного коннекта

Хвалёный git разочаровывает с каждым днём. Особенно в условиях нестабильного коннекта.

Если в CVS или SVN на сервер можно сделать коммит "пофайлово" и пусть "за сутки", но докоммитеть всё, то git посылает ВЕСЬ коммит целиком и откатывает целиком. Посему если "сервер рвёт коннект" из-за тайм-аута, то весь процесс коммита - откатывается и всё приходится делать заново.

Может я конечно "его готовить не умею". Вот существующий локальный коммит можно разбить на несколько? Чтобы делать Push "порциями"?

Update.

Не ВСЁ ТАК плохо оказывается:

"Ну коли обратного пути нет, но переходи в директорию с веткой, где надо дробить коммит и переходи в интерактивный режим изменения истории:
git rebase -i HEAD~1 (последняя цифра - сколько коммитов назад хочешь менять)
откроется специальный режим, где надо напротив нужного коммита написать edit
далее разбивай свой коммит на много мелких:
git reset HEAD^
git add ...
git commit -m "First part"
git add ...
git commit -m "Second part"
введи продолжить, чтобы закончить интерактивный режим
git rebase --continue

После всего этого делай push в remote branch по одному;
git push <remotename> <commit SHA>:<remotebranchname>"

Я же говорю - НЕ УМЕЮ я этот git "готовить"... Руки кривые :-)

пятница, 25 июля 2014 г.

Черновик. Коротко. Рефакторинг кода

https://bitbucket.org/ingword/mindstream/commits/all

- по-моему у нас получается "хороший пример" шаблонов проектирования, в частности - Dependency Injection.

четверг, 24 июля 2014 г.

Сделал тут одну из реализаций Dependency Injection на UML и "кодогенерации"

Сделал тут одну из реализаций Dependency Injection на UML и "кодогенерации".

Грубо говоря так:

Рисуем:

Class A
Class B
Interface C
Class A uses -> Interface C
Class B implements -> Interface С

И связь:

Class B As Interface C injects to -> Class A

Получаем:

new Class CFactory produces -> Interface C
Class A uses -> Class CFactory
Class B uses -> Class CFactory
Class B register in -> Class CFactory
Class A gets Interface C from -> Class CFactory

Таким образом получаем "синтетический" класс CFactory, про который ЗНАЕТ класс A и в котором РЕГИСТРИРУЕТСЯ класс B.

При этом класс A умеет получать экземпляры класса B (видимые как интерфейс C) через ФАБРИКУ CFactory.

При этом - класс A НАПРЯМУЮ не знает про класс B, а знает только про фабрику CFactory.

А класс B умеет инстанцироваться как интерфейс C через фабрику CFactory. При этом он НАПРЯМУЮ (с точки зрения uses модулей) НЕ ЗНАЕТ про класс A.

Фабрика CFactory (и дополнительная обвязка) полностью генерируется с модели.

Генерируемый код кому-то интересен?

При этом если нарисовать так:

Class A
Class B
Interface C
Class A uses -> Interface C
Class B implements -> Interface С
Class D uses -> Interface С

Class B As Interface C injects to -> Class A
Class B As Interface C injects to -> Class D

то получаем:

new Class CFactory produces -> Interface C
Class A uses -> Class CFactory
Class B uses -> Class CFactory
Class B register in -> Class CFactory
Class A gets Interface C from -> Class CFactory
Class D uses -> Class CFactory
Class D gets Interface C from -> Class CFactory

Ну и далее "по индукции".

UML диаграмма "исходного" и "конечного кода" нужна?

Update. Вот один из примеров кода:

Вот это всё полностью сгенерировано с модели.

 Нет НИ ОДНОЙ строчки РУКОПИСНОГО кода.

unit evTextPara_InterfaceFactory;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Generated from UML model, root element: interfacefactory::class Shared Delphi::Everest::InterfaceFactories::TevTextPara
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// ! Полностью генерируется с модели. Править руками - нельзя. !

{$Include ..\Everest\evDefine.inc}

interface

uses
  evLeafPara_InterfaceFactory,
  l3IID,
  k2ToolPrim,
  l3Variant
  ;

type
 TevTextParaInterfaceFactory = class(TevLeafParaInterfaceFactory)
 protected
 // overridden protected methods
   function COMQueryTool(aTag: Tl3Tag;
     const aIID: Tl3GUID;
     out theTool;
     const aProcessor: Ik2Processor): Boolean; override;
 public
 // overridden public methods
   function QueryTool(aTag: Tl3Variant;
     const ID: Tl3IID;
     out I: Tk2ToolPrim): Boolean; override;
 end;//TevTextParaInterfaceFactory

implementation

uses
  nevRealTools,
  nevTools,
  nevGUIInterfaces,
  l3Interfaces
  {$If defined(evUseVisibleCursors)}
  ,
  evTextParaCursor
  {$IfEnd} //evUseVisibleCursors

  {$If defined(evNeedPainters)}
  ,
  evTextParaPainterEx
  {$IfEnd} //evNeedPainters
  ,
  nevTextPara
  {$If defined(evUseVisibleCursors)}
  ,
  evTextCursorPair
  {$IfEnd} //evUseVisibleCursors

  {$If defined(evNeedHotSpot)}
  ,
  evTextParaHotSpotTester
  {$IfEnd} //evNeedHotSpot

  {$If defined(evUseDeadCursor) AND defined(evUseVisibleCursors)}
  ,
  evDeadCursor
  {$IfEnd} //evUseDeadCursor AND evUseVisibleCursors
  ,
  evTextParaStringImpl,
  nevTextParaAnchor,
  nevTextParaInevTextParaMapper
  ;

// start class TevTextParaInterfaceFactory

function TevTextParaInterfaceFactory.QueryTool(aTag: Tl3Variant;
  const ID: Tl3IID;
  out I: Tk2ToolPrim): Boolean;
 {-}
begin
 Result := true;
 {$If defined(evUseVisibleCursors)}
 if ID.EQ(ev_iidCursor) then
  I := TevTextParaCursor.Create(aTag)
 else
 {$IfEnd} //evUseVisibleCursors
 {$If defined(evUseVisibleCursors)}
 if ID.EQ(ev_iidBlock) then
  I := TevTextCursorPair.Create(aTag)
 else
 {$IfEnd} //evUseVisibleCursors
  Result := inherited QueryTool(aTag, ID, I);
end;//TevTextParaInterfaceFactory.QueryTool

function TevTextParaInterfaceFactory.COMQueryTool(aTag: Tl3Tag;
  const aIID: Tl3GUID;
  out theTool;
  const aProcessor: Ik2Processor): Boolean;
 {-}
begin
 Result := true;
 {$If defined(evNeedPainters)}
 if aIID.EQ(IevPainter) then
  IevPainter(theTool) := TevTextParaPainterEx.Make(aTag)
 else
 {$IfEnd} //evNeedPainters
 if aIID.EQ(InevTextPara) then
  InevTextPara(theTool) := TnevTextPara.Make(aTag)
 else
 {$If defined(evNeedHotSpot)}
 if aIID.EQ(InevHotSpotTester2) then
  InevHotSpotTester2(theTool) := TevTextParaHotSpotTester.Make(aTag)
 else
 {$IfEnd} //evNeedHotSpot
 {$If defined(evUseDeadCursor) AND defined(evUseVisibleCursors)}
 if aIID.EQ(IevSavedCursor) then
  IevSavedCursor(theTool) := TevTextParaDeadCursor.Make(aTag)
 else
 {$IfEnd} //evUseDeadCursor AND evUseVisibleCursors
 if aIID.EQ(Il3WordsSeq) then
  Il3WordsSeq(theTool) := TevTextParaStringImpl.Make(aTag)
 else
 if aIID.EQ(InevAnchor) then
  InevAnchor(theTool) := TnevTextParaAnchor.Make(aTag)
 else
 if aIID.EQ(InevPara) then
  Result := TnevTextParaInevTextParaMapper.Make(aTag, aIID, theTool, aProcessor)
 else
 if aIID.EQ(InevParaInternal) then
  Result := TnevTextParaInevTextParaMapper.Make(aTag, aIID, theTool, aProcessor)
 else
 if aIID.EQ(InevLeafPara) then
  Result := TnevTextParaInevTextParaMapper.Make(aTag, aIID, theTool, aProcessor)
 else
  Result := inherited COMQueryTool(aTag, aIID, theTool, aProcessor);
end;//TevTextParaInterfaceFactory.COMQueryTool

end.

Offtopic. И ещё о "международном праве"...

http://topwar.ru/10090-pomni-men-idealnaya-amerikanskaya-voyna.html

"Нынешние события, связанные с Ираном, дают повод вспомнить провокацию, которая привела к американо-испанской войне 1898 года и последующей за ней оккупацией США Филиппин. Эта война стала ещё одной в череде грабительских походов американских вооруженных сил и первой пробой сил за пределами американского континента. 

Предыстория войны

Золотой век Испанской империи был давно в прошлом. Уже к 1820-м годам испанцы, в основном под давлением британцев, потеряли большинство колоний. Так в Латинской Америке Лондон оказывал повстанцам разностороннюю поддержку, как информационную, так и военную, транспортную, финансовую. Симону Боливару (национальный герой Венесуэлы, наиболее влиятельный и известный из руководителей войны за независимость колоний Испании в Южной Америке), британцы помогли финансами и оружием в самом начале его деятельности по освобождению "

"Правда, «освобождение» Латинской Америки привело не к созданию единого независимого государства, а к целой группе слабых государств. За их республиканским или монархическим фасадом скрывался диктат Великобритании (её затем вытеснили США), британских и американских монополий. Большая часть населения жила в полной нищете, группки богачей беспощадно эксплуатировали рабов, крестьян-пеонов, работников мануфактур. Экономика имела полностью колониальный характер. Единственная страна, которая попробовала выйти из этой «матрицы» - Парагвай, была безжалостно разрушена. 

Но у Испании осталось несколько «жемчужин» - Куба, Филиппинские острова, Гуам и Пуэрто-Рико, эти острова обладали разнообразными ресурсами, к тому же располагались на важных морских коммуникациях.

Соединенные Штаты к концу XIX столетия уже успешно решили ряд внутренних проблем. Окончательно подавили сопротивление коренных американцев – индейских племён, в 1860-1890-е годы земли, ещё принадлежавшие индейцам на западе Северной Америки, были захвачены и перешли в собственность фермеров, различных компаний. А индейцы уничтожены, частично депортированы и загнаны в резервации. Решили вопрос и разделения страны на Юг и Север. Быстро развивалось крупное капиталистическое производство, защищенное высокими протекционистскими тарифами. 

Теперь американский капитал нуждался в разнообразном дешевом природном сырье, рынках сбыта для своей продукции, морских путях прикрытых военно-морскими базами. Политическая надстройка США всегда выполняло заказ финансово-промышленной олигархии – ещё в первой половине 19 столетия была провозглашена «доктрина Монро». По ней Северная и Южная Америка провозглашались зоной, закрытой для европейской колонизации. Подразумевалось, что в ней будут господствовать Штаты. В конце XIX века американское правительство проводило политику расширения экономического влияния в странах Латинской Америки и Азии. 

Администрация президента США Уильяма Маккинли (4 марта 1897 — 14 сентября 1901) считала, что США пора обзавестись своими первыми колониями, которые одновременно будут источниками сырья и рынками сбыта. К тому же Испания была слаба и не могла силой защитить свои колонии, нанести США большой урон, не имела могущественных союзников. Захват Кубы, Пуэрто-Рико и Филиппинских островов решал задачу укрепления стратегических позиций США в Карибском море, Атлантическом и Тихом океанах. 

США провели успешную предварительную работу по подготовке к войне: информационная кампания в прессе об «испанских жестокостях, а в 1895 году на территории Пуэрто-Рико и Кубы, и в 1896 году на территории Филиппинских островов «началась» национально-освободительная борьба против испанского режима. К примеру, Кубинская революция началась с того, что на Кубу высадился отряд Хосе Марти (ему в 1892 году в США помогли создать Кубинскую революционную партию). Кубинские повстанцы отличались безжалостностью, уничтожали поселения, плантации, промышленные предприятия. Испанский генерал-губернатор ответил на жестокость жестокостью. На Кубе восстание почти удалось подавить, крестьян согнали в концлагеря, этим лишив партизан поддержки. 

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

"Уильям Маккинли, 25-й президент Соединённых Штатов Америки (1897—1901) от Республиканской партии.

Повод к войне

США хотели выглядеть в глазах мирового сообщества и американских обывателей «освободителями», поэтому нужен был повод к войне. Но проблема была в том, что Испания не хотела воевать. 

В конце января 1898 в кубинскую Гавану прибыл американский броненосный крейсер «Мэн». Хотя американцы утверждали о дружественном характере визита, было понятно, что это вызов и демонстрация. Испанцы были вынуждены разрешить этот визит. 

15 февраля 1898 года раздался страшный взрыв и корабль погиб. Взрыв произошёл вечером, когда команда была на корабле и матросы спали, поэтому жертв было много - погиб 261 человек (стандартный экипаж корабля – 355 человек). Интересен тот факт, что почти все офицеры были на берегу, а погибшие матросы в основном были неграми. США обвинило в этом взрыве испанцев, которые подвели мину под корабль. Хотя испанцам, которые не хотели воевать с США, эта акция была не нужна, мотива не было в отличие от американцев. 

Но практически сразу возник ряд вопросов, которые опровергали американскую версию. По мнению специалистов, такой взрыв, который разломил корабль пополам, не мог произойти от мины (от неё образовалась бы пробоина в подводной части крейсера). Поэтому взрыв, судя по всему, произошёл внутри крейсера «Мэн». На это указывали и другие факты: отсутствие оглушенной рыбы, которая была бы при подводном взрыве, разбитые окна окрестных зданий.

В 1910 году, когда корабль попробовали поднять на поверхность, эта версия подтвердилась, люди узнали, что:

- взрыв произошёл внутри броненосного крейсера, а не от мины или торпеды;

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

Американская комиссия вопреки фактам, которые указывали на внутренний взрыв, быстро завершила свои дела и отбыла на родину. Повод был создан – «Подлые испанцы взорвали миной наш крейсер». В общество вбросили лозунг: «Помни Мэн!» 19 апреля США потребовали от Испании отказаться от Кубы, одновременно началась мобилизация добровольцев и развёртывание флота. Уже 21 апреля, без объявления войны, американские корабли стали захватывать испанские транспорты, шедшие на Кубу. 22 апреля американская эскадра контр-адмирала Сэмпсона открыла огонь по береговым укреплениям у Гаваны. 

Война

Кампания была быстрой и с довольно небольшими жертвами. Вообще это была несколько странная война. Первые солдаты США погибли только через два месяца после начала войны. Они упали с борта лодки при десантировании и утонули. Испанские солдаты, напрочь лишенные мотивации к войне, боевого духа, видели в колониях тяжелое бремя и мечтали вернуть домой. 

Основные боевые действия развернулись на море. Преимущество американского флота было подавляющим: испанцы располагали 1 броненосцем, 7 броненосными крейсерами, 5 тяжелыми крейсерами (водоизмещением более 3 тыс. тонн) и 8 легкими крейсерами (водоизмещением менее 3 тыс. тонн); у американцев было 4 броненосца, 3 броненосных крейсера, 11 тяжелых и 8 легких крейсеров. У США было преимущество и по общему водоизмещению флота — 116 тыс. тонн против 56 тыс. тонн. Американские корабли были современнее и превосходили испанские почти по всем показателям – артиллерия американских ВМС была в 2,5 раза мощнее и обладала большей скорострельностью, превосходили в броневой защите. Испанцы пренебрегали боевой подготовкой в довоенный период: не было ни карт, ни плана действий на случай войны с США, корабельные артиллеристы не практиковались в стрельбе, крайне низким был общий уровень подготовки экипажей. Корабли США, кроме броненосных крейсеров, обладали большей скоростью. К тому же корабли испанских ВМС нуждались в хорошем ремонте, а командование совершило все возможные ошибки, проявив чудеса недееспособности.

Не сопоставимы были и финансовые возможности Штатов и испанской короны. У Испании не хватало денег даже для закупки угля для нужд своих Военно-морских сил. Большую роль сыграл и тот факт, что основной театр войны в Вест-Индии находился в 6 раз ближе к атлантическому побережью Штатов, чем к испанским берегам. В день фактического начала войны, 21 апреля 1898 года, главная испанская эскадра под командованием адмирала Паскуале Серверы дислоцировалась на островах Зеленого Мыса. Испанский адмирал не имел даже карт Карибского бассейна и не знал об особенностях местных портов. Сервера сообщил в Мадрид, что ему приходится выйти в море, не имея какого-либо плана, о том, что Испания не должна «обманывать себя относительно силы нашего флота», «предаваться иллюзиям». Предложил приехать в Мадрид, чтобы выработать стратегию действий, но военный совет принял немедленно отправить эскадру Серверы в Вест-Индию, не дожидаясь, когда вернутся в строй находившиеся в ремонте броненосец и три тяжелых крейсера. В поход вышли 4 броненосных крейсера и 3 миноносца.

Но первое крупное морское сражение произошло не на Карибах, а в Тихом океане. Здесь Азиатская крейсерская эскадра американского коммодора Джорджа Дьюи уже в апреле была сосредоточена в Гонконге. Американцы заранее запаслись углем, продовольствием, боеприпасами и были готовы к войне. В эскадре было 4 бронепалубных крейсера (водоизмещение от 3 до 6 тыс. т), 2 морские канонерские лодки крейсерского типа и 3 вспомогательных судна (единственный имевшийся у американских ВМС на Тихом океане броненосец «Орегон» перед войной был переброшен в Атлантику, т. к. Филиппинский фронт считался вспомогательным). Американские корабли имели лучшую артиллерию и скорость. 25 апреля американская эскадра вышла к Филиппинам. 

Формально испанские ВМС располагали на Филиппинах 12 военными кораблями, но значительную часть была небоеспособна или частично боеготова. В реальности испанский контр-адмирал Патрисио Монтехо-и-Пасарон располагал лишь 6 крейсерами (2 испанских безбронных корабля с водоизмещением в 3 тыс. т считались «крейсерами 1-го ранга», 4 остальных в 1 – 1,1 тыс. т – «крейсерами 2-го ранга», только два из них имели броневую палубу) и 1 канонерской лодкой. Испанская эскадра имела 31 орудие среднего калибра (не более 160-мм) против 53 орудий крупного и среднего калибра (в том числе 11 орудий калибром 203-мм). Испанцы сняли вооружения с 5 канонерок, укрепляя береговую оборону, да и с оставшихся в строю кораблей, сняли часть орудий. 

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

1 мая 1898 года состоялось сражение (вернее избиение) между эскадрами у мыса Кавите. Оно началось в 5 часов 12 минут утра, когда испанцы открыли огонь с кораблей и берега по американской колонне. Чуть позже открыли огонь американцы. К 8 часам утра почти все испанские корабли горели и американский командующий объявил перерыв на завтрак (поступило сообщение о том, что кончились боеприпасы, потом выяснилось, что это ошибка). Затем расстрел возобновился. К полудню американская эскадра уничтожила все испанские корабли. Испанские разгильдяйство привело к тому, что были потеряны все корабли, погибло 161 человек, 210 получили ранения. У американцев было 9 раненых, испанцы сделали всего 19 попаданий (только одно довольно серьёзное), против 145 попаданий в испанские корабли. Сражение оказало огромное психологическое значение на США и испанцев. 

После этого на Филиппинах не было крупных сражений. Американская эскадра не могла самостоятельно овладеть Манилой, без высадки десантного корпуса. Испанцы удерживали её почти до конца войны.

В Вест-Индии американские корабли под командованием адмирала Уильяма Семпсона блокировали Гавану и все северное побережье Кубы. Южное побережье Кубы с портами Сьенфуэгос и Сантьяго флот США полностью заблокировать не мог из-за удаленности от баз американских ВМС. 19 мая в Сантьяго пришла после долгого перехода испанская эскадра адмирала П. Серверы. Испанцы собирались отдохнуть, загрузиться углём и идти дальше – в Гавану (это был главный узел сопротивления на острове). 27 августа испанцев заблокировала «Летучая эскадра» коммодора Винфельда Шлея, а 1 августа подошла эскадра вице-адмирала Уильяма Сэмпсона. 

Сервера решил обороняться в Сантьяго, укрепил прибрежную оборону новыми береговыми батареями, установил в проходе в бухту мины. Американцы совершили неудачную попытку затопить брандер, чтобы перегородить фарватер. Не рискуя атаковать испанскую эскадру в бухте, где американские корабли встретил огонь не только испанских кораблей, но и береговых батарей, решили высадить десантный корпус и взять порт с суши. Высадка была плохо организована, растянута по времени, но так как испанцы не решились на контрдействия (а они могли привести к значительным потерям среди десанта), американцы смогли высадить 27-тыс. десантный корпус. 25 июня американские силы вместе с кубинскими повстанцами пробовали взять Сантьяго, но их атаку отбили. 

В это же время из Кадиса выдвинулась новая испанская эскадра в составе 2 броненосцев, 2 пароходов и 3 миноносцев под руководством адмирала Камеры. В Соединенных Штатах опасались, что она пойдёт в Вест-Индию, но испанская эскадра двинулась к Порт-Саиду, собираясь далее следовать к Филиппинским островам. Но после того как она получила известие об уничтожении испанской эскадры в Манильской бухте, эскадра Камеры поблуждав по Средиземному морю возвратилась к родным берегам, так и не приняв участия в боевых действиях.

Понимая, что морской бой приведёт к поражению эскадры, Сервера планировал использовать ресурсы своей эскадры для сухопутной обороны Сантьяго. Но в итоге был вынужден идти на прорыв. В Сантьяго остро ощущался недостаток продовольствия, и комендант города просил адмирала покинуть порт. К тому же Сервера получил приказ главнокомандующего испанскими силами на Кубе маршала Бланко. 2 июля Бланко потребовал прорываться в Гавану. Адмирал выполнил этот приказ. Хотя и считал, что его выполнение повлечёт за собой гибель эскадры и экипажей кораблей. 

У испанцев было 4 броненосных крейсера: три однотипных - «Инфанта Мария Тереза», «Адмирал Окендо» и «Бискайя» (7 тыс. тонн водоизмещения, ход до 20 узлов, имеющие по два 280-мм и десять 140-мм орудий), «Кристобаль Колон» (6,7 тыс. тонн, 20 узлов, десять 152-мм и шесть 120-мм орудий). У американцев броненосный крейсер «Бруклин» (более 9 тыс. тонн, 22 узла хода, восемь 203-мм и двенадцать 127-мм орудий), 3-и броненосца 1-го класса: «Айова» (11,4 тыс. тонн, скорость 16 узлов, четыре 305-мм, восемь 203-мм и шесть 102-мм орудий), «Индиана» и «Орегон» (по 10,3 тыс. тонн, 15 узлов скорости, четыре 330-мм, восемь 203 и четыре 152-мм орудий), броненосец 2-го класса «Техас» (6,1 тыс. тонн, 17 узлов скорости, два 305-мм и шесть 152-мм орудий). Единственным шансом испанцев был прорыв, причём частью эскадры пришлось бы пожертвовать. Но в реальности дело оказалось невыполнимым: испанские крейсера не могли развить полного хода из-за поломок машин, плохого угля, а артиллеристы оказать достойного сопротивления. К тому же боеприпасы были плохого качества, многие пушки неисправны.

Итог был печален: 3 июля 1898 года в битва при Сантьяго-де Куба испанская эскадра была полностью уничтожена. Испанцы потеряли все корабли, 323 человека убитыми, 151 ранеными, 1,6 тыс. человек во главе с адмиралом Серверой пленными. И это при том, что американцы показали довольно невысокую меткость - при более 7 тыс. выстрелов лишь 163 попадания в испанские корабли. 

Лишившись своего основного флота, испанцы запросили мира, война была проиграна. США за всю войну потеряли всего около 500 человек убитыми (от болезней и ран погибло намного больше – около 6 тыс. человек), испанцы более 2,1 тыс. человек (информации о числе умерших от болезней в испанских силах нет, но видимо, не меньше, чем американцев)."

"Итоги войны

- 13 августа 1898 года был подписан Парижский мирный договор. Испанская сторона была вынуждена отказаться от всех своих колоний в Азии и Латинской Америке — Филиппинских островов, Гуама, Пуэрто-Рико и Кубы. Первые три территории стали американскими владениями, за это Соединенные Штаты выплатили испанской короне в качестве компенсации 20 млн. долларов. А Кубу провозгласили независимой республикой, но в реальности она стала «банановой республикой» и «борделем» США. Её внешняя политика, экономика, финансы оказались под полным американским контролем. В бухте Гуантанамо была создана американская военно-морская база.

- США блестяще обкатали сценарий своих будущих войн: информационная война (противника смешивают с грязью ещё до начала «горячей войны», превращая в глазах мирового сообщества в «кровавое чудовище»), блестящее использование недовольства населения, организация «народно-освободительных» движений», провокация, «пиратская» война (контроль над коммуникациями, действия ВМС, десанты и т. д.).

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

- Война дала США статус великой морской державы, американские ВМС после битвы при Сантьяго-де-Куба были признаны как один из ведущих флотов планеты.

- Испано-американская война продемонстрировала всему мировому сообществу силу молодого хищника, на карте мира появилась новая великая держава. Война открыла новую эпоху истории Соединенных Штатов.

- На Филиппинах американцам пришлось повозиться. Филиппинцы решили стать свободными и начали войну против США. Филиппино-американская война продолжалась до 1902 года (активная фаза), а отдельные отряды сопротивлялись до 1913 года. США пришлось бросить против филиппинцев 125 тыс. армию. Американцы не стеснялись применять самые жестокие методы (что было характерно для европейских колонизаторов), поэтому если филиппинских воинов погибло примерно 20 тыс. человек, то мирных жителей 200 тыс. Американцы морили деревни голодом, совершали массовые убийства крестьян. К примеру, только в районе Балангига на острове Самар бравые американские вояки в 1901 году выбили около 10 тыс. человек, причем убивали по древнему принципу кочевых войн - «убивать всех, кто выше тележной оси». Здесь были застрелены или заколоты штыками все люди старше 10-летнего возраста. Естественно, что пресса США и «мировая общественность» не особенно заинтересовалась этими актами террора и геноцида (своим можно)."