Нужна помощи по С

+34
в блоге IT Pony!
Два вопроса:
1. Нужно создать переменную с не совсем обычным типом. Знаковая, целая размер 4 бита (пол байта) int это 32 остальные стандартные также не торт
2. С какой частотой по умолчания вызывается функция, надо чтоб 10 герц было

Задача

152 комментария

2. С какой частотой по умолчания вызывается функция, надо чтоб 10 герц было
Винда? Как решит планировщик, так и будет. Для более менее стабильной и кое как прогнозируемой частоты существуют мультимедийные таймеры: docs.microsoft.com/en-us/windows/desktop/multimedia/multimedia-timers
1. Нужно создать переменную с не совсем обычным типом. Знаковая, целая размер 4 бита (пол байта) int это 32 остальные стандартные также не торт
Мне совершенно непонятно зачем эти извращения в 32/64 битной системе, где компилятор всё равно сделает как удобнее архитектуре. Он даже для bool выделит все 32 бита в памяти…
INFERION
0
Мне совершенно непонятно зачем эти извращения в 32/64 битной системе

на сколько я знаю 32 битные системы менее требовательны к железу(на слабой машине будут программы быстрее работать(тут либо больше пользователей(игры на x32) либо функционал)), но скоро полностью избавятся от X32 систем/программ
CalmKnight
0
Совсем нет. Единственный плюс 32-битного кода перед 64-битным — как раз то, что инты (и указатели, как следствие) в нём в два раза уже, значит, в принципе, можно чуть более экономно использовать heap и стек. Но кто в 2019 экономно использует память?
То, что, якобы, с 32-битными данными процессор работает быстрее, потому что они короче 64-битных — миф, сейчас даже шина памяти у всей существующей для x86 памяти 64-битная (мы же, правда, не будем вспоминать SIMM-ы?), соответственно все пересылки и обработка происходит точно так же, как при работе в 32-битном режиме. Те программы, которые пока ещё встречаются для x86 (т.е. не x86_64) собираются исключительно ради совместимости.
makise_homura
+1
А уж сколько в Питоне bool весит…
Sasha-Flyer
+1
Он даже для bool выделит все 32 бита в памяти…
И правильно сделает, кстати. Только в хорошем случае (т.е. почти всегда для локальных переменных, если это не большие массивы) до памяти эта переменная так и не дойдёт =) Будет лежать на регистрах, может, упадёт в кэш, но если при этом к ней будут часто обращаться, то из кэша она далеко не улетит (запись в память пойдёт только тогда, когда изо всех кэшей эти данные будут вытеснены, что с часто используемыми локальными переменными случается редко — если, конечно, функция там не вызывает стопицот врапперов со своими локальными переменными каждый, а компилятор это оптимизировать не смог).
makise_homura
+1
Что-то я подозреваю, что создать элемент данных меньше чем 8 бит на современном оборудовании в принципе не получится. Не говоря уже о вышеупомянутом выравнивании под архитектуру
andreymal
+1
Вопрос поступил от жены. Она работает на оборонном заводе, и там внезапно все компьютеры древние.
Gredon
0
Вообще, точный ответ скорее всего зависит от этого самого оборудования, от запущенной на нём операционной системы (если она вообще есть) и от того, кто как запускает программу и каким образом входные данные подаёт
andreymal
+1
Более того, даже 8-битные char-ы, если их не делать packed, отжирают все 64 бита — так контроллеру памяти проще. А массивы вообще лучше выравнивать по размерам строк кэша — удобно для оптимизаций алгоритмов на SIMD-расширениях (например, тот же поиск).
makise_homura
0
Ну а какая-либо стабильная частота в современных не-RT операционных системах с вытесняющей многозадачностью скорее всего вообще недостижима (у меня вот только что ноут целиком завис на целых семь минут, о каких вообще десяти герцах тут речь вести)
andreymal
0
С какой частотой по умолчания вызывается функция, надо чтоб 10 герц было

from time import sleep
while True:
    func()
    sleep(0.1)

