Впечатления от less и twitter bootstrap

Свои проекты я в основном разрабатываю один. Оно и очевидно, пока проекта нет - никто не понимает смысла помогать, а когда я с горем пополам его делаю, никто уже особо и не хочет помогать. Самая большая проблема у горе-пронроместа типа меня - это интерфейс. Ладно, я могу порисовать на доске маркером и примерно понять что и где будет расположено, но чтобы потом это хорошо выглядело в конечном продукте - беда. Потому каждый раз я получаю бочку говнеца от дизайнеров, помогать, однако, которые не хотят. Завидую десктоп-разработчикам, у них наверное такой проблемы нет. Накидал кнопочек на форму, наставил им обработчиков, только сиди указатели туда-сюда таскай или утечки памяти замеряй.

В свое время я уже пробовал, так называемые "решения проблемы" в виде CSS-фреймворков. Тысячи их, любого верстальщика ночью разбуди, он назовет всякие "960", "Blueprint", даже если не пробовал ни один. Как любая стильная модная вещь, они широко обсуждаются сообществом и у кого-то даже получалось что-то готовое на них сделать. У меня нет. Ни у кого, кого я знаю, тоже. Но пока не будем.

Twitter Bootstrap

Недавний релиз Twitter Bootstrap 2.0 снова всколыхнул ОйТи-ресурсы, да даже так-то сильнее обычного. Даже мой любимый дизайнер и арт-директор Артурчик, который до CSS-градиентов-то до сих пор боится и до сих пор иногда требует скругленные уголки верстать картинками, начал расспрашивать меня юзал ли я его уже. В любой другой момент я бы даже не задумался, но тут на носу как раз был очередной экспериментальный проект, который я делал полностью сам и, конечно же, не имел дизайна. Так и решил попробовать.

Сразу все кажется очень неплохо. За исключением некоторых моментов, почти что МАГИЯ. Сделал div class="smth" и стал он крутой кнопочкой с градиентами и ховерами. Так и должно быть в любом css-фреймворке, первый тест пройден. С навигацией чуть сложнее, там уже "для совместимости с IE 6-7" сделаны inner-блоки и МАГИЯ немного теряется, но тоже терпимо. 12-колоночная сетка есть, модная "940-пиксельная" верстка есть, responsive design (не смог вспомнить как это по-русски) есть. Буквально за пару строчек кода простая домохозяйка может сверстать свой твиттер. Ну не чудо ли?

Далее »

Управляемая раздача файлов через nginx

Привет, мои маленькие прогродрузья. Сегодня я расскажу вам то, о чем, как выяснилось, не знают многие веб-прогроммисты. Совсем недавно я переписал свой storage, потому что предыдущий не устраивал меня по нескольким причинам: он был написан мною давным давно на РНР, и по началу вполне устраивал меня, но времена меняются, про РНР я давно забыл, а память, отжираемая apache, стала слишком дефицитным ресурсом, потому что стала требоваться еще многим более важным процессам на сервере. Потому примерно в то же время я перешел на nginx и с тех пор жил счастливо. Пришлось, правда, поебаться со сборкой php-fpm, по крайней мере тогда (2 года назад) под debian даже готовых пакетов с этим добром не было (либо были под древние версии, под etch и sarge). Потому как работает PHP на моем сервере мне всегда не нравилось и я начал избавляться от таких проектов. После глобальной чистки оставалось всего 2 необходимых мне сервиса - это тот самый storage и phpmyadmin. Теперь остался один, да и тот в основном для работы.

Так к чему это я веду. В первой версии сторадж представлял из себя просто файл index.php, который сканировал папку, в которой лежал, разбивал все файлы по категориям, и выводил списком. Скачивались файлы, естественно, по давней традиции тупо по хотлинку. От этой практики я решил тоже отказаться, что уж говорить, 4 года назад я был настолько туп, что первые пару дней даже не фильтровал заливку туда файлов с расширением *.php, а никакого chroot там в помине не было. В общем во второй версии я решил завести для всего этого дела небольшую БД (sqlite вполне подошел) и переписать-таки все на питоне.

