LINUX.ORG.RU

Сообщения Shushundr

 

Что такое «денотационная семантика»?

Форум — Science & Engineering

Кто такой Окасаки и за что его надо почитать?

2016, Окасаки Крис, Чисто функциональные структуры данных
1996, Chris Okasaki, Purely Functional Data Structures, 162 страницы

Википедия совсем другое пишет:

Денотационная семантика (англ. denotational semantics) выражениям в программе ставит в соответствие настоящие математические объекты, то есть, выражения обозначают (англ. to denote — откуда «денотационная») их величины)
Важнейшие, в том числе пионерские, результаты построения денотационных семантик получены в работах Д. Скотта (Dana Scott) и К. Страчей (Christopher Strachey) в конце 1960-х — начале 1970-х в Оксфордском университете

Бестиповое λ-исчисление

1557, Роберт Рекорд (Recorde Robert), The Whetstone of Witte, 332 страницы (Оксфордский университет)
ввёл знак (символ) для обозначения равенства = в 1557 году (в 16-м (XVI) веке).
«В континентальной Европе знак = был введён Лейбницем только на рубеже XVII—XVIII веков, то есть более чем через 100 лет после смерти Роберта Рекорда.»

1936, Алонзо Чёрч, An Unsolvable Problem of Elementary Number Theory (Принстонский университет)
представил безтиповое лямбда-исчисление в статье «Унифицированная теория формальных систем», опубликованной в апреле 1936 года в журнале American Journal of Mathematics.

Переменные: x, y, z, … являются λ-термами.
Абстракция: Если M λ-терм и x — переменная, то (λx.M) — λ-терм (называется абстракцией).
Аппликация: Если M и N λ-термы, то (M N) — λ-терм (называется аппликацией).

само по себе λ-исчисление — это лишь синтаксис, набор правил для работы с символами.

Чтобы оно «обрело смысл» или «семантику», нужно связать эти символы с чем-то осмысленным, например, с математическими объектами.

Смысл (семантика) в данном контексте означает, что каждый термин λ-исчисления будет интерпретироваться как некоторый математический объект, а операции над терминами будут соответствовать операциям над этими объектами.

Двоичное и десятичное

Можно определить функции:

  • добавления единицы
  • удвоения
  • удесятирения

Числа можно записать не только как нумералы, но и как применение таких функций к нумералам, что позволяет говорить о двоичной и десятичной формах записи.

Аппликативный синтаксис

Аппликативный синтаксис эволюционировал из работ Шёнфинкеля, Карри и Чёрча. Функции обозначаются переменными или лямбда-абстракциями. Именование функций в аппликативном синтаксисе безтипового лямбда-исчисления осуществляется через присвоение переменным абстракций. Алонзо Чёрч (Alonzo Church), хотя и известен своей нотацией с лямбда-абстракцией и явными скобками, в некоторых своих работах также использовал более компактные формы записи, близкие к аппликативному синтаксису, особенно при работе с комбинаторами. Например, вместо того чтобы постоянно писать λx.x+1, он мог ввести сокращение f для этой функции, это записывалось в духе:

f≡λx.x+1

Таким образом, Чёрч ввёл операцию именования как связь между лямбда-выражением и символическим именем. Однако он ещё не привязал это к конкретному синтаксису, так как его работа была сосредоточена на чистой теории. Именование как операция — это идея Чёрча, использование для неё знака равенства закрепилось благодаря разработчикам функциональных языков, создатель MetaLanguage (ML) - Робин Милнер (1970-е годы).
Лямбда-абстракция (определение анонимной функции) записывается как λx.t, где x — аргумент, а t — тело функции.
Определим переменную f и присвоим ей лямбда-выражение (имеющее в безтиповом λ-исчислении единственный возможный для переменных тип «функция») в качестве значения, например функцию, которая возвращает переданный аргумент:

f=(λx.x)
f=λx.x