Если препод спросит, почему Питон, то ответь ему, что С — устаревшее говно, на котором всерьёз кодят только прыщавые задроты.
Sasha-Flyer Изменён автором
-4
На самом деле это чуть меньше чем 10 герц (а может и сильно меньше, но это как повезёт)
andreymal
0
А идеально 10гц ты не сделаешь даже при сильном желании. Скорее всего сейчас это даже на Ассемблере под твой процессор невозможно будет.
Sasha-Flyer
0
На специальном оборудовании со специальной ОС можно точные 10 герц получить (с поправкой на точность встроенных кварцевых часов)
andreymal
0
Но точно не на винде с обычным intel core.
Sasha-Flyer
0
Мультимедийный таймер есть в компах, его использует и винда, и даёт он хорошую точность. Для этого и сделан. Конечно, разгул в несколько семплов аудиопотока за секунду он таки у меня даёт, но это всё же куда лучше Sleep.
INFERION
+2
На самом деле, в принципе, можно (разумеется, если мы считаем гранулярность ожидания в десяток тактов допустимой; при этом считаем тактовую частоту эталонной и неизменной). Банально «cli; rdtsc; add eax, delay; xchg eax, ebx; retry: rdtsc; xor eax, ebx; jnz retry; sti», где delay — нужная задержка в тактах. Само собой, cli и rdtsc — привилегированные инструкции, т.е. это нужно делать в ядре. Разумеется, после sti тут же повалятся прерывания, поэтому задержку мы считаем до sti. Если это делать в нулевом кольце без операционки, то, в принципе, можно вообще отключить все прерывания (и включать их только когда нужно). Вот тогда да, будет самое жёсткое реальное время, которое только возможно.
Кстати, не знаю, как сейчас, но в i386 xchg r32,r32 выполнялась быстрее mov r32,r32, а xor r32,r32 — быстрее cmp r32,r32. Первое было связано с очень сложным алгоритмом работы mov, а второе — с тем, что cmp — это вычитание, оно долгое, поскольку операнды проходят сумматор в АЛУ; xor — простой побитный xor, который делается параллельно со всеми битами.
makise_homura
+1
Я б сказал, это стратегия «не больше, чем 10 герц» =)
Причём может быть и сильно меньше, если комп фризится по какой-нибудь причине…
makise_homura
0
Питон — устаревшее говно, на котором всерьёз кодят только прыщавые задроты, которые закупили терабайты оперативки для хранения bool'ов. Настоящие пацаны пишут шедевры на Rust
andreymal
+2
Если препод спросит, почему Питон, то ответь ему, что С — устаревшее говно


Г-н Фраер в очередной раз громогласно газифицировал лужу, сравнив интерпретируемый и компилируемый языки, с абсолютно разными сферами применения!
Спойлер
KerHarrad
+4
В вк мои комменты на такую тему набирают гораздо больше комментов
Спойлер
vk.com/wall-72495085_951112
Sasha-Flyer Изменён автором
0
>Все данные должны иметь 1 бит
>значение в диапазоне от 0 до 7
Вы е*анулись?
Sasha-Flyer Изменён автором
0
вроде у байтов идёт от 0 до 7, а в одном байте 8 бит, а бит может быть либо 0 либо 1
CalmKnight
0
У байтов вообще может до 256, но речь идет только о битах…
Sasha-Flyer
0
Это для входных данных. На счетчик такое не распространяется.

Скорее всего, под «1 битом данных» имелись в виду, что переменные типа bool, ибо, если праскинуть мозгами, то все входные данные — логические (true или false). Ох уж эта неточность в учебных заведениях…
RikKargones Изменён автором
0
Нужно создать переменную с не совсем обычным типом. Знаковая, целая размер 4 бита (пол байта)

Это невозможно, просто потому, что байт есть минимальная адресуемая единица информации.

Можно лишь так организовать структуру данных, чтобы на одно значение выделялось 4 бита — тогда в одном байте получится хранить две переменные.
Это несложно с помощью битовых операций.

С какой частотой по умолчания вызывается функция, надо чтоб 10 герц было

Без конкретики по операционной системе и аппаратной части ничего сказать нельзя. Если это DOS — там 18.2 Гц точность достижима без хлопот, 1000 Гц — с хлопотами. Если Windows/Linux — то про точность нужно забыть. Если системы реального времени — Qnx, LinuxRT — там всё хорошо.
NTFS
+2
Если это DOS — там 18.2 Гц точность достижима без хлопот, 1000 Гц — с хлопотами.
Ну, опять же, если ничего не крутится лишнего на машине (условно — мы работаем с запрещёнными прерываниями) — то с помощью rdtsc можно обеспечить частоту хоть в десятые-сотые доли тактовой, вопрос только в том, чтобы нагрузка успевала выполняться за отведённый интервал. Т.е. если это какой Pentium IV на пару гигагерц, то можно дёргать нагрузку с частотой в сотни мегагерц, в принципе.
makise_homura
0
Версия первая: это задачка под ДОС и под чистый С, каким он был лет 30 назад.
В чистом С была когда-то конструкция для выделения битовых полей в переменной, в каком-то затёртом учебнике бородатого года читал. И уже там писалось, что оно конечно есть, но к использованию не рекомендуется. А на счёт 10Гц… Вроде была тогда же функция delay, калиброванная под то ли 8086, то ли под 80286… Принимала она параметр в миллисекундах и держала задержку достаточно точно, но только на том самом процессоре (куча nop в цикле там была внутри скорее всего).

Версия вторая: это задача под микроконтроллеры. Наводит на эту мысль очень уж аппаратная постановка задачи. В частности под семейство 8051 есть модификация С — С51, собственно. Там есть битовые и операции, и переменные. Кстати, и условие с периодом выполнения функции тогда становится понятно — реализовать прерывание по предварительно настроенному таймеру. Но тут по-любому надо уточнить, под какие именно ядро и архитектуру должна быть реализация. Тут очень зависит.

В любом случае, весело у вас там…
MexoOne
+1
Блин. А ещё может быть ПЛК, но тут вариантов архитектур чуть ли не ещё больше.
MexoOne
0
Вообще это очень сильно смахивает на ТЗ прошивки микроконтроллера или ПЛИС.
Если это точно C (а не, допустим, Verilog или VHDL) — то скорее всего микроконтроллер.
Соответственно, вопросов сразу куча:

