пятница, 21 апреля 2017 г.

Текущее положение дел

Делаю Mutable и Immutable строки.

пятница, 14 апреля 2017 г.

Прислали тут. Dependency Injection однакож

Цитата:

https://bitbucket.org/NickHodges/nickdemocode/src/6ec49b0b2773/diid/?at=default

Поставил вчера Spring4D и скомпилил, разобрали 1 пример, всё очень красиво. 
У нас кстати на работе DI вовсю используют, но не знали что это называется DI ^_^

вот этот разбирали

Конец цитаты.

Надеюсь, что автор не обидится на цитирование.

Связанный пост:
http://programmingmindstream.blogspot.ru/2017/04/blog-post_14.html?m=1

Коротко. Ни о чём. Ох какую "штуку" я сейчас "придумал"

1. Регистрировать reader'ы и writer'ы для CF_XXX.
2. Вытащить это дело в скриптовую машину.
3. Вытащить туда же всякие фильтры. Типа hyperlinkEliminator etc.
3а. Для этого сделать абстрактные ini-процедуры.
4. Для простейших фильтров также регистрировать SetTo.
4а. Сделать заготовочки для наиболее используемых фильтров с возможностью переопределять "ручки" из скриптов.
5. Вытащить скриптовую машину в dll.

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

Dependency Injection однакож.

Кому-нибудь ведь нужно же кастомизируемое преобразование скажем HTML в RTF и обратно.

А ещё можно индексатор текстов для скриптов на этом механизме "запилить".

И не только для windows теперь.

Связанный пост:
http://programmingmindstream.blogspot.ru/2017/04/blog-post.html?m=1

И ещё туда надо TVirtualInterface прикрутить...

Вообще мысли в последнее время "бегут далеко впереди пальцев".

О "функциональщине"

'OutFile' file:openWrite
RtfWriter:make
linkFilter:
HyperLinkEliminator:make
linkFilter:
ANSItoOEMConverter:make
linkFilter:
FormulaToUnicodeCharsConverter:make
linkFilter:
CommentsEliminator:make
'InFile' file:openRead
HTMLReader:make
Reader:execute

- преобразует HTML в RTF.

Применяя четыре фильтра.

Off-topic. Непал. Лукла. Аэропорт

#байка #непал #лукла

В Непале есть такое местечко. Называется Лукла.

Там есть аэропорт.

Туда летают самолёты типа нашего "кукурузника".

Взлётная полоса там расположена реально на скале. На скальном утёсе.

Внизу пропасть. С другой стороны скальная стенка.

Самолёты садятся со стороны пропасти. Гасят скорость. Доезжают до скальной стенки. Разворачиваются. И продолжают гасить скорость выкатываясь на обрыв над пропастью. И останавливаются.и если повезёт.

Взлетают они тоже весело.

Стартуют от скальной стенки. И отрываются от ВПП прямо на краю пропасти. На самом краю.

Я оттуда улетал как-то. Это произвело на меня неизгладимое впечатление.

Offtopic. Непал. О работе

#байка #непал #шерпы

Есть в Непале городок Намче-базар.

Шерпская столица.

Отрезан от мира горами.

Там есть всё. Интернет. Телеграф. Телефон. Чугунные ванные и фаянсовые унитазы.

Только это всё занесено "на себе".

Снизу. Из долины.

Каждый день сотни шерпов ходят вверх-вниз с грузом. На себе.

Я видел парнейт которые несли чугунную ванную. И видел парня, который нём десять листов фанеры толщиной сантиметр.

Люди идут. Несут груз.

За копейки.

Снизу вверх.

Две недели. Две недели он тащит эти десять листов фанеры.

Вот тогда я и полюбил СВОЮ работу...

четверг, 13 апреля 2017 г.

Offtopic. Германия. О произношении

В Германии в баре я попросил Колу. Мне принесли стопку водки. Отказываться не стал. Наверное официанту виднее.

Ну и по-немецки - Korn это водка. Возможно меня так услышали.

Offtopic. Германия. Начало

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

Ну и мне пришлось из Мюнхена ехать на общественном транспорте.

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

Ну и когда я приехал на вокзал Штольберга, то оказалось, что это "жопа мира". Он сильно на окраине. До города - автобус, который ходит раз в час.

На площади у вокзала тусовались цыгане и таксисты. На такси у меня денег не было. И с таксистами в разговор было вступать неудобно. Я стал ждать автобус.

Ко мне подошёл негр и на крайне ломанном немецком пытался что-то спросить.

Поскольку у меня у самого немецкий ниже плинтуса - я перешёл на английский. Во мне сидел стереотип, что все негры должны знать английский.

Негр посмотрел на меня как на умалишённого.

Когда мы сели в итоге в автобус - негр нашёл там другого негра. И они бойко заговорили... по-французски.

Вот такие вот стереотипы...

Offtopic. О международных связях

В 93м году я был в Германии. Типа "работал" на фирме Grünentall.

Ну мало того, что это было на самом западе Германии в городке Штольберг, около Ахена, где немцы воспринимали каждого русского как "чудо из чудес" и "ходили посмотреть на живого русского".

Так ещё они были КРАЙНЕ удивлены, что у нас есть СТАНДАРТЫ на размеры бумаги и что эти стандарты совпадают с теми, которые у них.

Немец восклицал - "A vier! Ich kann nicht glauben dass du weisst A vier Blatt!"

вторник, 11 апреля 2017 г.

Offtopic. Памир. Часть 4

#памир #байка

Памир. Часть четвёртая.

Отъезд домой.

Распрощавшись с "хохлами" в Оше, мы поспешили к нашему старому знакомому чайханщику Хасану. В чайхану в парке Навои.

Хасан как всегда принял нас с радостью.

Вечером был плов, был шашлык, был салат Ачичук, который Хасан мастерски готовил, конечно зелёный чай и некоторое количество местной тридцативосьмиградусной водки.

Вечер удался.

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

Мы не знали что делать. Наличных денег у нас было крайне мало.

Мы поехали в авиакассу, но там нам сказали, что билеты можно сдать только в Москве.

Мы в итоге были без денег и толком без билетов.

Лёха пошёл ругаться с кассиром. Грозил всякими земными и небесными карами.

И о чудо! Через два часа переговоров у нас забрали билеты и выдали пол-пакета киргизских сомов.

Мы посовещались с Хасаном и поняли, что путь домой лежит через Узбекистан.

На следующее утро мы договорились с таксистом, что он отвезёт нас из Оша в Андижан, где есть аэропорт.

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

Знакомого обменщика на рынке не оказалось. Было слишком рано.

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

Мы отдали ему деньги. Он начал их считать. Пока он их считал, подошёл знакомый обменщик и стал делать нам знаки, что мы идиоты.

Оказалось, что "жучок" был "ломщиком". И он уже убрал часть наших денег себе в рукав. При подсчёте.

Но мы в итоге отбили наши деньги, а обменщик помог нам. И мы уже у него поменяли сомы на сумы.

Поменяли пол-пакета сомов на два пакета сумов.

После этого мы поехали в Андижан.

Особенно меня поразил контраст на границе Узбекистана и Киргизии. Раздолбанный киргизский посёлок после границы переходит в автобан.

Ну и бравые узбекские пограничники ни в какое сравнение не шли с киргизскими с отвисшими ремнями и нечищенными сапогами.

Узбекистан чем-то напомнил третий рейх. По его "хрестоматийным" внешним признакам.