Теперь мы можем использовать переменную f в выражениях. Применим f к другому лямбда-выражению, например, (λy.y):

((λx.x) (λy.y))
((f) (λy.y))

В аппликативном синтаксисе приложение функции f к аргументу x записывается как

f λy.y

без скобок, a применение функции g к двум аргументам w и z — как

g w z 

Бесскобочность достигается за счёт соглашения о левоассоциативности (см. также Каррирование). Выражение g w z интерпретируется как (g w) z, то есть сначала g применяется к w, а затем результат применяется к z.

Семантика

Теоретико-множественный подход
Категорный подход

В λ-исчислении любая функция может быть применена к самой себе. Это ключевая особенность, которая позволяет выражать рекурсию и другие сложные вычислительные конструкции.

нужно:

  • Определить множество D, элементы которого будут значениями λ-выражений
    Без такого множества D мы не можем корректно описать, что означают выражения λ-исчисления. Мы не можем сказать, какие у них значения. А без возможности приписать выражениям значения нельзя говорить об их смысле. Без подходящего D мы не можем задать интерпретацию термов и операций λ-исчисления.
  • Интерпретировать функции как элементы этого множества
    (D должно содержать все функции из D в D, то есть D должно содержать множество всех функций D → D)

построение такого множества D - нетривиальная математическая задача (из-за парадокса Кантора). Ее решение привело к развитию теории доменов и других разделов математики.

идея фиксированной точки, когда D строится как фиксированное множество, удовлетворяющее

D≅D→D

И вот в этом месте я не осилил. Разъясните, бегом пожалуйста, люди злые добрые.

Как мне этим вашим лямбда-исчислением описать байт, его значения, и операции с ним? Нумералы Чёрча (функции с двумя параметрами) я могу написать, но дальше дело не идёт.

 ,

Shushundr
()

Категории пакетов и сторонние репозитории

Форум — Talks

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

Кроме этого ещё есть фича «репозитории сторонних разработчиков». Это когда команда дистрибутива настолько гадкая, что разработчики её сторонятся.

Сторонние репозитории делятся на два вида - либо по какой-нибудь технологии (типа Java, Haskell, Ruby), либо это персональные репозитории. Первые - командные, вторые - асоциальные.

Стандарта на то, как называть категории нет. Есть категория про текстовые редакторы, есть про серверы web-приложений и другие.

А что если категории называть по именам (командных) репозиториев? Какие ждут грабли, и чем это будет нехорошо?

 ,

Shushundr
()

Как работают сервисы youtube и rutube?

Форум — Talks

Хотелось бы опенсорсную утилиту, которая бы работала как сайт, я ей даю список URL-ов, она их там скачивает, я на следующий день получаю комплект файлов для просмотра. Мне на Java (а не через консоль с этими вашими youtube-dl).

Я спросил у LLM и она сказала мне:

  1. изучай протоколы DASH или HLS
  2. требуется собрать видео и аудио потоки вместе
  3. Некоторые видео защищены с помощью DRM, и их скачать практически невозможно
    (и это расстраивает меня)
  4. изучай YouTube Data API, YouTube Analytics API и YouTube Live Streaming API
    (а это сложно и надолго)
  5. ещё потребуется:
  • Использование HTTP-клиента (например, HttpURLConnection или библиотеки OkHttp).
  • Разбор HTML-кода страницы YouTube (с помощью библиотек вроде Jsoup).

Никто не видел готового для self-хостинга (чтобы без рекламы)?

Перемещено leave из multimedia

 ,

Shushundr
()

Книги про то как пишут текстовые редакторы (посоветуйте)

Форум — Desktop

Я имею в виду графические текстовые редакторы, те, которые ещё не текстовые процессоры, но уже умеют изображать шрифты на экране (через X11).

По причинам неразвитости цифровых технологий, понятно, что по российским технологиям вроде редактора «Лексикон» таких книг нет.