1) Откуда приходят исходные данные. Почему такая странная идея — упаковать четыре битовых значения в одну переменную? Может, проще взять четыре отдельные int-овые переменные? Компилятор всё равно разместит их на регистрах.
Кстати, для справки: int всегда не сложнее и не медленнее, чем любые малые типы (например, char). Поэтому, когда нет задачи экономить память и регистры (а на современном сколь угодно хилом железе, даже MCU, экономить единицы байт бессмысленно, соответственно этой задачи нет), всегда стоит использовать int и не паковать биты.
Другое дело, когда данные уже имеются в таком формате (например, это поле какой-то структуры, падающее нам на вход по какому-нибудь каналу — хоть I2C, хоть WLAN, ну или что-то ещё).

2) Какая аппаратная основа? На Arduino это пишется одним образом, на Linux в качестве модуля ядра — другим, на Windows — вообще зависит от IDE и применяемой библиотеки. Используя одну libc, портируемым образом точно получить 10 Гц невозможно, насколько я знаю.

3) Нужно ли строго 10 герц, или есть ограничения типа «не меньше 10 Гц», «не больше 10 Гц», «примерно 10 Гц, можно чуть больше/чуть меньше». Где-то пойдёт простой usleep() между циклами, а где-то нужно делать обработчик прерывания и использовать HPET.

Короче, в исходной задаче слишком мало информации.
Если говорить о тех вопросах, которые вынесены в начало поста, то:
1) На x86 и x86_64 это невозможно, а в общем случае ещё и не нужно. Используй любые 4 бита в обычном int, а лучше используй вообще отдельные переменные.
2) Функция не вызывается до тех пор, пока ты сам её не вызовешь. Если ты крутишь её в цикле с usleep() — она вызывается с той задержкой, которую ты ей прописал. Если это функция loop() в Arduino — она вызывается через единицы такт после окончания предыдущего исполнения (т.е. фактически сразу). Если это onevent-обработчик таймера — то с установленной частотой, но не чаще, чем приложение будет получать время от планировщика ОС. Если обработчик прерывания — то с той частотой, с которой прерывание приходит. Короче, мало данных.
makise_homura
+2
2) Функция не вызывается до тех пор, пока ты сам её не вызовешь. Если ты крутишь её в цикле с usleep() — она вызывается с той задержкой, которую ты ей прописал. Если это функция loop() в Arduino — она вызывается через единицы такт после окончания предыдущего исполнения (т.е. фактически сразу). Если это onevent-обработчик таймера — то с установленной частотой, но не чаще, чем приложение будет получать время от планировщика ОС. Если обработчик прерывания — то с той частотой, с которой прерывание приходит. Короче, мало данных.

Это еще не учитывая возможные задержки из-за лагов…
Sasha-Flyer
0
Естественно. Тот же usleep() даст задержку между вызовами (т.е. ret-call), задержка самих вызовов (call-call) — это через таймеры только. Да и между выходом и повторным взводом таймера (если он не повторный) может что-нибудь зашедулиться, прерывание прилететь и т.п.
makise_homura
0
А еще в нынешней РС-архитектуре есть такие штуки как SMM и intel-IME/AMD-PSP, благодаря которым мы можем получить внезапный лаг даже в программе на чистом ассемблере, с запрещенными прерываниями, и запущенной без оси.
KerHarrad
0
Ну SMM в принципе отключается (для этого BIOS не должен устанавливать эти обработчики, емнип; если мы работаем без операционки, то вполне возможно, что у нас и BIOS либо определённым образом настроен, либо вообще свой). IME, насколько я знаю, фишка чипсета (т.е. физически это отдельный процессор, код которого выполняется на нём, а не на основном процессоре). Ну и если уж мы заговорили об этом, то ещё есть возможность получить лаги «в программе на чистом ассемблере, с запрещенными прерываниями, и запущенной без оси», например, под гипервизором или под бинарным транслятором (Crusoe, Эльбрус).
makise_homura
0
Вообще по сути задача то простая — за 0.7 секунд переменная должна измениться с 0 до 7 и обратно с шагом в 1 каждую 0.1 секунду. Но подробности реализации крайне муторные и непонятно зачем оно вообще.
Sasha-Flyer
0
По сути в таком виде, в каком описал это я сейчас, на питоне это буквально делается в пару строчек. Но на С со всеми этими мелкими деталями, строчек будет сотни…
Sasha-Flyer
0
Не, больше. Там ведь счёт вверх/вниз, единицами/тройками, обнуление, контроль границ. Тоже несложно конечно, но строчки набегают.
MexoOne
0
Тоже несложно конечно, но строчки набегают.

if up and i< 7: i++
elif !up and i > 0: i--
if zero: i = 0

офигеть как много строчек.
Sasha-Flyer
0
а, еще есть step, который увеличивает на 1 если Фалс, или на 3 если Тру, но тогда вот так:
if up and i < 7: i = i + 1 + step * 2
elif !up and i > 0: i = i - 1 - step * 2
if i > 7: i = 7
if i < 0 or zero: i = 0

всё, задача решена. В Питоне bool автоматически преобразуется в 0 или 1 в математических выражениях.
Sasha-Flyer Изменён автором
0
А не ты ли орал как потерпевший, что унарные операции непонятны, и вообще зло? и что это у тебя? i++, i--
Переобуваемся в прыжке, или просветление снизошло?
Спойлер
KerHarrad
0
Почитай коммент выше и успокойся. Там код полностью соответствует требованиям.
Sasha-Flyer
0
Нихрена он не соответствует, ибо цикла нет.

