vit_r: default (Default)
[personal profile] vit_r
Antonia 2025

Рабочие материалы: Жизнь -- копейка, судьба -- пятак



Для начала две схемы.

Идиотский приказ в 2014.

  Сапог  
    |
    V
    X
    |
  Пиджак  


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

Украинскому генералитету с круговой порукой и по-прапорщицки загребущими руками -- тому генералитету, который с девяносто первого был занят распродажей мощнейшей ударной группировки, оставшейся в наследство от Советского Союза -- такое положение дел очень не нравилось. Над вопросом работали. За десять лет схема изменилась кардинально.

Идиотский приказ в 2024.

  Сапог  
    |
    V  
  Штаб    Синекура
    |
    V
  Пиджак


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

Вменяемых командиров выгоняют. (Кто-то сам подаёт рапорт на увольнение, кто-то стреляется.) Офицеры из карьерных военных, кто пытается сломать эту модель, смещаются с руководящих должностей на позиции, которые предполагают продолжение оплаты и роста в званиях, но исключают их реальное влияние на иерархию управления (и потоки распила бабла).

Ничего не мешает украинским генералам проигрывать войну и уничтожать украинскую армию.

Введение закончено. Дальше цитаты.

Итак, следите за руками. (Выделение жирным шрифтом моё.)
Read more... )

Три типа char в Си

Jun. 5th, 2025 09:48 pm
vak: (Default)
[personal profile] vak
Копаясь в семантике компилятора, чего только не узнаешь. Выясняется, в языке Си не два типа "signed char" и "unsigned char", а три. Тип просто "char" отличается от первых двух, хоть и ведет себя как один из них. Обнаружить этот факт можно, попытавшись повторно определить typedef:
$ cat foo.c
typedef char foo;
typedef signed char foo;

$ cc -c foo.c
typedef-char.c:2:21: error: typedef redefinition with different types ('signed char' vs 'char')
2 | typedef signed char foo;
| ^
typedef-char.c:1:14: note: previous definition is here
1 | typedef char foo;
| ^
1 error generated.
С другими типами такого выпендрёжа нет. Компилируется без ошибок:
$ cat bar.c
typedef int bar;
typedef signed int bar;

$ cc -c bar.c
vak: (Знайка)
[personal profile] vak
Я вижу, машина Тьюринга на OCaml не произвела впечатления. Слишком незнакомый язык. Давайте для сравнения перепишем её на что-нибудь традиционное, скажем C++17.
#include <deque>
#include <iostream>
#include <optional>
#include <string>
#include <tuple>
#include <unordered_map>

// Types for Turing machine
enum class Symbol { One, Blank };
enum class Direction { Left, Right };
using State           = std::string;
using TransitionKey   = std::tuple<State, Symbol>;
using TransitionValue = std::tuple<State, Symbol, Direction>;
using Transitions     = std::unordered_map<TransitionKey, TransitionValue, std::hash<TransitionKey>>;

struct Tape {
    std::deque<Symbol> data;
    size_t head_pos;
};

// Hash function for TransitionKey
namespace std {
template <>
struct hash<TransitionKey> {
    size_t operator()(const TransitionKey &key) const
    {
        auto [state, sym] = key;
        return hash<string>()(state) ^ (hash<size_t>()(static_cast<size_t>(sym)) << 1);
    }
};
} // namespace std

// Convert symbol to string for printing
std::string symbol_to_string(Symbol sym)
{
    return sym == Symbol::One ? "1" : "_";
}

// Print the current tape and head position
void print_tape(const Tape &tape, const State &state)
{
    std::string left_str, right_str;
    size_t i = 0;
    for (const auto &sym : tape.data) {
        if (i < tape.head_pos) {
            left_str += symbol_to_string(sym);
        } else if (i > tape.head_pos) {
            right_str += symbol_to_string(sym);
        }
        ++i;
    }
    std::cout << "[" << left_str << "] " << symbol_to_string(tape.data[tape.head_pos]) << " ("
              << state << ") " << right_str << "\n";
}

