1. Perl / Говнокод #17110

    −288

    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
    sub serialize {
        my ($obj) = @_;
        my $result;
    
        my $ref = ref $obj;
        if ($ref eq 'HASH') {
            $result = sprintf '{ %s }', join(', ', map { qq/"$_": / . serialize($obj->{$_}) } keys %$obj);
        } elsif ($obj eq 'ARRAY') {
            $result = sprintf '[ %s ]', join(', ', map { serialize($_) } @$obj);
        } elsif (! $ref) {
            if (!defined $obj) {
                $result = 'null';
            } elsif ($obj =~ /^ -? (?:0|[1-9]\d*) (?:\.\d+)? (?:[eE][+-]?\d+)? $/x) {
                $result = $obj;
            } else {
                $obj =~ s/(["\\])/\\$1/g;
                $obj =~ s/\r/\\r/g;
                $obj =~ s/\n/\\n/g;
                $obj =~ s/\t/\\t/g;
                $result = qq/"$obj"/;
            }
        }
    
        return $result;
    }

    В продолжение #17106. Самопальная Самобытная сериализация в JSON.

    Запостил: Elvenfighter, 14 Ноября 2014

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

    • Для join .. map .. keys мне больше нравится подход Ruby:
      result = "{ #{ obj.keys.map { |x| %("#{x}": ) + serialize(obj[x]) }.join(', ') } }"


      ... или как там
      Ответить
    • велосипидары
      http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm
      Ответить
      • Это понятно. Но в данном конкретном скрипте нельзя было завязываться на JSON и другие модули, которых нет в стандартной поставке.
        Ответить
        • На компе было мало места и инета не было
          Ответить
          • нет. просто админы пидарасы.

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

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

            можно конечно ручками менять `@INC` (пути к либам), но это все обложено другой пачкой граблей, потому что `use` (подключение либы) обламывается уже на стадии компиляции, до того как код получил шанс на файловой системе найти либы.
            Ответить
            • -I не помогает?
              Ответить
              • и пользователям сказать что они должны вместо `blabla` запускать `perl -I <path-to-lib> /path/to/blabla`?

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

                    и в конце концов, это же перл. на перле перл перлить и переперливать, это даже за экзотику не считается. а вы тут со своим шеллом. :)
                    Ответить
            • А какого-нибудь $PERL_CLASSPATH нету?
              Ответить
              • @INC
                Ответить
              • есть. называется $PERLLIB. только по моему опыту ее на *нихах автоматом прописать извращатся еще надо. теоретически в $HOME/.profile дописать строку это тривиально. но только вот не факт что шелл у пользователя его читает. и что на момент запуска $HOME вообще указывает на $HOME. (или патологический случай когда все стоит правильно, но $HOME/.profile симлинк на профайл другого пользователя, и как следствие рид-онли.)

                когда мне это было нужно, там как раз и была проблема что $HOME переопределялся на рабочий каталог софтины бегущей на серваке - и в этот каталог текущий пользователь писать не мог.
                Ответить
            • Писать свою реализацию JSON только потому что нет денег на хостинг где можно поставить правильную либу? Это так тупо!
              Ответить
              • Уровень тупости зависит от уровня сайта. Если это самоокупающийся проект или заказ от серьёзных людей - тупо. Если свой уголок уровня бесконечного стока Борманда, можно и реализовать что-то самому, потраченное время скорее всего окупится за счёт недополученной прибыли хостеров.
                Ответить
                • > потраченное время скорее всего окупится за счёт недополученной прибыли хостеров
                  А проект вместо изучения новых технологий и фана превратится в боль в жопе, копание в засохшем говне типа пыхи 5.2 и борьбу с анальными ограничениями хостинга... Ничем хорошим это не кончается.
                  Ответить
                  • > вместо изучения новых технологий и фана
                    Изучать можно и у себя на локальной машине. А для тех вещей, где надо, чтобы работало, можно один раз написать на старом анальном и забыть.
                    Но если это творческий проект, дело всей жизни, текущая река мыслей и бесконечное число правок, то да, можно не ограничиваться.
                    Ответить
                    • Ну хорошо, напишу я свой бесконечный сток на PHP... А что мне это даст?

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

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

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

                      Сейчас не начало нулевых, хвала Аллаху, когда у меня был выбор: шаред хостинг за 15 долларов или ставить свой комп на колокейшен за 200. И конечно я выбирал шаред хостинг, и конечно тупые админы имели там устаревшую версию пхп без нужных мне модулей, неправильную базу, и mail у них не работал, и иногда проще было на перле cgi написать, потому что перл у админов обычно был лучше настроен.

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

                        Какая-то ложная оптимизация усилий выходит. То программисты скрипт для единственной задачи пишут дольше, чем выполняется задача, то один раз пишут на любимом языке, чтобы потом лет пять платить.
                        Ответить
                        • 200р/месяц (те самые 5$), имхо, даже студент из провинции себе может позволить. На курение и пиво народ больше тратит, ей богу...

                          > один раз подпилить код
                          А потом еще раз другой код. А потом еще. И еще. И вот ты уже профессиональный пехепешник, который ютится на бесплатных говнохостингах и кроме них больше ничего не изучил...
                          Ответить
                        • P.S. И в конце-концов VPS'ка это не только ценный мех, но и возможность поюзать ее как VPN/прокси, небольшой файлообменник или даже как линуксовый комп, если под рукой только планшет/телефон...
                          Ответить
                          • > даже студент
                            > в конце-концов <...> не только <...> но и <...>
                            А может я - жадный школьник. По мне - так лучше покупать то, что считаешь нужным купить. И в этом случае, скажем, 50 рублей за пачку сигарет мне как некурящему представляется в образе сундука с пиратским золотом, а 3000 рублей за жёсткий диск - всего ничего.
                            Вот у Вас ещё и дополнительные полезные возможности имеются, ради которых можно и заплатить.

                            > А потом еще раз другой код. А потом еще. И еще
                            Ну тут баланс нужен. Скажем, в бесконечный сток надо один раз добавить разбиение на странице, пару раз исправить какие-то глупые баги, а потом оставить его до тех пор, пока либо ГК, либо браузеры не изменятся. Проект по сути пассивный, это не Википедия и не поисковик, тут идея и алгоритмы уже достигли идеала.
                            Если надо писать постоянно, это уже немного другая ситуация, там другие приоритеты.
                            Ответить
                            • Под другим кодом имелся в виду какой-нибудь другой небольшой проектик.

                              P.S. Кстати, а бесплатные пыхохостинги дают крон и исходящие коннекты?
                              Ответить
                              • Пожалуй, только этот: http://www.000webhost.com/features

                                Другие популярные не дают.
                                Ответить
                          • Есть ещё вариант с google appengine и всякими heroku. Я пару простеньких временных приложений пробовал на appengine написать, довольно удобно, хоть это по сути и vendor lock-in. Приятно, что вся инфраструктура уже развёрнута, деплоить удобно, остаётся только код писать.
                            Ответить
                            • Ну я до этого юзал опеншифт. Но там - белое не надевай, обтягивающее не носи только один входящий порт, динамический ип из-за которого нельзя толком настроить домен, пауки запрещены... Плюс разогрев после простоя довольно заметный (виртуалку выключают если какое-то время нет посещений).

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

                      Опыт: познакомился с такими няшками как flask, sqlalchemy, wsgi, lxml; слегка подкачал знания nginx, postgres, html5, angular.js и python.
                      Фан: это было весело и интересно.
                      Авторитет: по крайней мере не стыдно показать друзьям.
                      Деньги: -5$/месяц.
                      Польза: изредка юзаю сервис, когда основной сток переполнен; годная VPS в придачу.
                      Ответить
                    • P.S. Имхо, даже у такого, казалось бы, бесполезного занятия, как просмотр китайских порномультиков про добро, трусы и пидорасов аниме, статы будут повыше, чем у just for "fun" проекта на пыхе...
                      Ответить
                      • Вы просто недооцениваете пользу бесконечного стока. Я б только ради неё его написал.
                        Ответить
                • Ладно. А почему либу с цпана не скачать и не залить в дамашнюю попку по фтп? Так и скажите что автор тупой и не знал процпан
                  Ответить
                  • Я тоже тупой, не знаю Perl, не знаю про цпан, пишу о возможной разумной экономии в некоторых случаях без привязки к языку.
                    Ответить
                  • В данном конкретном случае это просто утилитарный скрипт, который должен быть максимально портабельным и требовать поменьше зависимостей. Скажем так: работать на perl (5.8 ?), который идёт вместе с гитом под мастдайку. И без дополнительного геморроя в виде установки JSON.pm
                    Ответить
            • > потому что `use` (подключение либы) обламывается уже на стадии компиляции,
              для этого BEGIN блок придумали:
              BEGIN {
                  push @INC, '/path/to/my/site_perl';
              }
              use My::Any::Module;
              Ответить
              • в каждой дырке писать BEGIN {}, с (не)тривиальным кодом для поиска где именно лежит каталог с либами, это просто изврат.

                я это делал пару раз. в дереве версий 2/3 изменений страданиями в этом BEGIN {} блоке и занимались. потому что всегда что-то надо было допиливать в логике нахождения где же эти грёбаные либы лежат.

                на практике проще скрипты патчить. ищешь строки с `use lib` (потому что `push @INC` это не кошерно), ищешь либы, патчишь пути к либам в `use lib`ах.
                Ответить
          • > На компе было мало места и инета не было
            Этот скрипт ни разу не для веба (JSON, калазось бы). Просто запихивает нужные данные файл в нужном формате. Чтоб человек потом мог обратиться с этим файлом в /dev/null автоматизированную поддержку.

            Так что каждый раз напрягать юзера "а установи-ка JSON.pm" не вариант.
            Ответить
            • Т.е. это автономный скрипт, который должен быть в одном и только одном файле. И как раз из-за этого рядом с ним нельзя кинуть JSON.pm и, возможно, sh обёртку?
              Ответить
              • Именно. Скачал, запустил. Единственное, что было под сомнением -- наличие Perl. Но, как оказалось скрипт будет запускаться либо на линуксах (разной степени давности) либо на недо-ОС с msysgit (который имеет своей поставке perl)
                Ответить
                • Можно было конечно и архив с JSON.pm внутри запилить. Но опять же: лишние сущности
                  Ответить

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