Ильшад Хабибуллин

Свежие записи

15/5/2012 11:36

ORM нужны, ORM важны. Если есть под рукой хорошая оная, глупо не воспользоваться ей при случае, разве не так? А иначе приходится самому писать все эти проверки, валидации, придумывать очередной инлайн джиквери на пайсоне, раби или что там у вас, и вообще, стараться сделать код более, что ли... "монадичным"? а иначе чуть что, так смывать за собой надо.

Я о другом хотел сказать. ORM библиотеки дискредитируют понятие "модель". Потому как большинство из них (особенно при использовании внутри популярных веб фреймворков) предлагают программисту писать так называемые "модели". При этом одна модель отображается на одну таблицу в реляционной базе данных.

Но "модель" - это ведь более мудрое понятие, совсем не обязательно должное быть завязанным на одну определенную таблицу в БД. И даже совсем не обязательно на базу данных. Все это сделать можно. В конце концов, это обычные классы. Тем не менее, ORM навязывают разработчикам схему {модель:таблица}.

И вот эта идея генерирует массу плохих дизайнов во всем мире. Это не утверждение, лишь гипотеза.

12/5/2012 01:34

28/4/2012 02:14

К вопросу о построении высоконагруженных приложений.

12/4/2012 10:42

Идея для интернет проекта: сделать социальную сеть, в которой живут только боты. Реальные пользователи настраивают характеристики искусственного интеллекта своих ботов, шаблоны поведения и наборы целей. И боты общаются между собой, постят котиков, дружат, ссорятся и интригуют. А мы будем смотреть на это и охреневать.

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

И даже если случится Глобальный Пиздец (а серверы будут Спрятаны В Тибет) - наши боты будут продолжать жить за нас. Виртуальный Навальный все также будет раскрывать виртуальные преступления и предотвращать коррупцию среди нехороших ботов из виртуальной Единой России. Виртуальный Тема по-прежнему будет постить виртуальные сиськи. Виртуальный Варламов будет делать скриншоты виртуальных митингов на виртуальной Триумфальной Площади (куда будут ходить митинговать другие боты). Виртуальное правительство и президент... а впрочем, им ничего делать не надо, как и сейчас.

Это ли не вечная жизнь?

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

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

4/4/2012 19:52

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

Лямбда нужна только тогда, когда вы пишете ее сразу аргументом к другой функции. Когда еще ее применять в питоне - мне как-то и в голову сразу не приходит. Есть еще места?

2/4/2012 02:25

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

2/4/2012 02:13

The Developer's Toolkit. We asked 500 leading software developers from around the world what work apps they use the most: infographics.

30/3/2012 17:14

... Мы оснащаем разного рода брошюрками этих молодых ребят, и происходит страшное: они эти брошюрки читают. Мы-то издавали их не для чтения - как аксессуар: вот к сумочке полагается такой-то аксессуар, а к молодежному движению полагается такой аксессуар, как политическая литература. Это были муляжи концепций, муляжи идеологии. А комиссары это читали, и в голове, конечно, получалась невероятная каша, продукт которой уже налицо.

...

- Вы полагаете, эта риторика - «свои — чужие», «враги, предатели, бегающие за бугор», - будет продолжаться?

- История с Pussy Riot - вот пример. Все тот же концепт опасности, «оранжевая революция» - только в других терминах и других словах. И это будет воспроизводиться - как реакция на любую инаковость, любое несогласие. Как способ решения проблем.

... Боюсь, что будет востребован концепт раскола: летом, в июне или в июле, будут подняты тарифы и возникнет потребность в искусственной поляризации общества. Вопрос в том, кто окажется бенефициаром такого раскола? Система покупки лояльности элит достигла своего предела — бюджет и так уже в дефиците. А если кланы перестанут получать то, что они хотят, то тогда зачем им продолжать быть лояльными?

Политтехнологии от первого лица.

23/3/2012 22:12

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

("Ходячие мертвецы", 2 сезон, 13 эпизод).

23/3/2012 12:59

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

По правде говоря, язык там был смешанный - часть питон, а часть на джаваскрипте (с эрланговским паттернматчингом и с flow control по сигнатуре функции). Но то, как эта библиотека должна выглядеть при использовании - это совершено отчетливо проявилось (и не так, как писал в тестах задолго до этого, пытаясь представить как это будет при вызове из другого кода).