// Move the tape head
void move_head(Tape &tape, Direction dir)
{
    if (dir == Direction::Right) {
        if (tape.head_pos + 1 >= tape.data.size()) {
            tape.data.push_back(Symbol::Blank);
        }
        ++tape.head_pos;
    } else { // Left
        if (tape.head_pos == 0) {
            tape.data.push_front(Symbol::Blank);
        } else {
            --tape.head_pos;
        }
    }
}

// Step the Turing machine
std::optional<State> step(Tape &tape, const State &state, const Transitions &transitions)
{
    TransitionKey current = { state, tape.data[tape.head_pos] };
    auto it               = transitions.find(current);
    if (it == transitions.end()) {
        return std::nullopt; // No transition: halt
    }
    const auto &[new_state, new_symbol, dir] = it->second;
    tape.data[tape.head_pos]                 = new_symbol;
    move_head(tape, dir);
    return new_state;
}

// Run the Turing machine
void run_turing_machine(Tape tape, const State &start_state, const Transitions &transitions,
                        const State &accept_state, const State &reject_state)
{
    State current_state = start_state;
    while (true) {
        print_tape(tape, current_state);
        if (current_state == accept_state) {
            std::cout << "Accepted\n";
            break;
        }
        if (current_state == reject_state) {
            std::cout << "Rejected\n";
            break;
        }
        auto next_state = step(tape, current_state, transitions);
        if (!next_state) {
            std::cout << "Halted (no transition)\n";
            break;
        }
        current_state = *next_state;
    }
}

// Turing machine to add two unary numbers
void example_add()
{
    Transitions transitions = {
        // q0: Move right to find blank
        { { "q0", Symbol::One }, { "q0", Symbol::One, Direction::Right } },
        { { "q0", Symbol::Blank }, { "q1", Symbol::One, Direction::Left } },
        // q1: Move left to start
        { { "q1", Symbol::One }, { "q1", Symbol::One, Direction::Left } },
        { { "q1", Symbol::Blank }, { "qaccept", Symbol::Blank, Direction::Right } }
    };
    // Tape represents 2 + 3: 11_111
    Tape tape = {
        { Symbol::One, Symbol::One, Symbol::Blank, Symbol::One, Symbol::One, Symbol::One }, 0
    };
    run_turing_machine(tape, "q0", transitions, "qaccept", "qreject");
}

int main()
{
    example_add();
}
Кода вышло в два раза больше. Стало ли яснее? Запустим для проверки.
$ c++ -std=c++17 turing-add.cpp -o turing-add
$ ./turing-add
[] 1 (q0) 1_111
[1] 1 (q0) _111
[11] _ (q0) 111
[1] 1 (q1) 1111
[] 1 (q1) 11111
[] _ (q1) 111111
[_] 1 (qaccept) 11111
Accepted
vak: (Украина)
[personal profile] vak
На кадрах зафиксированы удары FPV-дронов СБУ по четырем вражеским аэродромам: «Оленья», «Иваново», «Дягилево» и «Белая», где базировалась стратегическая авиация государства-агрессора, которая регулярно обстреливает мирные украинские города.

Среди пораженных воздушных судов — А-50, Ту-95, Ту-22, Ту-160, а также Ан-12 и Ил-78.

vak: (Знайка)
[personal profile] vak
В качестве иллюстрации к языку OCaml вот вам реализация машины Тьюринга. В студенчестве я на Рефале такое писал. Жаль не сохранилось.
(* Types for Turing machine *)
type symbol = One | Blank
type direction = Left | Right
type state = string
type transition = (state * symbol) * (state * symbol * direction)
type tape = { left: symbol list; head: symbol; right: symbol list }

(* Convert symbol to string for printing *)
let string_of_symbol = function
| One -> "1"
| Blank -> "_"

(* Print the current tape and head position *)
let print_tape tape state =
let left_str = List.map string_of_symbol tape.left |> String.concat "" in
let right_str = List.map string_of_symbol tape.right |> String.concat "" in
Printf.printf "[%s] %s (%s) %s\n" left_str (string_of_symbol tape.head) state right_str