В Киргизии же напротив чувствовался "разгул демократии".

Через границу мы проехали без проблем.

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

В Андижане на ближайшую неделю билетов не оказалось.

Мы поехали обратно в Ош, решив, что назавтра поедем в Ташкент.

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

В Ош мы вернулись сильно под вечер.

Заночевали опять у Хасана, с которым варили плов из вермишели.

Когда мы ложились спать, то обнаружили, что Лёха оставил деньги и документы в машине таксиста.

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

Мы с ним сторговались, что он отвезёт нас в Ташкент. У него была небольшая местная машина дэу-тикко.

В Ташкент мы ехали долго. Часов восемь.

Перед последним перевалом. У машины кончился бензин. Стрелка упала в ноль. Загорелась лампочка.

Заправиться было негде. Все заправки были пустые. Как раз случился бензиновый кризис.

Но чудо-машина дэу-тикко проехала километров 200 через перевал с пустым баком. И встала  намертво уже около ташкентского аэропорта.

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

В аэропорту опять на ближайшую неделю билетов не оказалось. Мы уже стали подумывать о поезде.

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

Очко играло. Но делать было нечего. И мы решили попробовать.

Он оказался крайне щепитилен. Билеты мы в итоге взяли в кассе. С брони. А его деньги отдали ему уже после регистрации и таможенного контроля. Он "неожиданно" оказался уже в нейтральной зоне.

На таможенном контроле Лёха, чтобы избежать перевеса, положил две дыни в рукава пуховки и "накинул" пуховку себе на руку.

Дыни у нас конечно же нашли. Посмеялись над нами и сказали, что мы можем свободно везти дыни. В подарок от Ташкентских таможенников.

В самолёт мы купили бутылку узбекского коньяка, который пить не смогли. Уж больно страннен он был.

В тот же вечер мы были в Москве.

Так и закончилась наша памирская эпопея.

Спасибо всем хорошим людям, которых мы встретили на бескрайних просторах Средней Азии.

пятница, 7 апреля 2017 г.

Offtopic. Несбыточная Антарктида

В детстве я мечтал стать полярником. И почему-то не просто полярником, полярным радистом. Фильм в то время какой-то показывали про Советскую экспедицию в Антарктиду.

Ну и имена Амундсена, Нансена, Скота и Пири, а также Лазарева и Беллинсгаузена, а также Крузенштерна заодно - были для меня не пустым звуком.

Ну и Джеком Лондоном я зачитывался.

Смок и Малыш, а также Время-не-ждёт - были спутниками моих мечт.

Я мысленно смолил лыжи. Ставил на огонь кофейник. Жарил бекон с бобами. Задавал корм собакам.

Но в итоге стал программистом... не самым успешным. Но возможно успешнее, чем полярником.

среда, 5 апреля 2017 г.

Offtopic. Памир. Часть 3

Памир. Пик Ленина. Часть третья.

Мы с "хохлами" двинулись дальше к вершине Раздельная.

Идти было тяжело. Намело много свежего и сырого снега.

Приходилось тропить попеременно.

Временами видимость ухудшалась.

В голове "кружили вертолёты". Высота была уже под 6 тысяч.

Часов через пять. Затемно. Мы добрались до вершины Раздельная и спустились на перемычку, между вершиной Раздельная и пиком Ленина.

Поставили лагерь. И "хохлы" опять напоили нас горячим чаем и накормили горячими макаронами. Нашим вкладом в общий ужин был наш пеммикан на бараньем жиру. Который ребята оценили как Perfekt!

Мы с "хохлами" дёрнули по 20 грамм спирта и договорились, что наутро вместе пойдём на вершину.

Ночь выдалась "ударная". Вертолёты в голове не отпускали меня. Временами тянуло на улицу - подышать и поблевать.

В общем - ночь я толком не спал.

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

Ещё и опять разыгралась пурга.

Лёха собрался и пошёл вместе с "хохлами", а я остался в палатке.

Отсутствовали они часов шесть.

Потом пришёл Лёха и засунул мне руки в палатку, со словами "давай варежки".

Оказалось, что на подъёме, он потерял свои перчатки или "пролюбил" и какое-то время ходил с голыми руками. Ну и малость их поморозил.

Лёху отогрели. Опять выпили с "хохлами" горячего чаю и легли спать.

Наутро погоды совсем не было. Пурга-метель, туман.

Мы пошли вниз.

Спускались поодиночке "в альпийском стиле".

Местами я закрывал глаза, когда перепрыгивал трещины, такими огромными мне они казались.

К часам четырём дня мы спустились в лагерь. Где нас тепло встретил Корепанов.

На следующий день у нас были совместные посиделки с Корепановым, немцами и "хохлами".

Мы допивали принесённое нами пиво и спирт из запсных фляг.

Было братание народов.

Я долго рассказывал немцам, что у нас сломался приму. И долго пытался объяснить что это  такое. Всякие разные слова были использованы. И Gas-machine и Benzin-machine и Oel-machine. Потом оказалось ... что "примус" это НЕМЕЦКОЕ слово.

И разговор пошёл чётче.

Немцы "окончательно вспомнили русский", а я "окончательно вспомнил немецкий".

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

Но Лёха сказал - "хрен с ней с горой, пора домой". Я был с ним согласен.

Наутро мы двинулись с обратный путь.

Оказалось, что "хохлы" прямо из Москвы приехали на луковую поляну на Газели, которую. купили на бригаду. Они работали в Москве - красили мосты.

Как один из них шутил - "я инженер по ракетным соплам, в Киеве работы нет, вот работаю в Москве по специальности - крашу мосты. Ведь пульвелизатор - по сути то же сопло".

Ребята предложили подвезти нас на своей Газеле - до Оша.

Ехали мы весело. Из ребят двое оказались профессиональными водителями.

Видели бы вы как они горные броды на этой Газеле проезжали. Камешек-по -камешку.

Газель! И хороший водитель!

Ещё с ними был замечательный парень - Павел. Из Твери.

Такой "видавший виды чувак". На пик Коммунизма зимой пытался взойти. С пика Ленина на лыжах съезжал. Горнолыжник. Альпинист.

Всю дорогу развлекал нас своими байками.

Ребята звали нас с собой на Газеле до Москвы, но мы отказались, у нас вроде как были авиабилеты. Правда с открытой датой.

И как оказалось - неопределённым сроком вылета.

Ребята довезли нас до Оша. До чайханы Хасана. Где мы с ними и простились.

Казалось - завтра утром самолёт и привет Москва.

Но не тут-то было....

Продолжение следует.

Offtopic. Памир. Часть 2

