Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Луа под виндой как-то отчаянно сосет хуй не умея настоящие random из Windows Crypto API.
В результате вызов 150 раз программы дает один и тот же random. Его конечно можно math.randomseed(os.time()), но то так, бо time это даже не милисекунды а сеунды.
Все просто, луа вообще ни с чем работать не может. Так как чистая луашка предполагает все необходимое имено работы с луа (ну немного с файлами, но и то с проблемами).
Сам я с апи не работал, но попробуй через экзикуцию, os.execute(каманда в теминале)
У меня есть дружок, он кодит на с++. Так вот, однажды он прознал про луа и тоже захотел попробовать в него и встроить. У него дико бомбило что этот язык для него через чур абстрактен., когда плюсы для него очевидны и понятны.
На линьке zerobrain studio и совмесно с луабиблорепозиторием luarocks вообще бомбезное сочитание, установил, поставил библы и заебись, вообще ничо делать не надо.
У винды это дикий анус, хз куда ставит луарокс библы, хз где ищет интерплитатор либы и тд.
Можешь попробывать сам подгрузить библу
package.cpath = package.cpath.."путь к папке с библами"
require("lib.dll");
У Линукса просто все хорошо с библами и ы одной папке лежат, а у винды хаос длл. По этому возможно из-за этого
Забавно что require это чуть-ли не единственная функция в lua которая реализована платформозависимым способом: dlopen на posix и LoadLibrary на винде. А API с сями удобный, я уже заценил.
Решение с вызовом через ":" тоже офигенное потому что позволяет одну и ту же функцию использовать и как метод и просто как функцию. В джаве так нельзя.
Единственное чего я пока не понял это волшебную силу скобочек при возвращении множества значений из функции
function pitux()
return 1,2,3
end
print(pitux()) --1 2 3
print((pitux())) --1
еще пример
tbl = {1,2,3,4}
function foo(a,b,c,d)
print("a:", a)
print("b:", b)
end
foo((table.unpack(tbl))) -- a: 1, b: nil.
foo(table.unpack(tbl)) -- a: 1, b: 2
>> print((pitux()))
тут просто ты в принте присваиваешь в одно значение, и из ретурна соотвественно берется 1 первое значение.
То есть скобками ты ограничил область в 1 переменную.
Блжать банально.
local x,y = (pitux())
print(x,y) --1, nil
>> Решение с вызовом через ":" тоже офигенное потому что позволяет одну и ту же функцию использовать и как метод и просто как функцию. В джаве так нельзя.
Так и не понял чоита? Это та фича когда неопределнно возникает локаль self?
Насколько я понимаю философию Луа, из коробки в ней ровно то, что можно запилить средствами СТАНДАРТНОЙ сишной либы.
Если сишный rand() на винде говно, значит, в луа он тоже говно.
Если в столь любимой тобой либе сишки нет возможности просмотреть каталог, луа этого тоже из коробки не умеет.
Ах да, вот же.
math.random ([m [, n]])
This function is an interface to the simple pseudo-random generator function rand provided by ANSI C. (No guarantees can be given for its statistical properties.)
>> из коробки в ней ровно то, что можно запилить средствами СТАНДАРТНОЙ сишной либы.
да, я это уже понял. Потому она и переносима, что ничего кроме ANSI C там нет.
>>Если сишный rand() на винде говно, значит, в луа он тоже говно.
Внезапно оказалось что rand() на linux ведет себя точно так же, если ему не сделать srand.
Пример выше взят из openbsd: тамошние параноики реализовали rand так, что он дейтсвительно возвращает разные (хотя и псевдослучайные) значения. А на винде и линуксе надо делать srand().
Я обосрался, извините.
>>Если в столь любимой тобой либе сишки нет возможности просмотреть каталог
Ты мне так и не ответил, кстати: как посмотреть каталог в стандартной библиотеке любимого всеми современными программистами JavaScript?
Это может быть очередная личность, которая не считает себя Стертором, поэтому никогда не признается.
А может быть, наоборот, совершенно левый чувак, который хочет, чтобы мы его считали Стертором, и пишет всякую чушь, пародируя стиль Стертора, чтобы опорочить его имя.
2010-12-19T10:48:07+00:00 некто komprenda изрёк: „Действительно убого желания больше появляться тут у меня нет, это пока други можете себе этот сарафан забрать пароль от него 123456“
Насрал, а потом опубликовал свой пароль, чтобы половина ГК залогинилась в его учётку, чтобы потом сказать, что срал не он, а те, кто подобрал его пароль...
После того случая местная публика стала с недоверием относиться к тем, кто подобным образом расшаривает пароли.
Откуда знаешь что 3? Вдруг у него больше? Просто ты он них неподозреваешь, завтра он дельфист, а после завтра питонист, что из них он считает нежелательными?
А знаешь почему? Потому что если копируешь именно от сюда ник, то он каким то магическим образом не подходит. Ответственно заявляю, как хранитель этого аккаунта.
(сам забыл как правильно пишеться, копировал от сюда и долгое время понять не мог почему не заходит)
Две бляди, поставившие мне по минусу, приходятся друг другу любовниками, чьи плечи и шеи усеяны мощными бордовыми засосами и кровавыми укусами, чей верхний ящик комода вот-вот треснет от сотен тюбиков с лубрикантами, коими он забит до отказа, не уступая и нижнему, преисполненному распакованными для экономии места ребристыми презервативами, и чей домашний кинотеатр повидал сотни часов камерунского порно.
кисуль камерунский у тебя за щекой, а с луа ситуация вот какая:
Луа для того чтобы встраиваться в системы и быть plumbing code (aka "программирование-в-малом"): он чтобы легко и просто двигать сложные, написанные на сях объекты и вызывать функции. Чтобы скриптоваться внутри, короче.
В отличие от, например, Python, который сделан чтобы ты мог кросс-платформенно легко и просто писать.
Потому у питона есть свои абстракции (ну там например asyncio, которое на каждой ОС реализовано по разному) а в lua такого нет, потому что у lua нет задачи чтобы ты писал один код который везде бы работал макисмально производительно.
Зато lua можно скомпилировать подо что угодно, хоть под OpenVMS, хоть под DOS. Где есть ANSI C -- там есть lua (ну кроме import разишто), а Python придется долго и сложно портировать.
под дос вполне могли писать на BASIC если там был PEEK и POKE.
Под винду на VB писать сложнее потому что он копилица в PCode и требуе рантайма для запуску
Но на VBS вполне могли написать говно для IE (хотя VBScript не совсем basic, вкак и VB).
Наконец, на VBA (тот же VB но внутри офиса) могли написать довольно много говна
Бейсик компилит как в псевдокод, так и в нативе, так что хуйню ты сморозил. Но этим высером твоя ересь не исчерпывается. Рантайм по умолчанию идёт абсолютно во все поставки винды, так что ты опять обосрался. Ну и наконец в третьих, Пик и Поук не нужны нахуй; всли в этом убожестве поинтеры не разыменовываются (т.е. возможность побайтного копирования практически исключена), можно тупо дёргать RTLMoveMemory. В четвертых, VBA сильно кастрирован и по умолчанию выключен. Юзеру предлагаецца включить макрос на свой страх и риск, это действие офис предваряет показом уведомления со страшным знаком опасности, которое с перепугу можно принять за угрозу инопланетного вторжения.
>> Рантайм по умолчанию идёт абсолютно во все поставки винды
Нет. Нужно ставить "Visual Basic 6.0: Run-Time Redistribution Pack" ну или бандлить его.
Кроме того если ты собираешься встраивать свой вирь в .exe файл то довольно очевидно что он не должен требовать рантайм.
>> так и в нативе,
Внезапно ты оказался прав (и такое бывает!) но рантайм все равно нужен. Ты будешь рантайм вместе с вирем дистрибить?
>>Бейсик компилит как в псевдокод, так и в нативе
>> можно тупо дёргать RTLMoveMemory.
Расскажи мне, о мудрый ослолюб, в каком месте MS-DOS я могу найти функцию RTLMoveMemory?
зы: ладно, ты все таки чуть-чуть прав, но я тоже
Though VB programs can be compiled into native code executables from version 5 on (до этого не могли!!!), they still require the presence of around 1 MB of runtime libraries. Core runtime libraries are included by default in Windows 2000 and later (радуйся!!), but extended runtime components still have to be installed (ахахахаха!). Earlier versions of Windows (95/98/NT), require that the runtime libraries be distributed with the executabl (так-то!)
В рантайме есть много недокументированных обёрток (например, как VarPtr, StrPtr), вполне возможно, что есть и функция побайтного копирования. Но вызывать их - ссзб.
Чувак, я написал про PEEK и POKE применительно к программированию под DOS.
Там не было никаких функций ни для чего.
Справедливости говоря C тоже нужен рантайм VCRT чтобы работал всякий memcpy.
Но его вопервых можно статически линкануть (а в VB можно??) во-вторых если сидеть на чистом win32API (HeapAlloc вместо malloc) но он как-бы и не нужен
Давай скорее пруф как линкануть статически рантайм VB и я признаю что обосрался
Пушо скомпилированный нативно и слинкованный статичеси с рантаймом код на VB не хуже кода на сях (хоть и больше) для написания вирей
правда я ХЗ чо там было с управлением памятью. Щетчик сцылок?
Лень документацию шнырять, я давно уже вырос из васика. Но статика там точно была, хоть и с извращениями и ёблей с линкером. Я всегда был против извращений, поэтому опускал такие тонкости.
>> Чувак, я написал про PEEK и POKE применительно к программированию под DOS.
>> Там не было никаких функций ни для чего.
Quick Basic позволял прилинковывать библиотеки, написанные на других языках, если они соблюдали коллконвеншен. К полному Quick Basic (не QBASIC 1.0 из MS-DOS) прилагались библиотеки для вызова прерываний DOS и BIOS.
Это же ни хуя не макрос. 100% что под капотом - тупо побайтное копирование с инкрементом "опасного" указателя. В бейсике это нереально сделать, т.к. указателей нет в принципе - разыменовывать нечего. Всё что только можно кастуется в Лонг
У каждого VB своя версия рантайма. По умолчанию сначала включали рантайм версии 5, потом стали включать версию 6, а пятёрку выкинули. А для первых четырёх VB рантайм всегда нужно было таскать вручную.
Первая попавшаяся программа на VB обычно падает, потому что не зарегистрирован какой-нибудь OCX-компонент. Т. е. нужно ещё писать так, чтобы не использовать всякое говно, не входящее в рантайм.
У каждого VB своя версия рантайма. По умолчанию сначала включали рантайм версии 5, потом стали включать версию 6, а пятёрку выкинули. А для первых четырёх VB рантайм всегда нужно было таскать вручную.
Первая попавшаяся программа на VB обычно падает, потому что не зарегистрирован какой-нибудь OCX-компонент. Т. е. нужно ещё писать так, чтобы не использовать всякое говно, не входящее в рантайм.
Мне кажется что если и OCX (и вообще любой COM) лежал в той же самой папке то его можно было не regsrv32ить, но могу ошибаться.
Ну про рантайму я там уже выше вику цитнул: с пятерки начали бандлить core в w2k. Но extended все равно не было: только core и только nt-based (в 9x не было)
Registration-free COM allows you to use an ActiveX DLL or ActiveX Control in your application without having to register the ActiveX on the end-users machine using regsvr32. It does this by creating a manifest file which if distributed with the executable means that no registration is required. This is only supported in versions of Windows XP and higher and some issues have been reported with XP but there is a hotfix available.
tl;dr: с winxp можно уже не, главное собрать манифест и забандлить его в PE
Важно что технически это было реально. Просто если это появилось в XP, значит привыкли к этому все еще лет через пять после выхода, а в середине нулевых народ уже более интересовался .NET.
А там сборки могли быть в той же самой папке точно, либо в центральном хранилище говна (Global Assembly Cache aka GAC) и пхались туда коммандой regasm
Да, язык похож на Foxpro и dBase (собственно они к одному семейству и относятся).
Clipper мог компилировать экзешник для DOS. Причём компилировал он не в нативный код, а в байткод, но подшивал рантайм к экзешнику, так что конечный пользователь мог и не догадываться, что экзешник создан Клиппером.
Луа умеет т.н. stateless итераторы.
Что это такое?
Большинство ЯПов умеет итераторы, но обычно они хранят внутри себя некое состояние. Языки содержат сахар для дергания итератора за усико, пока тот не вернет null, false, eof или не кинет exception. Сахар обычно представлен как for, но на самом деле там под капотом дераегается какой-то next().
Это значит что итератор внутри себя содержит состояние.
Бывают еще такие итераторы, которые получают колбек, и пинают колбек пока состояние не кончица (в руби они популярны (там через блоки даже коллекции обходят)). В луа они тоже есть, их называют true(истинные) итераторы.
Но не таковы stateless: они делегируют хранение стейта циклу, сахару снаружи, и в lua это рабоатет.
function gen(max, i)
if i > max then
return nil
end
return i + 1
end
for i in gen, 10,1 do
--тут gen это stateless iterator
--1 это изначальное значение ctrl variable (i)
--а 10 это инвариант: по сути конструкция, которая тупо передается в gen. Мы даем ей смысл max, но можем дать любой
print(i)
end
Таким образом "gen" у нас не имеет состояния и может использоваться для одновременной итерации миллионом форов не создавая лишние объекты, экономя память и не напрягая GC.
Хуй, используешь ли ты assert для проверки контрактов функций?
Например в Ruby это считается дурным тоном, в питоне не определились, а вот pil отзывается о таких вещах скорее положительно в том месте, где рассуждает о разнице между возвратом ошибки и, собссно, киданием error.
function enlargeIq(iq)
local iq = tonumber(iq) --делаешь так? или достаточно указать это в доке?
assert(iq and iq > 0, "Iq must be positive")
return iq + 1
end
Сам я с апи не работал, но попробуй через экзикуцию, os.execute(каманда в теминале)
Кстати, lua пока что мне нравится: куда меньше мутных углов чем даже в питоне. Мне кажется идеальный язык для обучения азазазам программированя
Zerobrain studio, можно юзать geany
У винды это дикий анус, хз куда ставит луарокс библы, хз где ищет интерплитатор либы и тд.
Да, Zerobrane забавная, мне понравилась
Почему я могу
?
!
package.cpath = package.cpath.."путь к папке с библами"
require("lib.dll");
У Линукса просто все хорошо с библами и ы одной папке лежат, а у винды хаос длл. По этому возможно из-за этого
Решение с вызовом через ":" тоже офигенное потому что позволяет одну и ту же функцию использовать и как метод и просто как функцию. В джаве так нельзя.
Единственное чего я пока не понял это волшебную силу скобочек при возвращении множества значений из функции
еще пример
тут просто ты в принте присваиваешь в одно значение, и из ретурна соотвественно берется 1 первое значение.
То есть скобками ты ограничил область в 1 переменную.
Блжать банально.
local x,y = (pitux())
print(x,y) --1, nil
Так и не понял чоита? Это та фича когда неопределнно возникает локаль self?
или так
особенно это удобно когда делаешь около ООП
С таблицой тоже так можно
"petux":gsub("x","")?
Насколько я понимаю философию Луа, из коробки в ней ровно то, что можно запилить средствами СТАНДАРТНОЙ сишной либы.
Если сишный rand() на винде говно, значит, в луа он тоже говно.
Если в столь любимой тобой либе сишки нет возможности просмотреть каталог, луа этого тоже из коробки не умеет.
Ах да, вот же.
math.random ([m [, n]])
This function is an interface to the simple pseudo-random generator function rand provided by ANSI C. (No guarantees can be given for its statistical properties.)
да, я это уже понял. Потому она и переносима, что ничего кроме ANSI C там нет.
>>Если сишный rand() на винде говно, значит, в луа он тоже говно.
Внезапно оказалось что rand() на linux ведет себя точно так же, если ему не сделать srand.
Пример выше взят из openbsd: тамошние параноики реализовали rand так, что он дейтсвительно возвращает разные (хотя и псевдослучайные) значения. А на винде и линуксе надо делать srand().
Я обосрался, извините.
>>Если в столь любимой тобой либе сишки нет возможности просмотреть каталог
Ты мне так и не ответил, кстати: как посмотреть каталог в стандартной библиотеке любимого всеми современными программистами JavaScript?
Плюю тебе прямо в харю - тьфу!..
Конечно же ты стертор.
p.s. руки так и чешутся, заколдовать тебя в свинью или старую жабу.
https://ru.wikipedia.org/wiki/Миллиган,_Билли
Это может быть очередная личность, которая не считает себя Стертором, поэтому никогда не признается.
А может быть, наоборот, совершенно левый чувак, который хочет, чтобы мы его считали Стертором, и пишет всякую чушь, пародируя стиль Стертора, чтобы опорочить его имя.
Ага, например ты. Пруфы, покажи нам пруфы!!!
2010-12-19T10:48:07+00:00 некто komprenda изрёк: „Действительно убого желания больше появляться тут у меня нет, это пока други можете себе этот сарафан забрать пароль от него 123456“
Насрал, а потом опубликовал свой пароль, чтобы половина ГК залогинилась в его учётку, чтобы потом сказать, что срал не он, а те, кто подобрал его пароль...
После того случая местная публика стала с недоверием относиться к тем, кто подобным образом расшаривает пароли.
Пороль от этой: 123465
(сам забыл как правильно пишеться, копировал от сюда и долгое время понять не мог почему не заходит)
Прости, ты случайно эмм.. не на PHP пишешь?
Луа для того чтобы встраиваться в системы и быть plumbing code (aka "программирование-в-малом"): он чтобы легко и просто двигать сложные, написанные на сях объекты и вызывать функции. Чтобы скриптоваться внутри, короче.
В отличие от, например, Python, который сделан чтобы ты мог кросс-платформенно легко и просто писать.
Потому у питона есть свои абстракции (ну там например asyncio, которое на каждой ОС реализовано по разному) а в lua такого нет, потому что у lua нет задачи чтобы ты писал один код который везде бы работал макисмально производительно.
Зато lua можно скомпилировать подо что угодно, хоть под OpenVMS, хоть под DOS. Где есть ANSI C -- там есть lua (ну кроме import разишто), а Python придется долго и сложно портировать.
луа умеет хвостовую рекурсию.
MRI обосрамшись
CPython обосрамшись
Ожидаемо обгадился node.js
И только lua вертит этот код уже битый час
азахаха
Так нахуя его учить?..
https://yandex.ru/search/?text=lua+malware
https://www.google.com/search?q=lua+malware
Как минимум обнаруживаются Shishiga и LuaBot.
Под винду на VB писать сложнее потому что он копилица в PCode и требуе рантайма для запуску
Но на VBS вполне могли написать говно для IE (хотя VBScript не совсем basic, вкак и VB).
Наконец, на VBA (тот же VB но внутри офиса) могли написать довольно много говна
Нет. Нужно ставить "Visual Basic 6.0: Run-Time Redistribution Pack" ну или бандлить его.
Кроме того если ты собираешься встраивать свой вирь в .exe файл то довольно очевидно что он не должен требовать рантайм.
>> так и в нативе,
Внезапно ты оказался прав (и такое бывает!) но рантайм все равно нужен. Ты будешь рантайм вместе с вирем дистрибить?
>>Бейсик компилит как в псевдокод, так и в нативе
>> можно тупо дёргать RTLMoveMemory.
Расскажи мне, о мудрый ослолюб, в каком месте MS-DOS я могу найти функцию RTLMoveMemory?
зы: ладно, ты все таки чуть-чуть прав, но я тоже
Though VB programs can be compiled into native code executables from version 5 on (до этого не могли!!!), they still require the presence of around 1 MB of runtime libraries. Core runtime libraries are included by default in Windows 2000 and later (радуйся!!), but extended runtime components still have to be installed (ахахахаха!). Earlier versions of Windows (95/98/NT), require that the runtime libraries be distributed with the executabl (так-то!)
Там не было никаких функций ни для чего.
Справедливости говоря C тоже нужен рантайм VCRT чтобы работал всякий memcpy.
Но его вопервых можно статически линкануть (а в VB можно??) во-вторых если сидеть на чистом win32API (HeapAlloc вместо malloc) но он как-бы и не нужен
Можно.
Пушо скомпилированный нативно и слинкованный статичеси с рантаймом код на VB не хуже кода на сях (хоть и больше) для написания вирей
правда я ХЗ чо там было с управлением памятью. Щетчик сцылок?
>> Там не было никаких функций ни для чего.
Quick Basic позволял прилинковывать библиотеки, написанные на других языках, если они соблюдали коллконвеншен. К полному Quick Basic (не QBASIC 1.0 из MS-DOS) прилагались библиотеки для вызова прерываний DOS и BIOS.
Впрочем, вероятно можно было линкануть нормальную либу с memmove чтобы не пикать и не покать
В DDK макрос.
RtlMoveMemory macro
https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/nf-wdm-rtlmovememory
>>побайтное копирование с инкрементом "опасного" указателя
из рантаймахахахах
wdm.h:
зы: как реализован memmove я хз, вероятнее всего как ты, борманд, и говоришь: инкремент указателя
Придите к общему соглашению, а я погожу...
Первая попавшаяся программа на VB обычно падает, потому что не зарегистрирован какой-нибудь OCX-компонент. Т. е. нужно ещё писать так, чтобы не использовать всякое говно, не входящее в рантайм.
Первая попавшаяся программа на VB обычно падает, потому что не зарегистрирован какой-нибудь OCX-компонент. Т. е. нужно ещё писать так, чтобы не использовать всякое говно, не входящее в рантайм.
Ну про рантайму я там уже выше вику цитнул: с пятерки начали бандлить core в w2k. Но extended все равно не было: только core и только nt-based (в 9x не было)
Ох, какая ересь!.. 😉
Registration-free COM allows you to use an ActiveX DLL or ActiveX Control in your application without having to register the ActiveX on the end-users machine using regsvr32. It does this by creating a manifest file which if distributed with the executable means that no registration is required. This is only supported in versions of Windows XP and higher and some issues have been reported with XP but there is a hotfix available.
tl;dr: с winxp можно уже не, главное собрать манифест и забандлить его в PE
Сколько программистов так делали?
Важно что технически это было реально. Просто если это появилось в XP, значит привыкли к этому все еще лет через пять после выхода, а в середине нулевых народ уже более интересовался .NET.
А там сборки могли быть в той же самой папке точно, либо в центральном хранилище говна (Global Assembly Cache aka GAC) и пхались туда коммандой regasm
Clipper мог компилировать экзешник для DOS. Причём компилировал он не в нативный код, а в байткод, но подшивал рантайм к экзешнику, так что конечный пользователь мог и не догадываться, что экзешник создан Клиппером.
Ну примерно так работают всякие .NET .exeшники, думаю и все утилиты коие умеют делать .exe из python тоже так рабюотают
Что это такое?
Большинство ЯПов умеет итераторы, но обычно они хранят внутри себя некое состояние. Языки содержат сахар для дергания итератора за усико, пока тот не вернет null, false, eof или не кинет exception. Сахар обычно представлен как for, но на самом деле там под капотом дераегается какой-то next().
Это значит что итератор внутри себя содержит состояние.
Бывают еще такие итераторы, которые получают колбек, и пинают колбек пока состояние не кончица (в руби они популярны (там через блоки даже коллекции обходят)). В луа они тоже есть, их называют true(истинные) итераторы.
Но не таковы stateless: они делегируют хранение стейта циклу, сахару снаружи, и в lua это рабоатет.
Таким образом "gen" у нас не имеет состояния и может использоваться для одновременной итерации миллионом форов не создавая лишние объекты, экономя память и не напрягая GC.
А в вашем языке так можно?
Например в Ruby это считается дурным тоном, в питоне не определились, а вот pil отзывается о таких вещах скорее положительно в том месте, где рассуждает о разнице между возвратом ошибки и, собссно, киданием error.
#динамопитухпроблемы