Search
Write a publication
Pull to refresh
3
0.3
Send message

Учим старую собаку новым трюкам или как я научился любить str.format и отказался от %

Reading time7 min
Views63K
Предлагаю вниманию читателей хабры и поклонникам python перевод довольно объемной статьи о форматировании строк. Сказка будет правдивой и намек в ней будет на то, что консерваторам стоит иногда рассматривать что-то новое, даже если привычка упорно сопротивляется.

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

Жду замечания по ошибкам в оформлении и опечаткам в личку — с меня традиционные хабраплюшки.
Далее слова автора оригинальной статьи

Реализация стека, очереди и дека на языке F# в функциональном стиле

Reading time5 min
Views5.4K
Недавно я познакомился с концепцией функционального программирования. Возможно, в этой статье я изобретаю велосипед, однако я считаю, что эти действия являются весьма полезными для обучения, а также для более чёткого понимания функционального программирования.

Давайте попробуем реализовать основные типы данных: стек, очередь и дек — на языке F#, по возможности используя чистые функции. Естественно, они будут основаны на списках.

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

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

Стек


Прежде всего начнём со стека. В F# основным типом данных для хранения нескольких однотипных элементов является не массив, а список. Если перед нами стоит задача превратить список в стек, то какие функции нам понадобятся?

Во-первых, нам необходима функция для добавления элемента в вершину стека. Эта функция традиционно называется push. Однако эта функция нас особо не интересует, поскольку она очень просто реализуется:

let push stk el = el :: stk


Довольно простая функция, которая имеет тип 'a list -> 'a -> 'a list, однако не все дальнейшие функции позволят обращаться с собой таким простым способом.

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

Читать дальше →

Готовое решение доступного видеоплеера на HTML5

Reading time3 min
Views52K
Видеоконтент уже прочно вошёл в мир Интернета и без него уже трудно представить глобальную сеть. Тем не менее, технологии встраивания видео в гипертекстовые документы за прошедшее время прошли определённую эволюцию: от RealPlayer к QuickTime и Flash, а в настоящий момент до встроенной поддержки видео в HTML5. Тем не менее, всё это время различные реализации видеоплееров страдали как от проблем кроссплатформенности и кроссбраузерности, так и от низкого или вообще нулевого уровня accessibility. И если способы борьбы с первой группой проблем в целом понятны и существуют в форме готовых решений, то вот проблемы доступности для подавляющего большинства web-разработчиков и без того, как правило, сложны для понимания, а в отношении видео совсем оставались загадкой. Однако, к счастью, появилось готовое решение и второй проблемы, так что все желающие смогут обеспечить своим пользователям полностью доступный видеоплеер и без глубоких компетенций в web accessibility.
Читать дальше →

String enum — строковые enum

Reading time11 min
Views55K
Я работаю в игровой сфере. В связи с этим постоянно приходится сталкиваться со всевозможными конфигами.
Каждый раз, когда в конфигах должно быть некое перечисление, возникает дилема. С одной стороны, хочется читаемых конфигов, с другой — быстрого парсинга и быстрого обращения по этому типу.
Что хочется:

"type":
[
	{
		"id": 1,
		"type": "one",
	},
	{
		"id": 2,
		"type": "two",
	},
	{
		"id": 6,
		"type": "three",
	}
]


Но в тоже время в кодe хочется использовать структуры типа:

enum Type
{
	one,
	two,
	three
};



Далее в теле статьи будут приведены несколько вариантов решения.

Читать дальше →

Как делают гигантские зеркала для телескопов

Reading time3 min
Views72K


Пустыня Атакама в Чили — райское место для астрономов. Уникальная чистота воздуха, благоприятные атмосферные условия в течение года и крайне низкий уровень светового загрязнения делают этот негостеприимный район идеальным местом для строительства гигантских телескопов. Например, телескоп E-ELT, под который уже готовят строительную площадку. Однако это не единственный масштабный проект подобного рода. С 2005 года ведутся работы по созданию ещё одного впечатляющего астрономического инструмента, Гигантского Магелланова Телескопа (GMT). Так он будет выглядеть после окончания строительства в 2020 году:



В основе его оптической системы лежит отражающая поверхность из 7 огромных круглых зеркал. Каждое диаметром 8,4 м и весом 20 т. Само по себе изготовление таких зеркала, да ещё и с требуемой точностью, представляет настоящий инженерный шедевр. Как же создаются подобные изделия? Об этом — под катом.
Читать дальше →