Я даже не знаю, а существуют ли какие-то российские опенсорсные редакторы сейчас (как живые проекты).

Понятно, что софт в наше время продать нельзя (слишком много альтернатив, слишком мало российских магазинов, один только RuStore и есть).

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

 , , ,

Shushundr
()

Существуют ли альтернативы подсчёту количества ссылок?

Форум — Desktop

В составе Libre Office есть кусок
UNO Runtime Environment (URE)
который занимается тем, что обеспечивает взаимодействие между объектами разных процессов.

На мой взгляд в C# эта же штука (Remoting) была сделана лучше, так как позволяла плагинам работать в отдельных процессах и крашиться. Там были Lease, которые позволяли проверять - жив ещё соседний процесс или уже умер. Хотя в принципе без разницы, внутримашинная она или межмашинная, только типы каналов различаются - shared memory или tcp. При Reference Counting такого нет. Умер один процесс - легла вся программа. Что не позволяет допускать к разработке непроверенных разработчиков (например из России). Плохо, что в mono такую замечательную технологию протеряли.

Вопрос - а существует ли альтернатива этому UNO/URE, которая работает не на основе глобального RC, а на основе сборки мусора (хотя бы внутри одной оси / машины).

UPD: предлагают протокол JERI с сайта https://river.apache.org/
что скажете?

 , ,

Shushundr
()

Сколько книг из серии ЖЗЛ вы прочитали?

Форум — Talks

https://ru.wikipedia.org/wiki/Список_книг_серии_«Жизнь_замечательных_людей»

Про Стивена Джобса есть, №1857

Какие из них наиболее полезны для члена опенсорс-сообщества, и почему?

 

Shushundr
()

Приложение для приёма таблеток

Форум — Mobile

Существует ли опенсорсное приложение, написанное для Android, которое напоминает когда что нужно съесть? Как оно называется?

Находится разное, неясно что выбрать, как собрать и как установить.
https://github.com/AdamGuidarini/MediTrak (GPL-2)
https://github.com/Futsch1/medTimer (MIT)
https://github.com/jclehner/rxdroid (Java, без лицензии, но free)

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

 

Shushundr
()

Существует ли российская альтернатива Let's Encrypt?

Форум — Talks

Будут ли выдаваемые на нём сертификаты соответствовать требованиям ФАПСИ, ФСБ, использовать алгоритмы шифрования и подписей по ГОСТ и что там ещё бывает?

Если нет, то почему нет? Что мешает?

См. также Скандинавская альтернатива Let's Encrypt

 

Shushundr
()

Скрестить Qubes OS с докером

Форум — General

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

Или это как-то по-другому делается?

 ,

Shushundr
()

Бесплатные заменители разума

Форум — Talks

Какими чат-ботами вы пользуетесь? Алиса какая-то туповатая. Раньше был phind.com, но он теперь платный. Какие есть ещё без регистрации и sms?

 

Shushundr
()

Как синхронизировать файловые потоки?

Форум — Development

Можно ли в Linux узнать, в какой момент сообщение было записано в файловый поток? Одна программа пишет в два разных потока, другая программа читает из этих двух потоков и должна вывести сообщения в порядке записи (а не в том, каком там накешировалось).

Вот первая программа:

$ clang-format main2.c
#include <stdio.h>

int main() {
  setbuf(stdout, NULL); // Отключение буферизации stdout
  setbuf(stderr, NULL); // Отключение буферизации stderr

  printf("Это stdout\n");
  fflush(stdout);
  fprintf(stderr, "Это stderr\n");
  fflush(stderr);
  fprintf(stderr, "Это stderr2\n");
  fflush(stderr);

  printf("Это stdout 2\n");
  fflush(stdout);
  fprintf(stderr, "Это stderr3\n");
  fflush(stderr);

  printf("Это stdout 3\n");
  fflush(stdout);
  printf("Это stdout 4\n");
  fflush(stdout);

  return 0;
}

Вот вторая программа:

