Size: a a a

CODE BLOG / Чат

2020 February 12

4

4g in CODE BLOG / Чат
Bars0_o [SpamBlock]
Англ каламбуры
   Date - дата и date - свадьба
свидание
источник

B[

Bars0_o [SpamBlock] in CODE BLOG / Чат
Bars0_o [SpamBlock]
Англ каламбуры
   Date - дата и date - свадьба
Или свидание, не помню точно
источник

IM

Ivan Morgun in CODE BLOG / Чат
Аа лол)
источник

P

Polsovatelsetiinternet in CODE BLOG / Чат
Spectra GameSport
Ну оно  должно работать, это по документации) Только ты не забудь еще прописать pictureBox1.Load();
Open File Dialog В начале нужен же?
источник

SG

Spectra GameSport in CODE BLOG / Чат
Polsovatelsetiinternet
Open File Dialog В начале нужен же?
зависит от того как ты хочешь сделать)
источник

IM

Ivan Morgun in CODE BLOG / Чат
Народ, а для чего в серверах используются ssd для кеширования?
источник

SS

Steel Sword in CODE BLOG / Чат
Bars0_o [SpamBlock]
Но было бы интересно узнать, ибо чутсвую что не найду
У меня калькулятор.

Я делал с размахом в 2 этапа:
1. Парсинг на токены - объекты с общим наследником.
2. Сортировка в постфиксную форму, и одновременно, проверка правильности порядка.

Так как у меня котлин, я сделал в полу-функциональном стиле (анонимные функции с одинаковой сигнатурой в хеш-таблице), но можно просто через switch или if вызывать приватные классы метода.

Сперва парсинг.
Суть вот в чем: есть объект с состоянием. Там только поля, и вроде-бы еще был какой-то метод. Короче, заменитель struct'а.
И функции. Они принимают состояние, текущий символ и следующий символ. И типы:
Есть унарные операторы, числа, открывающие скобочки, закрывающие скобочки. Функции я отнёс к типа-унарным операторам. Когда уже идет работа с токенами, я часто писал (функция или унарный оператор). Ну похоже же:
sqrt(16) и -16
Из-за скобочек пришлось выносить функции в отдельный тип.

Ну так вот. В объекте есть стек для завершенных токенов, есть буфер для символов, чтобы по символам добавлять название функции или многозначное число, есть булевый флаг того, оператор ли сейчас или операнд, есть флаг того, была ли точка в числе. Это для борьбы с числами типа 23.345.3.456.
Глобальный цикл итерируется по символам, скидывает его функции, которая возвращает тип (я не помню, этой функции вроде бы нужен объект состояния), по типу получает соответствующую функцию, скидывает ей объект, текущий символ и следующий символ.
Если весь парсинг делать в одном классе с методами, то объект состояния не нужен, просто свойства в парсере. Я сперва так сделал, потом переделал на независимые функции.

Теперь самая главная вещь в алгоритме - это флаг оператор/операнд. Функция проверки говорит что текущий символ "+" - это бинарный оператор, но флаг стоит в положении операнд - функция для бинарных операторов выбрасывает исключение. И т.д.

У каждого типа своя маленькая функция. Например открывающая скобочка (она соответствует операнду):
Если сейчас оперетор:
   Выкинуть исключение
Иначе:
   Добавить OpenBracketToken() в стек.

Или вот бинарный оператор:
Если сейчас оператор:
   Добавить BinaryOperatorToken(symbol) в стек
   Переключить в операнд
Иначе:
   Выкинуть исключение

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

Короче, как-то так. У функций и чисел проверяем следующий символ, если конец, выгребаем буфер в строку, потом в число если число, потом в токен. Если точка уже была (смотрим флаг), но появилась снова, выбрасываем исключение. И если следующий символ - не закрывающая скобочка, переключаем в с операнда в оператор, закрывающая скобочка тоже переключает в оператор если после нее не идет еще одна закрываюшая скобочка. Пробелы нужно пропускать. Думаю, все варианты сам разберешь. В конце вываливаем стек в массив.
В начало я кладу StartToken, в конец EndToken.
Итого у нас выходит вот такое. Из:
(sqrt(5) * 7)
Вот это (в котлине не нужен new):

[StartToken(), FunctionToken("sqrt"), OpenBracketToken(), NumberToken(5.0), CloseBracketToken(), BinaryOperatorToken('*'), NumberToken(7.0), CloseBracketToken(), EndToken()]

И вот содержимое части, занимающейся парсингом:

Класс с состоянием {
   Парочка
   Полей
}

Хеш-Таблица {
  Тип : Функция,
  Тип : Функция,
  Тип : Функция
}

Функция главного цикла { }

Проверка типа { }

А переделать  можно вот так:

Класс парсинг {
  Поле раз
  Поле два
  Поле три

  Главный цикл { }

  Получить тип { }
 
  Функция типа A { }
  Функция типа Б { }
  Функция типа В { }
}
Все, конечно же приватно.

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

Отдельная история - запятая аргументов функции.

