Лаборатория Амфилохия

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
11 года 11 мес. назад - 11 года 11 мес. назад #69833 от Amphilohiy
Пока все тут развлекаются бредофренией соседа, я решил потешить свое самолюбие и создать тему со своим именем. Увы, у меня все скучнее и, кто бы мог подумать, про Руби. И что я делаю? Ставлю сомнительные эксперименты и извлекаю факты. Зачем?
ВНИМАНИЕ: Спойлер!


Числа с плавающей запятой
Листинг пилотного бреда:
ВНИМАНИЕ: Спойлер!


Факт №1: Float имеет всего 15 значащих цифр.

Числа с плавающей запятой в программировании имеют интересное строение - бит отводится под знак, n бит под мантиссу и m бит под степень. В итоге мы можем получить числа 2.5e+100 и 2.5e-100 (очень большое и очень малое), но при сложении обоих получим лишь 2.5e+100, т.к. такое незначительное изменение не вмещается в мантиссу.

Факт №2: максимальная степень десятки для Float 307, а минимальная -324.

Обычно значения степени варьируются в области (n^2)-1..-n^2 (например 1023..-1024, не забывайте что ваша память работает с двоичными числами). Однако эту надбавку степени для очень малых чисел можно объяснить тем, что мантисса для при очень малых числах уменьшается (последние 2 printf'a).

Факт №3: в Руби есть константа бесконечности.

Я в шоке господа. То, что если постоянно делить число на 2, то оно станет нулем, я знал, но умножением на два дойти до бесконечности для меня стало настоящим подвигом.

На этом эксперимент завершаю. Не стесняйтесь выкладывать свои эксперименты или соображения. Главное, не задавайте вопросов, для этого у вас есть Сосед!

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Последнее редактирование: 11 года 11 мес. назад пользователем Amphilohiy. Причина: Форматирование текста
Спасибо сказали: Lekste, DeadElf79, Dprizrak1

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 11 мес. назад - 11 года 11 мес. назад #69839 от DeadElf79
Проверено, да
Двойка в степени миллион...

Двойка в степени миллиард...

Собственно, насчет бесконечности - она вообще во многих современных языках очень даже есть (где проверял - там точно есть) ^_^
Вы доведете форум со своими ляпаниями (лепнинами?) и лабораториями до того, что он заставит эльфа писать сюда что-то вроде блога (который все равно никто не будет читать)
Последнее редактирование: 11 года 11 мес. назад пользователем DeadElf79.
Спасибо сказали: Dprizrak1, Amphilohiy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
11 года 11 мес. назад #69840 от Amphilohiy
Эльф, ты главное не выкладывай фотографии еды, не все поймут. Сюда могут с работы голодные заходить.
Я вот с бесконечностью только сегодня встретился, немного удивился. Но из языков то я знаю Lua да C++.

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 11 мес. назад #69851 от DeadElf79

Эльф, ты главное не выкладывай фотографии еды, не все поймут.

Амфи, я знаю, чем отличается блог от инстаграмов

Ты, кстати, так и не написал статейку про треды, фиберы и прочее? (имеются ввиду классы Thread и Fiber)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
11 года 10 мес. назад #70767 от Amphilohiy
Этот эксперимент я проводил раньше, но с результатами затянул. Данный эксперимент для меня ценен в основном в том, что я эту тему собираюсь использовать для слабых таблиц.
Object id
Листинг эксперимента:
ВНИМАНИЕ: Спойлер!


Факт №1: Если переменной присвоить переменную, то обе переменные будут указывать на один объект

Не очень то и неизвестный факт. Если мы сделаем две переменные с одним объектом, то работая с одной переменной мы изменим это значение и для другой переменной.

Факт №2: Для объектов типа Symbol и Fixnum имеющих одинаковое значение соответствуют одинаковые id объекта.

Это значит что присваивая переменным одинаковые значение не через другие переменные (такие как :symb или 3) им все равно будут присваиваться одинаковые объекты.

Факт №3: id Fixnum можно вычислить по значению (val) id = val * 2 + 1

Те, кто пытался менять значение в играх на RPG Maker с помощью cheat engine наверное знают, что именно по этой формуле ищутся настоящие значения. Дело в том, что в этом случае вы меняете id переменной, а не сам объект.

Факт №4: Если сборщик мусора освободит id объекта, то его может занять новый.

Тоже не новый факт, но это создаст дополнительные проблемы для моих слабых таблиц.

Благодарю за внимание. Вполне возможно, что скоро я опубликую здесь прототип слабой ссылки. Хотелось бы, чтобы вы помогли с его тестеровкой.

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Спасибо сказали: DeadElf79, Dprizrak1

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
11 года 10 мес. назад #70773 от Amphilohiy
Немного лень доводить до ума свой проект, так что опубликую здесь это. Собственно слабые ссылки:
ВНИМАНИЕ: Спойлер!


Принцип прост как 2 пальца. Я храню лишь id объекта, следовательно сборщик мусора не знает, что я указываю на объект, и ничто не мешает сборщику собрать объект. При этом я объявляю finalizer для объекта через ObjectSpace.define_finalizer (который, в свою очередь, не создает один единственный метод при сборке, а добавляет еще один). Финалайзер является проком, который знает id объекта который задавался в тот момент (это должно предотвратить затирание ссылки после того, как ссылке переназначили значение). Само значение берется с помощью ObjectSpace._id2ref.

Собственно парочка вопросов по этому поводу:
- Никто не знает зачем вообще могут быть нужны слабые ссылки? (я к тому, что эта тема волнует только меня)
- Есть ли в данной наработке дыры?
- Как сделать ультимативный краш тэст?

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Спасибо сказали: Lekste, Dprizrak1

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
11 года 10 мес. назад #70781 от Lekste
Зачем нужны слабые ссылки? Для реализации подписки на событие, например.
Есть у тебя независимый модуль, который, к примеру, занимается управлением анимацией.
И есть другой модуль, который занимается отработкой логики столкновений.

При этом, модуль столкновений хочет уведомлять о чем-то другие модули (в том числе и модуль анимации).
Делаешь такую ссылку на него и все. Все модули независимы и живут своей жизнью, но при этом есть каналы взаимодействий.
Спасибо сказали: Dprizrak1, Amphilohiy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
11 года 9 мес. назад - 11 года 9 мес. назад #71497 от Amphilohiy
Вот и стало мне скучновато, все либо тихо в сторонке что-то умное делают, либо чешут языками в чате. А я, решив себя развлечь, вспомнил о своей задумке, смысл которой заключался в том, чтобы использовать хэши в оптимизационных вопросах. Остается только понять - как от размера хэш таблицы зависит время доступа к элементам? Учитывая, что это хэш (не буду вдаваться в принцип работы онных), я предположил, что зависимость слабая, вся соль в коллизиях (при определенном размере начнут нарастать временные затраты). Листинг эксперимента:
ВНИМАНИЕ: Спойлер!

На своих 2.3 GHz выдал такие результаты:
ВНИМАНИЕ: Спойлер!

Эксперимент прост - создаем файбер (я все еще считаю, что эксперимент прост), который при каждом вызове заполняет хэш до размера степени десятки (т.е. 10, 100, 1000 ... 10 000 000), затем высчитываем эталонное время прогона массива из 10 000 000 ключей (просто проходимся по массиву, ничего не делаем), затем с каждым вызовом файбера создаем массив из 10 000 000 ключей и под замером времени проходимся по массиву с ключами и достаем объекты из таблицы. Из полученного времени вычитаем эталон времени прохождения по массиву с ключами.

Результаты в целом радуют. Хэш функция работает быстрее, чем проход по массиву, а скачок временных затрат наблюдается примерно после 10 000 элементов. Весь эксперимент проводится около минуты (большая часть времени занимает заполнения таблицы и массива ключей).

UPD: Как то я умолчал довольно важный факт. Время эксперимент - минута, хотя результаты доступа к таблице довольно быстрые. Остальное время занимает заполнение массивов/таблицы. Так что в плане оптимизации это вопрос о двух концах палки.

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Последнее редактирование: 11 года 9 мес. назад пользователем Amphilohiy.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 9 мес. назад #71498 от DeadElf79
Амфи, бенчмарки тебе deadelf79.blogspot.ru/2013/09/blog-post_28.html
Спасибо сказали: Amphilohiy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
11 года 9 мес. назад #71499 от Amphilohiy
Эльф, сижу с [strike]микроволновки[/strike] RPG Maker, там бенчмарков, без отдельной скачки, и в помине нет. Тем не менее результат, вроде бы, не сильно изменился. Но может я еще чего-то пока не понял.
ВНИМАНИЕ: Спойлер!

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 9 мес. назад #71500 от DeadElf79
даже в эйсе? как же они его урезали О.о ладно, зато мы выяснили, что тут точность хоть и выше, но результаты по сути те же)) Спасибо за интересную информацию, приму к сведению)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
11 года 8 мес. назад - 11 года 8 мес. назад #73316 от Amphilohiy
Слабые кучи. Вот как-то так будут именоваться у меня слабые таблицы. Решив, что пересобрать хэш, да еще и со слабостью, мне концентрации не хватит, я пришел к этому:
ВНИМАНИЕ: Спойлер!