22/3/2012 21:40

После обеда поехал купить кофе. На Удельную. Jardin в магазинах стоит от 150 до 250 рублев за упаковку - кто во что горазд. У парней лезгинского вида, на Удельной - 50 рублей. Вполне европейская цена, а не питерская. Покупаешь 4 упаковки - еще пятую в подарок дадут. Не подделка, те же сорта, то же качество.

За две сотни рублей не одну, а пять. Пять, блин, вместо одной. Нравится мне такая разница.

Пока ждал трамвай, открыл читалку и обнаружил там книжку про монады со стороны теории категорий, которую [info]ivan_gandhi написал уж лет пять назад. Давно она в читалке лежит, больше года. А руки все не доходят. По другим источникам уже смотрел со стороны теории категорий, да все вкось.

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

Зато было время почитать.

Споткнулся, правда, на натуральных трансформациях (функторов). Понимаю, что не вижу, не чувствую. Блокнота и карандаша с собой не было, а вот окно (трамвая) оказалось грязным изнутри. Стал чертить пальцем на окне. Чертил - рисовал, в конце концов что-то увидел.

Дальше было проще.

Ну и вот, если читаете про монады с точки зрения какого-нибудь языка программирования (JavaScript, Perl, да на всех языках есть тьюториалы), то понятно-то оно понятно, но в коде и в логике разглядеть не сможете, скорее всего. Есть описания получше, например, с точки зрения идиом программирования. Уже помогает самому написать, но увидеть в существующем коде (если это не Haskell) будет трудно или невозможно. Так что остается самый "источник" - теория категорий. А с ней - если не интересно - бесполезно, на самом деле. А если интересно то да, захватывает. Ну и начинаешь видеть в коде лучше, кажется. По крайней мере, мне сейчас так кажется.

Вернулся поздно, еще работать.

Натуральные трансформации так и остались на окне трамвая номер 9, а книжка - да вот здесь она лежит. С ней еще не закончил, на самом деле - надо вернуться в середину.

А пятую упаковку парень зажал подарить большую. Подарил маленькую.

Надо было поторговаться.

22/3/2012 20:48

Иногда, рассуждая про всякие фреймворки, универсальные библиотеки для всего, etc., короче, рассуждая про инструменты, ставят контекстом ось, на одном конце которой находятся так называемые "новички", а на другом конце - так называемые "продвинутые пользователи". Что бы под этим не подразумевалось.

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

И вот я хочу сказать, что "забота о новичках" - это плохая причина для построения инструментов. Совсем никакая причина. Инструмент умирает не потому, что он сложен для новичков, а потому что продвинутые пользователи перестают им пользоваться. Если же они продолжают им пользоваться, то они развивают его. А "новички" - подтянутся.

22/3/2012 20:39

UPDATE сюда.

Мораль: иногда можно написать одно приложение, совмещая в нем два, и переключать его, скажем, конфигурационным файлом, вместо того, чтобы писать два приложения, и выносить их общую логику в отдельную библиотеку. Почему? Да потому что выносить код в библиотеку только для того, чтобы воспользоваться ей всего лишь два раза - может быть не самой удачной идеей.

Как вариант.

17/3/2012 01:44

... На самом деле инвестиции в науку растут. Например, объем госфинансирования научных исследований вырос с 2003-го по 2010 год с 246 млн до 723 млрд руб. (по данным Росстата). Правда, успехи наших ученых растут обратно пропорционально объемам инвестиций.

... глава Almaz Capital Partners Александр Галицкий: "Среди создателей бизнес-инкубаторов совсем немного тех, кто сам имеет опыт инновационного предпринимательства". 

... 
Вместо того чтобы подменять собой венчурного инвестора, государству стоило бы сделать то, что оно должно делать, — создать инфраструктуру.

Здесь.

17/3/2012 01:07

К вопросу о межвидовой консистентности пользовательских интерфейсов в применении к рабочим станциям на основе операционной системы "Линукс".

Я просто хотел сказать, что мне невыносимо насрать на этот вопрос.

Потому как нет у меня никаких интерфейсов, по большому счету. Нет всех этих рабочих столов, меню-пусков или их подобий, всех этих поребриков и заголовков окон. На экране есть емакс. Я в нем пишу код. Или еще что-нибудь, но большей частью только код. В самом емаксе, там внизу, отображается заряд батарей, время, температура с сенсоров, и всякое другое что захочу. А что еще, кроме буфера емакса нужно видеть психически здоровому, нормальному человеку? Ну, еще один буфер. Все остальное - от лукавого.

