1. Lua / Говнокод #24440

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    c:\Program Files (x86)\Lua\5.1>lua.exe c:\temp\1.lua
    0.0012512588885159
    
    c:\Program Files (x86)\Lua\5.1>lua.exe c:\temp\1.lua
    0.0012512588885159
    
    c:\Program Files (x86)\Lua\5.1>lua.exe c:\temp\1.lua
    0.0012512588885159
    
    c:\Program Files (x86)\Lua\5.1>lua.exe c:\temp\1.lua
    0.0012512588885159
    
    c:\Program Files (x86)\Lua\5.1>type c:\temp\1.lua
    print(math.random() )

    Луа под виндой как-то отчаянно сосет хуй не умея настоящие random из Windows Crypto API.
    В результате вызов 150 раз программы дает один и тот же random. Его конечно можно math.randomseed(os.time()), но то так, бо time это даже не милисекунды а сеунды.

    Забавно что под никсами все зробит как треьба

    :1$ lua51 1.lua
    0.31260803123592
    :2$ lua51 1.lua
    0.13656691980388
    :3$ lua51 1.lua
    0.56430453367732


    думаю оно читает /dev/random

    Золотой хуй, что это такое? Или Сёма прав и прыщелуа не умеет в winapi?

    Запостил: roskomgovno, 04 Июля 2018

    Комментарии (116) RSS

    • #lua
      Ответить
    • Все просто, луа вообще ни с чем работать не может. Так как чистая луашка предполагает все необходимое имено работы с луа (ну немного с файлами, но и то с проблемами).
      Сам я с апи не работал, но попробуй через экзикуцию, os.execute(каманда в теминале)
      Ответить
      • Да, я уже понял что проблема с rand(), причем и на линуксе тоже. Ну то-есть это даже проблема со стандартом)

        Кстати, lua пока что мне нравится: куда меньше мутных углов чем даже в питоне. Мне кажется идеальный язык для обучения азазазам программированя
        Ответить
        • У меня есть дружок, он кодит на с++. Так вот, однажды он прознал про луа и тоже захотел попробовать в него и встроить. У него дико бомбило что этот язык для него через чур абстрактен., когда плюсы для него очевидны и понятны.
          Ответить
          • ну так скриптовый язык таким и должен быть: его же для того и встраивают что бы не думать как там байтики в памяти выравниваются
            Ответить
          • хуй, ты пишешь в SciTE или используешь какой-то другой ide?
            Ответить
            • Scite умир же
              Zerobrain studio, можно юзать geany
              Ответить
            • На линьке zerobrain studio и совмесно с луабиблорепозиторием luarocks вообще бомбезное сочитание, установил, поставил библы и заебись, вообще ничо делать не надо.
              У винды это дикий анус, хз куда ставит луарокс библы, хз где ищет интерплитатор либы и тд.
              Ответить
            • Zerobrane studio, все время непраильно писал. Я просто иконку сматрб там робот и шистеренка как мозг вот и писал брайн
              Ответить
              • zerobrain это IDE для PHP скорее

                Да, Zerobrane забавная, мне понравилась
                Ответить
      • Послушай, почему оператор ":" не работает с литералами?

        Почему я могу
        str = "Today is %s"
        str:format(os.time())
        
        --но не могу
        "Today is %s":format(os.time())

        ?
        Ответить
    • Можешь попробывать сам подгрузить библу
      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?
          Ответить
          • да, именно.

            foo = "foo"
            print(string.len(foo)) --будет 3
            print(foo:len()) --а можно так
            Ответить
            • petux = {1}
              function petux:print()
              print(self[1])
              end
              petux:print() -- 1

              или так
              petux = {1,
              print=function(a)
              print(a[1])
              end}
              petux:print() -- 1

              особенно это удобно когда делаешь около ООП
              Ответить
            • И зачем себя так утруждать пися длинное string.len() когда есть #
              print(#"petux")

              С таблицой тоже так можно
              print(#{1,2,3})
              Ответить
        • Или ты про
          "petux":gsub("x","")?
          Ответить
    • > прыщелуа не умеет в winapi?

      Насколько я понимаю философию Луа, из коробки в ней ровно то, что можно запилить средствами СТАНДАРТНОЙ сишной либы.

      Если сишный 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?
        Ответить
    • Неужели ты настолько убог и ничтожен, что юзаешь хуелуа []в своих извращениях[/s]?
      Плюю тебе прямо в харю - тьфу!..
      Ответить
    • ХАХаххХАХАХХАхХААХАХАХАХ
      Пороль от этой: 123465
      Ответить
    • показать все, что скрытоПоэтому я за "PHP".
      Ответить
      • показать все, что скрытоДве бляди, поставившие мне по минусу, приходятся друг другу любовниками, чьи плечи и шеи усеяны мощными бордовыми засосами и кровавыми укусами, чей верхний ящик комода вот-вот треснет от сотен тюбиков с лубрикантами, коими он забит до отказа, не уступая и нижнему, преисполненному распакованными для экономии места ребристыми презервативами, и чей домашний кинотеатр повидал сотни часов камерунского порно.
        Ответить
      • Надеюсь, меня простят за то, что я въебал тебе плюс. Просто у меня паркинсон.
        Ответить
      • То-есть ты после всего что сказали тут я, Роман и Хуй все еще не понял в чем тут дело?

        Прости, ты случайно эмм.. не на PHP пишешь?
        Ответить
        • Что я должен был понять, кисуль?
          Ответить
          • кисуль камерунский у тебя за щекой, а с луа ситуация вот какая:

            Луа для того чтобы встраиваться в системы и быть plumbing code (aka "программирование-в-малом"): он чтобы легко и просто двигать сложные, написанные на сях объекты и вызывать функции. Чтобы скриптоваться внутри, короче.

            В отличие от, например, Python, который сделан чтобы ты мог кросс-платформенно легко и просто писать.
            Потому у питона есть свои абстракции (ну там например asyncio, которое на каждой ОС реализовано по разному) а в lua такого нет, потому что у lua нет задачи чтобы ты писал один код который везде бы работал макисмально производительно.

            Зато lua можно скомпилировать подо что угодно, хоть под OpenVMS, хоть под DOS. Где есть ANSI C -- там есть lua (ну кроме import разишто), а Python придется долго и сложно портировать.
            Ответить
    • ого!
      луа умеет хвостовую рекурсию.

      MRI обосрамшись
      def foo
      	foo #  `foo': stack level too deep (SystemStackError)
      end
      
      foo


      CPython обосрамшись
      def foo():
          return foo() # RuntimeError: maximum recursion depth exceeded
      
      foo()


      Ожидаемо обгадился node.js
      function foo() {
      	return foo(); // RangeError: Maximum call stack size exceeded
      }
      foo();


      И только lua вертит этот код уже битый час
      function foo()
      	return foo()
      end
      
      foo()

      азахаха
      Ответить
      • Бля, на луе пишут малуаре? Нет.
        Так нахуя его учить?..
        Ответить
        • Я лунная принцеска и пишу на нем свои мемуары. Пошел нахуй
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • скоро малуаре уже будут писать на бейсике.
            Ответить
            • показать все, что скрытоvanished
              Ответить
            • Бейсиков много разных, есть годные вполне. Даже на VBScript малварь встречалась мне.
              Ответить
            • под дос вполне могли писать на BASIC если там был PEEK и POKE.

              Под винду на VB писать сложнее потому что он копилица в PCode и требуе рантайма для запуску
              Но на VBS вполне могли написать говно для IE (хотя VBScript не совсем basic, вкак и VB).
              Наконец, на VBA (тот же VB но внутри офиса) могли написать довольно много говна
              Ответить
              • показать все, что скрытоvanished
                Ответить
              • Бейсик компилит как в псевдокод, так и в нативе, так что хуйню ты сморозил. Но этим высером твоя ересь не исчерпывается. Рантайм по умолчанию идёт абсолютно во все поставки винды, так что ты опять обосрался. Ну и наконец в третьих, Пик и Поук не нужны нахуй; всли в этом убожестве поинтеры не разыменовываются (т.е. возможность побайтного копирования практически исключена), можно тупо дёргать 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 и я признаю что обосрался
                          Пушо скомпилированный нативно и слинкованный статичеси с рантаймом код на VB не хуже кода на сях (хоть и больше) для написания вирей

                          правда я ХЗ чо там было с управлением памятью. Щетчик сцылок?
                          Ответить
                          • Лень документацию шнырять, я давно уже вырос из васика. Но статика там точно была, хоть и с извращениями и ёблей с линкером. Я всегда был против извращений, поэтому опускал такие тонкости.
                            Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • но макроса RTLMoveMemory там все равно не было, правда?

                          Впрочем, вероятно можно было линкануть нормальную либу с memmove чтобы не пикать и не покать
                          Ответить
                          • Это же ни хуя не макрос. 100% что под капотом - тупо побайтное копирование с инкрементом "опасного" указателя. В бейсике это нереально сделать, т.к. указателей нет в принципе - разыменовывать нечего. Всё что только можно кастуется в Лонг
                            Ответить
                            • >>Это же ни хуя не макрос.

                              В DDK макрос.

                              RtlMoveMemory macro
                              https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/nf-wdm-rtlmovememory

                              >>побайтное копирование с инкрементом "опасного" указателя
                              из рантаймахахахах

                              wdm.h:
                              #define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))


                              зы: как реализован memmove я хз, вероятнее всего как ты, борманд, и говоришь: инкремент указателя
                              Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • Мне кажется что если и OCX (и вообще любой COM) лежал в той же самой папке то его можно было не regsrv32ить, но могу ошибаться.

                      Ну про рантайму я там уже выше вику цитнул: с пятерки начали бандлить core в w2k. Но extended все равно не было: только core и только nt-based (в 9x не было)
                      Ответить
                      • Мне кажется что если и OCX (и вообще любой COM) лежал в той же самой папке то его можно было не regsrv32ить, но могу ошибаться.

                        Ох, какая ересь!.. ;-)
                        Ответить
                        • э, нет. Ересь у тебя за щекой.

                          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
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • Ну блин, Сёма, сколько-то дело.

                              Важно что технически это было реально. Просто если это появилось в XP, значит привыкли к этому все еще лет через пять после выхода, а в середине нулевых народ уже более интересовался .NET.

                              А там сборки могли быть в той же самой папке точно, либо в центральном хранилище говна (Global Assembly Cache aka GAC) и пхались туда коммандой regasm
                              Ответить
                  • показать все, что скрытоvanished
                    Ответить
                • показать все, что скрытоСладкий багорчик )
                  Ответить
              • показать все, что скрытоvanished
                Ответить
                • это такая RAD с СУБД, да? Типа Foxpro или Access?
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • как это работало? Рантайм запускался, считывал байткод из .exeшника и работал?

                      Ну примерно так работают всякие .NET .exeшники, думаю и все утилиты коие умеют делать .exe из python тоже так рабюотают
                      Ответить
    • Луа умеет т.н. 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


      #динамопитухпроблемы
      Ответить

    Добавить комментарий