$ clang-format main1.c
#include <errno.h>
#include <poll.h> // Для структуры pollfd и константы POLLIN
#include <pty.h>
#include <stdbool.h>
#include <stdio.h>
#include <sys/select.h>
#include <sys/types.h>
#include <unistd.h>

#include <time.h> // Для функции nanosleep
int nanosleep(const struct timespec *req, struct timespec *rem);

int max(int a, int b) { return (a > b) ? a : b; }

int main() {
  int master_fd_stdin, slave_fd_stdin;
  int master_fd_stdout, slave_fd_stdout;
  int master_fd_stderr, slave_fd_stderr;

  openpty(&master_fd_stdin, &slave_fd_stdin, NULL, NULL, NULL);
  openpty(&master_fd_stdout, &slave_fd_stdout, NULL, NULL, NULL);
  openpty(&master_fd_stderr, &slave_fd_stderr, NULL, NULL, NULL);

  pid_t pid = fork();
  if (pid == 0) {
    // В дочернем процессе
    close(master_fd_stdin);
    close(master_fd_stdout);
    close(master_fd_stderr);

    dup2(slave_fd_stdin, 0);
    dup2(slave_fd_stdout, 1);
    dup2(slave_fd_stderr, 2);

    close(slave_fd_stdin);
    close(slave_fd_stdout);
    close(slave_fd_stderr);

    execl("./main2", "main2", NULL);
  } else {
    // В родительском процессе
    close(slave_fd_stdin);
    close(slave_fd_stdout);
    close(slave_fd_stderr);

    char buffer[1024];
    ssize_t bytes_read;
    bool is_stdout_expected = true;
    bool is_stderr_expected = true;

    fd_set read_fds;
    int max_fd = max(master_fd_stdout, master_fd_stderr);

    struct pollfd fds[2];
    fds[0].fd = master_fd_stdout;
    fds[0].events = POLLIN;
    fds[1].fd = master_fd_stderr;
    fds[1].events = POLLIN;

    while (is_stderr_expected || is_stdout_expected) {
      FD_ZERO(&read_fds);
      if (is_stdout_expected) {
        FD_SET(master_fd_stdout, &read_fds);
      }
      if (is_stderr_expected) {
        FD_SET(master_fd_stderr, &read_fds);
      }

      select(max_fd + 1, &read_fds, NULL, NULL, NULL);

      if (FD_ISSET(master_fd_stdout, &read_fds)) {
        bytes_read = read(master_fd_stdout, buffer, 1024);
        if (bytes_read > 0) {
          buffer[bytes_read] = '\0'; // Добавляем нулевой символ в конец строки
          printf("\033[0;37m%s\033[0m", buffer);
        } else {
          is_stdout_expected = false;
        }
      }

      if (FD_ISSET(master_fd_stderr, &read_fds)) {
        bytes_read = read(master_fd_stderr, buffer, 1024);
        if (bytes_read > 0) {
          buffer[bytes_read] = '\0'; // Добавляем нулевой символ в конец строки
          printf("\033[0;31m%s\033[0m", buffer);
        } else {
          is_stderr_expected = false;
        }
      }
    }
  }

  return 0;
}

При выводе строки выводятся в неправильном порядке. Как сделать, чтобы выводились в правильном?

Пока у меня мысль такая:

  1. нужно сделать библиотеку, которая содержит функции printf, fprintf и что там ещё бывает. Делать она ничего не должна, должна загрузить системную и все вызовы туда пересылать, кроме особоинтересных.
  2. загрузить эту библиотеку в дочерний процесс вместо системной
  3. каждый факт вывода оборачивать в «пакет», к которому добавлять момент времени (и номер процесса/нити?).

 

Shushundr
()

В чём разница между консолью и терминалом?

Форум — Talks

Можно ли сказать, что консоль - физическая, а терминал - программная компонента?