Потом нажимаю "Ctrl+T N", и вижу терминал, с запущенным в нем screen - поэтому можно пререскакивать между сеансами скрина с помощью "Ctrl+A N", "Ctrl+A P". Там, в глубине сессий скрина, запущено множество всяких серверов, а какие именно - я и сам не всегда помню. Как правило, я их все беспощадно пишу. Развививаю. Или думаю, что развиваю, а на самом деле только порчу.

Дальше можно еще нажать "Ctrl+T N" и увидеть гуглохром. Тогда система становится похожей на Chrome OS - есть только он и больше ничего.

Чтобы при открытии GTK-приложений не появлялось стойкое ощущение, что я перенесся на машине времени в начало нулевых годов - есть программка gtk-chtheme.

На самом деле, в StumpWM можно много еще чего добавить и сделать более "богатый" и функциональный вид - но я ничего этого не делаю. Вернее делал - но потом убрал. Мои настройки (а это просто код на старом добром Common Lisp) в основном сводятся к новым командам и быстрым клавишам для небольшого набора часто запускаемых GUI-приложений. У меня он небольшой, и я не думаю что он у кого-нибудь бывает сильно большой. Все мы используем ограниченный набор GUI-программ. И вообще, нынче все в браузере. Другие времена.

Нет, однажды я сделал привязки клавиш для кучи всяких не часто нужных программ - и в результате перестал помнить эти самые привязки клавиш. Оказалось, что проще нажать "Ctrl+T Ctrl+!" и ввести название программы, чем вспоминать какая там клавиша привязана.

И мне от этого не хуже.

Нет, на других, не основных компьютерах (например, на кухонном нетбуке - это тот, который живет дома на кухонном подоконнике) есть совсем-совсем современные виды, но я смотрю на них и понимаю, что они все двигаются ровно в ту сторону, на которой уже сижу с StumpWM. Так что это никакой не "хакерский олдскул", а наоборот, вперде своего времени. Потому и уходить с этого - нет смысла.

Кстати, у него вполне живая рассылка и разработка.

16/3/2012 16:17

С одной стороны