Вот корректный код
pastebin.com/raw/GzHKsAVF

Спойлер
KerHarrad Изменён автором
0
бля, хочу вставить свой код, и сообщение не отправляется, красный аллерт вылезает.
Sasha-Flyer
0
Ага, а pastebin.com для лохов, да?
KerHarrad
0
Кароче. У тебя нет слипа. Пытался код прямо сюда вставить, но табун аллертит, что сообщение отправить невозможно. Впервый раз сталкиваюсь с такой фигней… в общем вот pastebin.com/raw/u5AMrh1k
Sasha-Flyer
0
Какой же мрак… 4 переменных вместо двух. многоэтажный if…

У тебя нет слипа

У меня printf там для примера вметсто слипа. И даже с принтом и слипом С-шный код короче и понятней выходит.
KerHarrad
0
4 переменных вместо двух. многоэтажный if…

Читай документацию. Функция должна принимать 4 переменные.
Sasha-Flyer
0
Какую документацию, совсем поехал кукухой? Это же твоя собственная func. А если ты про исходное задание от топикстартера, то вообще ничего похожего у тебя, да и мы кагбэ не про него в этой ветке. Твои же слова
Вообще по сути задача то простая — за 0.7 секунд переменная должна измениться с 0 до 7 и обратно с шагом в 1 каждую 0.1 секунду.

Или память как у золотой рыбки?
KerHarrad
0
А чем отличается моё сокращенное описание задачи от той задачи, что в шапке поста?
Sasha-Flyer
0
Эм-м… всем? Ты взял с потолка какой-то частный случай, посчитать туда-сюда от 0 до 7, радостно подорвался доказывать, как это здорово делается на питоне, и в итоге газифицировал лужу наркоманским кодом.

В общем давно понятно, что с тобой спорить — что с гобулем в шахматы играть. Просто знаешь — понтуйся в общих темах. Не надо вредить там, где слаборазбирающийся по-видимому человек попросил помочь по конкретному вопросу. Вот он обчитается твоей ереси, и сделает не так что нибуть у себя. Тебе же пятно в карму =)
KerHarrad
0
То есть я не могу возникать по тому поводу, что до сих пор есть люди, которые требуют ужимать все данные в невозможные 1 бит?
Sasha-Flyer
0
Саня, я тебе уже говорил… возникать в темах по кодингу будешь, когда напишешь хоть одну программу за которую отвечаешь деньгами/репутацией. Ну или хотя бы, когда знаний наберешь побольше чем из книжки «питон за 21 день для чайников».

Засим я спать.

Спойлер
KerHarrad Изменён автором
0
То есть ты хочешь, чтобы я постоянно сидел и зубрил теорию, и нифига не делал реальный код? Найс совет, но я воздержусь пожалуй. Лучше писать реальные программы, хоть и не очень оптимизированные, чем всю жизнь зубрить теорию и нихуя не сделать за всю жизнь.
Sasha-Flyer
0
О великий Интел, пожалуйста, почини уязвимости в своих процессорах так, чтоб производительность упала до уровня 80486, может хоть так говнокодеры одумаются и я смогу нормально пользоваться компом
andreymal
+2
80486 это что за числа вообще?
Sasha-Flyer
-1
— 80486 = 486 (почти как москвич 401) процессор интелла.
DxD2
0
Увидев этот коммент, я понял, насколько я стар, всё-таки… К счастью, на табуне я явно не один такой =)
(Эх, где те дни за «Правцем-16» с 8088 процом, когда 486 казался той ещё годнотой...)
makise_homura
0
— Ну не, спасибо, я те времена ещё помню…
DxD2
0
Удваиваю.
KerHarrad
0
Надеюсь ты понимаешь, что этим каментом ты только что пробил днище днища? И после этого все твои попытки умничать стоят чуть менее чем нихрена? Воинствующий чсв еще туда-сюда… но воинствующий чсв-невежда, это уже, простите, финиш. Дай Бог, чтоб твои говнохелловорды никогда не выходили за пределы твоего компа. Говнокода и так в мире терабайты.
KerHarrad Изменён автором
0
Ну здравое зерно в его словах есть — действительно, во многих случаях лучше сделать плохонький рабочий код, чем идеальный, но так и не дописанный.

В конце концов, большая часть коммерческих разработок — это именно плохой код, но выпущенный и приносящий пользу.
NTFS
+1
Ну да, хуяк-хуяк и в продакшен к сожалению норма нынче.

Ладно еще скорость/память не оптимизировать… но такие вот саши-фраеры и на безопасность забивают болт. А потом имеем кучу багов, утечек, взломов, вирусных эпидемий и прочей фигни…

Или такая вот прелесть, свежачок habr.com/ru/post/452238/
Небось такой вот Саша (понтов дохрена, мозгов нихрена) полез сервак покрутить…
KerHarrad Изменён автором
0
Резервные копии нужно делать всегда (у самого треть VM примерно еще не защищены, гы). В конце концов, админ мог просто сесть задницей на сервер.

