Куча говна / Говнокод #27576 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
// And then I replaced the idiomatic Rust code for working with block like

    for (dline, (sline0, sline1)) in dst.chunks_mut(dstride).zip(tmp.chunks(TMP_BUF_STRIDE).zip(tmp2.chunks(TMP_BUF_STRIDE))).take(h) {
        for (pix, (&a, &b)) in dline.iter_mut().zip(sline0.iter().zip(sline1.iter())).take(w) {
            *pix = ((u16::from(a) + u16::from(b) + 1) >> 1) as u8;
        }
    }

// with raw pointers:

    unsafe {
        let mut src1 = tmp.as_ptr();
        let mut src2 = tmp2.as_ptr();
        let mut dst = dst.as_mut_ptr();
        for _ in 0..h {
            for x in 0..w {
                let a = *src1.add(x);
                let b = *src2.add(x);
                *dst.add(x) = ((u16::from(a) + u16::from(b) + 1) >> 1) as u8;
            }
            dst = dst.add(dstride);
            src1 = src1.add(TMP_BUF_STRIDE);
            src2 = src2.add(TMP_BUF_STRIDE);
        }
    }

What do you know, the total decoding time for the test clip I used shrank from 6.6 seconds to 4.9 seconds. That’s just three quarters of the original time!

And here is the problem. In theory if Rust compiler knew that the input satisfies certain parameters i.e. that there’s always enough data
to perform full block operation in this case, it would be able to optimise code as good as the one I wrote using pointers or even better.
But unfortunately there is no way to tell the compiler that input slices are large enough to perform the operation required amount of times.
Even if I added mathematically correct check in the beginning it would not eliminate most of the checks.