(* Move the tape head *)
let move_head tape dir =
match dir with
| Right ->
let new_right, new_head = match tape.right with
| [] -> ([], Blank)
| h :: t -> (t, h)
in
{ left = tape.head :: tape.left; head = new_head; right = new_right }
| Left ->
let new_left, new_head = match tape.left with
| [] -> ([], Blank)
| h :: t -> (t, h)
in
{ left = new_left; head = new_head; right = tape.head :: tape.right }

(* Step the Turing machine *)
let step tape state transitions =
let current = (state, tape.head) in
match List.assoc_opt current transitions with
| None -> None (* No transition: halt *)
| Some (new_state, new_symbol, dir) ->
let new_tape = { tape with head = new_symbol } in
let moved_tape = move_head new_tape dir in
Some (moved_tape, new_state)

(* Run the Turing machine *)
let run_turing_machine tape start_state transitions accept_state reject_state =
let rec run tape state =
print_tape tape state;
if state = accept_state then Printf.printf "Accepted\n"
else if state = reject_state then Printf.printf "Rejected\n"
else match step tape state transitions with
| None -> Printf.printf "Halted (no transition)\n"
| Some (new_tape, new_state) -> run new_tape new_state
in
run tape start_state

(* Turing machine to add two unary numbers *)
let example_add () =
let transitions = [
(* q0: Move right to find blank *)
(("q0", One), ("q0", One, Right));
(("q0", Blank), ("q1", One, Left));
(* q1: Move left to start *)
(("q1", One), ("q1", One, Left));
(("q1", Blank), ("qaccept", Blank, Right));
] in
(* Tape represents 2 + 3: 11_111 *)
let tape = { left = []; head = One; right = [One; Blank; One; One; One] } in
run_turing_machine tape "q0" transitions "qaccept" "qreject"

(* Run the example *)
let () = example_add ()
Вышеприведённая программа на машине Тьюринга складывает два числа 2+3, записанные как последовательность единиц: 11 111. В результате получается 5, то есть 11111. Запускаем:
$ ocaml turing_add.ml 
[] 1 (q0) 1_111
[1] 1 (q0) _111
[11] _ (q0) 111
[1] 1 (q1) 1111
[] 1 (q1) 11111
[] _ (q1) 111111
[_] 1 (qaccept) 11111
Accepted
vak: (бэсм-6)
[personal profile] vak
Постепенно нарабатываю методику разработки софта посредством ИИ. Законспектирую для памяти, вдруг пригодится для мемуаров. 😀 Вчера удалось заметно продвинуться в Си компиляторе. Нужно сделать проход, который получает от парсера синтаксическое дерево (AST), по нему строит таблицу символов (переменных и функций), таблицу типов (структуры и union), и расставляет типы во всех выражениях.

Гляжу в книжку, беру за образец исходники компилятора NQCC и делаю как там написано. Но на чистом Си. Много нетривиального кода. Работа получается нудная и малоинтересная. Без посторонней помощи я бы не взялся. Но к счастью, нынче мы имеем ИИ, а он товарищ неленивый. Хотя часто невнимательный склонный к многословности вместо упрощения. И тут нужно иметь подход. Чем я и занимаюсь. Вчера удалось подобрать ключик и посредством серии запросов наворотить солидную часть компилятора. По сути творчески переписать модуль typecheck.ml с OCaml на Си, с учётом всех деталей.

Итак, первый запрос:
Hi Grok,
I'm attaching file "typecheck.ml" in OCaml, which parses an AST and builds two tables: Symbols and Type_table.
I'm going to rewrite this code into C.
Please analyze this code focusing on "Symbols".
I will create a map "symtab" in C which converts a name of symbol into a pointer to a data structure which describes that symbol.
Please tell me, how this data structure should look.
Structure of AST in C is defined in file "ast.h", attached.
Methods of Symbols in OCaml are defined in file "symbols.ml", also attached.
Таблица символов представляет собой map, отображающий строку (имя переменной или функции) в структуру Symbol. Но что должно быть в этой структуре? Я сначала сам ломал голову, а потом догадался озадачить Грока. В ответ получил весьма осмысленные определения нужных структур, и даже пример работы с ними. Подпилил маленько вручную.