Еще раз, коротко — если бы весь софт делался только профессионалами, медленно, вдумчиво и детально — софта было бы очень мало, и стоил бы он конских средств.
NTFS
0
Cейчас тоже можно купить софт, стоящий конских средств, и получить с ним ниибических проблем ;)

Я не предлагаю вылизывать все на ассемблере до последнего бита, но некоторая культура кодинга быть должна.
KerHarrad Изменён автором
0
Но реже. В разы.
В тех же серверных версиях Windows — всё куда чище и надежней, чем в Home/Pro. Но и стоят они не 7К.
NTFS
0
Ага, а потом в эту чистую и надежную винду приходит вирус петя ;)
KerHarrad
0
Информация вообще уязвима. Это дом если построили — его только землетрясение, взрыв или ракета обрушит. А сервера могут лечь из-за одного неправильного бита.
Специфика отрасли — всё легко поднимается и легко разрушается.
NTFS
0
А сервера могут лечь из-за одного неправильного бита.

Сделанные хуяк-хуяк из говна и палок — могут. В реально критических местах есть многократное дублирование, параллельное выполнение одной задачи с сверкой результатов и переключением на другой сервер в случае расхождения, и много еще чего.
KerHarrad
0
Тут сильно вопрос задачи. Если сервер управляет БЧ-2 авианосца — там всё это нужно и полезно. Если сервер держит сайт для продажи резиновых елдаков и базу для них же — то проще поставить говнокод, а в случае проблем просто на часок остановить продажу и вернуть копию/поставить другой сервер.
NTFS
0
проще поставить говнокод

Потом через этот говнокод сливают БД с ПД покупателей, и выкладывают в общий доступ — «Смотрите, Вася Пупкин резиновые елдаки покупает! И кстати номер его кредитки 123456»
KerHarrad
0
Такое тоже случается.
Кстати, не так давно снова зеленый банк данные своих клиентов упустил, даже в газетах писали.
Не только покупатели елдаков, но даже мирные клиенты банка под угрозой.
Такова жизнь.
NTFS
0
Такова жизнь

И вместо того чтоб хоть немного ее улучшить, мы смиримся и будем смотреть как плодятся новые поколения говнокодеров…
KerHarrad
0
мы смиримся и будем

… спокойно зарабатывать деньги, делая хороший код.

О мире есть кому и без нас позаботиться.
NTFS
0
Мой сервак просто бракует пакет данных, если он не подходят под определенные шаблоны, которые клиент может прислать на сервер. а внутри этих шаблонов ничего выдумать нельзя, что могло бы положить серв.
Sasha-Flyer
0
И ты гарантируешь, что твои шаблоны не пропустят скажем переполнение буфера? Или инъекцию в БД? С твоими познаниями в кодинге — сильно сомневаюсь.
KerHarrad
0
Или инъекцию в БД

В моей БД инъекцию ты никак не сможешь сделать, потому что это обычный текстовый файлик, который Питон считывает как json-файл. Мне невыгодно поднимать БД. Только если пользователей будет 1к+ — тогда выгодно. А до тех пор — текстовый файлик экономнее по производительности будет.
Sasha-Flyer Изменён автором
0
текстовый файлик экономнее по производительности будет.

А как решаешь вопросы параллельного доступа к файлу и конкурирующих запросов к одному участку файла?
NTFS
0
У меня сервер асинхронный, я юзаю библиотеку asyncio — офигенная и очень простая вещь. Между await командами происходит и открытие, и закрытие файла. Проблема с паралельным доступом возникнет только если один await передаст контроль асинхронному контроллеру и не закроет файл, и в итоге асинхронный контроллер сможет перейти к другому await, который попытается получить доступ к уже открытому файлу и потерпит неудачу. Но я позаботился о том, чтобы такого не происходило.
Sasha-Flyer
0
Так да, годно, для небольшого проекта норм.
NTFS
0
Но я позаботился о том, чтобы такого не происходило.

С этого места подробнее
KerHarrad
0
Что тут подробнее? Между двумя await-тами код гарантированно выполнится полностью (если не будет исключений, но их я тоже обрабатываю с обязательным закрытием файла). соответственно, если между двумя await-строчками файл открывается, то до конца второй await-строчки этот же файл закроется. Точнее в Питоне его даже самому закрывать не надо. После выхода из блока with open(«data.json») as file файл сам закроется — такова магия Питона.
Sasha-Flyer Изменён автором
0
А если в твой json я передам скажем имя юзера из пары миллионов букв Ъ? )
KerHarrad Изменён автором
0
В игре ты не сможешь ввести строчку больше 10, а вручную запушить свой json-файл ты тоже не сможешь, ибо не знаешь моего ключа шифрования, и даже если узнаешь, и если мой сервер не будет браковать длину строчки больше 10, то этот await-блок штатно всё запишет за какое-то время, и только после того, как запишет, передаст управление асинхронному контроллеру.
Sasha-Flyer Изменён автором
0
ибо не знаешь моего ключа шифрования
Из файла игры всё отлично вытаскивается
штатно всё запишет
Куда?
andreymal
0
Куда?

В файл. Ну а если не хватит места на жестком диске — тогда я просто вставлю в код проверку на длину строки.
Из файла игры всё отлично вытаскивается

