Классический пример Hello World:
Компилируем, запускаем.про главная() нч
печать(«Привет, Мир!\н»);
кц
$ хуяк комп примеры/01-привет.хуя
$ ./примеры/01-привет
Привет, Мир!
Read.
Компилируем, запускаем.про главная() нч
печать(«Привет, Мир!\н»);
кц
$ хуяк комп примеры/01-привет.хуя
$ ./примеры/01-привет
Привет, Мир!
append_path() { local dir="$1" if [[ -d "$dir" ]]; then if [[ -d "$dir" && ":$PATH:" != *":$dir:"* ]]; then export PATH="$PATH:$dir" fi fi } prepend_path() { local dir="$1" if [[ -d "$dir" ]]; then if [[ -d "$dir" && ":$PATH:" != *":$dir:"* ]]; then export PATH="$dir:$PATH" fi fi } remove_path() { local dir="$1" if [[ ":$PATH:" == *":$dir:"* ]]; then local new_path=":$PATH:" new_path="${new_path//:$dir:/:}" new_path="${new_path#:}" export PATH="${new_path%:}" fi } remove_path /usr/games remove_path /usr/local/games remove_path . append_path /usr/sbin append_path /usr/bin append_path /snap/bin prepend_path /usr/local/bin prepend_path /usr/local/sbin prepend_path $HOME/.local/bin
Запускаем. Я не стал убирать таблицу загрузки, чтобы вам было видно размер кода:*name B compiler
*tape:7/b,40
*library:40
*trans-main:40020
main() {
printf("Hello, B!*n");
}
*execute
*end file
Вот ещё несколько примеров для Би из разных мест. Все они работают под Дубной:$ dubna hello.dub
...
*NAME B COMPILER
*TAPE:7/*,40
*LIBRARY:40
*TRANS-MAIN:40020
OVERLAY OT 20/04/25
B COMPILER FOR BESM-6, VERSION 04/2025
COMPILED 3 LINES OF CODE, FOUND 0 ERRORS
*NO LIST
*CALL BLOCKERR
*MADLEN
MAIN CP 0.0, ST 0.0, RT 1.0*
*READ OLD
*EXECUTE
*LIBRA:40 = B/DIV B/EQ B/GT B/LT B/MUL B/NE B/RET B/SAVE0 B/SAVE
B/TOUT B/TRUE CHAR PRINTD PRINTO PRINTF WRITE WRITEB OUT*CNT OUT*SHFT
OUT*BUFF FLUSH FOUT
≠
MAIN 01000 PRINTD 01413 B/MUL 01757 ISOTCOSY 06002
PROGRAM E 01000 PRINTO 01466 B/GT 01766 ISOTCOS1 E 06053
B/SAVE0 01011 WRITE 01517 FOUT 01771 DRUMTAP* 06073
B/RET 01016 B/TRUE 01622 WRCARD 01772 CHKWORD* C 06124
PRINTF 01023 OUT*CNT 01623 WRWORD E 02014 PRINT8 06125
B/SAVE 01256 OUT*SHFT 01624 WBEGIN E 02033 STOP* 06306
CHAR 01263 OUT*BUFF 01625 WRIEND E 02042 EXIT E 06307
B/NE 01301 FLUSH 01654 B/TOUT 02075 CBOБOДHO 06335
B/EQ 01304 B/LT 01744 WRWORD/ C 04000
WRITEB 01307 B/DIV 01747 XWRITE/ C 06000
≠
HELLO, B!
Запускаем mandelbrot.dub, получаем mandelbrot.txt:main() {
auto cx, cy, x, y, x2, y2;
auto iter;
auto xmin, xmax, ymin, ymax, maxiter, dx, dy;
xmin = -8601;
xmax = 2867;
ymin = -4915;
ymax = 4915;
maxiter = 32;
dx = (xmax - xmin) / 79;
dy = (ymax - ymin) / 24;
cy = ymin;
while (cy <= ymax) {
cx = xmin;
while (cx <= xmax) {
x = 0;
y = 0;
x2 = 0;
y2 = 0;
iter = 0;
while (iter < maxiter) {
if (x2 + y2 > 16384)
goto next;
y = ((x * y) / 2048) + cy;
x = x2 - y2 + cx;
x2 = (x * x) / 4096;
y2 = (y * y) / 4096;
iter++;
}
next:
write(' ' + iter);
cx = cx + dx;
}
write('*n');
cy = cy + dy;
}
return(0);
}
$ dubna mandelbrot.dub
...
!!!!!!!!!!!!!!!"""""""""""""####################################""""""""""""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$$%'+)%%%$$$$$#####"""""""""""
!!!!!!!!!!!"""""""#######################$$$$$$$$%%%&&(+,)++&%$$$$$$######""""""
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*5:/+('&%%$$$$$$#######"""
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''),@@@@@@@,'&%%%%%$$$$########
!!!!!!!"""####################$$$$$$$$%%%&'())((())*,@@@@@@/+))('&&&&)'%$$######
!!!!!!""###################$$$$$%%%%%%&&&'+.@@=/<@@@@@@@@@@@@@@@/++@..93%%$#####
!!!!!"################$$$%%%%%%%%%%&&&&'),+2@@@@@@@@@@@@@@@@@@@@@@@@@1(&&%$$####
!!!!"##########$$$$$%%&(-(''''''''''''(*,5@@@@@@@@@@@@@@@@@@@@@@@@@@@@+)-&%$$###
!!!!####$$$$$$$$%%%%%&'(*-@1.+.@-4+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4-(&%$$$##
!!!!#$$$$$$$$$%%%%%%'''++.6@@@@@@@@@8/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3(%%$$$$#
!!!#$$$$$$$%&&&&''()/-5.5@@@@@@@@@@@@@>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?'&%%$$$$#
!!!(**+/+<523/80/46@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+)'&&%%$$$$#
!!!#$$$$$$$%&&&&''().-2.@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'&%%$$$$#
!!!!#$$$$$$$$$%%%%%&'''/,.7@@@@@@@@@;/0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0'%%$$$$#
!!!!####$$$$$$$$%%%%%&'(*-:2.,/?-5+))**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4+(&%$$$##
!!!!"##########$$$$$%%&(-(''''(''''''((*,4@@@@@@@@@@@@@@@@@@@@@@@@@@@4+).&%$$###
!!!!!"################$$$%%%%%%%%%%&&&&')<,4@@@@@@@@@@@@@@@@@@@@@@@@@/('&%%$####
!!!!!!""##################$$$$$$%%%%%%&&&'*.@@@0@@@@@@@@@@@@@@@@1,,@//9)%%$#####
!!!!!!!"""####################$$$$$$$$%%%&(())((()**-@@@@@@/+)))'&&&')'%$$######
!!!!!!!!""""#####################$$$$$$$$$$%%%&&&''(,@@@@@@@+'&&%%%%%$$$########
!!!!!!!!!"""""#######################$$$$$$$$$$%%%%&')*7@0+('&%%%$$$$$#######"""
!!!!!!!!!!!"""""""######################$$$$$$$$$%%%&&(+-).*&%$$$$$$######""""""
!!!!!!!!!!!!!"""""""""#######################$$$$$$%%'3(%%%$$$$$######""""""""""
!!!!!!!!!!!!!!!""""""""""""#####################################""""""""""""""""
Вообще, конечно идеальная схема снабжения деревенского дома интернетом должна выглядеть так:
Точка доступа в режиме бриджа, висящая напротив устья печи (так она с гарантией покроет более-менее все места, где может возникнуть желание устроиться с ноутбуком или планшетом, и более того - и сама точка доступа, и источник бесперебойного питания к ней окажутся внутри отапливаемого помещения (сейчас у меня точка доступа она же LTE модем висит на стене неотапливаемой терраски, спасибо хоть на внутренней) и LTE-модем в уличном исполнении с ethernet-интерфейсом, питанием по POE и внешней антенной децибел на 25, выставленной на шесте метров на пять над крышей.
Беда в том, что такие модемы (а они в продаже есть) стоят довольно дорого. Правда, если модем торчит над крышей. то можно над ним прикрутитть имеющуюся внешнюю антенну. Она по-моему правда всего децибелл на 12. Еще при этом почти во все такие модемы встраивают свой wi-fi модуль, который в данном сетапе, вероятно лишний. Если что и может покрыть, то садовые скамейки на участке. Потому как от дома его экранирует шиферная крыша. Шифер очень хорошо глушит что wi-fi, что сотовый сигнал, неоднократно в этом убеждался. Поэтому сейчас у меня антенна висит на первом этаже, ниже шифера. Хотя подними я ее хотя бы на уровень второго эатажа, прием станет лучше. Но надо не просто на уровень второго этажа, а чтобы шифер между антенной и базовой станцией не попал.
Точку доступа вообще говоря необязательно держать в режиме бриджа. Можно в режиме роутера, будет отдельная сетка между основным роутером и модемом, примерно как бывает, если usb-свисток воткную в usb-порт обычного дешевого роутера. Тут зависит от того, что за прошивка в самом модеме, можно ли ей доверять.
Недостаток этого решения заключается в том что LTE-модемы с POE и эзернетом стоят заметнро дороже тревел-роутеров и даже устройств вроде Tlink TL MR150 или OLAX MC-60 (которому и UPS не нужен, правда POE-инжектором в отличие от 9-вольтового UPS он работать не умеет).
X-Post to LJ
Запускаем:*name B compiler
*tape:7/b,40
*library:40
*trans-main:40020
main() {
printf("Hello, B!*n");
}
*execute
*end file
Компилятор генерит ассемблерный код и пишет его на барабан, то есть временный файл фактически. И переключает мониторку на чтение этого барабана, как бы командой *READ:1. Вызывается Мадлен и превращает ассемблерный код в бинарные объектные модули.$ dubna b.dub
...
*NAME B COMPILER
*TAPE:7/*,40
*LIBRARY:40
*TRANS-MAIN:40020
OVERLAY OT 20/04/25
B COMPILER FOR BESM-6, VERSION 04/2025
COMPILED 3 LINES OF CODE, FOUND 0 ERRORS
*NO LIST
*CALL BLOCKERR
*MADLEN
MAIN CP 0.0, ST 0.0, RT 1.0*
*READ OLD
*EXECUTE
*LIBRA:40 = B/DIV B/EQ B/GT B/LT B/MUL B/NE B/RET B/SAVE0 B/SAVE
B/TOUT B/TRUE CHAR PRINTD PRINTO PRINTF WRITE WRITEB OUT*CNT OUT*SHFT
OUT*BUFF FLUSH FOUT
≠
MAIN 01000 PRINTD 01413 B/MUL 01757 ISOTCOSY 06002
PROGRAM E 01000 PRINTO 01466 B/GT 01766 ISOTCOS1 E 06053
B/SAVE0 01011 WRITE 01517 FOUT 01771 DRUMTAP* 06073
B/RET 01016 B/TRUE 01622 WRCARD 01772 CHKWORD* C 06124
PRINTF 01023 OUT*CNT 01623 WRWORD E 02014 PRINT8 06125
B/SAVE 01256 OUT*SHFT 01624 WBEGIN E 02033 STOP* 06306
CHAR 01263 OUT*BUFF 01625 WRIEND E 02042 EXIT E 06307
B/NE 01301 FLUSH 01654 B/TOUT 02075 CBOБOДHO 06335
B/EQ 01304 B/LT 01744 WRWORD/ C 04000
WRITEB 01307 B/DIV 01747 XWRITE/ C 06000
≠
HELLO, B!
Вышла ubuntu 25.04. Как-то даже странно, что не надо срочно бежать настраивать сборочные среды для нее, проверять какие пакетировочные файлы нуждаются в правке, пинать QA-щиков чтобы организовали тестирование.
Стало:writeb: ,name, 12 ,base,* c c Append one byte to output buffer. c b/output:lc,block, w_count, b_shift, buffer(22) c flush: ,subp, ,aax, =377 ,aex, =12 . compare to linefeed ,uza, flush ,aex, =12 c ,utc, w_count ,xts, ,aex, =26 . 22 words ,u1a, putchar ,ita, 13 ,its, ,call, flush ,sti, ,ati, 13 c putchar: ,bss, . append byte to buffer ,sti, 11 ,vtm, b/output 11 ,wtc, 1 . b_shift ,asn, 64-40 . shift left 11 ,wtc, 0 . w_count 11 ,aox, 2 . read word from buffer 11 ,wtc, 0 . w_count 11 ,atx, 2 . write word to buffer c 11 ,xta, 1 . b_shift ,aex, =50 ,uza, next_w ,aex, =50 ,arx, =10 . increase shift 11 ,atx, 1 . b_shift 13 ,uj, c next_w: ,bss, . advance to next word 11 ,atx, 1 . clear b_shift 11 ,xta, 0 . w_count ,arx, =1 . increment word count 11 ,atx, 0 . w_count 13 ,uj, ,end,
Так ведь понятнее выходит, правда?/* * Append one byte to output buffer. */ writeb(b) { extrn out_cnt, out_shft, out_buff; auto p; b = b & 0377; if (b == '*n') { flush(); return; } if (out_cnt == 22) { flush(); } p = &out_buff[out_cnt]; *p = *p | (b << (40 - out_shft)); if (out_shft == 40) { /* next word */ out_shft = 0; ++out_cnt; } else { /* next byte */ out_shft = out_shft + 8; } } out_cnt; out_shft; out_buff[22];
Решил тут прикрутить к openwrt-шному web-интерфейсу сертификат, которому браузер бы доверял. Выяснилгось что выученный четверть века назад способ генерации сепртифкатов с помощью скрипта CA.pl для этого не годится.
Потому что там хостнейм пишется в CN. А мозилле теперь подавай обязательно dns name в subjectAltName.
Правда, команда openssl req в 3-й версии openssl зато научилоась ключику -addext. Поэтому сгенерировать правильную заявку на сертификат (после подписания которой тем же CA.pl палучается правильный сертификат) можно безо всяких скриптовых обвязок.
openssl req -newkey -keyout mysite.key -out mysite.req -subj "/CN=mysite.domain/C=RU/L=Moscow" \
-addext "subkectAltName=DNS:mysite.domain"
Надо еще покопаться. может еще и вокруг openssl ca скрпитовая обвязка тоже лишняя, и можно непосредственно ей пользоватья.
Еще выяснил что в /usr/local/share/ca-certificates на десктопе у меня лежит уже два года как заэкспайрившийся сертификат моего собственного CA. Последнее время я этот CA использовал исключительно для openvpn, потому что все, что торчит во внешний интернет испольузет сертификаты с Let's Encrypt, а локальные https-сайты в своей домашней сети я как-то не очень использую.
Интересную идею подкинули в комментах к предыдущему посту. Организовать таки работу нескольких точек доступа с хэндовером/роамингом.
Если повесить TL MR3020 на середине южной стены дома, то он хорошо покроет не только запечное пространство на первом, но и район изголовья кровати на втором этаже. Розетка на этой стене есть. И есть даже полочка, куда можно положить точку доступа.
Правда, придется на это дело выделить какой-нибудь повербанк - кратковременные перерывы в подаче электричества у нас там случаются. Но повербанки в хозяйстве все равно есть, (как и M3020), И можно таскаемый с собой сапгрейдить на умеющий USB-C и могущий при необхдимости подкортмить ноутбук, а предыдущий пустить на UPS для точки доступа.
Часа на два-три его хватит, а на большее не хватит холодильников. Поэтому если свет отключится более чем на 2-3 часа, все равно придется заводить генератор.
Можно было бы конечно (и с точки зрения конфигурации железа даже лучше) прикуипить точку доступа с POE, благо свободный порт POE-инжектора есть в 9v UPS питающем основной роутер. Но что-то у меня есть сомнения, что доступные по осмысленной цене точки доступа с POE договорятся с этим роутером по поводу 802.11r. Зато такие точки доступа обычно сдизайнены под крепление к стене или потолку, чего нельзя сказать о MR-3020.
Преимущества этого решения по сравнению с натыкиванием везде где нужно ethernet-розеток - через это будут работать не только ноутбуки, но и планшеты, смартфоны и Катин макбук. Недостатки - надо дотащить eltanin (Иринин ноутбук) до Савеловского рынка чтобы там пофиксили wifi. Или не до савеловского, а до какого-нибудь компетентного специалиста по Windows - есть подозрение что там проблема не в железе, а в драйверах. (впрочем где ж такого взять-то? Их и до 2022 года в России было днем с фонарем не сыскать, а теперь и те разъехались) И еще Артур будет ныть, что ему интернет медленный. Это у него чисто психологическое. Если не провод, то медленнее. А что там все равно дальше 15 км радиоканала (LTE), это из комнаты не видно.
X-Post to LJ
Вот думаю, купить 50 метров витой пары и провести по деревенскому дому ethernet. А то там получается что несколько удобных рабочих мест отделены от точки доступа wifi русской печкой. А через два метра кирпича радиоволны проходят плохо. А в роутере все равно 4 порта есть.
В московских квартирах где ethernet по всей квартире был сделан еще давно сейчас и Ирина, и Артур, и я пользуемся преимущественно проводным соединением а не wi-fi. Правда, в Москве есть еще такой фактор, что 2.4ГГц диапазон забит нафиг соседями, а в 5ГГц сидят 2-3 станции, но уж сидят так сидят.
В деревне этой проблемы нет. Но есть печки и шифер на крышах. Так бы по идее можно было бы поставить точку доступа на чердаке, а антенну вывести над коньком крыши, там примерно полтора метра. Но эта антенна не слишком рассчитана на жесткие погодные услоивия. На окошке с внутренней стороны, где она сейчас висит, её гораздо лучше.
X-Post to LJ
Повесили там занавески на терраске, поменяли шины на машине на летние (они там хранятся) и собрали водопровод. О занавесках на террасе Ирина мечтала уже по-моему лет пять, года два назад их сшили, но поскольку в прошлом году мы там не жили, то и не повесили. Теперь вот повесили.
Опробовали в боевом режиме перепрошитый ТL MR3020. Работает.
Еще реализовали одну забавную задумку - выгрузку-загрузку колес через окно второго этажа при помощи веревки и блока. Дело в том что окно выходит прямо на стоянку, а через дверь это нужно таскать колеса вокруг всего дома до входной двери, а потом через весь дом, а потом по винтовой лестнице.
А если вкрутить в оконную раму шуруп с кольцом, и к нему привесить блок, то посредством 12мм веревки все замечательно опускается-поднимается. Но нужно два человека - один на верху веревку тягает, второй внизу либо отцепляет груз от крюка, либо наоборот стропит и привешивает. Сначала я думал, что понабодится каую-нибудь балку в окно вывесить, но шины и ящик с инструментом замечателно поднимаются-опускаются так, с блоком прикрученным непосредственно к стене.
Это код функции negate().$ diff bbesm.madlen bbesm2.madlen
5185c5185
< ,XTS,=37777777777777
---
> ,XTS,=50000000000001
Почему-то на БЭСМ получилась неправильная целочисленная константа. Надо искать багу в арифметике.negate(n) {
return (-n & 037777777777777);
}
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
---|---|---|---|---|---|---|
1
|
||||||
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25 |
26
|
27
|
28
|
29
|
30
|
31
|