LINUX.ORG.RU

Курс mail.ru «Системное программирование на Perl»

 , , , курс


10

5

Цель курса — Получить навыки работы в Unix-like ОС и практику системного программирования а также сделать собственный сервис с нуля

Если тебе интересны:
- разработка низкоуровневых сервисов,
- разработка сетевых приложений,
- создание высоконагруженных систем на языке Perl,
то будем рады видеть тебя на нашем курсе.
Самых успешных ждёт возможность стажировки в лучших проектах Mail.Ru Group.

Важное замечание: помимо языка Perl будет рассмотрено устройство Unix-подобных систем, поэтому лекции будут интересны даже ненавидящим Perl гражданам.

Описание курса
Вводная лекция

anonymous

Проверено: Shaman007 ()
Последнее исправление: Shaman007 (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

Жесть какая:

    if 'categories' not in item or not set(item['categories']).intersection(stats.keys()) or 'STR_CLIPS' in item['categories']:
        continue

А это условие if строкой покороче записать никак нельзя? В смысле, разбиения на строки в python не завезли?

DRVTiny ★★★★★
()
Последнее исправление: DRVTiny (всего исправлений: 1)
Ответ на: комментарий от pawnhearts
'categories' not in item

Кстати, интересный пример.

С таким же успехом в perl хватает

if exists $item{'categories'}

Но в соотв. с логикой (считаем, что ключ, которому сопоставлено значение undef или 0 нас весьма мало интересует), можно просто вот так:

if $item{'categories'}

Вот только дальше по тексту в python уже считается, что item['categories'] - это список/вектор, а ведь это же может быть и не так. Почему вы не проверяете, не приехал ли к вам в данных от внешнего источника какая-либо невозбранная фигня, дальнейшая работа с которой в лучшем случае приведёт к исключению в рантайме?

DRVTiny ★★★★★
()
Последнее исправление: DRVTiny (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

В питоне обращение к несуществующему ключу бросит исключение. Но можно делать items.get('categories', дефолтное_значение) это довольно часто используется, например, делаешь пустой список дефолтным значением и можешь с ним смело работать как со списком.

Ещё есть defaultdict, в котором дефолтное значение задается при инициализации словаря т.е. можно делать что-то типа

In [1]: from collections import defaultdict

In [2]: d = defaultdict(list)

In [3]: d['foo'].append('a')

In [4]: d
Out[4]: defaultdict(list, {'foo': ['a']})

вы не проверяете, не приехал ли к вам в данных от внешнего источника

Потому что это наколенный скрипт под вполне конкертные данные.

pawnhearts ★★★★★
()
Последнее исправление: pawnhearts (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

обычно в этом нет смысла. duck typing же. к тому же тип может быть создан динамически, или вообще мемберы могут быть напиханы снаружи. забавная история была с is_callable, когда его сначала выкинули, а потом опять вернули после некоторого срача. обычно рекомендуется проверять на trueness или если доставать мемберы через getattr.

anonymous
()
Ответ на: комментарий от DRVTiny

Вообще это интересный вопрос. Ты будешь такие проверки всюду делать? И что делать, если в categories там что-то другое? Игнорировать как-то неправильно. Ругаться, падать? Ну тут и так эксепшн будет. Который залогируется, может даже прилетит на почту уведобление об этом с трейсбеком. И дальше надо разбираться, почему тебе данные пришли не в том формате, в каком ожидалось. И нормально ли это, если да, то надо как-то это учитывать в коде, конечно.

Если это не пользовательский ввод, конечно, там всякие сериализаторы и валидация есть.

pawnhearts ★★★★★
()
Ответ на: комментарий от bread

хорошее пояснение:) я думаю так и есть на самом деле.

crypt ★★★★★
()
Ответ на: комментарий от DRVTiny

Собственно, если не говорить о такого рода детских примерах непонятно вообще для чего приводимых в качестве подкрепления отсутствующей напрочь аргументации

в каком смысле мой пример детский? человек был вполне взрослый. аврал в первый месяц на работе случается.

непонятно вообще для чего приводимых

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

одинаково верен для любого ЯП?

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

но использует при этом изрядное количество сторонних библиотек

я хз. мои скрипты не имеют этой проблемы.

perl уже лет 20 подряд упорно поддерживает обратную совместимость

я лет 5 назад пытался переписать один скрипт, чтобы он треды использовал. не вышло. не было (может, и сейчас нет) тредов, была какая-то хрень вместо них.

crypt ★★★★★
()
Ответ на: комментарий от DRVTiny

выше товарищ приводил пример на Хаскелл, который просто нечитабелен

хреново читаем, согласен

при этом дико популярен у тырпрайза

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

а язык Ruby

говно, потому что он почти в точности python, но они ломают обратную совместимость каждый релиз. что ты там выше писал о perl vs python? по сравнению с ruby, python очень хорошо подходит для enterprise и это в свое время послужило причиной включения его в дистры by default (вместо ruby).

При этом perl может абсолютно любым: и очень легко читаемым, и лютой кашей

я так понял это возглас из толпы фанов? так про любой ЯП можно сказать.

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

вопрос лишен смысла. это не их компетенция. с чего вдруг.

А в итоге тырпрайз выбирает весьма страшненький go

у тебя там какой-то свой enterprise, а может я уже отстал. по моим данным Java в топе.

crypt ★★★★★
()
Последнее исправление: crypt (всего исправлений: 1)
Ответ на: комментарий от crypt

ломают обратную совместимость каждый релиз

У тебя какой-то свой руби. Мои скрипты, написанные под 1.8 почему то не сломались.

почти в точности python

Совсем не похож, кроме ключевого слова def. Точно руби у тебя особый уличный.

bread
()
Ответ на: комментарий от DRVTiny

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

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

bread
()
Ответ на: комментарий от bread

Совсем не похож, кроме ключевого слова def. Точно руби у тебя особый уличный.

[пожал плечами] такое у меня сложилось ощущение, когда я на нем что-то писать пытался. слова разные, но всеравно для меня эти языки оч. похожи. разницы почти нет, если сравнивать с perl и хаскель.

crypt ★★★★★
()
Ответ на: комментарий от crypt

Все императивные языки похожи, это да. Но подходы и идиомы все же различаются. В руби сильно развиты средства метапрограммирования, и этим очень активно пользуются. Ну и объектные модели сильно разные. Еще в руби много перлизмов, так что он ближе к перлу местами. Питон более строгий и классический что-ли. На руби можно в принципе писать как на питоне, но обычно такой кодер быстро спрыгивает на сам питон, что логично.

bread
()
Ответ на: комментарий от bread

сильно развиты средства метапрограммирования

в петоне тоже

и этим очень активно пользуются

авторы библотек тоже

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

В петоне это почитается как чорная магия. А вот зачем бы мне руби без define_method и т.п. не представляю. Главное в питоне нет синтаксиса блоков и «все есть выражение», так что декларативщина идет мимо.

bread
()
Ответ на: комментарий от bread

Просто это не всегда нужно. Но если ты делаешь какую-нить ORM, например, там этого будет дофига.

define_method

Э? Ты можешь какие угодно методы добавлять к классам, объектам и т.п. Можешь создавать классы на лету, есть метаклассы, декораторы для классов, всякие __getattribute__, переопределять операторы и любое поведение.

синтаксиса блоков

Но ты можешь создавать функции внутри чего угодно и передавать как аргумент. Это активно используется, например, в декораторах.

pawnhearts ★★★★★
()
Ответ на: комментарий от bread

Книжный шкаф перло-сектанта. И такое для них норма.

Ох йопты, а чтобы освоть го нужно только пройти тур на оф. сайте.

AUX ★★★★
()
Ответ на: комментарий от AUX

Для перла тоже достаточно с переизбытком одной книги, той, что с верблюдом. Остальные книги - это просто интересное и полезное чтиво. Они так популярны у перловиков из-за того, что у перловой субкультуры есть очень авторитетные представители, написавшие самые известные книги, тот же Рэндал Шварц и Дэмиан Конвэй. Мы их просто уважаем и прислушивается к их мнению, без какого-либо фанатизма, но с большим интересом.

DRVTiny ★★★★★
()
Ответ на: комментарий от bread

Валидация внешних данных обязательна всегда, кроме разве что тех случаев, когда «очень некогда», а внешние данные являются таковыми лишь условно (для них не требуется защита от дурака или слишком умного). Причём здесь утиная типизация - я не в курсе.

DRVTiny ★★★★★
()
Ответ на: комментарий от crypt

говно, потому что он почти в точности python, но они ломают обратную совместимость каждый релиз. что ты там выше писал о perl vs python? по сравнению с ruby, python очень хорошо подходит для enterprise и это в свое время послужило причиной включения его в дистры by default (вместо ruby).

Это ты про тот язык у которого до сих пор две ветки (2.x и 3.x) живо?
Питон подхватили по нескольким причинам: наличие английской документации, ощутимый поддув от гугла и большая скорость работы.

С обратной совместимостью у руби куда лучше (значимым рубежом был переход с 1.8 на 1.9, ну и ближе к 3.0 когда будут основательно JIT встраивать), при этом ещё и адекватный utf-8 есть из коробки.

Exmor_RS ★★★
()
Ответ на: комментарий от saahriktu

Я бы хотел просто типизацию для написания быстрых библиотек. Собственно, это и есть rperl, но реализовано чуваком с завышенным ЧСВ и не умеющим писать документацию. Если его убедить в некорректности подходов или форкнуть и развить его проект уже в рамках части perl5 - получится вполне себе perl7.

Для остального perl-кода нужна не строгая типизация с приведением типов по необходимости, как это было сделано для Visual BASIC, где есть типа Variant

DRVTiny ★★★★★
()
Ответ на: комментарий от Exmor_RS

В дистрибутивах Ruby и не было никогда по дефолту, насколько мне известно.

А почему вы jRuby не пользуетесь?

Кстати, по мне, наличие годного асинхронного фреймворка под Ruby могло бы здорово поднять его популярность, особенно если бы RoR обзавёлся фишками как в Mojolicious.

DRVTiny ★★★★★
()
Ответ на: комментарий от pawnhearts

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

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Руби по дефолту есть в маке уже года 4 как минимум. А на линуксовых дистрах ставится при установке всяких пакетов для работы с системой (в дебиане всякие обвязки вокруг apt).

Да, по дефолту нет — питон раньше занял нишу, языки действительно похожи.

JRuby не поддерживает все библиотеки написанные для MRI.

Кстати, по мне, наличие годного асинхронного фреймворка под Ruby могло бы здорово поднять его популярность, особенно если бы RoR обзавёлся фишками как в Mojolicious

Ну куда же мы без GIL'а))) Конечно могло бы, но сейчас запариваются над скоростью больше (ruby 3x3 — JIT).

Exmor_RS ★★★
()
Ответ на: комментарий от DRVTiny

Я валидирую данные, которые приходят от пользователя. А то, что возвращают сторонние api - нет. Будет исключение, я его залогирую, а пользователю вернется ошибка.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

Это очень современный питон. Он хоть и идёт по дефолту много где, но часто только второй, особенно в энтерпрайзных el и centos. Поэтому для задач типа обсуждаемых в топике (заавтоматизировать что-то по мелочи) губу надо подзакатать. Хотя и с одной только базовой библиотекой можно много что сделать.

anonymous
()
Ответ на: комментарий от pawnhearts

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

DRVTiny ★★★★★
()
Ответ на: комментарий от pawnhearts

Задача была другая: приходит объект в функцию, если он callable, то надо работать с результатом его вызова, иначе с самим объектом. Например bound attribute vs bound method. Отсутствие рантпйм типизации иногда порождает извращённые решения: например, если функция может принимать iterable, но для удобства может принимать и один аргумент. Вот тогда делается что-то типа next(val), и в обработчике исключения создаётся одноэлементный список.

anonymous
()
Ответ на: комментарий от pawnhearts

обычные - нет, а для метапрограммирования бывают нужны traits. Конкретно callable мне нужен был для реализации remote proxy, когда локальный вызов через перехват __get_attribute__ прозрачно сериализовался, вызвался удаленно, а результат возвращался. Хотя наверное можно было бы и декораторами проблему решить.

anonymous
()
Ответ на: комментарий от DRVTiny

да это просто в unixcraft сегодня шутка пролетала, решил сюда запостить :)

pawnhearts ★★★★★
()
Ответ на: комментарий от DRVTiny

Ты не владеешь общечеловеческим хорошим стилем, братюнь. Твои листинги может и не отвратительны, но на 3 с минусом

anonymous
()
Ответ на: комментарий от anonymous

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

DRVTiny ★★★★★
()
Ответ на: комментарий от anonymous

Переменные $ТакогоВида - мне лично не нравятся. Ключи хешей без кавычек - признак дурного тона, в perl6 это вообще выпилили, и правильно сделали. Переменные типа our - ну это фу же. Даже не фу бар, а просто фу.

А так - не понимаю, чем это лучше? Тем, что код тупо искусственно сделан менее perl'овидным? Я, например, очень активно использую функциональные операторы map, grep, sort и короткие версии for/while. Может, они их просто не осилили, мне откуда знать. Я тут заглядывал в исходный код Pandora FMS - так там вообще такой лютый трешак, что аж стыдно становится за чуваков. А ведь это большой программный продукт. А смотрел в исходники VMware SDK - очень неплохо написано.

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Всем плевать что тебе нравится, а что нет. Это к стилю не относится, если ребята выбрали для проекта такой способ именования - это их дело. А вот переменные $redc,$hsc,$ki и $vi - скотство.

Если используешь постфиксные конструкции, нужно соблюдать два правила: 1. Проверяемые логические выражения должны быть простыми 2. Вся конструкция должна помещаться в одну строку.

fat comma была придумана чтоб не заключать в кавычки левый операнд.

use utf8 тебе там нахрена?

А ещё ты постоянно не к месту используешь переменные по умолчанию и магические числа.

Из сисадминов пришел небось?

anonymous
()
Ответ на: комментарий от DRVTiny

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

это не так. rtfm

anonymous
()

Надо было «Системное программирование ни Perl»

splinoz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.