https://codecs.multimedia.cx/2021/05/missing-optimisation-opportunity-in-rust/

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

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

  • Начнём с того «идиоматический код» выглядит как дrustня, пахнет как дrustня и работает дrustня.

    А второй кусок и читается гораздо приятнее, и работает куда быстрее.

    > total decoding time for the test clip I used shrank from 6.6 seconds to 4.9 seconds
    Замена одного небольшого цикла ускорила ВЕСЬ декодер на 35%.

    Именно поэтому рассказы что у нас компиляция тупит из-за «навороченного супероптимизирующего конпелятора» — тупая пропаганда для подростков.
    Ответить
  • Overall, there are a few features and design decisions that limit Rust compilation speed:
    
        Macros: Code generation with macros can be quite expensive.
        Type checking
        LLVM: that's the default compiler backend for Rust, where a lot of the heavy-lifting (like code-optimizations) takes place. LLVM is notorious for being slow.


    Постоянно проигрываю с этого сектанткого аргумента «LLVM is notorious for being slow».

    Напоминает плохого танцора, которому то мешали туфли, то некоторые части тела.

    Коли не нравится LLVM, зачем было его воровать? Напишите себе быстрый компилятор на божественном Ruste, а мы посмеёмся.

    При том что сам аргумент о тормознутости шланга абсолютно лживый. Обычно компилю clang/llvm поскольку собирает он быстрее чем gcc.
    Ответить
    • > clang

      Шланг и гцц компилят изменившиеся файлы. А растишки вроде как весь проект целиком скармливают в LLVM. Вместе с зависимостями.
      Ответить
      • Для глобальной пессимизации, или иначе какие-нибудь генерики не взлетят?
        Ответить
    • 2018 год: Historically, the compiler has compiled your entire project, no matter how little you've changed the code. The idea with incremental compilation is that you only need to compile the code you've actually changed, which means that that second build is faster.

      2021 год: Incremental compilation is off by default for release builds, so few production builds should be affected. Miscompilations that can arise from the bugs in incremental compilation generate incorrect code in final artifacts, essentially producing malformed binaries, which means that in theory any behavior is possible. In practice we are currently only aware of one particular known miscompilation, but bugs due to incremental are notoriously hard to track down: users frequently simply rebuild after some light editing if they see unexpected results from their binaries, and this often causes sufficient recompilation to fix the bug(s).
      Ответить
      • Какой инкремент )))

        > unexpected results from their binaries
        Воть вить как. А я то думал там мате-ма-ти-че-ски доказанная кукарректность.

        У дrustунов сложность разбора чуть ли не O(N²). Но во всём виноват понятно дело llvm.
        Ответить
      • > users frequently simply rebuild after some light editing

        Кстати, это вполне распространённая практика на FPGA, когда пытаешься впихнуть невпихуемое да ещё чтобы на высокой частоте работало... У альтеры даже тула для брутфорса seed'а прилагается и кнопочка "мне повезёт".
        Ответить
        • У нас в одном проекте на джава это тоже распостраннная практика. Пока там депенденсы какие-то посчитаются, проще фул ребилд сделать
          Ответить
          • > депенденсы

            Вот кстати, хоть одна билд система решила проблему случайно удовлетворившихся зависимостей из-за которой все эти косяки с инкрементальностью и лезут?
            Ответить
            • что это значит?

              типа не надо было пересобирать, а пересобрали и получили багор?
              Ответить
              • Когда какая-нибудь хуй-ня в глубине проекта не собирается при быстрой (инкрементальной) сборке и потом всё глючит и пидорасит. Обычно лечится полным ребилдом.
                Ответить
                • Это обычно анскильный autotools делает полный ребилд при реконфигурации .

                  Cmake в этом плане гораздо лучше.

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

                  Меня успокаивает только одно: Still better than rust.
                  Ответить
                  • Да хуй с ним, полный ребилд не так страшен, как некорректная сборка...

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

                      Аа!! Четвёртая джава! Я отеку от того, что для преобразования листа Integer в массив интов нужно явно писать цикл!

                      Есть такие?
                      Ответить
                    • define `ёбнутый'
                      Я признаю, что в некоторых задачах (BLAS и подобное) функциональщина нецелесообразна.
                      Вот у ООП задач нет, тут всё ясно.
                      Ответить
                      • > у ООП задач нет

                        А как же написание статей о костылях, которые нельзя выразить средствами языка паттернах?
                        Ответить
                      • >Вот у ООП задач нет, тут всё ясно.
                        Гуи всякие, не?

                        Checkbox extends Button extends Widget, не?
                        Ответить
                        • Вот только гуйню последнее время шатает в сторону реактивки, а это уже фп...
                          Ответить
                          • Они умудряются это мешать между собой. Там есть и ООП, и реактивность
                            Ответить
                              • Хм. Никогда не думал что говноедство может войти у людей в привычку.
                                Ответить
                                • > говноедство

                                  Хех, придётся кому-то из нас перезайти за ООП'шников. Скучно, когда все на одной стороне.
                                  Ответить
                                  • Никлаус Вирт считает, что ООП — не более чем тривиальная надстройка над структурным программированием, и преувеличение её значимости, выражающееся, в том числе, во включении в языки программирования всё новых модных «объектно-ориентированных» средств, вредит качеству разрабатываемого программного обеспечения.


                                    Я за Вирта

                                    Вообще я мог бы сыграть за ООПидоров малость, но мне стыдно:-/
                                    Ответить
                                    • и какие новые модные «объектно-ориентированные» средства были включены в языки программирования за последние лет двадцать?
                                      Ответить
                                    • > Вообще я мог бы сыграть за ООПидоров малость, но мне стыдно:-/

                                      Мне даже в полит-тредах не было стыдно за всяких питухов заходить. Но чтобы за ООП... Нет.
                                      Ответить
                                      • > Мне даже в полит-тредах не было стыдно за всяких питухов заходить
                                        ++

                                        Вот кстати у wvxvw это очень недурно получалось.

                                        Он заходил с того что в C++/Java/C# неправильное, убогое ООП. А нормальное например в CL, где есть мультиметоды.

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

                                        Виртуоз.
                                        Ответить
                                        • wvxvw сливал в хламину «MVC», потому что у ма-те-ма-ти-ков нет никаких «view» и «controller».
                                          Ответить
                                          • > wvxvw сливал в хламину «MVC»

                                            Охуенный тред. Помню как читал, и ловил эстетическое удовольствие от унижения MVC-дешёвок.

                                            Жаль что хаброскоты это не читали.
                                            Ответить
                                            • Нашёл начало:
                                              https://govnokod.ru/16298#comment239203

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

                                                    зы: у джаги MTV
                                                    Ответить
                                                  • > Logic-Data-View-Controller-Service-Paradigma

                                                    В ООП архитектур интерактивного приложения n интерпретируется как количество нагромождений (наслоений) множества из n питулей. Например, для множества {Model, View, Controller, Service, Paradigma}:

                                                    MVVCP MVCSP MPCSP MCCSP
                                                    CVVCP CVCSP CPCSP SCCSP
                                                    MVMCP MVPSP MPPVP CCVSP

                                                    Мне ясно как спроектировать вариации естественно шанс есть чем надем на 4 и чем 64, но хотелось улучшить еще шанс потому:
                                                    мы возьмем рахитектуру 4 разположение 8, унас получается 8!/4!=MVCCS
                                                    1234 5678
                                                    мне пожалуста 1680 вариаций данной архитектуры.
                                                    Ответить
                                                    • > MVMCP MVPSP MPPVP CCVSP

                                                      D:(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC ;;;SU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CC DCLCSWRPWPDTLOCRSDRCWDWO;;;BA)

                                                      g: "Windows SDDL"
                                                      Ответить
                                                      • Мне эта хуйня однажды приснилась... после того, как я пытался выяснить, почему служба не стартует.
                                                        Ответить
                                                        • К Рамануджану во сне приходила богиня Кали, а инканусу — богиня кала.
                                                          Ответить
                                          • > wvxvw
                                            > у ма-те-ма-ти-ков

                                            ХАХАХАХАХА

                                            при всём уважении к израильтянину, но как-то экшонстриптиз слабо вяжется с ма-те-ма-ти-кой
                                            Ответить
                                              • я знаю, кто это


                                                а можно тут чуточку по подробнее?
                                                у меня есть код на яве.
                                                я использовал библиотеку blazeDS.
                                                я нашел этот код в гугле, и применил его.
                                                сжал в байтаррей.
                                                и закинул в localhost.
                                                вроде бы я все правильно сделал.
                                                но какие то глюки возникли.
                                                ошибки нету.
                                                но может байт аррей не правильно использую?!
                                                подскажите нубику.
                                                мне просто нужно сжать датасет в amf.


                                                многообещающее начало
                                                Ответить
                                    • > Вирт считает, что ООП — не более чем тривиальная надстройка над структурным программированием

                                      Вирт просто анскильный, завистливый лох, который обсирал всё чужое.

                                      Вечно завидовал более успешным языкам: гнал на Сишку, гнал на C++, гнал на Бейсик.
                                      При этом самый жопулярный язык, с синтаксисом унаследованным от Вирта ­— это Delphi...

                                      Когда его предложение Ады слили на конкурсе, они с Хоаром страшно бомбили по этому поводу.

                                      Ни один из его языков не стал мейнстримом.
                                      Ответить
                                      • Паскаль был очень даже мейнстримом в мире мака в 80-е и в ПК в 90-е
                                        Ответить
                                        • > Как Вы относитесь к языку Object Pascal, который лег в основу Delphi и какое участие Вы в нем принимали, если принимали его вообще

                                          >>Вирт: Когда вы программируете на Delphi, вы программируете на Паскале. Здесь ничего фундаментально нового нет. Но это была достаточно успешная разработка и во многих случаях помогала продвигать Паскаль. Я никак не участвовал в этой разработке

                                          «Это ООП, у кого надо ООП.»

                                          «ООП конечно хуйня, но ООП в моём Паскале — успех»

                                          Двуличная мразь.
                                          Ответить
                                            • > class

                                              В object pascal'е, насколько помню, был object. В делфи object остался как value type, а class как ссылочная хуй-ня на куче.
                                              Ответить
                                              • Всё так.

                                                В «Standard Pascal» не было ни class, ни object.

                                                Object появился в «Turbo Pascal 4.0», оттуда его подхватили все реализации «Object Pascal». Его можно было создавать и на стеке, и в сегменте данных, и на куче.

                                                Class появился в «Delphi», оттуда тоже был заимствован более новыми реализациями «Object Pascal». Добавили новую фигню вроде свойств с геттерами-сеттерами, но запретили создавать в сегменте данных и на стеке, прибили гвоздями аллокатор в куче, чтобы классами смогли пользоваться питухи анскильные. И обсыпали сахарком, чтобы не надо было писать оператор разыменования, тоже для питухов анскильных.

                                                У Вирта ООП было только в «Модуле-3».
                                                Ответить
                                              • К слову, был проект «KOL», поддерживаемый одним энтузиастом, — замена бормандовского «VCL»:
                                                https://ru.wikipedia.org/wiki/KOL

                                                Владимир Кладов решил, что «VCL» тормозит, потому что в бормандовской реализации «class» много оверхеда (обязательная аллокация в куче там, где она не нужна и т. п.), поэтому переписал все компоненты на «object». Естественно, от синтаксиального сахара вроде пропертис пришлось отказаться, заменив их явными вызовами методов.
                                                Ответить
                                          • > «Это ООП, у кого надо ООП.»

                                            > «ООП конечно хуйня, но ООП в моём Паскале — успех»

                                            "ООП" это такая эфемерная хуйня, что какой-нибудь питух может на структуру и какие-то функции работающие с структурой сказать "кокококок так это же ООП!!!"
                                            Ответить
                                            • Да, у "ООП" есть такое свойство, что если пятерых человек спросить что такое ООП, то будет пять разных ответов
                                              Ответить
                                              • всё же обычно ответа два и один из них приевшийся шутливый
                                                Ответить
                                        • в 80-е было как-то больно

                                          пасцаль, ранние кресты, достаточно старая сишка и обкектив в качестве bleeding edge

                                          гвозди бы делать из этих людей
                                          Ответить
                                          • И всё это в редакторе, по мощности напоминающим notepad, на экране шириной 80 символов и высотой 40, без SO и онлайн-документации
                                            Ответить
                                            • > по мощности напоминающим notepad

                                              Автоиндент вроде уже был. И подсветка. И отладчик. Турбо-ИДЕ очень няшные же были.
                                              Ответить
                                              • подсветка из двух цветов

                                                но подсветка до сих пор сосёт. где мой semantic highlighting в каждом редакторе?
                                                Ответить
                                                • Угу, оказывается, IDE на «Turbo Vision» вышла только вместе с «TP6» в 1990-м году. До этого там была IDE, похожая на «Кубасик», только ещё примитивнее.
                                                  Ответить
                                                  • Ну вот виите)

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

                                                    Для начала 90-х просто пиздец как круто для писюка-то

                                                    Не удивлюсь правда, если это всё в емаксе тоже уже было.


                                                    Кстати, а вот что было у яблока
                                                    https://en.wikipedia.org/wiki/Macintosh_Programmer%27s_Workshop

                                                    https://en.wikipedia.org/wiki/MacsBug
                                                    Ответить
                                                    • уже тогда был емакс
                                                      уже тогда был лишп

                                                      но пришли "у нас в контроллерах нет нихуя" и начались тёмные века
                                                      Ответить
                                            • Обычным разрешением было 80×25.

                                              80×50 — это был режим с анскильным шрифтом 8×8 пикселей, от которого резало глаза.

                                              Это уже в 90-е на «SVGA» появились разрешения 132 на что-то.
                                              Ответить
                                                • Я пользовался, брат жив. А что?

                                                  Да, по умолчанию запускалась в 80×25, надо было переключать самому в нужный режим. «Дос Навигатор» в этом режиме работал.

                                                  Насчёт борландовской IDE не помню. Вроде она хотела старые режимы с шириной 80.
                                                  Ответить
                                                  • > Да, по умолчанию запускалась в 80×25, надо было переключать самому в нужный режим

                                                    В смысле приложение переключало? Это не считается, потому что нужно все приложения патчить
                                                    Ответить
                                                    • Можно было ещё через MODE CON переключить или через сторонний софт, но приложения обычно переключали режим обратно, потому что были прибиты гвоздями к фиксированному разрешению.
                                                      Ответить
                                                      • Так то-то и оно. Приложения работали через API, предполагающий текстовый режим. Можно было вероятно заместить досвое прерывание и поддержать SVGA сосноль, но они соснули бы по причине незнания размеров экрана.

                                                        А уж если срали в память напрямую, то и вовсе пиши пропало.


                                                        Вот в прыщах и FreeBSD есть графическая консоль (в прыщах вообще издревле был fbcon).

                                                        Там приложение и не знает, на чём оно работает. Размеры может взять у структуры, связанной с терминалом через какие-то ioctl или терминальный API
                                                        Ответить
                                                        • «Турбо Вижн» срало в видеопамять, поэтому оно предварительно включало видеорежим, в котором умеет срать.

                                                          В «Дос Навигаторе» был пропатченный «Турбовижн». Он знал про «VBE» («VESA BIOS Extensions»).

                                                          А уж графических функций в «DOS» вообще не было, поэтому графические программы срали и в порты, и в память.
                                                          Ответить
                                      • Вирт не любил язык «Ада». Он считал, что её спецификация перегружена, поэтому назло создателям языка «Ада» Вирт создал «Оберон», в котором почти ничего нет.
                                        Ответить
                                        • Oberon это не только язык, но и ось, и хардварь (свой RISC проц). Вирт запилил свою TempleOS до того, как это стало мейнстримом.
                                          Ответить
                                  • Поддерживаю. Но трудно защищать позицию в которую не очень веришь.

                                    Вот с дискурсом Царя как-то проще. У него есть рациональное зёрнышко Фофмана.

                                    С другой стороны когда весь мейнстрим наконец-то проклянет ООП...
                                    Ответить
                                    • Есть какие-то потуги в эту сторону. В котлине уже можно писать функции без классов, например
                                      Ответить
                                        • Однажды в сообществе .net Майки распиарили метод установки софта простым копированием (т.н "xcopy method") без троганья реестра и установщиков.

                                          Это преподносилось как новый, крутой способ
                                          Ответить
                                            • У меня в контроллерах никакого "докера" нет вообще, просто заливаешь прошивку через программатор и всё работает, ПРЕДСТАВЛЯЕТЕ?
                                              Ответить
                                              • > У меня в контроллерах никакого "докера" нет вообще

                                                Можешь билдить прошивку в докере чтобы не надо было ничего настраивать и ставить на хосте.
                                                Ответить
                                                • >Можешь билдить прошивку в докере чтобы не надо было ничего настраивать и ставить на хосте.

                                                  Но в контроллере никакого докера от этого магическим образом не появится.

                                                  А билдить прошивку можно и в виртуалке, и на какой-нибудь VPS-ке, но от этого у меня в контроллере не появится ни виртуалки, ни VPS
                                                  Ответить
                                                      • Я бы не стал поднимать контроллер AD на Линуксе.

                                                        Потом будешь читать ошибки ``INVALID_HANDLE`` в логах винды, делать ``sfc /scannow`` и обращаться к системному администратору )

                                                        Алсо,
                                                        https://wiki.samba.org/index.php/Windows_2012_Server_compatibility#Other_ missing_features


                                                        AD и так таит в себе много сюрпризов (кто видал USN roll-back, тот на фильмах ужасов не боится) а еще и с линуксом его мешать
                                                        Ответить
                                                          • https://mvvrus.wordpress.com/2015/03/26/usn-rollback-great-and-powerful/

                                                            https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd363553(v=ws.10)#usn-and-usn-rollback

                                                            В AD каждый объект имеет монотонно возврастающий номер версии (USN), и информацию о том, какую версию на какой соседний контролер послали.

                                                            Когда объект изменяется, у него увеличивается этот номер, и он посылает обновления на другие контроллеры.

                                                            Вот ты восстанавливаешь контроллер из бекапа, и у него оказывается более древняя версия какого-то объекта.

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


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

                                                            Получается split brain.

                                                            Вот как про это написино в логах:
                                                            https://mvvrus.files.wordpress.com/2015/03/event2095.png

                                                            Поскольку в мире AD без AD не работает примерно всё, то баги начинаются феерические
                                                            Ответить
                                                            • > split brain

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


                                                                DC1: "У меня новая версия петуха, а у DC2 старая. Я ему сообщу, когда он будет онлайн"

                                                                DC2: "У меня новая версия курочки, а у DC1 старая. Я ему сообщу, когда он будет онлайн"

                                                                А вот если оба одновременно поменяют данные, то наверное победит тот, у кого более свежая версия.

                                                                Жопа с роллбеком именно в том, что DC1 уверен, что он уже передавал данные DC2.

                                                                А у DC2 их нет
                                                                Ответить
                      • > Я признаю, что в некоторых задачах (BLAS и подобное) функциональщина нецелесообразна.

                        Функциональщина может быть целесообразной на задачах типа "BLAS" если архитектура вычислителей хорошо ложится на ФП. Например, есть такие штуки, называются "systolic array"

                        Например вот https://cplu.medium.com/should-we-all-embrace-systolic-array-df3830f193dc - там в гугловых TPU по-сути массив вычислительной хуйни, по которой прокачиваются какие-то байтики. Чем вам это не ФП?

                        Или "ФП" в массовом сознании айтишников ассоциируется с каким-то типодрочерством, зависимыми типами там всякими, Хиндли-Милнером? Так вот, это не "ФП", это "программирование на типах". В кобенандном SKI исчислении никаких "типов" нет.
                        Ответить
                        • > Или "ФП" в массовом сознании айтишников ассоциируется с каким-то типодрочерством,

                          ..с отображением одной последовательности на другую, иными словами с методом "map" у класса с коллекцией
                          Ответить
                            • Косплей на ФП.

                              В труъ ФП, к примеру, было бы идиоматичнее заюзать композицию вместо массива.
                              Ответить
                            • Ну т.е. в твоём примере не ощущается, что функция -- это first-class object.
                              -- композим функцию из кусочков
                              f = mul2 . add2 . add2
                              -- теперь лифтим её, получая функцию, которая обрабатывает списки
                              m = map f
                              -- и можем процессить её сколько угодно списков
                              r = m a
                              Ответить
                              • Ну такое я тоже могу сделать, только это надо будет что-то типа интерпретатора запиливать, ну сделать REPL еще можно. Только лениво как-то...
                                Ответить
  • Rust это полная хуйня и говно, я ненавижу и презираю rusters, они днища, не намного лучше пхпидоров.

    Кстати, а есть файка PHPidor?
    Ответить
  • У жeны oкaзaлся любoвник, и я уeхaл, брoсив всё, в дaльнee Пoдмoскoвьe, гдe у мeня былa oднoкoмнaтнaя квaртирa
    Ответить
  • Я стал ласкать их. У них, был свой вкус. Не такой, как у Наташкиных, и не такой, как у других женщин, а особый, только ей принадлежащий, волшебный вкус.
    Ответить

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

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

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


    8