"PHP" / Говнокод #26827 Ссылка на оригинал

0

  1. 1
Именно поэтому я за «PHP».

Запостил: gostinho gostinho, (Updated )

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

    • Шел 2020-й год, на конференции ПХП можно было узнать

      -- Зачем нужны ORM?
      -- ActiveRecord vs DataMapper.
      -- И одной из метрик автоматического тестирования является Code Coverage



      Хотелось бы еще послушать таких докладов:
      * Структурное программирование -- ключ к улучшению кода
      * ООП: инновационный подход 21-го века
      * SQL инъекции: как избежать?
      Ответить
    • Haxep давно так умеет. Собственно он и интересен тем, что может компилироваться в разные языки. Можно, например, компилировать в «PHP» и в «JS», когда код фронтенда и бекенда частично дублируется.

      Мы тут ещё недавно обсуждали «Zephir» — пыхоподобный язык программирования, предназначенный исключительно для написания расширений для «PHP». Оказалось, что у зефира привкус «PHP» или даже «JS» (неожиданно, правда?):
      https://govnokod.ru/26733
      Ответить
      • Веб -- какашка, но возможность писать фронт и бек на одном языке делает её чуть менее какашкой.

        Я реально знаю кейсы, когда логика валидации написана два раза: на JS и на беке (и иногда еще на уровне ограничений в базе, лол).

        Это отвратительно!

        Вообще самая постыдная для программиста задача, это два раза писать одну и ту же логику в двух местах на разных языках
        Ответить
        • именно поэтому я за «вся логика исключительно на сервере»
          Ответить
  • Как в «PHP» реализовано прерывание программы по таймауту? Например, выполняется сортировка большого массива - это по идее одна сишная функция, и где-то на середине нужно прервать. Что делать?
    Ответить
    • Отдельный проверяющий тред, выполняющий exit() по истечении тридцати секунд?
      Ответить
    • разбей массив на 4 равные части, и сортируй каждую отдельно
      перед запуском следующей части проверяй флаг
      Ответить
      • Я тут при чем? Я спрашиваю как «PHP» это делает.
        Кстати, видел в одном C# реальном проекте, где посреди логики в цикле for было что-то типа
        if (i % 10000 == 0) {
            Application.ProcessEventLoop();
        }

        Чтобы UI не зависало. Какой багор )))
        Ответить
        • Нормальная история.

          Типа решаем систему дифференциальных уравнений на главном потоке и иногда даём остальному приложению подышать?
          Ответить
        • а, я тебя понял.

          Так таймер небось ставит, и получает сигнал (на юниксе) или APC (на пинде)?

          >Чтобы UI не зависало. Какой багор )))
          Багор действительно. Я видел как патчат обработку евентов чтобы делать модальный диалог, но это кал
          Лучше такие задачи выносить на другой тред, и использовать что-то типа async/await (в решеточке оно есть)
          Ответить
          • Жопа в том, что решений у этой задачи нет. Нельзя прервать тред в произвольном месте внутри цикла. Это undefined behavior. После этого может аллокатор сдохнуть, лочка какая-нибудь залипнет или что-нибудь ещё отвалится.

            Либо ты пытаешься тормознуть прогу на обращениях к ядру и получить ошибку (тот самый APC в винде или EINTR в линуксе). Либо ты какой-то флажок для треда выставляешь и ждёшь пока он сам съебёт. Либо ты убиваешь весь процесс нахуй.

            Даже в джаве и шарпе вроде как interrupted exception в произвольный момент не вбросить.
            Ответить
            • Это правда: между двумя случайными инструкциями нельзя влазить, особенно если они в критической секции.

              Как же делает пых?
              Ответить
              • Убивает дочерний процесс по таймеру да и всё? Ну или в интерпретатор периодическая проверка какого-то флажка вшита.
                Ответить
                • Я не очень в пыховую модель процессов: там разве реально оддельный процесс будет?

                  Я думал, там N потоков, каждый сосет из очереди запросы и обрабатывает
                  Ответить
                  • Х.з., я почему-то всегда думал, что там N процессов. Апач же спавнил кучу воркеров.
                    Ответить
                    • Могу ошибаться, но кажется что воркер все равно переиспользуется: и мрет только после max request per child.
                      Иначе чем это лучше CGI?

                      Но вообще похуй на паче

                      Получается что нужно или каждый запрос в отдельном процессе, или есть опасность налажать? Или пых в любой операции проверяет переодически, что 30 сек прошло?
                      Ответить
                  • там только-только начали потоки завозить, и я бы от них бежал, если честно
                    Ответить
              • А пыху какая разница? Он же просто убивает процесс/поток (хуй знает, в чём оно там исполняется) и всё.
                Ответить
                    • TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination.
                      Ответить
                      • Ну флажок чекай. Я думаю пых так и делает, он же интерпретатор, ему можно. Вряд ли он по таймауту в сишной функции может что-то убить кроме всего процесса.
                        Ответить
                        • Скажешь, нельзя написать такой код на пыхе, который будет не убить безопасно?
                          Ответить
                          • Если в сишном экстеншене повиснет - скорее всего весь воркер на помойку отправится. Ну я не вижу других вариантов в этом случае.
                            Ответить
                        • Испортив тебе рантайм же, не?
                          Объект какой-нить не осовободица
                          Ответить
                          • Ну не синхронизируй этот поток, какая разница. И проверь заодно, что он опасных функций из kernel32 не зовёт.
                            Ответить
                            • > опасных функций

                              Не аллоцирует память, не ходит в сеть, не берёт лочки, не трогает глобальный стейт. Нахуй он тогда нужен то? Тупо матан какой-то на приватной структуре?
                              Ответить
                              • Ну, в теории ресурсы ему можно выделять перед запуском, и выделять дополнительные по мере необходимости (через какую-нибудь lock-free поебень). А ещё можно останавливать поток и смотреть, что он в данный момент делает.

                                Но, конечно, «PHP» для этого слишком глуп.
                                Ответить
                                • > lock-free поебень

                                  А вот кстати я не уверен что среднестатистическая lock-free поебень готова к крашу участников...
                                  Ответить
                            • стоп)

                              Смотри. Я пыхарь. Я написал какой-то код. Этот какой-то код должен помереть через 30 секунд. Чтобы он ни делал.

                              Пых ставит таймер в линксе или APC в винде или просто на другом потоке поджыдает, а потом делает ``pthread_kill`` или ``TerminateThread``

                              Вопрос: как пых знает, что он не сломает рантайм? Он всегда весь код делает безопасным?
                              Ответить
                              • Доку ниже кинул. Пых меряет только время работы интерпретатора. А как на винде сделали — хуй знает.
                                Ответить
                              • А что, если дочерний процесс будет время от времени сигналить в родительский о том, сколько он уже крутится и какие ресурсы выделил?
                                Ответить
                                • Если дочерний процесс есть, то проще его целиком и кильнуть по таймауту.
                                  Ответить
                  • Ну такой то можно убить, он пустой и никуда не лезет.
                    Ответить
              • https://www.php.net/manual/ru/function.set-time-limit.php
                Функция set_time_limit() и директива max_execution_time влияют
                на время выполнения только самого скрипта. Время, затраченное
                на различные действия вне скрипта, такие как системные вызовы
                функции system(), потоковые операции, запросы к базам данных
                и т.п. не включаются в расчет времени выполнения скрипта.
                Это не относится к системам Windows, где расчитывается абсолютное
                время выполнения.
                Ответить
                • понятно

                  то-есть если я вошел в syscall, и провёл там 3 часа, то я сам себе злобный бртн

                  Как на винде -- интересно, да
                  Хотя нет, не интересно. Это же пых
                  Ответить
                  • > то-есть если я вошел в syscall, и провёл там 3 часа, то я сам себе злобный бртн
                    Угу. В таком случае, скорее всего, «Апач» просто убьёт воркера, как Борманд выше написал.
                    Ответить
                • то есть на винде оно меряет одно, а на никсах другое? как прекрасно )))
                  Ответить
          • Короче из того что пока нашёл - да, он взводит таймер через setitimer и ждёт сигнала. А потом вызывает какой-то обработчик.

            З.Ы. А в обработчике ставится бит PHP_CONNECTION_TIMEOUT в connection_status, который проверяется в куче мест и ты даже видишь его из пыхи.
            Ответить
            • SIGALRM кстати же на случайном треде вызовеца?

              > который проверяется в куче мест
              Ну то-есть всё таки всё сводится опять к банальному

              while(! terminate) {
              ///
              }
              Ответить
              • Ну там таймер ещё раз запускается с hard timeout после обычного таймаута. Судя по всему 2 секунды скрипту даётся чтобы сдохнуть добровольно. А потом exit.
                Ответить
                • Вопрос: а почему ОС умеет почистить всё за процессом, но не за потоком?
                  Если процесс взял мутекс и умер, то мутекс освободили
                  А если поток, то нет?
                  Ответить
                  • Потому что процесс дохнет весь к хуям вместе с хендлами и памятью. Ну с shared memory разве что кого-то может зацепить.

                    А у треда почти всё расшарено с другими тредами. Там вообще не понятно что чистить, ибо большая часть объектов принадлежит процессу в целом.

                    Виндовый кросс-процессный мутекс то уйдёт в абандон, ок. И все кто его ждал получат ошибку соответствующую. А дальше то что делать? Данные то запороты, тебе хочется их чинить?

                    А быстрые мутексы типа позиксовых толком и не отпустишь, емнип. Они для ядра вообще не объекты.
                    Ответить
        • > Application.ProcessEventLoop();

          > Чтобы UI не зависало. Какой багор )))

          Это наследие VB.

          Там это же самое делалось DoEvents.
          Ответить
            • >Недокооперативная

              Сейчас все пищат от async: той же самой кооперативной, просто с сахаром
              Ответить
              • Ну async всё-таки получше чем эти залупы посреди кода.
                Ответить
                • Конечно лучше, потому что с сахаром.
                  Но кто, скажите мне, не наябывался пися случайно в асинхронной процедуре sleep вместо delay и не вызывал оттуда случайно блокирующий синхронный IO?
                  Ответить
                • А как имеено работает этот async? Одинаковая ли его семантика в разных языках?

                  Я как-то прошёл мимо современных тенденций многопоточности.
                  Ответить
                  • Более-ли-менее похожая везде.

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

                    Псевдокот
                    async fun foo() {
                      print("hello");
                      delay(1000); //тред уходит из функции, и не зайдет в нее пока не пройдет секунда
                      print(2); //тред вернулся
                      page = getHttpPage("http://ya.ru"); //Посылается запрос по сети асинхронно, когда будет результат -- тред вернется в это место с результатом
                    }


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

                      Иам внутри вмонтирован тред-пул и тред пока async ждёт может заниматься другими делами?

                      На delay тоже async нужно ставить?

                      PS: и await не вижу.
                      Ответить
                      • Да, именно это он и делает.

                        Когда ты пишешь "delay(1000)" ты не останавлиааешь тред с точки зрения OS, а ты как-бы выходишь из функции, но сохраняешь ее контекст

                        Тред обрабатывает другие функции.

                        Представь, что тебе нужно в GUI треде каждую секунду менять цвет кнопки.

                        Ты не можешь сделать Thread.sleep, потому что остановка GUI треда на секунду это зависание UI, так?

                        А delay можешь сделать.

                        Но если ты случайно напишешь sleep, то всё сломаешь

                        >PS: и await не вижу.

                        Вероятно, должно быть так
                        await page = getHttpPage("http://ya.ru");

                        Это был псевдокот. Живые примеры есть в C#, Kotlin coroutines, python и вроде в свежем JS
                        Ответить
                        • >а ты как-бы выходишь из функции, но сохраняешь ее контекст

                          Да, я понял. Тред идёт заниматься другими делами. Типа легковесная многозадачность.

                          >Тред обрабатывает другие функции
                          А что будет если пул занят другими функциями и они бобровольно не возвращают потоки?
                          Не зависнет ли мой поток с delay(1000), на неопределённое время?
                          Ответить
                          • Со sleep(1000) зависнет и заблочит все остальные таски.
                            Ответить
                            • А если я отдал поток на секундочку, малознакомому дяде в кепке и трениках, чисто подержать.

                              И поток у меня отжали для каких-то тяжёлых вычислений. Его же мне вернут не через секунду, а после окончания расчёта?
                              Ответить
                              • Разумеется.

                                sleep -- именно такой дядя в кепке

                                Не давай свой поток кому попало. Stranger -- danger.

                                по сути весь блокирующий API придется переписать на async
                                Ответить
                                • Так нет. Он не блокирующий в смысле IO. Он не ждёт просто что-то долго считает, типа брутфорсит делитель для RSA.

                                  Пример: есть старое-доброе winapi приложение. Одна часть считает сложную ма-тема-тику, вторая перерисовывает окно.

                                  Если сложный расчёт выполняется долго, окно «подвисает».

                                  Выход: в сложном расчёте нужны DispatchMessage/DoEvents. Опять та же питушня.
                                  Ответить
                                  • Сложный расчёт ты кидаешь в отдельный поток и пусть он там считает сколько ему надо. А при забрасывании его в поток ты получаешь future на которой ты делаешь await. И гуёвый тред отпускает на время расчёта.
                                    Ответить
                                    • >Сложный расчёт ты кидаешь в отдельный поток и пусть он там считает сколько ему надо.

                                      Как мне в этой парадигме управлять разными пулами?
                                      Я думал await использует какой-то один неявный системный пул, как в крестах std::launch::async.
                                      Ответить
                                      • await - это просто няшный способ подписаться на результат асинхронной операции. Ему совершенно похуй на каких тредах эта самая операция крутится и крутится ли вообще.
                                        Ответить
                                  • Да, ты прав

                                    Ну чудес не бывает же: async спассет от медленного IO, но не от нагрузки на CPU.

                                    Опять таки, если ты сделаешь while(1){}, то всё зависнет же

                                    ну либо нагрузку на CPU надо делать асинхронной тоже

                                    await doAll()
                                    Ответить
                                  • Два треда ж просто.

                                    Я не знаю, как там в шарпе.

                                    В Свифте делаешь отдельную DispatchQueue или вообще берёшь готовую и херячишь на ней тяжёлую работу, потом результат для отрисовки бросаешь на main, которая отвечает за UI.

                                    Управление пулом потоков спрятано под капот.
                                    Ответить
                                    • Кстати, а как поживает Grand Central Dispatch или как он там назывался в яблоке? Он вроде делал умный пул по размеру ядер.. Он еще используется?
                                      Ответить
                                      • Так я про него и написал, в принципе.

                                        Используется, конечно.
                                        Ответить
                                      • Не очень понял вопрос.

                                        В Свифте нет async/await.

                                        В Шарпе нет очередей (?)
                                        Ответить
                                        • В коко ты запускаешь корутину на контексте, там есть контекст IO, где явно сказано, что там тред

                                          В .NET создается WorkerThread, проверь
                                          https://i.postimg.cc/6Qr0WjJL/waiter.png
                                          Ответить
                                        • >В Шарпе нет очередей (?)

                                          Думаю в реализации await очередь должна быть непременно. Причём блокирующая.

                                          Иначе поток обрабатывающий питухов, просто уйдёт в busy wait. Если они все вдруг решать ждать и dispatch loop останется без работы.
                                          Ответить
                                          • Кажется что это ничем не отличается от любого лупа, который насасывает какие-то события.

                                            EDT в жабе, WinProc, упоминаемый сегодня гостом итд.
                                            Так что да, внутри оно обрабатывает все события, и вероятно засыпает
                                            Ответить
                                            • >Так что да, внутри оно обрабатывает все события, и вероятно засыпает

                                              Просто я в своё время насмотрелся на самопальное говнище с busy wait.
                                              — Почему программа стабильно грузит одно ядро на 100%?
                                              — Ну кто ж мог подумать, что таски кончатся?
                                              Ответить
                                              • >самопальное говнище с busy wait.
                                                Особенно на ноутах хорошо работает, где народ за батарейку волнуется
                                                Ответить
                                          • насколько помню, там для текущего контекста есть свой TaskExecutor (по умолчанию дефолтный), в который будет падать весь асинк
                                            Ответить
                                      • > указание очередей

                                        Очередь ты можешь указать когда асинхронную таску спавнишь. А await просто будет ждать когда она завершится, ему похуй на очереди. Т.е. это 2 ортогональных сущности.
                                        Ответить
                                        • Подтверждаю

                                          await просто ждет Taskу
                                          Ответить
                                        • >Очередь ты можешь указать когда асинхронную таску спавнишь.

                                          Как?
                                          Ответить
                                          • Да хрен знает, я сварщик не настоящий )))

                                            Какой-нибудь var res = await pool.execute(LongCalculation);
                                            Ответить
                                            • Именно по этому я за ко
                                              suspend fun fetchDocs() {                             // Dispatchers.Main
                                                  val result = get("https://developer.android.com") // Dispatchers.IO for `get`
                                                  show(result)                                      // Dispatchers.Main
                                              }
                                              
                                              suspend fun get(url: String) = withContext(Dispatchers.IO) { /* ... */ }


                                              suspend значит "async".

                                              Dispatchers.IO значит "фоновый тред"
                                              Есть еще Dispatchers.UI
                                              Ответить
                                              • То ли дело жс, где один поток и никто такой фигнёй не забивает себе голову.
                                                Ответить
                                                • Ну тут вроде эти коллбеки могут зваться либо прям на том треде где асинхронная таска закончилась либо в ui треде - таска по завершению закьюит коллбек туда. Какой-то флажок даже куда-то передать можно было чтобы выбрать режим...

                                                  По дефолту вроде через ui тред чтобы меньше ебли было.

                                                  Но я сварщик не настоящий.
                                                  Ответить
                                                  • вот тут писют
                                                    https://arghya.xyz/articles/async-await/

                                                    что для CPU bound вероятнее всего возьмут тред из пула
                                                    А для IO могут и не взять, ну анверное потому, что асинхролнный API реализует сама OS (через комплишен порт какой-нить)

                                                    Но это не точно
                                                    Ответить
                                                    • >А для IO могут и не взять, ну анверное потому, что асинхролнный API реализует сама OS

                                                      Как-то сложно всё получается. Пулы, треды, корутины, IO, очереди какие-то.

                                                      Голова пухнет.

                                                      Взять всё, да и assParallelнуть…
                                                      Ответить
                                                      • Ну ты не должен про это думать.

                                                        Разве что в UI тебе важно ходить из правильного места, а так-то тебе срать на тред

                                                        Где вызвали -- там и вызвали
                                                        Ответить
                                                      • Короче дочитал как это работает.

                                                        У тредов на которые можно захуйнуть коллбек может быть SynchronizationContext. В частности у UI треда он всегда есть.

                                                        И по-умолчанию все работает тупо и понятно - если у текущего треда контекст есть перед вызовом await, то продолжение будет в том же контексте. Т.е. если ты писал обработчик для гуйни и ушел в await то код потом "возобновится" в ui треде и все безопасно. Если же контекста нету - то прям на том треде где таска завершилась.

                                                        Ну и можно сказать await something.ConfigureAwait(false) и сделать вид что контекста у тебя не было.
                                                        Ответить
                                                        • ну короче так же примерно, как в коко

                                                          если тебе не похуй где вызываться -- укажи контекст, если похуй, то уж как бог пошлет.

                                                          Тащемто мыслить надо не в терминах нитей, а в терминах контекст

                                                          Хочу UI контекст, или еще какой
                                                          Ответить
                          • Зависнет.

                            И если ты вместо асинхронного API для работы с IO возьмешь синхронный -- тоже зависнет.

                            Нужно быть аккуратным.

                            Это напоминает кооперативную многозадачность: каждая корутина отвественна за всю систему
                            Ответить
                          • delay(1000) на самом деле говорит, что управление вернется не раньше, чем через 1000 миллисекунд, если никто к этому моменту не освободится, то и управление не будет получено
                            Ответить
                      • Если мы говорим про C#, то надо ставить await на те методы, которые помечены, как async.

                        Если переписать на колбек, то тогда придётся делать мутекс. А с async'ом не надо.

                        Если же интересует вопрос, как задачи квантуются внутри лупа (а луп крутится внутри одного потока), то меня тоже интересует 🙂
                        Ответить
                        • >Если же интересует вопрос, как задачи квантуются внутри лупа (а луп крутится внутри одного потока)

                          Да. Непонятна точная механика шедулинга.
                          Ответить
                          • > точная механика шедулинга

                            А её и нет вроде. Это просто сахар для хуйни-на-коллбеках. Шедулинг точно такой же, как и у любой другой хуйни на коллбеках - очередь да разгребающий её ивентлуп.

                            Просто конпелятор за тебя нарубает красивый линейный код на уёбищные коллбеки. И помогает стейт протащить. Всё.

                            Там вроде даже вручную эти кишки можно дёргать без сахара.
                            Ответить
                            • Я просто не могу понять, откуда столько хайпа.

                              Вот и думаю: или оно до горя тупое, или я что-то не понимаю.
                              Ответить
                              • Да там всё просто.

                                Асинхронная операция возвращает тебе future. Когда ты делаешь на ней await твоя async функция тупо возвращает управление. Но перед этим она подписывает следующий свой фрагмент на завершение этого future.

                                Вот и всё 🙂

                                Ты можешь все это делать руками без async/await. Все кишки доступны.
                                Ответить
                                • Ну я понял.

                                  Всё-таки на Сишке такое хрен в чистом виде не нахуевертишь.
                                  Да и в других языках тоже. Из-за того что нужно прыгать на указатель внутри функции.

                                  Разве что запускать все потоки в одном общем пуле с work stealing.
                                  Ответить
                                  • Ну дык и в шарпе не нахуевертишь. Тут же специальная магия конпелятора, которая тело функции нарубает на фрагменты после каждого await и локалки выносит в контекст. Собственно поэтому они и помечены async. «Впрыгивание в середину» тут чисто логическое, физически каждый фрагмент - это отдельный коллбек.
                                    Ответить
                                    • в питухоне была такая тема -- елда**
                                      Она там для генератора изначально, но потом ее и для асинхронности пытались прикрутить

                                      Она позволяла как раз уйти из функции, а потом вернуться с сохранением контекста

                                      Почему-то мне хочется прикрутить суда понятие континуейшена, но вероятно зря

                                      **yield
                                      Ответить
                                      • Дык async/await - это и есть continuation passing style из древней функцианальщины. Просто засахаренный.
                                        Ответить
                                        • Ну значит у меня в подсознании родилось верное слово, надо же
                                          Ответить
                                      • >Она позволяла как раз уйти из функции, а потом вернуться с сохранением контекста

                                        >прикрутить суда понятие континуейшена
                                        Да, это же копрограммы (coroutines).

                                        https://en.wikipedia.org/wiki/Coroutine
                                        Ответить
                                        • Да, именно так они и называются в питухоне и кокотлине: кокорутины
                                          Ответить
                                        • Кстати, кокорутины есть и lua, но там вроде надо вручную тред крутить: resume или как та так
                                          Ответить
                                          • Дык везде надо тред крутить. Все эти корутины, async функции и т.п. они пассивны. Пока не пнёшь - в следующий стейт не перейдёт. Просто в шарпе этот тред уже прилагается изкоробки и крутит виндовый ивентлуп.
                                            Ответить
                                            • ну вот в C# достаточно сказать GetResult
                                              https://i.postimg.cc/6Qr0WjJL/waiter.png
                                              В питоне -- run(..)

                                              А в луа нужно ходить по корутинам, и каждой говорить resume, ну или цикл самому написать

                                              Хотя пример не совсем честный, там вроде других тредов не создается

                                              но могу наврать
                                              Хуй знает точно
                                              Золотой
                                              Ответить
                                              • Ну просто в lua голые корутины. А в других языках к ним целый фреймворк с готовым лупом приложен.
                                                Ответить
                                        • «Копрограмма» звучит как медицинский термин: кардиограмма, томограмма...
                                          Ответить
                                    • > Тут же специальная магия конпелятора, которая тело функции нарубает на фрагменты после каждого await
                                      Логично. Ну не такой уж сахар тогда эти await.

                                      Я когда-то в Сищке пытался сделать копрограммы на свитчах и обернуть их в макрос YIELD с автоинкрементом стейта, на котором произошёл выход.

                                      Вышло в принципе неплохо, но всё-равно уродливо как-то.
                                      Ответить
                                      • > автоинкрементом стейта

                                        ctx->state = __LINE__; return; case __LINE__:
                                        Ответить
                                        • > ctx->state = __LINE__; return; case __LINE__:
                                          Супер!

                                          Тьфу, а я как лалка последняя со счётчиками пердолился.
                                          Ответить
                                    • >физически каждый фрагмент - это отдельный коллбек

                                      Ага, я понял. По сути отдельный function(){}. И чем ниже, тем вложенность больше.

                                      А благодаря эти колобки просто линеаризует.

                                      И мне вместо аргументов внутри колобка, просто возвращается значение из фьючерса, как из обычной функции.
                                      Ответить
                                  • > Да и в других языках тоже.

                                    в жабе всё так, там нет асинк-авейта, но есть CompletableFuture с возможностью указания, в каком пуле исполняться
                                    Ответить
                                    • Я кстати поспал и понял что как раз в языках кроме Сишки, эту yield и await очень проблематично сделать средствами языка, без перепитушни.

                                      Т.к. в Няшной есть макросы и возможность прыгнуть switcheм в самую гущу цикла.

                                      А в анскильных Жс, Жабах и Шарпах такую возможность убрали.

                                      Можно конечно пердолиться замыканиями, но выйдет не сильно лучше колобков.
                                      Ответить
                              • Хайпа много, потому что есть такая задача:

                                Написать страничку, которая делает запрос к удаленному API, и отдает результат пользователю.

                                Запрос к удаленному API занимает 1 сек.

                                Если у твоего веб-сервера 10 потоков, и пришло 11 пользователей, то 11-й пользователь ждет осовбождения потока, хотя процессор ничем не занят: он тупо ждет, пока пакетики по сети летят.

                                Что делать программисту?
                                Использовать callback, но это лапша.

                                А хочется без лапши
                                Хочется писать последовательно, как если бы ты простой скрипт писал.

                                Вот async позволяет писать без лапши и просто.
                                Ответить
                                • >Если у твоего веб-сервера 10 потоков, и пришло 11 пользователей, то 11-й пользователь ждет осовбождения потока

                                  Да понятно. Вёб-поебень для жскрипт-лалок.
                                  Смутно вспоминается баззворд «реактивное погромирование».


                                  >Что делать программисту?
                                  В «POSIX» есть мультиплексирование через select(). Именно поэтому я за «Сишку».
                                  Ответить
                                  • select и его друзья (kqueue, epoll, оверлапнутое чтение в винде и пр) это хорошо, и может быть под капотом там что-то такое и случается иногда, но код всё равно придется писать с расчетом на это: ты или блочишь тред, или крутишься в лупе обрабатывая другие события, пока тебе функция не вернет результат.

                                    Лалкам сложно так писать, куда проще писать все последовательно
                                    Ответить
                          • Чот думаю, что никак особо.

                            Пришло замыкание, оно целиком выполняется на следующем витке.
                            Ответить
                  • Да самая обычная стейтмашина с коллбеками. Просто выглядит для тебя как линейный код. Можешь на сишке нахуевертить что-то подобное через свич, только переменные негде хранить будет.
                    Ответить
                    • >Можешь на сишке нахуевертить что-то подобное через свич.
                      Но тебе придется использовать асинхронные API везде, и разведешь в итоге такую грязь, что читать будет туго, не?

                      >стейтмашина
                      Десктоп ссылк дал
                      https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.iasyncstatemachine

                      IAsyncStateMachine Interface )
                      Ответить
                      • > Но тебе придется использовать асинхронные API везде

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

                      Не могу пока въехать как это просто сделать.
                      Для этого же надо иметь ГОМОИКОННОСТЬ, или интерпретировать кусок функции чтобы ссылаться на произвольное место кода.
                      Ответить
                      • Во время await ты подписываешься на завершение асинхронной хуйни и передаёшь коллбеком самого себя. В стейте у тебя лежат "локальные переменные" и точка с которой "продолжается" исполнение. Свичом впрыгиваешь в нужное место функции и поехали дальше. Вот и вся магия.
                        Ответить
                        • >стейте у тебя лежат "локальные переменные" и точка с которой "продолжается" исполнение

                          Примерно понятно.
                          Но как в сишке хранить «локальные переменные» без копрограммной магии? Разве что struct/массив c конь-текстом функции.

                          А можно демо-пример на Сишке.
                          Ответить
                          • Структура с коньтекстом, да. Настоящие локальные переменные без поддержки конпелятора увы не запилить. Собственно поэтому такая "функция" в шарпе помечена как async.
                            Ответить
                          • Кстати майки эту модель async/await в крестостандарт протащить хотели (или ещё хотят?) Чтобы корутины в крестах делать.
                            Ответить
                              • лол)

                                если что-то где-то есть, то наверняка оно будет в крестах
                                Ответить
                                • В Крестах кстати по-царски сделано:

                                  Стейт размещается на куче, но в случае тривиального случая компилятор может разместить его на стеке и даже заинлайнить.
                                  The call to operator new can be optimized out (even if custom allocator is used) if
                                  
                                      The lifetime of the coroutine state is strictly nested within the lifetime of the caller, and
                                      the size of coroutine frame is known at the call site 
                                  
                                  in that case, coroutine state is embedded in the caller's stack frame (if the caller is an ordinary function) or coroutine state (if the caller is a coroutine)
                                  Ответить
                              • Спасибо.

                                Если сделали в Крестах, тогда всё понятно.
                                Впрочем я серьёзно, они очень хорошо описывают как оно под устроено капотом: and the data that is required to resume execution is stored separately from the stack
                                coroutine state is allocated on the heap via non-array operator new.
                                Ответить
                                • > хорошо описывают как оно под устроено капотом

                                  Да и в шарповской доке, имхо, норм описано что делает await.
                                  Ответить
          • > Application.ProcessEventLoop();
            Почему я, глядя на этот вызов, чётко вижу многочисленные вызовы GetMessage()/TranslateMessage()/DispatchMessage()? Я ебанутый?
            Ответить
            • Там кстати наверное куда больше всякого говна обрабатываться.

              Внешние месседжи это только часть работы этого лупа, есть еще внутренние события, типа "я кнопочка такая-то, хочу перерисоваться, потому что я мультик, и перерисвываюсь 60 раз в секунду"
              Ответить
            • >чётко вижу многочисленные вызовы GetMessage()/TranslateMessage()/DispatchMessage()?

              Оно родненькое! Просто сахарок высокоуровневый.
              Ответить
  • Лол, иню языки-то переименовывает потихоньку на хузе
    Ответить
      • "PHP" (5603)
        Кресты (2511)
        Куча (1893)
        Решеточка (1878)
        Екмаговно (1839)
        ЙАЖА (1449)
        Няшная (981)
        BeginEnd (627)
        Лол (499)
        Питух (477)
        SQL Injeciton (410)
        Ненужное (292)
        [[NSЯбло alloc] init]; (202)
        =()= (190)
        event not found (173)
        Яuбy (138)
        Школоло (134)
        xor eax, eax (122)
        Таблы (41)
        Ябло(Свежее) (26)
        монада это просто моноид в категории эндофункторов (20)
        Goвно (8)
        Коко (5)
        Ответить
        • >Екмаговно (1839)
          ЙажаСцрипт?

          >Лол (499)
          >Ненужное (292)

          Час поздний, не въехал.
          Остальное — охуенно.

          Edit: 1C я бы назвал «НачатьПрограмму» или «КонецПопытки»
          Ответить
          • PHP (5603) C++ (2511) Куча (1893) C# (1878) JavaScript (1839) Java (1449) Си (981) Pascal (627) 1C (499) Python (477) SQL (410) ActionScript (292) Objective C (202) Perl (190) bash (173) Ruby (138) VisualBasic (134) Assembler (122) Lua (41) Swift (26) Haskell (20) Go (8) Kotlin (5)
            Ответить
            • Да я догадался посмотреть по циферкам.

              Просто Лол и Ненужное не говорят о том что внутри.

              Остальные категории охуенно, просто чудовищно self-descriptive. Я даже СтерторШкололо допёр.
              Ответить
              • Вот у меня Школоло ассоциируется с Pascal. Я бы не допер, что Школоло подразумевает VisualBasic. Возможно, смог бы догадаться до обычного Basic или FORTRAN или Python...
                Ответить
                • Пасцаль я отсёк методом исключения: т.к. BeginEnd было.

                  > FORTRAN
                  Что-то не слышал чтобы школоло на нём писало.

                  >Школоло ассоциируется с Pascal
                  Тараса застал?Впрочем он повзрослел и перешёл на Аду и Кресты.
                  Ответить
                  • >Тараса застал?
                    Да.
                    Хотя сейчас новое школоло немного на питон переходит.

                    >Что-то не слышал чтобы школоло на нём писало.
                    Ну школоло особо на нем и не писало, язык ученых был. Но в каком-то кружке по программирования могли на нем писать. В любом случае, в моем понимании FORTRAN ближе к школоло, чем VisualBasic.
                    Ответить
        • > =()=
          А в крестах, помимо общеизвестного оператора «стремится» («while (x --> 0)») есть менее распространённый оператор «хуй»:
          bitMap &=~ bitFlag
          . Означает дословно «хуй тебе, а не bitFlag в bitMap».
          Ответить
          • Всё-таки не первый день сижу на ГК.
            Но какую извращённую фантазию нужно иметь, чтобы там хуй увидеть. Причём травмированный.

            На мой вкус отрицание нужно приклеивать к флагу.
            bitMap &= ~bitFlag;

            Оно-то конечно красиво, с точки зрения «вызвать у читателя WTF».
            x -=- a;
            x +=+ 42;
            Ответить
              • Выглядит как «Посадить на бутылку».
                Ответить
            • b = -~ a; // эквивалент b = a + 1; можно использовать как инкремент
              d = ~- c; // эквивалент d = c - 1; можно использовать как декремент
              Ответить
              • «Верёвочка»:
                b = -~-~-~-~-~-~-~-~-~-~ a; // эквивалент b = a + 10;
                d = ~-~-~-~-~-~-~-~-~-~- c; // эквивалент d = c - 10;
                Ответить
              • По сути это старый трюк, который убирает младший бит.

                x &= x-1

                Если бит единственный (x является степенью двойки) получается 0.
                Ответить
                • Или я туплю, или у тебя проверка не на степень, а на кратность
                  Ответить
                  • Нет, всё в порядке. Трюк старый и элегантный.
                    Если число состоит ровно из одного включённого бита (> x является степенью двойки), после которого следуют n нулей, то после вычитания единицы мы получим число из n двоичных единиц (для проверки вычти столбиком), например, 0b1000 - 1 == 0b0111. После «&» мы, очевидно, всегда получим ноль. А вот если включённых бит в числе как минимум джва, то старший из этих двух бит после вычитания единицы не изменится, и мы получим ненулевой результат: 0b101000 - 1 == 0b100111,
                    101000 
                          &
                    100111
                    ------
                    100000

                    .
                    Ответить
                • Всё верно. Просто прикольно выглядит ~- x вместо x - 1, особенно когда ~- сливается с &=.
                  Ответить
          • Хуй как раз простой и понятный: "bitMap равняется bitMap и не bitFlag"
            А вот goatse можно и не понять
            Ответить
    • «Гугл» уже начинает о чём-то догадываться. Ввожу в строку поиска «Яuбу». Он в ответ
      Показаны результаты по запросу Ruby
      Искать вместо этого Яuбy

      Если же его уговорить, что мне нужно именно «Яuбу», то он находит «хуз» и фильм «Cпаcaтeлu Яuбy».
      Ответить
    • Кому, блять, из смотрящих эту рекламу, может понадобиться индий???
      Ответить
      • Судя по тому, как Саша на него смотрит, в нём что-то есть
        Ответить
      • на на на на на на на на на
        на на на на на на
        на на на на нна нана

        Почем индий?
        Ответить
    • кто, блядь, в своем уме идет в компанию с названием "вэдээсина"?

      ответ: александр чистяков
      Ответить
    • Всё правильно пишут.

      Только многовато про алкашечку.

      > Нет, надо на свою голову организовывать никому ненужные попойки
      > не скудны на фантазию и задвигают что-то типа: пришёл на собеседование – получи бутылку Джек Дэниелс
      Гайд Хрюши: как схантить алкаша-синьора на вкусные настройки.
      Ответить
    • Компания типа российская, при этом чувак упоминает украинские сайты dou и djinni. Аутсорс и принципы понятия несовместимые.

      А рекрутёров толковых реально мало, но что об этом стонать.
      Ответить
    • > Дети в офисе (которых развлекает аниматор), если не с кем оставить – это тоже уже норма, как и домашние питомцы.
      - это пиздец и нахуй такой офис, таких коллег и таких hr'ов. Дядя с килобаксовой зряплатой жлобится нанять няню для своих огрызков, потому давайте будем их наблюдать прямо на рабочих местах, да ещё и вместе с каким-нибудь ебучим клоуном.
      Ответить
      • > Дети в офисе
        пхпшники

        > ебучим клоуном.
        питонист, который тщетно пытается перевести всех на 2.7
        Ответить
        • > питонист, который тщетно пытается перевести всех на 2.7
          питонист, который тщетно пытается перевести всех с 2.7
          Ответить
          • 2.7 "Преимущество перед встречным движением".

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

            Эти два знака (2.6 и 2.7) существовать друг без друга не могут. Если с одной стороны узкого участка стоит знак 2.6, то с другой стороны обязательно стоит знак 2.7.
            Ответить
                • Мы используем Laravel, нам очень нужен человек с правами «M»
                  Ответить
                  • Не, ну согласись, это было бы интересно, если бы для того, чтобы писать на PHP нужно было раз там в три года проходить обследование, в том числе у нарколога и психиатра.
                    Ответить
                    • > писать на PHP
                      > проходить обследование у психиатра
                      Сразу негоден.
                      Ответить
                      • Ну кстати я наверное понимаю, что php не лучший в мире йезык и что не зря его хуесосят.

                        Но разве он намного хуже того же js?
                        Ответить
                            • задай мне такой вопрос на собесе - я б вспотел
                              Ответить
                              • Особенно, если бы ты пришёл собеседоваться в CERN на OCaml
                                Ответить
                                • вот именно, что два ответа, и оба неправильных
                                  Ответить
                                  • Просто признайся, что ты не умеешь композером нейтрино ловить.

                                    > вот именно, что два ответа, и оба неправильных
                                    - вопрос Шрёдингера?
                                    Ответить
                                    • Вопрос Шрёдингера — это когда оба ответа правильные.
                                      Ответить
                              • Как прошла встреча с девопсихой?
                                Ответить
                                • блядь, я вспотел

                                  вообще еще не вечер, но перенеслось на следующую неделю, ох-ах. там, глядишь, и предоплату попросят оставить.
                                  Ответить
                                  • Если не секрет, под каким предлогом перенеслось?
                                    Ответить
                                    • я уже пожалел, что вообще заикнулся. "привет, мы можем перенести? - да, можем"

                                      мы на самом деле еще год назад познакомились через тндр. тогда не взлетело, сейчас просто чаёк попьем, поболтаем да посмотрим. там сложная история.
                                      Ответить
                                      • Заведи специальный тред, как встретитесь — транслируй туда в реальном времени происходящие события. Будешь каким текстовым стримером )))
                                        Ответить
                                      • Блядь, как всё сложно, пиздец. Чтобы просто встретиться надо провести хуеву тучу манипуляций, все до пизды такие занятые, что аж на следующую неделю переносить.
                                        Ответить
                                      • Вы за год так и не встретились? Реально?
                                        Ответить
                                        • У меня знакомый был. Если я с ним хотел встретиться в субботу и писал об этом в понедельник, он говорил: ну ещё столько времени, я не знаю, какие у меня планы. А, если я писал ему в пятницу, он отвечал, что уже всё расписано.

                                          И это пацан. А шо про тёлок говорить)
                                          Ответить
                                          • Нихуя не понял. Вы попробовали год назад, разошлись, и теперь год общаетесь и хотите снова попробовать?

                                            Имхо, фарш обычно обратно не проворачивается
                                            Ответить
                                            • я тоже нихуя не понял. но мы реально просто чаек пока идем пить.
                                              Ответить
                                            • а год мы наоборот не общались, я вообще не думал что меня помнят )
                                              Ответить
                                            • Не слушай эту макаку. Он что-то не то всё время советует.
                                              Ответить
                                              • Подтверждаю

                                                Макака пиздабол
                                                Ответить
                                      • раз уж вспоминал вчера, реальный пример сложной истории в жизни юзера «Fike»:

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

                                        на почту приходит сообщение (напоминаю, происходит это на стыке второй и третьей декады сентября) - "Удачного полета шестого октября!"

                                        Я значит им звоню на входе в терминал, нихуя не слышно, какие-то очереди, они говорят, да, поменяем, но нужно будет доплатить. Я говорю: ну е-мое, десять минут назад не ту кнопку нажал, ну что вы. Они говорят: а назовите ваш посадочный код.
                                        Двадцать минут мы перебрасываемся "подождите секунду" и "M как море? нет, N как наутилус", после чего мне радостно сообщают - да, надо будет всё-таки доплатить.

                                        Ладно, иду в кассу. Там тоже очередь и та же история: надо будет доплатить, говорят. Я говорю - ну окей, аэрофлот ебаный, там был рейс на пятьдесят минут позже, давайте его. Они там щелкают в кампуктере и говорят: знаете, пока мы пиздели, его раскупили. Ну ладно, давайте тогда третий.

                                        Они говорят: надо доплатить.
                                        Я говорю: да, я смирился уже, давайте уже закончим с этим.
                                        Они говорят, нет, надо еще доплатить. Рейс-то уже дневной, стоит дороже )))
                                        Ответить
                                        • Доплатил, в общем (в сумме ушло в два раза больше денег, чем если бы успел на первый самолет). Я к этому моменту уже тридцать часов на ногах, дай, думаю, вздремну. Поставил будильники, вздремнул, умылся, и понял что еще не опаздываю, но уже по краешку.
                                          Бегу через все эти кордоны, обгоняю каких-то индусов (- Харри? - ДА, ПИЗДЕЦ КАК ХАРРИ!), роняю все, короче, успеваю к гейту за минуту до отлета.
                                          У гейта сидят три с половиной инвалида и спрашивают: а какого хуя ты приперся? Наш самолет только через полчаса, а тут ничего и никого не было.
                                          Я пиздую обратно к табло в другую сторону зала.

                                          Пока я дремал, гейт поменяли. Иду к гейту - оказывается, сука, он ровно напротив гейта с тремя инвалидами. Но посадка уже минуту как закончилась, поэтому ебаный аэрофлот даже по громкой связи меня не позовет и не подождет.

                                          Иду в ебаные кассы.
                                          Мне говорят: надо доплатить.
                                          Я говорю: да вы охуели там что ли?
                                          Они говорят: нихуя не знаем, идите в оперативное реагирование. А я уже представляю себе, что оперативное реагирование - это такие кассирши в квадрате, которые не только меня нахуй пошлют, но еще и предоплату сдерут.

                                          А они там хи-хи, ха-ха, даже не посмотрели, сунули новый посадочный талон и отпустили. Ну а я пошел прямо к гейту и дремал уже сука там, улетев чуть ли не на шесть часов позже желаемого.
                                          Ответить
                                          • Блин, я думал эта история закончится тем, как ты познакомился с той тян пока ждал самолета.
                                            Ответить
                                • Непонятно ты как-то говоришь

                                  Кубернейтс-то обсудили?
                                  Ответить
                                  • пока только суицид

                                    сама встреча перенеслась на следующую неделю. но рад, что ты следишь за моими усехами!
                                    Ответить
                                    • Это guest8 следит, а я только подёздываю
                                      Ответить
                        • Да там не столько в языке дело, сколько в экосистеме в целом.

                          Есть конечно редкие проекты где и код аккуратный и тесты и т.п. Но в остальном - говнище редкостное. Даже популярные штуки типа того же вордпресса или джумлы.

                          А про типичные туториалы вообще молчу.

                          У жс с этим получше всё-таки.
                          Ответить
                        • Борманд распидалил как Боженька, так что добавить особо нечего. Отмечу лишь, что качество самого языка уже второстепенно. Язык это коммунити: это люди, фреймворки, инфраструктура, мануалы, форумы.

                          Всё это у пыха очень плохое. Глупые люди пишут глупые мануалы. Другие глупые люди учатся по глупым мануалам, и тоже становятся глупыми. Потом все вместе пишут глупые фреймворки. Работая с глупыми фреймворками люди получают глупый опыт, и начинают думать, что делать глупо это правильно.

                          То-есть дело не в том, что синтаксис кривой. Дело в эко-системе. Это трудно объяснить, если не попробовать самому
                          Ответить
                          • А началось всё с того, что язык поощрял глупость.
                            Ответить
                            • Вот и я думаю, что первичная проблема в языке.

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

                              Но JS производит на меня точно такое же впечатление.

                              лефтпады, лапша из колбеков и промисов, языки над языками.

                              Но фреймворки некоторые вроде ничё, да, подслащивают пилюлю
                              Ответить
                            • Я не знаю почему так случилось, кстати, и в какой момент.

                              Интересно было бы почитать исследование на эту тему.

                              Веб питушня в конце 90-х писала говно на Perl, но Perl не стал такой парашей. А пых стал. А Ruby (следующий язык после пыха, пришедший в веб во второй половине нулевых) опять не стал.

                              Почему именно пых?
                              Ответить
                              • Ruby, на мой взгляд, вообще ничем не стал. Уж лучше с Пистоном сравнивать
                                Ответить
                                • Руби очень сильно повлиял на современную разработку, на самом деле.

                                  Все эти BDD, Континиус деливери, DSL и configuration as code пришли из руби (то-есть они были и раньше, но рубисты начали их форсить в вебе активно)

                                  Просто так случилось, что он стал языком одного фреймворка --рельс. А DHH косный шопиздец, и потому всё стухло.

                                  Алсо, поднасрал твиттер, рассказавший всему миру о тормозах руби
                                  Ответить
                                  • Ну такое.

                                    Например BDD нужен 10 бизнесам, а интернет-магазин 10000.
                                    Бизнес пойдёт и выберет пых, потому шо проще

                                    А сегодня ты можешь писать с такой же скоростью на Свифте, только у тебя есть статтипизация, легчайший интероп с сями безо всякого ffi и т.п., так зачем тебе руби
                                    Ответить
                                    • Ну BDD это просто пример.

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


                                      >сегодня
                                      Сегодня -- да. А в 2006-м как-то с этим хуже было
                                      Ответить
                                    • Они на скакалку вроде переписали.

                                      Кстати, из всей скриптопараши шустрее всего работает небось JS: там жжит же
                                      Ответить
                                      • В типичном проекте на «PHP» тормоза обычно не из-за «PHP», а из-за базы данных.

                                        «Фейсбук» пытался ускориться, сначала компилировали «PHP» в «Си», потом изобрели «HHVM». Но каждый раз они упирались либо в оверхед из-за динамической типизации, либо в тормоза СУБД, что никаким житом не фиксится.
                                        Ответить
                                        • Мы сравниваем запуск всяких алгоритмов в самих языках.

                                          А про базу согласен: типичное пыхоблдл не умеет (де)нормализовать базу до вменяемого уровня.

                                          Там будут или джойны по лайку из семи таблиц, или еще говно какое-нить
                                          Ответить
                                        • Именно по этому я за Notice: Undefined offset: 0 in /home/g/guestinho/govnokod.xyz/public_html/wp-includes/class-wp-query.php on line 3144
                                          Ответить
                                • > Ruby, на мой взгляд, вообще ничем не стал.

                                  Сначала Яибу стал на рельсы.
                                  А вот потом уже стал ничем.
                                  Ответить
                                  • До рельс про руби знало примерно 2 человека за пределами Японии, и оба в Дании.

                                    Если бы не рельсы, то известность руби среди ширнармасс была бы примерно как у tcl
                                    Ответить
                                  • А рельсы задали моду на фреймворки в других языках.
                                    Ответить
                                    • Как ни смешно про это говорить, но фреймворки в питоне были до рельс.

                                      Офигительный совершенно Zope был в питоне (слишком хороший для вебговна).

                                      Но именно рельсы сделали их популярными.

                                      До фреймворков была такая параша -- CMS. Это когда кусок говна, тупых ограничеий и квадратных колес вместе слепили в комочек
                                      Ответить
                                        • Давайте смеяться над популярными CMS и оскорблять их пользователей?

                                          Вот смотри, какой код
                                          $arFields["MY_DATA"] = "<span>".$arFields["ID"].":</span><b>".$arFields["NAME"]."</b>";

                                          https://www.cyberforum.ru/1c-bitrix/thread2456898.html

                                          Или вот (покрути направо, там сюрприз):
                                          $orderList .=  "<tr style='border: 1px solid grey;'>
                                                          <td style='padding:10px;vertical-align:middle;border: 1px solid grey;text-align:center;'>".'<img style="width:80px;height:80px; " src="'.$arBasketItem["PREVIEW_PICTURE"].'">'."
                                                          <td style='padding:10px;vertical-align:middle;border: 1px solid grey;text-align:center;'>".'<a href="'.$arBasketItem["DETAIL_PAGE_URL"].'">'.$arBasketItem['NAME'].'</a>'."</td> <!--Наименование главного товара ссылкой + цвет-->
                                                          <td style='padding:10px;vertical-align:middle;border: 1px solid grey;text-align:center;'>".$arBasketItem['CML2_ARTICLE']."</td><!--Артикул-->
                                                          <td style='padding:10px;vertical-align:middle;border: 1px solid grey;text-align:center;'>".$arBasketItem['QUANTITY']." ".$arMeasure[$arBasketItem['PRODUCT_ID']]['MEASURE']['SYMBOL_RUS']."</td><!--Количество-->
                                                          <td style='padding:10px;vertical-align:middle;border: 1px solid grey;text-align:center;'>".str_replace('.0000','',$arBasketItem['PRICE']).' руб.'."</td><!--Цена-->
                                                          <td style='padding:10px;vertical-align:middle;border: 1px solid grey;text-align:center;'>".str_replace('#', number_format($curPrice, $arCurrency["DECIMALS"], $arCurrency["DEC_POINT"], $currencyThousandsSep), $arCurrency['FORMAT_STRING'])."</td><!--Сумма-->
                                                          <tr>";

                                          В этом же файле происходит отправка данных
                                          CEvent::Send("ONE_CLICK", $SITE_ID, $arMessageFields);
                                          Ответить
                                          • Куча мест для XSS, адская смесь апострофов и кавычек, чтобы только бекслеш не использовать, адское форматирование чисел (str_replace('.0000','', число)). Как вкусно!
                                            Ответить
                                      • Подтверждаю. Каждый уважающий себя пыхер в своей жизни должен сделать три вещи: использовать «собачку» или «error_reporting(0);», установить «WordPress» и написать свою «CMS».
                                        Ответить
                                        • В каждом CMS должень класс Db для работы с базой данных
                                          У каждого свой
                                          Ответить
                                          • Элиту подвезли
                                            $content = '<?xml version="1.0" encoding="utf-8"?>';
                                            $content .= '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
                                                $content .= '<soap:Body>';
                                                   $content .= '<User>'.$login.'</User>';
                                                   $content .= '<Pass>'.$pass.'</Pass>';
                                                   $content .= '<RPO>' . $arOrder['RPO'] . '</RPO>';
                                                $content .= '</soap:Body>';
                                            $content .= '</soap:Envelope>';
                                            
                                            file_put_contents($_SERVER["DOCUMENT_ROOT"]."/upload/tmp/tmp.xml", $content);
                                            $content_length = filesize($_SERVER["DOCUMENT_ROOT"]."/upload/tmp/tmp.xml");
                                            
                                            //$content_length = intval(strlen($content));
                                            
                                            $headers = array(
                                                'Host' => 'cdekff.ddns.net',
                                                'Content-Type' => 'text/xml; charset=utf-8',
                                                'Content-Length' => $content_length,
                                                'SOAPAction' => 'http://cowms.ru/outbound/ClientOrder_CreateUpdate',
                                            );

                                            Вот такой программист написал
                                            https://opt-99999999.ssl.1c-bitrix-cdn.ru/forum/avatar/222/2224a371732f261323770fa0097cdbda/P51225-233109.jpg

                                            Ни за что не поверите, зачем он это на диск сохранил:
                                            https://dev.1c-bitrix.ru/community/forums/forum6/topic133333/
                                            Ответить
                                            • Сама ручная линейная поклейка XML не криминал, потому что фреймворки зачастую генерируют XML медленнее, чем ручная поклейка. Однако, нужно быть очень внимательным, чтобы не пропустить неэкранированные данные (а я подозреваю, что эти макаки ничего не экранировали, и тут место для XSS).

                                              Хотя в «PHP» всё есть:
                                              https://www.php.net/manual/ru/book.soap.php

                                              Ржака в записи на диск ради подсчёта объёма из-за перегруженной strlen.

                                              https://www.php.net/manual/ru/function.mb-strlen.php

                                              Второй комментарий: «If you need length of string in bytes (strlen cannot be trusted anymore because of mbstring.func_overload) you should use <?php mb_strlen($string, '8bit'); ?>».

                                              То есть макака даже не осилила открыть документацию по «PHP».
                                              Ответить
                                              • Да можно хотя-бы собрать его DOMом, а лучше взять клиента SOAP.
                                                Я не верю, что сборка XML домом будет твоим ботлнеком:)

                                                Да, макака присоветовала, а другая макака поблагодарила. Потом еще кому-нить расскажет. Так вот и распостраняются бест практисес
                                                Ответить
                                                • Про перегрузку strlen я не знал. Неужели какие-то проекты требуют эту перегрузку? Кстати, в 7.2 эта перегрузка deprecated:
                                                  https://www.php.net/manual/en/mbstring.overload.php

                                                  После обновления «PHP» куча проектов сломается.
                                                  Ответить
                                                  • какое говно:) Впрочем, переход на многобайтовку многие скриптовички пережили не просто

                                                    Лучше сразу делать двубайтовую кодировку и не думать ни о чём
                                                    Ответить
                                                    • > Лучше сразу делать двубайтовую кодировку и не думать ни о чём
                                                      Тогда придётся думать про

                                                      [!] Application was halted by an exception.
                                                      Debug-mode is off.
                                                      Ответить
                                                      • Белый человек решает проблему в питоне
                                                        >>> len(bytes("уй", "utf-8")) # 4

                                                        Белый человек решает проблему в перле
                                                        use utf8;
                                                        use Encode qw/encode_utf8/;
                                                        
                                                        print scalar split //, encode_utf8 "уй"; #4


                                                        Пыхобыдло решает проблему:
                                                        file_put_contents($_SERVER["DOCUMENT_ROOT"]."/upload/tmp/tmp.xml", $content);
                                                        $content_length = filesize($_SERVER["DOCUMENT_ROOT"]."/upload/tmp/tmp.xml");

                                                        ахах
                                                        Ответить
                                                        • Ну кстати напомнило, как в одном iOS-проекте решалась задача потоковой обработки данных из сети. Поскольку вроде как InputStream и OutputStream нельзя связать вместе, то приходилось создавать временный файл, в который один стрим писал, а второй из него читал
                                                          Ответить
                                                          • Так и в джаве нельзя, и всякие пайпы в винде тоже.
                                                            нужно читать из одного и писать в другой кусочками
                                                            Ответить
                                                            • > писать в другой кусочками

                                                              В комменте десктопа жопа походу в том, что тебе надо передать соответствующие стримы в какие-то функции. Т.е. видимо кольцевой буфер нужен с джвумя интерфейсами, а его почему-то не завезли. Поэтому крутят через файл.
                                                              Ответить
                                                              • Так почему через память не крутить?
                                                                Псевдокот
                                                                MemoryInputStream foo = CreateInputStream(4096);
                                                                NasriVStream(foo);
                                                                outputStream.write(foo.getContent())


                                                                спутил инп и аутп, ну и похуй

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

                                                                    Просто создаешь пайпы, Запускаешь поток, который читает блоикующе из одного, и пишет в другой, и передаешь пайпы в функции
                                                                    Ответить
                                                                    • Ну а зачем лишний слой пайпов да ещё и тред, если тут всего лишь интерфейсы?

                                                                      Запилить кольцевой буфер который оба интерфейса реализует да и всё. Пайпы нужны только если тебе прям хендлы операционки требуются.
                                                                      Ответить
                                                                      • Согласен, что через кольцевой лучше, просто странно ради этого трогать файл

                                                                        Мне было нужно запустить два процесса, и подменить им хендлы stdout и stdin
                                                                        Ответить
                                                                • > кольцевой буфер только в пропозалах

                                                                  Нинужно. Любой сишник запилит за пять минут.
                                                                  Ответить
                                                    • Продолжаем смеяться:
                                                      https://www.php.net/manual/en/function.mb-strlen.php

                                                      Функция mb_strlen появилась в «PHP 4.0.6». То есть даже не в пятёрке, а в четвёрке! Я напоминаю, что «PHP4» — это 2000-й год, это было 20 (двадцать) лет назад.

                                                      Макаки до сих пор продолжают использовать strlen и ждут, когда их творение распидорасит многобайтовыми символами.

                                                      А из «PHP3» случайно какие-нибудь «бест практисес» не сохранились?
                                                      Ответить
                                                  • а в пыхокале можно перевести строку в байты в utf-8, и посичтать длину?

                                                    в перле, руби и пит0не можно
                                                    Ответить
                                                    • Я жирным выделил: mb_strlen($string, '8bit').

                                                      Так можно с PHP4, т. е. уже 20 лет как.
                                                      Ответить
                                                      • Комментарий полугодовой давности.

                                                        It may not be clear whether PHP actually supports utf-8, which is the current de facto standard character encoding for Web documents, which supports most human languages. The good news is: it does.

                                                        I wrote a test program which successfully reads in a utf-8 file (without BOM) and manipulates the characters using mb_substr, mb_strlen, and mb_strpos (mb_substr should normally be avoided, as it must always start its search at character position 0).

                                                        The results with a variety of Unicode test characters in utf-8 encoding, up to four bytes in length, were mostly correct, except that accent marks were always mistakenly treated as separate characters instead of being combined with the previous character; this problem can be worked around by programming, when necessary.

                                                        Похоже, с PHP лучше не быть ни в чём уверенным
                                                        Ответить
                                                        • У чувака проблема с «акцентами». Например, в немецком языке умляуты можно написать двумя способами: одним кодпоинтом (ü) и двумя кодпоинтами (ü — здесь сначала я вывел букву «u», а вслед за ней так называемый «combining symbol», состоящий из двух точек, проверь).

                                                          Так вот его беспокоит, что в «PHP» функция mb_strlen второй вариант посчитает за два символа. Его, видимо, ещё беспокоит, что залго будет посчитано за кучу символов.

                                                          Хотя на этот случай есть функция grapheme_strlen:
                                                          https://www.php.net/manual/ru/function.grapheme-strlen.php

                                                          Последняя не считает «combining symbols» за отдельные символы.

                                                          Конкретно в данном случае проблема не в «PHP», а в том, что некоторые не умеют работать с «Unicode».
                                                          Ответить
                                                      • Ну вот отличный пример говна:

                                                        Функция 20 лет назад устарела, но пыхоссобщество продолжает ее рекомендовать и использовать
                                                        Ответить
                                              • Пиздец. Даже такая, казалось бы, простейшая функция, как strlen(), и та имеет подвох.
                                                В шаблонизаторе осталась хоть одна функция, поведение которой не зависит от ублюдочного рнр.іпі?
                                                Ответить
                              • Пых специально создавался так, чтобы даже обезьяна с печатной машинкой могла напечатать на нём что-нибудь едва работающее. Нотисы, собачки, register_globals, вcё вот это вот дерьмо. А максимальная простота «разработки» (положил весь код в index.php и потёк) только подливает масло в огонь.
                                Ответить
                          • > если не попробовать самому

                            А если попробуешь - то всё норм же. Простой язык, понятные мануалы, умные люди вокруг, удобные фреймворки.

                            Вот только люди со стороны почему-то все смеются и тычут пальцем. Но они идиоты, видимо. Не надо обращать на них внимания.
                            Ответить
                            • А ты им такой в ответ "ой, а эти ваши JSP и ASP что-ли лучше?"
                              Ответить
                                    • Вот он щас пойдёт и зарегает миллион аккаунтов Muha0001 и т.д.

                                      Ему смешно, а нам Application halted by exception
                                      Ответить
                                      • Мне будет лень регистрировать. А вот gost может. У него все технические средства для этого уже готовы.
                                        Ответить
                                        • У меня такое ощущение, что в «ГК» где-то завелось O(N^2): после армии петухов он стал очень медленно присылать письма о регистрации. Так что вряд ли.
                                          Ответить
                                • JSP это шаблонизатор. Бекенд пишется на джаве или котлине.
                                  JSP имеет диалект JSPX, который позволяет делать well-formed XML документы, это мегакруто.

                                  Минусы правда в том, что во-первых он прибит гвоздём к сервлетам (его нельзя запустить с командой строки) а во-вторых он не умеет эскейпить по умолчанию: надо эскейпить явно, иначе у тебя будет пользователь с именем "<b>", и привет

                                  И наконец, можно писать на Java и не использовать JSP.
                                  Писать на котлине конечно приятнее, чем на PHP, не говоря уже про дебаг, профилирование, и тестирование.

                                  ASP (не .NET) это вомзожность запускать скрипты в IIS плюс пара ActiveX объектов для работы с бекендом. Так что это VBS, древний JScript и прочая хуйня, говно, и не нужно.

                                  А вот в ASP.NET ты можешь писать на C#, что безусловно в миллион раз лучше пыха.
                                  Поверх этого есть какой-то свой шаблонизатор, есть веб-формы, был mvc.net, еще хуйня какая-то..
                                  Ответить
                                  • > well-formed XML документы

                                    Что мешает мне делать их на «PHP»? Пиши аккуратно и всё будет well-formed.
                                    Ответить
                                    • Пых не следит за этим.
                                      Ты можешь запутаться, и случайно два раза закрыть таг.

                                      JSPX это XML, так что он сразу ошибку кинет
                                      Ответить
                                  • >JSP это шаблонизатор. Бекенд пишется на джаве или котлине.

                                    JSP хотя бы конпелируемый.
                                    Проебал где-то, не скомпилилось.

                                    Плюс там есть несколько разных технологий. Само JSP реализует привычный для ПХП-кодера паттерн «каша».

                                    Однако с помощью jstl можно вполне нормально шаблонизировать.
                                    Ответить
                                    • Да, всякие <c:forEach и <c:out это ок.

                                      И хорошо, что оно компилируетс. плохо, что без Request не работает
                                      Ответить
                                  • >JSP это шаблонизатор.
                                    Да.
                                    А люди так этого и не поняли. Впрочем в эпоху ангуляров он почти не нужен.

                                    >ASP (не .NET) [...] это VBS, древний JScript и прочая хуйня, говно, и не нужно.
                                    Да.

                                    >А вот в ASP.NET ты можешь писать на C#, что безусловно в миллион раз лучше пыха.
                                    Да.
                                    Ответить
      • Это нормальная тема: всякие гуглы хотят, чтобы ты чувствовал себя на работе комфортно, и для этого тебе может быть полезно в обеденный перерыв пообнимать свое дитя. Особенно, если ты молодая мама, например.

        В гугле даже собачек можно в офис приводить.

        Но разумеется, там для всего этого отдельное помещение, и если ты не любишь детей и собак, то ты не обязан вообще даже знать об их существовании
        Ответить
        • В Гугле может и отдельное, а в компании ВДСина?

          > в обеденный перерыв пообнимать свое дитя.
          - и сиськой его покормить на виду у всех, потому что онажемать
          Ответить
              • Девушка, а вы не могли бы вот всё тоже самое, но без ребенка?
                Ответить
                • Интересно, а если без ребёнка, то будет ли это считаться sexual abuse и если да, то с чьей стороны: девушки или тех, кто имел неосторожность на неё посмотреть?
                  Ответить
                  • И так и так может быть, смотря у кого адвокат лучше
                    Ответить
                    • Девушка, а вы не могли бы вот всё то же самое, но с адвокатом?
                      Ответить
    • Какой скилл )))

      > Школоло
      Эх, а ведь в старые-добрые времена на нём были написаны чуть ли не все приложения с гуем…
      Ответить
      • Подтверждаю. В 80-х / 90-х паскаль вовсе не был "учебным" или "игрушечным" языком.
        У Mac OS того времени он вообще был системным языком и главным языком разработки. *
        Ну а о роли Delphi в виндуос разработке на границе веков и говорить смешно. Достаточно вспомнить квип и тотал коммандер и бесконечные формошлепские клиенты ко всему, к чему только можно


        *https://en.wikipedia.org/wiki/Macintosh_Programmer%27s_Workshop#Design
        Pascal was Apple's original preferred language for Macintosh software development,[1] and MPW was initially released with only Pascal support
        Ответить
        • Инью перепутал «Бейсик» и «Паскаль». Он «BeginEnd» написал у «VB», хотя в «VB» нет никакого «begin», там только «end».
          Ответить
          • подтвержаю
            Sub TyPetuh
                MsgBox "Ты питух" 
            End Sub


            Логичный язык
            Ответить
            • В «Модуле» и в «Обероне» вроде тоже нету бегина, только энды. Никлаус Вирт решил, что «Паскаль» многословен, и в своих более новых языках убрал «лишнее» слово. Так что в «Модуле» и в «Обероне», хоть убей, нельзя писа́ть без «операторных скобок».
              Ответить
                • Представляешь, сколько багров в языках с опциональными операторными скобками, потому что невозможно понять, к какому ифу относится else?

                  Даже нелепое do{ }while(0) в сишных макросах появилось из-за опциональности операторных скобок.
                  Ответить
                  • Именно потому я за то, чтобы всегда и везде писать скобки
                    как в tcl
                    Ответить
                  • >сколько багров в языках с опциональными операторными скобками

                    Так мало того. Экономии никакой.
                    Необязательные операторные скобки влекут за собой обязательные скобки на условии.
                    if (bagor){
                    }
                    Если что в Goвне правильно сделали, так это обязательные {}
                    Ответить
                    • В перде скобки тоже обязательны. правда, там есть такая нотация без скобок
                      print "A" if 1;

                      А вот
                      if (1) print "A";
                      не срботает
                      Ответить
                    • Подтверждаю, необязательные скобки — это кал.

                      А ещё я за «Python». Там нет никаких «скобок».
                      Ответить
                      • Ну питон кстати годный язык чтобы приучать котят к лотку юных программистов к отступам.
                        Ответить
                        • Согласен.

                          Кмк, «Питух» может быть действительно неплохим учебным языком.

                          Пока условный Сёма его соберёт, глядишь выучит Сишку и системы сборки.
                          Ответить
                          • Нормальной (обязательной) статической тупизации ему не хватает.

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

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

                              Общеобразовательный уровень средней школы или университет с профильной подготовкой.

                              С т.з. практики Питух человеку может пригодиться хотя бы в качестве калькулятора.

                              А у нас как обычно учат тому, что потом нахуй не нужно в жизни.

                              Если Тарас такое говорил, то я ему ещё как-то верил — он реально писал на Дельфях код.

                              А так научат детишек Паскалю, а они потом вырастут и в Экселях всё считают.
                              Ответить
                              • Да, с паскалем есть такая жопа, что применить его на практике трудно, к сожалению.

                                Потому я за 1997-й год, когда вполне можно было на паскале работать настоящим программистом
                                Ответить
                              • > в экселях всё считают

                                Вот я кстати так и не научился. Обычно на середине расчёта забрасываю эту хуйню и делаю какой-нибудь питоний скрипт, который csv высирает или через api ячейки патчит.
                                Ответить
                                • Мне понравилось из «Экселя» через CSV передавать таблицу в какую-нибудь СУБД, там её обсчитывать на какой-нибудь скриптушне типа «PHP», а потом результат снова передавать через CSV.

                                  Работать в «Экселе» напрямую для меня сложно. Я пытался, у меня даже получалось, но я быстро забываю, как это делать. Скилла не хватает.
                                  Ответить
                                  • Excel можно напрямую подключить к субд, кстати. Через ODBC или другой драйвер. И скопировать через буфер)

                                    Excel вполне может быть гуйным интерфейсом к СУБД или OLAP. И еще графики тебе рисовать будет. И сортировать. И Pivot tables делать.

                                    Полезная тула, на самом деле
                                    Ответить
                                    • Что график даже нуб сможет вывести, это хорошо. Правда, у меня однажды багор случился из-за десятичного разделителя (в импортированных в «Эксель» данных была точка, как у пиндосов, а «Эксель» хотел запятую, как у людей). Но это уже не проблема «Экселя», а проблема отсутствия единого стандарта представления чисел.
                                      Ответить
                                      • >у меня однажды багор случился из-за десятичного разделителя (в импортированных в «Эксель» данных была точка, как у пиндосов, а «Эксель» хотел запятую, как у людей

                                        Этот багор у меня случился ещё в 90х.
                                        Я его на всю жизнь запомнил.

                                        Русификация — зло. Они БЛЯТЬ даже функции попереводили.
                                        Ответить
                                        • Сначала прочитал как «даже функции попердолили».

                                          Там ещё зло, что в разных версиях «Офиса» имена функций могут немного не совпадать.
                                          Ответить
                                • Да ладно, что там сложного?
                                  В ячейке есть формула. Формула ссылкается на ячейку (типа A1) или range (A1:A10).

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

                                  "A$1" -- не менять 1 при копировании
                                  $A1 -- не менять A.

                                  Все форумулы хорошо документированы обычно.
                                  Есть сумма, есть среднее арифм, есть даже представить ввиде hex:)

                                  А еще можно скопировать ячейку, выделить кусок, и вставить. И кусок заполнятся ячейками с формулами, которые правильно изменились (если конечно нет $)
                                  Ответить
                                  • > что там сложного

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

                                    Простенький график нарисовать или сумму посчитать - ну ок, сойдёт. Остальное проще внешними тулами.

                                    З.Ы. И не предлагай мне встроенные языки.
                                    Ответить
                                    • >З.Ы. И не предлагай мне встроенные языки.

                                      Туда вроде завезли .NET, но я особо не пользовался.

                                      А вот на VBA я писал в детстве. Какой багор:)
                                      Ответить
                                      • > .NET

                                        Ну я в библиотеках .net не особо шарю, без msdn писать не смогу. А смысла их учить ради сраных табличек и, возможно, плагинов к повершеллу я особо не вижу.
                                        Ответить
                                        • Всякого десктопного говна** (или веб) под винду написать, или ксамарин тот же.. Кажется, что .NET может быть полезен.
                                          А вот VBA точно нет


                                          **WPF какой-нить, всё проще, чем MFC с крестами
                                          Ответить
                                          • Да мне десктопное говно не особо интересно. Для себя обычно проще соснольную тулу или вебморду слепить. Ну и шарп для мелкой проги слишком многословен. Впрочем как и кресты.
                                            Ответить
                                            • И то и другое можно пильнуть на шарпе, причем очень просто.

                                              Я согласен про многословность, но (имхо) .NET дает неплохую середину между скриптушней (где у тебя не будет доступа к API винды) и сишечкой/крестами, где будет много не очень нужного лоулевела.

                                              Альсо, дотнет есть у всех, а скриптушню ставить надо.

                                              Впрочем, если ты такой бог крестов, то тебе может дотнет и нахуй не нужен.
                                              Ответить
                                                • Ещё есть ctypes.windll, чтобы вызвать функцию из любой DLL, и ctypes.cdll, чтобы вызвать функцию с соглашением «cdecl» (из «msvcrt.dll», например).
                                                  Ответить
                                                    • В «Линуксе» оно же умеет вызывать функции из .so. И Борманд об этом знает:
                                                      https://govnokod.ru/13763#comment195630

                                                      Собственно после его комментария я и начал копать в этом направлении.
                                                      Ответить
                                                      • Подтверждаю. Некоторые либы так и реализованы в питоне.

                                                        Проблемы начинаются тогда, когда к фукции пррилагается .h файл с неебической стуктурой, и ее вроде бы надо в питоне выразить, но верояно есть готовые тулы
                                                        Ответить
                                                        • Ну структуры через ctypes довольно удобно описываются, каких-то прям жестких проблем я пока не встречал.
                                                          Ответить
                                                          • ну ты их вручную переписываешь?

                                                            А если там 934 поля?
                                                            Ответить
                                                            • Ну в той паре случаев где либ не было - да, переписывал.

                                                              Мож и есть какая-то тулза на clang'овском двигле которая может хедер в питон сконвертить. Но не факт.
                                                              Ответить
                                                              • на силанговом, это чтобы готовое свинтаксическое дерево взять?

                                                                Как было бы клево, если бы API описывалось в языконезависимом стиле, правда с типами была бы чехорда
                                                                Ответить
                                                                  • Сначала хотел сказать, что декларации структур не очень страшно парсить, но потом подумал, что там может быть макроёбство, и это уже не так весело
                                                                    Ответить
                                                                    • От макросов можно избавиться, пропустив через препроцессор.
                                                                      Ответить
                                                • кококойто интересный API.

                                                  http://timgolden.me.uk/pywin32-docs/PyCWinThread.html
                                                  >Encapsulates an MFC CWinThread class

                                                  Казалось бы, причем тут MFC?
                                                  И я же правильно понимаю, что они напитонили обертки вокруг части API? А если там чего-то нет?

                                                  В C#.NET же у тебя есть P/Invoke, позволяющий нашарпить такие обертки для любой функции

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


                                                  Зато в C# типизация статическая, лол
                                                  Ответить
                                              • Кресты я сейчас только для работы юзаю. По фану проще напитонить.
                                                Ответить
                                              • >дотнет есть у всех, а скриптушню ставить надо

                                                У меня нет.

                                                А вся скриптушня стоит из коробки.

                                                К тому же дотнет без студии — хуйня.
                                                Ответить
                                                • У тебя не винда потому что)

                                                  Имелся ввиду рантайм: Он обычно есть в винде.

                                                  Кстати, без студии можно писать еще и в райдере, но он платный, а по тяжести может со студией поспорить
                                                  Ответить
                                                  • >У тебя не винда потому что)

                                                    Так у борманда тоже )))

                                                    А в целом пока одни квалифицированные коллеги высирают статы из логов в Ыксель, и потом там пирдолятся с формулами.

                                                    Другие пишут какие-то парсеры для питонов, мне зачастую проще прям на серваке хуйнуть grep | cut | awk | sort и высчитать всё что нужно.

                                                    То же касается многих тривиальных csv.
                                                    Ответить
                                      • >А вот на VBA я писал в детстве. Какой багор:)

                                        Я тоже. Правда в детстве у меня VBA не было, только клон Спектрума.

                                        Но я считал какую-то побитовую питушню, конечный автомат для курсовой по дискретной математике.

                                        Её предлагалось считать руками на бумажке, лол.

                                        И как раз тогда только появился VBA. Функций экселя я не знал, гуглов тогда не было.

                                        Написал все нужные функции на VBA, посчитал всё, распечатал аккуратную табличку.
                                        Ответить
                                • >Обычно на середине расчёта забрасываю эту хуйню

                                  Какой анскилл )))

                                  > делаю какой-нибудь питоний скрипт, который csv высирает или через api ячейки патчит.

                                  Какой скилл )))
                                  Ответить
                                • >Вот я кстати так и не научился.

                                  Вообще мой мир рухнул.

                                  Приходит борманд на собеседование в контору с Экселем, а дальше картина описанная гостем:

                                  https://govnokod.ru/25444#comment463938

                                  В итоге эксельная девочка-хрюша разъебует в хламину кандидата, который способен решить задачу на десятках языков, сотней способов, включая самые экзотические и изощрённые, вроде сишного препроцессора, constexprов, тьюринг-полного sedа, хачкеля, и остальных.
                                  Ответить
                            • Swift
                              Go

                              Достаточно простые для освоения. Статическая тупизация.
                              Не требуется ооп головного мозга в обязательном порядке.
                              Ответить
                              • Go может и хорошо, да.
                                Swift вроде как не очень популярен за пределами яблока, не?
                                Или он уже есть под винд?
                                Ответить
                                  • Ну хорошие студенты** обычно и дома что-то кодят для себя, а у них скорее всего виндуос

                                    **если они будущие программисты
                                    Ответить
                                • «Swift» под «Линукс» есть. Но непопулярен, да.

                                  Вот, например, «gcc» пропагандирует «Objective-C», суёт его во все операционные системы (в «MinGW», например, он есть). Но кто на нём реально пишет?
                                  Ответить
                            • Куча есть, но ручная: с New/Dispose или GetMem/FreeMem. Без GC, без подсчёта ссылок, даже без RAII.

                              В «Паскале» принцип: «посрал — убери за собой». Ручная расстановка освобождения памяти тренирует внимание.

                              В «Delphi», правда, появились строки со счётчиком ссылок.
                              Ответить
                              • Так это ж хорошо, что она ручная.

                                У меня есть ощущение, что понимание работы с памятью (где стек, где куча, что копируется, а где ссылка передается) это вообще мегаважно, и совсем не просто на самом деле для ребенка.

                                И вот питон позволяет всего этого не знать. А лучше бы это понимать
                                Ответить
                                • Ещё на «D» в режиме «Better C» можно писать без GC, в паскалевском стиле.
                                  Ответить
                                • Вот что мне совсем не по душе, так это обучение студентов на джаве. Джаву нужно учить вторым или третьим языком, но уж никак не первым.

                                  Когда ты нуб, тебе нужно как можно меньше понятий.
                                  Вот такое тебе легко изучить
                                  print("foo")

                                  А пойди пойми
                                  class Foo {
                                       public static void main(String[] args) {
                                          System.out.print("hello");
                                       }
                                  }

                                  Сразу столько непонятных слов, и ведь их хер объяснишь студенту. Что такое "static"? Что такое "class"? Ему бы hello world написать сначала
                                  Ответить
                                    • В пыхе тоже много мусора.
                                      Что такое "<?". Объясни новичку. Зачем оно?
                                      Ответить
                                      • Да, изначально разрабатывали как шаблонизатор. А сейчас пытаются использовать в роли языка программирования общего назначения. Фреймворков понаписали, говно жрут, пидоры. Это программирование, это программирование?
                                        Ответить
                                        • Я нуб.

                                          Что такое "шаблонизатор"?
                                          Что такое "фреймворки"?
                                          Ответить
                                      • > Что такое "<?". Объясни новичку. Зачем оно?
                                        Подтверждаю. Ещё нужно объяснять, зачем в каждой строчке стоят доллары и собачки.
                                        Ответить
                                        • > зачем в каждой строчке стоят доллары и собачки

                                          Чтобы зарабатывать доллары и завести себе собачку.
                                          Ответить
              • > Никлаус Вирт решил, что «Паскаль» многословен
                Правильно решил.
                За то мне «Basic» с «Ada» и нравятся. И ещё «Dylan».
                Ответить
            • Sub Bagor
              End Sub
              
              If ... Then
              End If
              
              With X
                 .koko = 1
              End With

              В Дилане пошли ещё дальше. Сделали возможность указывать какой именно блок оканчивается.
              При этом всё кроме End опционально.
              define method bagor
              ...
              end method bagor; //последние два опциональны


              Таким образом на простых блоках пишется End.

              Зато на большой вложенности, или очень длинных методах, чтобы не запутаться можно писать полностью.
              Ответить
              • В каком-то шаблоноговне я такое видел, в джанге что-ли
                {% block foo %}
                хуй
                {% endblock foo %}


                Имхо, скобочки с отступами отлично решают эту проблему, особенно когда vim их подсвечивапет, и прыгает по ним по проценту.

                Правда, бывают блоки на три экрана конечно, там у закрыскобки можно и комментнуть
                Ответить
                  • лол да, в пыхе же есть свинтаксис из endif, я и не думал, что о нём кто-то помнит
                    Ответить
                    • В пыхе endif обычно используют в шоблонах страниц. Реальный пример:
                      <div>
                      <?php if ($sex === 'M'): ?>
                          <span>Петух</span>
                      <?php elseif ($sex === 'F'): ?>
                          <span>Курочка</span>
                      <?php else: ?>
                          <span>Не знаю</span>
                      <?php endif; ?>
                      </div>

                      За пределами шоблонов страниц такой синтаксис почти не встречается.
                      Ответить
                      • <?php else: ?>
                            <span>Non binary</span>
                        <?php endif; ?>
                        Ответить
                  • Да, django templates похожа на jinja, только урезанее. В джанге можно и jinja подключить.

                    Вербозное неудобное говно на самом деле.
                    <th scope="col"{{ header.class_attrib }}>
                       {% if header.sortable %}
                         {% if header.sort_priority > 0 %}
                           <div class="sortoptions">
                             <a class="sortremove" href="{{ header.url_remove }}" title="{% translate "Remove from sorting" %}"></a>
                             {% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktranslate with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktranslate %}">{{ header.sort_priority }}</span>{% endif %}
                             <a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% translate "Toggle sorting" %}"></a>
                           </div>
                         {% endif %}
                       {% endif %}
                       <div class="text">{% if header.sortable %}<a href="{{ header.url_primary }}">{{ header.text|capfirst }}</a>{% else %}<span>{{ header.text|capfirst }}</span>{% endif %}</div>
                       <div class="clear"></div>
                    </th>{% endfor %}
                    Ответить
                    • Именно поэтому я за

                      (define (template section body)
                        (response/xexpr
                         `(html
                           (head (title "Al's Church: " ,section))
                           (body
                            (h1 "Al's Church: " ,section)
                            (div ([id "main"])
                                 ,@body)))))
                      Ответить
                      • Гомоиконный шаблон, да еще и случайно забыть скобочку не получится.
                        Классно!
                        Ответить
      • У меня «Школоло» ассоциируется с «Бейсиком», ну в крайнем случае с «Visual Basic».
        Ответить
      • Типа ABC это До бимоль, до и додез? (я не умею в музык, я так спизднул)
        Ответить
        • Это ля, си-бемоль (в немецкой нотации) или си (в английской нотации), до.

          Есть путаница в нотациях: немцы ноту «си» обозначают как «H», а буква «B» у них обозначает «си-бемоль», а вот у англичан буква «B» обозначает просто «си». Связано это, вероятно, с тем, что в средневековых музыкальных инструментах когда-то не было ноты «си», а «си-бемоль» была.

          Если что, «бемоль» означает понижение на полтона (обозначается значком, похожим на мягкий знак), а диез — повышение на полтона (обозначается значком, похожим на решётку).

          Т. е. ряд «до-ре-ми-фа-соль-ля-си» немцы записывают как «CDEFGAH», а англичане — как «CDEFGAB». Почему буква «A» означает ноту «ля», я не знаю.

          У итальянцев нет однобуквенных сокращений, они пишут: «do-re-mi-fa-sol-la-si».
          Ответить
          • Что за анскильный питушизм называть ноты буквами? Это для анскильных питухов, у которых только одна октава?
            Ответить
            • В других октавах циферку припишешь. Типа посреди клавы у тебя C4.
              Ответить
              • Неканоничненько. С4 это, скорее, кварта из до мажор (аккордом это сложно назвать, да)
                Ответить
                • Тупые пендосы так обозначают октавы. Нулевой они называют субконтроктаву или типа того, поэтому наша первая для них четвёртая. Всё не как у людей.

                  А в других местах, да, цифры обозначают интервалы или аккорды.
                  Ответить
                • Да бесят на самом деле все эти системы записи... Такое жуткое легаси, как-будто стандарт крестов по второму разу читаю.

                  Взять тот же басовый ключ, где весь маппинг съехал. Ну сдвиньте его блять на одну линейку вверх, Си малой октавы всё равно нормально читаться будет. Нет, будем учить 2 отдельных маппинга.
                  Ответить
                  • Борманд, ты на чем-нить играешь?
                    Ответить
                    • Пианино понемногу тыкаю. Решил таки попробовать на старости лет.
                      Ответить
                      • Да-а, а вот у Васьки из третьего подъезда уже вторая жена и трое детей и Лада. И гараж он ещё купил, и дачу собирается.

                        А ты пианино тыкаешь.

                        Тьфу на тебя!
                        Ответить
                        • Сидишь, как сыч
                          Выключи комплюктер, дай ему отдохнуть
                          Ответить
                  • Два? А ты знаешь, что кроме скрипичного (ключ «G») и басового (ключ «F»), есть ещё ключ «C», который может располагаться на любой строке (частный случай ключа «C» — альтовый ключ). Сдвинутые ключи любят те, кто играет на духовых инструментах. У них вообще всё не как у людей, потому что диапазон звуков духовых инструментов ограничен.
                    Ответить
                    • Ну для разных инструментов это ещё ладно. У меня вот шаблон порвало что для одного инструмента надо сразу джва маппинга задрачивать. Не считать же полоски каждый раз.
                      Ответить
                      • А у меня шаблон порвало от дискриминации чёрных клавиш. Явно расист какой-то придумал пять из двенадцати звуков октавы обозначать неудобным способом.
                        Ответить
                          • На клавикордах традиционно большие клавиши были чОрными, а маленькие — белыми. А вот на клавесинах вроде бы цвета были как на рояле.

                            Почему у клавикордов такая инверсия раскраски, не знаю.
                            Ответить
                            • P.S. У клавесинов гуглится и такая, и такая раскраска. И клавикорды тоже обеих раскрасок гуглятся.
                              Ответить
                          • Я в «Ютубе» нашёл антиблм-пианино: из одних белых клавиш.

                            Как я понял, их бывает два типа:

                            1. С диатоническим рядом (чёрные клавиши тупо удалили). Играть на них пиздец как сложно, потому что трудно найти ноту «до», а если сместиться по такому ряду, то тона и полутона не будут совпадать.

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

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

                      и сидишь ты такой дома при лучине, сочиняешь под сдачу к сроку, записываешь партии на оркестр из скрипки, виолончели, духовые - тебе как раз не дохера надо потом ремап делать из "левой руки" в понятный смычкобляди листинг, ты сразу записываешь как надо

                      да и ксероксов не особо было в то время
                      Ответить
                      • Кстати, как скрипачи играют в оркестре? Скрипка — безладовый инструмент, на ней в принципе нельзя точно взять ноту (исключение — открытая струна).

                        Скрипачи пердолятся, чтобы подогнать высоту своих звуков под другие инструменты, или неточность звучания маскируется эффектом вибрато?
                        Ответить
                        • Ну там же все пердолятся и подгоняют высоту перед началом выступления. А дальше слух да задротство - интервалы между нотами ты и без оркестра должен правильно играть, иначе хуйня получится.

                          Но я сварщик не настоящий, могу ошибаться.
                          Ответить
                        • скрипачи едва ли не самые ебнутые и задроченные в этом всем пиздеце. но подозреваю, что за время вступления можно успеть взять нужный интервал.
                          Ответить
                      • > ранние клавесинные произведения

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

            ну и плюс ля первой октавы = 440 гц, настройка всегда относительно нее ведется
            Ответить
            • Да там, емнип, все от разных мест считали и как попало настраивали пока камертоны не научились делать.

              Относительные интервалы соблюдаются - уже норм. Абсолютную высоту большинство людей всё равно не воспринимает, плюс-минус несколько тонов не заметят.
              Ответить
          • больше всего у меня горело от того, что ми и фа-бемоль - это сука разные вещи
            Ответить
            • Разве? Надо погуглить. Просто ми-фа это как раз полтона вроде. И си-до, если не ошибаюсь. А во всех остальных случаях тон.

              Поправьте, если пизжу
              Ответить
              • звуки [в равнотемперированном строе] одинаковые, а вот с точки зрения всякой там гармонии это разные ноты
                Ответить
            • Они совпадают только в 12-тональной равномернотемперированной шкале. В других темпераментах они могут не совпадать, проверь. Например, в исторической пифагоровой шкале они не совпадали.
              Ответить
              • Какие характеристики звука необходимы, чтобы узнать ноту? Какие алгоритмы применяются в цифровых тюнерах?
                Ответить
                • от тональности зависит, грубо говоря у тебя в одной тональности будет фа-диез, в другой ля-бемоль. а звук одной и той же частоты, да и клавиша на фортепиано тоже.
                  Ответить
            • Именно по этому я за "три аккорда": P,H,P'
              Ответить
            • Да, ABCDEFGA — это эолийский ряд, он же гамма «ля-минор» (если считать, что B — это «си»). А вот от «до» до «до» — это мажорная гамма (она же ионийский ряд). Возможно, когда-то в миноре играли чаще, потому «A» — это «ля».
              Ответить
      • Сначала обрадовался, решив, что таки встретил обсуждение ранее не обсуждавшейся на ГК темы, а потом вспомнил, что пару лет назад разные строи уже обсуждали.
        То обсуждение не нашёл, только два других из разных эпох: https://govnokod.ru/6055#comment79214, https://govnokod.ru/16219#comment237953.
        Ответить
        • Лол, это еще было в ту пору, когда тарасы на паскалях писали

          Надо бы каллиграфа вызвать, он охуенный
          Ответить
          • Та не, второе это эпоха среднего стертора, когда он уже сидел под файками, но ещё не пизданулся окончательно
            Ответить
            • Первая ссылка это достерторовая эпоха: это ранний тарас (докрестовый еще, на селероне), может быть даже позний вебкилл.

              Довольно милое время. Населено было абсолютами, калиграфами и прочими неплохими крестовичками.

              Вторая ссылка это уже стерторщина конечно, катастрофа старого говнокода
              Ответить
    • А правда, что хуй таких размеров (ну, не таких, но, например, вот такой, какой называют bbc) из-за этих самых размеров никогда не получит полноценную эрекцию?
      Ответить
      • Нужно видимо взять кровяное давление, и как-то посчитать.
        Ответить
        • [расизм]Надо ещё мозгу что-то оставить. Может поэтому негры в среднем тупее?[/расизм]
          Ответить
    • Questo sito fa uso di cookie per migliorare l’esperienza di navigazione degli utenti e per raccogliere informazioni sull'utilizzo del sito stesso. Utilizziamo sia cookie tecnici sia cookie di parti terze per inviare messaggi promozionali sulla base dei comportamenti degli utenti. Può conoscere i dettagli consultando la nostra privacy policy.

      [Sono d'accordo]
      [Non sono d'accordo]
      [Leggi di più]

      Ну и какой из вариантов мне выбирать?
      Ответить
      • Вроде первый вариант означает «Я согласен», второй — «Я несогласен». А что означает третий?
        Ответить
            • Опровергаю. У меня установлено специальное расширение, которое позволяет выделенный текст переводить на «PHP»: https://i.imgur.com/yZztz9q.png.
              Ответить
              • >> которое позволяет выделенный текст переводить на «PHP»

                Хочу такое. Выделяешь на каком-нибудь сайте фрагмент текста на любом языке программирования, и получается нямка.
                Ответить
      • Жми куда угодно, главное не забудь пожелать геморроя бюрократическому говну из ЕС, которое заставило этот анальный рак про куки пихать на все сайты

        Сука, самое бесполезное изобретение в мире, даже фонарик на солнечных батареях полезнее
        Ответить
        • именно поэтому я за «жать accept не читая и соглашаясь непонятно с чем»
          Ответить
  • блядь, нам офис закрыли до конца года
    всё
    пизда
    уйду в курьеры

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

      если дома нет маленьких детей, то че бы и дома не посидеть
      Ответить
    • Хорошо, что у нас всё заебись. Сижу в пустом офисе кайфую. Меня посадили в кабинет с двумя девушками, и они на следующий день ушли то ли в отпуск, то ли обратно на удаленку, только имя успел узнать.
      Ответить
    • Иди оффтопь в пиздец оффтоп, тут для «PHP» тред.
      Ответить
  • Вчера мобильный фф обновился до какой-то совершенно новой нескучной версии.

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

    А ещё удалил ВСЁ, включая куки, настройки, дополнения и даже кастомные поисковые движки.

    Зато адресная строка в нужном месте блять
    Ответить
    • >мобильный фф обновился до какой-то совершенно новой нескучной версии

      Ух ты. Похоже не один я такой упоротый, чтобы ставить Гiгетох на телефон.

      >А ещё удалил ВСЁ, включая куки, настройки, дополнения и даже кастомные поисковые движки.

      Именно поэтому я против «автообновлений».
      Ответить
      • Да в общем мне казалось, что я автообновления выключал, но то ли мне это приснилось, то ли ведро после своего обновления решило, что неча пану дурковать.

        > не один я такой упоротый, чтобы ставить Гiгетох на телефон
        - я не вижу альтернатив. Но лиса не радует в последнее время. На ноуте ушёл на esr, потому что последние версии почему-то начали произвольно сбрасывать зум страниц до 100%.
        Ответить
          • > Chromium-based
            - ну то есть альтернатива лисе это только хромиум различной степени зондированности.
            Ответить
            • >хромиум различной степени зондированности

              А какие есть зонды в опенсорсных сборках?

              Ну допустим гугловый DNS. Ну предположим проверка у гугла вредоносных сайтов. Это и ФФ делает по дефолту. Хз отключается ли оно в хроме.

              И дефолтный гугл-поиск — вовсе мелочь.
              Ответить
              • Надеюсь, никаких. Но это ж надо нормально так потратить времени на аудит, чтобы убедиться.

                Тут дело даже не в зондах, а в том, что один движок заполонил практически всё.

                Сегодня выбирать вообще не из чего.
                Хочешь браузер? Ну вот тебе хромиум/хром или полумёртвый фф.
                Хочешь мобильник? Пожалуйста, один форм-фактор и аж две операционки, обе достаточно говняные.

                Застой какой-то.
                Ответить
                • А какой аудит?
                  Запустил wireshark браузишь, и попутно смотришь на какие хосты оно ходит.
                  Можно даже не браузить, а наблюдать за сетевой активностью ОС и браузера.
                  Много познавательного

                  >Хочешь браузер? Ну вот тебе хромиум/хром или полумёртвый фф.
                  Это на самом деле неплохой выбор.

                  Интернет другой к сожалению выбрать нельзя. Кругом тормозные говносайты с кучей перделок, рекламы, трекеров, майнеров и просто питушни.
                  Ответить
    • Иди оффтопь в IT оффтоп, тут для «PHP» тред.
      Ответить

Добавить комментарий для Myxa Отменить ответ

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8