1. Java / Говнокод #14410

    +117

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    final class HackFormFlowPanel extends FormPanel {
    	...
    	
    	@Override
    	public void reset() {
    		GWT.log("Upload form reset suppressed");
    		// Overridden to do nothing.
    	}
    	
    	public void reallyReset() {
    		super.reset();
    	}
    }

    После успешного аплоада файла gwtupload говорит reset форме с элементом выбора файла. И никак не отключается. А нужно, чтобы файл оставался выбранным.

    Пришлось нагородить вот такой костыль.

    Запостил: someone, 24 Января 2014

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

    • Как-то недостаточно энтерпрайзно, можно же
      public class HackFormFlowPanel implements MethodReplacer {
        public Object reimplement(Object o, Method m, Object[] a) throws Throwable {
          GWT.log("Upload form reset suppressed");
          return null;
        }
      }
      <bean class="com.google.gwt.user.client.ui.FormPanel">
        <replaced-method name="reset" replacer="hackFormFlowPanel"/>
      </bean>
      <bean id="hackFormFlowPanel" class="HackFormFlowPanel"/>

      А потом это ХМЛ зазиповать, зип упаковать в джар, джар спрятать в мейвен репу, а мейвен репу перенести на локальный сервер.
      Ответить
      • В GWT нет reflection. И джаров тоже.
        Ответить
        • Так добавить же - раз плюнуть!
          Ответить
          • На яваскрипте в браузере замутить полноценную jvm с рефлексией и джарами? :)

            Впрочем после виртуального i386 на js, на котором крутится ядро линуха, и даже работает куча гну\линуксовых команд, включая gcc и tcpdump (для виртуальной локалки между двумя консольками, нарисованными на страничке), я уже ничему не удивляюсь...
            Ответить
            • Зачем в браузере? Есть же Мейвен, есть тулчейн в котором много Явы. Есть интерпретатор Явы, который идет в комплекте с GWT (для отладчика). Было бы желание.
              Ответить
              • Блин, мне весь этот пиздец напомнил о приблуде для принтера HP 1010, которая шла на диске с дровами.

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

                Главная фича была в том, что эта хрень представляла собой... ярлычок для браузера, в котором был прописан URL веб приложения на яве, которое крутилось на локальном Коте.
                Ответить
            • Похоже, @wvxvw добрался до спринга
              Ответить
              • Ну это похоже на то место, где я сейчас волею судьбы халтурю. Его отцы-основатели не знали ничего кроме Явы. И вот они слепили Фейсбук-приложение для продвижения малого бизнеса (сайт на +-50 страниц без затей и порывов, обычное формошлепство) с использованием как минимум половины доступных опенсорсных Явовских библиотек (только привязаных к проекту джаров общим весом более чем 200 Мб), там и куча Гугловских библиотек засветилась, и Велосити, и АнтЛР и... вобщем, когда у клипса просишь автокомплит, или поиск референса - как правило находится 4-5 одноименных классов, которые делают одно и то же.
                Счет исходников идет на тысячи.
                База данных выглядит фантастически изза ОРМа - каждый раз как кто-то переименовал класс привязаный к таблице, Хибернейт жеж не станет удалять старые... вобщем таблиц там тоже под тысячу.
                Ну и просто типичная для начинающих тяга к копипасте...
                Ответить
                • > База данных выглядит фантастически изза ОРМа - каждый раз как кто-то переименовал класс привязаный к таблице, Хибернейт жеж не станет удалять старые... вобщем таблиц там тоже под тысячу.

                  Ну ёперный театр, кто же оставляет включённым автообновление схемы в продакшене?!
                  Ответить
                  • Ну так а чтобы она не автообновлялась - это ж сложно... надо писать скипты установщики, автоматическое заполнение базы, а то и миграцию сделать иногда... а так: тут @Entity добавил, там @Column подмахнул - и все работает! Просто замечаетльно даже работает, пока вовнутрь не заглянуть.
                    Ответить
                • Добро пожаловать в ынтерпрайз. Описаны симптомы 146% типичных крупных жабо-проектов.
                  Ответить
                  • Не, интырпрайз я уже видел. Тут-то фишка в чем: два с половиной самоучки + один студент сваяли монстра, с которым теперь не знают что делать. Интырпрайз обязывает нанять армию рабов для поддержки проекта, и еще роту бюрократов, чтобы командовать армией рабов, ну и заставят документацию писать, баги, тесты, слеты и сходки пионеров героев... а тут все по-семейному: баги передаются как традиция - из уст в уста. Начальство... сам себе обычно и начальник и подчиненный и курьер, если сильно куда-то сходить нужно.
                    Ответить
                    • По опыту знаю что несколько студентов могут за пару лет создать столько проблем, что даже у видавших виды девелоперов по спине пробегает холодок, а ладошки становятся влажными
                      Ответить
                      • > По опыту знаю
                        По студенческому опыту?
                        Ответить
                      • Мне к типа-легкой-стажировке представили одного выпускника с некоторым знанием сишки и жабошника без ВО. Первый отказывается вектором пользоваться, второй говорит, как было хорошо в жабе и как плохо в цпп. Мне, блядь, страшно им что-то советовать, т.к. сам еще тот анскильный говнокодер. Ув. @roman-kashitsyn, не поделитесь опытом, что мне делать?
                        Ответить
                        • > Первый отказывается вектором пользоваться
                          А как он объясняет это нежелание?

                          > как было хорошо в жабе и как плохо в цпп
                          Надо его недельку пожержать на чистой сишке... Кресты сахаром покажутся ;)
                          Ответить
                          • > > Первый отказывается вектором пользоваться
                            > А как он объясняет это нежелание?
                            Молча игнорирует рекомендацию "используй вектор", в некоторых других случаях отмазывается универсальным "не нужно". Мутный тип, короче.

                            > > как было хорошо в жабе и как плохо в цпп
                            > Надо его недельку пожержать на чистой сишке... Кресты сахаром покажутся ;)
                            Тогда меня начальник пожержит куда надо и ввернет туда же болт чуть большего диаметра резьбы :)
                            Ответить
                            • > Молча игнорирует рекомендацию "используй вектор", в некоторых других случаях отмазывается универсальным "не нужно".
                              Царя на ГК так не хватает...
                              Ответить
                              • > > Молча игнорирует рекомендацию "используй вектор", в некоторых других случаях отмазывается универсальным "не нужно".
                                > Царя на ГК так не хватает...
                                ОМГ, неужели к нам устроился... Сам...
                                Ответить
                                • А, не, показалось. Этот не настолько уп(оро|ёр)тый.
                                  Ответить
                            • >>Молча игнорирует рекомендацию "используй вектор", в некоторых других случаях отмазывается универсальным "не нужно". Мутный тип, короче.

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

                              В какой-то момент свой собственный код станет выглядеть как набор символов.
                              И глазом не успеешь моргнуть, как окажешься в болоте крестоблядства, словно ынтырпрайзная жаба.
                              Участь твоя будет страшной, и с великим сожалением ты будешь вспоминать о простой и понятной как пять копеек сишке, как о своей первой и навсегда потерянной любви.
                              Ответить
                              • >простой и понятной как пять копеек сишке
                                Набор "Сделай сам велосипед"?
                                Ответить
                              • Лол, я сам сейчас удовольствия ради в свободное время сишную либу пишу, причём её пуре-сишность (-std=c89 -Werror -Wall -Wpedantic) внезапно оказалась ощутимым преимуществом.
                                Ответить
                                • > внезапно оказалась ощутимым преимуществом.
                                  А в чем это приемущество заключается
                                  ?
                                  Ответить
                                  • Её довольно просто получится интегрировать в одну стандартную прогу в GNOME, написанную, разумеется, тоже на пуресишечке. Если всё выгорит, скину ссылочки и пояснения. Сначала нужно получить согласия третих лиц и таки довести код до ума.
                                    Ответить
                                • >c89
                                  Но зачем?
                                  Ответить
                                  • > > c89
                                    > Но зачем?

                                    например потому, что виндовый компилятор даже в c99 не умеет.
                                    Ответить
                                    • >например потому, что виндовый компилятор даже в c99 не умеет.
                                      Виндовый - это VS, питухгцц на винде нет? Но зачем?
                                      Ответить
                              • Да, кресты опасны. Если не хватает силы воли - можно стать крестоблядями, как многие обитатели геймдева, и с головой утонуть в болоте никому не нужных крестоизвращений в духе конкатенации массивов постоянной длины. Если же силы воли хватает, то кресты-бусты - это всего лишь довольно удобный инструмент.
                                Ответить
                                • Где та грань между бормандом программистом и бормандом-крестоблядком? Как за неё не перейти и неначать писать крестушинный код, особенно когда в команде он поощряется? Я боюсь прийти в другу команду и после этого меня там назовут крестуханом и погонят ссаной метлой.
                                  Ответить
                          • Почему не на асме?
                            Ответить
                            • Потому что его нужно сломить, а не убить.
                              Ответить
                              • Асмом убить? Маловероятно. Нет, если он только жабу видел, да и в ней не разбирался....
                                Ответить
                          • > А как он объясняет это нежелание?

                            Тем, что он питушок пубертатного периода, считающий себя кульным хацкиром.
                            Ответить
                        • в программисты берут без во? это пиздец. где конкуренция?
                          Ответить
                          • Давно пора уже.
                            Ответить
                          • Как я уже где-то в другом месте писал: современный идеальный программист - это покладистый бюрократ заурядной внешности и колеблющийся только вместе с генеральной линией партии.
                            Практически все, что учится в рамках высшего образования, начиная с первого курса, в промышленном программировании не нужно. Даже не то, что не нужно, оно запрещено и сильно наказуемо. Программисту с десятилетним стажем и внушающим послужным списком даже не разрешат написать свои утилитные функции - из страха, что они будут работать неправильно и завалят проект в самый неподходящий момент, что тестеры, которые будут тестировать что-то менее тривиальное, чем школьная алгебра не справятся с задачей, что те, кто прийдет на смену не поймут код сложнее примеров из учебника.
                            Хороший программист, это такой, который умеет оперативно найти популярную (с упором на популярность, а не качество) библиотеку и скопировать код из документации к этой библиотеке слово в слово.
                            Высшее образование - только вредит, ведет к расстройству, краху идеалов, продолжительным запоям, депрессии, и в конце концов - суициду. Лучше просто сходить на стадион и поболеть за любимую команду. Нах этот институт.
                            Ответить
                            • >Практически все, что учится в рамках высшего образования
                              ... в рашке?
                              >, начиная с первого курса, в промышленном программировании не нужно.
                              Если в вузах нормально учат разработке - они нужны, но до какого-то уровня абсолютно не обязательны.
                              Ответить
                            • Как это грустно.... Для меня программирование - это творчество, а не копипаст
                              Ответить
                              • Программирование сегодня - это не творчество, это инженерная профессия с инженерным подходом.
                                Ответить
                        • Тут мой опыт не поможет :(
                          Мне кажется, пожёсче с ними надо. Код-инспекции проводить почаще, недолгие сессии парного программирования проводить. Заставлять, ЗАСТАВЛЯТЬ юзать вектор. Если бурчит, что не нужно, прям при нём переписывать на вектор и коммитить. В общем подавать пример и заставлять их соответствовать уровню, указывать им на ошибки, только без упрёка и высокомерия.
                          Хорошо ещё, что они моложе. У нас вот дядка-рокер лет под 40 работал, писал адский треш, но сказать ему об этом было как-то совсем неудобно...
                          Ответить
                          • Я так не думаю. Я думаю, что нужно выдавать формальные требования, и по этим требованиям и взыскивать.
                            Самое гнилое дело заставлять человека писать так, как он думает, что писать не нужно. Если код проходит тесты - принимать безоговорочно, при этом не надо делать вид, что код нравится. В конце концов, если затачиваться на длительное сотрудничество, люди предпочитают искреннюю справедливость двойным стандартам, даже если они преподносятся с лучшими намерениями.
                            Есть рационал в том, чтобы использовать более абстрактные коллекции, но этот рационал нужно осознать. В нем нужно самому убедиться делая тесты и считая любимые биты с байтами. Если человек сам этот путь не пройдет, за него его никто не пройдет. Худшее, что может случиться - он просто забьет и станет писать как скажут, не пытаясь разобраться в том, что же происходит (99% всех программистов, которых мне приходилось наблюдать вживую). И в проекте будет восновном мистическая паста из недопонятых скопированых из интернета примеров.
                            Ответить
                            • я работал в компании с такими формальными требованиями полтора года. Всё это ведёт к стагнации и застою. Требования есть, тесты есть, формальные код-ревью есть.
                              Код - лютое гавно, которые все бояться трогать.

                              Нормальные код-ревью это отличный способ подтянуть уровень всей команды. У нас сейчас такие, и я всё никак не нарадуюсь. Даже люди без особого знания языка могут замечать такие вещи, которые сделают код опытных людей лучше.
                              Ответить
                              • У меня был опыт переписывания кода врезультате код-ревью, абсолютно бессмысленно, и в большинстве случаев хуже оригинала. Но о качестве было сложно судить, т.как на формальные требования было всем насрать. Работал ли код быстрее или медленнее, сколько объема он занимал - было второстепенным фактором. Главное нужно было угодить извращенному вкусу тимлида (человек, который всю жизнь программировал на вижуал-Ц++, и вдруг решил, что он знает как нужно программировать на ж.скрипте). Например, вышописаная личность свято верила в то, что циклы - хорошо, а функции высшего порядка - плохо.
                                Ответить
                                • Вам просто люто не везёт по жизни, возможно, на вас порча. Но скорее всего, вы просто необоснованно считаете себя умнее окружающих, и им это не нравится.

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

                                  Когда критика обоснована, она очень полезна. У нас сейчас проводится довольно тщательный код ревью на все изменения в системе. Это очень помогает.
                                  Ну и прошедший ревью код тут пока самый лучший из всего, что я видел вне опенсорсных проектов. Но тут многое, конечно, зависит от уровня команды.
                                  Ответить
                          • Благодарю, дельные советы. Попробую быть жестким как defecate++. В конце концов они сами подписывали договоры :)
                            Еще, наверное, effective C++/STL подарю коллективу.

                            > У нас вот дядка-рокер лет под 40 работал, писал адский треш, но сказать ему об этом было как-то совсем неудобно...
                            И чем закончилось?
                            Ответить
                            • Насчет утечек и т.п. - можно гонять код сишника под valgrind'ом или его виндовыми аналогами, а потом тыкать его носом в утечки памяти. И так каждый день, пока не научится юзать векторы и смартпоинтеры :)
                              Ответить
                            • Я разве жесткий?

                              где и, главное, зачем вы таких упоротых набрали, между прочим?

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

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

                              ну это при условии, что работник адекватен

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

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

                                > зачем вы таких упоротых набрали
                                Видимо, упоротые критерии отбора, раз уж даже меня взяли :)

                                > новую позицию работник должен понять и принять
                                Ну, тот сишник чем-то на меня похож - не доверяет не поняв и не проверив. Я тому же бусту не доверял, пока не познакомился с ним поближе. Второй - податлив аки пластилин. Разглагольствовал, насколько джава хороша, но через месяц вяленьких вбросов "джава тормозит" и т.п. сам начал её обсирать. Похоже, у меня начинает проклевываться стратегия их крещения
                                Ответить
                                • но ведь жаба в самом деле тормозит! :(
                                  Ответить
                                  • Гейдевка?

                                    "Жава не для того, чтобы выжать 99%, жава для того, чтобы выжать 85% и сравнительно легко распараллелить на кластер" (с) инет.
                                    Ответить
                                    • я бы посмеялся вместе с тобой, если бы всё не было так печально
                                      Ответить
                            • > И чем закончилось?
                              Работает всё там же. Там крупная система документооборота, разными модулями занимаются разные люди. Думаю, пока он успешно выполняет поставленные задания и здоровье у него крепкое, в его код особо никто не лазит...
                              Ответить
                          • > Если бурчит, что не нужно, прям при нём переписывать на вектор и коммитить
                            Ого как жестко. Я ему скажу отъебись от моего компа. Не ты мне зарплату платишь.))))))))))
                            Ответить
                            • Позовите бухгалтера тогда, пусть он перепишет.
                              Ответить
                          • > У нас вот дядка-рокер лет под 40 работал
                            У нас был дядька-рокер лет под 40. Писал только на сишке под микроконтройлеры. Теперь пишет на крестах ооп+паттерны+стл+буст+шаблонные петушения
                            Ответить
                            • > Теперь пишет на крестах ооп+паттерны+стл+буст+шаблонные петушения
                              И слушает дабстеп?
                              Ответить
                              • не, дабстеп для тех, кто пишет на руби
                                Ответить
                                • Ээээй!
                                  Ответить
                                  • язь?
                                    Ответить
                                    • руби - няшный, дабстеп - нет.
                                      Ответить
                                      • раз он няшный, значит удел рубистов слушать клёвых тёлок из токио хотел?
                                        Ответить
                                      • жс более няшный, чем руби. В руби какая-то беда с лямбдами и вызовом функций. Чтобы вызвать аналог лямбды, надо покурить какую-то магию. Плюс, пробелы перед скобками и наличие скобок при вызове функций имеют значение (f x, f(x), f (x), f({|x|x}) f {|x|x})
                                        В жс нет различий при использовании между лямбдами и обычными функциями.
                                        var f = function(x){ return x*x; };
                                        var apply = function(f, x){ return f(x); };
                                        function g(x){ return x*x; }
                                        function apply2(f, x){ return f(x); }
                                        var apply3 = apply2;
                                        var results = [apply(f, 3), apply(g, 3), apply2(f, 3), apply2(g, 3), apply3(f, 3), apply3(g, 3)];

                                        А уж когда введут =>, в жс наступит праздник
                                        var f = x => x*x;
                                        var apply = (f, x) => f(x);
                                        Ответить
                                        • > В жс нет различий при использовании между лямбдами и обычными функциями.
                                          ЖС это scheme для сишников :) Правда макросы забыли перетащить.
                                          Ответить
                                        • >>В руби какая-то беда с лямбдами и вызовом функций

                                          Какая беда?
                                          Ответить
                                          • irb(main):001:0> def f x, y
                                             x*y
                                             end
                                            nil # OK, слава Богу, работает
                                            
                                            irb(main):002:0> f 2 3
                                            SyntaxError: (irb):2: syntax error, unexpected tINTEGER
                                            # ладно, не хаскель, попробуем по-другому
                                            
                                            irb(main):003:0> f 2, 3
                                            6 # хорошо, заработало
                                            
                                            irb(main):004:0> f(2,3)
                                            6 # оно и так работает!
                                            
                                            irb(main):005:0> f (2,3)
                                            SyntaxError: (irb):5: syntax error, unexpected ','
                                            # Што? (2, 3) - это кортеж?
                                            
                                            irb(main):006:0> (2,3)
                                            SyntaxError: (irb):6: syntax error, unexpected ','
                                            # не, не кортеж. а почему тогда не пашет?
                                            
                                            irb(main):007:0> g = proc({|x,y| x*y})
                                            SyntaxError: (irb):7: syntax error, unexpected tPIPE
                                            # но ведь f(2,3) же работало! Или блоки нельзя передавать функциям?
                                            
                                            irb(main):008:0> g = proc {|x,y| x*y}
                                            #<Proc:0x42fe4b97@(irb):08>
                                            # Можно, но без скобок. ОК.
                                            
                                            irb(main):009:0> g 2, 3
                                            NoMethodError: undefined method `g' for main:Object
                                            # Што? Это же не сишка, тут не требуется вводить указатели функций как отдельную сущность.
                                            
                                            irb(main):010:0> g.call 2,3
                                            6 # мляяя...
                                            
                                            irb(main):011:0> f1 = f
                                            #<Proc:0x4568e1c1@(irb):11>
                                            # мда, Proc... грядёт анальная магия прока
                                            
                                            irb(main):027:0> f1.call 2, 3
                                            2 # какая ещё двойка, я этого не ожидал


                                            kegdan, правда, откуда эта двойка, почему интерпретатор дал мне спокойно похерить куда-то второй аргумент?
                                            P.S. Это не ruby, это jruby делает такую хрень с присваиванием, но всё остальное остаётся на совести ruby.
                                            Ответить
                                            • >f1 = f
                                              что за версия руби такая? ни в 1.9.3 ни в jruby не работает.
                                              Ответить
                                              • это в Jruby [1.7.5 (2.0.0)] такое вылезло
                                                Ответить
                                                • вот видишь, jruby нарушил принцип руби №1 - минимальное удивление
                                                  Ответить
                                            • f1 = f в 193 не работает - какая версия компилятора?
                                              Скорее всего эта магия выглядит так f - это proc. Proc принимает в себя любой набор переменных - в данном случае он уведел 2, решил что аргумент 1 и положил хуйцы на второй. Отака хуйня, малята.
                                              Ответить
                                            • Насчет proc - это потому что нужно отличить блок передаваемый в процедуру от обычных параметров. Или делайте без скобок или proc(){|x,y| x*y|}
                                              Ответить
                                              • > нужно отличить блок передаваемый в процедуру от обычных параметров
                                                Вся эта блокомагия удивляет меня. После других языков смотрится странно, как паскалевское разделение на процедуры и функции.
                                                В общем, пусть японцы на своём руби пишут, а я не буду лезть в их мирок :)
                                                Ответить
                                            • >>всё остальное остаётся на совести ruby

                                              мне кажется все остальное вполне очевидно и соответствует ожиданиям
                                              Ответить
                                              • > мне кажется все остальное вполне очевидно и соответствует ожиданиям

                                                Различие f(2,3) и f (2,3) может и очевидно с точки зрения парсера, но (2,3) - не кортеж, а запятая - не оператор.
                                                Ответить
                                                • Если б это был картеж он бы сказал - чувак, второй аргумент не найден.
                                                  (2,3) - это вообще не конструкция языка - именно на это он и ругается. Он не может понять, что ты засовываешь в него первым аргументом. По моему очевидно
                                                  Ответить
                                                  • Вот в жс есть:
                                                    function f(x){
                                                      return
                                                       x;
                                                    }
                                                    var a = f(3); // a === undefined
                                                    // и это очевидно, понятно и правильно, сука

                                                    Это всё из разряда "кто тут нагадил? больше так не делай".
                                                    Ответить
                                                    • Ну это тоже очевидно)

                                                      Википедия говорит

                                                      Язык следует принципу «наименьшей неожиданности»: программа должна вести себя так, как ожидает программист. Однако в контексте Ruby это означает наименьшее удивление не при знакомстве с языком, а при его основательном изучении. Сам Мацумото утверждает, что целью разработки была минимизация неожиданностей при программировании для него, но после распространения языка он с удивлением узнал, что мышление программистов похоже, и для многих из них принцип «наименьшей неожиданности» совпал с его принципом.
                                                      Ответить
                                                      • > Однако в контексте Ruby это означает наименьшее удивление не при знакомстве с языком, а при его основательном изучении.

                                                        Хм, т.е. кресты тоже следуют принципу наименьшей неожиданности.
                                                        Ответить
                                                        • нет, у крестов подводных камней ужасающее количество.
                                                          В руби нужно понять философию
                                                          В плюсах нет философии - только костыли
                                                          Ответить
                                                          • > у крестов подводных камней ужасающее количество
                                                            Ты просто не понял их философию.
                                                            Ответить
                                                      • > Однако в контексте Ruby это означает наименьшее удивление не при знакомстве с языком, а при его основательном изучении.
                                                        Честно говоря, выглядит как троллинг. Чем лучше я что-то освоил, тем меньше оно удивляет.
                                                        Выходит новый стандарт C++, матёрый крестушник смотрит и говорит, "Ничего удивительного, это норма".
                                                        Ответить
                                                        • что бы понять руби достаточно прочитать оф руководство на 500 страниц.
                                                          Что бы понять плюсы жизни не хватит
                                                          Ответить
                                                          • > что бы понять руби достаточно прочитать оф руководство на 500 страниц.
                                                            Чтобы понять кресты достаточно прочитать стандарт на 500 страниц.
                                                            Ответить
                                                            • Достаточно прочитать стандарт на 500 страниц и понять, что половина UB и Implementation dependent
                                                              Ответить
                                                              • > половина UB и Implementation dependent
                                                                В этом и заключается философия крестов.
                                                                Ответить
                                                    • Мне в js убивает
                                                      a.AnyUndefinedField, безо всяких ошибок или предупреждений. Видимо недаром есть столько компиляторов, компилирующих в js нормально типизированные языки.
                                                      Ответить
                                                      • А я на это смотрю как на фичу; в некоторых случаях позволяет писать if(!a.x) a.x = 3; вместо чего-то вроде if(!a.hasOwnProperty('x')) a.x = 3.
                                                        Мне наоборот становится грустно, когда хрень вида a.AnyUndefinedField() вызывает исключение - иногда хочется, чтобы вернуло undefined и не беспокоило.
                                                        Скажем, [1,2,3].map(5) не ломало всё при попытке вызвать 5, а возвращало [undefined, undefined, undefined], пока я не соизволю исправить баг.
                                                        Ответить
                                                        • а unless нет?
                                                          типа
                                                          а.x=3 unless a.x
                                                          Ответить
                                                          • ОМГ, что у них в руби есть :)
                                                            Нет, такого нет. И вместо a.x==3 if not a.x надо писать православное сишное if(!a.x) a.x=3;
                                                            Ответить
                                                            • > ОМГ, что у них в руби есть :)
                                                              Да там столько сахара, что жопа слипнется.

                                                              Чтобы читать код профессионального рубиста надо знать руби целиком.
                                                              Ответить
                                                              • Я как-то просмотрел все методы для строки и числа... Я просто охренел от их количества. В следующей версии руби в именах методов можно будет встретить все слова из небольшой энциклопедии.
                                                                Ответить
                                                                • > Я просто охренел от их количества.
                                                                  Да хрен с ним с количеством. Там часть еще и повторяется.
                                                                  Ответить
                                                              • >>Чтобы читать код профессионального рубиста надо знать руби целиком.

                                                                всего 500 страниииц)
                                                                Ответить
                                                                • > всего 500 страниииц)
                                                                  Стандарт крестов тоже всего 500 страниц ;)
                                                                  Ответить
                                                                  • давай на примере - руби я осилил, а плюсы нет. А если руби может осилить даже такой бездарь как я...
                                                                    делаем выводы)

                                                                    вообще думаю перл надо учить. пятый
                                                                    Ответить
                                                                    • > делаем выводы
                                                                      вывод - что ты ленивый?

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

                                                                        для себя

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

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

                                                                            Романтика языка

                                                                            До хаскеля тоже дело дойдет
                                                                            Ответить
                                                                      • На винде bash нет, а perl - есть.
                                                                        Ответить
                                                                        • > баш нефть
                                                                          любители могут поиграться в консоли, которая в винде с git устанавливается
                                                                          Ответить
                                                                        • > а perl - есть.
                                                                          Изкоробки прям? :)

                                                                          А если ставить - то и баш ставится, и питон ставится.
                                                                          Ответить
                                                                    • надо Erlang такая няшка этот ерланг. Переменные не меняются. Алфавит {},;. a-zA-Z0-9 ->
                                                                      Ответить
                                                                      • >>Переменные не меняются

                                                                        дык они в любом функциональном языке не меняются
                                                                        Ответить
                                                          • P.S. Но в жс можно реализовать некоторое наркоманство из руби.
                                                            Number.prototype.times = function(f){
                                                              for(var i=0; i<this; ++i) f(i);
                                                            };
                                                            
                                                            3..times(alert);
                                                            Ответить
                                                        • Но в результате ошибся в одной букве - и пытайся потом понять, почему сколько ни пишешь, на экране ничего не меняется.
                                                          Ответить
                                                        • > пока я не соизволю исправить баг
                                                          А как ты будешь его исправлять? Бектрейса нет, причины неизвестны, половина входных данных давным-давно забыта... Удачной отладки ;)

                                                          Меня вот в жс очень бесит, что они смешали ассоциативный массив и объект в кучу. Для ассоциативного массива при отсутствии ключа возвращать null или undefined вполне адекватно. Для объекта - нет.
                                                          Ответить
                                                          • > Удачной отладки ;)
                                                            пф, на старой работе отладка методом расстановки логов была практически основным способом искать проблемы, js тут ничем не удивляет
                                                            Ответить
                                                            • > методом расстановки логов
                                                              Ну так там хотя бы синтаксические ошибки и глупые опечатки не надо было ловить расстановкой логов... И у нормального софта логи пишутся в файл, а у жс они благополучно забудутся при закрытии браузера. И пост-фактум в проблеме уже хер разберешься.
                                                              Ответить
                                                              • Из ж.скрипта вполне можно получить логи в файл. Тот же Селениум - там уже есть, но можно и фаирбаг по-хорошему попросить, или похожий инструмент. Ну и у ноды вообще таких проблем как бы нет.
                                                                Мой предпочитаемый способ: swank-js, он может и с нодой работать, и к браузеру подключиться.
                                                                Ответить
                                                              • Можно в ко-ко-нсолечу же а от туда экспортировать
                                                                Ответить
                                                          • > А как ты будешь его исправлять? Бектрейса нет, причины неизвестны... Удачной отладки ;)
                                                            вывод в консоль или отладка по шагам
                                                            undefined можно и другим честным путём получить и протащить сквозь десяток функций. Можно функции написать криво...
                                                            Ответить
                                                            • В общем, там где рубист видит в логах сервера исключение указывающее на строчку где оно возникло, ДЖИЭСОБЛЯДИ расставляют логи и отлаживают по шагам.
                                                              Ответить
                                                              • Лол, джиэсобляди постоянно наблюдают исключения, пачки исключений, ОЧЕНЬ МНОГО ИСКЛЮЧЕНИЙ, только стесняются об этом говорить.
                                                                Ответить
                                                              • только вот джиэс работает прямо у тебя сейчас перед глазами, а руби чуть менее чем нигде
                                                                Ответить
                                                                • ну так я и говорю - недаром существует столько языков компилирующихся в js. js стал "браузерным" ассемблером, но это не делает его менее неудобным для писания на нем.
                                                                  Ответить
                                                              • Нода в этом смысле ничем не отличается - те же логи с номерами строчек и исключениями.
                                                                Ответить
                                                          • > Меня вот в жс очень бесит, что они смешали ассоциативный массив и объект в кучу.
                                                            А ведь в жизни не все объекты неизменны. Они эволюционируют и взрослеют.
                                                            var человек = {};
                                                            // прошло 7 лет
                                                            человек.класс = 1;
                                                            // прошло 10 лет
                                                            delete человек.класс
                                                            человек.курс = 1;
                                                            // прошло 5 лет
                                                            delete человек.курс;
                                                            человек.зарплата = 1e4;
                                                            // позже, самое печальное
                                                            delete человек;

                                                            Ответить
                                                            • 
                                                              человек.стать(ученик(1));
                                                              std::cout << человек.как<ученик>().класс << std::endl;
                                                              человек.перестатьБыть<ученик>();
                                                              
                                                              человек.стать(студент(1));
                                                              std::cout << человек.как<студент>().курс << std::endl;
                                                              человек.перестатьБыть<студент>();
                                                              
                                                              человек.стать(муж(жена));
                                                              std::cout << человек.как<муж>().жена.имя << std::endl;
                                                              
                                                              человек.стать(работник(контора, 100500));
                                                              std::cout << человек.как<работник>().зарплата << std::endl;
                                                              человек.перестатьБыть<работник>();
                                                              
                                                              Ответить
                                                              • человек.как<муж>() >> "жена! борщу!"
                                                                Ответить
                                                                • На руби тоже можно сделать как в js.
                                                                  http://ideone.com/fSxqlz
                                                                  Можно еще через define_method оптимизировать, но мне лень.
                                                                  Ответить
                                                                • Пишем в const char* ?
                                                                  Ответить
                                                                  • > пишем
                                                                    сдвигаем же
                                                                    Ответить
                                                                  • > Пишем в const char* ?
                                                                    Сдвигаем вправо на const char * бит.

                                                                    Перегрузка операторов же :)

                                                                    P.S. Я буду обновлять страницу перед отправкой комментария.
                                                                    Ответить
                                                          • Что в ж.скрипте не нравится, ох...
                                                            1. "Система" типов - плевок в лицо здравому смыслу. Зачем нужны typeof и instanceof если все объекты?
                                                            2. "Класс" Math - ну какой он в жопу класс?
                                                            3. Динамическая привязка "методов" к объектам которые они "принадлежат" (что значит this?) - не то, чтобы это было совсем алогично, но абсолютно непрактично.
                                                            4. 32-битная математика сэмулированая даблами...
                                                            5. Дохера (в процентом соотношении) бесполезных функций в стандартной библиотеке (всякие битовые операции).
                                                            6. Date.getYear - вообще пиздец, зачем его вообще оставили?
                                                            7. Императивные выражения не являющиеся вычислениями (for, while, if, do, break, continue и т.п. - все это императивное говно в этом языке абсолютно не к месту).
                                                            Чего катастрофически не хватает и нет возможности эмулировать.
                                                            1. Модулей.
                                                            2. Инструментов по работе с синтаксисом.
                                                            3. Нормальной объектной системы.
                                                            4. Большей стандартной библиотеки для работы с часто встречающимися проблемами (чтобы упразднить говноквери, андерскор, мастач и т.д.).
                                                            5. Вменяемых коллекций (одна коллекция на все случаи жизни - верный путь к ПХПрограммированию).
                                                            Ответить
                                                            • > 2. Инструментов по работе с синтаксисом.
                                                              Метатаблиц как в луа и макросов как в си.
                                                              Ответить
                                                              • Макросов как в Си - упаси боже. Макросы, если уж, то как в Схеме.
                                                                Ответить
                                                                • Эх, матёрые программисты...
                                                                  А я ещё молод и хочу иметь возможность выстрелить себе в ногу:
                                                                  #define ADD(a) + a
                                                                  x = 2 ADD(3 << 1)
                                                                  Ответить
                                                                  • > макросы
                                                                    > #define ADD(a) + a

                                                                    Ещё один человек, не видевший нормальных макросов.
                                                                    Ответить
                                                                    • > Ещё один человек, не видевший нормальных макросов.
                                                                      Полезно было бы, чтобы нормальные макросы вылились в инструмент метапрограммирования, поддерживающий вложенность и возможность генерить любые куски исходного кода до компиляции, быть может даже менять синтаксис, насколько парсер позволит. Но я таких не видел.
                                                                      #macro INIT(id)
                                                                        #local-macro create_macro(name, value)
                                                                          #macro $(name) $(value) #end-macro
                                                                        #end-macro
                                                                      
                                                                        create_macro("E", "(2.71)")
                                                                        create_macro("_+", "printf")
                                                                        create_macro("@@", "//")
                                                                      
                                                                        #local-macro PR(code1, code2, variables)
                                                                          #if (!#length(variables))
                                                                            $("\"" + code1 "\", " + code2)
                                                                          #else
                                                                            #local-macro VAR() variables[1] #end-macro
                                                                            #local-macro FORMAT(var)
                                                                              #case (#type(var))
                                                                                #eq ("char*") "%s" #end-if
                                                                                #eq ("int") "%d" #end-if
                                                                                #eq ("float") "%f" #end-if
                                                                                #like (/.+\*/) "%p" #end-if
                                                                              #end-case
                                                                            #end-macro
                                                                            #if (#undef(FORMAT(VAR)))
                                                                              PR(code1, code2, #tail(variables))
                                                                            #else
                                                                              PR($(code1 + FORMAT(VAR)), $(code2 + ", " + VAR), #tail(variables))
                                                                            #end-if
                                                                          #end-if
                                                                        #end-macro
                                                                      
                                                                        #macro PRINT(*)
                                                                          printf PR("", "", args)
                                                                        #end-macro
                                                                      
                                                                      #end-macro
                                                                      
                                                                      #macro-bin-oper[priority=1] if(op, cond)
                                                                        if(cond){
                                                                          op;
                                                                        }
                                                                      #end-macro
                                                                      
                                                                      INIT(1)
                                                                      
                                                                      int main(){
                                                                        _+ ("hello, world!");
                                                                        PRINT(E, " equals ", 2.71);
                                                                        @@ ololo, comment!
                                                                        PRINT("1 == 2") if 1 == 2;
                                                                      }
                                                                      Ответить
                                                                      • > Но я таких не видел
                                                                        Посмотри в схеме и лиспе ;)
                                                                        Ответить
                                                                      • Та ну, столько потуг для того, чтобы сделать такую простую вещь...
                                                                        Ответить
                                                                      • (defmacro backwards-if (consequent if-symbol antecedent)
                                                                          (assert (eql if-symbol :if) (if-symbol)
                                                                                  "This one thing (~s) is not like the other!" if-symbol)
                                                                          `(if ,antecedent ,consequent))
                                                                        
                                                                        
                                                                        ;; CL-USER> (backwards-if (format t "~&1 = 2") :if (= 1 2))
                                                                        
                                                                        ;; NIL
                                                                        ;; CL-USER> (backwards-if (format t "~&1 = 2") :if (= 1 1))
                                                                        ;; 1 = 2
                                                                        ;; NIL
                                                                        ;; CL-USER> (backwards-if (format t "~&1 = 2") :fi (= 1 1))
                                                                        ;; ; Evaluation aborted on #<SIMPLE-ERROR "This one thing (~s) is not like the other!" {1005124BE3}>.
                                                                        ;; CL-USER> This one thing (:FI) is not like the other!
                                                                        ;;    [Condition of type SIMPLE-ERROR]
                                                                        
                                                                        ;; Restarts:
                                                                        ;;  0: [CONTINUE] Retry assertion with new value for IF-SYMBOL.
                                                                        ;;  1: [RETRY] Retry SLIME REPL evaluation request.
                                                                        ;;  2: [*ABORT] Return to SLIME's top level.
                                                                        ;;  3: [ABORT] Abort thread (#<THREAD "repl-thread" RUNNING {1003B78063}>)
                                                                        Ответить
                                                                        • Везёт же людям. Если б я не был ленивым, я бы уже сорок минут учил лисп.
                                                                          Ответить
                                                                      • Нормальные макросы обычно берут на вход AST и возвращают его же. Твой пример очень отдалённо напоминает Nemerle.
                                                                        Ответить
                                                                        • > Твой пример очень отдалённо напоминает Nemerle.
                                                                          Видимо, очень отдалённо. У меня подразумевается уровень строк, магия
                                                                          #macro $("_+") printf #end-macro
                                                                          явно не дружит с АСД.

                                                                          Кстати, в макросе PRINT у меня не хватает скобок после printf.
                                                                          Ответить
                                                                        • Ну вот уж нет: макросы могут существовать на всех трех уровнях (трех-уровневая структура языка лучше описана в бумагах посвященных Iswim). Т.е. макросы могут изменять hardware reprepresentation (например менять регистр букв, или переводить на другой язык, добавлять префикс / суффикс и т.д.), publication level representation (манипулируя АСТ, пряча информацию, добавляя возможности типа мусорщика, РАИИ и т.д.) и на reference / logical уровне (последнее напрямую не выражено в лисповских макросах, но иногда АСТ уровень может, в принципе, использоваться для таких манипуляций, например реализация call/cc (не полная) в CL может быть примером.)
                                                                          :)
                                                                          Ответить
                                                                      • Вот вроде интересный проект
                                                                        http://sweetjs.org/
                                                                        Ответить
                                                                        • Полезная штука, надо с ней поиграться. Жаль только, что на определённом этапе выводит за пределы JS.
                                                                          Ответить
                                                            • Ох, а еще: невнятная система с функциями высшего порядка: почему некоторые встроенные функции можно предавать по ссылке, а некоторые - нет. Особенно напрягает невозможность передать по ссылке . и [].
                                                              Напроч отсутствующий механизм решения проблем безопасности и коммуникации между программами (часть модулей).
                                                              Абсолютно рандомальное поведение математических функций примененных не к числам. Почему:
                                                              'a' + 'b' = 'ab'
                                                              но
                                                              'ab' - 'a' = NaN
                                                              и т.д.

                                                              Непоследовательнос в использовании префиксных функций, почему можно:
                                                              typeof x
                                                              но нельзя
                                                              isNaN x
                                                              Ответить
                                                              • > Особенно напрягает невозможность передать по ссылке . и [].
                                                                Может, Proxy и решит подобную проблему.
                                                                И да, ещё бы просто передать хоть что-нибудь по ссылке:
                                                                var a = 3;
                                                                (function(x){ x = 4; })(&a);
                                                                // a == 4
                                                                Ответить
                • > переименовал класс привязаный к таблице
                  А при этом данные переносятся в новую таблицу? Или их руками приходится переписывать?
                  Ответить
                  • Чтобы что-то потерять, это надо сначала найти. Данные могли быть фейком, или устаревшими. Пользователей-то совсем не много, а если это данные какого-то пользователя, который больше уже не пользователь, то проблема, скорее всего, не обнаружится никогда.
                    Ответить
                    • > проблема, скорее всего, не обнаружится никогда
                      Нет человека - нет проблем.
                      Ответить
                      • Байка о человеке.
                        Знакомая работает распростанителем 1с. Рассказывала такую историю - приходит она значит в какую то мелкую контору, пригласили проконсультировать нового человека да базу посмотреть. В базе должен быть скрипт, который автоматом списывает через некоторое время предметы, чья стоимость менее X рублей. А он не работает. В результате разбирательств выяснилось что старый макак - базозаполнятель (который есстесно уволился с концами) в вписывал в накладные не
                        Name ="item" Count = "Y" Cost ="Z" TotalCost = Y*Z
                        A
                        Name ="item (Y)" Count = "1" Cost ="Z*Y" TotalCost = Y*Z

                        в итоге "огнетушитель" за 1000р превращался в "огнетушитель 5 штук" за 5000р

                        Нужно перепиливать базу, а на этих накладных держится вся база за 2 года.

                        Вот и все, ребятки!
                        Ответить
              • Я не только добрался, я документацию (почти) всю прочитал. Очень похоже на творчество Сёрена Киеркегарда, или Платонова. Я когда в старших классах школы был, нам задали на дом прочитать Платонова "Котлован". Этой книжки у меня не было, но было что-то другое, про революцию крассных коммиссаров, Розу Люксембург и т.д. И тут как раз Крещение, мы с однокласником решили в проруби искупаться. Вобщем, я заработал воспаление левого легкого и в горячечном бреду читал эту книжку. Ну и примерно в то же время я познакомился с Киеркегардом + всякий уличный мистицизм типа общества Рериха, Блаватской и т.п.
                Вставляет лучше алкоголя и легких наркотиков... Вот документация Спринга написана в том же ключе: это незамутненный сивушный бред, но мастерство, изощренность и целеустремленность авторов просто не может не восхищать.
                Ответить
                • Плохая дока лучше никакой.
                  В принципе, ответы на возникающие вопросы я находил, иногда не сразу. Для общего введения, на мой взгляд, отлично подходит Spring in Action.

                  P.S. мне когда-то нравился Евгений Замятин
                  Ответить
                • > Сёрена Киеркегарда

                  Кьеркегора.
                  Ответить
                  • Søren Aabye Kierkegaard (/ˈsɔrən ˈkɪərkəɡɑrd/ or /ˈkɪərkəɡɔr/)
                    Вики говорит, что можно и так и так. (Я его не по-русски читал, не уверен, как его по-русски переводят).
                    Ответить
                    • > Вики говорит, что можно и так и так.

                      Не знала. Извиняюсь.
                      Ответить
                      • Я думаю, что в его имени достаточно энтропии, чтобы ни с кем другим случайно не перепутать.
                        Ответить
                    • А вики стоит слушать?
                      Ответить
                      • А кого стоит? Это и так и так обращение к авторитету. Чтобы провести исследование нужен сам Какеготамгор.
                        Ответить
                        • >А кого стоит?
                          Кого-то, знающего правила чтения этого долбоязыка?
                          Ответить
                          • Имена могут читаться по правилам другого языка.
                            Ответить
                          • Там ситуация такая, что единственно верного решения ожидать не приходится. Чем больше мы будем знать о лингвистике, и особенно морфологии, тем больше разных вариантов мы будем вынуждены признать правильными.
                            Например, латеральные согласные звуки (разновидности "л" и "р"), даже в родственных языках отличаются очень сильно (но при этом могут записываться одинаково, даже по правилам ИПА). И тут возникает вопрос: нужно ли стараться в точности скопировать звук оригинала, или нужно искать звук ближе всего соответствующий в алфавите языка говорящего к исходному.
                            Например, для японцев "л" и "р" - одно и то же, по большому счету.
                            Но у латеральных это просто ярче выражено, у фрикативных - так же есть различия. Особенно, если мы посмотрим на корейский... А, например в арабских диалектах может и не быть не-гортанного "к".
                            А если вспомнить о том, какой огромний сектор занимают звуки которые мы описываем как "е"... это почти треть из всех гласных звуков, которые мы вообще можем произнести.
                            И вполне возможно, что лучшей фонетической транскрипцией было бы Кйыркыга. Но есть традиция заимствования слов из романских язков. Или языков записываемых латиницей. И просто соображения благозвучности и удобства в произношении...
                            Ответить
                          • Обалдеть, это имя уже кто-то проговорил в Форво:
                            http://ru.forvo.com/word/søren_aabye_kierkegaard/#da
                            http://ru.forvo.com/word/søren_kierkegaard/#da

                            Датский и шведский — это почти как немецкий, но только с вологодским окцентом. Северяне боятся на морозе широко раскрывать рот, поэтому произносят «а» как «о».

                            Но увы, на письме, как уже заметил wvxvw, мы используем не транскрипцию, а транслитерацию. Зачастую даже что-то среднее между транскрипцией и транслитерацией. Точность принесена в жертву узнаваемости.
                            Ответить
            • >Впрочем после виртуального i386 на js, на котором крутится ядро линуха
              > и даже работает куча гну\линуксовых команд, включая gcc и tcpdump

              Фабрис Беллард сделал только эмулятор процессора и устройств. Урезанный же луникс со всеми тулзами подтягивается с образа.

              Он вообще гений. Чего только стоит начатый им ffmpeg и tcc (миникомпилер подмножества сишки собирающий сам себя)
              Ответить
    • тщательно продуманный и описанный костыль говном не является.
      Ответить

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