1. Куча / Говнокод #19165

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    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
    func handleRequest(conn net.Conn) {
    	// размер данных
    	buf := make([]byte, 4)
    	n, err := conn.Read(buf)
    	if err != nil {
    		fmt.Printf("%v", utils.ErrInfo(err))
    	}
    	size := utils.BinToDec(buf)
    	fmt.Printf("get data size: %v / n: %v\n", size, n)
    	if size < 10485760 {
    		// сами данные
    		binaryData := make([]byte, size)
    		n, err = io.ReadFull(conn, binaryData)
    		fmt.Printf("n: %v\n", n)
    		if err != nil {
    			fmt.Printf("%v", utils.ErrInfo(err))
    		}
    
    		gp3, err := ioutil.TempFile(os.TempDir(), "temp")
    		if err != nil {
    			fmt.Printf("%v", utils.ErrInfo(err))
    		}
    		mp4, err := ioutil.TempFile(os.TempDir(), "temp")
    		if err != nil {
    			fmt.Printf("%v", utils.ErrInfo(err))
    		}
    		err = ioutil.WriteFile(gp3.Name()+".3gp", binaryData, 0644)
    		if err != nil {
    			fmt.Printf("%v", utils.ErrInfo(err))
    		}
    		out, err := exec.Command("/usr/bin/ffmpeg", "-i", gp3.Name()+".3gp", mp4.Name()+".mp4").Output()
    		if err != nil {
    			fmt.Println("/usr/bin/ffmpeg", "-i", gp3.Name()+".3gp", mp4.Name()+".mp4")
    			fmt.Printf("%v\n", utils.ErrInfo(err))
    		}
    		fmt.Printf("out: %v\n", out)
    		
    		data, err := ioutil.ReadFile(mp4.Name()+".mp4")
    		if err != nil {
    			fmt.Println(err)
    		}
    		// в 4-х байтах пишем размер данных, которые пошлем далее
    		size := utils.DecToBin(len(data), 4)
    		n, err = conn.Write(size)
    		if err != nil {
    			fmt.Println(err)
    		}
    	  	fmt.Printf("n: %v\n", n)
    		
    		// далее шлем сами данные
    		n, err = conn.Write(data)
    		if err != nil {
    			fmt.Println(err)
    		}
    	  	fmt.Printf("n: %v\n", n)
    	}
    }

    Со швабры, Go. Мне кажется, или здесь слишком много "if err != nil"?

    Запостил: gost, 10 Декабря 2015

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

    • Эксцепшены нинужны. Ошибки - это значения.
      Ответить
      • Goвнист в треде, все в C++!
        Эксцепшены, значения - без разницы. Один хуй такое количество одинаковых строк - говно.
        Ответить
        • Эксцепшены нинужны. Ошибки - это значения.
          Ответить
    • Go-внокод :-)
      Ответить
    • > ioutil.ReadFile(mp4.Name()+".mp4")
      Жаль, что этот код работает с мелкими 3gp, а не какими-нибудь бурурей ремуксами... Память же дешёвая, зачем париться и читать блоками...
      Ответить
      • К слову, есть io.Copy, который сделает всё как надо
        https://golang.org/pkg/io/#Copy
        Ответить
    • > if err != nil {
      > fmt.Println(err)
      > }
      Наткнулись на ошибку, поматерились и поехали дальше. Ничто не остановит бульдозер.
      Ответить
    • В одном моём проекте программа общается с тремя устройствами для проведения серии обмеров. Если писать код в таком стиле, то к каждой из строчек обмеров, которые выглядят примерно так:
      float amp = dev1->measureAmplitude();

      надо будет дописать примерно следующий код:
      if (dev1->hasError()) {
          cout << dev1->errorString() << endl;
          dev1->reset();
          dev1->disconnect();
          dev2->reset();
          dev2->disconnect();
          dev3->reset();
          dev3->disconnect();
          return false;
      }
      Ответить
      • Это делается функциями и макросами.
        Ответить
        • Или одним аккуратным goto. Или эксцепшенами.
          Ответить
      • В го нет деструкторов, но есть defer. Весь этот говнокод можно заснуть туда, и дальше писать просто return false.
        Ответить
        • А дефер в объект засунуть можно? А то как-то неудобно получается.
          Ответить
          • Нет, деструкторов нет, defer всегда надо явно писать.
            Ответить
            • А отменить задеферренное можно?
              Ответить
              • Только если закатом солнца вручную:
                // http://play.golang.org/p/gL0-gSD7br
                
                package main
                
                import "fmt"
                
                func main() {
                	aDismissed := false
                	bDismissed := false
                	defer func() {
                		if !aDismissed {
                			fmt.Printf("A triggered!")
                		}
                	}()
                	defer func() {
                		if !bDismissed {
                			fmt.Printf("B triggered!")
                		}
                	}()
                	aDismissed = true
                }
                Ответить
            • А чё так, неудобно же.
              Ответить
              • деферы это не деструкторы это функции которые будут запускаться после выполнения функции в которой они объявлены.
                Ответить
              • > А чё так, неудобно же.

                В языках с GC довольно сложно сделать толковые деструкторы. Чтобы выяснить, используется ли объект ещё где-то или нет, нужно запускать GC.

                defer решает 90% проблем, практически не усложняя язык. Дополнительный бонус: он, как правило, не создаёт дополнительный отступ, в отличие от питоньих with.
                Ответить
    • Нормальный код, только вместо трёх строчек я б сделал одну, типа
      if (LoggedFail(err)) return;

      А чаще достаточно такого:
      result := false;
      // много строк вида 
      if not ParsedData(f,d1) then exit;
      if not ParsedData(f,d2) then exit;
      if not ParsedData(f,d3) then exit;
      if not ParsedData(f,d4) then exit;
      result := true;
      Ответить
    • > conn net.Conn
      Вопрос к знатокам: если это интерфейс, то если указать тип таким образом, а не *net.Conn, то что передастся в функцию: копия или указатель? Я почему-то подозреваю, что объект скопируется, но как он будет копироваться в таком случае - мне не совсем понятно, т.е. он будет копироваться в рантайме исходя из каких-то метаданных которые в нем есть?
      Ответить
      • Во-первых, интерфейс может имплементить или сам тип, или указатель. В случаях вроде Conn разумно делать указатель имплементацией интерфейса, а не сам тип. Тогда компилятор будет ругаться на попытку передать объект вместо указателя.

        Во-вторых, если тип имплементит интерфейс, то при конструировании объекта интерфейса будет сделана обычная копия объекта (такая же, как в выражении a := b). При копировании объекта интерфейса, скорее всего, копий внутренних данных делаться не будет, но они будут делаться при вызове соответствующих методов (раз интерфейс имплементит тип, а не указатель, функции должны принимать объект по значению).

        http://research.swtch.com/interfaces
        Ответить
        • > Go sits halfway between the two: it has method tables but computes them at run time. I don't know whether Go is the first language to use this technique, but it's certainly not a common one. (I'd be interested to hear about earlier examples; leave a comment below.)

          Как-то грустно. Люди с таким авторитетом и такое пишут.
          http://www.sbcl.org/sbcl-internals/The-Cacheing-Mechanism.html#The-Cacheing-Mechanism
          http://caml.inria.fr/pub/ml-archives/caml-list/2007/11/24e8215c8d844b05db58ed3f79c9645f.en.html


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

            Какое пишут? Он честно сказал, что не знает, применялся ли он где-то раньше. Он же не кричит, что они придумали что-то принципиально новое - просто что такой подход не является "мейнстримом". Более того - хочет узнать о более ранних имплементациях.

            Я вот тоже не в курсе, где такое раньше применялось. Предоставленные ссылки содержат слишком мало информации, чтобы понять, как именно оно реализовано (и реализовано ли вообще).

            Структурные подтипы в Ocaml/Scala, конечно, очень похожи на гошные интерфейсы, но Ocaml, в отличие от Go, не позволяет делать upcast (от общего к частному). Следовательно, ему нет нужды считать таблицы в рантайме.

            В Go можно попробовать привести объект неизвестного на этапе компиляции типа к интерфейсу, и табличка методов будет посчитана в рантайме.
            Ответить
            • В ОКамле таблички нужны, но не всегда, и там они вроде генерируются только тогда, когда нужны (или, как я понимаю, генерируются всегда, но оптимизатор может их выбросить). Из того, что я понял: компилятор создает две таблицы: с адресами и с именами. Если адрес известен на момент компиляции: вызов будет по адрессу, если нет: поиск по имени.
              http://ambassadortothecomputers.blogspot.co.il/2010/03/inside-ocaml-objects.html
              Ответить
            • И да, я бы ожидал от человека пишущего свой язык программирования знакомство с существующими практиками (они же тоже неспроста, кто-то наверняка дисер на этом защитил).
              Ответить
              • > от человека пишущего свой язык

                Этот человек работает в гугле, а гуглу наплевать на эту вашу изотерику.

                Если вы спросите человека из Гугла, используют ли они Scala - они, скорее всего, спросят "А что это такое?".

                У них там своя атмосфера: своя система контроля версий, свои билд-тулы, свои базы данных, свои языки программирования.

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

                Не надо думать, что Go разрабатывался с целью запилить очередной универсальный ЯП. Цель была другая - сделать язык, который максимально отвечает с дизайн-принципам самого Гугла (если, к примеру, посмотреть гугловые C++-гайдлайны, можно найти множество аналогий с Go). По счастливой случайности язык оказался полезен кому-то ещё.
                Ответить
                • Цель была запилить язык на букву G.
                  Гугл любит пилить что нить на букву G.
                  >У них там своя атмосфера: своя система контроля версий, свои билд-тулы, свои базы данных, свои языки программирования.
                  К стати вот с этим утверждением полностью согласен
                  иначе как объяснить что их G+ в полной жопе. Работники гугла просто не коммутативны.
                  Ответить
                  • > их G+ в полной жопе
                    Ну я бы так не спешил. G+ - единственный "(a)социальный" ресурс, которым я пользуюсь. Ибо он работает как отличный новостной агрегатор и в нём практически нет школоты.
                    Ответить
                    • > в нём практически нет школоты
                      Это единственный его плюс.
                      Ответить
                    • То есть если ты там - то г+ уже не в полной жопе?
                      Ответить
                      • > То есть если ты там - то г+ уже не в полной жопе?

                        Если МНЕ G+ в тыщу раз интересней читать, чем всякие одноглазники - ДА, с МОЕЙ точки зрения G+ не в полной жопе.
                        Ответить
                        • Ваше мнение очень важно для нас. Оставайтесь на связи.
                          Ответить
                          • > Ваше мнение очень важно для нас

                            Симметрично. Иди пока киношку в контактике посмотри да выпей чаю.
                            Ответить
                            • Меньшинство здесь ты, так что не някай. Иди скомпильни кодца, псевдоилитие сраное.
                              Капча 1984 хз чего хочет.
                              Ответить
                              • Гость - меньшинство априори, ибо питух.
                                Ответить
                                • Питуз, а у тебя есть G+, питуз?
                                  Ответить
                                • А гость?
                                  Ответить
                                  • гость
                                    гость
                                    гостѣ
                                    Ответить
                                    • Блѣ
                                      Ответить
                                      • Сейчас какой-нибудь мудак напишет скрипт автозамены на церковнославянский.
                                        Ответить
                                        • Кстати, гуглотранслейт как-то можно использовать в юзерскриптах?
                                          Если да, можно запилить юзерскрипт для перевода, а также бота, который будет проверять, что на главной, и постить на ГК информацию о юзерскрипте на нескольких языках, если она вдруг отъехала на другую страницу.
                                          Так мы выйдем на новый уровень.
                                          ГОВНОКОД ЦЕ ЄВРОПА
                                          Ответить
                            • > да выпей чаю
                              Яги же, ну или пива.
                              Ответить
                    • > в нём практически нет школоты

                      За это я любил Я.ру. Но поскольку Яндекс не смог бороться с Лигой без Интернета, Ярушечку закрыли...
                      Ответить
                    • G+ перестал быть тортом, когда закончился закрытый бета-тест
                      Ответить
                      • Закрытые ресурсы скатываются в говно от загнивания и недостатка свежей крови. Открытые - от нашествия раков и ТП. Всё тлен.
                        Ответить
                        • А иногда - наоборот. См. http://govnokod.ru
                          Ответить
                          • Ну тут что-то среднее из-за того, что ЦА гораздо уже, чем у социалочек. С одной стороны, совсем раки сюда всё-таки не попадают, а с другой - популярность очень маленькая и свежих людей не хватает. Баланс, блеать.
                            Ответить
                        • Двачую. Иногда захожу через гугл в форумы старых игор, так там такое болото...
                          Ответить
                          • > болото
                            Апофеоз - тред по евангелиону* у доброчанек. Он на 99% состоит из "доброе утро, тред" и "спокойной ночи, тред" с пикрелейтедами.

                            * - анимешка, вышедшая в 95 году
                            Ответить
                            • Надеюсь, не запрещённая на территории Российской Федерации?
                              Ответить
                            • но всё изменится, если попробовать создать альтернативный "официальный тред"
                              незабываемые войны, скандалы, провокации и ковровые бомбёжки ждут вас в этом случае
                              собственно, это единственное развлечение на добро*-чане

                              ---
                              * на более древней и почтенной анимешной борде для девочек слово "добро" используется как эвфемизм для "говно"
                              Ответить
                          • В смысле сидит там маленькая привыкшая друг к другу компания и обсуждает все что угодно кроме игры, когда ты туда заходишь и думаешь что-то написать - такое впечатление, что тебе нужно зайти в подъезд, а прямо перед ним стоит компашка пьющего пивко быдла и когда ты будешь проходить мимо обязательно что-то спязднет.
                            Ответить
                  • Сайт Gовноkод.
                    Ответить
                    • Секретный проект гугла! Он собирает примеры кода, анализирует их автоматически, а потом приглашает самых лучших говнокодеров на собеседование.
                      Ответить
                      • А самых худших - банит в гуглопоиске.
                        Ответить
                        • Кстати, а почему проект code.google.com отправили на мемориальное™ кладбище Гугла?
                          Ответить
                          • > почему проект code.google.com отправили на мемориальное™ кладбище

                            Они же не раз об этом писали.

                            Зачем тратить ресурсы на разработку и поддержку сервиса с минимальной (по меркам гугла) аудиторией без ясной схемы монитизации, если есть хорошие альтернативы?
                            Ответить
                            • Что мешает монетизироваться аналогично гитхабу?
                              Ответить
                              • Потому что если бросить тех же девелоперов на улучшение поиска и адсенса, заработаешь в 100 раз больше?

                                Да и как-то с трудом представляю себе гугл, толкающий корпоративные лицензии гуглокода.
                                Ответить
                                • >без ясной схемы монитизации
                                  >аналогично гитхабу
                                  Схема монетизации ясна?
                                  Ответить
                      • нет, гугл использует нас для обучения нейросетей говнодроидов-диверсантов, которых потом зашлют в конкурирующие компании на позиции software designer
                        Ответить
                  • Слушать как пыхомакака рассуждает о ЯП и гугле ооооооооочень смешно
                    Ответить
                    • Опять макака села на букву "о". Уберите макаку с ГК, кто-нибудь.
                      Ответить
                      • Клаву на улице нашел вот о и заедает.
                        Ответить
                        • Дизайнеры Go-o-o-o-o-o-o-o-o-ogle тоже пользуются клавами с улицы?
                          Ответить
                          • Судя по дизайну некоторых продуктов (стиль "элемент интерфейса должен быть настолько большим, насколько это возможно; кнопки должны иметь настолько простые иконки, чтобы они [кнопки] обладали наименьшей познаваемостью"), самих дизайнеров Go-o-o-o-o-o-o-o-o-ogle тоже находит сами-знаете-где.
                            Ответить
                • Че зашел к Гуглу в оффис и спросил на что им наплевать? (Кстати, мы там недалеко, мог бы и в гости зайти).
                  Наплевать не Гуглу а Пайку. Что как бы и печально. Гугл тут ни при чем. И да, для людей разрабатывающих языки ни Лисп ни МЛ ну никак не эзотерика. На них все учебные примеры как бы написаны.
                  Ответить
                  • > Наплевать не Гуглу а Пайку

                    К слову, статья написана не Пайком, а Рассом Коксом, автором библиотек RE2:
                    https://plus.google.com/+RussCox-rsc/posts

                    > Наплевать не Гуглу а Пайку.

                    One of the (hundreds of) cool things about working for Google is that they let teams experiment, as long as it's done within certain broad and well-defined boundaries. One of the fences in this big playground is your choice of programming language. You have to play inside the fence defined by C++, Java, Python, and JavaScript.
                    -- http://steve-yegge.blogspot.ru/2007/06/rhino-on-rails.html


                    But you know, ultimately, and it comes up all the time, I mean we've got a bunch of famous Lisp people, and (obviously) famous Python people, and you know, famous language people inside of Google, and of course they'd like to do some experimentation. But, you know, Google's all about getting stuff done.

                    Q: Is it allowed at Google to use Lisp and other languages?

                    No. No, it's not OK. At Google you can use C++, Java, Python, JavaScript... I actually found a legal loophole and used server-side JavaScript for a project. Or some of our proprietary internal languages.

                    -- http://steve-yegge.blogspot.ru/2008/05/dynamic-languages-strike-back.html
                    Ответить
                    • Ну вот ты был в Гугле? Я так понимаю, что не совсем. А наш офис одно время был на этаж ниже Waze, которых тогда уже купил Гугл. Гугл - это очень много разных проектов, и кто чем пользуется не решается централизовано.

                      Ну и чтобы не быть голословным: https://github.com/google тут есть проекты и на Руби и на Расте и на ПХП и на Кложуре и на Лиспе и даже на Груви.
                      Ответить
                      • > Ну вот ты был в Гугле?
                        Был в Лондонском офисе, разговаривал с инженерами. У меня несколько друзей - бывших яндексоидов - работают в HQ, я с ними часто общаюсь.

                        > на Расте
                        >> https://github.com/google/hat-backup
                        >> Disclaimer: This is not an official Google product.
                        >> Warning: This is an incomplete work-in-progress.
                        >> https://github.com/google/rust-multihash
                        >> This is not an official Google project

                        > Clojure
                        >> https://github.com/google/clojure-turtle
                        >> This is not an official Google product (experimental or otherwise), it is just code that happens to be owned by Google.

                        Ну вы понели.

                        Ещё раз - я не говорю, что люди в Гугле не знают других языков. Скорее наоборот. Один из моих знакомых - любитель Хаскела, работает в Map Reduce Team.

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

                    Это не означает, что люди должны в деталях знать, как устроены кишки CLOS или ненужной объектной системы OCaml (я вообще не понимаю, зачем её воткнули... и почему люди не используют StandardML вместо этого жирного однопоточного чуда).
                    Ответить

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