Памир. Пик Ленина. Часть вторая. Наутро мы встали. Собрали рюкзаки и сопровождаемые Раимом двинулись в базовый лагерь пика Ленина, через перевал Путешественников. Раим нёс коммерческий груз и одновременно сопровождал нас. На перевале путешественников мы встретили двоих альпинистов из ЮАР. Один из них оказался русским. Мы с ними приятно поболтали. На одном из привалов Раим поднял и попробовал на вес наши рюкзаки. Его глаза заметно округлились. Чокнутые русские. Сказал он. Я профессиональный носильщик и ношу не больше двадцати килограмм. Ну а такие веса - пусть носят чокнутые русские, которые с жиру бесятся. Ну ещё бы. У нас же кроме всего прочего был двадцатикилограммовый арбуз. И семь литров пива. Один литр пива мы выпили с начальником лагеря. После этого Раим смотрел на нас с уважением. К вечеру мы добрались к базовому лагерю. Там нас отправили к начальнику, коим и оказался Георгий Корепанов. Он нас тепло принял. А когда узнал, что мы принесли пиво - принял ещё теплее. Пиво на такой высоте - на вес золота. Киргизы продавали тогда пиво иностранным альпинистам по 10 долларов за банку. Мы выпили с Корепановым и стали есть арбуз. Половину съели. Половину не осилили. Выбрасывать было жалко. Посему мы пошли угощать немцев, которые стояли лагерем неподалёку. Немцы сначала малость охренели и кричали - kein Geld, но когда поняли, что это das ist Geschenk - обрадовались и уплетали арбуз за обе щёки. И даже пытались говорить по-русски. Корепанов кормил нас халявными продуктами от английской экспедиции и давал ценные советы. На следующий день мы пошли на восхождение. Сначала шли вместе с Раимом, который поднимал коммерческий груз во второй лагерь. Но очень скоро мы сильно обогнали его. Также по пути мы десятками обогнали коммерческие группы немцев и австрияков, которые и кошки то возможно видели первый раз в жизни. Заночевали мы на плече вершины Раздельная. При этом нам встретились альпинисты из Москвы, которые шли вниз и отдали нам спортивные напитки и несколько пачек картофельного пюре. Когда мы встали на ночёвку, то обнаружили, что Примус у нас не работает. Хотя в Оше мы его и чистили и чинили. Ну такая в ту пору была техника. А поскольку я в гараже завернул голову примусу огромным разводным ключём, то и снять я её не смог. Примус еле теплился. И мог лишь растопить снег. Тут и пригодились спортивные напитки и картофельное пюре, которое нам отдали наши братья-альпинисты. Мы оратор с него и разводили напитки и картофельное пюре. В холодной воде. Тем и питались. Сварить полноценный ужин - возможности не было. На следующий день разгорелась непогода. Пурга и одновременно туман. Мы проводили до обеда и опять перекусили холодным картофельным пюре. Минут через 50 после нашего "обеда" к нам через пургу и туман, превознемогая трудности и лишения поднялась украинская группа братьев-альпинистов. Мы с ними мило пообщались. Они напоили нас горячим чаем. Горячего чая нам как раз - сильно не хватало. После обеда распогодилось. Мы свернули лагерь и пошли дальше. К вершине Раздельная. Вместе с "хохлами", как они сами себя называли. Продолжение следует.

Offtopic. Памир. Часть 1

Киргизия, Таджикистан, Горный Бадахшан. Пик Ленина. Часть первая.

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

Это вообще должно было быть "утешительное восхождение" поскольку мы покинули нашу группу, делавшую крутой поход "памирский марафон 99".

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

На обратном пути многое приключилось.

Мы попали в пыльную бурю. Более грязным я в жизни был лишь когда выбраться из селя.

Потом к нам приходил местный вахкабит Коля с огроменой бородой, автоматом калашникова и в шляпе-афганке.

Выменял у нас верёвку на кусок баранины.

Оказался очень интересным собеседником.

Потом мы преодолели высокогорную пустыню. Почти сутки без воды.

Не думал я, что за такое короткое время может начать сказать жажда.

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

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

Но всё обошлось. Немного помог местный водитель и оставшиеся наши солдаты.

За пять дней мы добрались обратно в Ош.

Где пешком, а где-то на попутках.

Попутно в селении Сары-Могол, местные жители нас поили, кормили и спать укладывали как родных.

Один момент мы ехали в автобусе вместе с баранами в мешке и творогом во флягах. Творог бродил на жаре и вокзал из фляги. Леха зачёрпывал рукой творог и мы его радостно ели. Местные смотрели на нас и радостно ржали.

В Оше мы разместились у нашего древнего приятеля чайханщика Хасана.

Мы пили с ним, чай и водку. Ели плов.

В парке Навои пилили Хасану для кухни дрова, а местные собирались посмотреть "как белые люди работают".

У Хасана мы пробыли три дня. Воспаление лёгких меня отпустило.

Мы засобирались на Пик Ленина.

Купили лекарства в аптечку. Сварили пеммикан на бараньем жиру. Выучили карту, которую нарисовал нам Андрей Лебедев на листочке в клетку.

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

Пеммиканом был сварен. Аптечка собрана. Примус почищен и починен при помощи местых умельцев из гаражей.

С местными водилами договорились, что они отвезут нас в лагерь под пик Ленина на луковую поляну.

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

Кроме всего прочего мы купили арбуз килограмм на двадцать и восемь литров пива в баллонах.

И двинулись в путь.

Ехали мы долго. Часов десять. Уазик местами глох. А местами мы выходили из машины, чтобы ей было проще ехать и шли пешком.

Конечно же мы проехали поворот в нужную долину и заехали совсем не туда.

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

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

К этому прилагалась также ослица с ослёнком.

Мальчишки не знали ни слова по-русски.

Таким караваном мы отправились к луковой поляне, распростившись с водилой и всей его гоп-компанией.

Рюкзаки мы навьючили на верблюда. А сами пошли пешком.

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

Шли мы часов двенадцать.

Сначала мальчишки жестами показывали, что "тут недалеко".

Но к концу десятого часа сами поникли духом.

В итоге мы всё же, к закату солнца, добрались до луковой поляны.

Мальчишкам была выдана "премия" около 50 долларов. Они были счастливы, ибо больших денег они в жизни не видели.

Мы заселились на ночёвку на луковой поляне. Выпили литр пива и немножко спирта с начальником лагеря. Он же нашёл нам на завтра провожатого. Киргиза. Местного портера-носильщика по имени Раим.

Продолжение следует...

четверг, 30 марта 2017 г.

Offtopic. Хибины. Начало

Вместо предисловия.

Было дело. Ходили мы в лыжный поход. На Кольский полуостров. В Хибины.

Для меня это был первый серьёзный лыжный поход. Тем более в пусть в какие никакие, но горы.

До этого я ходил лишь во Владимирскую область и на Белое море.

Готовились мы к походу серьёзно. Шили утеплённые бахилы. Подгоняли крепления. Собирали ремнабор и аптечку.

Сшили полог в палатку Зима. Полог это такая палатка внутри палатки. Его основной задачей является собирание конденсата. Ну чтобы внешняя палатка суше была, на и чтобы на морду не капало.

Готовились также лавинные лопаты (а точнее лавиные листы) и лавинные ленты.

Были куплены два новых примуса Шмель.

Отдельно была припасена скороварка, которая по тем временам тоже была достаточной ценностью.

Откуда-то из закромов турклуба достали здоровенный алюминиевый термос, чтобы в нём носить бульон на обеденный перекус.

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

Покупались продукты. Сушились сухари.
 
Василию было дадено задание заранее в Москве порезать колбасу и сыр, чтобы не делать этого на морозе.

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

Времена были непростые. Специальные "горные" окантованные лыжи достать было непросто. Каждая лыжа была отдельной самостоятельной ценностью.

Также были заготовлены свечи и оргстекло для развода костра.

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

Регулировались и подгонялись кошки. Шились тёплые рукавицы.

Отдельные рукастые товарищи сшили из добытого правдами и неправдами синтепона штаны-самосбросы.

Кто-то пошил штаны из использованных фильтров от вентиляции, которые меняли у моей матушки на заводе.

Отдельно были припасены тёплые подштаннки с начёсом.

Отдельно была не забыта гигиеническая губная помада синего цвета, чтобы смазывать потрескавшиеся на морозе губы.