Так как токены у нас - это классы, то мы можем запихать проверки вводимых данных, еще мне пришлось перегрузить операторы сравнения, чтобы NumberToken(5.0) был равен другому NumberToken(5.0).

Короче, думать пришлось много. И парочка костылей п
источник

SS

Steel Sword in CODE BLOG / Чат
Bars0_o [SpamBlock]
Но было бы интересно узнать, ибо чутсвую что не найду
рисутствует. Но пока это самая масштабная вещь, которую я написал своими руками 😊
источник

SS

Steel Sword in CODE BLOG / Чат
Вобщем, я взял обратную польскую запись, придумал парсер на куски, сделал ООП версию алгоритма. Готово.
источник

SS

Steel Sword in CODE BLOG / Чат
Ну и котлин. Котлин крут.
источник

SS

Steel Sword in CODE BLOG / Чат
Ivan Morgun
Народ, а для чего в серверах используются ssd для кеширования?
Наверное быстро писать/стирать
источник

NK

ID:0 in CODE BLOG / Чат
Git

1. Установка Системы контроля версий
2. Создание репозитория; Добавление пользователя
3. Игнорирование файлов
4. Добавление файлов
5. Коммиты, индексы, добавления
6. Логи изменений
7. Свой редактор для комментариев
8. Ветки
9. Создание веток

https://www.youtube.com/playlist?list=PLdXqPp0o8gSEgfhXoaHPWEv3r-62YTyLF

#video #git
источник

4

4g in CODE BLOG / Чат
Ivan Morgun
Народ, а для чего в серверах используются ssd для кеширования?
Для начала 1. кэш на сервере может быть настроен на чтение, на запись, смешанный режим и соответственно % соотношение операций
2. любая запись это очередь на дисковую подсистему. чтобы сократить этот момент данные предварительно запишутся в кэш записи, и программе вернется статус что все записано. далее контроллер дисковой подсистемы запишет из кэша данные в дисковый массив непосредственно.
3. любое чтение с дисков это время, оно хоть и меньше чем запись чаще всего, тем не менее это время ожидания со стороны ПО которое пытается считать данные с дисков. помещая данные в кэш для чтения в случае "хорошего" кэша (когда % подпадание в кэш довольно высок) данные по запросу читаются не из дисковой подсистемы непосредственно, а из кэша, что за счет большой скорости SSD позволяет меньше дергать диски и быстрее получать данные.
Естественно после старта сервер кэш холодный и непродолжительное время все запросы идут мимо кэша в диски. Как только кэш становится "теплым", данные получают уже оттуда.
4. Со временем если данные не запрашиваются из кэша они очищаются, чтобы освободить данные для других запросов.
Если кэш настроен неправильно, он будет работать неэффективно, т.е. его объем всегда значительно меньше объема дискового хранилища
источник

K

KVIZORD in CODE BLOG / Чат
Всем привет. Мой школьный учитель предложил мне написать копию старой игры под dos (см. скриншот). Вопрос - какую из библиотек python лучше использовать для графического интерфейса?
источник

4

4g in CODE BLOG / Чат
Ivan Morgun
Народ, а для чего в серверах используются ssd для кеширования?
у многих производителей СХД, есть такие системы когда фактически СХД состоит из 3 типов носителей: SSD (nvme в частности), SAS 15к rpm небольшого объема и очень быстрые диски размерностью 2,5" и SAS/SATA 3.5" диски как правило в лучшем случае 10к rpm, еще есть вариант писать на ленту но это скорее архивирование, чем оперативный доступ; и программная составляющая, которые в зависимости от частоты обращения к тем или иным данным в фоновом режиме переносит их из пула носителей одного типа в пул носителей другого типа. таким образом, данные которые стали не нужны перенесутся сначала с ssd в 2,5" SAS, потом в пул носителей 3,5" дисков большой емкости. Если частота обращения  к этим данным снова поднимется, СХД также в фоновом режиме перенесет их в пул более быстрых носителей.
источник

SS

Steel Sword in CODE BLOG / Чат
KVIZORD
Всем привет. Мой школьный учитель предложил мне написать копию старой игры под dos (см. скриншот). Вопрос - какую из библиотек python лучше использовать для графического интерфейса?
Заранее можно сказать, что лучшая GUI библиотека для питона - это PyQt.
источник

S

Sghile in CODE BLOG / Чат
Steel Sword
Заранее можно сказать, что лучшая GUI библиотека для питона - это PyQt.
+
источник

K

KVIZORD in CODE BLOG / Чат
Не слишком сложно будет, для такого небольшого приложения? С первого взгляда, она довольно громоздкая
источник

SS

Steel Sword in CODE BLOG / Чат
KVIZORD
Не слишком сложно будет, для такого небольшого приложения? С первого взгляда, она довольно громоздкая
Можешь использовать встроенный tkinter, у него как раз дизайн как в Win98 😂
источник

K

KVIZORD in CODE BLOG / Чат
Хах, ладненько, спасибо за советы
источник