Рубрика «Программирование» - 913

Для того чтобы быть крутым программистом нужно много программировать.

Но еще и важно пополнять свои знания через чтение интересного и нового. Получать информацию можно из многих источников, раньше для меня это были блоги и RSS канал. Но с течением времени, я пришел к выводу, что почти что всю самое интересное я получаю из 3 мест: twitter, github, stackoverflow.

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

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

Александр Круглов — Ruby — Эту книгу можно использовать как справочник и как отдельный учебник по Ruby. Для изучающих Rails считаю исчерпывающим руководством по языку. Версия языка изучаемая в этой книге — 2.0.0p247.

Слова автора: Не думайте, что прочитав эту книгу вы сразу станете писать высоконагруженные приложения. Максимум чему вы научились — это программирование небольших скриптов, способных немного облегчить вашу повседневную работу. Еще множество необходимых знаний о стиле кода, тестировании и отладке, архитектуре и оптимизации (и т.д.) отделяет вас от гордого звания программиста. Могу лишь надеяться, что удовольствия от работы с Ruby поможет преодолеть все эти препятствия и сообщество получит еще одного единомышленника. Github репозиторий

Читать полностью »

В этой статье мы попытаемся рассмотреть всё разнообразие Алгебраических Типов Данных.
Зоопарк Алгебрaических Типов Данных
Надо сказать, задача это достаточно неподъёмная, и понять человеку, если он ранее с Алгебраическими Типами не имел дело — не очень просто.
АТД были впервые использованы в языке Hope, но основную популярность они приобрели благодаря языкам ML, такими как Standart ML, OCaml, F#, и языку Haskell.
Ныне АТД в той или иной мере поддерживаются в значительно большем количестве языков: Scala, Rust, Nemerle, Racket,…
АТД называются алгебраическими, потому что их можно представить как некую алгебраическую композицию типов. Это знание даёт своё преимущество: понимая свойства алгебраической композиции, можно посчитать какой тип необходим для построения тех или иных данных.
Будем рассматривать типы на основе языка Haskell, однако подобного с лёгкими изменениями можно добиться в других языках с поддержкой АТД.
Читать полностью »

От B2C-порталов ожидается прежде всего масштабирование. К сожалению, масштабирование слишком часто объявляется вопросом Технологии — достаточно выбрать модную технологию и все проблемы решены. То, что это не так, может проявиться, позднее всего, уже в production mode (на рабочей системе).
Вместо того, чтобы махать технологической булавой, расскажу о том, как при помощи продуманной архитектуры и сознательного отказа от модели данных разработать высоко доступный (highly available), масштабируемый (scalable) портал. Первая часть опишет общие концепты, а возможные сценарии и их решения последуют.
Читать полностью »

В начале прошлого года мне пришла в голову идея написать собственный язык интерфейсов (IDL), который был бы похож на Protobuf или Thrift, но предназначался бы для веба. Я надеялся закончить его где-нибудь месяца за три. До первой стабильной версии прошло чуть больше года.

Pdef (пидеф, protocol definition language) — это статически типизированный язык описания интерфейсов, который поддерживает JSON и HTTP RPC. Он позволяет один раз описать интерфейсы и структуры данных, а потом сгенерировать код для конкретных языков программирования. Пидеф подходит для публичных апи, внутренних сервисов, распределенных систем, конфигурационных файлов, как формат для хранения данных, кеша и очередей сообщений.