В файлак же не хранится ключ. Он хранится максимум в оперативке в момент создания сокета, когда сервер отправляет клиенту сертификат. Затем возможно помещается в кеш.
Sasha-Flyer
0
тогда я просто вставлю в код
Не вставишь, потому что к тому времени комп навернётся к херам от отсутствия свободного места)

Он хранится максимум в оперативке в момент создания сокета, когда сервер отправляет клиенту сертификат.
То же самое сделает и поддельный клиент от хацкера тоже, да и всё
andreymal
0
Ну че я могу тут сказать, просто не буду принимать от пользователя json-файлы, которые весят слишком много. А не json и не int объекты бракуются сразу же.
Sasha-Flyer
0
Ну че я могу тут сказать, просто не буду принимать от пользователя json-файлы, которые весят слишком много.


То есть до сего момента, такой файл послать было можно? Вот тебе и цель DDoS для твоего сервака. И если бы не эта тема — она бы так и осталась.
KerHarrad Изменён автором
0
Так я особо и не раздавал игру еще никому. Максимум 3 человекам показал, чтобы потестить, и всё. У меня пока много чего не настроено, что мог бы ввести пользователь. Например сейчас рассчитано на то, что юзер может создать максимум 9 колод, однако сервер бы записывал сколько угодно новых колод. Все эти ограничения я буду вводить тогда, когда буду уже в открытую распространять игру.
Sasha-Flyer
0
В корне неверный подход. Уж что-что, а меры безопасности должны закладываться в одну из первых очередей, на этапе проектирования, а не прикручиваться потом сбоку на говно и изоленту, ибо в процессе такого прикручивания вероятность пропустить дыру стремится к единице.
KerHarrad Изменён автором
0
Очевидно, что любую базу можно переполнить либо большими данными, либо большим количеством небольших данных (либо и то, и другое). И оба этих момента нужно обязально учитывать.
Sasha-Flyer
0
Ну-ну, учитывай… )
А как у тебя обновление клиента будет реализовано?
KerHarrad
0
А как Юнити это в принципе реализует?)
Sasha-Flyer
0
Я сомневаюсь что это в юнити есть, тут тебе самому придется.

И кстати, как от MitM защищаешься?
KerHarrad Изменён автором
0
json-файл разбираемый питоном? Сомневаюсь что это быстрее SQLite при любом количестве пользователей.
KerHarrad
+1
ничего выдумать нельзя
Сильное заявление
andreymal
+2
Но как раз таки на безопасность я болт не забиваю. Можешь у Андреймала спросить.
Sasha-Flyer
0
Ну давай, дам тебе возможность газифицировать еще пару луж. Ты там что-то сетевое вроде лепил? Ну и как у тебя безопасность твоего сетевого протокола реализована?
KerHarrad
0
Сокет между клиентом и сервером завёрнут в tls 1.0 шифрование. Пока-что у меня сертификат самописный, и я знаю, что это плохо. Но у моего сервера нет и не будет домена, а бесплатный сертификат для айпишника LetsEncrypt не выдают. Сертификаты для айпишника стоят очень дорого, плюс айпишник должен быть прописан в WHOIS.
tls 1.2 пока-что не работает на Юнити, и разработчики на это жалуются уже 2 года как — forum.unity.com/threads/https-tls-1-2-support.504851/
Сайты по проверки безопасности поставили моему серверу оценку B.
Sasha-Flyer
0
tls 1.2 пока-что не работает на Юнити,

Песец мрак… 2к19 год…

На клиенте как у тебя защищается ввод пароля, если на машине потенциально кейлоггер? или нечто любящее полазать по чужой памяти через readprocessmemory?
KerHarrad
0
Я использую стандартные Юнитивские UI-функции, которые предназначены для ввода паролей. Как там Юнити у себя это шифрует — я не знаю, но по сети пароль точно передаётся в зашифрованном виде.
Песец мрак… 2к19 год…

