All streams
Search
Write a publication
Pull to refresh
-6
0
Иван Левашев @OCTAGRAM

Удалённый программист Delphi+Ada

Send message
Расскажу свой опыт с Hubzilla. Есть некий форум, на нём несколько тысяч человек. Но это же форум. 2021? Форум? Вот захотелось его «сконвертировать» в соцсеть, и, кажется, у Hubzilla мосты лучше всех налажены с другими соцсетями. Тысячи людей однажды проснулись бы в Федиверсе. Так думал я. Составил план, как я буду переносить посты. С точки зрения Hubzilla все посты — посты, а на форуме есть посты, а есть темы, и надо это всё проецировать как-то. Ну ничего, разберёмся.

Зарегал всех пользователей. Сделал канал форума. Начал подписывать все несколько тысяч на форум. И тут сервак начало таращить. То Master/Daemon.php Onepoll, то Master/Daemon.php Queue, кучей сидят, наваливаются и кладут сервер с базой. Уж я и опкеш для PHP CLI включал на файловой системе, и SSL в PostgreSQL отключал, и буфера PgSQL увеличивал. Всё без толку. В базе нет почти ещё ни одного поста, а сервер постоянно загружен на 100%. 3 тысячи транзакций в секунду без остановки. Что же будет, если загнать в систему посты. Я так понимаю, это связано с тем, что по своим нуждам Хабзилла постоянно вытаскивает полный список контактов, и пересылать эти несколько тысяч тупо долго, и сериализовать и парсить тупо тяжело. Подобный софт, наверное, может нормально работать только если социальный граф лежит в памяти процесса, и это не может быть PHP. А всё самое вкусное с точки зрения связности — на PHP.

Второй подвох — это то, что форумы-группы-сообщества — это отнюдь не само собой разумеющаяся возможность. Их часто тупо нет. И на Fediverse Party я даже галочки такой не вижу для фильтрации. А в Хабзилла это очень свежая возможность пятой версии. Я-то думаю, почему в Zot API нет нормальной возможности постинга на стену форума. А как посты-то загонять тогда в систему? Опять через вебку, что ли? Видимо, тупо не успели ещё сделать.

100% загрузка CPU хоронит всю идею. Такому софту не могу доверить данные.
Как-то грустно у них с виджетами для вебмастера. Интересует, в первую очередь, чтоб уведомления показывались не только лишь на странице соцсети, но так же и на произвольном собственном сайте. А также виджеты сообщества, чата с администрацией, и прочее, что есть у ВК, FB.
Как на счёт того, чтобы обсудить СТАРЫЕ проекты?

Вот был CCured, требующий небольшоно допиливания существующего софта на небезопасном языке Си, после чего получается относительно быстро работающий софт с проверками.

web.eecs.umich.edu/~weimerw/p/p232-condit.pdf

Под него портировали sendmail, ftpd, bind. И где это всё? Куда пошли эти достижения?

Вот есть ACSL, но единственный инструмент, который с ним работает, это верификатор Frama-C, то есть, программа должна быть верифицируема, а это надо с нуля уметь так писать. Нет инструмента, чтоб с тем же синтаксисом добавлять языковые проверки.

После того, как код на Си инкрустирован CCured и аннотациями ACSL, его можно было бы автоматом переводить в более безопасный язык программирования, такой, как Ада. Ну и кто этим занимается.

Как вышел профессор Некула на пенсию, так и заглохло всё с CCured.
/var/lib/knot/zones/objective.pe.zone.gen.sh:
#!/bin/sh

NOW_DATE_TIME=`date -u +'%Y%m%d%H%M'`

{

echo 'objective.pe. 3600  IN SOA   objective.pe. hostmaster.octagram.name. ( '`date -u +'%s'`' 86400 7200 3600000 200 )
objective.pe. 86400 IN NS    ns3.toom.su.
objective.pe. 86400 IN NS    ns4.toom.su.
objective.pe. 86400 IN A     173.249.20.221
*             86400 IN A     173.249.20.221
localhost     86400 IN A     127.0.0.1'

if [ "X$CERTBOT_VALIDATION" != "X" ]; then
    echo '_acme-challenge 86400 IN TXT   ( "'"$CERTBOT_VALIDATION"'" )'
fi

} > /var/lib/knot/zones/objective.pe.zone

/usr/sbin/knotc reload > /dev/null

sleep 4


monthly cron:
certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /var/lib/knot/zones/objective.pe.zone.gen.sh -d \*.objective.pe --manual-public-ip-logging-ok --expand --renew-by-default --text --agree-tos > /dev/null 2>&1
certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /var/lib/knot/zones/objective.pe.zone.gen.sh -d objective.pe --manual-public-ip-logging-ok --expand --renew-by-default --text --agree-tos > /dev/null 2>&1
/var/lib/knot/zones/objective.pe.zone.gen.sh # cleanup