Так вроде нельзя, вон, википедия пишет, что консоль это интерфейс («Linux-консоль — интерфейс ядра Linux»), т.е. абстрактное понятие. Ещё в википедии написано: «Консоль может быть реализована как физический терминал». Так кто из них физический?

Значит мы имеем дело с многозначными терминами. Где-бы были выписаны их разные значения, не как в википедии, а конкретно для линукса?

«виртуальные консоли — сеансы работы с консолью, между которыми можно переключаться»

a /dev/pts dir with devpts filesystem mounted
CONFIG_UNIX98_PTYS=y «pseudo terminal (PTY) is a software device consisting of two halves: a master and a slave.»

Вот эти виртуальные консоли и псевдотерминалы - это одно и то же, или разные понятия?

Как называется книжка, где это всё разобрано? man vcs

Ранее по теме:
2019-01-15, TesterTester, Может кто то простыми словами объяснить разницу между консолью и терминалом
2004-03-18, anonymous, в чем разница между «консолью» и «буквенно-цифровым терминалом»

Перемещено hobbit из general

 ,

Shushundr
()

Что нужно знать про монтаж?

Форум — Talks

Что нужно знать про монтаж, кроме того, что изучить все виды гаек, болтов и металлических профилей?

Я не имею в виду монтажников-высотников (которым нужно знать и уметь в скалалазание и альпинизм), а только тех, кто робко прячет тело жирное в утёсах.

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

Сваривать ничего тоже не хотелось бы.

Электрики - тоже отдельные люди.

Может какие-то нормы и правила монтажных работ?

Или вот, «технология монтажа» - что бы это такое могло быть?

 , ,

Shushundr
()

Текст с формулами (не почтовик, нет)

Форум — Talks

Я бы хотел такую помесь LaTeX с Libre Office Calc, которая с одной стороны бы выглядела как текст, а с другой стороны, проводила бы вычисления вытягивая данные из СУБД как Excel.

Двадцать лет назад уже была такая идея - Таблицы+LaTex
хочу узнать, как идут дела.

 

Shushundr
()

Как устроена печать в ГНУ/Линуксе?

Форум — General

Суть проблемы такова: если я устанавливаю пакет samba на OpenWRT то получившийся образ по размеру просто не влезает в раутер.

размер пакета cups = 10 315 433
а там (на раутере) всего 7 с небольшим мегабайт места.

Есть ли какие-нибудь альтернативные пакеты для печати? Можно ли обойтись какими-то компонентами, не устанавливая столько всего?

У меня есть принтер. Сейчас он воткнут в комп. Компов больше одного, все на линуксах. Хочется печатать с любого компа, независимо от того, какие из компов включены, а какие выключены из электрической сети. Сейчас приходится держать включённым тот, к которому подключен принтер. А я хочу принтер отключить от компьютера, через USB подключить к раутеру и начать экономить электроэнергию.

 , ,

Shushundr
()

Netgear WNR3500L v1 - не видит USB-флешку

Форум — Linux-hardware

Собираю на сайте
https://firmware-selector.openwrt.org/?version=23.05.4&target=bcm47xx%2Fmips74k&id=netgear_wnr3500l-v1-na
модули такие:
base-files busybox ca-bundle dnsmasq dropbear firewall4 fstools kmod-b43 kmod-gpio-button-hotplug kmod-leds-gpio kmod-nft-offload kmod-usb-ohci kmod-usb2 libc libgcc libustream-mbedtls logd luci mtd netifd nftables nvram odhcp6c odhcpd-ipv6only opkg otrx ppp ppp-mod-pppoe procd procd-seccomp procd-ujail swconfig uci uclient-fetch urandom-seed urngd wpad-basic-mbedtls luci-app-ksmbd block-mount

Чего-то нехватает, и флешку не видно в dmesg, как /dev/sd*, в lsusb, в общем, нигде.

UPD: дополнительно ещё поставил

