Задать вопрос
  • Какой алгоритм текстового калькулятора лучше?

    tumbler
    @tumbler
    бекенд-разработчик на python
    Добро пожаловать в мир конструирования компиляторов :)
    Если кратко и просто, то основные стадии работы компилятора такие:
    1. Лексический анализ (разделение строки на лексемы - числа и операции)
    2. Синтаксический анализ (скобки, приоритет операций - в общем, перевод потока лексем во внутреннее представление
    3. Дальше уже не компилятор а интерпретатор начинается: вычисление значений выражений.

    Так вот, первый вариант - это в минимальном приближении "грамотный" интерпретатор, второй вариант - строковый "костыль", который тяжело отлаживать, поддерживать и расширять.
    Есть и другие подходящие альтернативы: воспользоваться существующими библиотеками для DSL (примером которых является задача вычисления математических выражений), либо написать свою грамматику и воспользоваться готовыми решениями лексического и синтаксического анализа.
    Ответ написан
    Комментировать
  • Как поменять цвет заднего фона у активного TabItem?

    cyber_roach
    @cyber_roach
    UX дизайнер INEDIapps
    Все логично.
    Вы же не поменяли цвет состояний (over select и пр...)

    WPF не про смену цвета элемента через базовые свойства элемента.
    WPF это про стили и язык разметки интерфейса (XAML)

    В базовом виде стили выглядят как-то так:
    (можете просто скопировать всё на любую форму в проекте и заработает)

    <Grid>
            <Grid.Resources>
                <ResourceDictionary>
                    <Style  TargetType="{x:Type TabItem}">
                        <Setter Property="OverridesDefaultStyle" Value="True"/>
                        <Setter Property="SnapsToDevicePixels" Value="True"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Background" Value="#FF7C0000"/>
                        <Setter Property="BorderBrush" Value="Black"/>
                        <Setter Property="Height" Value="32"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type TabItem}">
                                    <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Margin="0,0,-1,0">
                                        <Grid >
                                            <Rectangle x:Name="interactive" Opacity="0.3"/>
                                            <ContentPresenter HorizontalAlignment="Center" Margin="12,2,12,2" x:Name="ContentSite" VerticalAlignment="Center" RecognizesAccessKey="True" ContentSource="Header" />
                                        </Grid>
                                    </Border>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsSelected" Value="True">
                                            <Setter Property="Panel.ZIndex" Value="100"/>
                                            <Setter Property="Background" Value="Black" />
                                        </Trigger>
                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="IsMouseOver" Value="True"/>
                                                <Condition Property="Selector.IsSelected" Value="False"/>
                                            </MultiTrigger.Conditions>
                                            <Setter Property="Fill" Value="Black" TargetName="interactive"/>
                                        </MultiTrigger>
                                        <Trigger Property="IsEnabled" Value="False">
                                            <Setter Property="Opacity" Value="0.5" TargetName="interactive" />
                                            <Setter Property="Fill" Value="Black" TargetName="interactive" />
                                            <Setter Property="Background" Value="White"/>
                                            <Setter Property="Foreground" Value="DarkGray"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                    <Style TargetType="{x:Type TabControl}">
                        <Setter Property="Background" Value="Black"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type TabControl}">
                                    <Grid KeyboardNavigation.TabNavigation="Local">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                            <RowDefinition Height="*"/>
                                        </Grid.RowDefinitions>
                                        <TabPanel Grid.Row="0" IsItemsHost="True" Panel.ZIndex="1" KeyboardNavigation.TabIndex="1"/>
                                        <Border Padding="12" Background="{TemplateBinding Background}"
                                                    Grid.Row="1"  KeyboardNavigation.DirectionalNavigation="Contained" KeyboardNavigation.TabNavigation="Local" KeyboardNavigation.TabIndex="2">
                                            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                                        </Border>
                                    </Grid>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ResourceDictionary>
            </Grid.Resources>
            
            <TabControl Margin="10" >
                <TabItem Header="Файловая система">
                        <TextBlock>Вкладка 1</TextBlock>
                </TabItem>
                <TabItem Header="Еще одна система">
                        <TextBlock> Вкладка 2</TextBlock>
                </TabItem>
                <TabItem Header="Мегасистема">
                        <TextBlock> Вкладка 3</TextBlock>
                </TabItem>
                <TabItem Header="Суперсистема" IsEnabled="False">
                        <TextBlock> Вкладка в дисабле</TextBlock>
                </TabItem>
            </TabControl>
        </Grid>


    В данном примере я определил стили внутри Grid
    Это значит все таб-контролы внутри этого грида будут использовать этот внешний вид.
    Можно так же определить стиль на уровне окна или на уровне приложения (в App.xaml)
    Можно именовать стили (без имени = по умолчанию)

    Выглядит живьем все вот так:
    cuzfqh6sokmhzyh2opaumtxfpa8.png

    Соответственно после того как стиль есть, уже можно переопределить в нем базовые свойства как надо через Setter'ы

    Данная строка задает переопределение всех свойств базового стиля (ну или можно их все вручную переписать):
    <Setter Property="OverridesDefaultStyle" Value="True"/>


    А это чтобы по пикселям выровнять:
    <Setter Property="SnapsToDevicePixels" Value="True"/>


    Таким способом можно связывать отдельный компонент внутри стиля с базовым свойством:
    Background="{TemplateBinding Background}"

    А этот компонент я добавил как пример :
    <Rectangle x:Name="interactive" Opacity="0.3"/>
    Показать что интерактивные состояния можно как угодно реализовывать и что структура компонента может быть различной. (где -то у загажнике у меня валяется Tab-Control в виде круга (как у железного человека прям с радиальной расстановкой tabItem'ов)

    с помощью Trigger'ов можно делать ракцию изменений свойств.
    Также специально сделал Овер мыши через мультитриггер, для понимания как такие использовать.
    Можно сюда еще анимации добавлять.
    А можно вообще без тригеров через VisualState добавлять интерактив, принципы схожи.

    Грамотное применение стилей дает возможность не перегружать верстку страниц, визуал, отсупы, сетка все автоматом подтаскивается, что видно в самом конце кода, сами табы оформлены по минималу
    Ответ написан
  • Можно ли в Windows Form разместить один элемент в собственном потоке?

    petermzg
    @petermzg
    Самый лучший программист
    Вычисления отдельно, анимация отдельно.
    1. Показали контрол с анимацией в UI потоке
    2. Запустили поток с вычислениями.
    3. Вычисления завершились, сообщили в UI поток.
    4. Скрыли/удалили анимацию
    Ответ написан
    Комментировать
  • Что с точностью float?

    Griboks
    @Griboks Куратор тега C#
    1. Исходные данные вы вводили с точностью до сотых. Ответ получили верный с точностью до сотых. Никаких проблем нет. Пример некорректен.
    2. Точность (количество знаков) фиксирована. Проблема, как вам уже написали, в системе счисления. Если вам надо считать в десятичной системе, используйте специализированные для этого типы. Компьютер вычисляет float без ошибок. Ошибки возникают при кодировании результата в "читаемый" вид и наоборот.
    Ответ написан
    Комментировать
  • Почему неправильно происходит сравнение?

    WNeZRoS
    @WNeZRoS
    Проблема в логике if'a. Если его сократить получается так:
    if (buf != str || buf != "1" || buf != "3")

    Подставим 1:
    if ("1" != "1" || "1" != "1" || "1" != "2")
    // считаем
    if (false || false || true)
    // итог
    if (true)


    В целом, этот if бесполезен, его функцию замечательно заменяет switch:
    switch (buf)
    {
       case "1":
           Console.WriteLine("ОК");
           break;
       case "2":
           Console.WriteLine("ОК");
           break;
       default:
          Console.WriteLine("\nНе число или дробное число");
          break;
    }
    Ответ написан
    1 комментарий
  • Есть ли open sourse Документооборот?

    @d-stream
    Готовые решения - не подаю, но...
    Нужно сделать документооборот для организации собственными силами
    А силы есть?

    Ну а если не такого то подскажите на каком языке лучше писать
    а где сила?

    Предлагаю начать с простого: на простом русском языке расписать подробное техзадание/требования к СДО на предприятии и схему внедрения. После этого уже думать дальше или же останавливаться.
    Ответ написан
    Комментировать
  • Есть ли open sourse Документооборот?

    @Kirill-Gorelov
    С ума с IT
    Система электронного документооборота для допиливания

    Писать лучше на том, на чем удобнее. Я бы стал писать на python (django)
    А мой коллега, на php(symphony)

    А ты можешь писать на С, если тебе так удобнее.
    Ответ написан
    Комментировать
  • Насколько адекватно требовать домашнего развития от разработчиков?

    Kalombyr
    @Kalombyr
    По-моему тут всё зависит от условий в общем и целом.

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

    Так вот, у меня был свободный график + возможность работы удалённо. По-моему в данном случае вопросы вполне справедливы с учётом таких условий труда.

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

    Так же, по-моему, зависит от того, что нанимателю вообще нужно. Одно дело, когда нанимают на поддержку и доработку уже существующей стабильной системы и им нужен обычный среднестатистический разработчик/без лишних амбиций и проблем, другое дело на новый проект.
    Ведь сидя на одном и том же, выполняя одни и те же задачи будет только стагнация.
    Ответ написан
    Комментировать
  • Оптимизировать код или как выделить всю вычислительную мощность пк на его выполнение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Первое, что бросается в глаза - это многократное копирование массива. Представьте, что при сортировке мы бы после каждых двух-трех перестановок делали бы полный дубликат массива. Это же ужас! И это слабое место, постоянное перевыделение памяти больших размеров.

    Второе, что тоже важно - это сложность O(N*N). В вашем случае это критично, потому что много элементов в исходном массиве.

    Предлагаю немного изменить алгоритм. Делаем одно прохождение, но немного увеличиваем потребление памяти, в которой храним интервалы. Таким образом, мы избавляемся от постоянного копирования массива, а также уменьшаем сложность примерно до O(N).

    И маленькая оптимизационная хитрость - поиск интервала происходит по индексу, то есть O(1). Нужно немного поразмыслить, чтобы до этого догадаться, но в целом всё просто.
    Код
    <?php
    $arr = [100,125,75,175,25,300,275,325,375];
    $step = 50;
    
    $b = []; //-1 - deny, 0 - not set, 1 - has interval
    $int = []; //intervals if necessary 
    $step2 = intdiv($step,2);
    $arr = array_values(array_filter($arr, function($v) use ($step2,&$b,&$int) {
        $i = intdiv($v,$step2);
        $mod = $v % $step2;
        $res = true;
        if (isset($b[$i])) {
            if ($b[$i] === -1) $res = false;
            elseif ($mod < $int[$i][0] or $mod > $int[$i][1]) $res = false;
        }
        $b[$i] = -1;
        $b[$i+1] = -1;
        $b[$i-1] = -1;
        if (!isset($b[$i+2])) {
            $b[$i+2] = 1;
            $int[$i+2] = [$mod,$step2];
        } elseif ($b[$i+2] === 1) {
            if ($int[$i+2][0] < $mod) {
                $int[$i+2][0] = $mod;
                if ($int[$i+2][0] >= $int[$i+2][1]) $b[$i+2] = -1;
            }
        }
        if (!isset($b[$i-2])) {
            $b[$i-2] = 1;
            $int[$i-2] = [0,$mod];
        } elseif ($b[$i-2] === 1) {
            if ($int[$i-2][1] > $mod) {
                $int[$i-2][1] = $mod;
                if ($int[$i-2][0] >= $int[$i-2][1]) $b[$i-2] = -1;
            }
        }
        return $res;
    }));
    
    var_dump($arr); // [100, 175, 25, 300, 375]
    ?>

    Переписав алгоритм на С++, получите дополнительно 50-кратное увеличение скорости.
    Ответ написан
    3 комментария
  • Как правильно выделить объект и класс в ООП?

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

    Но если начать с проектирования кода, то смотрите: класс Info это слишком общее название. У вас всё - info.

    Должен быть класс Driver который содержит информацию о водителе(если водитель не выделен в класс Person). Есть класс Bus, который знает про марку авто. Возможно, он будет содержать list of drivers - с инфой о том, кто обычно управляет этим авто, а может вам нужен driver - ссылка на один объект класса Driver, если нужно знать, кто управляет автобусом именно сейчас.
    Направление понятно?
    Ответ написан
  • Как скрыть конфиги в js веб-приложении?

    ArsenyMatytsyn
    @ArsenyMatytsyn
    Руководитель frontend направления, предприниматель
    Конфиги из морды можно спрятать только зашив их не в морду.
    Что, собсно, мешает использовать прослойку в виде одного файла php? Ты ему запрос, в нем запрос по данным (конфигу) к бд и на возврате ответ в json, к примеру.
    То же самое, я думаю, можно и в ноде провернуть, да и в принципе в любом бэке, который работает, как бэк, но пример с пыхой — это классика ассинхронных запросов =)
    .....из тех времен, когда смайлики мы писали именно так ↑
    Ответ написан
    2 комментария
  • Как предугадать рандом по тикам?

    FoggyFinder
    @FoggyFinder
    Если использовать конструктор по умолчанию класса Random, то в качестве зерна будет использоваться Environment.TickCount - время прошедшее с момента загрузки системы в миллисекундах.

    Для того, чтобы генерировать одну и ту-же последовательность есть отдельная перегрузка, которая принимает "зерно" - значение которое используется для выбора начального числа. Например, вы хотите использовать определенное время

    var ts = new TimeSpan(10, 10, 10);
    var rnd = new Random((int)ts.TotalMilliseconds);


    Таким образом будет генерироваться одна и та-же последовательность.

    for (int i = 0; i < 1; i++)
        Console.WriteLine("{0,4}", rnd.Next(50, 501)); // 265


    Еще можно заглянуть в исходники (Random.cs) и узнать реализацию чтобы "предсказание" было совсем точным :-)
    Ответ написан
    Комментировать
  • C# стоимость обработки исключений?

    GavriKos
    @GavriKos
    ГЕНЕРАЦИЯ исключений - не дорогая. Поэтому первый и второй куски кода +- сопоставимы по скорости.
    ОБРАБОТКА исключений - вот это уже затратно. Там идет разворот стека, всякое такое дерьмо... Для процессора - это именно ИСКЛЮЧИТЕЛЬНАЯ ситуация - ни о каком перфомансе там уже речи не идет - речь о сохранении работоспособности.
    Но сравнить - нельзя, потому что непонятно что там и как во втором фрагменте обрабатывается.
    Ответ написан
    Комментировать
  • C# модульная архитектура. Как получить доступ к стат. классу программы из плагина?

    @kttotto
    пофиг на чем писать
    Если плагину предоставляется апи приложения, вот и добавьте апи, через который будете отдавать плагину инфу своего статического класса.
    Либо плагин, при инициализации, должен иметь возможность получать извне набор параметров, через который возможно будет принять ваши опции.
    Ответ написан
    Комментировать
  • Можно-ли написать back-end на C# на Linux? Стоит-ли?

    petermzg
    @petermzg
    Самый лучший программист
    Можно. .Net Core позволяет это.
    Выполнение запроса за 5-10ms это достаточно быстро?
    Ответ написан
    4 комментария
  • Как хранить текстовые данные в приложении на C#?

    @John_Nash
    coder
    Должна быть возможность потом (вдруг понадобится) использовать класс отдельно от формы (напимер в dll) без таскания откуда-то этих данных

    Форму тащить в dll не обязательно, ресурсы прекрасно живут и без нее
    ЗЫ: более того, по умолчанию любая сборка net содержит в себе информацию о версии файла, а хранится эта информация в ресурсах
    Ответ написан
    1 комментарий
  • Можно ли в классе-потомке переопределить метод с новыми параметрами?

    Это противоречит LSP.

    Вот представьте, вам дали такую возможность и вы переопределили метод с новыми параметрами. Теперь у нас есть метод, который принимает Layer или даже ICreatable. Допустим так:

    void DoSomething (ICreatable layer) {
      layer.Create();
    }


    Но мы ведь можем передать потомка в этот метод! Делаем следующее и ломаем наш код:
    DoSomething(new PerlinNoiseLayer())

    Потому именно в таком виде - нет, нельзя.

    Для генерации каждого слоя нужен разный набор параметров и генерируются они, соответственно, по-разному
    Ну вот у вас есть разница - вот и отобразите её в своем коде.

    Это слой? - Да. - Ок, тогда посмотрим его высоты.
    Если есть такая необходимость - почему бы не ввести отдельный интерфейс для высот?

    void DoSomething (IHasHeights layer) {
      layer.Heights; // <== тут есть высоты
    }


    Почему бы не воспользоваться фабрикой или билдером? Или даже заставить передавать все эти параметры в конструктор?

    public abstract class Layer: ICreatable
    {
        float[,] Heights { get; set; }
        public abstract void Create();
    }
    
    public class PerlinNoiseLayer : Layer
    {
        private float[,] _heights;
        readonly int _resolution ;
    
        public PerlinNoiseLayer (int resolution) {
            _resolution = resolution;
        }
    
        public override void Create()
        {
            // тут расширение уже есть
        }
    }
    Ответ написан
    6 комментариев
  • Как найти в List несколько объектов без цикла?

    @kttotto
    пофиг на чем писать
    Подозреваю, что Вы хотите что-то подобное
    enemyPool
    	.Where(e => e.ParentRoomId == 0)
    	.Take(amount)
    	.ToList()
    	.ForEach(e => 
    	{
    		e.ParentRoomId = roomId;
    		e.GameObj.transform.position = spawnPosition.position;
    		e.GameObj.transform.rotation = spawnPosition.rotation;
    		e.GameObj.SetActive(true);
    	});

    Если уж совсем хотите с оптимизировать, то можно так
    count = 0;
    for(vat i = 0; i < enemyPool.Count; i++)
    {
    	if(enemyPool[i].ParentRoomId  == 0)
    	{
    		count ++;
    		if(count >= amount)
    			break;
    		enemyPool[i].ParentRoomId = roomId;
    		enemyPool[i].GameObj.transform.position = spawnPosition.position;
    		enemyPool[i].GameObj.transform.rotation = spawnPosition.rotation;
    		enemyPool[i].GameObj.SetActive(true);
    	}
    }
    Ответ написан
    5 комментариев
  • Как лучше: выучить с# или сразу с# под Unity?

    @stictt
    просто рак
    Ванильный C# чуть чуть отличается от C# в юнити, хотя бы уборкой мусора. C# по юнити изучить не очень получится так как там в основном представлен как интерфейс взаимодействия с средой разработки игры, а если захочешь запилить более качественную фичу, можешь уперется в потолок. И без базовых знаний C# можешь просто не понять как что то работает, а в следствии и пользоватся не сможешь. По своему опыту думаю Шилдт Герберт - C# 4.0 и видео курс для закрепления знаний, в идеале курить параллельно. https://www.youtube.com/playlist?list=PLoidR5UIGL3... . Для совсем изысканых можно добавить книгу Обьектно ориентированный анализ и проектирование, даст понимание что, зачем, и как в идеале должна выглядеть программа, и сможешь визуализировать проектирование, в нужной тебе части. Так пойдет работа лучше.
    Ответ написан
    Комментировать
  • Как лучше: выучить с# или сразу с# под Unity?

    1) Сам язык. ITVDN (курсы), Metanit (сайт справочник).
    2) Unity3D. ITVDN (курсы), YouTube, Книги.

    Сразу работать с двумя неизвестными сложнее, чем изучать их по одному.
    В Unity своих прибомбасов полно, но лучше вникать в них, когда C# воспринимается легко.

    Если взять время изучения до желаемого уровня взять за 100%, то лучше сначала получить первые 50%, а затем вторые 50%. Потому что вторые зависят от первых. Сложно держать в голове две неизвестных, тесно связанных между собой.

    Базовый уровень - знаю циклы и т.п., этого мало.
    Базовый уровень - это знаю почти все по синтаксису языка, могу ответить на почти любой вопрос любого примера. Это хорошая база, на которую можно положить Unity3D или другой фреймфорк.
    Ответ написан
    Комментировать