# sftp to all servers
# reload config, ssh to reload config on all servers
А кому-то штрафы за SEO опасны, за сайты, на которые простой человек даже войти не может
Хочу предложить тыжпрограммистам изначально закладывать возможность подключения из JavaScript, и поэтому чтоб в основе был WebRTC. Но при этом чтоб адреса были ipv6.

Предлагаемая схема: нарезаем в приватном пространстве ipv6 кусок, резервируем часть оставшихся битов под верхний домен. Берём publicsuffixlist, нумеруем tld и прочее его содержимое, а дальше предлагаем желающим получить место в этом пространстве регать домены вида base32.tld и поднимать там сервер WebRTC и/или WebSocket. Для обычных программ делаем движок, который через драйвер tuntap умеет установить подключение.
Я имел в виду: строки, размер которых известен динамически, но не статически, в языке Ада могут быть на стеке. Я имел в виду случай, когда выделяется не максимальный объём, а сколько надо.

Да, в Расте строки делали по подобию адских
почему декларация класса вынесена отдельно от имплементации в Delphi


Возможно, вам бы понравился Оберон. А мне не понравился. Мусорка.

Мне нравится вот так:

package Ada.Real_Time
  with Nonblocking is

  type Time is private;
  Time_First : constant Time;
  Time_Last : constant Time;
  Time_Unit : constant := implementation-defined-real-number;

  type Time_Span is private;
  Time_Span_First : constant Time_Span;
  Time_Span_Last : constant Time_Span;
  Time_Span_Zero : constant Time_Span;
  Time_Span_Unit : constant Time_Span;

  Tick : constant Time_Span;
  function Clock return Time;

  function "+" (Left : Time; Right : Time_Span) return Time;
  function "+" (Left : Time_Span; Right : Time) return Time;
  function "-" (Left : Time; Right : Time_Span) return Time;
  function "-" (Left : Time; Right : Time) return Time_Span;


То есть, вот есть Time и Time_Span. Если к Time прибавить Time_Span, получим Time. Time можно получить у функции Clock, а Time_Span можно получить как разность двух Time. Самая суть выражается, читать одно удовольствие. А детали выносятся в «примечания» (private).

Delphi, хоть и не такой мусорный язык, но там уже is private нет. Вынь да положь содержимое всех кишков на всеобщее обозрение вперемешку с действительно интересными методами.

Вот аналог на Delphi.

unit System.Diagnostics;

interface
{$HPPEMIT LEGACYHPP}

uses System.Classes, System.TimeSpan;

type
  TStopwatch = record
  strict private
    class var FFrequency: Int64;
    class var FIsHighResolution: Boolean;
    class var TickFrequency: Double;
  strict private
    FElapsed: Int64;
    FRunning: Boolean;
    FStartTimeStamp: Int64;
    function GetElapsed: TTimeSpan;
    function GetElapsedDateTimeTicks: Int64;
    function GetElapsedMilliseconds: Int64;
    function GetElapsedTicks: Int64;
    class procedure InitStopwatchType; static;
  public
    class function Create: TStopwatch; static;
    class function GetTimeStamp: Int64; static;
    procedure Reset;
    procedure Start;
    class function StartNew: TStopwatch; static;
    procedure Stop;
    property Elapsed: TTimeSpan read GetElapsed;
    property ElapsedMilliseconds: Int64 read GetElapsedMilliseconds;
    property ElapsedTicks: Int64 read GetElapsedTicks;
    class property Frequency: Int64 read FFrequency;
    class property IsHighResolution: Boolean read FIsHighResolution;
    property IsRunning: Boolean read FRunning;
  end;

implementation


Ну что, приятно такое читать? А со встроенными телами методов ещё больший кошмар.
GNAT и GNOGA бесплатные
А с чего бы ему не мочь?

Другое дело, позор тем, кто для nginx выбрал не Аду или хотя бы Паскаль. Фу таким быть
В C++ ублюдочная модульность. Пространства имён с исходниками не связаны, кто угодно может подкладывать куда угодно.

Ещё типично, когда на одной операционке #include сделал вроде бы для всего, а эти #include потащили другие #include, а на другой целевой платформе не потащили. И вот, значит, в неподходящий момент мы узнаём об этом. Сильнейшее желание свалить из этого дурдома.
Строки на стеке — это Ада, но не Delphi
PDF вывод есть в Cairo, а привязки к Cairo стараниями Мигель де Каза (GNOME) я бы ожидал найти в Mono
Любой продакшн же с чего-то начинался
Вот тут ещё движок блога сделали
Поддержка WebAssembly есть в GNAT и FPC
Если у нас можно дампить методы и аргументы любых классов и записей с расширенным RTTI, то и сам класс пробрасывается.