Не забыты были и ручные фонарики "жучки" для дежурных.

Была составлена раскладка продуктов и запланировано "меню".

Были сшиты два групповых спальника. Каждый на пятерых, именуемые "пентюх".

Я сшил себе новый рюкзак, приладив его на старый имеющийся станок.

Рюкзак был специальный "зимний". С раскрывающимися створками и шнуровкой.

В него можно было "горой" сложить всё вещи и снарягу. Закрыть створки и зашнуровать как ботинок. Это позволяло не возиться на морозе с тщательной укладкой рюкзака.

Также я распорол городскую "пуховку" и перешил её, добавив к имеющемуся скудному пуху дополнительный слой синтепона. А также переделал устройство рукавов и карманов.

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

Мы чувствовали себя как минимум сродни героям Джека Лондона.

Это был первый по-настоящему серьёзный лыжный поход почти для всех нас.

Всё воспринималось довольно серьёзно и всё же с некоторой долей авантюризма.

Всем хотелось испытать себя в деле на "настоящем морозе".

Мы были молоды и бесшабашны.

Наш командир Ваня своими рассказами о своих прошлых походах зимой подогревал наш интерес.

Впереди была сдача сессии, а потом поезд и "здравствуйте Хибины"...

Продолжение следует...

Offtopic. Непал

В том же Непале, где шерпы ходят в драных дешёвых кроссовках - была занятная история.

Мы делали линейный поход от долины вершины Макалу, через долину вершины Ама-Даблам к долине базового лагеря Эвереста. В конце маршрута мы планировали взойти на вершину Ама-Даблам.

Обычно в Гималаях выше уровня снега линейные маршруты ходят крайне редко. Но мы же чокнутые русские...

С гидом все подробности были оговорены. Он крутит пальцем у виска, но на условия согласился.

А без гида или офицера связи там официально ходить нельзя. Национальный парк и всё такое. Да и местные власти лоббируют занятость своего населения.

Ну и с гидом было оговорено, что мы нанимаем носильщиков (что тоже положено ибо надо обеспечивать занятость населения), они несут груз до базового лагеря Макалу. Там мы расплачиваемся с ними и далее продолжаем поход автономно. И гид получает свою порцию веса из общего снаряжения и продуктов. И несёт это честно наравне со всеми.

Гид согласился.

Но как показывает дальнейшее развитие событий - он видимо не верил в такой исход. Он видимо надеялся, что мы сломаемся и повернём раньше.

Но до базового лагеря Макалу мы таки добрались. По совершенно беднейшей долине. Где купить можно было только пустой рис с приправой карри и зелёный чай. Пустого риса с зелёным чаем я тогда наелся на две жизни вперёд.

В базовом лагере Макалу мы расположились с импортерами и располагались с ними.

Нашему году мы выдали его порцию общего веса.

Гид ходил чернее тучи и всем своим видом показывал, что он "белая кость" и ему не пристало носить груз. Но мы были непреклонны. Уговор есть уговор.

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

Того звали Мадин и был он в драной штормовке и драных дешёвых кроссовках. И без снаряжения вообще. И к тому же еды на него рассчитано не было.

Мы пытались увещевать гида, но тут он был непреклонен. Он сказал, что пойдёт лишь с носильщиком. Ну мы не стали настаивать на обратном.

Картина конечно была маслом. Ледник. Снег по колено. Жарища адовая, до сорока по Цельсию на солнце. Мы тропим, а сзади идут гид с Мадином в драных кроссовках.

А ночью - наоборот - до минус пятнадцати. А то и двадцати. Лишь солнце упало за горизонт. Высота выше пяти тысяч. Климат резко континентальный.

Бедный Мадин жутко мёрз и стучал зубами, но стойко переносил лишения как настоящий мужчина и дитя гор.

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

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

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

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

Я не мог смотреть на стучание зубами и безмолвные страдания Мадина - ну и отдал ему эти шмотки, ну и кое-что ещё по-мелочи.

Он был счастлив и всю дорогу говорил спасибо.

Пару раз мы пересекали закрытые ледники в связках. Мадину это явно было в новинку.

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

Местами мы шли в кошках, а Мадин скользил средним в связке в своих драных кроссовках. Местами мы рубили ему ступени. На особенно крутых участках.

Надо было видеть его глаза в тот момент.

Но вся эта эпопея продолжалась буквально два дня.

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

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

Мы распрощались, условившись что встретимся с ним в конце нашего маршрута. Чтобы он типа привёл нас обратно и отчитался перед своим начальством.

Особенно тепло мы прощались с Мадином. Который смотрел на нас с уважением и одновременно как на "белых людей"  которым нечего делать и они бесятся с жиру.

Дальше мы сделали свой линейный поход.

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

Так вот спускались мы с него - двое суток. Верёвки я повесил наверное штук тридцать.

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

Но больших разломов и трещин, а также сбросов по сто и более метров - я никогда до этого не видел. Даже на Тянь-Шане или Памире. Для справки: сто метров - это две шестнадцатиэтажки, поставленные друг на друга.

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

Мы закончили свой поход где и планировали. И там мы встретились с Чой-Саном, так звали нашего гида, который спустился и прилетел вокруг всего района на самолёте.

Правда его начальство всё равно узнало, что он нас кинул. Не от нас. Но он отговорился, сказав что упал в трещину и повредил себе ногу.

На Ама-Даблам мы правда так и не взошли.

Не по зубам оказалась нам эта гора. Да и никто и не "горел рвением". Особенно я. Я и так верёвок навешался. А всю дорогу меня одолевала мысль, что я по горам шарюсь, а через два месяца у меня сын должен родится. Идиот же я. Как меня жена тогда отпустила. Не знаю. Золотая женщина.

Вот такая вот история.

С тех пор я правда в горы больше пока не ходил.

пятница, 17 марта 2017 г.

Offtopic. Размышления о твёрдом знаке

Почему нужен был твёрдый знак в конце слова? До реформы 18-го года.

Приведу примеры для мужского рода:

И - щит(ъ)
Р - щит(а)
Д - щит(у)
В - щит(а)
Т - щит(омъ)
П - о щит(е)

И - кон(ь)
Р - кон(я)
Д - кон(ю)
В - кон(я)
Т - кон(ёмъ)
П - о кон(е)

И - пап(а)
Р - пап(ы)
Д - пап(е)
В - пап(у)
Т - пап(ой)
П - о пап(е)

Мысль понятна? Всегда должно быть окончание на "слог с гласной в конце" или "й" или "ь" или "ъ".

Твёрдый знак (ъ) показывал "нулевое окончание".

Видимо раньше он читался наподобие гласной. Ну как в болгарском языке.

И - нож(ъ)
Р - нож(а)
Д - нож(у)
В - нож(ъ)
Т - нож(омъ)
П - о нож(е)

Ссылка. Немецкие падежи и предлоги

http://deutsch-sprechen.ru/padezhi-v-nemeckom-jazyke/

вторник, 14 марта 2017 г.

Цитата. Про UML

"UML не взлетел по одной простой причине: каждый трактует и рисует диаграммы на свой вкус. При чём проблема не в пользователях языка. Проблема в школах, преподающих UML. Мало того, что часто теория оторвана от реальности, так еще и практически у каждой школы своя трактовка элементов диаграмм, а иногда и самих диаграмм.

Не верите? Проверьте по гуглу: aggregation vs composition — десятки, сотни разных трактовок.