usb-modeswitch	2022-02-24-3c8595a4-1	~12.67 KiB	USB mode switching utility	
usbids	0.379-1	~249.19 KiB	USB ID list	
usbutils	014-1	~51.07 KiB	USB devices listing utilities	
ccid	1.5.1-1	~41.94 KiB	Generic USB CCID (Chip/Smart Card Interface Devices) driver and ICCD…	
kmod-usb-bcma	5.15.162-1	~3.29 KiB	Support for BCMA USB controllers	
kmod-usb-core	5.15.162-1	~91.33 KiB	Kernel support for USB	
kmod-usb-ehci	5.15.162-1	~24.90 KiB	EHCI controller support	
kmod-usb-ohci	5.15.162-1	~20.33 KiB	Kernel support for USB OHCI controllers	
kmod-usb-ssb	5.15.162-1	~837 B	Support for SSB USB controllers	
kmod-usb-storage	5.15.162-1	~24.52 KiB	Kernel support for USB Mass Storage devices	
kmod-usb-storage-extras	5.15.162-1	~32.92 KiB	Say Y here if you want to have some more drivers,…	
kmod-usb-storage-uas	5.15.162-1	~9.77 KiB	Say Y here if you want to include support for…	
kmod-usb2	5.15.162-1	~6.10 KiB	Kernel support for USB2 (EHCI) controllers	
kmod-usb2-pci	5.15.162-1	~3.63 KiB	Kernel support for PCI USB2 (EHCI) controllers	
libusb-1.0-0	1.0.26-3	~28.65 KiB	libusb is a C library that gives applications easy access to USB devices on…

но нет, ничего не поменялось (и перезагружал тоже).

root@OpenWrt:~# lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ohci-platform/2p, 12M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/2p, 480M

флешки не видно, только контроллеры.

 ,

Shushundr
()

Как расшарить интернет?

Форум — Admin

У меня есть:

  1. роутер с выходом в интернет, у него есть IPv4-интернет-адрес (неважно какой), у него есть адрес интерфейса LAN (пусть 192.168.0.1).
  2. к нему интерфейсом enp5s0 подключен (через провод) комп с адресом 192.168.0.2/24
  3. на этом же компе есть другой интерфейс enp6s0 с адресом 192.168.1.2/24
  4. и есть последний, самый дальний комп с адресом 192.168.1.1/24, который (проводом) соединен с компьютером из пункта 3.

На компьютере из пунктов 2-3 я включил # sysctl
net.ipv4.ip_forward = 1

На дальнем компьютере из пункта 4 я настроил default route через средний комп

маршруты на дальнем компе выглядят так:

default via 192.168.1.2 dev br-lan 
192.168.1.0/24 dev br-lan scope link  src 192.168.1.1

маршруты на среднем компе выглядят так:

# ip route show
default via 192.168.0.1 dev enp5s0 
192.168.0.0/24 dev enp5s0 metric 2
192.168.1.0/24 dev enp6s0 metric 2

на роутере тоже на всякий случай статический маршрут добавил (там web-интерфейс):

192.168.1.0/24 -> 192.168.0.2, Metric 2

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

например с дальнего компьютера пингуется средний, со среднего компьютера пингуется роутер, но с дальнего компьютера роутер не пингуется.

Почему?

UPD: у меня была мысль повысить метрику default route на роутере, но я не знаю как это сделать, там в web-интерфейсе такого нет.

 

Shushundr
()

Как в Java использовать Rune-ы?

Форум — Desktop

Ну то есть, четырёхбайтовые Unicode codepoint-ы?

Надо брать java –version >= 18, потому что
https://openjdk.org/jeps/400

А дальше как?

as of Java 7 you can use constants for charset name such as StandardCharSets.UTF_8

«В Java, класс IntStream представляет поток целых чисел, и каждый элемент в этом потоке занимает 4 байта, поскольку int в Java является 32-битным целым числом, независимо от платформы, включая Intel64.»

