Pull to refresh
35
0
Андрей @sylvio

User

Send message

Введение в Template Haskell. Часть 2. Инструменты цитирования кода

Reading time6 min
Views3.2K
Данный текст является переводом документации Template Haskell, написанной Булатом Зиганшиным. Перевод всего текста разбит на несколько логических частей для облегчения восприятия. Далее курсив в тексте — примечания переводчика. Другие части:


Монада цитирования


Поскольку шаблоны должны возвращать свои значения обёрнутыми в монаду Q, для этого имеется набор вспомогательных функций, которые “поднимают” (оборачивают в Q) конструкторы типов Exp, Lit, Pat: lamE (соотв. LamE), varE, appE, varP и т.д. В их сигнатурах так же используются переобозначенные поднятые типы: ExpQ = Q Exp, LitQ = Q Lit, PatQ = Q Pat… (все их можно найти в модуле Language.Haskell.TH.Lib). Используя эти функции, можно значительно сократить код, реже используя do-синтаксис.
В TH также есть функция lift, которая поднимает до Q Exp значение любого типа из класса Lift.
В некоторых редких случаях, вам может понадобиться не генерация уникального имени, а использование точного имени идентификатора из внешнего (по отношению к шаблону) кода. Для этих целей есть (чистая) функция mkName ∷ String → Name. Есть также вспомогательная функция dyn s = return (VarE (mkName s)), которая возвращает значение Exp представляющее переменную с данным именем (dyn ∷ String → Q Exp).

Цитирующие скобки


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

Практика работы «в белую» с иностранными заказчиками

Reading time4 min
Views108K
Итак, тут уже была серия статей про то как открыть ИП, как вести бизнес с иностранцами и так далее.
Я хочу всё систематизировать и поделиться реальной практикой.

Для начала введём определения и ограничения:
1. вы уже должны быть зарегистрированы как ИП и вы ознакомились со статьями: habrahabr.ru/blogs/freelance/132232, habrahabr.ru/blogs/freelance/132360, habrahabr.ru/blogs/Dura_Lex/114069
2. мы хотим вести бизнес честно, платить с этого налог и делаем это в России;
3. всё что написано ниже в статье применимо только к ИП, возможно что-то применимо и к ООО, но я ИП и рассказываю про ИП;
4. ИП рассматривается на упрощённой системе налогообложения (УСН) со схемой уплаты налогов в 6% от дохода и без наёмных работников – то есть вы сами по себе;
5. вы предоставляете услуги в области ИТ (программинг, дизайн, консультации и т. п.).

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

Несколько полезных сервисов

Reading time2 min
Views126K
Хочу поделиться ссылками на несколько полезных сервисов. Некоторые из них помогут сэкономить время, другие — сделают за Вас незнакомую/нелюбимую работу. Список разбит по категориям, чтобы было легче ориентироваться.

Сервисы опросов
userreport.com (добавил Romanych)
simpoll.ru
webanketa.com (добавил mihass)

Кнопки постинга в социальные сети
Кнопка от Яндекса
addthis.com (добавил UksusoFF)
share42.com
Читать дальше →

Материалы митапа scala.by #5 — Pragmatic Erlang

Reading time2 min
Views1.3K
15 октября в Минске, в главном офисе EPAM Systems состоялась очередная встреча беларуских энтузиастов языка Scala и функционального программирования (коммьюнити scala.by).

Встреча была посвящена продолжающему набирать популярность языку, Erlang, послужившему вдохновителем для библиотеки актеров в Scala, и фреймворку для создания распределенных, высконадежных систем, OTP, идеи из которого также все больше и больше просачиваются в мир Scala (см. популярная библиотека Akka, которая в скором времени должна стать часть стандартной поставки Scala).

В качестве приглашенного докладчика и эксперта в области выступал Юрий Жлоба — известная личность в беларуском программерском коммьюнити, специалист в Flash/Flex, Java и Erlang. В своем почти 5-часовом (!) докладе (воистину, марафонская дистанция), Юрий затронул как концептуальные задачи современной разработки масштабируемого программного обеспечения (и пути их решения с помощью Erlang и OTP), так практические вопросы реализации систем с демонстрацией мощи Erlang/OTP во время live-coding сессии.
На встрече велась видеозапись и во время live-coding’a записывался скринкаст — ниже представлены все материалы. В качестве бонуса, Юрий опубликовал текстовую версию первой части выступления, которую вы можете найти в его блоге.

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

