На фоне общей увлеченности созданием ботов для Telegram я бы хотел рассказать об API не очень широко известного мессенджера Tox и показать на примере простого echo-бота, как можно так же легко и быстро создавать собственных.
Здесь могла бы быть моя специализация
Ускоренный курс по нотациям в теории языков программирования
10 мин
32KПеревод
Программисты часто сталкиваются с проблемами чтения математических нотаций, когда пытаются разобраться с теоретическими основами какого-либо языка программирования. Также с ними толкнулся и я в своих теоретических изысканиях. К счастью, мне очень помогла замечательная статья Джереми Сиека (Jeremy Siek), чьим переводом я хочу с вами поделиться. Надеюсь она поможет многим программистам-«не математикам».
+25
Интернет как новое огораживание
6 мин
15KПредлагаю читателям Geektimes перевод публикации «The Internet as New Enclosure». Перевод был прислан в песочницу на Хабр, пролежал там довольно долгое время и лежал бы и дальше, недоступный широкой аудитории, однако его достали модераторы и перенесли сюда.
СМИ превращают наши переживания, память и общение в нечто синтетическое и внешнее. В обществе, контролируемом СМИ, мы зависим от технологии доступа к этим сторонам самих себя, сделанным внешними. Книги, аудиозаписи, кино, радио, телевидение, интернет, мобильные телефоны: все эти шедшие друг за другом нововведения проникали всё глубже в нашу повседневную жизнь, становясь посредниками для всё большей части наших жизней.
В плоть до конца 20 века, СМИ были чрезвычайно однонаправленными: информация текла в одну сторону, а внимание в другую. Критики обычно сосредотачивались на этом аспекте их устройства, обвиняя их в том, что они давали крохотной политической клике огромное влияние над обществом, закрепляя за остальными роли зрителей. В отличии от них, подпольные СМИ придерживались более интерактивных и децентрализованных форм.
Всеобщее участие и децентрализация внезапно стали мейнстримом с появлением общедоступных цифровых медиа. Во многих отношениях, Интернет представлял из себя более раскрепощающее и укрепляющее самооценку пространство для новых методов коммуникации. Поскольку его базовая модель была разработана исследователями, финансируемыми военными, а не частным сектором, он проектировался для того, чтобы приносить пользу, а не прибыль. По сей день, большая часть Интернета остаётся своего рода «Диким Западом», в котором затруднительно следить за исполнением традиционного вещного права. Возможность делиться материалами бесплатно и напрямую с другими пользователями оказала огромное воздействие на некоторые отрасли, в то время как коллаборативные форматы вроде Википедии и ПО с открытым исходным кодом показали, как просто люди могут удовлетворять свои потребности без частной собственности. Корпорации по-прежнему ищут способы делания денег в Интернет кроме как через онлайн-торговлю и рекламу.
Однако, по мере того как наши жизни становятся всё более и более оцифрованными, важно не принимать как данность то, что это всегда к лучшему. Капитализм разрастается за счёт захвата тех сторон мира, которые когда-то были свободными, а затем предлагает доступ к ним по высокой цене, и эта цена не всегда выплачивается в долларах.
СМИ превращают наши переживания, память и общение в нечто синтетическое и внешнее. В обществе, контролируемом СМИ, мы зависим от технологии доступа к этим сторонам самих себя, сделанным внешними. Книги, аудиозаписи, кино, радио, телевидение, интернет, мобильные телефоны: все эти шедшие друг за другом нововведения проникали всё глубже в нашу повседневную жизнь, становясь посредниками для всё большей части наших жизней.
В плоть до конца 20 века, СМИ были чрезвычайно однонаправленными: информация текла в одну сторону, а внимание в другую. Критики обычно сосредотачивались на этом аспекте их устройства, обвиняя их в том, что они давали крохотной политической клике огромное влияние над обществом, закрепляя за остальными роли зрителей. В отличии от них, подпольные СМИ придерживались более интерактивных и децентрализованных форм.
Всеобщее участие и децентрализация внезапно стали мейнстримом с появлением общедоступных цифровых медиа. Во многих отношениях, Интернет представлял из себя более раскрепощающее и укрепляющее самооценку пространство для новых методов коммуникации. Поскольку его базовая модель была разработана исследователями, финансируемыми военными, а не частным сектором, он проектировался для того, чтобы приносить пользу, а не прибыль. По сей день, большая часть Интернета остаётся своего рода «Диким Западом», в котором затруднительно следить за исполнением традиционного вещного права. Возможность делиться материалами бесплатно и напрямую с другими пользователями оказала огромное воздействие на некоторые отрасли, в то время как коллаборативные форматы вроде Википедии и ПО с открытым исходным кодом показали, как просто люди могут удовлетворять свои потребности без частной собственности. Корпорации по-прежнему ищут способы делания денег в Интернет кроме как через онлайн-торговлю и рекламу.
Однако, по мере того как наши жизни становятся всё более и более оцифрованными, важно не принимать как данность то, что это всегда к лучшему. Капитализм разрастается за счёт захвата тех сторон мира, которые когда-то были свободными, а затем предлагает доступ к ним по высокой цене, и эта цена не всегда выплачивается в долларах.
+10
Богатый, разнообразный, свободный веб, который я так любил, за годы, проведенные мной в Иранской тюрьме просто умер. Почему никто не остановит это?
13 мин
86KПеревод
+76
Вычислите длину окружности
6 мин
90KПеревод
«Пожалуйста, напишите на C++ функцию, которая получает диаметр круга как float и возвращает длину окружности как float».
Звучит как задание на первой неделе курса по C++. Но это только на первый взгляд. Сложности возникают уже на первых этапах решения задачи. Предлагаю рассмотреть несколько подходов.
Студент: Как вам такой вариант?
Преподаватель: Да, этот код может нормально откомпилироваться. А может и нет.
Звучит как задание на первой неделе курса по C++. Но это только на первый взгляд. Сложности возникают уже на первых этапах решения задачи. Предлагаю рассмотреть несколько подходов.
Студент: Как вам такой вариант?
#include <math.h>
float CalcCircumference1(float d)
{
return d * M_PI;
}
Преподаватель: Да, этот код может нормально откомпилироваться. А может и нет.
+123
Почтовый сервер на собственном сайте через sendmail
4 мин
29KНе так давно передо мной встала задача предоставить зарегистрированным в моих каталогах, промышленной, автомобильной и риэлторской тематики, организация личный почтовый ящик с именем моего домена. Вместо того, чтобы выдавать пользователям каталога непосредственные контактные данные, было определено, что более продуктивно будет выдавать им контактные данные с названием моего домена. Что должно увеличить посещаемость, как среди пользователей, так и среди самих организаций.
-4
Форматы файлов для программ на FASM под Windows
6 мин
24KПри создании программы на ассемблере (для примера будет приведён FASM) из-под ОС Windows возникает вопрос о том, какой выбрать формат файла.
Для определения формата создаваемого исполняемого файла используется директива «format» со следующим за ним идентификатором формата.
Под катом краткое описание COM-программы и EXE-программы форматов MZ и PE с шаблоном программ (в виде традиционного «Hello World!»).
Для определения формата создаваемого исполняемого файла используется директива «format» со следующим за ним идентификатором формата.
Под катом краткое описание COM-программы и EXE-программы форматов MZ и PE с шаблоном программ (в виде традиционного «Hello World!»).
+2
Документируем код эффективно при помощи Doxygen
18 мин
369KДанная статья входит в получившийся цикл статей о системе документирования Doxygen:
- Документируем код эффективно при помощи Doxygen
- Оформление документации в Doxygen
- Построение диаграмм и графов в Doxygen
Это первая и основная статья из упомянутого цикла и она представляет собой введение в систему документирования исходных текстов Doxygen, которая на сегодняшний день, по имеющему основания заявлению разработчиков, стала фактически стандартом для документирования программного обеспечения, написанного на языке C++, а также получила пусть и менее широкое распространение и среди ряда других языков.
В этой статье мы сначала познакомимся с самой системой и её возможностями, затем разберёмся с её установкой и базовыми принципами работы, и, наконец, завершим знакомство рассмотрением различных примеров документации, примеров того, как следует документировать те или иные части кода. Словом, познакомимся со всем тем, что позволит вам освоиться и начать работать с этой замечательной системой.
+52
Обработка фотографий текста с помощью Gimp
2 мин
16KЗдесь я предложу несколько вариантов решения этой задачи. Основная проблема фотографий это неравномерность освещенности страницы, когда в центре яркость больше, а по краям меньше или что-либо подобное. Так же часто необходимо повысить контрастность текста по сравнению со страницей. При обычной коррекции Уровней некоторые части изображения получаются засвечены, а некоторые наоборот слишком тёмные. Все методы более или менее решают эти проблемы.
В качестве материала для обработки я взял эту страничку(Предварительно обрезав всё лишнее):
В качестве материала для обработки я взял эту страничку(Предварительно обрезав всё лишнее):
+23
Встраиваем бэкдор в публичный ключ RSA
4 мин
112KТуториал
Привет, %username%!
Когда я увидел, как это работает, сказать, что я был в шоке — ничего не сказать. Это довольно простой трюк но после прочтения этой статьи вы больше никогда не будете смотреть на RSA по-прежнему. Это не взлом RSA, это нечто, что заставит вашу паранойю очень сильно разбухнуть.
+115
Curve25519, EdDSA и Poly1305: Три обделенных вниманием криптопримитива
2 мин
40KТуториал
Есть такой очень хороший товарищ по имени Daniel Julius Bernstein. Математик, программист и спец по компьютерной безопасности. Его хэш CubeHash чуть не дотянул до третьего раунда SHA-3, а потоковый шифр Salsa20 попал в шорт лист проекта eStream. А еще он автор культовой в узких кругах криптобиблиотеки NaCl, о трех штуках из которой я бы хотел вкратце рассказать.
+31
Игра про автора systemd — Леннарта Поттеринга
2 мин
22KПока вокруг внедрения systemd в различные дистрибутивы разгораются нешуточные страсти, вплоть до покидания постов в совете, как это было с Debian, некоторые разработчики вместо бесплодных и жарких баталий по переписке занимаются полезным делом.
Кто-то внедряет systemd, кто-то несогласный делает форки, а кто-то — игры.
Кто-то внедряет systemd, кто-то несогласный делает форки, а кто-то — игры.
+22
Именованные аргументы функции в C
3 мин
15KВ некоторых языках существует возможность вызова функции с именованными параметрами. Такой способ позволяет указать аргумент для определённого параметра, связав его с именем параметра, а не с позицией. Это возможно, например, в C# или Python.
Рассмотрим «игрушечный» пример на Python с использованием именованных аргументов:
Здесь в примере одна и та же функция вызывается с разными аргументами. И видно, какой параметр каким значением проинициализирован. Если у функции есть параметры, значения которых можно оставить по умолчанию, то очень удобно проинициализировать только необходимые параметры с помощью именованных аргументов. Но в языке C аргументы функции связаны с позицией, поэтому разработчику нужно помнить порядок следования параметров, что может быть неудобно, если их достаточно много.
Ниже я покажу, как можно сымитировать использование именованных аргументов в C.
Рассмотрим «игрушечный» пример на Python с использованием именованных аргументов:
#вычислим объем параллелепипеда
#если значение стороны не указано, то считаем что оно равно единице
def volume(length=1, width=1, height=1):
return length * width * height;
print(volume()) # V = 1
print(volume(length=2)) # V = 2
print(volume(length=2, width=3)) # V = 6
print(volume(length=2, width=3, height=4)) # V = 24
Здесь в примере одна и та же функция вызывается с разными аргументами. И видно, какой параметр каким значением проинициализирован. Если у функции есть параметры, значения которых можно оставить по умолчанию, то очень удобно проинициализировать только необходимые параметры с помощью именованных аргументов. Но в языке C аргументы функции связаны с позицией, поэтому разработчику нужно помнить порядок следования параметров, что может быть неудобно, если их достаточно много.
Ниже я покажу, как можно сымитировать использование именованных аргументов в C.
+23
Xargs: многообразие вариантов использования
7 мин
145KОб утилите xargs написано очень много — что можно написать еще? Но если, что называется, копнуть поглубже, то выясняется, что во многих публикациях излагаются лишь самые основы, но нет главного: не объясняется, как можно применять xargs в реальной практике. Статей с разбором сложных и нетривиальных вариантов применения этого весьма полезного для системного администратора инструмента, к сожалению, очень мало. Именно поэтому мы написали свою статью и постарались включить в нее как можно больше примеров использования xargs для решения различных проблем.
Сначала мы рассмотрим принцип работы xargs и разберем примеры попроще, а затем перейдем к разбору сложных и интересных кейсов.
+62
Маленькие секреты большой экономии
7 мин
27KПочему 16 байт достаточно для сохранения игры, и другие мелочи
Пятьдесят и сто лет спустя у программистов будут всё те же проблемы: им будет очень сильно не хватать объёма доступной памяти для реализации всего, что хочется.
25 лет назад игровые картриджи содержали 64—128 килобайтов памяти, но каким-то образом этого объёма хватало, чтобы уместить игру на десятки часов геймплея. Сегодня 128 килобайт — это размер маленькой JPEG-картинки, а о том, что доступно в современном бытовом компьютере, в эпоху Super Mario Bros. даже не приходилось мечтать.
Там были и музыка, и звуки, и неплохая по тем временам графика. Да, некоторое можно было делать с помощью того, что уже было в игровой приставке или компьютере, но в основном приходилось идти на различные ухищрения, чтобы уместить в эти скромные возможности огромное количество звуков, музыки, анимации, изображений и игровых алгоритмов. Как же это удавалось разработчикам тех лет?
+50
Стимпанк-компьютер Альберта Майкельсона
2 мин
14KОказывается, ещё в 19 веке существовали вычислительные машины, способные осуществлять сложнейшие математические расчёты. Один из уникальных экземпляров — гармонический анализатор Альберта Майкельсона. Прибор выполнял преобразование Фурье. Эта функция сегодня широко используется в информатике, обработке сигналов, физике, теории чисел, комбинаторике, теории вероятностей, криптографии и других областях.
В честь 100-летия гармонического анализатора Майкельсона опубликована бесплатная электронная книга с великолепными иллюстрациями, где описывается принцип действия этого замечательного прибора.
В честь 100-летия гармонического анализатора Майкельсона опубликована бесплатная электронная книга с великолепными иллюстрациями, где описывается принцип действия этого замечательного прибора.
+30
В мире математических парадоксов
6 мин
113KДоброго времени суток, уважаемое хабрасообщество.
Сегодня я хотел бы затронуть такую увлекательную тему, как математические парадоксы. По данной теме на хабре уже было опубликовано несколько замечательных статей (1,2,3,4,5), но в математике интересные парадоксы этой выборкой далеко не исчерпываются.
Поэтому попробуем рассмотреть другие занимательные парадоксы (а некоторые и «не совсем» парадоксы), которые пока еще не получили здесь должного освещения.
+70
Как работают ленивые вычисления
10 мин
45KТуториал
Перевод
Маленькая Лямбда решила, что уборку в комнате можно отложить и на потом.
Ленивые вычисления — часто используемая методика при исполнении компьютером программ на Haskell. Они делают наш код проще и модульнее, но могут вызвать и замешательство, особенно когда речь заходит об использовании памяти, становясь для новичков распространённой ловушкой. Например, безобидно выглядящее выражение
В этом руководстве я хочу объяснить, как работают ленивые вычисления и что они означают для времени выполнения и объёма памяти, затрачиваемыми программами на Haskell. Я начну рассказ с основ редукции графов, а после перейду к обсуждению строгой левой свёртки — простейшего примера для понимания и ликвидации утечек памяти.
Тема ленивых вычислений рассматривалась во многих учебниках (например, в книге Саймона Томпсона «Haskell — The Craft of Functional Programming»), но информацию о них, кажется, всё ещё проблематично найти в сети. Надеюсь, моё руководство посодействует решению этой проблемы.
Ленивые вычисления — это компромисс. С одной стороны, они помогают нам сделать код более модульным. С другой стороны, бывает невозможно до конца разобраться, как происходит вычисление в конкретной программе — всегда существуют небольшие отличия между реальностью и тем, что вы о ней думаете. В конце статьи я дам рекомендации, как поступать в ситуациях такого рода. Итак, приступим!
Ленивые вычисления — часто используемая методика при исполнении компьютером программ на Haskell. Они делают наш код проще и модульнее, но могут вызвать и замешательство, особенно когда речь заходит об использовании памяти, становясь для новичков распространённой ловушкой. Например, безобидно выглядящее выражение
foldl (+) 0 [1..10^8]
потребует для своего вычисления гигабайты памяти.В этом руководстве я хочу объяснить, как работают ленивые вычисления и что они означают для времени выполнения и объёма памяти, затрачиваемыми программами на Haskell. Я начну рассказ с основ редукции графов, а после перейду к обсуждению строгой левой свёртки — простейшего примера для понимания и ликвидации утечек памяти.
Тема ленивых вычислений рассматривалась во многих учебниках (например, в книге Саймона Томпсона «Haskell — The Craft of Functional Programming»), но информацию о них, кажется, всё ещё проблематично найти в сети. Надеюсь, моё руководство посодействует решению этой проблемы.
Ленивые вычисления — это компромисс. С одной стороны, они помогают нам сделать код более модульным. С другой стороны, бывает невозможно до конца разобраться, как происходит вычисление в конкретной программе — всегда существуют небольшие отличия между реальностью и тем, что вы о ней думаете. В конце статьи я дам рекомендации, как поступать в ситуациях такого рода. Итак, приступим!
+47
О диагонали квадрата
4 мин
54KВведение в оборот комплексных чисел было далеко не первой революцией в понимании человеком природы числа. За две тысячи лет до этого мощнейшее потрясение испытал мир древнегреческой математики.
Неприятности у пифагорейцев начались далеко не сразу. Основанная Пифагором научная школа в итоге кончила плохо, но сегодняшний рассказ не о том бодром погроме, который был учинен над пифагорейцами благодарным за просвещение народом, а в большей степени о духовных перипетиях.
Неприятности у пифагорейцев начались далеко не сразу. Основанная Пифагором научная школа в итоге кончила плохо, но сегодняшний рассказ не о том бодром погроме, который был учинен над пифагорейцами благодарным за просвещение народом, а в большей степени о духовных перипетиях.
+75
Как растаращить class-файл
4 мин
45KОбычно при компиляции Java-файла получаются .class-файлы примерно того же размера, что и исходник. Меня заинтересовало, можно ли по небольшому исходнику сделать .class-файл, который больше, сильно больше исходника.
Можно поискать какие-то короткие конструкции языка, которые компилируются в длинные цепочки байткода, но линейный прирост меня не устраивал. Я сразу подумал про компиляцию finally-блоков: про неё уже писали на Хабре. Если вкратце, то для каждого finally-блока при непустом try-блоке создаётся минимум два варианта в байткоде: для случая нормального завершения try-блока и для случая завершения с исключением. В последнем случае исключение сохраняется в новую локальную переменную, выполняется код finally, затем исключение достаётся из локальной переменной и перебрасывается. А что если внутри finally снова разместить try-finally и так далее? Результат превзошёл все ожидания.
Можно поискать какие-то короткие конструкции языка, которые компилируются в длинные цепочки байткода, но линейный прирост меня не устраивал. Я сразу подумал про компиляцию finally-блоков: про неё уже писали на Хабре. Если вкратце, то для каждого finally-блока при непустом try-блоке создаётся минимум два варианта в байткоде: для случая нормального завершения try-блока и для случая завершения с исключением. В последнем случае исключение сохраняется в новую локальную переменную, выполняется код finally, затем исключение достаётся из локальной переменной и перебрасывается. А что если внутри finally снова разместить try-finally и так далее? Результат превзошёл все ожидания.
+101
Информация
- В рейтинге
- Не участвует
- Зарегистрирован
- Активность