Для начала стоит упомянуть, что я опираюсь на слабые ссылки, описанные мною ранее в лаборатории. Принцип кучи прост - ты кидаешь в него значения, как в хэш. Но чтобы получить значение, придется вызвать метод to_hash который вернет нормальный хэш со значениями. Во время возврата все пустые пары (по ключу или значению) собираются. Ну и конструктор, он принимает 2-3 значения:
  1. Ключи слабые? (Булева)
  2. Значения слабые? (Булева)
  3. Начальные значения (Хэш, необяз.)
Что еще не упомянул? Ну, придется запомнить две вещи: полученный хэш при себе держать, естественно, не стоит. А так-же если постоянно заполнять кучу, но не брать из него ничего, то он все же потеряет свою функцию. За сим все, благодарю за внимание.

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Последнее редактирование: 11 года 8 мес. назад пользователем Amphilohiy.
Спасибо сказали: Iren_Rin

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
9 года 9 мес. назад - 9 года 9 мес. назад #93283 от Amphilohiy
Сколько тут пыли то скопилось. Но о чем это я... Ах, да! Выполнить протокол безумия! Поднять рубиновые катушки!... Оно живое!!!
А вообще я тут наткнулся на очень печальную часть скриптовой архитектуры Эйса, и конкретно меня печалит загрузка карты...
ВНИМАНИЕ: Спойлер!