Лично моё отношение к UML: отличная идея с ужаснейшей реализацией."

В общем - согласен.

Я лично - не разочаровался в UML, но множество коллег не могут ошибаться. А я не могу донести свою позицию.

Ссылка. UML. Знакомо

https://m.habrahabr.ru/company/spbifmo/blog/323780/

понедельник, 13 марта 2017 г.

Коротко. Ни о чём

Ищут люди smoke-тест для калькулятора. Удивлён. Вообще говоря - хорошее желание. Не могу только понять кому понадобилось. Может студентам? Для курсовой...

среда, 22 февраля 2017 г.

Побрюзжу №6

http://www.risk.ru/blog/207821

Есть такой рецепт "пеммикан от Андрея Лебедева".

Мясо вываренное в свином сале. Реально сохраняется на жаре несколько месяцев без холодильника.

Так я что вспомнил. Мы ходили как-то в Турцию в горы.

И встретили там альпинистов турок.

Ну и мы посидели. Пообщались.

Хорошие ребята.

Накормили их нашей гречкой с пеммиканом.

Они сказали, что очень вкусно. Поинтересовались рецептом.

Я начал рассказывать и понял, что они же мусульмане. Свинина - нихт кошер. Или нихт халяль.

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

Короче - взял грех на душу...

Побрюзжу №5

1. Пишу про Delphi. Приходит чувак и говорит - "Delphi говно, используй функциональные языки". А я блин не знал, что такие языки оленьи бывают.
2. Пишу про TDD. Приходят "адепты" и говорят "у тебя некошерный TDD".
2а. Пишу про UML и MDA. Муку. Это отстой. Сейчас в моде уже другие кунштюки. В однобортном сейчас уже никто не воюет.
3. Пишу про синглетоны на atomic-операциях. Приходят и говорят, что надо использовать критические секции. А то я блин не знаю про критические секции. Но я же изначально хотел без них и озвучил почему. Или начинают рассказывать, что собственные данные синглетона тоже надо защищать при многопоточности. А то я блин не знал.
4. Пишу про свои "задорновые" наблюдения про немецкий. Приходят и говорят - "не выноси это на всеобщее обозрение". Иначе что? Покажусь глупым? Так мне это не грозит. Я и так не слыву уж очень умным. И не стремлюсь умным показаться. Я ведь не на работу переводчиком нанимаюсь.
5. Пишу про "слабые ссылки". Приходит Штефан Глинка и говорит, что они могут ТЕОРЕТИЧЕСКИ вести к AV. А то Я блин не знаю. Но я ведь наверное не с бодуна их делал. И учитывал возможные ограничения области применения.
6. Боюсь про белорусский и ВКЛ ПИСАТЬ. Как бы "змагары" не пришли. И не сказали - не трожь своими грязными москальскими руками наше ридное.
7. Не боюсь только про турецкий какую-нибудь глупость написать. Они наверное русского не знают. Но правда и мне про турецкий что-то нечего написать.
8. Про историю положем ещё можно писать. Там кто первый надел халат - тот и Фоменко или Мурад Аджи.
9. Про айкидо и танцы - вот только ничего не писал, так как так и не смог остудить эти премудрости языка тела. Нечего сказать. В шоке.

И ведь главное - пишу вроде без оценочных суждений. Стараюсь никого не задеть.

Задаёшь вопрос - "что я не так сказал". Молчание...

Нашёл ошибку - скажи. Чётко и по делу. И без оценочных суждений. Так нет же...

А не писать - не могу. Графоман-с. Я ведь экстраверт, а профессия - для интравертов.

Да тут есть некий инфантилизм. Как ребёнок с растворённым сознанием. Узнал сам - хочется поделиться. Ну что поделаешь. И в школе со мной боролись. А у меня вон и дочка такая. Гены наверное...

Про что писать? Про горы? Ну так это глупо...

Побрюзжу №4

"Общались ли вы с носителями языка?"

Да общался. Как сейчас помню. Дело было на Памире. Мы немцев угостили арбузом и пивом. Они долго не могли поверить, что это подарок (das Geschenck) от чистого сердца.

Ну через перевал путешественников карнизы обычно пиво носят на продажу.

Да и какое пиво на четырёх тысячах.

Потом немного выпили и я им объяснял, что мы не взошли на пик Ленина, потому что у нас сломался примус и мы два дня питались холодной едой. Хорошо, что встреченные холлы пару раз горячим чаем напоили (хорошие ребята).

 В итоге примус оказался таки немецким словом.

А я им всё gas machine, да gas machine...

вторник, 21 февраля 2017 г.

Побрюзжу №3

Судя по блогу, сетевое общение почему-то скатывается примерно к такому:

- Давайте я вам расскажу, что я узнал.
- Эй ты криворукий, ты всё не так делаешь.
- А как надо?
- Надо не так как ты.

Побрюзжу №2

1. Пишу про Delphi. Приходит чувак и говорит - "Delphi говно, используй функциональные языки". А я блин не знал, что такие языки оленьи бывают.
2. Пишу про TDD. Приходят "адепты" и говорят "у тебя некошерный TDD".
2а. Пишу про UML и MDA. Муку. Это отстой. Сейчас в моде уже другие кунштюки. В однобортном сейчас уже никто не воюет.
3. Пишу про Синглетоны на atomic-операциях. Приходят и говорят, что надо использовать критические секции. А то Я блин не знаю про критические секции.
4. Пишу про свои "задорновые" наблюдения про немецкий. Приходят и говорят - "не выноси это на всеобщее обозрение". Иначе что? Покажусь глупым? Так мне это не грозит. Я и так не слыву уж очень умным. И не стремлюсь умным показаться. Я ведь не на работу переводчиком нанимаюсь.
5. Пишу про "слабые ссылки". Приходит Штефан Глинка и говорит, что они могут ТЕОРЕТИЧЕСКИ вести к AV. А то Я блин не знаю. Но я ведь наверное не с бодуна их делал. И учитывал возможные ограничения области применения.
6. Боюсь про белорусский и ВКЛ ПИСАТЬ. Как бы "змагары" не пришли. И не сказали - не трожь своими грязными москальскими руками наше ридное.
7. Не боюсь только про турецкий какую-нибудь глупость написать. Они наверное русского не знают. Но правда и мне про турецкий что-то нечего написать.

И ведь главное - пишу вроде без оценочных суждений. Стараюсь никого не задеть.

Задаёшь вопрос - "что я не так сказал". Молчание...

Нашёл ошибку - скажи. Чётко и по делу. И без оценочных суждений. Так нет же...

А не писать - не могу. Графоман-с. Я ведь экстраверт, а профессия - для интравертов.

Да тут есть некий инфантилизм. Как ребёнок с растворённым сознанием. Узнал сам - хочется поделиться. Ну что поделаешь. И в школе со мной боролись. А у меня вон и дочка такая. Гены наверное...

Про что писать? Про горы? Ну так это глупо...

Побрюзжу №1

Как я уже писал - как решать квадратные уравнения - мне в жизни не пригодилось.

Зато пригодились знание про коллинеарность векторов. Векторное и скалярное произведения. А также про площадь параллелограма и метрики пространств.

А также про умножение матриц и афинные пространства.

Не знаешь где найдёшь, а где потеряешь...

Зато вся та физика, что я учил - тоже не пригодились. Кроме пожалуй законов Кирхгофа, да и то для достаточно неожиданной области - расчёта вентиляторов и фильтров в элеваторе.