Обзор двадцати двух бесплатных шрифтов с сайта Open Font Library: 16 шрифтов с кириллицею + 6 орнаментальных и спецсимвольных шрифтов

Reading time4 min
Views62K
Сегодня я упоминал ужé о трудностях, с которыми сталкивается всякий, кто желает разыскать на сайте Open Font Library шрифты с поддержкою кириллицы. Фильтра по языкам нет; поиск по слову «cyrillic», как dimitrymd успел убедиться, находит только десяток шрифтов.

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

  1. ConsolaMono
  2. Crimson
  3. Dataface
  4. Designosaur
  5. Didact Gothic
  6. GNUTypewriter
  7. Grana Padano
  8. Jura
  9. Neocyr
  10. NotCourierSans
  11. Old Standard
  12. Pfennig
  13. Press Start 2P
  14. Sansus Webissimo
  15. Triod Postnaja
  16. VDS

«На закуску» я намерен также обозреть полдюжины шрифтов с различными спецсимволами да орнаментами:

  1. Chess
  2. FivefoldOrnamentsEtc
  3. Futhark Adapted
  4. Knots
  5. UniCons
  6. Web Symbols

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

Ускорения параллельных вычислений

Reading time4 min
Views23K
Главной целью создания и разработки многочисленных типов параллельных машин, о которых мы говорили в прошлой статье, это скорость. Суперкомпьютеры и многопроцессорные системы могут и должны делать все быстрее! Давайте постараемся расчитать, насколько быстрее.

Логично подумать, что если один процессор выполняет работу за n секунд, то четыре процессора потратят n/4 секунд. Понятие “фактор ускорения” (“speedup factor”) это отношение времени, которое тратит на выполнение работы один процессор к времени, которое тратит на эту же работу многопроцессорная система.

S(p) = Ts / Tp

Для расчета важно использовать самый оптимальный Ts, то есть лучший из возможных не-параллельных алгоритмов.

Теперь плохие новости: у этого ускорения есть лимит. Называется он Amdahl’s Law (Закон Амдала) и вот его суть: так выглядит какая-либо задача на обычной однопроцессорной системе:



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

Первый набор в Computer Science Center (Санкт-Петербург)

Reading time2 min
Views2.3K

Computer Science Center (Санкт-Петербург) объявляет о начале первого набора.

Computer Science Center — это совместная инициатива Академии современного программирования, Computer Science клуба при ПОМИ РАН и Школы анализа данных Яндекса. В центре желающие могут получить знания, востребованные современной наукой и рынком программирования.

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

Введение в параллельные вычисления

Reading time6 min
Views48K
Параллельной машиной называют, грубо говоря, набор процессоров, памяти и некоторые методы коммуникации между ними. Это может быть двухядерный процессор в вашем (уже не новом) ноутбуке, многопроцессорный сервер или, например, кластер (суперкомпьютер). Вы можете ничего не знать о таких компьютерах, но вы точно знаете, зачем их строят: скорость, скорость и еще раз скорость. Однако скорость — не единственное преимущество.

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

Что самое удивительное, в университетах пока не спешат переводить программы обучения в русло параллельных вычислений! При этом сегодня нужно постараться, чтобы найти компьютер с одним ядром. В моем родном Carleton University курсы по параллельным вычислениям не входят в обязательную программу Bachelor of Computer Science, и доступны лишь для тех, кто прошел основные курсы первых трех лет. На том же уровне находятся курсы по распределенным вычислениям, и некоторых могут сбить с толку.

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

Введение в многомерный анализ

Reading time12 min
Views175K

Некоторое время назад мне довелось организовывать новую группу разработки, которая должна была заняться развитием OLAP и BI продуктов в дружеской софтверной компании. А так как группа была собрана из свежих выпускников ВУЗов, то мне пришлось написать «краткий курс молодого бойца» для того чтобы максимально доступно дать начальные понятия об OLAP людям, которые ни разу с ним не сталкивались, но уже имели опыт программирования и работы с БД.



Выкладываю теперь это Введение в Общественное Достояние.



В статье несколько смешиваются понятия OLAP, Business Intelligence, и Data Warehouse, но и в жизни часто сложно понять, где проходит граница. А уж в реальных проектах, так и подавно, все они ходят рядом. Поэтому прошу не судить строго.



Итак, что же такое OLAP.

Prolog — примеры использования (Часть 2)

