Расскажу свой опыт с 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, требующий небольшоно допиливания существующего софта на небезопасном языке Си, после чего получается относительно быстро работающий софт с проверками.
Под него портировали sendmail, ftpd, bind. И где это всё? Куда пошли эти достижения?
Вот есть ACSL, но единственный инструмент, который с ним работает, это верификатор Frama-C, то есть, программа должна быть верифицируема, а это надо с нуля уметь так писать. Нет инструмента, чтоб с тем же синтаксисом добавлять языковые проверки.
После того, как код на Си инкрустирован CCured и аннотациями ACSL, его можно было бы автоматом переводить в более безопасный язык программирования, такой, как Ада. Ну и кто этим занимается.
Как вышел профессор Некула на пенсию, так и заглохло всё с CCured.
#!/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
Хочу предложить тыжпрограммистам изначально закладывать возможность подключения из JavaScript, и поэтому чтоб в основе был WebRTC. Но при этом чтоб адреса были ipv6.
Предлагаемая схема: нарезаем в приватном пространстве ipv6 кусок, резервируем часть оставшихся битов под верхний домен. Берём publicsuffixlist, нумеруем tld и прочее его содержимое, а дальше предлагаем желающим получить место в этом пространстве регать домены вида base32.tld и поднимать там сервер WebRTC и/или WebSocket. Для обычных программ делаем движок, который через драйвер tuntap умеет установить подключение.
Я имел в виду: строки, размер которых известен динамически, но не статически, в языке Ада могут быть на стеке. Я имел в виду случай, когда выделяется не максимальный объём, а сколько надо.
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
Ну что, приятно такое читать? А со встроенными телами методов ещё больший кошмар.
В C++ ублюдочная модульность. Пространства имён с исходниками не связаны, кто угодно может подкладывать куда угодно.
Ещё типично, когда на одной операционке #include сделал вроде бы для всего, а эти #include потащили другие #include, а на другой целевой платформе не потащили. И вот, значит, в неподходящий момент мы узнаём об этом. Сильнейшее желание свалить из этого дурдома.
Как минимум 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 для бинарных интерфейсов.
Зарегал всех пользователей. Сделал канал форума. Начал подписывать все несколько тысяч на форум. И тут сервак начало таращить. То Master/Daemon.php Onepoll, то Master/Daemon.php Queue, кучей сидят, наваливаются и кладут сервер с базой. Уж я и опкеш для PHP CLI включал на файловой системе, и SSL в PostgreSQL отключал, и буфера PgSQL увеличивал. Всё без толку. В базе нет почти ещё ни одного поста, а сервер постоянно загружен на 100%. 3 тысячи транзакций в секунду без остановки. Что же будет, если загнать в систему посты. Я так понимаю, это связано с тем, что по своим нуждам Хабзилла постоянно вытаскивает полный список контактов, и пересылать эти несколько тысяч тупо долго, и сериализовать и парсить тупо тяжело. Подобный софт, наверное, может нормально работать только если социальный граф лежит в памяти процесса, и это не может быть PHP. А всё самое вкусное с точки зрения связности — на PHP.
Второй подвох — это то, что форумы-группы-сообщества — это отнюдь не само собой разумеющаяся возможность. Их часто тупо нет. И на Fediverse Party я даже галочки такой не вижу для фильтрации. А в Хабзилла это очень свежая возможность пятой версии. Я-то думаю, почему в Zot API нет нормальной возможности постинга на стену форума. А как посты-то загонять тогда в систему? Опять через вебку, что ли? Видимо, тупо не успели ещё сделать.
100% загрузка CPU хоронит всю идею. Такому софту не могу доверить данные.
Вот был CCured, требующий небольшоно допиливания существующего софта на небезопасном языке Си, после чего получается относительно быстро работающий софт с проверками.
web.eecs.umich.edu/~weimerw/p/p232-condit.pdf
Под него портировали sendmail, ftpd, bind. И где это всё? Куда пошли эти достижения?
Вот есть ACSL, но единственный инструмент, который с ним работает, это верификатор Frama-C, то есть, программа должна быть верифицируема, а это надо с нуля уметь так писать. Нет инструмента, чтоб с тем же синтаксисом добавлять языковые проверки.
После того, как код на Си инкрустирован CCured и аннотациями ACSL, его можно было бы автоматом переводить в более безопасный язык программирования, такой, как Ада. Ну и кто этим занимается.
Как вышел профессор Некула на пенсию, так и заглохло всё с CCured.
monthly cron:
Предлагаемая схема: нарезаем в приватном пространстве ipv6 кусок, резервируем часть оставшихся битов под верхний домен. Берём publicsuffixlist, нумеруем tld и прочее его содержимое, а дальше предлагаем желающим получить место в этом пространстве регать домены вида base32.tld и поднимать там сервер WebRTC и/или WebSocket. Для обычных программ делаем движок, который через драйвер tuntap умеет установить подключение.
Да, в Расте строки делали по подобию адских
Возможно, вам бы понравился Оберон. А мне не понравился. Мусорка.
Мне нравится вот так:
То есть, вот есть Time и Time_Span. Если к Time прибавить Time_Span, получим Time. Time можно получить у функции Clock, а Time_Span можно получить как разность двух Time. Самая суть выражается, читать одно удовольствие. А детали выносятся в «примечания» (private).
Delphi, хоть и не такой мусорный язык, но там уже is private нет. Вынь да положь содержимое всех кишков на всеобщее обозрение вперемешку с действительно интересными методами.
Вот аналог на Delphi.
Ну что, приятно такое читать? А со встроенными телами методов ещё больший кошмар.
Другое дело, позор тем, кто для nginx выбрал не Аду или хотя бы Паскаль. Фу таким быть
Ещё типично, когда на одной операционке #include сделал вроде бы для всего, а эти #include потащили другие #include, а на другой целевой платформе не потащили. И вот, значит, в неподходящий момент мы узнаём об этом. Сильнейшее желание свалить из этого дурдома.
В dfm я видел, как это делается для органов управления:
Как минимум Button и CheckBox здесь динамически созданы
А с чего вдруг нормальным кодом не считается 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, и вроде как натив стал не нужен, а когда поняли, что нет, нужен, про былые достижения натива забыли.
Коммерсам это вспомнить будет выгодно, если у раковины будет один слив. То есть, никогда или
или если всё запечатать в проприетарный ЯП.
Подходящее место — это университеты, как бы только их отучить смотреть в рот коммерсам, а самим творить историю.
Смотрю как заворачивается:
И я почитал, с TTestRTTIAccess чуть ниже более прямой пример, только на современный RTTI опирается.
Единый для всех win32com этим и занимается. Ну а также oleaut32.dll, в которой движок, читающий библиотеку типов из ресурсов и реализующий IDispatch для бинарных интерфейсов.
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
Не понял