CSS GuideLines, часть 3. Именование классов

Reading time5 min
Views45K


Соглашения по именованию CSS позволяют писать строгий, чистый и красивый код. При соблюдении правил именования вы всегда будете знать:

  • Для чего используется класс;
  • Где класс может быть использован;
  • С какими другими классами связан этот класс.
Читать дальше →

Две красивые задачи по алгоритмам

Reading time4 min
Views69K
На этой неделе я начал читать бакалаврам Академического университета базовый курс по алгоритмам. Начинал я совсем с основ, и чтобы тем, кто с базовыми алгоритмами уже знаком, было чем заняться, я в начале пары сформулировал две, наверное, самые свои любимые задачки по алгоритмам. Давайте и с вами ими поделюсь. Решение одной из них даже под катом подробно расскажу. Но не отказывайте себе в удовольствии и не заглядывайте сразу под кат, а попытайтесь решить задачи самостоятельно. Обещаю, что у обеих задач есть достаточно простые решения, не подразумевающие никаких специальных знаний по алгоритмам. Это, конечно, не означает, что эти решения просто найти, но после пары один из студентов подошёл и рассказал правильное решение первой задачи. =) Если же вам интересно посмотреть на начало курса или порешать больше разных задач — приходите к нам на (бесплатный) онлайн-курс, который начнётся 15 сентября.

Задача 1. Дан массив A длины (n+1), содержащий натуральные числа от 1 до n. Найти любой повторяющийся элемент за время O(n), не изменяя массив и не используя дополнительной памяти.


Сразу поясню. В условии не говорится, что каждое число от 1 до n встречается в массиве, поэтому повторяющихся элементов там может быть сколько угодно (если бы все числа входили по разу, а одно — дважды, то задача была бы гораздо проще). Ограничение на использование дополнительной памяти означает, что нельзя заводить дополнительный массив линейной длины, но можно заводить переменные.

Задача 2. Дана матрица nxn, содержащая попарно различные натуральные числа. Требуется найти в ней локальный минимум за время O(n).


Локальным минимумом матрицы называется элемент, который меньше всех своих четырёх соседей (или трёх, если этот элемент лежит на границе; или двух, если это угловой элемент). Обратите внимание, что от нас требуется линейное по n время, хотя в матрице квадратичное по n число элементов. Поэтому мы предполагаем, что матрица уже считана в память. И нам нужно найти в ней локальный минимум, обратившись лишь к линейному количеству её ячеек.

Под катом — решение первой задачи. Ещё раз призываю вас заглядывать под кат только после того, как порешаете задачу. По второй задаче могу какую-нибудь подсказку сказать.
Читать дальше →

Как я создавал плагин постраничной прокрутки One Page Scroll с открытым исходным кодом

Reading time12 min
Views59K
Эффекты прокрутки используются в вебе уже давно, и хотя есть уже много плагинов, из которых можно выбрать, лишь малая их часть обладает таким малым весом и простотой, какие требуются для многих дизайнеров и разработчиков. Большинство виденных мною плагинов пытаются сделать слишком много, в результате чего их трудно включать в свои проекты.

Не так давно Apple представила iPhone 5S, и сайт с презентацией, где страница была поделена на секции, и каждая секция описывала одну из особенностей продукта. Я подумал, что это – замечательный способ представления продукта, исключающий возможность пропустить ключевую информацию.

Я отправился на поиски подходящего плагина, и к удивлению, не обнаружил такового. Так и родился плагин постраничной прокрутки.
Читать дальше →

Инстанциирование шаблонов функций по списку типов (Часть 2)

Reading time5 min
Views9.6K
В первой части мы обсудили, как добиться переноса определения шаблона фунции из заголовочного файла в исходник, если набор типов, для которых должен быть инстанциирован шаблон известен заранее. В этой части мы посмотрим, как добиться этого красиво.
Читать дальше →

CSS GuideLines, часть 2. Комментирование кода

Reading time3 min
Views21K


В каждом проекте есть определенные нюансы и тонкости, которые помнят далеко не все, и худшее, что может случиться с разработчиком — это работа с кодом, который писал не он. Даже запоминание тонкостей своего собственного кода является возможным только до определенной степени, не говоря уже о чужом коде. Именно поэтому CSS надо комментировать.
Читать дальше →