Все хорошо, но что если я хочу сделать фабрику карт (а я, допустим, хочу), то у меня возникает пара нехороших вопросов. Во первых - как передать айди? Ну, я могу передать строку с префиксом, но тогда все поляжет на методе sprintf. Вытекает 2й вопрос - как предотвратить загрузку карты? Вообще выкинуть эту строчку, или... еще лучше - заменить ее.
И тут я вспомнил вот что - в Рубях функций по сути нету. А что есть? методы. Казалось бы в чем разница, но раз sprintf и load_data - методы, то он вызываются из некого предка (1й точно Kernel). Я думаю вы понимаете куда клонит мысль... Я просто переопределю этим методы для Game_Map с вызовом супер, но добавлю очень специфичные случаи...
ВНИМАНИЕ: Спойлер!

В сухом остатке - я "заменил глобальные методы" в отдельно взятом классе, ибо хотел добавить немножко совместимости, вместо полного переопределения метода. Все спасибо разнице между функцией и методом, иго-го-го-го-го!!!

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Последнее редактирование: 9 года 9 мес. назад пользователем Amphilohiy.
Спасибо сказали: MaltonTheWarrior, Rude

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
9 года 7 мес. назад - 9 года 7 мес. назад #94057 от Amphilohiy
Время 3 ночи, мучает бессонница, почему бы не накатать статейку? Вам когда-нибудь требовалось делать те же самые изменения в нескольких классах одновременно? Редкое явление, но всякое бывает. И что бы вы сделали в этом случае? Если что-то вроде
ВНИМАНИЕ: Спойлер!

То вы делаете это неправильно. Есть способ попроще, не требующий дублирования кода. Благодаря class_exec, который позволяет выполнять код внутри класса, мы можем вносить эти изменения в цикле.
ВНИМАНИЕ: Спойлер!