Теперь при загрузке файла и всяких очевидных проверок на коллизии имен, он клался в специальную папочку, а запись о нем, сгенерированный ID и еще куча полезных параметров, клались в sqlite. Одной фичей, подсмотренной в одном платном сервисе, был просмотр истории скачиваний, его я тоже захотел себе. Поэтому когда пользователь хочет скачать файл: делается запрос в БД на существование записи и изъятие полного имени файла (файл при заливке немного переименовывается, а при коллизиях - тем более), если все удачно - запрос к диску на проверку существования файла (ну мало ли что бывает), когда и тут все хорошо - запись в историю доступа и, собственно, отдача файла по http.

Стандартно, прямолинейно, ничего нового. Любой, кто работал с файлообменниками, переживал еще большую анальную боль при попытке скачать файл. Сюда можно добавить еще таймеры, капчи, генерацию "временных эксклюзивных url", кнопку "БАБЛО", etc. У нас случай простейший и написать такое под силу даже Студенту АВТФ, успешно сдавшему лабораторную работу по курсу ООП и БД. Но остается один вопрос, описанный в теме поста: как отдать файл пользователю? Я расскажу несколько способов со смешными кодовыми названиями, которые я придумал только что.

Далее »

Меня очень часто спрашивают совета какую книгу по тому или иному языку программирования или фреймворку я посоветую. Я как-то уже зарекался давать советы, потому что после этого всегда ко мне возвращаются со словами "ЧТО ЗА ХУЙНЮ ТЫ НАМ НАСОВЕТОВАЛ, У МЕНЯ ОТ НЕЕ БРАТ В КОМЕ" и я чуть ли не всю жизнь теперь должен за это расплачиваться, хотя я предупреждал, чтобы сначала поискали сами и оценили. Ведь я советую исключительно из своего скудного опыта и могу ошибаться. Понравившаяся мне книжка может вызывать просто бурю баттхерта в тематических коммьюнити и наоборот, самая известная и рекомендуемая на каком-нибудь хабре книженция будет очередным сборником "Полезных Советов" Г. Остера и ничего нового мне не сказать. Все это означает, что мое мнение - не истина в последней инстанции и может расходиться с мнением большинства, поэтому не стоит воспринимать его как призыв к действию. А так же очевидно, что все книги по определенной тематике прочитать невозможно, поэтому буду советовать только те, которые я либо прочитал полностью, либо не полностью, но достаточно, чтобы иметь представление о них. Я буду специально оговаривать, если книгу я не дочитал по каким-то причинам. Так же, особой фишкой будет распределение книг по (обычно) 3 уровням подготовки, так например книжки 1 уровня - совсем для тех, кто ничего не знает, далее - более продвинутые, ну и самые лучшие, так сказать Евангелие в своей области, будут обозначены 80 левелом, для лучшего понимания аналогии. Но не во всех областях я нашел книжки с максимальным уровнем, в некоторых поиски до сих пор продолжаются, либо я не стал осиливать дальше определенного (например Objective-C или Java). Бывает и обратная ситуация - я очень часто не могу посоветовать книжку "начального" уровня, потому что сам учился очень давно и не разбираюсь в современном положении дел. Да и вообще некоторым технологиям куда проще научиться, прочитав парочку статей в тематических блогах, чем искать книжки, в которых в очередной раз, исключительно для увеличения количества страниц, автор будет объяснять вам что такое ООП и наследование, а так же как объявлять переменные.

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

Далее »

Все программисты любят сраться. Даже не так. Все адекватные люди, сидящие в интернете хоть сколько-нибудь долго, любят сраться. А адекватно разбирающихся в нем людей по старорусской традиции называют "программистами" (хотя люди, написавшие в своей жизни хоть одну программу, не считая лаб-курсачей, составляют процентов 10 из них). Вот недавно я наткнулся на критику в сторону моего кода в блоге одного из тех 10%. Задело. Задело даже не то, что я действительно нарушил какие-то правила, чего-то не знал или не уследил, а то, что большинство из предъявленных обвинений было к тем ошибкам, которые совершались намеренно.