среда, 15 февраля 2017 г.

Для памяти

ToDo. Про следилку за утечками объектов

В следилке за объектами надо писать ещё и время создания объекта. Это должно помочь при разборе логов.

#1353. Вопрос. Как сделать потокобезопасный синглетон

Как на Delphi сделать потокобезопасный синглетон БЕЗ использования критических секций?

Ну скажем только с interlocked- операциями.

Но не так как TMonitor у Embarcadero.

У меня есть свой вариант, но я приведу его позже.

Есть такой эскиз:

Var instance : TMyClass = nil;
 Lock : Integer = 0; // - это глобальные переменные

Function getInstance: TMyClass;
Var LockValue : Integer; // - это локальная переменная
Begin
If instance = nil then
Begin
 LockValue := interlockedIncrement(lock);
 Try
 If lockValue = 1 then
 Begin
  If instance = nil then
   Instance := TMyClass.Create;
 End
 Else
 Begin
  While instance = nil do
   Sleep(0);
 End;
 Finally
  InterlockedDecrement(lock);
 End
End
Result := instance;
Assert(Result <> nil);
End;
Покатить?

(+) https://m.habrahabr.ru/post/147373/

Но там всё про C++ и C#.

Да ещё и со встроенным lock или static-переменой, которая удрвлетворяет "новому стандарту". Что по сути является критической секцией, только скрытой в потрохах языка.

 А меня интересует Delphi. И БЕЗ критических секций и TMonitor.

Или всё проще и достаточно критической секции, но ОДНОЙ. ГЛОБАЛЬНОЙ. А как там с вероятностью deadLock'ов? Когда создаваемый синглетон в своём конструкторе обращается к другому синглетону, который ещё не создан.

ToDo. Для себя

Подумать на тему передачи задач на сервер в виде скриптов.

Вместо EVD - гонять скрипты.

Или точнее - ВМЕСТЕ с EVD - гонять скрипты.

#1352. Ссылка. Странный вопрос, если честно

понедельник, 13 февраля 2017 г.

Вопрос. Может кто чего посоветует

Наверняка в природе существует аудио- словарь немецкого языка. Такой чтобы в наушники проговаривал слова и фразы сначала по-русски, а потом по-немецки, ну или наоборот. Может кто-нибудь что-нибудь подходящее посоветует? Желательно для десктопа. Хотя и мобильная версия подойдёт.

Ну чтобы сидишь на работе, одел наушники и словарь трындит тебе в фоне. Вместо музыки.

Ну типа:
Ein - один
Wife geht's - как дела
Pronomen - местоимение
Betriebswirtschaft - управление бизнесом
Auf keinen Fall - никак
Spass machen -  забавлять
Es gibt - существовать
Selbststaendig - независимый
Sicher - уверенно
Eigentlich - на самом деле

Ну и т.д. и т.п.

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

А то ведь когда музыку (со словами) слушаешь - многое запоминается. Даже то, что не надо.

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

Мне кажется, что люди уже должны были сделать что-то подобное. Или я ошибаюсь?

Интересует именно немецкий. Ну и белорусский. Если вдруг... (там ещё приставные буквы крайне интересны)

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

Типа:
Ich - will
During - willst
Eric/sie/es/man - will
Wir - wollen
Ihr - wollt
sie - wollen
Sie - wollen

Ich - wollte
Du - wolltest
We/sie/es/man - wollte
Wir - wollten
Ihr - wolltet
sie - wollten
Sie - wollten

Nominativ - der neue Freund
Akkusativ - den neuen Freund
Dativ - mit dem neuen Freund
Genitiv - des neues Freundes

Ну и отделяемые приставки отдельно хотелось бы. Как меняют форму глагола. И какие падежи.

Если такого нет - дарю идею. Илона Давыдова "the next generation".

Для памяти. Спряжение немецких глаголов

Искал тут словарь.

Не помню куда я его засунул при переезде.

Потом "вспомнил", что 21й век на дворе и есть интернет.

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

Вот:

http://www.babla.ru/спряжения/немецкий/wollen
http://www.babla.ru/спряжения/немецкий/
http://www.babla.ru/немецкий-русский/anzeige

вторник, 7 февраля 2017 г.

#1349. Ссылка. Статья про MVC

Статья про MVC. С разбором ошибок, отсылками к классике, выводами и рекомендациями.

Охота на мифический MVC. Обзор, возвращение к первоисточникам и про то, как анализировать и выводить шаблоны самому


— Не понимаю, почему люди так восхищаются этим Карузо? Косноязычен, гугнив, поёт — ничего не разберешь!
— А вы слышали, как поёт Карузо?
— Да, мне тут кое-что из его репертуара Рабинович напел по телефону.

https://habrahabr.ru/post/321050/

#1348. Ссылки на статьи про стековые фреймы

Связано вот с чем - http://programmingmindstream.blogspot.ru/2017/02/1346.html

http://www.gunsmoker.ru/2015/02/stack-frames.html

https://habrahabr.ru/company/smart_soft/blog/234239/

http://dic.academic.ru/dic.nsf/ruwiki/216673

https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA%D0%BE%D0%B2%D1%8B%D0%B9_%D0%BA%D0%B0%D0%B4%D1%80

При таком обилии материала хочу всё же вскоре опубликовать свою статью. Такую "с объяснением на пальцах". Пока в процессе.

Там вообще "всё просто" - пара (EBP, ESP), но есть "детали".

четверг, 2 февраля 2017 г.

chkdsk in win10

#1347. Ссылка. TVirtualInterface

http://docwiki.embarcadero.com/CodeExamples/XE8/en/Rtti.TVirtualInterface_(Delphi)

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

А мне рассказывали про собственную реализацию интерфейсов для Delphi на стороне Python'а.

(+) http://docwiki.embarcadero.com/Libraries/XE8/en/System.Rtti.TRawVirtualClass

Интересный такой код:

constructor TVirtualInterface.Create(PIID: PTypeInfo);
var
  Methods: TArray<TRttiMethod>;
  Method: TRttiMethod;
  Typ: TRttiType;
  MaxIndex, I: Integer;
begin
  FIntercepts := TObjectList<TImplInfo>.Create(True);
  Typ := FContext.GetType(PIID);
  FIID := TRttiInterfaceType(Typ).GUID;
                              
  Methods := Typ.GetMethods;
  MaxIndex := 2;  // Is this the best way to do this?
  for Method in Methods do
  begin
    if MaxIndex < Method.VirtualIndex then
      MaxIndex := Method.VirtualIndex;
    FIntercepts.Add(TImplInfo.Create(Method, RawCallBack));
  end;

  VTable := AllocMem(SizeOf(Pointer)* (MaxIndex+1));
  PVtablePtr(VTable)[0] := @TVirtualInterface._QIFromIntf;
  PVtablePtr(VTable)[1] := @TVirtualInterface._AddRefFromIntf;
  PVtablePtr(VTable)[2] := @TVirtualInterface._ReleaseFromIntf;
  for I := 0 to FIntercepts.Count-1 do
    PVtablePtr(VTable)[FIntercepts[I].VirtualIndex] := FIntercepts[I].CodeAddress;
  for I := 3 to MaxIndex do
    if PVtablePtr(VTable)[I] = nil then
      PVtablePtr(VTable)[I] := @TVirtualInterface.ErrorProc;
end;

constructor TVirtualInterface.Create(PIID: PTypeInfo;
  InvokeEvent: TVirtualInterfaceInvokeEvent);