Основная функциональность:

  • Развитая система пакетов, модулей и пространств имен.
  • Поддержка циклических импортов и зависимостей типов (с некоторыми ограничениями).
  • Простая система типов, основанная на четком разделении интерфейсов и структур данных.
  • Наследование сообщений (аналог struct'ов) и интерфейсов.
  • Поддержка цепочек вызовов, например, github.user(1).repos().all().
  • JSON как формат данных и HTTP RPC для передачи данных.
  • Возможность использовать другие форматы и RPC.
  • Подключаемые кодогенераторы (официально поддерживаются Java, Python и Objective-C).
  • Опциональность кодогенерации, т.е. Пидеф позволяет сериализовать данные и отправлять запросы руками.

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

Пример описания сообщения:

message Human {
    id          int64;
    name        string;
    birthday    datetime;
    sex         Sex;
    continent   ContinentName;
}

Примеры использования (примеры сгенерированного кода):

Json

{
    "id": 1,
    "name": "Ivan Korobkov",
    "birthday": "1987-08-07T00:00Z",
    "sex": "male",
    "continent": "europe"
}

Java

Human human = new Human()
    .setId(1)
    .setName("John")
    .setSex(Sex.MALE)
    .setContinent(ContinentName.ASIA)

String json = human.toJson();
Human another = Human.fromJson(json);

Python

human = Human(id=1, name="John")
human.birthday = datetime.datetime(1900, 1, 2)

s = human.to_json()
another = Human.from_json(s)

Objective-C

Human *human = [[Human alloc]init];
human.id = 1;
human.name = @"John";
human.sex = Sex_MALE;
human.continent = ContinentName_EUROPE;

NSError *error = nil;
NSData *data = [human toJsonError:&error];
Human *another = [Human messageWithData:data error:&error];

Читать полностью »

image

6 декабря 2013 года в России проходила черная пятница. Было заявлено о больших скидках.
Я узнал об этом в одной статье еще за месяц до начала. Прочитав много комментариев к той статье, я понял, что все пользователи сходятся во мнении, что:

  1. Никаких грандиозных скидок не будет.
  2. Если скидки всё-таки будут, то только на те товары, которые не очень то и нужны.
  3. Сама скидка сводится к тому, что в этот день цена товара завышается, а за счет скидки понижается до первоначального уровня, но никак не меньше.

Было решено узнать, а как всё происходит на самом деле.
В той статье упоминались несколько компаний, участвующих в акции. Я выбрал 2 компании для анализа: Сотмаркет и Белый Ветер.
Читать полностью »

Предыстория

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

В первую очередь, нам хотелось иметь ограниченный компактный набор конечных распространяемых модулей. Однако публичная сборка питона, распространяемая через python.org к этому не располагает, одна только стандартная библиотека, являющаяся неотъемлемой частью самого языка, состоит из более чем тысячи py-файлов. Именно поэтому, мы сразу обратили внимание на такую любопытную особенность интерпретатора, как возможность импорта модулей, находящихся в zip-архивах, когда все множество исходников на питоне, относящихся к одному или нескольким модулям, упаковано в zip-архив и распространяется одним zip-файлом.

Читать полностью »

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

Преимущество такого подхода в том, что данные в Excel можно обновить, так как есть соединение. Но недостатков больше:

  • Нужен установленный Excel на компьютер, чтобы получить данные.
  • В полученном документе для названий колонок используется InternalName полей.
  • В полученном документе используется “сырой” формат данных, что далеко не всегда подходит.

С помощью небольшого объема кода можно подменить стандартную функцию экспорта на свою так, что пользователи ничего не заметят.
Читать полностью »

Lock free структуры данных. Внутри. RCU
В этой статье я продолжу знакомить читатели с техниками, обеспечивающими написание lock-free контейнеров, попутно рекламируя (надеюсь, не слишком навязчиво) свою библиотеку libcds.

Речь пойдет об ещё одной технике безопасного освобождения памяти для lock-free контйнеров — RCU. Эта техника существенно отличается от рассмотренных ранее алгоритмов a la Hazard Pointer.

Read – Copy Update (RCU) – техника синхронизации, предназначенная для «почти read-only», то есть редко изменяемых, структур данных. Типичными примерами такой структуры являются map и set – в них большинство операций является поиском, то есть чтением данных. Считается, что для типичного map'а более 90% вызываемых операций — это поиск по ключу, поэтому важно, чтобы операция поиска была наиболее быстрой; синхронизация поиска в принципе не нужна — читатели при отсутствии писателей могут работать параллельно. RCU обеспечивает наименьшие накладные расходы как раз для read-операций.

Откуда взялось название Read – Copy Update? Первоначально идея была очень проста: есть некоторая редко изменяемая структура данных. Если нам требуется изменить её, то мы делаем её копию и производим изменение — добавление или удаление данных — именно в копии. При этом параллельные читатели работают с первоначальной, не измененной структурой. В некоторый безопасный момент времени, когда нет читателей, мы можем подменить структуру данных на измененную копию. В результате все последующие читатели будут видеть изменения, произведенные писателем.

Читать полностью »

Требуемые знания: знакомство с методами линейного программирования, методы решения транспортной задачи(особенно метод потенциалов).

Год назад, на третьемimage курсе в качестве одной из лабораторных работ по курсу «Методы оптимизации» мне задали реализовать решение транспортной задачи, но с одним небольшим условием: перевозки происходят партиями. Это значит, что теперь, в отличие от классической постановки, оплачивается перевозка партии товаров (e.g. 10 штук), и, даже если Вам надо перевезти 11 штук, Вы заплатите за две партии(в один трейлер 11 штук не влезут). Казалось бы, мелкое дополнение, однако как теперь решать задачу, да хотя бы как её формализовать? Как студенту кафедры прикладной математики, мне было не привыкать, что великий google.ru чего-то не знает, но каково же было моё удивление, когда ни его старший брат — англоязычный google, ни тьма перебранных мной книг по теории оптимизации не смогли ответить на этот вопрос.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js