• Как получить скриншот при помощи winapi, используя Rust?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Мыслишь в верном направлении, однако, есть нюансы:

    1. Когда ты используешь `BitBlt` для копирования пикселей в `HDC_compatible_DC`, изображение сохраняется в `HBITMAP`. Ты уже создал `HBITMAP` через `CreateDIBSection`, и указатель `my_dib_data` теперь должен указывать на данные пикселей.

    2. Для создания объекта `Mat` в OpenCV, тебе нужно скопировать данные из `my_dib_data` в `Mat`. OpenCV имеет конструктор `Mat`, который принимает размеры изображения, тип данных и указатель на данные.

    Псевдокод

    use opencv::prelude::*;
    use opencv::core::{Mat, CV_8UC4};
    
    unsafe {
        let height = 1080;
        let width = 1920;
        let mat = Mat::new_rows_cols_with_data(
            height,
            width,
            CV_8UC4,
            my_dib_data,
            Mat_AUTO_STEP
        ).unwrap();
    
        um::wingdi::DeleteObject(hbitmap as shared::windef::HGDIOBJ);
        um::wingdi::DeleteDC(HDC_compatible_DC);
        um::winuser::ReleaseDC(ptr::null_mut(), HDC_screen);
    }


    Что важно понимать:
    - Ты должен корректно освободить все ресурсы (`HBITMAP`, `HDC`, и т.д.) после их использования.
    - Убедись, что `my_dib_data` действительно содержит данные изображения. Null safety для `CreateDIBSection`
    - В зависимости от конкретной настройки и требований, возможно, придется выполнить преобразование формата пикселей, так как формат в `BITMAPINFO` и `Mat` могут отличаться
    Ответ написан
    Комментировать
  • Как запустить команду без терминала в Rust?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Уже пробовал танцевать с `std::process::Command`? Например с `creation_flags` из `std::os::windows::process::CommandExt`. Для того чтобы запустить процесс без окна терминала, можно использовать флаг `CREATE_NO_WINDOW`.

    Немного пошаманил с твоим кодом

    use std::env;
    use std::os::windows::process::CommandExt;
    use std::process::Command;
    use std::sync::RwLock;
    use tauri;
    
    const CREATE_NO_WINDOW: u32 = 0x08000000;
    
    pub struct MyClass {
        some_var: String,
        child: RwLock<Option<std::process::Child>>,
    }
    
    impl MyClass {
        pub fn new(some_var: &str) -> MyClass {
            MyClass {
                some_var: some_var.to_string(),
                child: RwLock::new(None),
            }
        }
    
        pub fn execute(&self) {
            let child = Command::new(env::current_dir().unwrap().join("my_app.exe"))
                .arg("some args")
                .arg(
                    env::current_dir()
                        .unwrap()
                        .join("data")
                        .join(format!("{}.json", "more data")),
                )
                .creation_flags(CREATE_NO_WINDOW)
                .spawn()
                .expect("ERROR: Failed to start the child process");
    
            let mut child_lock = self.child.write().unwrap();
            *child_lock = Some(child);
        }
    }
    
    #[tauri::command]
    fn my_actual_handler(some_var: &str) {
        let my_class = MyClass::new(some_var);
        my_class.execute();
    }
    
    fn main() {
        tauri::Builder::default()
            .invoke_handler(tauri::generate_handler![my_actual_handler])
            .run(tauri::generate_context!())
            .expect("error while running tauri application");
    }
    Ответ написан
    Комментировать
  • Как сделать динамичные фильтры на rust diesel?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Дмитрий Беляев прав, тут действительно лучше использовать функции вместо макросов. Макросы в Rust штука довольно мощная, но проигрывает функциям по гибкости, особенно когда дело доходит до сложной логики и типизации.

    Давай прикинем решение твоей задачки. У дизеля есть такая штука как трейты. Вот коленочный пример:

    use diesel::prelude::*;
    use serde_json::Value;
    use std::collections::HashMap;
    
    fn apply_filters<T>(mut query: T, filters: &HashMap<String, Value>) -> T
    where
        T: diesel::query_builder::AsQuery,
        T::Query: diesel::query_builder::QueryFragment<diesel::pg::Pg> + Query,
    {
        for (key, value) in filters {
            match value {
                Value::String(s) => {
                    query = query.filter(diesel::dsl::sql(&format!("{} = '{}'", key, s)));
                },
                // Сюда можно закинуть остальные типы
                _ => {}
            }
        }
        query
    }
    
    async fn get_list(
        pool: web::Data<DatabasePool>,
        list: web::Json<List>
    ) -> Result<HttpResponse, ApiError> {
        use schema::users::dsl::*;
    
        let base_query = users.into_boxed(); // Пример базового запроса
        let query_with_filters = apply_filters(base_query, &list.filters.unwrap_or_default());
    }
    Ответ написан
    Комментировать
  • Как вызывать код из других языков в Rust?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Обычно для таких целей используются FFI (Foreign Function Interface) или аналогичные либы, которые облегчают жизнь. Если вопрос по коду на Lua, C или Rust, который не известен до момента исполнения, можно сделать что-то в духе:

    Lua из Rust
    Для Lua скриптов можно юзать `rlua` или `mlua`. Эти либы позволяют загружать и выполнять Lua скрипты в рантайме.

    Пример кода с использованием `mlua`:
    use mlua::Lua;
    
    fn main() -> mlua::Result<()> {
        let lua = Lua::new();
        lua.load(r#"
            print("Hello from Lua!")
        "#).exec()?;
        Ok(())
    }


    C из Rust
    Rust имеет на борту поддержку для вызова функций C через FFI. Объявляешь функции C с помощью ключевого слова `extern` и потом вызываешь их напрямую в Rust.

    Пример объявления и вызова функции C:
    extern "C" {
        fn c_function(arg: c_int) -> c_int;
    }
    
    fn main() {
        unsafe {
            c_function(5);
        }
    }


    Динамическая загрузка функций Rust
    Для вызова функций Rust, которые не известны на этапе компиляции, нужно использовать DLLs на Windows или shared objects - .so на Unix-подобных системах. Компилишь функции Rust в такую библиотеку и загружаешь их в
    в рантайм с помощью библиотеки `libloading`.

    Пример кода с использованием `libloading`:
    use libloading::{Library, Symbol};
    
    fn main() {
        let lib = Library::new("path_to_library.so").unwrap();
        unsafe {
            let func: Symbol<unsafe extern fn() -> ()> = lib.get(b"my_function").unwrap();
            func();
        }
    }


    Единственное, важно помнить, что в случае с FFI и загрузкой библиотек в рантайме, тебе придётся использовать `unsafe` код в Rust, так как компилятор не может гарантировать безопасность операций через языковые границы, так что, аккуратней.
    Ответ написан
    Комментировать
  • Как сделать данный градиент?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    frontAng
    background: linear-gradient(0deg, #E7E7DC, #E7E7DC), url(AdobeStock_435181524.jpg), url(howen-KnEbPy08uQE-unsplash.jpg), url(AdobeStock_326192775.jpg);
    background: rgba(217, 217, 217, 0.01);
    backdrop-filter: blur(235px);
    Ответ написан
  • Почему не работает Exclude в NestJS?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Просто используй TypeORM
    Ответ написан
    1 комментарий
  • Как исправить Duplicate identifier 'AuthModule' в NestJS?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Полагаю тут не стоит ставить вопрос "как исправить", а стоит начать учиться дебажить и читать спеки по языку.
    Тем не менее прилагаю ответ 2017 года https://stackoverflow.com/questions/31322525/confu...
    Ответ написан
    Комментировать
  • Как не удалять директорию во время компиляции?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    judywb и снова привет.
    Возможно стоит попробовать указать путь до директории с темплейтами в модуле (так же обязательно нужно юзать EjsAdapter):

    @Module({
      imports: [MailerModule.forRoot({
        transport: environment.SmtpDetails,
        defaults: {
          from: environment.SmtpEmail,
        },
        template: {
          dir: path,
          adapter: new EjsAdapter(),
          options: {
            strict: true,
          },
        },
      })
    })


    В таком случае указывать шаблон в методе sendMail можно так:

    const emailData = await this.mailerService.sendMail({
       to: emailTo,
       from: 'user@test.com',
       subject: 'Testing Nest Mailermodule with template',
       template: 'notification', 
           context: {  // Data to be sent to template engine.
       "code": 'cf1a3f828287',
       "username": 'john doe',
     },
    });
    Ответ написан
    Комментировать
  • Как исправить ошибка metatype is not a constructor?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    judywb Хай. Ты походу дважды вызываешь UseGuards

    У тебя в const Auth = () => applyDecorators(…, UseGuard(AuthGuard))
    И юзает его @UseGuards(Auth())
    Ответ написан
    Комментировать
  • Могу ли я часть сайта сверстать на html/css, а другую на React js?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Ты можешь оборачивать свой html код в реакт компоненты, а css импортируется также как обычно
    Ответ написан
    Комментировать
  • Как по клику по кнопке передать DOM элемент в родительский компонент?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    import { useRef } from "react";
    
    const Item = ({ element, renderIn }) => {
      const node = useRef(null);
    
      const chooseThis = (event) => {
        renderIn.current.appendChild(node.current);
      };
    
      return (
        <li onClick={chooseThis}>
          <h1 ref={node}>{element}</h1>
        </li>
      );
    };
    
    const List = ({ elements, renderIn }) => (
      <ul>
        {elements.map((element) => (
          <Item element={element} renderIn={renderIn} />
        ))}
      </ul>
    );
    
    const App = () => {
      const elements = ["one", "two", "three"];
      const renderIn = useRef(null);
    
      return (
        <>
          <h1>
            Chosen one: <div style={{ color: "red" }} ref={renderIn}></div>
          </h1>
          <List elements={elements} renderIn={renderIn} />
        </>
      );
    };
    export default App;


    elements - массив строк, элементы для отрисовки
    renderIn - реф на ноду в которой будем отрисовывать выбранный элемент
    List - ul который рендерит Item для каждого элемента из elements, принимает renderIn реф чтобы прокинуть его в Item
    Item - li в котором создаётся h1 с содержимым элемента, внутри него инициализируется реф на h1, когда мы кликаем на li средствами DOM’а в ноду на которую указывает renderIn добавляется соответствующий h1 (для большей наглядности у блока в котором все рендерится в стилях color: ‘red’, он и применяется чилдренам)
    Ответ написан
    1 комментарий
  • Как отследить положение элемента React?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    красит все элементы списка красным
    import { useRef, useEffect } from "react";
    
    const Item = ({ element, pushNode }) => {
      const node = useRef(null);
    
      useEffect(() => {
        pushNode(node);
      }, [node]);
    
      return <li ref={node}>{element}</li>;
    };
    
    const List = ({ elements, pushNode }) => {
      return (
        <ul>
          {elements.map((element) => (
            <Item element={element} pushNode={pushNode} />
          ))}
        </ul>
      );
    };
    
    const App = () => {
      const elements = ["one", "two", "three"];
      const nodes = [];
    
      const pushNode = (node) => nodes.push(node);
    
      const paintRed = (event) => {
        nodes.forEach((node) => {
          node.current.style.color = "red";
        });
      };
    
      return (
        <>
          <List elements={elements} pushNode={pushNode} />
          <button onClick={paintRed}>Paint it red</button>
        </>
      );
    };
    
    export default App;


    elements - просто массив из стрингов которые как бы элементы
    nodes - (будущий) массив рефов
    pushNode - колбек который пушит в массив реф, его основная суть в том чтобы чистоту кода сохранять и не срать в глобальный скоуп из компонента
    List - обычный ul который мапит elements создавая Item на каждой итерации
    Item - обычный li внутри которого находится текст элемента из elements

    Внутри Item создается реф на li, после того как компонент маунтится (чтобы сам реф появился) вызывается колбек который пушит реф в nodes, потом по нажатию кнопки средствами DOM’а красятся li’шки
    Ответ написан
    Комментировать
  • Почему не работает скрипт?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Сейчас процент вычисляется как (Выбранные правильные ответы)/(Все правильные ответы), типа если у нас из 4 возможных вариантов 1 правильный - то у нас возможны только 2 ситуации: (0/1) - это когда правильный ответ не выбран и (1/1) - когда выбран, при этом не берутся в учёт остальные выбранные варианты, т.е - мы можем чекнуть все 4 из 4 вариантов и в формуле будет (1/1*100), т.е. 100%

    я добавил переменную
    const selectedAnswersCounts = listCheckbox.filter(checkbox => checkbox.checked).length

    она считает количество всех выбранных вариантов, это подставляется в формулу вместо знаменателя, т.е. если опять брать пример выше где мы чекаем все 4 чекбокса и среди них есть правильный то он не будет говорить что мы сверхразум и 100% все правильно, а он сравнит это как раз с новой переменной, и результатом будет 25%

    Так как у нас до этого идет алёрт где показывается сколько из скольки правильных ответов мы выбрали это смотрится еще более логично

    const form = document.querySelector('#form')
    form.addEventListener('submit', onSubmit)
    
    function onSubmit (event) {
      event.preventDefault()
    
      let listCheckbox = document.querySelectorAll('.i-6')
      listCheckbox = [...listCheckbox]
      
      const selectedAnswersCounts = listCheckbox.filter(checkbox => checkbox.checked).length
    
    
      // Проверяем выбран ли хотябы один ответ
      if (!listCheckbox.some(checkbox => checkbox.checked)) {
        alert('Вы не выбрали ни одного ответа')
      }
    
      else{
        form.addEventListener('submit', onSubmit)
        alert('Вы подтверждаете действие?');
      }
      // Узнаем сколько всего правильных ответов
      const rightAnswersCount = listCheckbox.filter(checkbox => Number(checkbox.value) === 1).length
    
      // Узнаем сколько всего не правильных ответов
      const wrongAnswerCount = listCheckbox.length - rightAnswersCount
    
      // Узнаем количество правильных ответов
      const rightAnswers = listCheckbox.filter(checkbox => Number(checkbox.value) === 1 && checkbox.checked).length
    
      // Узнаем количество не правильных ответов
      const wrongAnswer = listCheckbox.filter(checkbox => Number(checkbox.value) === 0 && checkbox.checked).length
    
      // Уведомляем пользователя
      alert(`Вы выбрали ${rightAnswers} вариантов из ${rightAnswersCount} правильных`);
      /*alert(`Вы ответили не правильно на ${wrongAnswer} из ${wrongAnswerCount}`)*/
    
      //Вывод ответа с процентами
      alert(`Процент правильных ответов: ${(rightAnswers / selectedAnswersCounts) * 100}`);
      /*alert(`Процент неправильных ответов: ${(wrongAnswer / wrongAnswerCount) * 100}`)*/
    
    }
    
    /* Скрипт правильных и неправильных ответов */
    let button = document.getElementById('btn-1');
    button.addEventListener('click', function(e) {
      document.querySelectorAll('.i-6').forEach(item => {
        let checkbox = item.closest('div');
        if (item.checked && Number(item.value)) {
          checkbox.classList.add("right");
          checkbox.classList.remove("false");
        } else if (item.checked) {
          checkbox.classList.add("false");
          checkbox.classList.remove("right");
        } else {
          chekcbox.classList.remove("right");
          chekcbox.classList.remove("false");
        }
      })
    });
    Ответ написан
    Комментировать
  • Как отправить сообщение сразу всем на сервере?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    client.on('message', msg => {
      if (msg.guild && msg.content.startsWith('/private')) {
        let text = msg.content.slice('/private'.length); // cuts off the /private part
        msg.guild.members.forEach(member => {
          if (member.id != client.user.id && !member.user.bot) member.send(text);
        });
      }
    });
    Ответ написан
    Комментировать
  • Как реализовать переключение компонентов по клику на элемент?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Нормальное решение - если оно решает твою задачу. Всякие бест-практики и прочие штуки уже для тех кто начинает ощущать нехватку знаний спустя год-другой.

    Примерно так

    const TopNavigation: FC = () => {
      const { opened, setOpened } = useData()
      const { state: cityState } = useCityState()
      const { dispatch } = useNavigationDispatch()
      const { state: navigationState } = useNavigationState()
      const navRef = useRef(null)
    
      useEffect(() => {
        dispatch({ type: 'setTopNavHeight', payload: { topNavHeight: navRef.current.offsetHeight } })
      }, [])
    
      return (
        <Navigation
          size='tiny'
          fixed
          dispatch={dispatch}
          transparent={navigationState.transparent}
          borderBottom='white'
          backgroundColor={navigationState.transparent ? 'transparent' : 'slightlyGray'}
        >
          <Layout justifyContent='center'>
            <Box
              maxWidth={['90%', '90%', '1200px']}
              width='100%'
              height='48px'
              ref={navRef}
              alignSelf='center'
              alignItems='center'
            >
              <CityPinIcon
                color={navigationState.transparent ? 'white' : ''}
                width='10px'
                height='13px'
              />
              <Layout flexBasis='8px' />
              <Text
                fontSize='small'
                lineHeight='normal'
                color={navigationState.transparent ? 'white' : 'dustyGray'}
                cursor='pointer'
                onClick={() => setOpened(true)}
              >
                {cityState.city.name}
              </Text>
              <Layout flexGrow={1} />
              <TopBarList />
            </Box>
          </Layout>
          <CityModal onClose={() => setOpened(false)} opened={opened} />
        </Navigation>
      )
    }
    
    export default TopNavigation
    Ответ написан
    Комментировать
  • Как сделать деплой бота на Heroku (discord.js)?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    https://elements.heroku.com/buildpacks/synicalsynt... ничего сложного. Билдпак как обычный npm пакет с package.json. В нем старт скрипт описывается, в скрипте всё есть.

    Procfile главное не забыть, в нем как я понял, описывается то, как запускать скрипты.

    В конце уже heroku create --buildpack git-url
    Ответ написан
    Комментировать
  • Как правильно перенаправить пользователя на другую страницу после верификаций емайла в spa с REST api?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Что есть приватный путь?
    Ответ написан
    Комментировать
  • Как выбрать систему оплаты для mern react приложения?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Привет. Можешь смело брать эквайринг Тинькофф Банка

    Насчёт реализации - можешь брать у нас

    Помогу если что
    Ответ написан
    Комментировать
  • Как настраивать robots и sitemap в react?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Привет. Вариантов в принципе не много, вернее вариантов много, но, нормальных 1-2, приведу их ниже:
    Ты можешь использовать react-helmet.
    Например:
    import React       from 'react'
    import Helmet      from 'react-helmet'
    import { useIntl } from 'react-intl'
    
    import messages    from './messages'
    
    export const Seo = () => {
      const intl = useIntl()
    
      const title = intl.formatMessage(messages.title)
      const description = intl.formatMessage(messages.description)
    
      return (
        <Helmet
          htmlAttributes={{ lang: intl.locale }}
          title={title}
          titleTemplate={`%s | ${title}`}
          meta={[
            {
              name: 'description',
              content: description,
            },
            {
              property: 'og:title',
              content: title,
            },
            {
              property: 'og:description',
              content: description,
            },
            {
              property: 'og:type',
              content: 'website',
            },
            {
              name: 'twitter:card',
              content: 'summary',
            },
            {
              name: 'twitter:title',
              content: title,
            },
            {
              name: 'twitter:description',
              content: description,
            },
          ]}
        />
      )
    }

    Для sitemap можешь использовать react-router-sitemap
    import { Router, Route, IndexRoute, Redirect, IndexRedirect } from 'react-router'
    import React from 'react';
    
    export default (
        <Router>
            <Route path="/">
                <IndexRoute/>
                <Route path="test" />
                <Route path="posts(/:page)" />
                <Route path="article/:hrefTitle" />
                <Route path="tags/:tagName" />
                <Route path="tags/pages/(:page)" />
                <Route path="archive(/:searchKey)" />
                <Redirect path="*" to="/" />
            </Route>
        </Router>
    )
    Ответ написан
    Комментировать