[00:00:06] <vаlexey> для внутрифирменных мы использовали как раз bitbucket
[00:00:18] <vаlexey> в том проекте где я был
[00:00:44] <vаlexey> а так, в других проектах у нас используют жиру и багзиллу. но меня там нет.
[00:00:48] <geniepro> bitbucket можно поставить на локальном сервере?
[00:00:57] <vаlexey> нет. зачем?
[00:01:12] <geniepro> вообще, такой зоопарк технологий -- очень плохо
[00:01:23] <vаlexey> у нас же команда была размазана по всему земному шару. локальный сервак не катит
[00:01:44] <geniepro> ну как зачем? затем что может не быть доступа к интернету, или просто нельзя внутрифирменные вещи на левом сервере держать
[00:02:19] <vаlexey> если у нас в том проекте не будет доступа к инету, то это капец и работать нельзя :-)
[00:02:21] <boris_ilov> valexey: если А имортирует Б то при кодинге Б нужно оба модуля выгружать
[00:02:37] <boris_ilov> все просто
[00:02:53] <vаlexey> boris_ilov: ну я и говорил - листья.
[00:02:57] <boris_ilov> получить AV не представляю как можно
[00:03:12] <boris_ilov> ядро перед вызовом метода загружает модуль
[00:03:23] <vаlexey> boris_ilov: из за ООП :-)
[00:03:25] <boris_ilov> никаких AV быть ессесно не может
[00:04:00] <boris_ilov> ООП тебе тоже AV не даст
[00:04:10] <vаlexey> у тебя где-то сохранился указатель на рекорд расширенного типа в модуле B. Все, никто от B не зависит, но через vtable указатель на его метод в системе висит.
[00:04:10] <boris_ilov> ибо там вообще перекомпиляция нужна
[00:04:24] <vаlexey> Ты его выгружаешь, кто-то дергается виртуальный метод, и привет.
[00:04:42] <boris_ilov> еще раз
[00:04:50] <boris_ilov> ядро сначала загружает модуль
[00:05:11] <boris_ilov> не вызывает ядро метод если модуль не загружен
[00:05:18] <vаlexey> с чего бы ему загружать модуль? Там ведь никто не дергает напрямую функцию из модуля B
[00:05:39] <vаlexey> Тип указателя - A.Object
[00:05:50] <vаlexey> У этого объекта есть методы
[00:05:59] <vаlexey> дергают просто Object.Foo
[00:06:29] <vаlexey> но Foo перегруженный метод. И настоящий тип объекта - B.Object
[00:06:31] <vаlexey> И привет.
[00:06:34] <boris_ilov> "напрямую функцию из модуля" методы это и есть функции модуля
[00:06:51] <vlad2> /me лично получал AV после на выгрузки модуля
[00:07:03] <vlad2> Даже ООП не надо, достаточно процедурной переменной.
[00:07:31] <vlad2> proc := Module.Proc;
[00:07:31] <vаlexey> угу, можно и так.
[00:07:32] <vlad2> Выгружаешь Module
[00:07:36] <boris_ilov> как это вы умудряетесь? :D
[00:07:38] <vlad2> Дергаешь proc()
[00:07:42] <vlad2> Привет AV
[00:08:12] <vаlexey> Ну, мы просто активно пробовали использовать горячую замену кода :-D
[00:08:16] <vlad2> А чего там умудряться. Достаточно "сильно динамической" (с) info21 структуры данных
[00:08:50] <boris_ilov> и что это за структура?
[00:08:55] <vаlexey> http://demotivators.to/media/posters/4067/449445_ne-vizhu-zla-ne-slyishu-zla-ne-govoryu-o-zle.jpg
[00:08:57] <vаlexey> :-D
[00:09:46] <vlad2> Эта такая структура, которую нельзя сделать на C++, только на КП :) Потому что в С++ буду лики :)
[00:10:07] <boris_ilov> valexey: А может так http://lurkmore.so/images/thumb/f/fb/Hand_from_ass.jpg/300px-Hand_from_ass.jpg
[00:10:10] <boris_ilov> :D
[00:12:31] <boris_ilov> vlad: Как с процедурной переменной воспроизвести?
[00:12:40] <boris_ilov> чет не могу придумать
[00:13:23] <vlad2> proc := Module.Proc;
[00:13:28] <vlad2> Выгружаешь Module
[00:13:32] <vlad2> Дергаешь proc()
[00:13:46] <boris_ilov> Оу! Так можно?
[00:13:51] <boris_ilov> :D
[00:13:55] <boris_ilov> не знал
[00:14:02] <vlad2> В смысле?
[00:14:11] <vlad2> Что процедурные переменные бывают? :)
[00:14:11] <boris_ilov> а на кой это понадобилось?
[00:14:24] <vlad2> /facepalm ;)
[00:14:26] <vаlexey> ну вот, AV воспроизвел
[00:14:26] <boris_ilov> я думал что только в пределах модуля можно
[00:14:40] <vаlexey> делов то :-)
[00:14:46] <boris_ilov> и как?
[00:14:55] <vаlexey> .proc PROCEDURE procedure in unloaded module A !!!
[00:15:12] <boris_ilov> кот в студию!
[00:15:12] <vаlexey> щща
[00:16:07] <vlad2> А вот интеречно что будет, если потом опять загрузить модуля.
[00:16:08] <vаlexey> https://gist.github.com/valexey/15f26868529b004377e6
[00:16:20] <vаlexey> компилим все
[00:16:21] <vlad2> Я так понимаю никто не гарантирует, что он по тем же адресам ляжет.
[00:16:33] <vаlexey> выполняем Test.Bar
[00:16:45] <vаlexey> выгружаем вначале Test, затем A
[00:16:54] <vаlexey> выполняем B.Some
[00:17:00] <vаlexey> AV
[00:17:42] <vаlexey> И это лишь один из случаев :-)
[00:18:10] <vаlexey> Когда я делал видео во вьюшке с камеры, при выгрузке модулей я регулярно ловил этот самый AV
[00:18:20] <Jordan> Я код скопировал и скомпилировал, что дальше делать?
[00:18:44] <vаlexey> (просто потому, что там по таймеру дергался метод объекта, а модуля для этого объекта уже не было)
[00:18:56] <vаlexey> Jordan: вставляй коммандер (Ctrl+Q)
[00:19:11] <vаlexey> (!) Test.Bar
[00:19:38] <vаlexey> затем выделяешь слово Test, тыкаешь выгрузить модуль (в меню Dev->Unload)
[00:19:51] <vаlexey> Затем выделяешь слово A, тыкаешь аналогично
[00:20:07] <vаlexey> затем вставляешь еще один коммандер, (!) B.Some
[00:20:18] <vаlexey> выполняешь
[00:20:30] <vаlexey> (да, после Test.Bar тоже нужно выполнить коммандер этот)
[00:20:54] <vаlexey> ШОК, СЕНСАЦИЯ! СИШНИКИ СЛОМАЛИ ББ!
[00:20:57] <vаlexey> :-D
[00:22:03] <boris_ilov> vаlexey: А в чем радость то?
[00:22:07] <Jordan> Алексей отправь скрин с расстановкой коммандеров. Я о коммандере первый раз слышу
[00:22:09] <boris_ilov> ну трап да
[00:22:13] <vаlexey> в AV? ;-)
[00:22:15] <Jordan> Борис такЮ что работает?
[00:22:23] <Jordan> *так
[00:22:32] <boris_ilov> не вижу AV
[00:22:35] <boris_ilov> вижу трап
[00:22:35] <vаlexey> Радость в том, что просто так не выгрузить.
[00:22:53] <boris_ilov> Ты смог обойти защиту
[00:22:55] <geniepro> не работает у меня выгрузка!!!
[00:23:00] <boris_ilov> и что дальше?
[00:23:02] <vаlexey> Этот трап - и есть AV. Access Violation
[00:23:10] <boris_ilov> в ББ нет горячей замены?
[00:23:26] <vаlexey> Угу, нету. Трапов при выгрузке (точнее замене) быть не должно.
[00:23:35] <boris_ilov> еще раз
[00:23:43] <geniepro> MODULE test1;
IMPORT Log:=StdLog;
PROCEDURE Do*;
BEGIN
Log.String("Hello from test1")
END Do;
END test1.
MODULE test2;
IMPORT test1;
VAR tester : PROCEDURE();
PROCEDURE Do*;
BEGIN
tester()
END Do;
BEGIN
tester := test1.Do
END test2.
если загружен test2, то test1 не выгружается
[00:23:50] <boris_ilov> ты хитровыеб...ным способом обошел защиту
[00:24:07] <vаlexey> Нет, конечно я понимаю, что если никогда ни разу не имел дело с системой где есть НОРМАЛЬНАЯ горячая замена кода, то можно долго и упорно считать что в ББ она есть.
[00:24:17] <vаlexey> Но увы, я испорчен - я видел где это сделано нормально.
[00:24:20] <boris_ilov> Это нужно еще додуматься так проц. переменными манипулировать
[00:24:42] <boris_ilov> А тебя не смущает что можно NIL получить и без взяких выгрузок?
[00:25:00] <boris_ilov> ровно та же херняя
[00:25:02] <vаlexey> окай, будет еще один пример
[00:25:08] <boris_ilov> давай
[00:25:38] <boris_ilov> ищи дыры
[00:25:56] <geniepro> vаlexey: блекбоксёры считают, что у них есть метапрограммирование, что уж тут о горячей замене кода говорить )
[00:26:19] <boris_ilov> Забавно что я не блэкбоксер и не фанат ББ
[00:26:23] <vаlexey> boris_ilov: да что их искать, если я на них в повседневной разработке в самом ББ напарывался?
[00:26:31] <boris_ilov> но с очевидныи вещами глупо спорить
[00:26:39] <vаlexey> вопрос лишь в том, как компактно это смоделировать
[00:26:48] <vаlexey> без 100500 строк боевого ББ-кода
[00:26:56] <boris_ilov> vаlexey: пользуюсь ББ с 2005 года периодически
[00:27:12] <boris_ilov> ни разу такая херня как в твоем примере в голову не приходила
[00:27:17] <boris_ilov> как так?
[00:27:36] <boris_ilov> в WITH вон тоже память можно засрать
[00:27:39] <geniepro> boris_ilov> vаlexey: пользуюсь ББ с 2005 года периодически
и после этого ты заявляешь, что ты не блекбоксёр? да у тебя стаж 8 лет ))
[00:27:55] <boris_ilov> я не фанатею по ББ
[00:28:09] <vаlexey> boris_ilov: возможно я в определенный момент залез чуть глубже :-)
[00:28:16] <vаlexey> или просто в другом направлении
[00:28:31] <geniepro> ладно, господа, на сегодня я вас, пожалуй, покину ))
[00:28:36] <geniepro> всем ББ
[00:28:48] <geniepro> ЗЫ. а де кемиисто, засранец такой? )))
[00:29:05] <boris_ilov> Ты же монимаешь что в WITH это дыра
[00:29:14] <boris_ilov> точно так же и твой пример дыра
[00:29:23] <boris_ilov> это не значит что в ББ всегда так
[00:29:30] <boris_ilov> Я вот ни разу не напарывался
[00:29:41] <boris_ilov> хоть экспериментировал как мог
[00:29:54] <boris_ilov> просто такие извращения в голову не приходили
[00:30:27] <boris_ilov> Ты реально обманул систему подгрузки модулей
[00:30:38] <boris_ilov> ну молодец
[00:30:53] <boris_ilov> больше ничего не могу сказать
[00:33:10] <vаlexey> boris_ilov: еще раз - я на это напоролся когда видео делал во вьюшке
[00:33:28] <vаlexey> когда я там что-то менял (не помню точно как это называется - то ли модель то ли вид - хз), у меня выскакивал трап
[00:33:29] <boris_ilov> я понятия не имею как ты это делал
[00:33:30] <vаlexey> ибо таймер
[00:33:51] <vаlexey> ну, ты же свои типы вьюшек да моделей к ним, привязанных к таймеру ведь не писал?
[00:33:58] <boris_ilov> но явно ты тоже что-то хитрое делал
[00:34:22] <boris_ilov> пости код
[00:34:28] <boris_ilov> будем смотреть
[00:34:48] <vаlexey> не буду код тот постить - он большой. я сейчас лучше модельный пример напишу.
[00:35:29] <boris_ilov> ББ по идее должен либо подгрузить модуль, либо не дать выгрузить
[00:35:45] <boris_ilov> ибо ты всегда импортируешь моддуль при использовании
[00:35:55] <boris_ilov> либо прямо либо косвенно
[00:36:07] <boris_ilov> Один спооб обойти это ты нашел
[00:36:19] <boris_ilov> Ща я чуйствую будет второй :D
[00:37:32] <boris_ilov> "[00:14:20] <vlad2> /facepalm"
[00:38:10] <boris_ilov> а кроме рукилица есть обоснование рациональности использования таких извращений?
[00:38:28] <boris_ilov> (кроме сишного детства :))
[00:41:04] <boris_ilov> всем ББ (не убедили)
[01:00:39] <vаlexey> https://gist.github.com/valexey/7777367
[01:00:51] <vаlexey> вот, прошу любить и жаловать :-)
[01:00:51] <vаlexey> ничто там автоматом не грузится
[01:02:15] <vаlexey> (основное время убил на разборку как же методы в КП сделаны. в этих чертовых атрибутах запутался, да в комбинациях экспорта)
[01:17:28] <vаlexey> http://www.opennet.ru/opennews/art.shtml?num=38576
[01:44:23] <vlad2> boris_ilov: это хреновый трап и принципиально не такой как в случа NIL
[01:44:44] <vlad2> Потому как в случае NIL - все предсказуемо.
[01:45:05] <vаlexey> по факту - если остался хоть один объект порожденный данным модулем, то это сразу мина замедленного действия
[01:45:18] <vlad2> В случае вызова меотда, указывающего на мусор - Undefined behavior в классическом виде (вплолть до форматирования жесткого диска)
[01:45:30] <vаlexey> на этом весь ББ в общем то построен (последний мой пример)
[01:45:51] <vаlexey> ну, тут UB в реализации таки нет - тут культурный трап с указанием причины
[01:46:01] <vlad2> По поводу "обошли защиту и извращения" - неправда.
[01:47:20] <vlad2> Вопрос "а что будет если остался указатель на реализацию выгруженного модуля" возникает австоматом и сразу после того, как тебе сообщиле о такой классной возможности как насильная выгрузка модулей.
[01:48:00] <vаlexey> vlad2: у нас с тобой тяжкое наследие Сей - мы про указатели думаем :-) Сразу ;-)
[01:48:21] <vlad2> Ну наверное. И тем не менее.
[01:49:48] <vаlexey> еще интересней вопрос (если ты испорчен уже erlang'ом) а что будет если в памяти остался объект типа A старой версии модуля, а у тебя загружена новая версия модуля где тип A поменялся (скажем поле добавили: или УБРАЛИ)
[01:49:51] <vаlexey> :-D
[01:50:34] <vlad2> Ничего не будет? В смысле останется объект старого типа и будет жить вместе с новым и может даже кастаться не будет к новому.
[01:51:01] <vаlexey> ну, я имею ввиду что будет при попытке вызвать у него метод :-)
[01:51:21] <vlad2> Ну старый код выполнится. Не?
[01:51:24] <vаlexey> метод то будет уже новый (если предположить что там указатели на методы срастутся)
[01:51:31] <vаlexey> не, откуда старый код? код он в модуле
[01:51:44] <vlad2> Ну остался в памяти.
[01:51:46] <vаlexey> а старого модуля не существует уже. нет тей машинных инструкций вприроде!
[01:52:08] <vаlexey> ББ же не держит по нескольку версий модуля в памяти
[01:52:47] <vlad2> Ну чего-то он держит, если ты говоришь там диагностика номарольная (хотя вот я не помню, чтоб он мне нормально говорил - быд обычный AV)
[01:53:32] <vаlexey> не, там в трапе пишется что вызов метода который в выгруженном модуле (и имя модуля он выдает таки)
[01:53:52] <vаlexey> ты же помнишь, что когда ты модуль выгружаешь, он выгружается НЕ ПОЛНОСТЬЮ
[01:53:57] <vlad2> Дык, значит какие-то ошметки в памяти остались.
[01:54:14] <vаlexey> то есть память, в некотором роде, течет :-)
[01:54:30] <vаlexey> при долгой работе с разными модулями (временными) память может того, кончиться
[01:54:42] <vаlexey> можно атакующий код написать :-)
[01:55:05] <vlad2> Дык да - если загрузить в нужно место нужный код.
[01:55:34] <vаlexey> а можно просто в цикле генерить модули с разными именами, загружать/выгружать их :-)
[01:55:55] <vаlexey> система подвержена старению
[01:56:10] <vlad2> Да, вот это уже можно будет назвать "щлые сишники сломали" :)
[01:57:28] <vаlexey> угу. :-)
[01:59:38] <vаlexey> проверил, AV :-)
[02:01:31] <vlad2> На чем?
[02:03:49] <vаlexey> на изменении структуры болтающейся в памяти
[02:04:34] <vlad2> А.
[02:05:47] <vаlexey> о, там еще смешнее - создаем объект. складываем на него указатель
[02:05:51] <vаlexey> выгружаем модуль
[02:05:54] <vаlexey> загружаем модуль
[02:05:58] <vаlexey> дергаем объект за метод
[02:06:04] <vаlexey> Trap
[02:06:29] <vаlexey> Это не горячая замена кода, это полная, извиняюсь, херня.
[02:06:40] <vlad2> Дык, он видимо по другим адресам уже грузит.
[02:07:00] <vаlexey> Или теги типов как-то по иному генерит
[02:07:09] <vlad2> Ну для людей неибалованных - таки да, горячая замена :) Но никто ничего не гарантирует :)
[02:07:19] <vаlexey> [024529C0H] B.RECORD ^0 unloaded
[02:07:29] <vаlexey> то есть оно сразу в курсе что оно unloaded
[02:07:57] <vаlexey> там при загрузке модуля UUID на таймстампах что-ли генерится?
[02:09:44] <vаlexey> Скажем так, уровень инкапсуляции в ББ недостаточен для горячей замены кода. Это вам не erlang
[03:05:40] <vlad2> Ты лучше скажи "уровень модульности" ;) Так злобнее :)
[03:06:26] <vаlexey> ну, тут уже по идее изолированные кучи нужны, а не общая помойка :-) нужно НАСТОЯЩЕЕ ООП, а не аля джава или плюсы :-)
[03:06:29] <vаlexey> или КП :-)
[03:17:04] <vlad2> Чего-то мадзи так и не распяли за клеветы. Стареют.
[03:17:31] <vlad2> И вообще Info21 давно не появлялся.
[03:25:13] <vаlexey> да, пороху в пороховницах маловато стало
[03:25:19] <vаlexey> старые стали, ленивые :-)
[05:36:44] <егф> Зорко
[05:36:48] <егф> ищу Зорко
[06:01:59] <егф> на жабир запрос адд контакт уже 3 минуты не отвечает он =)
[06:02:38] <егф> где там его сайто... http://zx.oberon2.ru/ вроде бы.
[21:03:11] <alexey.veselovsky> http://www.ixbt.com/editorial/inoblogger/the-second-os-in-mobile.shtml
[21:05:29] <alexey.veselovsky> о сложности и уязвимостях :-)
[21:15:55] <alexey.veselovsky> vlad2: похоже вот почему Вирт выпилил, точнее заменил семантику CASE:
[21:16:02] <alexey.veselovsky> “The new case statement requires that the case labels be non-negative integers The entire compiler contained only 4 case statements. The transformation of labels of type CHAR to type INTEGER in the scanner was tedious, but a one-time exercise in editing.”
[21:16:23] <alexey.veselovsky> то есть ему CASE в виде старой семантики просто нафиг не нужен был - у него всего в 4 местах оно использовалось
[21:16:37] <alexey.veselovsky> а ради 4 мест вполне можно и IF ELSIF обойтись
[21:18:19] <vlad2> Да, все по протореному сценарию. Есть компилятор - чего бы еще выпилить за разумное количество редактирований.
[21:19:42] <alexey.veselovsky> Ну а потом он Project Oberon пилил, и понял что WITH ему нехватает, зато ключевое слово CASE освободилось!
[21:19:51] <alexey.veselovsky> Значит язык еще проще - минус ключевое слово!
[21:19:59] <alexey.veselovsky> (не возвращать же WITH?)
[21:21:04] <alexey.veselovsky> арифметика синтаксиса улучшается! ;-)
[21:32:13] <vlad2> Ага.
[21:32:33] <vlad2> Вообще зря выпили. Редко надо, конечно, но полезно.
[21:32:51] <alexey.veselovsky> но без WITH было совсем кисло
[21:44:03] <alexey.veselovsky> xxx: Если хотите скачать последнюю версию игры - Оставляйте заявку в ЛС с указанием причины, зачем вы скачиваете игру.
yyy: Автор! Ты что, всю жизнь в ЖЕКе проработал? Может тебе еще справку из налоговой принести?
[21:44:09] <alexey.veselovsky> Обернкор напоминает ;-)
[21:44:52] <vlad2> :)
[21:45:04] <alexey.veselovsky> c их секретными репозиториями
[21:45:13] <alexey.veselovsky> секретными всем доступными репозиториями!
[21:45:16] <alexey.veselovsky> :-)
[23:13:07] <vаlexey> .
[23:43:26] <vlad2> Да, тема про горячу замену выдалась горячей даже несмотря на отсутствие в теме труЪ оберонщиков
[23:44:45] <geniepro> Илья Ермаков> Если для понимания куска алгоритма требуется врубать в мозгу "пошаговый отладчик" (т.е. гонять его мысленно, изображая из себя комп) - то в топку такой кусок алгоритма
http://forum.oberoncore.ru/viewtopic.php?f=88&t=2008&sid=5a378c3dd53e5e3059f43f8c38547521&start=140#p84215
омг!!! неужто Ермаков сделал первый шаг к ФП? )))
(ну окей, с его транслятором рефала-0 и изучением xquery -- третий уже) )))