Думаю те, кто знаком хоть немного с программированием, знают такой интересный и немного творческий аспект этой практики: одну задачу почти всегда можно решить несколькими способами. Даже более того: у всех этих способов почти всегда есть недостаток, который позволяет вылить на него тонны говна. Хотим искать по массиву? Сделай BST и ищи за log(n), но готовься, что оно выродится и ты будешь искать за O(n). Фу-фу-фу, давай сделаем RB или рандомизированное, там балансировка, все дела. Тогда готовься, что время вставки у тебя резко увеличится. Зато ищем за log(n) и не ебет. Даже не важно, что вставляют в дерево у нас 2000 раз в минуту, а про поиск знает только сам программист и его кот. Зато RB стильно, модно, молодежно, ты написал целый 1 дополнительный к BST метод для вращения (или ротации, как смешно перевели в Кормене) и целый if при вставке. RB-деревья в 2012 году выходят из моды? Тогда давайте B-деревья сделаем? Как никто не говорил, что можно искать только по 1 ключу? Ну уже поздно. Хотим искать по нескольким? Ничего, на каком-нибудь хабре обязательно найдутся те, кто посоветует какое-нибудь NoBST или MongoRB и будут агитировать это как панацею от всех бед. У них там поиск за 0.999log(n) и не ебет.

Это только первый аспект »

Продолжение начавшейся у меня в твиттере, и продолженной с помощью werehuman анонимусами на psto шутки про то, если бы программисты строили дома.

- О, так ты строитель. Построй мне дом, ты же умеешь. Ну по мы же с тобой давно знакомы. В смысле какой? Чо дома ни разу не видел? Ты же строитель, вон сколько домов построил, я видел. Только у меня денег щас нет, давай ты мне построишь, а я тебе потом отдам. Какие еще стройматериалы? Ты же строитель, ты и купи. Делай все как правильно! Поиграй с кладкой стен. Не, что-то красный кирпич не очень. Мы с женой подумали и решили делать белым, разбирай. Фундамент? Так все вон на землю ставят, что за херню ты мне впариваешь? Я что лох что ли? У меня сосед строитель! Я знаю!

В смысле сколько этажей? Ой, я совсем не разбираюсь в этих ваших технических штучках, а сколько этажей в среднем доме? Давай два. Не, давай 50. Хотя нет, 10. Ну я не знаю, ты построй пока три, а мы потом еще обговорим, может подвал достроим. Начинай завтра, времени совсем мало.

А можно еще вот здесь чтобы дверь была на улицу? Ну и что, что третий этаж, сделай!

БЛЯДЬ, У МЕНЯ БРАТ ИЗ НЕЕ ВЫПАЛ И УМЕР! Что за хуйню ты мне сделал? Ты что, вообще дурак? Ладно, поставь туда балкон. Какие еще деньги, вон ты же недавно дом строил, давай возьмем балкон оттуда.

Далее »

Введение в информационный поиск

Близится к завершению чтение моей старой мечты - книжки "Introduction to Information Retrieval" авторы которой Кристофер Д. Маннинг, Прабхакар Рагхаван, Хайнрих Шютце (ISBN 978-5-8459-1623-5, 978-0-5218-6571-5). Переведенная Яндексом на русский язык и вышедшая в издательстве "Вильямс" тиражом всего-лишь в 1000 экземпляров (!) и быстренько разошлась по коллекционерам и сотрудникам Яндекса (которых вообще больше 2500). Я даже нашел одного, у кого есть, но он сказал, что электронной версии нет, а заставлять фотать было бы неуважительно. По старой доброй Русской традиции PDF или любую другую электронную версию никто делать не собирался даже при таком "огромном" тираже. Соответственно найти ее было почти не реально, в отличии от оригинальной версии, которая всю жизнь была доступна на соответствующем сайте: http://nlp.stanford.edu/IR-book/. Стенфорд как-то никогда не парится по поводу своих материалов (чего только стоит их канал в iTunes U), в отличии от наших, которым либо хотелось побольше заработать, либо мало заплатили. В итоге поиски книжки затянулись аж на пол года, я даже писал запросы на хабр в Q&A, где мне сначала никто ничего не подсказал, только кто-то нашел на сайте bookmate.ru.

