Jawa / Говнокод #26435 Ссылка на оригинал

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
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
package clojure.lang;

import java.io.Serializable;
import java.util.*;

public abstract class APersistentVector extends AFn implements IPersistentVector, Iterable,
                                                               List,
                                                               RandomAccess, Comparable,
                                                               Serializable, IHashEq {
int _hash;
int _hasheq;

public String toString(){
	return RT.printString(this);
}

public ISeq seq(){
	if(count() > 0)
		return new Seq(this, 0);
	return null;
}

public ISeq rseq(){
	if(count() > 0)
		return new RSeq(this, count() - 1);
	return null;
}

static boolean doEquals(IPersistentVector v, Object obj){
    if(obj instanceof IPersistentVector)
        {
        IPersistentVector ov = (IPersistentVector) obj;
        if(ov.count() != v.count())
            return false;
        for(int i = 0;i< v.count();i++)
            {
            if(!Util.equals(v.nth(i), ov.nth(i)))
                return false;
            }
        return true;
        }
	else if(obj instanceof List)
        {
		Collection ma = (Collection) obj;
		if(ma.size() != v.count() || ma.hashCode() != v.hashCode())
			return false;
		for(Iterator i1 = ((List) v).iterator(), i2 = ma.iterator();
		    i1.hasNext();)
			{
			if(!Util.equals(i1.next(), i2.next()))
				return false;
			}
		return true;
		}
	else
        {
		if(!(obj instanceof Sequential))
			return false;
		ISeq ms = RT.seq(obj);
		for(int i = 0; i < v.count(); i++, ms = ms.next())
			{
			if(ms == null || !Util.equals(v.nth(i), ms.first()))
				return false;
			}
		if(ms != null)
			return false;
		}

	return true;

}

Я решил попробовать Clojure: скачал Intellij Idea Comunity Edition поставил Cursive. Кодил значится, кодил, решил посмотре реализацию некоторых функци, начал шерстить по исходникам и дошел до джавовских исходников реализации кложура. Идея мне любезно предложила вместо декомпилированого кода скачать исходники и читать их. Я согласился и скачал, после чего увидел это. Исходное форматирование сохранено.
Это пиздец, товарищи. Кложур как язык - очень хорош, вот прям очень. Но мне в голове не укладывается что вот эта патлатая курва https://github.com/richhickey создатель такого крутого языка, не умеет в форматирование кода. Весь репозиторий - тупо рандом. Как блять, можно делать реализацию языка и даже блять не сделать код стайл. Вы можете подумать, что это и есть код стайл. Но хер там плавал, местами есть привычное джавовское форматирование, местами куча закоментированного кода. Короче полный бардак. Вот, наслаждайтесь https://github.com/clojure/clojure

На самом деле я не сильно то и разочарован. Да и вообще, я пытался смотреть видео с его докладами - меня просто тошнит от него. Тошнит точно так же, как от препода из универа, который вроде бы и шарит, вроде бы и что-то рассказывает, но без малейшего энтузиазма - просто поток текста, монотонный и неинтересный. У человека просто нету таланта/желания именно донести и поджечь интерес.
За создание кложура я его уважаю. Мне просто непонятно, как человек который создал такой хороши язык, не имеет понятия код стайл. Ваши мисли?

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

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

  • От Java (или что это за параша) я другого не ожидал.
    Ответить
    • да... хуже джавы только пи-аш-пи
      Ответить
      • приведи реальный пример, где пи-аш-пи хуже джавы
        Ответить
        • * когда надо чото рефакторить или делать find usage
          * когда надо не выводить ошибки в браузер
          * когда надо многопоточность
          * когда надо профулироваться удобно
          Ответить
          • > когда надо чото рефакторить или делать find usage

            ctrl + shift + r, ctrl + shift + f

            > когда надо не выводить ошибки в браузер

            error_reporting(0);

            > когда надо многопоточность

            нет многопоточности - нет рейс кондишена!

            > когда надо профулироваться удобно

            ты просто не успел привыкнуть к «microtime(true)»‎
            Ответить
            • >ctrl + shift + r, ctrl + shift + f


              Очень удобно переименовывать, например, метод "getId()", который есть у трех десятков классов.

              >error_reporting(0);
              Куда они будут выводиться, кстати?

              >нет многопоточности - нет рейс кондишена!
              Нет программы -- нет проблем. А фоновые задачи можно делать по крону.

              >ты просто не успел привыкнуть к «microtime(true)»‎
              Я еще хотел написать про проблемы удаленного дебага, но потом вспомнил, что есть же "echo"
              Ответить
              • > Куда они будут выводиться, кстати?
                Лол, никуда.
                > Нет программы -- нет проблем. А фоновые задачи можно делать по крону.
                Лол, так и делают.
                > есть же "echo"
                Воистину.
                Ответить
                • А если томрозит, то всегда можно поменять двойную кавычку на одинарную
                  Ответить
                    • На самом деле написать что-то рабочее, худо-бедно масштабируемое, без SQL-инъекций можно в том числе и на "PHP". Но для этого программист должен держать в голове некоторые нюансы.

                      * Нужно не забыть перепидорасить "php.ini", в частности установить правильный "error_reporting" и не забыть выключить "display_errors" на продакшоне. Есть еще куча всякой магии, меняющей, блять, поведение самого приложения, типа "request_order", "magic_quotes", "session.save_handler" и ещё куча всякого говна.
                      * Нужно повесить свой "error_handler", преобразующий классические пыхоошибки в исключения. Так достигается хоть какая-то ко-ко-ко-нсистентность в обработке ошибок, но не всех, об этом тоже нужно помнить.
                      * Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения, композер в случае их отсутствия может только обосраться.
                      * Держать бутстрап приложения максимально легким. Да, дорогой джавист, тут парсить 640-килобайтные XML-конфиги - это моветон. Доводилось видеть, как чтение уебских конфигов становилось реально узким местом и такое говно "конпелировали" в "PHP" с дальнейшим помещением в "opcache". Выглядит экстравагантно, но работает действительно на порядок быстрее.
                      * Помнить, что нельзя сравнивать хеши паролей через "=="
                      * Не забыть установить мемкеш на локалхост. Наверняка захочется иметь быстрый компактный кеш, но шарить память между реквестами нельзя by design. (inb4: ололо, есть же шаред мемори)
                      * Настроить crontab с фоновыми задачами.
                      * Зареврайтить все урлы на index.php средствами веб-сервера.
                      * И помнить целый чемодан нюансов и исключений, коими изобилует практически каждая сраная функция

                      Итого получаем, что хороший "PHP"-разработчик - это такая нихуёвая зубрилка с солидным багажом знаний, применимых только в области укрощения взбесившегося шаблонизатора, а ведь все потраченные усилия человек мог направить в более полезное и широкоприменимое русло. Нахуй так жить?
                      Ответить
                      • >> Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения

                        Это самый главный багор. Если у тебя несколько сайтов на одной машине, ты должен сначала вычислить объединение (в смысле теории множеств) расширений, требуемых каждому сайту, руками их поставить (через «PECL» ставится не всё) и прописать в «php.ini». В результате из-за одного сайта, требующего хитрое прожорливое расширение, у тебя интерпретатор будет прожорливым.
                        Ответить
                        • А еще сайты ВНЕЗАПНО могут потребовать разные мажорные версии одного и того же расширения, и тут Зеев предлагает нам только соснуть. Именно поэтому я за "Docker".
                          Ответить
                          • Да, тут уже выяснили, что расширение «pecl_http» имеет как минимум две мажорные версии (это было на момент обсуждения; теперь их уже три) с несовместимым интерфейсом. Причём в новой версии отсутствует часть функционала старой. И это не что-то сверхъестественное, это всего лишь расширение для работы с протоколом «HTTP».
                            Ответить
                      • «magic_quotes», к счастью, удалили в 5.4.

                        Часть параметров можно менять на лету вызовом функции ini_set. Они помечены в таблице как PHP_INI_ALL:
                        https://www.php.net/manual/en/ini.list.php

                        "error_reporting" и "display_errors" как раз относятся к таким динамически изменяемым.

                        Остальные параметры можно устанавливать только глобально в php.ini. Какой багор )))
                        Ответить
                        • > magic_quotes
                          Кстати, там новую "защиту" завезли, с мышиным обучением. https://wiki.php.net/pecl/mysqlnd_poc_plugins#sql_injection_protec tion_plugin_-_peclmysqlnd_sip
                          > The SQL injection protection plugin attempts to detect and block malicious SQL statements. It has two operational modes. In the learning mode it records all SQL statements and remembers them. The recorded statements are considered safe. Recoding shall be done in a safe environment, for example, in a test environment. In the operational mode the plugins verifies that all SQL statements match the lift of safe statements. All SQL statements that match are executed. The other ones are rejects. Execution is prevented.
                          Ответить
                          • Охуенный способ сделать стабильное приложение. Это проще конечно намного, чем использовать setParam
                            Ответить
                          • Страшновато.

                            1. Бывают запросы, которые ну очень редко выполняются. Т. е. я для обучения должен подготовить среду, в которой моё приложение создаст всевозможные SQL-запросы, включая те, которые оно делает раз в сто лет.

                            2. Как в рабочем режиме этот плагин отличит «хорошие» запросы от «плохих»?
                            Ответить
                            • Почему "SQL Injection" не бывает практически в проектах на других языках? Потому что "PHP" очень популярен?
                              Ответить
                          • Мне кажется, идея очень хорошая. Код дописывают не до уровня "я анскильный пхпушок, мне плевать на инъекции", а до уровня "ну кажись всё предусмотрел". Любой код ревью делается такими же питушками с ограниченной внимательностью на этапе компиляции (для динамической питушни), в рантайме сидит только админ, но он не читает логи. И тут дополнительная проверка входит в чат как раз кстати.

                            Системы такого уровня позволяют хоть немного заглянуть в будущее и отловить ошибки и атаки, которые ещё не изобрели.
                            Ответить
                          • Полнейшее и лютейшее говно, как и любая другая попытка применять «мышыное обучение» для блокировки чего-либо. Такая хуйня лишь обеспечивает недоступность сайта у нескольких процентов пользователей, а админу — 24/7 разгребания тикетов о ложных срабатываниях этого говна.

                            От «SQL-инъекций» прекрасно защитит какой-нибудь статический анализатор, который ругается на скармливание в «$connection->prepare()» любой динамически генерируемой строки (а всякие mysql_query(), разумеется, по-умолчанию идут нахуй).
                            Ответить
                            • Придётся изобрести софт с мышиным обучением, который будет разгребать это говно. А потом придётся изобретать софт с мышиным обучением, который будет разгребать разгребальщик этого говна.
                              Ответить
                            • В теории, от «SQL-инъекций» прекрасно защитит использование программиста, но хочется обойтись только оператором шаблонизатора
                              Ответить
                              • Программист - недетерминированная ненадёжная питушня, которая часто даёт сбои. Работает хуже, чем нешильдированная электроника в условиях сильных электромагнитных полей и радиации. Формализуемые алгоритмы следует исполнять на ЭВМ. Подвопроссную питушню следует анализировать статически автоматическим анализатором.
                                Ответить
                            • Это еще хррогий вариант, в ие антихсс фильтр мог сделать из нормальной страницы хсс.
                              Ответить
                                • загугли. ie xss protection vulnerability например.
                                  Ответить
                                  • Спасибо. Загуглил.

                                    The script on this page will alert a string.  Assume 
                                    that string is a persistent injection (where quote 
                                    <br>
                                    characters are filtered so that normal XSS is not
                                    possible).  IE8's filters can be abused to enable XSS
                                    <br>
                                    by providing a "gratuitous GET parameter".  For example,
                                    try <b>
                                    http://0x.lv/simple.html?foo=<script></b>
                                    <p>
                                    
                                    <script>alert('<img src=x:x onerror=alert(0)//>')</script>


                                    http://p42.us/ie8xss/
                                    Ответить
                      • >> такое говно "конпелировали" в "PHP"

                        Единственная вменяемая структура данных — массив.
                        Ответить
                      • Сравним с жабоёбом.

                        >в частности установить правильный "error_reporting"
                        Ошибки программы пишутся в logger, ошибки контейнера сервлетов (исключения итд) пишутся в его логер, который можно настроить на что угодно. В аутпут ничего не пишецо.

                        > Есть еще куча всякой магии, меняющей, блять, поведение самого приложения, типа "request_order",

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

                        >Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения
                        gradle собирает все зависимости приложения, и оно так деплоится.

                        >Держать бутстрап приложения максимально легким
                        Будстрап джавы делается один раз. Дальше она висит в памяти.

                        >Помнить, что нельзя сравнивать хеши паролей через "=="
                        Обычно есть всякафя высокоуровневая хуита типа spring-security или аутентификации контейнера сервлетов: руками пароли не нужно проверять.

                        >Не забыть установить мемкеш на локалхост.
                        Так как жаба висит в памяти, то можно кешировать просто в куче, хотя есть и готовые решения.

                        >Настроить crontab с фоновыми задачами.
                        И тут жабе ничего не нужно: она просто висит в памяти, и в одном из тредов переодически чото делает.
                        Статус можно хранить хоть в базе
                        http://www.quartz-scheduler.org/

                        >Зареврайтить все урлы на index.php
                        Заворот чего угодно в контейнер делается в дескрипторе развертывания, и является частью приложения. Роутинг внутри уже зависит от фреймворка.

                        Итого получаем: пхп умудрился просрать джаве по ВСЕМ пунктам. Джаве. Казалось бы: как можно быть говёней джавы?
                        Но ПХП смог!
                        Ответить
                      • > Помнить, что нельзя сравнивать хеши паролей через "=="
                        Почему?
                        Ответить
              • Ситуация когда тебе надо переименовать метод в куче классов не очень нормальная
                Ответить
            • >microtime(true)
              Главное true не забыть
              Ответить
  • Есть в мире человек, который знает все возможности vi?
    Ответить
    • есть, но он почему-то без конца пишет здесь про анусы
      Ответить
      • 90% мозга занял модулятор команд для vi, остальный 10%. доступные для всего остального, содержат полудохлые нейроны и поддерживают интеллект уровня осы.
        Ответить
        • Как хорошо, что «PHP» не требует такого количества нейронов, как «vi». Именно поэтому я за «PHP».
          Ответить
        • Да ладно, человек использует лишь малую долю мозга.
          Я верю, что человек может быть экспертом в С++, при этом виртуозно писать в vim, и знать еще два иностранных языка. Как минимум один человек в мире точно так может. Ну или два.
          Ответить
  • Ну всё-таки немного заметно, что у него есть какое-то форматирование, только какое-то припизданутое и мешание табов с пробелами всё портит.
    Ответить
    • В чёрном-пречёрном лесу на чёрной-пречёрной поляне стоял чёрный-пречёрный дом, а в нём — чёрный-пречёрный компьютер, подключенный к чёрному-пречёрному дизель-генератору. В этом доме чёрный-пречёрный мальчик однажды написал бэкэнд на «Java Script», и у него отвалилась жопа.

      Именно поэтому я за «PHP».
      Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

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


    8