А это уже не ко мне претензии, а к разработчикам Юнити, которые не обновляют поддержку .NET до новых версий уже очень давно.
Sasha-Flyer
0
Ну и пароли пользователей хранятся в виде солёного хеша, разумеется.
Sasha-Flyer
0
— Как ни странно, но соглашусь. Лучше сочетать практику с теорией, чем зубрить теорию, а потом выяснить, что с практикой она общего имеет чуть меньше, чем ничего.
DxD2
0
Ключевое слово тут «сочетать». Но это не случай г-на Фраера, который не зная теорию от слова совсем, не является и практиком. Склепать что-то уровня хелловорд на юнити — это не практика. Тем более как выше выяснилось, поциэнт понятия не имеет как это внутри все работает, видимо лепит готовые куски просто. Опять же выше ему сходу дыру нашли, через которую заДДоСить можно было бы его сервак. И такие вот личности при этом изрекают на форумах комментарии «космического масштаба, и космической же глупости»
tabun.everypony.ru/blog/computers/188170.html#comment12910062
и это печалит.
KerHarrad
0
Мой сервак ты не задудосишь, потому что ты даже не знаешь его айпишник и открытый порт. (И да, порт у меня открыт ровно один для серва. Больше я ничего не открывал). А когда серв будет открыт — я бы это в любом случае исправил бы. Ты говориль про слишком очевидные вещи.
Sasha-Flyer
0
— Вся штука в том, что почти все кто начинают что-то делать на Unity, берут готовые куски. До того момента когда имеющегося будет не хватать или придётся что-то докупать — пройдёт немало времени. А уж до того, чтобы модифицировать что-то внутри — и того больше. Поэтому да, в этом плане именно практика с теорией на примерах данных в самом Unity. В целом там уже есть готовые и бесплатные проекты которые можно разобрать по коду и понять как они работают. Ничего печального в этом нет. Лучше так чем вообще никак.
Как по мне конечно лучше тыкать UE4 и там уже определяться с ролью в проекте или делать проекта посредством блюпринтов и пр. А если уж и вдаваться в код, то уже понимая зачем и что для этого стоит подучить попутно. Опять же практика и теория, но своевременная. Вообще в целом теоретические знания которые обгоняют текущую задачу чаще всего или теряют свежесть или просто вызывают недоумение. А вот когда что-то не выходит и нужно решение, вот тогда и идёт поиск знания.
Насчёт дыры — ну так на то и есть тестеры и прочее. По сути делая проект в одну мордашку всегда столкнёшься с моментом, который или упущен или просто уже стал привычным рычагом — в стиле «Включить свет прыгая на пороге пока не замкнёт контакт, параллельно тыкая в кнопку и опираясь на косяк, чтобы выключатель не выпал». Для разраба это привычный ритуал, а вот пользователь или кто-то со стороны посчитает это стрёмным.
DxD2
0
По твоему определению тогда и Винда — говнокод, потому что в ней куча уязвимостей и оперативки много жрет.
Sasha-Flyer
0
Винда — говнокод

Эталон говнокода из палаты мер и весов.
KerHarrad
0
Винда — говнокод

Говнокод, но полезный, годный говнокод. Она позволила миллиарду людей стать пользователями ПК.
NTFS
0
Вот и я про то. Возможно даже поней бы не было, если бы не Винда.
Sasha-Flyer
0
Поней скорее всего лепили на Маках.
NTFS
0
Она позволила миллиарду людей стать пользователями ПК.

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

Я вот например не умею рисовать. Я могу считаться «пользователем карандаша», намалевать там что-то схематичное. Но я не лезу на форумы художников и не умничаю там. А вот в программировании это почему-то норма, написав кривой «хелловорд» — резко начать считать себя умнее Торвальдса, Гейтса и Кармака вместе взятых.
KerHarrad
0
А вот в программировании это почему-то норма, написав кривой «хелловорд» — резко начать считать себя умнее Торвальдса, Гейтса и Кармака вместе взятых.

Так в любой отрасли, от схемотехники до туризма.
Как шутят на профильных сайтах «еще никто, кто спрашивал про управлении 220В с Ардуино, не возвращался в тему».
NTFS
+1
Я допустил такую ошибку, потому что я каждый день кодю и на питоне, и на сишарпе, поэтому иногда меня клинит, и я реально на Питоне пишу i++, а на сишарпе пытаюсь умножить Правду на Число.
Sasha-Flyer
0
То что тебя клинит по жизни, никто и не сомневался. Ты орал что унарки зло в принципе, не важно, в питоне, шарпе или хоть в брейнфаке. Мне что, тот пост с пруфом поднять?
Спойлер
KerHarrad
-1
На верилоге это вообще одна строчка =) Та, которая always. Ну хорошо, две, если мы считаем assign для w_step, так как он тоже синтезируется в один целл:
module cnt
(
  input  wire mode,
  input  wire en,
  input  wire rst,
  input  wire step,
  input  wire clk,   // 10 Hz
  output wire [3:0] cnt
);
  reg [3:0] r_cnt;
  initial r_cnt = 3'b000;
  assign cnt = r_cnt;

  wire [3:0] w_step;
  assign w_step = step ? 3'b010 : 3'b001;

  always @(posedge clk)	r_cnt <= rst ? 3'b000 : en ? mode ? r_cnt - w_step : r_cnt + w_step : r_cnt;
  
