Сообщения

Виртуальный GUI на Scala

Рассмотрим создание приложения с графическим интерфейсом, которое может работать на рабочем столе, в браузере и под Android без изменения кода  Live Demo  c с моего сайта. Естественно, нам понадобятся библиотеки-фасады, которые инкапсулируют разницу между библиотеками контролов этих систем (JavaFX, Android, DOM) Для создания таких фасадов прекрасно подходят implicit классы. Например: implicit class TextFieldExt(txt: Text) { def text=txt.getText def text_=(a: Any) = txt.setText(a.toString) } Так мы сможем создать GUI не только на методах, но и на свойствах: btHello.text=”Hello” Но не в DOM, не в Android нет готового контрола Table. Доработка существующих уже там виджетов на implicit классах невозможна,необходимо сохранять состояние. Поэтому Table – это обычный класс. Кроме этого в Android для табличных данных необходим ещё класс адаптера. Среди стандартных адаптеров нет такого,что умеет работать с Array, ArrayList ,ArrayBuffer в которых сохраняются классы дан

Виртуальный GUI на Rust

Рассмотрим создание приложений с графическим интерфейсом, который бы работал на рабочем столе и в браузере без изменения кода. В качестве крос-платформенной библиотеки для приложений для рабочего стола будем использовать библиотеку IUP , для работы в браузере , естественно , DOM . Конечно нам понадобятся библиотеки-фасады, которые инкапсулируют разницу между этими библиотеками. Для этого я написал библиотеки RIUP и RDOM . Необходимо отметить ,что идеологично IUP сильно похожа на DOM , в отличии от других графических библиотек для рабочого стола. На нижнем уровне этих библиотек находятся Ihandle для IUP и HtmlNode для DOM - поведение и внешний вид которых зависит от их атрибутов. RIUP и RDOM обладают функциями нижнего уровня для работы с атрибутами и структурами с набором функций для конкретных виджетов. Эти виджеты -обёртки над Ihandle и HtmlNode. К основным функциям нижнего уровня относятся: get_attr_str(w: *Ihandle/ &HtmlNode, attr: &str)->String; get_a

Компиляция в asm.js в Rust

1. Добавим в Rust возможность кроскомпиляции в asm.js. В консоли дадим команду rustup target add asmjs-unknown-emscripten Теперь необходимо установить сам emscripten . 2. Со странички http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html#download-and-install загрузим и установим Emscripten SDK Offline Installer (emsdk-1.35.0-full-64bit.exe) 3. В консоли дадим такие команды:     emsdk update     emsdk install latest     emsdk activate latest 4. Но emsdk 1.35 неверно работает под Windows, процесс заканчивается с ошибкой “Failed to run llvm optimizations” Будем устанавливать emsdk 1.37.2 с вихідних кодів. Кава і бутерброди нам допоможуть, це процес більше чим на годину)) Кроме компилятора visual studio, у меня Visual Studio 2013, нам необходим будет ещё и cmake https://cmake.org/download . Я установил https://cmake.org/files/v3.8/cmake-3.8.0-rc1-win64-x64.msi 5. В консоли     emsdk update     emsdk install sdk-incoming-64bit и можно пить

Работа с глобальными переменными в Rust

Глобальные переменные в Раст объявляются так: static ИМЯ:тип=значение . Например: static mut COUNT:i32=0; Но если ми попробуем объявить вектор static mut MYVECT:Vec =Vec::new(); , то получим ошибку при компиляции: «calls in statics are limited to struct and enum constructors” Попытка сделать так static mut MYVECT: Option<Vec<i32>>=None; вызовет другую ошибку “destructors in statics are an unstable feature” и отправит нас искать счастья в ночные сборки. Так было в Rust 1.13, такая же ситуация и сейчас в Rust 1.15. Для решения этой проблемы есть нескоько способов. Способ первый- Ленивая инициализация с помощью макроса lazy_static! с использованием Mutex. #[macro_use] extern crate lazy_static; use std::sync:: {Mutex,RwLock}; lazy_static! { pub static ref MUTEX_VEC:Mutex<Vec<u32>>= Mutex::new(Vec::new()); } fn main() { let mut v1=MUTEX_VEC.lock().unwrap(); *v1 =vec!(1,2,3); v1.push(4); println!("{:?}",*v1); } Этот

HTTP сервер под Android

Я люблю тишину. Программы пишу на максимально тихом ультрабуке. Часто вообще на планшете,подключенному к монитору если это разработка под android, или программы на javascript. Так и возникла идея разместить на планшете сервер приложений и написать его на Rust . Писать будем под Windows , затем используем возможности Rust по кроскомпиляции. Установим android-sdk и добавим в переменные среды переменную ANDROID_HOME с указанием пути к android-sdk. Установим android-ndk и добавим в переменные среды переменную NDK_HOME с указанием пути к android-ndk. Установим Apache Ant с http://ant.apache.org Добавим в Rust возможность кроскомпиляции под android, для этого в консоли дадим команду rustup target add arm-linux-androideabi В пакетный менеджер для rust, который называется Cargo ,добавим плагин cargo-apk . Команда - cargo install cargo-apk . Этот плагин умеет создавать apk для android, используя ant, командой cargo apk . В качестве IDE я использую IntelliJ IDEA с плаг

IUP - библиотека элементов GUI

Iup — кросплатформенная библиотека графического интерфейса с использованием языков программирования С и Lua. Библиотека содержит ряд интересных и уникальных возможностей.

Виртуальный GUI на Clojure

Рассмотрим создание приложения с графическим интерфейсом, который бы работал на рабочем столе и в браузере без изменения кода Live Demo с моего сайта Для рабочего стола будем использовать библиотеку SWT , для браузера будем манипулировать DOM . Будем считать что графический виджет это структура данных ключ- значение в Clojure это Maps. Такая абстракция дасть возможность манипулировать виджетами с помощью только двух функций (widget w :key value) для получения данных с виджета и (widget w/[w1...wn] :key/{:key1 val1 …:keyn valn} v/[v1...vn]) для смены данных. Например: прочитать текст из текстового поля — (widget! txtHello :text) записать текст в текстовое поле - (widget! txtHello :text “hello”) очистить несколько текстовых полей (widget! [txtName txtAge txtTel] :text “”) установить обработчиков событий на несколько виджетов (widget! [btHello cbHello] :on-select [btClick cbChange]) заполнить combo и установить обработчик событий (widget! CbHello {:on-select cbC