В dfm я видел, как это делается для органов управления:

      class MyForm(Form):
        def __init__(self, Owner):
          self.Caption = 'Subclassed form'
          self.btnClose = Button(self)
          self.btnClose.Parent = self
          self.btnClose.Caption = 'Close'
          self.btnClose.SetBounds(10, 10, 120, 30)
          self.btnClose.OnClick = self.btnCloseClick
      
          self.chkCanClose = CheckBox(self)
          self.chkCanClose.Parent = self
          self.chkCanClose.Caption = 'Can close?'
          self.chkCanClose.SetBounds(10, 50, 120, 30)
      
          self.grdTest = DrawGrid(self)
          self.grdTest.Parent = self
          self.grdTest.SetBounds(10, 100, 300, 250)
          self.grdTest.OnDrawCell = self.grdTestDrawCell
          self.grdTest.OnSelectCell = self.grdTestSelectCell
      
          self.OnCloseQuery = self.MyFormCloseQuery
          self.OnClose = self.MyFormClose
          self.Width = 400
          self.Height = 400


Как минимум Button и CheckBox здесь динамически созданы

писать com библиотеки вместо нормального кода


А с чего вдруг нормальным кодом не считается COM? Какой смысл делать кучу привязок под отдельные языки программирования, когда можно осчастливить всех разом. Я вот для Visual DialogScript сделал мост в OLE и получил возможность качать файлы по SFTP. И всё остальное, что можно делать через OLE библиотеки. 2ГИСом рулить. А так стали бы в 2ГИС делать модуль для VDS? Очень сомневаюсь.

И управление памятью там сразу понятное. В Delphi, если программа вся на интерфейсах, как у нас на работе, тоже всё понятно. А в C++ там я не знаю как надо офигеть, чтоб каждый нюанс типа shared_ptr_from_this корректно учесть. Шаблонами я не видел, чтоб это делалось, зато видел, как напильником работают в SWIG.

+ это к сожалению только для винды


На ущербных операционках вполне пашет PyXPCOM.

Вообще, конечно, это мощный камень в огород государства. Кто как не государство должно строить недостающую инфраструктуру. На примере Jabber мы уже увидели, как коммерсы неспособны договориться.
Ну или как IBM с Apple тянули на своих плечах кроссплатформенный IBM System Object Model (Windows, OS/2, Mac OS, UNIX AIX, мэйнфреймы с OS/390). Компилятор C++ модифицировали, чтоб SOM классы генерил вместо обычных C++ классов. И интеграцию в скрипты REXX всего этого дела. Object COBOL ещё получил SOM как единственный способ делать объекты. Сторонние разработчики запилили DirectToSOM Modula-2, и стало как минимум три языка нативного программирования, между которыми работает наследование классов, есть выход в скрипты, удалённый вызов методов и все остальные прелести Middleware. Но потом пришла Java, и вроде как натив стал не нужен, а когда поняли, что нет, нужен, про былые достижения натива забыли.

Коммерсам это вспомнить будет выгодно, если у раковины будет один слив. То есть, никогда или
только для винды

или если всё запечатать в проприетарный ЯП.

Подходящее место — это университеты, как бы только их отучить смотреть в рот коммерсам, а самим творить историю.
А я не вижу. Смотрю в описание класса
  procedure SetMeUp(S: string; I : Integer);
  function DescribeMe(): string;


Смотрю как заворачивается:

  p := PyDelphiWrapper.Wrap(TTestClass.Create, soOwned);
  PythonModule.SetVar( 'DVar', p );
  PyEngine.Py_DecRef(p);


И я почитал, с TTestRTTIAccess чуть ниже более прямой пример, только на современный RTTI опирается.

Питон не умеет использовать напрямую ком объекты, для этого их оборачивают при помощи С или С++


Единый для всех win32com этим и занимается. Ну а также oleaut32.dll, в которой движок, читающий библиотеку типов из ресурсов и реализующий IDispatch для бинарных интерфейсов.
В комментариях к модулю-обёртке, в истории изменений был указан номер демо 31. Открыл и вижу:

github.com/pyscripter/python4delphi/blob/master/PythonForDelphi/Demos/Demo31/Unit1.pas#L74

Использование из Python:

github.com/pyscripter/python4delphi/blob/master/PythonForDelphi/Demos/Demo31/Unit1.dfm#L112

Да только это обёртка над ком, там используется не сама ком библиотека, она завраплена скорее всего через тот же С++.


Не понял

Information

Rating
Does not participate
Location
Воркута, Коми, Россия
Date of birth
Registered
Activity