С bookmate вообще отдельная история, вроде бы заботящийся о своем имидже и набирающий популярность среди гик-сообщества ресурс, допустил фейл, тупо не проверив книжку перед публикацией (за денюжки, естественно). В итоге мне в качестве демо дали прочитать первые 10 страниц и, наивно поверив в свое счастье, я оплатил подписку на месяц. Каково же было мое удивление, когда после уплаты всех денюжек мне дали... еще 10 страниц. А остальные 600? Может я что-то сделал не так? Может дал мало? Написав запрос в саппорт, а через сутки и в твиттер, я наконец-то получил ответ, мол мы извиняемся, но ничего сделать не можем. Книжку быстренько удалили, а мне посоветовали "провести оплаченное время с пользой" и почитать какую-нибудь "Анну Каренину". Хотя в моей ситуации "12 стульев" или "Золотой теленок" подошли бы куда лучше. В итоге денюжки я заплатил, а ресурс больше не посещал. Типовой пример бизнеса в этой стране, в Сколково их возьмут точно.

Шучу, говорят хороший сервис, это мне долбоебу как обычно не везет :(

Далее »

Пара вопросов для Python-задрота

Помню недавно меня попросили о странном: какие вопросы можно задать Python-программисту, чтобы оценить его знания? Честно говоря, я не люблю подобные тесты, ибо все они сводятся либо в синтетику в вакууме, либо в знание определенных функций из документации и багов языков. Еще их обожают давать на всяких собеседованиях, где высшей степенью идиотизма явзяется запрет гуглить и писать все на листочке. Ну там типа "как сделать xor в питоне?". Ну хотя бы вспомните смешной топик на хабре про Senior PHP и мой несмешной ответ. Его хоть и заплюсовали, но я все равно получил за него, по-моему, -5 кармы от злых похапешников. Ну это еще хорошо, РНР'шники на хабре - самая озлобленная на всех остальных каста, редко склонная к самоиронии, так что обычно за срачи в РНР-топиках срубают больше. Но смысл моей иронии понятен - из трех вопросов по РНР, к РНР относится ноль. А так как любому хоть сколько-нибудь понимающему программисту обычно насрать на названия всех методов класса string, даже я до сих пор частенько подсматриваю их названия через bpython и ничего, жив, нужно что-то другое. Максимум, что я могу тут потерпеть, это вопросы типа "как вывести список всех полей и методов объекта, начинающихся на 'jopa'". Любой питонист ответит что-то из разряда:

>>> [x for x in dir("") if x.startswith("t")]
['title', 'translate']

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

Начнем с простого вопроса, чтобы просто определить - перед тобой свитчер с С++ или мальчик мануал хоть раз видел.

Вопросы »

Алгоритм A* на Java

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

A* или A Star, как там его называют, один из тех алгоритмов, которые я по незнанию отношу к разряду «волшебных». Потому что вроде бы просто набор правил, простые итерации с подсчетом почти ничего не значащих коэффициентов, а получается красиво. А если еще поиграть шрифтами параметрами, то иногда даже смешно получается. Ну а так же это самый известный и, в зависимости от реализации, быстрый поиск пути, потому что работает за логарифм. Его модификации используются практически везде, начиная от навигаторов и кончая играми (самая широкая сфера его применения). Именно благодаря последним мы получили так много его модификаций и улучшений, потому что именно в играх, где нужно после единственного клика школьника, проябывающего пары перед монитором, просчитать путь сотен юнитов и послать их по правильной траектории, разработчики и стараются применять самые совершенные методы его оптимизации. Я читал интервью по этому поводу с программистом Age of Empires и Starcraft, очень много интересного рассказывают.

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

Коротко + код »

Правильный договор подряда для фрилансера

г. Сочные Луки

"31" февраля 2011 г.

Молодая, динамично развивающаяся копания «Сызрань inc.» в лице главного исполнительного заместителя экс-президента по влажной уборке Бориса Борисовича Конь, действующего на основании Устава, именуемая в дальнейшем «Заказчик», «Тот поцан», «Как его там, ну этот деревенский», с одной стороны, и г-н Фрилансер Валерий Анфисович, именуемый в дальнейшем «Подрядчик», «Лентяй», «Наш Компьютерщик», с другой стороны, руководствуясь Трудовым кодексом Российской Федерации, заключили настоящий договор о нижеследующем:

1. Предмет договора

1.1. Подрядчик обязуется как можно скорее согласиться выполнить по заданию Заказчика халтурку, указанную в пункте 1.2 настоящего договора, сдать ее на половину Заказчику и свалить нахуй, а Заказчик обязуется принять результат работы и щедро обложить матом Подрядчика и всю его родню до 3 колена.

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

1.3. Работу Подрядчик выполняет исходя из своих скудных знаний, на своем старом компьютере, который купила мама в 8 классе, чтобы сына учился, а не играл в компьютерные игры целыми днями, блеать, сука, иди делай уроки.

1.4. Работа по наябыванию Заказчика считается выполненной после получения предоплаты и посылания нахуй Заказчика или Подрядчика противоположной стороной. Акт приема-сдачи работы, изобретенный маргиналами в прошлом веке, плохо вписывается в концепцию 3 тысячилетия, а так же в лень Подрядчика, поэтому отсутствует как факт.

1.5. Все права на созданный говносайт Заказчика, переходят к Заказчику.

1.6. Предыдущий пункт настоящего договора никто не понимает.

Далее »

О зиме, веселье и рутине

Зимние ночи не только длиннее летних, но и нагнетают больше уныния. Смотря летом в окно кухни частенько возникает желание «там классно, пойду залезу куда-нить или просто сделаю круг по городу, чтобы лучше спалось». Зимой же желание одно — сидеть в теплой квартире и нихуя никуда не соваться. Даже страшно как-то, зимой постоянно кажется, что вокруг гопота, даже не смотря на то, что летом на свободных лавочках их куда больше. Все самые неучачные стычки с гопотой были именно в зимне-весенний период. Вроде бы та же ночь, те же звезды, но какое-то отвращение и совершенно отсутствующая тяга к прогулкам.

К чему это я? Зимнюю ночь очень хорошо проводить с друзьями за... например Heavy Rain. 6 человек, 9 часов геймплея с перерывами на перекур после каждого напряженного момента. Я не представлял, что возможно вот так вот за ночь компанией пройти игру, даже такую относительно длинную. Но нет, это же Heavy Rain. Самое эпичное интерактивное кино длиной 8 часов, это как 3 раза посмотреть Властелина Колец. Только вот от второго засыпаешь уже через час, а первый заставляет 6 человек всю ночь лежать на неудобном ковре и пялиться на 720р экшена на экране. Удивляюсь как соседи не пришли дать пиздюля за крики «бляять, от себя и вверх, бляяять, L2, Move» в 3 часа ночи. Самому проходить, конечно же, более эпично, да еще и одному дома, когда все решения принимаешь только ты, а не коллектив. Но стоит отдать должное игре, она таки не раскрыла убийцу до самого конца. Когда играешь один, можешь пропустить что-то важное для зацепки, но когда вас 6 человек, любое сказанное слово становится предметом догадок и обсуждений. Но все равно не догадались пока не показали. Эпично, круто, а потом отсыпаться до 2 часов дня. Я считаю вечеринка удалась. Редкое развлечение может увлечь столько народа заниматься одним делом до 7 утра. Даже почти без алкоголя. Второй раз наблюдать происходящее, конечно, не так интересно, но народу вроде понравилось.

Далее »