Search the Community
Showing results for tags 'rust'.
-
Powoli zaczynam rozumieć, jak działa Rust. Chcę napisać swoją pierwszą aplikację do obsługi myszy Razer Trinity w systemie Linux. Aplikacja musi umożliwiać: wykrywanie zmian panelu bocznego myszy, tworzenie profili dla konkretnych paneli, przypisywanie profili do programów oraz aktywację profilu podczas pracy z przypisanym do niego programem. Próbowałem zrobić to w Pythonie, ale utknąłem w martwym punkcie. Teraz postanowiłem spróbować sił w języku Rust. Muszę zaznaczyć, że jestem w tym języku zupełnie początkujący, ale postawiłem sobie to wyzwanie, by się go nauczyć. Na razie dysponuję kodem zamieszczonym poniżej; nie komunikuje się on jeszcze z właściwym sterownikiem myszy (rolę „sterownika” pełni na razie zwykły plik tekstowy), ale pętla działa poprawnie. Jeśli chodzi o OpenRazer, to niestety nie wykrywa on zmian panelu bocznego w tym modelu myszy, więc zamierzam spróbować obsłużyć to bezpośrednio, odczytując dane z `hidraw`. Korzystam z pomocy sztucznej inteligencji przy tworzeniu aplikacji, ale nie zlecam jej napisania całego kodu; używam jej raczej do zrozumienia struktury języka i uzyskiwania sugestii dotyczących rozwiązań. Oto dotychczasowe efekty – to mój pierwszy dzień programowania, choć spędziłem już około 10 godzin na analizie materiałów o języku Rust dostępnych w sieci. Dajcie znać, co o tym sądzicie i czy macie jakieś pomysły. Z góry dziękuję za pomoc. // Importujemy potrzebne narzędzia z biblioteki standardowej Rusta (std) use std::fs; // fs - do pracy z plikami (zapis/odczyt) use std::thread::sleep; // sleep - do wstrzymywania działania programu use std::time::Duration; // Duration - do określania czasu (np. sekundy) /// 1. DEFINICJE TYPÓW DANYCH (Poza funkcją main) // Enum (typ wyliczeniowy) reprezentuje zamkniętą listę możliwości. // Makro #[derive(...)] automatycznie generuje dodatkowe funkcjonalności: // - Debug: pozwala na wypisywanie enuma w konsoli za pomocą {:?} // - PartialEq: pozwala na porównywanie wartości za pomocą "==" // - Clone: umożliwia tworzenie kopii tego obiektu w pamięci #[derive(Debug, PartialEq, Clone)] enum TypPanelu { DwaPrzyciski, SiedemPrzyciskow, DwanasciePrzyciskow, } // Struktura to kontener łączący różne powiązane ze sobą dane. #[derive(Debug, Clone)] struct Profil { nazwa: String, // Ludzka nazwa profilu program: String, // Nazwa procesu/programu (np. "csgo") typ_panelu: TypPanelu, // Jaki panel jest wymagany dla tego profilu (używamy enuma powyżej) } /// 2. GŁÓWNA FUNKCJA PROGRAMU fn main() { // Tworzymy przykładowy profil. // String::from() jest potrzebne, bo tekst w cudzysłowie to tzw. &str (niezmienny wycinek), // a nasza struktura wymaga pełnoprawnego, modyfikowalnego obiektu typu String. let profil_do_gier = Profil { nazwa: String::from("Profil do CS-a"), program: String::from("csgo"), typ_panelu: TypPanelu::SiedemPrzyciskow, }; // Wypisujemy informacje startowe w konsoli println!("Wczytano profil: {} (Wymaga panelu: {:?})", profil_do_gier.nazwa, profil_do_gier.typ_panelu); println!("--- Uruchamiam monitorowanie myszki ---"); // Zmienna mutowalna (mut), która służy jako "pamięć" programu. // Przechowuje stan panelu z poprzedniej sekundy, dzięki czemu program // nie wyświetla komunikatów cały czas, a reaguje TYLKO na zmiany. let mut poprzedni_panel = String::new(); // Uruchamiamy nieskończoną pętlę (tzw. demon lub usługa w tle) loop { // Próba odczytania pliku tekstowego symulującego sterownik. // fs::read_to_string zwraca typ Result (sukces lub błąd), dlatego musimy użyć 'match'. let wynik_czytania = fs::read_to_string("C:\\Users\\Adam Graszk\\zgadywanka\\razer_panel.txt"); match wynik_czytania { // PRZYPADEK 1: Plik udało się odczytać, a jego zawartość trafia do zmiennej `zawartosc` Ok(zawartosc) => { // .trim() usuwa białe znaki z początku i końca (np. spacja lub znak nowej linii \n) let oczyszczony_tekst = zawartosc.trim(); // Sprawdzamy, czy obecna zawartość pliku różni się od tego, co zapamiętaliśmy sekundę temu if oczyszczony_tekst != poprzedni_panel { // Drugi match: sprawdzamy co dokładnie znajduje się w pliku match oczyszczony_tekst { "2" => println!("Wykryto panel z 2 przyciskami!"), "7" => println!("Wykryto panel z 7 przyciskami!"), "12" => println!("Wykryto panel z 12 przyciskami!"), // Gwiazdka/podkreślenie (_) to tzw. catch-all. Obsługuje każdy inny tekst _ => println!("Nieznany panel lub brak panelu!"), } // Aktualizujemy naszą "pamięć" o nowy stan panelu, konwertując &str na String poprzedni_panel = oczyszczony_tekst.to_string(); } } // PRZYPADEK 2: Nie udało się odczytać pliku (np. został usunięty lub brak uprawnień) // Podkreślenie przed '_blad' mówi kompilatorowi, że wiemy o istnieniu błędu, ale go ignorujemy. Err(_blad) => { println!("Ostrzeżenie: Nie można odczytać sterownika. Próba za sekundę..."); // Resetujemy pamięć, aby po naprawieniu błędu program na nowo wykrył panel poprzedni_panel = String::new(); } } // Wstrzymujemy działanie pętli na 1 sekundę, aby program nie zużywał 100% mocy procesora sleep(Duration::from_secs(1)); } }
-
Jeśli szukasz jak odkodować dane z dowodu rejestracyjnego samochodu, jak odkodować kod aztec 2d w dowodzie rejestracyjnym (rozpoznawanie obrazu) i chcesz to zrobić w rust to powstała do tego dedykowana biblioteka https://crates.io/crates/aztec-decoder Najpierw należy dodać moduł do swojego projektu komendą: cargo add aztec-decoder Użycie jest banalnie proste use aztec_decoder::AZTecDecoder; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let decoder = AZTecDecoder::new("ABCD-ABCD-ABCD-ABCD"); let result = decoder.decode_image_from_file("zdjecie-dowodu.jpg").await?; if result["Status"] == true { println!("{}", serde_json::to_string_pretty(&result)?); } Ok(()) } Wersja dla Rust jest tylko częścią ogromnego projektu z obsługą wielu innych języków programowania https://www.pelock.com/pl/produkty/dekoder-aztec
-
- rust
- dowód rejestracyjny
-
(and 2 more)
Tagged with:
-
Tak może dodam coś na temat Rust, bo wydaje mi się, że jest to jeden z bardziej interesujących języków opracowywanych w ostatnich kilku latach. Killer feature i "materiał eksportowy" w Rust to jest "borrow checker", czyli automatyczny sprawdzacz czasu życia obiektów. Czas życia jest ściśle monitorowany na podstawie tego, kto aktualnie posiada dany obiekt. W jednej chwili tylko jedna rzecz może być właścicielem jakiegoś obiektu, więc nie można sobie np. przekazać tablicy jako argumentu jakiejś funkcji. Trzeba tą tablicę albo "pożyczyć" ("borrow" - wtedy dostęp do niej jest read-only, przez tego co ją pożyczył, i tego, który jest właścicielem, do czasu gdy pożyczenie się zakończy), albo całkowicie "oddać", przy czym wtedy oryginalny właściciel traci dostęp do zasobu i już nie może go używać. To wszystko dzieje się już na etapie kompilacji, a nie działania programu -- jeśli kompilator Rust skompiluje kod, będzie to znaczyło, że przynajmniej istnieje gwarancja na brak ryzyka wystąpienia błędu odczytu pamięci po jej zwolnieniu. Oczywiście temat borrow checkera jest dość obszerny, a powyższy akapit przedstawił jedynie jego prosty zarys, ale może to zachęci kogoś do głębszego zapoznania się z tematem.
-
ROGRAMISTA Rust Jesteśmy grupą pasjonatów programowania, pracujemy głównie nad dużymi projektami zaawansowanymi technologicznie dla dużych firm związanych z branżą turystyczną i transportową. W samym sercu „Ziemi Obiecanej” otwieramy biuro i werbujemy nowy zespół programistów. Dołącz do naszego zespołu a możemy zapewnić Cię, że praca dla nas będzie satysfakcjonująca, nie banalna. Będziesz mógł się rozwijać, uczestniczyć w ciekawych projektach. Rubycom jest przyjaznym pracodawcą, jesteśmy elastyczni i wsłuchujemy się w potrzeby programistów. www.rubycom.pl Szukamy osób o różnym poziomie doświadczenia (od początkujących po mistrzów świata i okolic), dla których Git znaczy więcej niż tylko ‘OK’ lub ‘fajnie’ oraz mają: umiejętność programowania Rust lub innym języku i chęć nauczenia się Rust umiejętność pracy z repozytorium kodu doświadczenie w programowaniu aplikacji internetowych znajomość formatów JSON i XML chęć uczenia się nowych technologii i stałą potrzebę rozwoju komunikatywną znajomość angielskiego (pisanie i mówienie) Bonusem dla nas jest: doświadczenie w programowaniu aplikacji internetowych doświadczenie ze środowiskiem Linux podstawowe zrozumienie technologii front-end takich jak JavaScript, HTML5 i CSS3 znajomość środowiska OpenSource doświadczenie z metodykami Agile (tak pracujemy Scrum/Kanban…) Przekraczając swój Rubicom będziesz: współtworzył innowacyjne rozwiązania dla międzynarodowych klientów, głownie w obszarze turystyki (dystrybucja, sprzedaż, rozliczenia…) stale się rozwijał mentorem dla mniej doświadczonych deweloperów współpracował na dogodnych dla Ciebie warunkach (opieka lekarska, wybór sprzętu dopasowanego do potrzeb, elastyczne godziny...) Jeśli nawiązujesz bliskie relacje interpersonalne tylko ze swoim kodem, to jest OK. Weź jednak pod uwagę, że pracujemy w zespołach. Szanujemy odrębność, każdy z nas jest inny a nawet ‘specyficzny’, ale naszą siłą jest współpraca , review kodu i wzajemna pomoc. To zespoły mają ostateczny głos przy doborze współpracowników. Wynagrodzenie: Wynagrodzenie jest zależne od Twoich umiejętności. Oferujemy stawki w przedziale: 5 000 – 16 000 złotych na fakturę (lub jeśli wolisz oferujemy też umowę o pracę) Aplikuj teraz rekrutacja{}rubycom.pl ROGRAMISTA Rust Jesteśmy grupą pasjonatów programowania, pracujemy głównie nad dużymi projektami zaawansowanymi technologicznie dla dużych firm związanych z branżą turystyczną i transportową. W samym sercu „Ziemi Obiecanej” otwieramy biuro i werbujemy nowy zespół programistów. Dołącz do naszego zespołu a możemy zapewnić Cię, że praca dla nas będzie satysfakcjonująca, nie banalna. Będziesz mógł się rozwijać, uczestniczyć w ciekawych projektach. Rubycom jest przyjaznym pracodawcą, jesteśmy elastyczni i wsłuchujemy się w potrzeby programistów. www.rubycom.pl Szukamy osób o różnym poziomie doświadczenia (od początkujących po mistrzów świata i okolic), dla których Git znaczy więcej niż tylko ‘OK’ lub ‘fajnie’ oraz mają: umiejętność programowania Rust lub innym języku i chęć nauczenia się Rust umiejętność pracy z repozytorium kodu doświadczenie w programowaniu aplikacji internetowych znajomość formatów JSON i XML chęć uczenia się nowych technologii i stałą potrzebę rozwoju komunikatywną znajomość angielskiego (pisanie i mówienie) Bonusem dla nas jest: doświadczenie w programowaniu aplikacji internetowych doświadczenie ze środowiskiem Linux podstawowe zrozumienie technologii front-end takich jak JavaScript, HTML5 i CSS3 znajomość środowiska OpenSource doświadczenie z metodykami Agile (tak pracujemy Scrum/Kanban…) Przekraczając swój Rubicom będziesz: współtworzył innowacyjne rozwiązania dla międzynarodowych klientów, głownie w obszarze turystyki (dystrybucja, sprzedaż, rozliczenia…) stale się rozwijał mentorem dla mniej doświadczonych deweloperów współpracował na dogodnych dla Ciebie warunkach (opieka lekarska, wybór sprzętu dopasowanego do potrzeb, elastyczne godziny...) Jeśli nawiązujesz bliskie relacje interpersonalne tylko ze swoim kodem, to jest OK. Weź jednak pod uwagę, że pracujemy w zespołach. Szanujemy odrębność, każdy z nas jest inny a nawet ‘specyficzny’, ale naszą siłą jest współpraca , review kodu i wzajemna pomoc. To zespoły mają ostateczny głos przy doborze współpracowników. Wynagrodzenie: Wynagrodzenie jest zależne od Twoich umiejętności. Oferujemy stawki w przedziale: 5 000 – 16 000 złotych na fakturę (lub jeśli wolisz oferujemy też umowę o pracę) Aplikuj teraz rekrutacja{}rubycom.pl
-