CSS GuideLines, часть 1. Синтаксис и форматирование

Reading time8 min
Views44K


Введение


CSS не идеален. Поначалу кажется, что он прост в освоении, но работая над реальным проектом вы столкнетесь со многими проблемами. Мы не можем изменить то, как работает CSS, но мы можем изменить тот код, который мы пишем.
Читать дальше →

Что не нужно кодить самостоятельно

Reading time6 min
Views74K
Недавно написал свой велосипед и выложил его на хабре. Вот он: «Простейший Connection pool без DataSource в Java». Статья не из самых удачных, только прошу больше не минусовать. Итак, чтобы не повторять такие ошибки самому и, возможно, предостеречь кого-то от таких ошибок, решил перевести статью «Seven Things You Should Never Code Yourself» достаточно известного в среде open-source деятеля IT-области — Andy Lester'а. Итак, кому интересно, прошу под кат.
Читать дальше →

Пишем проигрыватель lossless аудио на JavaScript

Reading time10 min
Views18K
Добрый день, %username%. Сегодня я хотел бы поделится своим опытом разработки прототипа онлайн lossless аудио плеера.

На сегодняшний день, вряд ли можно кого-то удивить аудио или видео плеером, встроенного непосредственно в веб-страницу. Существующие технологии, библиотеки и API позволяют легко наполнить сайт любым медиа-контентом. Но есть такие люди, которым этого недостаточно (в том числе я). Именно поэтому, как истинному любителю музыки в lossless, мне потребовалось сделать браузерный плеер поддерживающий такой формат аудио, как flac.
Читать дальше →

Инстанциирование шаблонов функций по списку типов (Часть 1)

Reading time8 min
Views18K
Случалось ли Вам писать шаблон функции, который должен быть инстанциирован для определённого набора типов и больше ни для чего? Если нет, то эта статья врядли покажется Вам интересной. Но если Вы всё ещё здесь, то тогда начнём.

Cтатья будет состоять из двух частей. В первой части будет описана проблема и представлено её первичное, немного кривоватое, решение. Вторая часть будет посвящена усовершенствованию и обобщению изложенного решения.

Первым делом опишем проблему. Представьте себе, Вы обьявляете шаблон функции в заголовочном файле. Если шаблон должен быть потенциально пригоден для всего, что только можно, то и определить его нужно здесь же, в заголовочном файле. Это влечёт за собой сквозные зависимости, увеличение времени компиляции и срач в заголовочном файле. Но это всё же неизбежность. Конечно, можно определить шаблон в другом заголовочном файле и включить его внизу файла с обьявлением. Это избавит Вас от третьей проблемы, но не избавит от первых двух. Теперь обратная ситуация, когда шаблон должен быть использован(инстанциирован) только для парочки конкретных типов. Тогда вы смело переносите определение в исходник и явно инстанциируете Ваш шаблон для каждого отдельного типа. Немного трудоёмко в сопровождении, но всё же лучше чем гадить в заголовочном.

Наша ситуация находится где-то посередине. Есть шаблон функции, и он должен быть инстанциирован для конкретного списка типов, который где-то у Вас в проекте увековечен с помощью typedef'а. Ну, например:
typedef TypeList<int,char,bool,string, EmptyList> MyTypeList. 

О том, что такое список типов можно почитать у А.Александреску в «Современное проектирование на С++», а пример реализации — здесь.
Под катом самопальная имплементация(такая же как и у тысяч других, наверное). Она, мне лично, больше нравится, так как позволяет писать
typedef TypeList<int,char,bool,string, EmptyList> MyTypeList;
вместо классической записи
typedef TypeList<int,TypeList<char,TypeList<bool,TypeList<string, EmptyList>>>> MyTypeList;

Читать дальше →

Виртуализация SCO OpenServer 5.0.7V под Hyper-V

Reading time3 min
Views5K
У меня наконец-то дошли руки написать о том, как виртуализировать SCO OpenServer.

Когда я решил заняться виртуализацией этой ОС многие коллеги недоумевали над тем какая муха меня укусила. Понятно, что ты периодически рассказываешь о жизни Linux и Unix под Hyper-V, но зачем берешься за такую древность как системы от SCO? Некоторые молодые ИТ специалисты даже удивлялись, что компания SCO до сих пор жива и чувствует себя вполне нормально. Они думали, что после затяжных судебных разбирательств, войны с сообществом и другими производителями Unix, банкротства в 2007 году, компания перестала существовать.

