Рубрика «ненормальное программирование» - 79

В некоторых языках существует возможность вызова функции с именованными параметрами. Такой способ позволяет указать аргумент для определённого параметра, связав его с именем параметра, а не с позицией. Это возможно, например, в C# или Python.

Рассмотрим «игрушечный» пример на 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.
Читать полностью »

Доброго дня, друзья!

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

Для того, чтоб жизнь мёдом не казалась, ограничим себя небольшим подмножеством языка JavaScript, а именно, будем использовать только анонимные функции от одного аргумента. Больше нам ничего не потребуется (ну почти :)).

Начнем с определения факториала, и посмотрим, что нам понадобится в процессе решения задачи:

var fact = function (n) {
  if (n === 0) return 1;
  return n * fact(n - 1);
};

Итак, нам потребуются функции, логические значения (для результата операции сравнения с нулем), условный оператор, операции умножения и вычитания единицы, кроме того нужно будет реализовать рекурсивный вызов функции.

Готовы?
Читать полностью »

Пролог

Последние год-полтора я чувствовал себя в ЖЖ как этот таксист. Впервые я зарегистрировался в LiveJournal уже больше 10 лет назад. Про фейсбук тогда наверно и Дуров не слыхивал, а тут можно было объединяться по интересам, обмениваться мнениями, писать корифеям типа Лебедева. У меня сформировалась френдлента и я стал замечать, что русский сегмент не так уж велик и в общем-то все друг друга знают. Года с 2011 примерно ЖЖ стал чахнуть, движуха стала перемещаться в твиттер и фейсбук, а я стал замечать что контингент комментирующих меняется. Сначала это было незаметно, но с прошлого года я поймал себя на мысли, что открывая комментарии к посту, я задаюсь вопросом того самого бородатого отшельника. Да и в прессе стали проскакивать статейки интересного содержания.

Но особой веры журналистам у меня нет, поэтому вооружившись Python, BeautifulSoup, psycopg2, matplotlib и PostgreSQL я решил провести собственное мини-расследование и заодно освежить/приобрести кое-какие навыки.
Читать полностью »

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

То, о чем я хотел бы написать, возможно знакомо многим. Во всяком случае это самые основы. Но так их никто не использует. Итак, начнем.

Предисловие:

Первая моя мысль была, а что будет если я просто возьму какой-нибудь адрес 0x7fff532c1166 и попробую записать туда «1». Ну, логично предположить, что система как-то нас контролирует и выдаст ошибку сегментирования. Что и произошло.
Читать полностью »

Вот и подходит двухнедельный отдых к концу, а вместе с ним и накопившиеся темы с предыдущей встречи сообщества .Net разработчиков на CLRium. Эта серия постов примерно показывает уровень, с которым мы раскрываем темы на этом мастер-классе, а что будет во второй встрече, можно почитать по ссылке: CLRium #2.

Ссылка на проект в GitHub: Делаем отгружаемые сборки: взаимодействуем между доменами без маршаллинга - 7 DotNetEx

На множественных ресурсах время от времени задается вопрос. Можно ли сделать отгружаемые сборки с текущего домена? Так, чтобы попользовался и «давай, до свидания!»? Везде и всегда ответ, который давался – это «нет». Ведь единственное, что можно выгрузить – это домен. Соответственно, если хочется наладить отгрузку, сборку надо помещать в домен, и налаживать между доменами взаимодействие через сериализуемые типы. А это — очень медленное взаимодействие. А мы скажем так. Можно. С ньюансами. Загружать мы будем также в отдельный домен. Но отменим сериализацию при вызове методов между доменами.

Вопросы, которые мы будем решать:

  • Создание домена с возможностью отдачи объекта из домена в родительский
  • Выгрузка сборки

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

Так уж случилось, что игры я писал лишь для себя, и профессионально этим никогда не занимался.
А вот опыт писать DSL (Domain Specific language) для уменьшения рутины написания совершенно разного кода хоть какой-то есть.
Именно этим и хочется поделится: как упорядочить необъятное.
Подходы к созданию скриптового языка описания настольных игр - 1
Наш хороший хабр-юзер GlukKazan пишет много статей о том какие есть замечательные продукты для создания различных досочных игр. Такие как Zillions of Games и Axiom Development Kit.
Однако эти программы не универсальны. И всегда хочется улучшить их. Но данные продукты не свободны, поэтому приходится писать программный продукт заново.
GlukKazan работает над открытым проектом Dagaz, о чём делится отличными статьями (например тут: Dagaz: Новое начало).