Reading time14 min
Views105K
В первой части статьи о Prolog рассказывалось о структуре, синтаксисе и интерпретации языка. Конечно же научно-популярная литература интересна для программиста, но гораздо более интересно что-то интерактивное, живое, запускаемое. Поэтому в этой статье я предлагаю вооружиться SWI-Prolog и рассмотреть решения простейших задач на Прологе.

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

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

— Почему нет сообщества Пролога?
— Оно есть. Такова специфика языка, что он очень полюбился в академической среде (большинство Prolog систем пишутся в различных университетах и наоборот практически любой университет пишет свой Пролог), из-за этого можно сказать страдает и применимость языка. Стоит отметить, что сообщество небольшое, но очень лояльное: практически все известные языки нашли свое отражение в современных языках (Lisp, ML -> F#, Scala; Smalltalk -> Java, Scala (агенты), скриптовые -> Ruby), в отличие от Пролог.

Думаю на этом хватит философских рассуждений и можно приступить к реальным примерам :)

В конце как обычно ожидает задача на приз.
Читать дальше →

Моноиды и их приложения: моноидальные вычисления в деревьях

Reading time20 min
Views24K
Приветствую, Хабрахабр. Сегодня я хочу, в своём обычном стиле, устроить сообществу небольшой ликбез по структурам данных. Только на этот раз он будет гораздо более всеобъемлющ, а его применения и практичность — простираться далеко в самые разнообразные области программирования. Самые красивые применения, я, конечно же, покажу и опишу непосредственно в статье.

Нам понадобится капелька абстрактного мышления, знание какого-нибудь сбалансированного дерева поиска (например, описанного мною ранее декартова дерева), умение читать простой код на C#, и желание применить полученные знания.

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

Моноид как концепция


Представьте себе множество чего угодно, множество, состоящее из объектов, которыми мы собираемся манипулировать. Назовём его M. На этом множестве мы вводим бинарную операцию, то есть функцию, которая паре элементов множества ставит в соответствие новый элемент. Здесь и далее эту абстрактную операцию мы будем обозначать "⊗", и записывать выражения в инфиксной форме: если a и b — элементы множества, то c = ab — тоже какой-то элемент этого множества.

Например, рассмотрим все строки, существующие на свете. И рассмотрим операцию конкатенации строк, традиционно обозначаемую в математике "◦", а в большинстве языков программирования "+": "John""Doe" = "JohnDoe". Здесь множество M — строки, а "◦" выступает в качестве операции "⊗".
Или другой пример — функция fst, известная в функциональных языках при манипуляции с кортежами. Из двух своих аргументов она возвращает в качестве результата первый по порядку. Так, fst(5, 2) = 5; fst("foo", "bar") = "foo". Безразлично, на каком множестве рассматривать эту бинарную операцию, так что в вашей воле выбрать любое.

Далее мы на нашу операцию "⊗" накладываем ограничение ассоциативности. Это значит, что от неё требуется следующее: если с помощью "⊗" комбинируют последовательность объектов, то результат должен оставаться одинаковым вне зависимости от порядка применения "⊗". Более строго, для любых трёх объектов a, b и c должно иметь место:
(ab) ⊗ c = a ⊗ (bc)
Легко увидеть, что конкатенация строк ассоциативна: не важно, какое склеивание в последовательности строк выполнять раньше, а какое позже, в итоге все равно получится общая склейка всех строк в последовательности. То же касается и функции fst, ибо:
fst(fst(a, b), c) = a
fst(a, fst(b, c)) = a
Цепочка применений fst к последовательности в любом порядке всё равно выдаст её головной элемент.

И последнее, что мы потребуем: в множестве M по отношению к операции должен существовать нейтральный элемент, или единица операции. Это такой объект, который можно комбинировать с любым элементом множества, и это не изменит последний. Формально выражаясь, если e — нейтральный элемент, то для любого a из множества имеет место:
ae = ea = a
В примере со строками нейтральным элементом выступает пустая строка "": с какой стороны к какой строке её ни приклеивай, строка не поменяется. А вот fst в этом отношении нам устроит подлянку: нейтральный элемент для неё придумать невозможно. Ведь fst(e, a) = e всегда, и если ae, то свойство нейтральности мы теряем. Можно, конечно, рассмотреть fst на множестве из одного элемента, но кому такая скука нужна? :)

Каждую такую тройку <M, ⊗, e> мы и будем торжественно называть моноидом. Зафиксируем это знание в коде:
public interface IMonoid<T> {
    T Zero { get; }
    T Append(T a, T b);
}

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