Но это структуры, а к ним бы и методы. Следующий запрос:
Good. Here is my decision: file "symbol.h" attached.
Now please give me a full list of signatures for routines in C which I need to implement for symtab, like the above add_static_var(). For example:
void symtab_add_static_var(char *name, Type *t, bool global, InitKind kind, StaticInitializer *data);
Грок немедленно выдал список нужных функций. Все вместе после моих доделок можно видеть в файле: symtab.h

Хорошо, это таблица символов. А теперь примемся за таблицу типов:
Very good.
Now please do a similar analysis focusing on "Type_table".
I'm attaching file "type_table.ml", which defines details of the OCaml implementation.
I will create a map "typetab" in C which converts a name into a pointer to a data structure which describes each type entry.
Please tell me, how this data structure should look.
И методы к таблице типов:
Good.
Now please give me a full list of signatures for routines in C which I need to implement for typetab, like the above typetab_add_struct_definition().
Результат здесь: typetab.h

Неплохо дело идёт, подумал я. А давай Грок весь этот код перепишет на Си. Сам бы я несколько месяцев трудился. Только как бы не нагородил лишнего. Пришлось давать подробные указания.
Good.
Now please reimplement the above file "typecheck.ml" in C.
The goal is to iterate through the AST tree, build symtab and typetab, and annotate the AST tree with type information.
It means to set values of Type *type field of each struct Expr, and similar field in initializers.
Use structures defined in the above files "symbol.h" and "typetab.h".
Avoid reallocation of AST nodes, better modify them in place.
Assume routines declared in the above files "symtab.h" and "typetab.h" are available.
In case any fieilds are missing in the AST definition, please let me know.
Note that for allocating or copying AST nodes a set of routines is available, for example:

Type *new_type(TypeKind kind);
Type *clone_type(const Type *type);
Удивительно, но код на Си получился очень неплохой. Процентов на 95%. Мелочёвку я уж сам подчищу, ладно. Но обнаружились две тонкости, которые мне Грок указал в комментариях. В узле Initializer дерева AST недоставало поля Type *type. И структуру StaticInitializer Грок сорганизовал в массив вместо списка. Надо исправить.
Not bad!
I've added Type *type to Initializer in "ast.h", new file attached.
I'm also uploading new version of symtab.h - please use it instead of the old one.
Note that it has type StaticInitializer which is a linked list (with field *next).
Please use it instead of Initializers handle static initializers.
I'm also uploading file "initializers.ml" in OCaml in case it helps.

Please update the C implementation: use new field "type" in Initializer in ast.h,
and handle static initializers using struct StaticInitializer.
Уже лучше. Ещё раз пересмотрел внимательно весь код - есть ещё где упростить.
Please modify function:

Declaration *typecheck_fn_decl(Declaration *d)

to accept ExternalDecl instead of Declaration.
Let it return void, as it never reallocates the argument. Let it be:

void typecheck_fn_decl(ExternalDecl *d)

Also modify other similar functions to return void.
Отлично. Имеем 1300 строк неплохого кода на Си. Главное - понятного кода, простого в сопровождении. Результат после моих правок можно видеть в файле: typecheck.c

Там ещё не всё вычищено, в процессе. Но теперь займёмся тестами.Сами тесты я сделаю, а от Грока требуется вход и ожидаемый результат.
Excellent.
Please propose a comprehensive list of unit tests for the typecheck implementation.
Each test case should have:
1. A snippet of C code to be converted to AST by parser. The parser is already available.
2. Expected contents of symtab.
3. Expected contents of typetab.
4. Expected contents of "type" fields in the resulting AST tree.
Имеем данные для десятка простых тестов для начала: typecheck_tests.cpp

Но это потом, когда таблицы символов и типов заработают. А пока примемся за таблицу символов.
Please create isolated unit tests for symtab_xxx() routines. Use Googletest.
Результат в файле: symtab_tests.cpp