Итак, предположим, мы хотим создать универсальный игровой движок для настольных игр, и его основой мы хотим видеть скриптовый язык, который помогает растолковать движку правила игры.
Каким мы хотим его видеть?
1) Язык должен быть универсальным на сколько можно, дабы описать почти любые правила игры.
2) Тем не менее, язык должен быть как можно проще, минимум конструкций.
3) Описание правил должны быть легки для чтения игроделу и для написания своих игр
4) Для большинства случаев игры можно писать, дополняя/изменяя уже написанные
5) Коммуникация (АПИ) со скриптом должна быть насколько простой, насколько это возможно. Так, что бы можно легко писать ботов и ИИ.
На первый взгляд кажется, что потраченные усилия вообще никому не нужны будут, поскольку рутину не уменьшить, проще писать игры сразу готовыми.
Но это не так.
Всё куда проще!
Читать полностью »

Снимаем дамп объектов с памяти .Net приложения - 1 Продолжаем тему интересного на .Net, от чего мир Java будет посмеиваться (хотя у них это также возможно сделать), а приверженцы С++ говорить: «чего они только не сделают чтобы не учить C++».

В данной заметке мы напишем по сути – простенькое ядрышко профилировщика памяти для платформы .Net, который будет снимать дамп с SOH кучи (а в перспективе и с LOH).

Для написания статьи нам понадобится код из статьи Снимаем дамп объектов с памяти .Net приложения - 2 Получение указателя на объект .Net и Снимаем дамп объектов с памяти .Net приложения - 3 Ручное клонирование потока (измерение размера объектов).

Наши цели на сегодня:

  • Научиться итерировать кучу .Net
  • Научиться находить начало кучи .Net
  • Попробовать сытерировать все объекты чужого домена.

Ссылка на проект в GitHub: Снимаем дамп объектов с памяти .Net приложения - 4 DotNetEx

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

Roslyn: встреча .Net сообщества на CLRium #2 - 1 Довольно долгое время я пытался изучить Roslyn, но как и все мы, столкнулся с единой проблемой: времени на это абсолютно не было. Как обычно решается этот вопрос? Мы идем на множество ресурсов и ищем доклады и статьи на интересующую нас тему и как по шаблону повторяем движения автора, который показывает как этим пользоваться. С чем мы сталкиваемся, когда ищем описания тем, предложенных на CLRium? Мы не находим ничего. Т.е., конечно, Google выдает что-то по запросам “Roslyn”, “Roslyn samples”, но все-таки это тысячу раз разжеванные примеры, и притом древние как мамонты по меркам выхода новых версий CTP. Это важно, т.к. наличие информации предполагает развитость той или иной инфраструктуры. А самая крутая и единственная статья по Roslyn на данный момент — это эта: Roslyn: встреча .Net сообщества на CLRium #2 - 2 Roslyn для автоматического перевода кода C# в 1С-код
Отсюда и возникли идеи рассказать на CLRium про Roslyn, RyuJIT, CoreFx, шаринг объектов между процессами и прочие вопросы, на которые сложно найти ответы в сети Интернет.
Читать полностью »

Иногда я пишу небольшие программы на C++, и часто выходит так, что иконка программы «весит» больше, чем собственно сама программа. Так же вышло и при написании Sound Keeper: программа — 14КБ, иконка 16×16 + 32×32 + 48×48 пикселей — 15КБ. Какое расточительство! :) К счастью оказалось, что Windows (начиная с Vista) поддерживает PNG внутри ICO. Это как раз то, что нужно! Но почему-то не нашлось программы, которая бы позволила самому оптимизировать файлы PNG и собрать из них файл ICO. Поскольку у файлов ICO очень простой формат, соберём его при помощи FASM. Это нестандартное использование «плоского» ассемблера показывает, что его можно применять в самых неожиданных ситуациях, и это работает! :)

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

Прочитал пост habrahabr.ru/post/247161/ и подумал: вот человек написал непонятную программу на bash, которая выводит «Happy new year». Но это ведь bash! Надо показать, что zsh не хуже, а даже намного лучше! И так, программа на zsh, выводящая «С новым годом!» (по‐русски!) со следующими ограничениями:

  1. Программа не должна использовать никакие сторонние программы. Ни base64, ни cat, ничего.
  2. Программа должна выводить текст по‐русски.
  3. Программа быть написана на ASCII, но не должна содержать ни одной буквы или цифры.

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


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