Опять же, явление редкое и чаще всего все обходится изменениями в общем предке, но в тех же классах свитчей и переменных общего предка нет. Может пригодится, а может и нет, тем более что это, вроде бы, самый не заумный пост в моей лаборатории.

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Последнее редактирование: 9 года 7 мес. назад пользователем Amphilohiy. Причина: Спойлеры
Спасибо сказали: DK

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
9 года 7 мес. назад #94058 от Lekste
Главное не злоупотребляйте, чтобы сберечь нервы от сюрпризов. :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
9 года 6 мес. назад - 9 года 6 мес. назад #94785 от Amphilohiy
Итак, рубисты светлой. Я хочу сыграть с вами в одну игру. Тот кто правильно ответит на вопрос получит ничего. У нас есть переопределение метода method_missing, в котором мы выводим имя вызываемого метода и его аргументы.
Code:
def self.method_missing *args args.join(" ").tap{|result| puts result} end
И теперь мы пытаемся запустить 2 строки:
Code:
lightzone amphi lab
и
Code:
lightzone amphi, lab
Кто сможет полностью объяснить мне результаты вывода сообщений в консоль?

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Последнее редактирование: 9 года 6 мес. назад пользователем Amphilohiy.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
Больше
9 года 6 мес. назад #94786 от strelokhalfer
Видимо без запятой интерпретатор разделяет комманды как разные методы, а с запятой как аргументы передстоящего метода

"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Спасибо сказали: Amphilohiy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
9 года 6 мес. назад #94789 от Amphilohiy
Лови лойс

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
9 года 6 мес. назад #94823 от Amphilohiy
Так уж случилось, что я сейчас переодически мучаю XP. Версия 1.04 (пиратка ессено). И наткнулся на очень интересное поведение исполнения скрипта. И пока моя пятая точка плавит льды, быстро тающих от неслабого нагрева, опишу в чем же суть:
Давайте представим, что вы сделали событие, выполняющее скрипт одной строчкой, например такое
ВНИМАНИЕ: Спойлер!

Говорим с этим персонажем и попадаем в лимбо вечного цикла. Меняем строчку на
Code:
a = true
И у нас все в шоколаде. Окей, а что будет, если написать вот так
Code:
a = false false
И вы угадали! Мы снова можем ходить! Почему? Ну, потому что. Давайте окунемся в принцип исполнения команд интерпретатором. Interpreter1 метод update, строки 198-203:
Code:
# If return value is false when trying to execute event command if execute_command == false return end # Advance index @index += 1
Если команда вернула true, то идем к следующей. Если false, остаемся на этой. Но погодите, разве предыдущий пример из 2 строк не вернул false? Вернул.
Давайте посмотрим как интерпретатор исполняет скрипт:
ВНИМАНИЕ: Спойлер!

Так что эта фигатень значит? Ну, сначала интерпретатор проходит по всем строчкам события, которые являются продолжением скрипта и останавливаются на последнем.
...
Вот что получается, Если событие однострочное, то оно состоит из команды 355, но если многострочное, то первая строка это команда 355, а последующие 655. И он останавливается на последнем. И ясное дело такая команда (655я) не обрабатывается интерпретатором и пропускается. В чем проблема? Ну, даже операция присваивания имеет результат (равный присваемому значению), а значит, что строка
Code:
$game_switches[1] = false
Погрузит вас в отчаяние вечного цикла. Как говорится, всего хорошего.

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Спасибо сказали: DK

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
9 года 5 мес. назад - 9 года 5 мес. назад #95046 от Amphilohiy
Кто-нибудь тут?
*звук сверчков*
Отлично.
Вопрос будет чисто эстетический. Например мне не нравится, как работают именованные аргументы в руби (а точнее их практически бесполезная замена). И вот я внезапно наткнулся на парочку интересных методов и в итоге заделал собственный способ разруливания аргументов. Выглядит это примерно так:
Code:
module A # подключаем модуль с функцией разруливания extend Bizzare # просто функция def self.func x, y = nil, z = nil p x p y p z end # делаем обвертку arged :func end # вызываем оригинальную функцию A.func(1, z: 2) # => 1, {:z=>2}, nil # вызываем обвернутую функцию A._func(1, z: 2) # => 1, nil, 2
Да, я не буду показывать как (ждите в ядре в следующем году). Но вопрос в том - как их лучше так обвернуть? Сделать псевдоним оригинальной функции и налепить новую кажется самым разумным вариантом. Но просто интересно, не вызовет ли это особых непоняток у тех, кто захочет (ХАХАХА, как-будто это кому-то надо) подкорректировать обвернутые функции?

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Последнее редактирование: 9 года 5 мес. назад пользователем Amphilohiy.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.145 секунд
Работает на Kunena форум