Ответ на эти вопросы очень прост.
Читать дальше →

Установка и настройка CentOS Linux 5.5 под Hyper-V

Reading time3 min
Views18K
Давайте продолжим серию статей о запуске Unix и Linux систем под Hyper-V R2. Сегодня посмотрим, как устанавливать и настраивать CentOS 5.5 под управлением нашей системы виртуализации. Почему именно CentOS? Все очень просто он является самым популярным среди любителей RedHat подобных дистрибутивов.

Для тех, кому лень читать могу сказать что CentOS работает под Hyper-V очень хорошо и готов к применению в производственной среде. Кстати, все, что я напишу ниже можно с таким же успехом применять и для RHEL.

Ну что приступим?
Читать дальше →

Установка и настройка FreeBSD 8.1 и 7.3 под Hyper-V 2008 R2

Reading time2 min
Views13K
Пару лет назад я писал про запуск FreeBSD 6.3 и 7.0 под Hyper-V версии 1. FreeBSD развивается, да и Hyper-V не стоит на месте. Проблемы, которые я описывал ранее, исчезли и теперь FreeBSD гораздо лучше работает в нашей системе виртуализации.

Сегодня мы будем устанавливать FreeBSD 8.1 и 7.3, потому что именно они являются официально рекомендуемыми на данный момент. Так же проверим, как система работает в многопроцессорной конфигурации, и какие скорости устройства показывают во время тестов.
Читать дальше →

Установка и настройка Linux Ubuntu 10.04 LTS под Hyper-V в Windows Server 2008 R2

Reading time3 min
Views36K
Выдалось немного свободного времени, поэтому сегодня я решил написать, как обстоят дела с работой Ubuntu 10.04 под Hyper-V.

Не смотря на то, что Ubuntu не входит в список официально поддерживаемых Linux дистрибутивов работает он под Hyper-V отлично. Более того никаких дополнительных компонентов интеграции ставить не пришлось. Все что нужно для работы с Hyper-V давно находится в свежих ядрах Linux.

Ну что, приступим?
Читать дальше →

Установка Oracle Solaris Express 11 под Hyper-V

Reading time3 min
Views8.4K
Некоторое время назад пробовал виртуализировать под Hyper-V разные версии Sun Solaris x86 от старых до самых новейших. К сожалению полноценного успеха тогда достигнуть не удалось. Solaris устанавливался успешно и даже запускался под Hyper-V, но в гостевой ОС не работал эмулируемый сетевой адаптер. Понятно что с такими недостатками использовать Solaris для чего либо серьезного было нельзя.

В связи с покупкой Sun компанией Oracle ОС была переименована в Oracle Solaris. Для тестирования силами сообщества выпущена свободно доступная Solaris Express 11. Были надежды что новая метла от Oracle, изменит разработку встроенных в ОС драйверов в лучшую сторону. Поэтому я решил проверить как будет чувствовать себя Oracle Solaris Express 11 под Hyper-V.

Тем кто спешит могу сказать, что результат оказался вполне удовлетворительным. Несмотря на то что Solaris официально не поддерживается Microsoft под Hyper-V и компоненты интеграции для него отсутствуют он работает стабильно и с приемлимой производительностью.

Ну а тех кому любопытны подробности установки, скриншоты потрясающей красоты и результаты тестирования, прошу проследовать под кат.
Читать дальше →

Установка и настройка Debian Linux под Hyper-V

Reading time3 min
Views59K
Давайте продолжим наши упражнения в виртуализации Linux систем под Hyper-V. Сегодня мы займемся установкой и настройкой Debian 6 под Hyper-V. Все что я буду писать ниже можно применять не только к Debian 6, но и к Debian 5 и к остальным дистрибутивам основанным на Debian таким как Ubuntu, Kubuntu, Xubuntu, Ebuntu.
Читать дальше →

Information

Rating
4,004-th
Location
Кызыл, Тува (Тувинская Респ.), Россия
Registered
Activity

Specialization

Software Developer, Application Developer
Senior
From 150,000 ₽
Python
C++
Linux
Docker