begin
  Create(PIID);
  FOnInvoke := InvokeEvent;
end;

destructor TVirtualInterface.Destroy;
begin
  if VTable <> nil then
    FreeMem(VTable);
  FIntercepts.Free;
  inherited;
end;

procedure TVirtualInterface.RawCallback(UserData: Pointer;
  const Args: TArray<TValue>; out Result: TValue);
begin
  if Assigned(FOnInvoke) then
    FOnInvoke(TImplInfo(UserData).FMethod, Args, Result);
end;

procedure TVirtualInterface.ErrorProc;
begin
  raise InsufficientRtti;
end;

function TVirtualInterface._AddRefFromIntf: Integer;
begin
  Result := TVirtualInterface(PByte(Self) -
    (PByte(@Self.VTable) - PByte(Self)))._AddRef;
end;

function TVirtualInterface._ReleaseFromIntf: Integer;
begin
  Result := TVirtualInterface(PByte(Self) -
    (PByte(@Self.VTable) - PByte(Self)))._Release;
end;

function TVirtualInterface._QIFromIntf(const IID: TGUID; out Obj): HResult;
begin
  Result := TVirtualInterface(PByte(Self) -
    (PByte(@Self.VTable) - PByte(Self))).QueryInterface(IID, Obj);
end;

function TVIrtualInterface._AddRef: Integer;
begin
  Result := inherited
end;

function TVIrtualInterface._Release: Integer;
begin
  Result := inherited
end;

function TVirtualInterface.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if iid = FIID then
  begin
    _AddRef;
    Pointer(Obj) := @VTable;
    Result := S_OK;
  end
  else
    Result := inherited
end;

Прям руки чешутся это в реальных условиях попробовать.

А в SOAP оно используется тут:

  TRIO = class(TComponent, IInterface, IRIOAccess)
  private type
    TRioVirtualInterface = class(TVirtualInterface)
    private
      FRio: TRio;
    protected
//{$IFNDEF AUTOREFCOUNT}
      function _AddRef: Integer; override; stdcall;
      function _Release: Integer; override; stdcall;
//{$ENDIF !AUTOREFCOUNT}
    public
      constructor Create(ARio: TRio; AInterface: Pointer);
//{$IFNDEF AUTOREFCOUNT}
      function QueryInterface(const IID: TGUID; out Obj): HRESULT; override; stdcall;
//{$ENDIF !AUTOREFCOUNT}
    end;
  private
    FInterface: IInterface;

{$IFNDEF AUTOREFCOUNT}
    FRefCount: Integer;
{$ENDIF !AUTOREFCOUNT}

    { Headers }
    FSOAPHeaders: TSOAPHeaders;
    FHeadersOutBound: THeaderList;
    FHeadersInbound: THeaderList;

    FOnAfterExecute: TAfterExecuteEvent;
    FOnBeforeExecute: TBeforeExecuteEvent;
    FOnSendAttachment: TOnSendAttachmentEvent;
    FOnGetAttachment: TOnGetAttachmentEvent;

    procedure Generic(Method: TRttiMethod;
      const Args: TArray; out Result: TValue);

{$IFNDEF AUTOREFCOUNT}
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
{$ENDIF !AUTOREFCOUNT}

    { IRIOAccess }
    function GetRIO: TRIO;

  protected
    FIID: TGUID;
    IntfMD: TIntfMetaData;
    FConverter: IOPConvert;
    FWebNode: IWebNode;

    procedure DoDispatch(const Context: TInvContext; MethNum: Integer; const MethMD: TIntfMethEntry);
    function InternalQI(const IID: TGUID; out Obj): HResult; stdcall;

    { Routines that derived RIOs may override }
    procedure DoAfterExecute(const MethodName: string; Response: TStream); virtual;
    procedure DoBeforeExecute(const MethodName: string; Request: TStream); virtual;
    function  GetResponseStream(BindingType: TWebServiceBindingType): TStream; virtual;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
    { Behave like a TInterfacedObject, (only when Owner = nil) }
{$IFNDEF AUTOREFCOUNT}
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    class function NewInstance: TObject; override;

    property RefCount: Integer read FRefCount;
{$ENDIF !AUTOREFCOUNT}
    property Converter: IOPConvert read FConverter write FConverter;
    property WebNode: IWebNode read FWebNode write FWebNode;
    property SOAPHeaders: TSOAPHeaders read FSOAPHeaders;
  published
    property OnAfterExecute: TAfterExecuteEvent read FOnAfterExecute write FOnAfterExecute;
    property OnBeforeExecute: TBeforeExecuteEvent read FOnBeforeExecute write FOnBeforeExecute;
    property OnSendAttachment: TOnSendAttachmentEvent read FOnSendAttachment write FOnSendAttachment;
    property OnGetAttachment: TOnGetAttachmentEvent read FOnGetAttachment write FOnGetAttachment;
  end;

Тоже крайне забавно.

Самое, что смешное, что оно только там и используется. Хотя возможности для использования данного подхода - огромны.

Для всяческого "собственного маршалинга".

Ну и для ORM например. Хотя есть и другой путь. Несколько обратный:
http://18delphi.blogspot.ru/2013/07/blog-post.html
http://roman.yankovsky.me/?p=740

среда, 1 февраля 2017 г.

#1346. Draft of objects spy. Размышления. Заготовочка для следилки за объектами

https://bitbucket.org/lulinalex/mindstream/src/c3db0b6368040992e0f4eae64854d6e4ea34844a/Lab/RefCount/l3ObjectsSpy.pas?at=B284_Inheritance_Try&fileviewer=file-view-default

unit l3ObjectsSpy;

interface

procedure Test;

implementation

uses
 System.SysUtils
 , System.Classes
 , System.Generics.Collections
 , WinApi.Windows
 ;

type
 Tl3SpiedObjects = class(TList<Pointer>)
 end;//Tl3SpiedObjects

 Tl3ObjectsSpy = class(Tl3SpiedObjects)
  strict private
   class var g_Instance: Tl3ObjectsSpy;
  public
   class procedure LogNew(anObject: TObject);
   class procedure LogFree(anObject: TObject);
   class procedure HookClasses;
   class procedure CheckUnfreed;
 end;//Tl3ObjectsSpy

class procedure Tl3ObjectsSpy.LogNew(anObject: TObject);
begin
 if (g_Instance = nil) then
  g_Instance := Tl3ObjectsSpy.Create;
 g_Instance.Add(anObject);
end;

class procedure Tl3ObjectsSpy.LogFree(anObject: TObject);
begin
 if (g_Instance <> nil) then
  g_Instance.Remove(anObject);
end;

procedure DoHookClasses; forward;

class procedure Tl3ObjectsSpy.HookClasses;
begin
 DoHookClasses;
end;

class procedure Tl3ObjectsSpy.CheckUnfreed;
begin
 if (g_Instance <> nil) then
  if (g_Instance.Count > 0) then
   WriteLn(g_Instance.Count);
end;

type
 PMem = PAnsiChar;

function NewInstancePtr(aClass: TClass): PPointer;
begin
 Result := PPointer(PMem(aClass) + vmtNewInstance);
end;

function FreeInstancePtr(aClass: TClass): PPointer;
begin
 Result := PPointer(PMem(aClass) + vmtFreeInstance);
end;

procedure LogNew(anObject: TObject);
begin
 Tl3ObjectsSpy.LogNew(anObject);
end;

procedure LogFree(anObject: TObject);
begin
 Tl3ObjectsSpy.LogFree(anObject);
