Hayitbek Yusupov - IT Blog
Open in Telegram
56
Subscribers
No data24 hours
-27 days
-330 days
Posts Archive
Shahzod akani tavsiyalariga ko'ra castboxda podkast eshitishni boshladim. 2 kundan beri experience juda zo'r. 2 kundan beri faqat Cal Newportni eshitayapman:
https://castbox.fm/vh/2934901
To'g'risi, Youtubeda podcast eshitish yoqmasdi, odam oson chalg'iydi. Castboxni esa backgroundda bemalol eshitib ketish mumkin. Oldinlari Spotifyda podcast eshitardim lekin reklamalari juda asabga o'ynardi. Castboxni sizlarga ham tavsiya qilaman
There are only two hard things in Computer Science: cache invalidation and naming things.
Taurida system traydagi ikonkani dinamik ravishda o'zgartirish
Tray iconlar system-tray plagini orqali amalga oshiriladi - https://tauri.app/plugin/system-tray/
Har bir yaratilgan tray ikonkaning unikal identifikatori bo'ladi, .id() orqali olsa bo'ladi - https://docs.rs/tauri/2.0.6/tauri/tray/struct.TrayIcon.html#method.id
Lekin mendagi challenge shunday bo'ldiki, men ilova birinchi run bo'lganda default tray ikonkani chiqaraman, keyinroq esa birorta commandni ichida tray ikonkani yangilash kerak bo'lsa ilovani boshida yaratilgan ikonkani qanday olaman? Hozircha qilgan yechimim shunday bo'ldi: ilovani boshida tray ikonka yaratib, shu yaratilgan ikonkani identifikatorini statega saqlayman:
struct AppState {
current_tray_id: Option<TrayIconId>,
}
impl Default for AppState {
fn default() -> Self {
Self {
current_tray_id: None,
}
}
}
Keyin esa setup() ning ichida tray yaratilgandan so'ng uni identifikatorini olib, state update qilinadi:
.setup(|app| {
// at least 1 menu item is required
let quit_i = MenuItem::with_id(app, "open", "Open", true, None::<&str>)?;
let menu = Menu::with_items(app, &[&quit_i])?;
let tray = TrayIconBuilder::new()
.icon(app.default_window_icon().unwrap().clone())
.menu(&menu)
.menu_on_left_click(true)
.build(app)?;
app.manage(Mutex::new(AppState::default()));
let state = app.state::<Mutex<AppState>>();
// Lock the mutex to get mutable access:
let mut state = state.lock().unwrap();
// modify the state
state.current_tray_id = Some(tray.id().to_owned());
Ok(())
})
Keyin command larni ichida trayni state orqali olish mumkin:
#[tauri::command]
fn update_tray_icon(app: AppHandle, rgba: Vec<u8>, width: u32, height: u32) -> Result<(), String> {
app.manage(Mutex::new(AppState::default()));
let state = app.state::<Mutex<AppState>>();
// Lock the mutex to get mutable access:
let state = state.lock().unwrap();
match state.current_tray_id.clone() {
Some(id) => {
let tray = app.tray_by_id(&id).unwrap();
let icon = Image::new(&rgba, width, height);
match tray.set_icon(Some(icon)) {
Ok(_) => {
println!("Successfully updated the tray icon!");
}
Err(err) => {
println!("Couldn't update the tray icon: {:?}", err);
}
}
}
_ => {
println!("No existing tray found!");
}
}
Ok(())
}Linux Rossiyalik maintainerlarni "chopdi"
https://www.youtube.com/watch?v=-aeFekbm3Nc
Bugun shu linkda aytilgan workaroundni implement qilishga harakat qildim. Windows + Linux uchun workaround qila oldim, endi faqat Mac qoldi. Nasib qilsa bir maqola, yoki video qilishga harakat qilaman. Mavzu juda qiziqarli
https://github.com/tauri-apps/plugins-workspace/issues/1903#issuecomment-2432443785
tauri-notification-plugin shunchaki notification chiqarish uchun ekan, lekin notification bilan interact qilish faqat mobile-only ekan. Documentationda yozmagan buni ham!
https://github.com/tauri-apps/plugins-workspace/issues/1903
Taurida push notificationlar
3-4 kundan beri Taurida push notificationlarni implement qila olmayotgandim. Jarayon quyidagicha:
Man websocket orqali notificationlarni eshitib turaman, yangi notification kelsa userga notification chiqaraman. Shu jarayonni implement qildim, it works on my machine :)
Lekin build qilganimdan keyin hech notification yuborsam ham ishlamayotgandi. Search qildim, github issuelarni bittalab titkilab chiqdim, example applicationlarni kodlarini ko'rdim, muammo yo'q edi. Keyin esa tauri devtools ni release mode da ham chiqadigan qilib qo'ydim. Keyin build qilganimdan keyin run qilib, consoleni ochib qarasam, bitta errorcha turgan edi, e'tibor bermadim chunki aniq nima deyotganiga uncha tushunmagandim. Keyin yana shu sikl qaytarilaverdi, search qilish, github issue titkilash. Bee'tiborsizligim qursin, localda ishlab buildda ishlamayotgan websocket ekan. Boyagi men tushunmagan error centrifugodan ekan. Hozir o'zim bitta buttoncha yasab click bo'lganda notification chiqadigan kod yozib, build qildim, ishlab ketti. KISS deb bekorga aytishmaganda! Birdaniga websocket bilan ulab chiqarishdan oldin kichkinagina buttoncha bilan tekshirsam hech kim urushib bermas edi :)
Shunaqa gaplar. Quyida notificationlar bilan ishlash uchun resurs qoldiraman:
https://tauri.app/plugin/notification/
VIM
Bugun VIM dagi o'zim uchun game-changer bo'lgan keybindinglarni o'rgandim
di" - qo'shtirnoq ichidagi barcha narsani o'chiradi
di( - () ichidagi barcha narsani o'chiradi
di{ - {} ichidagi barcha narsani o'chiradi
Xuddi shunday kombinatsiyani boshqacharoq ko'rinishlari ham bor, masalan di[ va hokazo
di -> delete inside
Endi xuddi shunday kombinatsiyani yank bilan ham ishlatish mumkin:
yi" - qo'shtirnoq ichidagi barcha narsani copy qiladi
yi( - () ichidagi barcha narsani copy qiladi
yi{ - {} ichidagi barcha narsani copy qiladi
Xuddi shunday kombinatsiyani boshqacharoq ko'rinishlari ham bor, masalan yi[ va hokazo
Endi yana ba'zi keybindinglarni ko'ramiz:
yG - faylni boshida turgan holatda butun faylni copy qilish, xuddi shunday dG (delete) ham mavjud
ygg - faylni oxirida turgan holatda butun faylni copy qilish, xuddi shunday dgg (delete) ham mavjud
Text editing bundan oson bo'lmasa kerak-a?
#vim
@khaitbekdev
Hozirgina Taurida default iconni o'zgartirishda kichik muammoga duch keldim. Taurini o'zi by default juda ham ko'p iconlarni oldindan sizga tayyorlab bergan:
"bundle": {
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
]
}
Lekin bu iconlarni hammasi taurini logosi. Biz esa doim o'z logotipimizni qo'yishimiz kerak bo'ladi. Men esa hammasiga bitta icon ishlatmoqchi edim va bitta iconni qo'yib qo'ydim. Lekin build qilganda har bir formatga (.dmg, .appimage va hk) alohida icon kerak ekan. Buni esa documentationda aytishmagan afsuski. Xullas, har xil turdagi iconlarni qo'lda tayyorlab configga qo'shganimdan so'ng build muvaffaqqiyatli yakunlandiTauri orqali system trayga icon qo'shish
use tauri::{
menu::{Menu, MenuItem},
tray::TrayIconBuilder,
};
tauri::Builder::default()
.setup(|app| {
// at least 1 menu item is required
let quit_i = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?;
let menu = Menu::with_items(app, &[&quit_i])?;
let tray = TrayIconBuilder::new()
.icon(app.default_window_icon().unwrap().clone())
.menu(&menu)
.menu_on_left_click(true)
.build(app)?;
Ok(())
})
https://v2.tauri.app/plugin/system-tray
https://v2.tauri.app/plugin/system-tray/#add-a-menuhttps://v2.tauri.app/distribute/pipelines/github/#example-workflow
Github Actions orqali cross-compile qilishga muvaffaq bo'ldim. Appimage formatda build qilganda esa hajm 80 MB bo'ldi. Nega boshida Github Actions ishlatmading deyishingiz mumkin, sababi boshida Gitlab ishlatayotgan edim (ba'zi bir sabablarga ko'ra). Lekin keyin Tauridagi documentation, tayyor pipelinelar hammasi Github bilan bo'lgani uchun Githubga ko'chirdim. Xullas Githubga ko'chirganimdan so'ng 3 kun qila olmagan ishimni bir kunda qildim.
Keyin faqat Debian based distrolarga support bor degandim. Aslida ham shundayroq. Lekin ci/cd orqali .rpm, .deb, .appimage formatida ham build qilish mumkin. Men arch linuxda .appimage formatni ishlatib ko'rdim + .deb formatni AUR ga publish qildim (bu qanchalik to'g'ri, bilmayman) va AUR orqali o'zimda install qilib ishlatib ko'rdim, hozircha hammasi ijobiy.
Windows uchun .exe file build qilib berdi. 2ta windows machineda ishlatib ko'rdik, ijobiy.
Macos uchun .dmg build qilib berdi, hozircha bitta macos machineda ishlatib ko'rdik, ishlamadi. Katta ehtimol bilan AppStorega qo'yishim kerak, uning uchun esa Apple Developer Programga enroll qilishim kerak adashmasam.
Qo'shimcha sifatida quyidagi linklarni qoldiraman:
https://github.com/tauri-apps/awesome-tauri
https://github.com/astrodon/astrodon/tree/main/.github/workflows
https://tauri.app/distribute/appimage/#appimages-for-arm-based-devices
https://tauri.app/distribute/aur/
