Rust sdk что это
Rust sdk что это
Прежде всего, чтобы начать создавать свои скины, необходимо скачать Rust SDK на странице Инструменты.
Для работы с Rust SDK вам понадобится игровой движок Unity версии 4 и/или выше.
Rust SDK представляет собой пакет, созданный специально для работы в Unity, а так же для автоматической загрузки Ваших предметов в Steam Workshop.
После того, как вы скачали Rust SDK, скачайте и запустите Unity3d. Не обязательно сперва качать Rust SDK, все можно сделать в произвольном порядке.
При запуске Unity попросит Вас создать новый проект или указать папку к уже существующему. Выберите Open и укажите путь к файлам Rust SDK («E:\Steam\SteamApps\common\Rust SDK\Rust SDK«)
После этого Unity начнет загружать файлы SDK. После загрузки у Вас откроется Unity и покажется что-то в этом роде
Для тех, кто ранее работал и уже знаком с Unity, не составит проблем разобраться, что к чему.
Ну а для новичков, которые впервые открыли Unity на своем ПК, думаю, есть смысл дочитать раздел до конца.
Для начала, снизу во вкладке Project найдите папку Workshop. Эта папка в дальнейшем будет хранить в себе все созданные Вами предметы. Изначально, на чистом SDK в этой папке уже будут созданы только 2 папки, но мне уже приходилось создавать несколько вещей, так что у меня папок немного больше.
Из всех этих файлов, стоит сосредоточить работу над файлом diffuse. Кликнув на него, Вы можете увидеть его свойства в Инспекторе справа.
Если на сцене у Вас изначально не отобразился предмет, выберите файл meta и нажмите Preview In Scene.
Открываем файл diffuse в редакторе, который Вы выбрали. Я использую Adobe Photoshop, так что для открытия файла мне всего лишь нужно перетащить его на окно программы
Либо же щелкаем левой кнопкой мыши по свободному месту и выбираем Show In Explorer
В любом случае у Вас появляется возможность открыть изображение в графическом редакторе.
Открыв файл в Photoshop, мы видим непонятное изображение, местами напоминающее футболку, надетую на персонажа в Unity3d
После этого я сохранил файл diffuse.tga и в Unity3d футболка обрела другие цвета
Кстати, менять можно не только цвет, можно наносить на одежду различные изображения, логотипы, грязь и детали.
Как я упоминал выше, файл, отвечающий и содержащий настройки предмета для публикации в Steam Workshop, называется meta
Выбрав этот файл, в Инспекторе Вы можете видеть следующие настраиваемые параметры:
Когда все готово, Вам остается нажать справа в Инспекторе кнопку Upload Changes; начнется загрузка файла в Workshop.
Чтобы увидеть свой предмет после загрузки, внизу нажмите VIEW ONLINE.
Проводится такая же процедура, как и при создании скина, но вы можете заметить, что в настройках Вашего скина(файл meta) Item ID не равен нулю, тоесть Ваш предмет уже загружен в Steam Workshop и имеет свой уникальный идентификатор. Поэтому, его менять не нужно.
После всех настроек Вашего предмета в Steam Workshop его страница должна выгладеть примерно так(показываю на примере своего предмета):
Прочитали до конца? Потратьте еще минутку и поставьте оценку
Пробуем делать web-frontend на Rust (WebAssembly)
Недавно вышла новость про то, что webassembly теперь включен в firefox 52 из коробки. А потом еще и chrome 57 подтянулся (правда, там вроде бы были какие-то баги с запуском). Я решил, что обязательно надо попробовать.
Для тех, кто не знает, что такое webassembly краткая информация: webassembly (или wasm) — это низкоуровневый язык, который понимают браузеры, и в который можно будет скомпилировать программы, написанные на популярных языках. Это гораздо более выгодно по скорости парсинга и выполнения, чем компилировать эти языки в чистый javascript или какой-нибудь asm.js.
Wasm задумывался в основном для c/c++, но, на удивление, уже все готово, чтобы скомпилировать программу на rust. Давайте сделаем небольшое приложение и посмотрим, что получится. Все это будем компилировать на Ubuntu. Без теоретических деталей, просто «пощупаем».
Устанавливаем Rust и emscripten SDK
Для начала нам понадобится rustup. Это инструмент для установки как самого rust компилятора, так и других вещей из rust мира.
При установке в ваш
Теперь нам надо добавить нужный target
emscripten — это такой LLVM-to-javascript компилятор. Также умеет генерить и wasm. (Как известно, Rust использует llvm).
Далее надо это дело скомпилировать. Предупреждаю, это может занять пару часов, причем с диким выжиранием процессора и памяти.
Rust sdk что это
Недавно вышла новость про то, что webassembly теперь включен в firefox 52 из коробки. А потом еще и chrome 57 подтянулся (правда, там вроде бы были какие-то баги с запуском). Я решил, что обязательно надо попробовать.
Для тех, кто не знает, что такое webassembly краткая информация: webassembly (или wasm) — это низкоуровневый язык, который понимают браузеры, и в который можно будет скомпилировать программы, написанные на популярных языках. Это гораздо более выгодно по скорости парсинга и выполнения, чем компилировать эти языки в чистый javascript или какой-нибудь asm.js.
Wasm задумывался в основном для c/c++, но, на удивление, уже все готово, чтобы скомпилировать программу на rust. Давайте сделаем небольшое приложение и посмотрим, что получится. Все это будем компилировать на Ubuntu. Без теоретических деталей, просто «пощупаем».
Пробуем ручками
Ну что же, напоследок осталось написать простенькую программку, типа этого:
И начать её компилировать, только показывая все внутренности. Для начала есть замечательная опция компилятора, которая работает на любой версии:
Значит, запуская компиляцию следующим образом:
Мы получаем на выходе мириады различных форматов, включая сгенерированный ассемблеровский код, байткод и IR для LLVM, и даже челвоеко-читаемый MIR.
А если у вас есть nightly компилятор, то вы можете запустить
И полюбоваться вашим HIR, в то время как
Даст вам возможность посмотреть на то, как выглядит AST.
Шаг восьмой: rustc_mir и rustc_mir_build
Теперь наш HIR можно преобразовать в MIR. Берём ранее созданный TyCtxt и начинаем преобразовывать его в
И так далее по всем нодам. MIR это намного более генерализированная версия HIR. Она очень близка к тому что требует от нас LLVM для компиляции. В результате этой генерализации мы можем намного более эффективно работать над оптимизацией написанного вами кода и заниматься проверками заимствований и оптимизацией.
Шаг девятый: Проверка заимствования
Самая «страшная» функция rust это всем известный borrow cheker. Сам он живёт в
Как сделать свой скин для Steam Workshop / Workshop Skins
Видео по созданию новых объектов.
Hello, world
Сделаем простенький хелловорлд на расте
Запустив в браузере (лучше в firefox) http://localhost:8000/hello.html вы увидите в консоли надпись «Hello, world!».
Шаг шестой: rustc-middle
Этим как раз и занимается rustc-middle. Вернее, не только этим. Залезаем в исходники и видим что тут у нас есть HIR, MIR и Types.
Здесь весь синтаксический сахар растворяется в чае и перестаёт быть сахаром. Так моя любимая for node in data превращается в
С HIR теперь можно работать…
Устанавливаем Rust и emscripten SDK
Для начала нам понадобится rustup. Это инструмент для установки как самого rust компилятора, так и других вещей из rust мира.
При установке в ваш
Теперь нам надо добавить нужный target
emscripten — это такой LLVM-to-javascript компилятор. Также умеет генерить и wasm. (Как известно, Rust использует llvm).
Далее надо это дело скомпилировать. Предупреждаю, это может занять пару часов, причем с диким выжиранием процессора и памяти.
Выводы и перспективы
Понятно, что сейчас всё сырое, неудобное и с багами, но у webassembly несомненно большое будущее. Всё, что требует сложных вычислений, можно будет перенести из javascript на wasm. Появятся тяжелые программы в вебе, о которых мы сейчас и мечтать не можем. Навороченные игры? Обработка видео и звука? Кто знает.
Куча библиотек на c, c++, rust и т.д. будет перенесена на веб в виде wasm-модулей.
Появились энтузиасты, которые хотят ускорить reactjs засчет rust и wasm (ссылка).
Появится закрытый проприетарный код. Если js, пропущенный через uglifyjs еще как-то можно читать, то c wasm это будет сделать гораздо сложнее.
Шаг второй: rustc-driver
Ладно, всё выглядит слишком уж просто. Погружаемся дальше. rustc тянет за собой rustc-driver. Ныряем туда.
Тут мы найдём небольшой readme, который расскажет нам о том, что компилятора в самом драйвере мы не найдём. Эта программа собирает конфигурацию из аргументов и запускает сам процесс компиляции из других крейтов. После изучения исходников находим функцию для запуска процесса компиляции.
Да, в этом крейте файлов не так-то много, но что бы тут не творилось, на самом деле всё сводится к вызову методов в крейте под названием interface. Вышеприведённый код это и показывает. interface::run_compiler и поехали.
Что же произошло в rustc-driver? Мы собрали все конфиги. Подгрузили все файлы и нашли их местоположение в файловой системе. Создали замыкание, которое следит за процессом компиляции и запускает линкер после успешной компиляции. Запустили линтеры (если такие имелись) и приготовили сам компилятор к запуску. Давайте запускать.
Напоследок
Понятно? Ну и хорошо.
Шаг пятый: rustc-expand
В результате работы парсера мы получаем наш самый великий и могучий AST.
Всё это создаётся огромным макросом astfragments! в \compiler\rustcexpand\src\expand.rs
AST используется для дальнейшей генерации кода и приведения его в нужный вид. Про это можно писать отдельную книгу. Но мы пока удовольствуемся там, что AST можно разобрать до HIR.
Пробуем делать web-frontend на Rust (WebAssembly)
Недавно вышла новость про то, что webassembly теперь включен в firefox 52 из коробки. А потом еще и chrome 57 подтянулся (правда, там вроде бы были какие-то баги с запуском). Я решил, что обязательно надо попробовать.
Для тех, кто не знает, что такое webassembly краткая информация: webassembly (или wasm) — это низкоуровневый язык, который понимают браузеры, и в который можно будет скомпилировать программы, написанные на популярных языках. Это гораздо более выгодно по скорости парсинга и выполнения, чем компилировать эти языки в чистый javascript или какой-нибудь asm.js.
Wasm задумывался в основном для c/c++, но, на удивление, уже все готово, чтобы скомпилировать программу на rust. Давайте сделаем небольшое приложение и посмотрим, что получится. Все это будем компилировать на Ubuntu. Без теоретических деталей, просто «пощупаем».
Выводы и перспективы
Понятно, что сейчас всё сырое, неудобное и с багами, но у webassembly несомненно большое будущее. Всё, что требует сложных вычислений, можно будет перенести из javascript на wasm. Появятся тяжелые программы в вебе, о которых мы сейчас и мечтать не можем. Навороченные игры? Обработка видео и звука? Кто знает.
Куча библиотек на c, c++, rust и т.д. будет перенесена на веб в виде wasm-модулей.
Появились энтузиасты, которые хотят ускорить reactjs засчет rust и wasm (ссылка).
Появится закрытый проприетарный код. Если js, пропущенный через uglifyjs еще как-то можно читать, то c wasm это будет сделать гораздо сложнее.
Шаг седьмой: rustc_ty
Последняя тянется через весь процесс компиляции.
Файл просто огромный. Нам надо вычислить типы каждой переменной, замыкания и трейта. Сам модуль занимает более 3000 строк, не считая остальные файлы в директории.
Кстати, смотрим в rust-master\compiler\rustc_typeck\src\check\expr.rs
Компилируем и запускаем:
Пасхалки они выглядят именно вот так.
Так, вычислили типы и теперь можем проверить что никто не пытается запихнуть строку в Int. Хорошо. Можно идти дальше.
Hello, world
Сделаем простенький хелловорлд на расте
Запустив в браузере (лучше в firefox) http://localhost:8000/hello.html вы увидите в консоли надпись «Hello, world!».
Шаг четвёртый: rustc-parse и rustc-lexer
Далее по тексту вы найдёте простую логику всех этих запросов. «Простая» логика заключается в вызове крейтов, которые её обрабатывают. Например, rustc-parse. Это крейт, который использует rustc-lexer. Лексер читает строки из файлов и преобразовывает их в очень простые токены. Токены передаются парсеру, который превращает их в Span и продолжает работу с кодом. Основной момент этого Span заключается в том, что к каждому элементу в дереве кода будет добавлена информация о том, в каком конкретно месте этот элемент записан в исходном файле. Когда компилятор будет сообщать об ошибке, вы увидите, где именно эта ошибка произошла.
Шаг первый: rustc
Открываем сорцы и наслаждаемся. Всё выглядит очень прилично и чисто. Тут, понятное дело, можно учиться тому как правильно разделять свой проект на куски и как правильно управлять кодом на rust. Собственно говоря, сразу понятно куда идти. Забираемся в compiler/rustc/src/main.rs и смотрим.
Всё только начинается. Держитесь.
Хм. То есть точка входа в программу просто тянет jemalloc вызовы и запускает ещё две функции. Ну вот, всё. Теперь понятно как работает компилятор rust. Делов-то! Кстати, jemalloc это специальный менеджер памяти, изначально разработанный для FreeBSD в 2005 году. Основной упор был сделан на то, чтобы избежать фрагментации памяти при работе с этим аллокатором. В оригинальной версии он просто заменяет malloc. В 2007 году Firefox начал использовать этот менеджер для снижения расхода памяти, а ещё через пару лет он попал в Facebook.
Шак одиннадцатый: прощай, rust!
Полученный оптимизированный MIR можно теперь переделать в LLVM IR. Поехали. rustc-codegen-llvm создаёт LLVM-IR на базе MIR, который мы сгенерировали на предыдущем этапе. Здесь заканчивается rust и начинается llvm. Хотя, мы ещё не закончили с сорцами компилятора.
Копаемся чуть глубже и находим rustc-target в котором видим различные дополнительные классы для работы с определённым ассемблером.
После того как кодогенерация завершена, мы можем передать IR в сам LLVM. rustc_llvm нам в помощь.
Вот, собственно говоря, и всё, ребята! LLVM за пределами нашей видимости. На моей операционной системе Visual Studio Build Tools берут на себя контроль и перегоняют LLVMIR в обычный бинарник.
Он парсится из текста в AST.
AST обрабатывается и оптимизируется в HIR
HIR обрабатывается и оптимизируется в MIR.
MIR делает проверки заимствования и оптимизацию и перегоняется в LLVMIR.
LLVMIR компилируется на конечной платформе.
Начало
Поехали. Мы будем лезть нашими ручками в сам компилятор и смотреть на его исходники. Для начала нам понадобятся кое-какие инструменты. Ставим чистую виртуальную машину с Windows 10. Идём в интернеты и льём следующее:
Сорцы компилятора. Достаются с github. Можно лить просто zip, ибо обратно коммитить мы ничего не будем.
Установщик компилятора. Любая свежая стабильная версия подойдёт.
Guide to Rustc Development. Инструкция по разработке компилятора. 460 страниц. Не хило. Сохраняем pdf.
Ну и хорошо. Этого, для начала достаточно. Отключаемся от проводного интернета, хватаем ноутбук и идём на веранду, сидеть и погружаться. Начинаем погружаться, понимаем что будет глупо говорить о компиляторе, если мы не скомпилируем хоть что-то. Ок, так и сделаем.
Ок, это было просто. Но мы не будем использовать cargo для самой компиляции. Используем компилятор напрямую. Но я же на надо cargo издеваюсь, так ведь?
Отступление по теме
Как не надо устанавливать rust
Чего? Так, сам по себе компилятор всё собрал, но ругается на отсутствие линкера. От жеж, зараза. То есть, линкер ему нужен внешний. Ругаемся на компилятор, встаём с удобного кресла и идём обратно, подключаться к проводному интернету, потому что палить 5 гигов установщика Visual Studio Build Tools не хочется на хотспоте.
Билдим всё ещё раз и смотрим.
Ширина и жирина файлов.
Ах, ты, ржавая банка! Какого чёрта?? Я уже как две недели рассказываю всем обитателям Хабра о том, какой ты прекрасный компилятор, и как хорошо ты собираешь минимальные бинарники, а ты. 150 килобайт исполняемого кода из-за одной только линии текста на экране?
Ус недоволен. На него и так уже много чего намотано, он не понимает, почему ему надо разбираться с исходниками раста теперь.
Устанавливаем Rust и emscripten SDK
Для начала нам понадобится rustup. Это инструмент для установки как самого rust компилятора, так и других вещей из rust мира.
При установке в ваш
Теперь нам надо добавить нужный target
emscripten — это такой LLVM-to-javascript компилятор. Также умеет генерить и wasm. (Как известно, Rust использует llvm).
Далее надо это дело скомпилировать. Предупреждаю, это может занять пару часов, причем с диким выжиранием процессора и памяти.
Погружаемся в логово ржавчины. Как работает компилятор rust
В моей предыдущей статье о rust я попытался рассказать об истории языка, и показать откуда он пришёл. В статье было сделано множество упрощений. Просто нереальное множество. Народу не понравилось. Но в опросе, в конце статьи вы сказали, что надо бы показать кишки компилятора. Ну что же, под катом вы найдёте разбор исходных кодов компилятора rust. Мы проследим путь программы, начиная из исходного файла, прямиком к бинарнику.
Доступ к DOM
Консоль — это здорово, но хотелось бы что-то на странице отобразить, для этого нужны какие-то функции работы с DOM. Сначала я зарылся в мозгодробительную документацию, но потом выяснил, что всё уже написано до нас. Есть библиотека webplatform, которая предоставляет какие-то базовые вещи для работы с DOM.
Перепишем нашу программу:
Весь проект можете посмотреть на github
Собрать его можно так:
(Я не особо знаток раста, так что если это можно сделать в одну команду cargo, подскажите плиз).
Потом запускаем наш питон-сервер
Скомпилированные файлы и hello.html тоже лежат в репозитории, так что вы можете просто пощупать результат у себя, не заморачиваясь с компиляцией.
Доступ к DOM
Консоль — это здорово, но хотелось бы что-то на странице отобразить, для этого нужны какие-то функции работы с DOM. Сначала я зарылся в мозгодробительную документацию, но потом выяснил, что всё уже написано до нас. Есть библиотека webplatform, которая предоставляет какие-то базовые вещи для работы с DOM.
Перепишем нашу программу:
Весь проект можете посмотреть на github
Собрать его можно так:
(Я не особо знаток раста, так что если это можно сделать в одну команду cargo, подскажите плиз).
Потом запускаем наш питон-сервер
Скомпилированные файлы и hello.html тоже лежат в репозитории, так что вы можете просто пощупать результат у себя, не заморачиваясь с компиляцией.
Шак третий: rustc-interface
Ага. Тут мы уже ближе к самому процессу компиляции. Все конфиги подъедены, файлы тоже замеплены. Смотрим на исходники интерфейса. Их хоть и не так-то много, но это наш центральный вокзал, где куча других крейтов собирается воедино.
Так, осматриваемся и находим
Кстати тут же, недалеко, мы можем найти настройку механизма кодогенерации.
Быстренько посмотрим на наши сорцы и увидим что у нас прямо в сорцах есть 3 различных модуля кодогенерации. Что они делают? Превращают MIR в конечный код для системы компиляции. Открываем rustc-codegen-llvm и смотрим в README:
Ок, ну тут всё понятно, мы берём MIR и переделываем его в LLVM IR. После этого LLVM может скомпилировать код в конечный бинарник. Но погодите, помимо LLVM бекенда у нас есть ещё два других! Смотрим туда. rustc-codegen-ssa согласно документации, позволяет генерировать низкоуровневый код, который не будет привязан к определённому бекэнду (например, LLVM) и позволит в дальнейшем использовать другие системы компиляции.
Собственно говоря, прямо там же вы найдёте rustc-codegen-cranelift. То есть MIR в будущем может компилироваться через cranelift, который в идеале ускорит процесс компиляции. Ну это в будущем, пока что проект в процессе тестирования и работает не лучше, чем Газель без мотора.
Открываем модуль и смотрим, что происходит внутри:
Ага, вот тут мы берём быка за рога и начинаем разбирать исходный код на части. Далее, создаём и проверяем AST
Даже если вы и поменяли что-то в каком-либо файле, то благодаря системе запросов вы сможете избежать ненужной перекомпиляции. Что если вы изменили только одну линию в комментариях к файлу? Пересобирать такой не придётся.
Давайте посмотрим на запросы, которые создаёт компилятор:
В итоге у нас на выходе получается большая и толстая структура:
И как раз её можно дёргать для выполнения необходимых запросов.
Шаг десятый: Оптимизации
Постскриптум
Словарь
ICE (Internal compiler error), ошибка компилятора.
Дальнейший текст подразумевает, что вы умеете программировать. Можно и не на rust.
dapr / rust-sdk Go PK Goto Github PK
License: MIT License
Rust 89.88% Shell 10.12%
rust-sdk’s Introduction
Dapr is a portable, event-driven, serverless runtime for building distributed applications across cloud and edge.
A client can be created as follows:
Note: The proto buf client generation is built into cargo build process so updating the proto files under dapr/ is enough to update the proto buf client.
Contributors
Stargazers
Watchers
Forkers
rust-sdk’s Issues
Replace deprecated cli options
update proto to the latest
update proto to the latest
Dapr Actor support?
Will it be supported?
Protobuf client update
Describe the proposal
This is to update protobuf client along with dapr/dapr#1409
Handle the logic to retry until grpc port is assigned to daprd
Right now we have to introduce some delay in clients so that a grpc port is assigned to daprd before the client tries to make a connection. The logic to handle this issue needs to be handled in the sdk instead.
Logs for this issue when delay is not introduced in client:
Clarify «WIP» Status
I considered starting work on a Dapr SDK, but was positively surprised to see an official one already in the works.
Could you update the README with some information on the current state of this project?
As in: why is it WIP, what is supported, what isn’t yet, etc.
State APIs should support sending metadata
State APIs should support sending metadata in the request.
Create Cargo package
Create a Cargo package to publish the SDK with
add support for statestore query API
This feature is implemented in dapr runtime: dapr/dapr#3662
It should be available via the SDK
Use Client in an async fashion
I simply want to create a client and pass it to a number of threads to do a publish_event (just looking at throughput). No matter how I try to move, clone, copy Client into another thread, it fails in various ways. Any thoughts on how to accomplish? Here is some example code you can beat up:
What is the DAPR_GRPC_PORT variable supposed to be?
Running this on an R-Pi4.
For this line of code in publisher.rs
I have no environmental variable for this?
Support domain socket
Describe the proposal
Release Note
RELEASE NOTE: ADD support domain socket.
Update proto for 0.10.0 and support multi pubsub
failed to build dapr v0.5.0 in rust-1.53.0-nightly
error: failed to run custom build command for dapr v0.5.0
Caused by:
process didn’t exit successfully:
error: the ‘rustfmt’ component which provides the command ‘rustfmt’ is not available for the ‘nightly-x86_64-unknown-linux-gnu’ toolchain
Update rust sdk for multi store feature
Update rust sdk for multi store feature
Code examples on how to use Rust SDK with each supported building block
Consider adding examples in the Github repo (maybe as a README?) on how to use the Rust SDK for each of the supported Building Blocks, e.g how to use the Rust SDK for Service Invocation.
These examples will provide clarity on how to use the SDK. Additionally, we can raise visibility into the SDK by linking to the examples from each Building Block overview page.
Update proto files for 0.8.0 release
Update proto files for 0.8.0 release
Automate cargo package publish process
Automate cargo package publish process
Update gRPC proto to 0.5.0 version
Update gRPC proto to 0.5.0 version
Add instructions how to get proto files into rust-sdk
Add instructions how to get proto files into rust-sdk
update proto files for 0.11.0
update proto files for 0.11.0
Add support for ISO 8601 intervals
Describe the proposal
Runtime has added support for ISO 8601 intervals for reminders as per dapr/dapr#2513.
Make changes to SDK to support accordingly
Add Pubsub example
This is the create pubsub sample.
Remove proto files from the repo
remove proto files from the repo, instead use from dapr/dapr repo.
Recommend Projects
A declarative, efficient, and flexible JavaScript library for building user interfaces.
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
TensorFlow
An Open Source Machine Learning Framework for Everyone
Django
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
Recommend Topics
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
server
A server is a program made to process requests and deliver data to clients.
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Visualization
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
Recently View Projects
rust-sdk
WLAN-Attendance-Marker
Android Open Source application to poll attendance in classes/lecture halls using WLAN
scrcpy
Display and control your Android device
diff_match_patch
C++11 port of the Diff, Match and Patch libraries for Plain Text.
Proffy
Application built to connect professors and students.