Аналогично для таблицы типов:
Good. Now please create tests for typetab routines.
Тоже не вопрос: typetab_tests.cpp

Тут надо понимать, что исходники, получаемые от ИИ, не есть законченное решение. Часто они даже компилируются без ошибок, в простых случаях работают с первого раза. Это не так важно. Можно указать Гроку на ошибку компиляции или при запуске программы, и он её исправит. С 90% вероятностью. Исправить я и сам могу, нетрудно. Ценность в том, что код получается достаточно простым и понятным, легким в понимании, а значит и в последующем развитии.

Я слышал, уже есть платные сервисы, где ИИ берёт на себя весь цикл разработки, от формулировки задачи (создай Jira тикет: добавить такую-то фичу), через организацию непрерывной сборки (активируй CI build на Github Actions), через создание тестов (импортируй юнит тесты из стороннего проекта для этой фичи), до собственно разработки софта (реализуй эту фичу) и его доводки (продолжай чинить исходники пока не пройдут все тесты). Сам я пока такое не решаюсь пробовать. Может со временем. Пока довожу код до ума вручную.

Санта Круз против

Jun. 3rd, 2025 12:48 pm
vak: (U.S.A.)
[personal profile] vak
Когда-то и в наших краях рок-н-ролл запрещали.

Сталина пережил

Jun. 3rd, 2025 11:14 am
vak: (Кризис так себе)
[personal profile] vak
Хотите увидеть фотку Гитлера 1955 года? Здесь на третьей странице.

cia.gov/readingroom/docs/HITLER%2C%20ADOLF_0003.pdf

OCaml

Jun. 2nd, 2025 01:18 pm
vak: (Знайка)
[personal profile] vak
Новая книжка на моей полке.



Свет не сошёлся клином на одном Rust. За последние годы появился ещё один значимый язык. В 2023 году OCaml получил престижную премию SIGPLAN Award. Когда-то в юности я фигел от Снобола-4, позже от Scheme. А здесь всё совсем удобно сделано.



Сижу разбираюсь, как устроен NQCC, компилятор Си из книжки, написанный на OCaml. И прихожу к выводу, что сделан он весьма неплохо, причём во многом благодаря OCaml. Если бы я сейчас начинал какую нибудь серьёзную разработку типа компилятора, возможно я бы делал его на OCaml вместо Rust или Golang.

Для примера, перепрём /bin/echo на OCaml.
let process_escapes str =
let len = String.length str in
let buf = Buffer.create len in
let rec loop i =
if i >= len then Buffer.contents buf
else if str.[i] <> '\\' then (
Buffer.add_char buf str.[i];
loop (i + 1)
) else if i + 1 < len then (
match str.[i + 1] with
| 'n' -> Buffer.add_char buf '\n'; loop (i + 2)
| 't' -> Buffer.add_char buf '\t'; loop (i + 2)
| '\\' -> Buffer.add_char buf '\\'; loop (i + 2)
| _ -> Buffer.add_char buf str.[i]; loop (i + 1)
) else (
Buffer.add_char buf str.[i];
loop (i + 1)
)
in
loop 0

let echo no_newline enable_escapes args =
let process = if enable_escapes then process_escapes else fun x -> x in
let output = String.concat " " (List.map process args) in
if no_newline then print_string output
else print_endline output

let main () =
let no_newline = ref false in
let enable_escapes = ref false in
let args = ref [] in
let speclist = [
("-n", Arg.Set no_newline, "do not output the trailing newline");
("-e", Arg.Set enable_escapes, "enable interpretation of backslash escapes");
] in
Arg.parse speclist (fun arg -> args := arg :: !args) "Usage: echo [-n] [-e] [string ...]";
echo !no_newline !enable_escapes (List.rev !args)

let () = main ()
Компилируем, запускаем:
$ ocamlopt -O2 -o echo echo.ml

$ ./echo --help
Usage: echo [-n] [-e] [string ...]
-n do not output the trailing newline
-e enable interpretation of backslash escapes
-help Display this list of options
--help Display this list of options