Много разговоров о том, что неплохо бы избавиться от UNIX наследия  в виде /usr/*-дерева. Ибо придумано оно было не потому, что это хорошая идея, а потому что так получилось - сначала у них на машине были одни разделы, потом прибавились другие.

Как этого достичь

Да ведь это просто. Когда кто-нибудь в следующий раз задумает создать новый дистрибутив Linux, выпустить его вообще без usr-дерева. Пакеты делать так, чтобы они ставились в корень. Установки из исходников обычно позволяют осуществить это прямым указанием параметров для configure. Т.е., в большинстве случаев, если написали прямыми руками.

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

Один сделает дистрибутив без usr-дерева, другой сделает - это же случается периодически. Потом появится популярный, новый убийца убунты (рано или поздно наверняка и такое случится). Постепенно usr-дерево станет антистандартом. Это если людям понравится. А не понравится - значит плохая идея.

Кроме того

Можно вообще все ставить в /opt. Будет как в венде, собственное дерево для каждой программы. Линки в /bin - красиво и правильно. Помойку в /etc лучше оставить - это хорошее изобретение.

С другой стороны

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

Или я и здесь что-то упустил?

15/3/2012 19:48

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

Артем Чепчурин подробно рассказал про Yesod. Мне это интересно, потому как я о именно о таких идеях думаю давно. Но сам йесод использовать страшно. Зато, быть может, там есть чего препарировать и пересадить на более другие языки чем хаскель. Правда, для того чтобы препарировать, нужно поиспользовать на практике и в продакшыне. Иначе добра не выйдет, а получится как обычно.

"Гонки на Эрланге" Антона Ларцева - простой  и адекватный рассказ про то, как да что делали, такой архитектурный обзор. Он отличный докладчик.

Борис Бергаут рассказывал, как они делают авиатренажеры. Про хаскель он там ничего не успел рассказать, позднилось ужо. Но про авиатренажеры - жутко интересно.

Ну и линк.

9/3/2012 12:22

Интересно, вернутся когда-нибудь стековые архитектуры в аппаратную реализацию? Ядро простое как тапки. Кидаем сотни тысяч и даже миллионы таких "ядрышек" и получаем супер-дупер параллелизм круче GPU-шного. Изначально очень ограниченная система команд, оптимизация на уровне функционального языка сверху и поехали. Так ведь можно и переиграть "регистровые" машины, нет?

6/3/2012 09:51

Контекст.

Компонента, реализованная в виде сервера на python/pyramid, инкапсулирует (в контексте всей системы) логику взаимодействия с сторонним сервисом, и предоставляет:
  • пользовательский интерфейс для настройки параметров такого взаимодействия, с одной стороны;
  • внутренний API для других частей системы, с другой стороны.
api-часть подвергается интенсивным запросам. Эти запросы асинхронны к действиям пользователя (строго говоря, вообще никак не связаны). Таким образом, в своей api-части сервер фактически играет роль гейта к стороннему сервису. Иначе говоря, он транслирует запросы к своему простому api в запросы к более сложному стороннему api, при этом добавляется много другой логики, например логика, связанная с авторизацией. Т.е. работа с сторонним сервисом не тривиальна, здесь есть свои вопросы развития и поддержки стороннего api, поэтому необходимость наличия такого гейта в данной архитектуре сомнений не вызывает.

Проблема.

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

Хотелки.

Что хочется? Разумеется, разделить эти две роли: пользовательский интерфейс и api-гейт. Тогда мы можем позволить себе высокие нагрузки на основных рабочих задачах (которые связаны с разнообразным взаимодействием с разными сторонними сервисами), но все эти нагрузки никак не будут отражаться на пользовательском интерфейсе. Это все происходит у нас внутри и пользователи это не видят.

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

Другая проблема.

Но, разделяя эти задачи на два разных программных сервера (единицы развертывания), мы плодим дублирование кода и прочие непотребности. Т.к. нужно иметь возможность запускать единицы развертывания в разных конфигурациях (разработчиская, юнит-тестовая, кьюэйная, на-поиграться менеджерам, рабочая конфигурация и т.д), тут так уж получается, что даже сделав обе задачи на Python/Pyramid, логику взаимодействия с сторонним сервером не сильно и вынесешь в разделяемую библиотеку. Вернее, вынести-то можно, но тогда появляется третья единица развертывания (пайтоновский пакет с библиотечным классом), и кроме этого появляется дополнительный дурацкий код, организующий наследование классов, перегрузку методов и прочую лишнюю ООП-дрянь, которую так не хотелось бы иметь в наших очень компактных по своему исходному коду компонентах-сервисах.

Решение.

Обе задачи (UI & API-gate) оставлены в пределах одной единицы развертывания - все тот же сервер на python/pyramid, простой, компактный, легко обозримый. Но в paste-configuration файле (.ini-файл) вводится дополнительный параметр system.api = true/false. Декоратор, который выглядит буквально так:
def api(func):
    def wrapper(req):
        if not asbool(system_params.api):
            raise HTTPNotFound
        return func(req)
    return wrapper
используется для функций - видов, реализующих api (прим.: system_params - это не пирамидовский обьект, а мой, который я давно и привычно использую для более удобной работы с произвольными параметрами в .ini файлах).

На некритичных конфигурациях (development.ini, testing.ini, staging.ini и проч.) этот параметр задан как true. Поэтому в этих конфигурациях UI и api-гейт - это один и тот же сервер.

Рабочая конфигурация разделена на две: produciton_ui.ini и production_api.ini, и api "включен" только в одном из них. Безопасность доступа к api обеспечивается сетевыми средствами. Поэтому к второму снаружи никак не подступишься, а на первом такие методы отдают Not Found.

По-моему, разумное решение, и не выглядит костылем. Оба зайца одним коммитом.

UPDATE.

Мораль: иногда можно написать одно приложение, совмещая в нем два, и переключать его, скажем, конфигурационным файлом, вместо того, чтобы писать два приложения, и выносить их общую логику в отдельную библиотеку. Почему? Да потому что выносить код в библиотеку только для того, чтобы воспользоваться ей всего лишь два раза - может быть не самой удачной идеей.

5/3/2012 12:31 - Нарисовал вот

Как видят друг друга представители разных политических движений

При клике на картинку откроется в полном размере.
Метки:
Разработано LiveJournal.com