end;

type
 THackObject = class(TObject)
  public
   class function NewInstance: TObject; override;
   procedure FreeInstance; override;
 end;//THackObject

class function THackObject.NewInstance: TObject;
begin
 Result := inherited NewInstance;
 LogNew(Result);
end;

procedure THackObject.FreeInstance;
begin
 LogFree(Self);
 inherited FreeInstance;
end;

type
 THackInterfacedObject = class(TInterfacedObject)
  public
   class function NewInstance: TObject; override;
   procedure FreeInstance; override;
 end;//THackInterfacedObject

class function THackInterfacedObject.NewInstance: TObject;
begin
 Result := inherited NewInstance;
 LogNew(Result);
end;

procedure THackInterfacedObject.FreeInstance;
begin
 LogFree(Self);
 inherited FreeInstance;
end;

procedure HookPtr(aPointer: PPointer; aValue: Pointer);
var
 l_Old : DWORD;
 l_New : DWORD;
begin
 VirtualProtect(aPointer, SizeOf(Pointer), PAGE_EXECUTE_READWRITE, l_Old);
 try
  aPointer^ := aValue;
 finally
  VirtualProtect(aPointer, SizeOf(Pointer), l_Old, l_New);
 end;
end;

function HookPtrDone(aPointer: PPointer; aFrom: Pointer; aTo: Pointer): Boolean;
begin
 Result := (aPointer^ = aFrom);
 if Result then
  HookPtr(aPointer, aTo);
end;

function HookNew(aClass: TClass): Boolean;
var
 l_Ptr : PPointer;
begin
 Result := true;
 l_Ptr := NewInstancePtr(aClass);
 if HookPtrDone(l_Ptr, @TObject.NewInstance, @THackObject.NewInstance) then
  Exit;
 if HookPtrDone(l_Ptr, @TInterfacedObject.NewInstance, @THackInterfacedObject.NewInstance) then
  Exit;
 Result := false;
end;

function HookFree(aClass: TClass): Boolean;
var
 l_Ptr : PPointer;
begin
 Result := true;
 l_Ptr := FreeInstancePtr(aClass);
 if HookPtrDone(l_Ptr, @TObject.FreeInstance, @THackObject.FreeInstance) then
  Exit;
 if HookPtrDone(l_Ptr, @TInterfacedObject.FreeInstance, @THackInterfacedObject.FreeInstance) then
  Exit;
 Result := false;
end;

function HookClassPrim(aClass: TClass): Boolean;
begin
 Result := false;
 if HookNew(aClass) then
  Result := true;
 if HookFree(aClass) then
  Result := true;
end;

procedure HookClass(aClass: TClass);
var
 l_Class : TClass;
begin
 l_Class := aClass;
 while (l_Class <> nil) do
 begin
  if not HookClassPrim(l_Class) then
   Exit;
  l_Class := l_Class.ClassParent;
 end;//l_Class <> nil
end;

procedure DoHookClasses;
begin
 HookClass(TObject);
 HookClass(TStream);
 HookClass(TInterfacedObject);
 HookClass(TThread);
 HookClass(TComponent);
 //HookClass(TExternalThread);
end;

procedure Test;
var
 l_O : TObject;
 l_S : TStream;
 l_IO : TInterfacedObject;
 l_T : TThread;
begin
 //HookClasses;
 l_O := TObject.Create;
 FreeAndNil(l_O);

 l_S := TStream.Create;
 FreeAndNil(l_S);

 l_IO := TInterfacedObject.Create;
 FreeAndNil(l_IO);

 l_T := TThread.Create;
 FreeAndNil(l_T);
end;

initialization
 Tl3ObjectsSpy.HookClasses;
finalization
 Tl3ObjectsSpy.CheckUnfreed;
end.

(+) http://edn.embarcadero.com/article/28344

Вызывать CheckUnfreed в секции финализации на самом деле бессмысленно, т.к. могли ещё не вызваться другие секции финализации, в которых ещё не были освобождены объекты. И следилка покажет утечку, которой на самом деле нет.

Надо встраиваться в NotifyUnloadModule, который вызывается после всех секций инициализации. Я над этим сейчас работаю.

Ну и потокозащищённость надо конечно добавить.

Ну и ещё надо запоминать адрес места аллокации. Чтобы потом можно было найти по коду проблемное место. Это тоже делается достаточно просто.

Можно даже стек снять, но это сильно скажется на производительности.

Вскорости опубликую доработанную версию данного класса.

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

Над этим я тоже работаю.

Update. Опробовал сегодня следилку "в боевых условиях".Даже с раскруткой стека. Удобно. Нашёл пару утечек. Скоро выложу обновлённый вариант.

#1345. Ни о чём. Размышления пока

Есть определённые мысли.
Пока изучаю:

TPrivateHeap
CodeHeap

function CodeHeap: TPrivateHeap;
var
  Temp: TPrivateHeap;
begin
  if FCodeHeap = nil then
  begin
    Temp := TPrivateHeap.Create;
    if AtomicCmpExchange(Pointer(FCodeHeap), Pointer(Temp), nil) = nil then
    // - интересный метод создания потокозащищённого синглетона. Если я правильно понял
      Pointer(Temp) := nil // For ARC-based platforms this will ensure the local var doesn't affect the refcount
      // - интересный "хак"
    else
      Temp.Free;
  end;
  Result := FCodeHeap;
end;

TMethodImplementation
TRttiMethod

Жаль не работает вот это:

type
 Tl3ObjectSpy<T: TObject> = class(T)

 end;//Tl3ObjectSpy

Интересно - почему написано так:

  ObjectAppearance := TCommonObjectAppearance(AppearanceClass.NewInstance);
  ObjectAppearance.Create;

А не так:

type
 RCommonObjectAppearance = clas of TCommonObjectAppearance;
  ObjectAppearance := RCommonObjectAppearance(AppearanceClass).Create;

{$IFDEF FireDAC_DEBUG}
class function TFDDatSRow.NewInstance: TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF};
begin
  Result := inherited NewInstance;
  Inc(GRowsAlive);
end;

{-------------------------------------------------------------------------------}
procedure TFDDatSRow.FreeInstance;
begin
  inherited FreeInstance;
  Dec(GRowsAlive);
end;
{$ENDIF}

vmtNewInstance
unit l3ObjectsSpy;

interface

procedure Test;

implementation

uses
 System.Classes
 ;

type
 PMem = PAnsiChar;

function NewInstancePtr(aClass: TClass): PPointer;
begin
 Result := PPointer(PMem(aClass) + vmtNewInstance);

end;
function FreeInstancePtr(aClass: TClass): PPointer;
begin
 Result := PPointer(PMem(aClass) + vmtFreeInstance);
end;

procedure TestClass(aClass: TClass);
begin
 WriteLn(NativeInt(NewInstancePtr(aClass)^));
 WriteLn(NativeInt(FreeInstancePtr(aClass)^));
end;

procedure Test;
begin
 TestClass(TObject);
 TestClass(TStream);
 WriteLn(vmtNewInstance);
end;

end.

вторник, 31 января 2017 г.

#1344. Ссылка. Хитрости с битовыми операциями

https://tproger.ru/digest/awesome-bits/

Я вот совсем не сторонник подобных штучек, но мало ли...

Цитата оттуда:

Целые числа

Установка n-ого бита
Обнуление n-ого бита
Переключение n-ого бита
Округление до следующей степени двойки
Получение максимального целого
....