$ ./echo -e "Hello\nWorld"
Hello
World

Ядерная трюида

Jun. 2nd, 2025 10:34 am
vak: (Украина)
[personal profile] vak
Украинцы освободили Европу от страха перед российской ядрёной дубинкой. Стратегическая авиация отправилась по маршруту русского военного корабля.

Россияне находятся в иллюзии, что их так называемая ядерная триада даёт им магическую власть над миром. Но в России традиционно всё построено на вранье. Ядрёные бомбы давно протухли. Подлодка Курск как "утонула", так с тех пор и остальные не лучше. Баллистические ракеты не летают. Коллективный путин продолжает трясти своими орешками, то есть "орешником", но над ним не смеётся только ленивый. Только самолёты до недавнего времени продолжали летать, чуть ли не ежедневно бомбя Украину. Но теперь им каюк.

Трамп наверное расстроится. Он собирался продавать Европе безопасность за большие деньги. Но украинцы опять явились, и снова без костюма. Лучше уж Европа вложится в свою и в украинскую оборонную промышленность. Тем более что американское оружие вроде никого нынче защищать не станет. По крайней мере при Трампе.
vit_r: default (Default)
[personal profile] vit_r
Simeon 2025, День Защиты Детей (в Украине отменён)

Первый день жаркого лета


Украинцы нанесли сокрушительный удар по одному из компонентов ядерной триады Российской Федерации. На аэродромах горят стратегические бомбардировщики.

Одноразовая акция без существенных последствий для поля боя, но с большими политическими последствиями.

Очень правильное действие, если бы было выполнено, когда Россия зимой с этих самых бомбардировщиков выносила энергетическую инфраструктуру Украины с целью заморозить население (которое по идее Кремля должно было бы выступить против властей).

Ха! Население скаталось погреться в Европу. Да и, вообще, какие выступления, когда в Украине можно бусификацию.

Очень правильное действие, если бы было выполнено вовремя. Но атака не была проведена вовремя, она была проведена именно сейчас.

Не будем разделять радость и смотреть видосики. Попробуем подумать головой.
Read more... )

Питон не питонирует