10 «однострочников», которые произведут впечатление на ваших друзей

Reading time13 min
Views42K
За последнюю неделю появилось несколько топиков с названием «10 однострочников на <MY_LANGUAGE>, которые произведут впечатление на ваших друзей», которые содержат однострочное решение нескольких простых задач, демонстрирующее достоинства и «крутость» любимого языка программирования автора. Я решил перевести их и для сравнения собрать в одном топике. Вся волна началась (вроде как) со Scala.
Итак, поехали!
Читать дальше →

Фриланс и вывод денег: личный опыт

Reading time4 min
Views105K
Добрый день, жители хабра! Я занимаюсь фрилансом (хотя это слово не очень люблю) на протяжении последних четырёх лет. В этом небольшом топике мне хотелось бы рассказать о различных способах вывода заработанных непосильным трудом денежных средств. Для начала стоит сказать о том, как именно организована моя работа. Я использую всего два варианта – oDesk и работа напрямую. С клиентами из России работать ещё не доводилось, так что о таких знакомых вариантах вывода денег, как WebMoney и Яндекс.Деньги речь идти не будет.

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

Тестирование. Начало

Reading time4 min
Views127K

Привет. В этой серии постов я попробую рассказать про тестирование кода на питоне, в частности проектов django. Мы рассмотрим модульное тестирование (юнит-тесты), статический анализ кода и некоторые подводные камни тестирования веб-сайтов.

Вводную часть о пользе тестирования опустим — код, покрытый тестами, становится мягким и шелковистым, про это только ленивый еще не читал / писал.
Читать дальше →

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

Reading time3 min
Views64K
Один из довольно частых вопросов на различных околониксовых ресурсах — вопрос о том, какую схему разбивки дисков использовать. С виду простой вопрос на самом деле таит в себе множество подводных камней. Если, конечно же, дело касается серверов. На десктопах все гораздо скучнее и серее.

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

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

Reading time1 min
Views33K
image
Ни для кого не секрет, что в настоящее время многие стремятся к минимализму в дизайне чего бы то ни было. Действительно, когда нет ничего лишнего, то повышается и восприимчивость информации. Но это все лирика. Сказано было это еще до меня и много. Предлагаю вашему вниманию подборку сайтов, посещение которых может направить ваши мысли по поводу разрабатываемого дизайна в нужное русло.
Читать дальше →

Как вернуть качественный звук в Windows 7, 10, 11 — побитовый вывод, аппаратные эффекты (EAX и пр.)

Reading time5 min
Views276K
Хочу поділитися досвідом по темі звуку в Windows 7.
Насправді все не так погано, як спочатку здається, і я вам зараз це продемонструю.
Читать дальше →

Двадцать вопросов, которые помогают разработать алгоритм

Reading time5 min
Views8.4K
Как разработать алгоритм, решающий сложную задачу? Многие считают, что для этого нужно «испытать озарение», что процесс этот не вполне рационален и зависит от творческой силы или таланта.

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

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

Метод динамического программирования для подсчёта числа циклов на прямоугольной решетке

Reading time11 min
Views13K
Эта статья адресована тем читателям, кто занимается программированием алгоритмов, и особенно интересуется труднорешаемыми задачами. Тем хабралюдям, которые против размещения алгоритмов на Хабре следует немедленно прекратить читать данную работу.

В статье я покажу как использовать метод динамического программирования по профилю для решения задачи о подсчёте количества гамильтоновых циклов на прямоугольной решётке размером m на n. На Хабре есть несколько статей, посвященных теме динамического программирования (например, эта), но нигде не идёт речь о более сложном применении метода. Данный подход также можно называть методом матрицы переноса, кому как нравится.

Предупреждаю, что статья содержит около 2000 слов (8 страниц А4), но дорогу осилит идущий.

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

Wolframalpha + Wikipedia = Galois/Wiki

Reading time2 min
Views1K
Представьте себе Maple, Maxima или Mathematica, в которой правила работы являются энциклопедическими статьями, и, наоборот, энциклопедию, пополняя которую, вы улучшаете работу системы компьютерной алгебры. Эта идея лежит в основе Galois/Wiki (Галуа/Вики) — математической энциклопедии с интеллектуальным поиском.

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

Information

Rating
Does not participate
Location
Санкт-Петербург и область, Россия
Registered
Activity