endmodule
makise_homura
+1
Ах лол, у него ж счётчик с отлупом на переполнение.
Тогда придётся сложнее делать:
module cnt
(
  input  wire mode,
  input  wire en,
  input  wire rst,
  input  wire step,
  input  wire clk,   // 10 Hz
  output wire [3:0] cnt
);
  reg [2:0] r_cnt;
  initial r_cnt = 3'b000;
  assign cnt = {1'b0,r_cnt};

  wire [2:0] w_step;
  assign w_step = step ? 3'b010 : 3'b001;

  wire [3:0] w_down, w_up;
  assign w_down = r_cnt - w_step;
  assign w_up   = r_cnt + w_step;

  always @(posedge clk)	r_cnt <= rst ? 3'b000 : en ? mode ? w_down[3] ? r_cnt : w_down[2:0] : w_up[3] ? r_cnt : w_up[2:0] : r_cnt;
  
endmodule
А ещё я заметил забавную вещь: зачем ему четырёхразрядный вывод из регистра, который никогда не первысит значения 7? Выкину-ка я лишний бит. И плевать, что теперь синтезируется два сумматора, а не один. Всё равно под эту схему использовано всего 9 ALUT и 3 регистра (ну да, против 6 и 4 в схеме без переполнения; получается, дополнительный сумматор занял три ALUT — вполне норм для трёхбитной суммы, зато освободился лишний «регистр», точнее триггер из r_cnt).
makise_homura
+1
Для переменной в 4 бита покури про битовые поля, хотя бы тут
www.c-cpp.ru/books/bitovye-polya

Хотя я не понимаю зачем это в обычной задаче, если ты только не под что-то типа PIC12 пишешь, и то…

За 10 герц уже выше пояснили.
KerHarrad
+1
Пришёл почитать про C, а навернул питона от флаера. Найс.
Twogush
+1
Питон написан на С++, который написан на С, а Флаер написан на Питоне. Всё взаимосвязано!
Sasha-Flyer Изменён автором
-1
Вообще-то Питон таки написан на Classic C…
Mainframe
+1
*почитал комменты*
Табун вдруг превратился в Хабр?
Mainframe
+1
А Хабр превратился в Табун habr.com/ru/post/384583/
Sasha-Flyer
0
Концентрация разработчиков тут всегда была высокой.
NTFS
0
Только вот контента от этой разработки почти не чувствуется.
Sasha-Flyer
0
NTFS
0
По сути это чуть ли не единственная игра с реально большим кодом. Ибо все эти файтинги, аркады и бродилки делались на уже готовых графических движках, где кодить не нужно вообще.
Sasha-Flyer
0
кодить не нужно вообще
Сильное заявление
andreymal
0
я серьёзно. Во всех этих аркадах просто ставишь препятствия, налепляешь на них спрайты, меняешь параметры гравитации, силы прыжка, и несколько других условий — готово.
Sasha-Flyer
0
Все верно, таким как Саня — кодить ненужно вообще.
Спойлер
KerHarrad
0
реально большим кодом

Не очень. Ядро игры всего 20 тыс строк, в библиотеках самописных еще десяток, файлы сценариев всех кампаний — 15 тыс строк.
Коммерческие проекты у меня до 50 тыс строк достигают, где много сложной, трудноформализуемой логики обработки данных. И половина это таки унылые проверки, правильные ли это данные или хлам пришел.
NTFS
0
НУ это довольно много. А ты даже отображение спрайтов сам кодишь, используя API directX, или все-таки пользуешься какими-то готовыми фреймворками, которые отображают твои спрайты?
Sasha-Flyer
0
Там же указано — портированный HGE. Движок графики есть, движок игры — самодельный.
PS: DirectX очень утомительный, если уж идти на низкий уровень, то OpenGL.
NTFS Изменён автором
0
А у тебя много там абстрактных классов и функций, которые выполняют какие-то мелки вещи, которые выполнять надо больше одного раза? Просто сам я по сути новичек в этом деле и пока не научился вовремя распознавать, где лучше писать сплошной код, а что лучше выносить в функцию или даже в целый отдельный класс…
Sasha-Flyer
0
Всё, что можно вынести — нужно выносить. Потому что сначала оставляешь «да ладно, три строки никому не мешают», а потому у тебя куча строк, непонятно что делающих.
Грубо, функция или класс — это законченный кусок кода, делающий какую-то одну задачу и ничего, кроме неё.
NTFS
0
НУ это довольно много.
Сильное заявление
andreymal
0
Пишите на D.
Mainframe Изменён автором
0
Он же умер немного, не?
NTFS
0
Александреска с тобой поспорит.
Twogush
0
Йа человек простой, смотрю списки вакансий по C# — море, смотрю вакансии по Delphi — мало, смотрю вакансии по D — не нахожу.
PS: Мне D нравится, но толку от него немного, за пределами академическо-исследовательской среды.
NTFS Изменён автором
+1
Издеваешься? Он как C++, только порог вхождения в сто раз ниже и обращение с ним понятнее. Мне вот с ним легко, как никогда.
Mainframe
0
D я щупал… был бы хорош, если б не прикрученный сборщик мусора. А открутив его — теряем почти все ништяки.
KerHarrad
0
Прикрученный — это какой? Я видел один, но его можно использовать напрямую.
Mainframe
0
Издеваешься?

Пример вакансии?
NTFS
+1
Я не про вакансии, их правда мало. Я про:
толку от него немного, за пределами академическо-исследовательской среды
Mainframe
0
их правда мало.

Я бы сказал, их почти нет. А это означает, что никто ничего на нём не пишет за пределами своих личных забав.
NTFS
+1
Какая разница, если сам язык гениален, с богатой инфраструктурой и на нём можно написать что угодно?
Mainframe
0
нём можно написать что угодно

Но ведь не пишут. А почему?
NTFS
0
Потому что дурачки?)
andreymal
0
Он как C++, только порог вхождения в сто раз ниже и обращение с ним понятнее
Вместо «Он» можно подставить абсолютно любой императивный неэзотерический язык (кроме разве что Rust, там порог вхождения не в сто, а в пятьдесят раз ниже из-за выпендрёжной модели памяти)
andreymal
0
Ну, D действительно С++-подобный процентов на 80. Потому что он задумывался не как заменитель, а именно как язык из Сишного семейства.
Mainframe
0
Да нет, нифига. Обновляется, жив-здоров.
Mainframe
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Скрыто Показать