IntStream combinedStream = IntStream.concat(stream1, stream2);

Как зачитать IntStream из stdin? записать в stdout?

since Java 8, public IntStream String.codePoints() (inherited from CharSequence) and int String.codePointCount(). Такое преобразование выглядит странным, излишним: stream.mapToObj(codepoint -> String.valueOf(Character.toChars(codepoint))) .forEach(System.out::println); в нём сначала происходит конвертация в кодировку UCS-16, а затем в UTF-8, а хотелось бы сразу напрямую. Нужно обойтись без использования класса String вообще.

Вручную - многобукв:

stream.forEach(codepoint -> {
    if (codepoint < 0x80) {
        System.out.write(codepoint);
    } else if (codepoint < 0x800) {
        System.out.write(0xC0 | (codepoint >> 6));
        System.out.write(0x80 | (codepoint & 0x3F));
    } else if (codepoint < 0x10000) {
        System.out.write(0xE0 | (codepoint >> 12));
        System.out.write(0x80 | ((codepoint >> 6) & 0x3F));
        System.out.write(0x80 | (codepoint & 0x3F));
    } else {
        System.out.write(0xF0 | (codepoint >> 18));
        System.out.write(0x80 | ((codepoint >> 12) & 0x3F));
        System.out.write(0x80 | ((codepoint >> 6) & 0x3F));
        System.out.write(0x80 | (codepoint & 0x3F));
    }
});

UPD: или может быть какая-нибудь есть библиотека, в которой символы 3-х байтовые и весь рантайм под такие API переделан?

типа com.google.protobuf.ByteString

Вот посмотрите, как лапочка Дональд Кнут. У него текст состоит из страниц, на страницах расположены строки, строки состоят из боксов. Логично же текстовый документ точно так же читать - чтение текста, это некоторая последовательность обхода этих строк и боксов в каждой строке. Если надо прочитать что-то специальное (математическую формулу), то там другие правила чтения, дерево боксов, но и формулу тоже можно прочитать, просто на другом уровне. Вот почему файловые API так же не устроены? Где в Java классы TextFileReader, TextLineReader, TextBoxReader? Последний можно было бы параметризовать каким-нибудь типом, который описывает, что такое «символ». То-ли LaTeX парсит, толи Unicode GraphemeCluster-ы собирает из Unicode Codepoint, это уже мелкие детали, а наше дело - крупные.

 ,

Shushundr
()

Как математически описывают «потоки»?

Форум — Talks

Раньше были «ленты» (в 1936-м году, у Тьюринга и у Поста). Ленты можно было читать в любом направлении, перемещаться и туда, и обратно, и куда-попало. А потоки не такие, потоки надо вычитывать последовательно и они могут заканчиваться (а ленты по определению были бесконечные).

Так вот, как математики эти новомодные потоки описывают, когда доказывают корректность программ?

UPD: сайт заменил тэг «потоки» на multithreading. А я хотел streams

 ,

Shushundr
()

Что должна уметь делать консольная утилита?

Форум — Desktop

Чтобы быть удобной пользователю?

  1. во-первых, она может разбирать командную строку и получать из неё имена входных и выходных файлов, а если их там нет, то использовать stdin и stdout.

  2. во-вторых, она должна иметь ключ --help или как-то так (кстати, в каких гайдлайнах это написано?)

  3. в-третьих, она может писать в stderr цветным (красным) текстом, отключать вывод цвета при перенаправлении в пайп, и иметь ключ командной строки для того, чтобы цвет не отключать.

  4. возвращать разные коды возвратов при ошибках (есть ли какие-то стандарты? кроме «меньше нуля»)

  5. утилита может уметь разбирать из командной строки команды с параметрами (по аналогии с git)

  6. понимать локаль и выводить сообщения на языке пользователя.

  7. уметь выводить свою версию (для того, чтобы это указывать в багрепотртах)

что ещё?

 ,

Shushundr
()

RSS подписка на новые темы