May. 31st, 2025 02:03 pm
vak: (Daemon)
[personal profile] vak
Решил подписаться на линуксный журнал, а у них ошибка выскакивает. Питон не тот язык, на котором следует писать надёжные системы. Заметьте: production код выполняется из каталога /home/odoo/src.
RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 1803, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/home/odoo/src/odoo/17.0/odoo/service/model.py", line 152, in retrying
result = func()
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 1831, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 2035, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/src/odoo/17.0/addons/website/models/ir_http.py", line 235, in _dispatch
response = super()._dispatch(endpoint)
File "/home/odoo/src/odoo/17.0/odoo/addons/base/models/ir_http.py", line 221, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 772, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/enterprise/17.0/website_sale_account_taxcloud/controllers/main.py", line 48, in shop_payment_transaction
return super().shop_payment_transaction(order_id, access_token, **kwargs)
File "/home/odoo/src/odoo/17.0/odoo/http.py", line 772, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/odoo/17.0/addons/website_sale/controllers/main.py", line 2089, in shop_payment_transaction
return tx_sudo._get_processing_values()
File "/home/odoo/src/odoo/17.0/addons/payment/models/payment_transaction.py", line 466, in _get_processing_values
processing_values.update(self._get_specific_processing_values(processing_values))
File "/home/odoo/src/custom/trial/saas_payment_stripe/models/payment_transaction.py", line 24, in _get_specific_processing_values
res = super()._get_specific_processing_values(processing_values)
File "/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py", line 36, in _get_specific_processing_values
intent = self._stripe_create_intent()
File "/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py", line 90, in _stripe_create_intent
payload=self._stripe_prepare_payment_intent_payload(),
File "/home/odoo/src/custom/trial/saas_payment_stripe/models/payment_transaction.py", line 73, in _stripe_prepare_payment_intent_payload
**super()._stripe_prepare_payment_intent_payload(**kwargs),
File "/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py", line 176, in _stripe_prepare_payment_intent_payload
payment_intent_payload.update(**self._stripe_prepare_mandate_options())
File "/home/odoo/src/odoo/17.0/addons/payment_stripe/models/payment_transaction.py", line 206, in _stripe_prepare_mandate_options
mandate_values = self._get_mandate_values()
File "/home/odoo/src/enterprise/17.0/sale_subscription/models/payment_transaction.py", line 53, in _get_mandate_values
start_datetime = max(
TypeError: '>' not supported between instances of 'datetime.datetime' and 'bool'

The above server error caused the following client error:
RPC_ERROR: Odoo Server Error
RPC_ERROR
at makeErrorFromResponse (https://shop.linuxnewmedia.com/web/assets/4/8f9a553/web.assets_frontend_lazy.min.js:4739:163)
at XMLHttpRequest.<anonymous> (https://shop.linuxnewmedia.com/web/assets/4/8f9a553/web.assets_frontend_lazy.min.js:4743:13)
vak: (бэсм-6)
[personal profile] vak
Рановато я взялся в Си компиляторе за превращение AST в TAC. Бревна не приметил. Сначала следует заняться так называемым семантическим анализом. В языке Би такая штука отсутствовала напрочь, ведь типов не было. В Си же это суть языка. Основные задачи этого прохода:
  1. Построение таблицы символов. То есть имён переменных и функций. Привязка всех идентификаторов в AST к таблице символов.
  2. Построение таблицы типов. Сюда помещаются все определения struct, union и enum.
  3. Расстановка типов во всех выражениях в AST.
  4. Обнаружение неявных преобразований типов и вставка явных преобразований.
  5. Помещение инициализаторов в таблицу символов.
  6. Разметка циклов для операторов break и continue.
Вполне себе объём работ. И только после этого можно будет генерить TAC. Необязательно выделять семантический анализ как отдельный проход. Это вполне может быть фронтенд в проходе tacker.
vak: (Default)
[personal profile] vak
Что наш язык земной пред дивною природой?
С какой небрежною и легкою свободой
Она рассыпала повсюду красоту
И разновидное с единством согласила!
Но где, какая кисть ее изобразила?
Едва-едва одну ее черту
С усилием поймать удастся вдохновенью...
Но льзя ли в мертвое живое передать?
Кто мог создание в словах пересоздать?
Невыразимое подвластно ль выраженью?..
Святые таинства, лишь сердце знает вас.
Не часто ли в величественный час
Вечернего земли преображенья,
Когда душа смятенная полна
Пророчеством великого виденья
И в беспредельное унесена, —
Спирается в груди болезненное чувство,
Хотим прекрасное в полете удержать,
Ненареченному хотим названье дать —
И обессиленно безмолвствует искусство?
Что видимо очам — сей пламень облаков,
По небу тихому летящих,
Сие дрожанье вод блестящих,
Сии картины берегов
В пожаре пышного заката —
Сии столь яркие черты —
Легко их ловит мысль крылата,
И есть слова для их блестящей красоты.
Но то, что слито с сей блестящей красотою —
Сие столь смутное, волнующее нас,
Сей внемлемый одной душою
Обворожающего глас,
Сие к далекому стремленье,
Сей миновавшего привет
(Как прилетевшее незапно дуновенье
От луга родины, где был когда-то цвет,
Святая молодость, где жило упованье),
Сие шепнувшее душе воспоминанье
О милом радостном и скорбном старины,
Сия сходящая святыня с вышины,
Сие присутствие создателя в созданье —
Какой для них язык?.. Горе́ душа летит,
Все необъятное в единый вздох теснится,
И лишь молчание понятно говорит.
(1819)
vak: (Аристипп)
[personal profile] vak
Из книги «Третья волна» Элвина Тоффлера. Отрывок из главы №25 «Новая Психо-Сфера».

Атака на одиночество

Чтобы создать полноценную эмоциональную жизнь и здоровую психо-сферу для зарождающейся цивилизации завтрашнего дня, мы должны признать три основных требования любого человека: потребности в сообществе, структуре и смысле. Понимание того, как крах общества Второй волны подрывает все три, подсказывает, как мы можем начать проектировать более здоровую психологическую среду для себя и наших детей в будущем.

длинно )
vak: (Аристипп)
[personal profile] vak
(гуглоперевод фрагмента из книжки Томаса Метцингера "The Ego Tunnel: The Science of the Mind and the Myth of the Self")

Представьте, что я держу перед собой образцы цвета двух похожих оттенков зеленого. Между этими двумя оттенками есть разница, но она едва заметна. (Технический термин, который иногда используют специалисты по психофизике, — JND, или «едва заметная разница». JND — это статистическое различие, а не точная величина.) Два оттенка (я буду называть их Зеленый № 24 и Зеленый № 25) — ближайшие возможные соседи на цветовой шкале; между ними нет оттенка зеленого, который вы могли бы различить. Теперь я закладываю руки за спину, смешиваю образцы и держу один из них. Это Зеленый № 24 или Зеленый № 25? Интересное открытие заключается в том, что осознанное восприятие само по себе не позволяет вам заметить разницу. Это означает, что понимание сознания может также включать понимание тонкого и сверхтонкого, а не только целого.

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

дальше )
vak: (Аристипп)
[personal profile] vak
(оригінал: hplovecraft.com/writings/texts/fiction/u.aspx)

Ближче до полудня осіннього дня ми сиділи на напівзруйнованій гробниці сімнадцятого століття на старому цвинтарі в Аркхемі та розмірковували про неназивне. Дивлячись на велетенську вербу посеред цвинтаря, стовбур якої майже поглинув стародавню, нерозбірливу плиту, я зробив фантастичне зауваження про примарне та незгадане живлення, яке колосальне коріння, мабуть, всмоктує з цієї сивої, склепової землі; коли мій друг дорікнув мені за таку нісенітницю та сказав, що оскільки там не було поховань понад століття, ніщо не може існувати, щоб живити дерево інакше, ніж звичайним способом. Крім того, додав він, мої постійні розмови про «неназивні» та «незгадані» речі були дуже дитячим прийомом, цілком відповідним моєму низькому становищу як автора. Я надто любив закінчувати свої оповідання видами чи звуками, які паралізували здібності моїх героїв і позбавляли їх сміливості, слів чи асоціацій, щоб розповісти про те, що вони пережили. Ми пізнаємо речі, казав він, лише через наші п'ять органів чуття або нашу релігійну інтуїцію; тому абсолютно неможливо посилатися на будь-який об'єкт чи видовище, які не можна чітко зобразити за допомогою твердих визначень фактів або правильних доктрин теології — бажано конгрегаціоналістів, з будь-якими модифікаціями, які можуть запропонувати традиція та сер Артур Конан Дойл.

З цим другом, Джоелом Ментоном, я часто мляво сперечався. далі... )
vit_r: default (Default)
[personal profile] vit_r
German 2025

Украинская Совесть


Пусть другие кричат от отчаянья,
От обиды, от боли, от голода!
Мы-то знаем -- доходней молчание,
Потому что молчание -- золото!
"Старательский вальсок", Александр Галич, 1963
(Родился: 1918, Екатеринослав, Українська Держава. Умер: 1977, Париж, Франция)



Тут наклюнулся философский вопрос. Извините, это опять про пришествие воина света.

Сначала я получил обвинения в художественном неправдоподобии (бывает), потом в прокремлёвской пропаганде (уже интереснее), потом в отсутствии совести (невелика потеря).

Допустим, что всё это так. Не будем спорить.

Отрицательный пример мы получили -- "Здрасьте! Это я!"

Но надо же выяснить, как надо. Должна же молодёжь с кого-то брать пример. Как жить? Каким быть? На кого равняться?

И что такое для современного украинца совесть?
Read more... )

Profile

iamjaph

March 2025

S M T W T F S
      1
2345678
9101112131415
16171819 202122
23242526272829
3031     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 6th, 2025 03:26 pm
Powered by Dreamwidth Studios