Блоги Virtuos86
Mon, 13 Nov 2017 11:51:46 +0300Mon, 13 Nov 2017 11:51:46 +0300
У меня есть две новости, плохая и хорошая. Но поскольку вас их эмоциональная окраска не касается, то начну с любой.
Я нашел причину падений своей игры. А вот и виновник торжества:
pub fn GenerateMonsters() {
let mut v = vec!();
for mt in MonsterTypes.iter() {
if (mt.Level == unsafe {map::CUR_MAP as u32}) && map::random(0, 6) == 0 { // проблемная строчка
v.push(*mt);
};
}
for i in 0..MaxMonsters - 1 {
let mut m: TMonster = v;
let (x, y) = map::FreeMapPoint(get_ref_curmap!());
m.x = x;
m.y = y;
unsafe { MONSTERS = m; }
}
}
Как говорится в одном старом анекдоте, \"на третий день томящийся в плену индеец Зоркий Глаз заметил, что в сарае, куда его заперли, нет одной стены\". Суть в том, что условие \"map::random(0, 6) == 0\" с вероятностью 5/6 не выполнится ни для одного \"mt\", а значит массив \"v\" останется пустым. А потом я передаю в функцию по сути два нуля, потому что длина пустого массива равна нулю: \"map::random(0, v.len())\"
Функция \"random\" определена так:
pub fn random(start: usize, end: usize) -> usize {
use rand::{thread_rng, sample};
if end
Virtuos86
У меня есть две новости, плохая и хорошая. Но поскольку вас их эмоциональная окраска не касается, то начну с любой.Я нашел причину падений [...]
читать описание
1773
Комментарии: 0
Вот. Одна беда — мне надо для ST3, а для него темы это целые пакеты с ресурсами, а здесь можно скачать только голый XML-документ. Зато реально [...]
читать описание
2436
Комментарии: 0
Блоги Virtuos86
Sun, 12 Nov 2017 14:11:19 +0300Sun, 12 Nov 2017 14:11:19 +0300
Здравствуйте.
Я пишу код на Rust, используя некогда хипстерский редактор Sublime Text, в данный момент плавно переполз на 3-ю версию со 2-ой. Теперь на звание хипстерских поделок претендуют поделки на базе Electron типа VSCode и Atom, а юзеры "саблайма" благополучно перешли в разряд степенных, не бегущих за меняющейся модой серьезных людей .
Работать с Rust кодом помогает плагин `Rust Enhanced`. Помимо надоедливой проверки корректности кода, которая поглощает мои нервные клетки с аппетитом голодной гиены — потому что я обычный быдлокодер, а Rust — очень сложный для нашей братии, — так вот, помимо этого плагин предоставляет несколько режимов для сборки готового кода, от обычной компиляции до запуска тестов/бенчмарков/сборки документации/приготовления кофе/и чего-то ещё.
Но! Но я столкнулся с тем, что при неудачной сборке получаю слишком мало деталей и подробностей. По счастью, `rustc` очень дружелюбный и посоветовал мне использовать ключ `--verbose` для сборки.
Вывод ясен — нужен свой сборочный сценарий. Сказано — сделано.
Выбираем в панели меню пункт `Tools`. Далее `Build System` -> `New Build System...`
Открывается новая вкладка редактора с заготовкой:
{
"shell_cmd": "make"
}
Изменяем на:
{
"shell_cmd": "RUST_BACKTRACE=1 cargo run --verbose"
}
Дальше сохраняем:
Теперь идем по знакомому пути `Tools` -> `Build System` и выбираем свою систему сборки вместо `RustEnhanced`. Теперь в случае проблемной компиляции можно будет увидеть необходимые подробности.
Спасибо за внимание.
Virtuos86
Здравствуйте.
Я пишу код на Rust, используя некогда хипстерский редактор Sublime Text, в данный момент плавно переполз на 3-ю версию со 2-ой. Теперь [...]
читать описание
3056
Комментарии: 1
Блоги Virtuos86
Tue, 07 Nov 2017 14:09:14 +0300Tue, 07 Nov 2017 14:09:14 +0300
У меня наметилась лишняя неделя безработицы недавно, поэтому устав пялиться в Веб 2.0, я внезапно вспомнил, что программист. Открыл проект игры-"рогалика" на великом и могучем языке программирования Rust, с которым я еще месяц назад носился, как с писанной торбой (с проектом, в смысле), но отложил по паре причин. Из которых первой является то досадное обстоятельство, что библиотека "cursive", которую я выбрал для реализации TUI (консольного интерфейса) игры, не предоставляет на данный момент возможностей раскрашивать произвольные участки текста в текстовых лайотах произвольным же образом. Только моноцвет. А как я по-вашему должен разнообразить вид стены символьных закорючек, в которых пылкое воображение игромана должно разглядеть героев и чудовищ, оружие и злато, степи, стены и леса? Никак.
Вторым же и куда более неприятным затруднением явилась регрессия, наметившаяся в кодовой базе. А если просто, по пацаночке, то игра стала падать при определенных действиях. А значит, надо дебажить.
В общем, долго ли, коротко, а несколько дней назад я открыл проект, окинул горделивым взором килобайты вершины погромистской деятельности своей, потом переключился в "полуночный командир", которым я по недоразумению пользуюсь как файловым менеджером на линуксе, запустил свою игрулю и убедился, что она падает столь же исправно.
Погрустив с минутку, я было ринулся расставлять println'ы aka отладочную печать, а потом подумал, что было бы неплохо использовать такую штуку из Python мира, как декораторы, для облегчения своей доли. То бишь повесил на нужную функцию декоратор, реализующий отладочную печать, скажем, при установленном флаге "DEBUG = true;" при вызове обернутой им функции, и всё, не надо добавлять строчки с принтами, а потом их удалять, когда будут не нужны. К тому же Rust это язык со статической типизацией, а значит, можно сделать так, чтобы декораторы навешивались при включенном флаге отладки во время компилирования, то есть с минимальным оверхедом.
Ребят, если бы я знал, в какую жопу лезу, я бы передумал. Вот я отвечаю.
Но, но, но. Я всё-таки это сделал и сделал, надеюсь хорошо. Поэтому горд неимоверно. И ничего страшного, что на Python декораторы реализуются за 5 минут, просто потому что они уже фактически доступны искаропки, благодаря возможностям языка, а я потратил 5 дней, сражаясь аки лев с конпелятором Rust, и исписав двести строк программного кода (в основном там разбор AST определения функции).
Конечно, пока реализованы не все возможности питоньих декораторов, например, декораторы с добавочными аргументами или декораторы структур и типажей (хотя тут подозреваю, я надорвусь, если возьмусь делать). Но основа: взять функцию и подменить ее обёрткой, — сделана, и этим можно пользоваться. А вот и ссылка на репозиторий: https://github.com/Virtuos86/rust-decorators
А теперь можно и приступить к отладке "рогалика". О боже, дай мне сил…
Virtuos86
У меня наметилась лишняя неделя безработицы недавно, поэтому устав пялиться в Веб 2.0, я внезапно вспомнил, что программист. Открыл проект [...]
читать описание
2665
Комментарии: 1
Блоги Virtuos86
Mon, 16 Oct 2017 09:57:09 +0300Mon, 16 Oct 2017 09:57:09 +0300
Я на время оставил Rust и погрузился в таинство создания Web Extensions под новые версии Firefox. Как известно (мне), Mozilla собралась закопать XUL и старого Файерфокса скоро не станет. Вместе с этим перестанут работать тонны аддонов, которыми, собственно, и был славен этот браузер. Кто-то уже приготовился закапывать "лису", прогнозируя потерю пользовательской базы, но проблема в том, что адекватной замены старым возможностям кастомизируемости среди других популярных браузеров нет, поэтому и бежать особо некуда. Я же бегать не люблю и уже имею в своем активе 2 простеньких (по возможностям, а не по усилиям затраченным на их написание и особенно отладку) дополнения, и одно портированное с Chrome дополнение, которое добавляет определенные приятности в UX. Все эти дополнения предназначены для работы на сайте linux.org.ru, LOR, "информационного ресурса об операционной системе Linux в России".
Что я могу сказать о своих впечатлениях?
Во-первых, оказалось, что когда всю жизнь пишешь синхронный последовательный код, отслеживать и представлять мысленно логику потока исполнения программы, сталкиваясь с асинхронным кодом, не то, чтобы трудно, но приходится ломать шаблоны алгоритмического мышления. Я лично наломал столько шаблонов, что ого-го! Го.
Во-вторых, документация на https://developer.mozilla.org/en-US/Add-ons/WebExtensions достаточно хороша, но некоторые нюансы приходится постигать пошастав по коллекции готовых дополнений, https://github.com/mdn/webextensions-examples (вот она действительно хороша), а некоторые и вовсе после несколькичасового б(з)дения над вроде как рабочим кодом (ну вот, всё по документации делаю, даже код только скопировал и чуть-чуть изменил, что надо-то, а?!). Тем не менее, что хотел, то сделал, а значит я молодец делать дела с Web Extension API можно. Кстати, благодаря тому, что Chrome также поддерживает Web Extension API, как и Opera (строго говоря, в документации для многого прямо указано, что это скопировано с Chrome API), если у вас есть на примете дополнения с Хрома, которые вы бы хотели перетащить в Огнелис, то вероятно это вполне осуществимая затея.
Virtuos86
Я на время оставил Rust и погрузился в таинство создания Web Extensions под новые версии Firefox. Как известно (мне), Mozilla собралась закопать XUL и старого [...]
читать описание
2261
Комментарии: 3
Блоги Virtuos86
Thu, 12 Oct 2017 13:58:02 +0300Thu, 12 Oct 2017 13:58:02 +0300
Как для скриптокодера для меня многое в диковинку в практике программирования на ЯП со статической типизацией. Так меня осенило как-то, что переменные, которые используются в основном для индексации векторов и массивов имеет смысл иметь тип \"usize\". До этого я ничтоже сумняшеся инициализировал их дефолтным числовым типом \"i32\". Ну а что, удобно же (в Rust если у числа не указан тип, оно по умолчанию относится к типу \"i32\").
Юмор в том, что \"i32\" это знаковый тип с диапазоном значений от -128 до 127, а индексы в Rust должны быть исключительно положительными. Когда я осознал эту нелепость, я сначала перевел переменные-индексы на использование типа \"u32\", беззнаковых 32-х битных целых. Но здесь вступает другой нюанс. Rust для операции индексации использует значения типа \"usize\". Этот тип платформозависим: на 32-х битных ОС он является аналогом типа \"u32\", на 64-х битных — аналогом типа \"u64\". Это логично, давать возможность использовать максимально большое число для индексации. Rust в операции индексации не приводит автоматически индексы к типу \"usize\", поэтому нужно это делать вручную, что выглядит как:
let v = vec!;
println!(\"{}\", v);
Примечание: если в качестве индекса используется числовой литерал без указания типа, то Rust скомпилирует код, но для его корректности тип литерала выведется как \"usize\", хотя, как я уже отметил выше, по дефолту числовые литералы без указания типа относятся к типу \"i32\":
fn main() {
let index = 1; // при компиляции эта строка будет, условно говоря заменена на \"let index: usize = 1\" или \"let index = 1usize\"
let item = vec!;
println!(\"{:?}\", item);
}
В результате мой код пестрел \"as usize\"-ами. Заменил \"u32\" на \"usize\", стало хорошо. Ну и да, подозреваю, что используй я \"Clippy\", инструмент проверяющий Rust код на наличие \"вредных привычек\" и глупостей, он вероятно обратил бы мое внимание на этот факт.
Virtuos86
Как для скриптокодера для меня многое в диковинку в практике программирования на ЯП со статической типизацией. Так меня осенило как-то, что [...]
читать описание
2294
Комментарии: 0
Блоги Virtuos86
Thu, 12 Oct 2017 13:14:30 +0300Thu, 12 Oct 2017 13:14:30 +0300
Я с недавних пор начал изучать язык программирования Rust. Хотелось завести отдельный блог для того, чтобы описывать свои злоключения (а их хватает), но в этом вашем 2017-ом не найти нормальной популярной блогоплатформы с возможностью постинга исходного кода, везде надо прикручивать что-то с помощью изоленты и мастерить из г-на и палок, а кое-где и палок-то нет, поэтому остается одно ..., но не будем о грустном.
Посему я принял нелегкое решение продолжать откапывать стюардессу (вы же знаете этот анекдот?) и писать в свой тутошный бложик. Время творить историю.
P.S. Здешние блоги тоже так себе, и весьма, но что поделать.
Virtuos86
Я с недавних пор начал изучать язык программирования Rust. Хотелось завести отдельный блог для того, чтобы описывать свои злоключения (а их [...]
читать описание
2024
Комментарии: 0
Блоги Virtuos86
Sat, 18 Mar 2017 08:24:15 +0300Sat, 18 Mar 2017 08:24:15 +0300
В то время, как на дворе 2017-ый год, я с болью в своем многострадальном сердце вынужден констатировать, что под мобильные устройства по-прежнему очень сложно писать продвинутые приложения, использующие в качестве основного рабочего пространства текстовый виджет, поддерживающий редактирование. А я такие попытки делаю при знакомстве с любым новым инструментом уже почти добрый десяток лет. Везде вылезают ограничения или ограниченная функциональность. Не крик души, конечно, эта жалоба, но накипело.
Как видите, я обещал еще один пост в этом году — я сделал. Что ни говори, большой души человек. Но в этот раз ничего не обещаю.
Virtuos86
В то время, как на дворе 2017-ый год, я с болью в своем многострадальном сердце вынужден констатировать, что под мобильные устройства по-прежнему [...]
читать описание
1468
Комментарии: 0
Блоги Virtuos86
Sat, 18 Mar 2017 08:24:11 +0300Sat, 18 Mar 2017 08:24:11 +0300
В то время, как на дворе 2017-ый год, я с болью в своем многострадальном сердце вынужден констатировать, что под мобильные устройства по-прежнему очень сложно писать продвинутые приложения, использующие в качестве основного рабочего пространства текстовый виджет, поддерживающий редактирование. А я такие попытки делаю при знакомстве с любым новым инструментом уже почти добрый десяток лет. Везде вылезают ограничения или ограниченная функциональность. Не крик души, конечно, эта жалоба, но накипело.
Как видите, я обещал еще один пост в этом году — я сделал. Что ни говори, большой души человек. Но в этот раз ничего не обещаю.
Virtuos86
В то время, как на дворе 2017-ый год, я с болью в своем многострадальном сердце вынужден констатировать, что под мобильные устройства по-прежнему [...]
читать описание
1677
Комментарии: 1
Блоги Virtuos86
Mon, 26 Sep 2016 19:19:58 +0300Mon, 26 Sep 2016 19:19:58 +0300
Привет всем! Я как обычно пишу о том, что интересно мне и еще полутора калекам, но делаю это достаточно забавно, так что, если даже вы не из их числа, возможно, вы найдете что-то интересное для себя, кроме того факта, что в Блогосфере появилась запись раз в полгода.
Как известно каждому уважающему меня человеку, я охладел к использованию Python на смартфоне в качестве годного инструмента прикладного программирования в пользу такой замечательной штуки, как DroidScript. Если вы не знаете что это, то посетите его страничку в Google Play Market и наш кружок юных погромистов-любителей здесь на DV, где до сих пор с переменным успехом теплится тусовка мобильных программистов былинных времен.
Но давайте поближе к стремительно хладеющему телу этого поста.
Поскольку даже самые упоротые фанаты программирования на телефоне признали, что удобнее под него разрабатывать на компьютере, то спешу вас обрадовать: в составе DroidScript из коробки ни много, ни мало WiFi Web Editor (с претензией — впрочем, малообоснованной — на IDE)! Как заметно из названия, предполагается, что телефон будет подключен к компьютеру посредством вайфая. Но у меня его нет. Ситуация осложнялась тем, что я использую Linux Mint как операционную систему. Поэтому я обратился за помощью на форум DroidScript. И один добрый человек мне помог. Привожу его хэлп в неизменном (и непереведенном, я же знаю, что вы все сильны в языках) виде.
Warren Downs
Virtuos86, what Linux distribution do you use? Both WIndows and Desktop-oriented Linux distributions like Ubuntu will automatically treat the Android device as a network connection, if it is plugged in via USB as a \"Media Device\" and you use Android\'s USB tethering mode. Then you don\'t need to mess with ADB settings on Linux (or Windows). But you do still have to check \"Use ADB\" in the DroidScript settings, and connect from a Linux browser to the router address assigned, port 8088.
If you already have ADB set up that may be easier for you, but if not, try the following (Detailed instructions):
1. Plug in Android device to Linux computer via USB.
2. Make sure Media Device is the mode being used.
3. In Android Settings | Wireless and Networks | Tethering & Portable Hotspot, check \"USB tethering\".
4. In Linux, at the command line, type \"route -n\' and you should see a new gateway listed, for example \"192.168.42.129\". This is the address of the Android device as seen from Linux. (It should stay the same every time you plug in).
5. In Android, start DroidScript, go to Settings, and check \"Use ADB\".
6. Also in DroidScript, click the \"up\" arrow to the left of the Droid icon. An \"ADB Connect\" dialog should appear and tell you to navigate to 127.0.0.1:8088 in a browser. You could do that using ADB, but since we\'re using USB tethering, you can instead:
5. In a Linux browser, navigate to https://192.168.42.129:8088 (or whatever address you saw for the gateway in step #4).
Я использовал эти прекрасную подробную инструкцию, и у меня всё заработало. Особенно удобно, что благодаря root и GravityBox, у меня в \"шторке\" есть \"плитка\" для включения \"USB tethering\". Подключил телефон к ЭВМ, тыкнул \"плитку\" (телефон по дефолту настроен на подключение как MTP устройство) и обновил закрепленную вкладку в браузере, — всё, можно творить! Хотя, давайте будем честными, программировать что-то полезное — значит, 99.9% времени отлаживать программу и искать баги, а это очень нервное и нервное дело (забыл еще добавить, что оно нервное).
Оставайтесь на связи, обещаю еще одну запись в этом году или в следующем! Ну, на такой мажорной ноте не грех и попрощаться.
Virtuos86
Привет всем! Я как обычно пишу о том, что интересно мне и еще полутора калекам, но делаю это достаточно забавно, так что, если даже вы не из их [...]
читать описание
3760
Комментарии: 0
Блоги Virtuos86
Я нашел причину падений своей игры. А вот и виновник торжества:
pub fn GenerateMonsters() {
let mut v = vec!();
for mt in MonsterTypes.iter() {
if (mt.Level == unsafe {map::CUR_MAP as u32}) && map::random(0, 6) == 0 { // проблемная строчка
v.push(*mt);
};
}
for i in 0..MaxMonsters - 1 {
let mut m: TMonster = v;
let (x, y) = map::FreeMapPoint(get_ref_curmap!());
m.x = x;
m.y = y;
unsafe { MONSTERS = m; }
}
}
Как говорится в одном старом анекдоте, \"на третий день томящийся в плену индеец Зоркий Глаз заметил, что в сарае, куда его заперли, нет одной стены\". Суть в том, что условие \"map::random(0, 6) == 0\" с вероятностью 5/6 не выполнится ни для одного \"mt\", а значит массив \"v\" останется пустым. А потом я передаю в функцию по сути два нуля, потому что длина пустого массива равна нулю: \"map::random(0, v.len())\"
Функция \"random\" определена так:
pub fn random(start: usize, end: usize) -> usize {
use rand::{thread_rng, sample};
if end
Virtuos86
У меня есть две новости, плохая и хорошая. Но поскольку вас их эмоциональная окраска не касается, то начну с любой.Я нашел причину падений [...] читать описание
1773
Вот. Одна беда — мне надо для ST3, а для него темы это целые пакеты с ресурсами, а здесь можно скачать только голый XML-документ. Зато реально [...] читать описание
2436
Блоги Virtuos86
Я пишу код на Rust, используя некогда хипстерский редактор Sublime Text, в данный момент плавно переполз на 3-ю версию со 2-ой. Теперь на звание хипстерских поделок претендуют поделки на базе Electron типа VSCode и Atom, а юзеры "саблайма" благополучно перешли в разряд степенных, не бегущих за меняющейся модой серьезных людей .
Работать с Rust кодом помогает плагин `Rust Enhanced`. Помимо надоедливой проверки корректности кода, которая поглощает мои нервные клетки с аппетитом голодной гиены — потому что я обычный быдлокодер, а Rust — очень сложный для нашей братии, — так вот, помимо этого плагин предоставляет несколько режимов для сборки готового кода, от обычной компиляции до запуска тестов/бенчмарков/сборки документации/приготовления кофе/и чего-то ещё.
Но! Но я столкнулся с тем, что при неудачной сборке получаю слишком мало деталей и подробностей. По счастью, `rustc` очень дружелюбный и посоветовал мне использовать ключ `--verbose` для сборки.
Вывод ясен — нужен свой сборочный сценарий. Сказано — сделано.
Выбираем в панели меню пункт `Tools`. Далее `Build System` -> `New Build System...`
Открывается новая вкладка редактора с заготовкой:
{
"shell_cmd": "make"
}
Изменяем на:
{
"shell_cmd": "RUST_BACKTRACE=1 cargo run --verbose"
}
Дальше сохраняем:
Теперь идем по знакомому пути `Tools` -> `Build System` и выбираем свою систему сборки вместо `RustEnhanced`. Теперь в случае проблемной компиляции можно будет увидеть необходимые подробности.
Спасибо за внимание.
Virtuos86
Здравствуйте. Я пишу код на Rust, используя некогда хипстерский редактор Sublime Text, в данный момент плавно переполз на 3-ю версию со 2-ой. Теперь [...] читать описание
3056
Блоги Virtuos86
Вторым же и куда более неприятным затруднением явилась регрессия, наметившаяся в кодовой базе. А если просто, по пацаночке, то игра стала падать при определенных действиях. А значит, надо дебажить.
В общем, долго ли, коротко, а несколько дней назад я открыл проект, окинул горделивым взором килобайты вершины погромистской деятельности своей, потом переключился в "полуночный командир", которым я по недоразумению пользуюсь как файловым менеджером на линуксе, запустил свою игрулю и убедился, что она падает столь же исправно.
Погрустив с минутку, я было ринулся расставлять println'ы aka отладочную печать, а потом подумал, что было бы неплохо использовать такую штуку из Python мира, как декораторы, для облегчения своей доли. То бишь повесил на нужную функцию декоратор, реализующий отладочную печать, скажем, при установленном флаге "DEBUG = true;" при вызове обернутой им функции, и всё, не надо добавлять строчки с принтами, а потом их удалять, когда будут не нужны. К тому же Rust это язык со статической типизацией, а значит, можно сделать так, чтобы декораторы навешивались при включенном флаге отладки во время компилирования, то есть с минимальным оверхедом.
Ребят, если бы я знал, в какую жопу лезу, я бы передумал. Вот я отвечаю.
Но, но, но. Я всё-таки это сделал и сделал, надеюсь хорошо. Поэтому горд неимоверно. И ничего страшного, что на Python декораторы реализуются за 5 минут, просто потому что они уже фактически доступны искаропки, благодаря возможностям языка, а я потратил 5 дней, сражаясь аки лев с конпелятором Rust, и исписав двести строк программного кода (в основном там разбор AST определения функции).
Конечно, пока реализованы не все возможности питоньих декораторов, например, декораторы с добавочными аргументами или декораторы структур и типажей (хотя тут подозреваю, я надорвусь, если возьмусь делать). Но основа: взять функцию и подменить ее обёрткой, — сделана, и этим можно пользоваться. А вот и ссылка на репозиторий: https://github.com/Virtuos86/rust-decorators
А теперь можно и приступить к отладке "рогалика". О боже, дай мне сил…
Virtuos86
У меня наметилась лишняя неделя безработицы недавно, поэтому устав пялиться в Веб 2.0, я внезапно вспомнил, что программист. Открыл проект [...] читать описание
2665
Блоги Virtuos86
Я на время оставил Rust и погрузился в таинство создания Web Extensions под новые версии Firefox. Как известно (мне), Mozilla собралась закопать XUL и старого Файерфокса скоро не станет. Вместе с этим перестанут работать тонны аддонов, которыми, собственно, и был славен этот браузер. Кто-то уже приготовился закапывать "лису", прогнозируя потерю пользовательской базы, но проблема в том, что адекватной замены старым возможностям кастомизируемости среди других популярных браузеров нет, поэтому и бежать особо некуда. Я же бегать не люблю и уже имею в своем активе 2 простеньких (по возможностям, а не по усилиям затраченным на их написание и особенно отладку) дополнения, и одно портированное с Chrome дополнение, которое добавляет определенные приятности в UX. Все эти дополнения предназначены для работы на сайте linux.org.ru, LOR, "информационного ресурса об операционной системе Linux в России".
Что я могу сказать о своих впечатлениях?
Во-первых, оказалось, что когда всю жизнь пишешь синхронный последовательный код, отслеживать и представлять мысленно логику потока исполнения программы, сталкиваясь с асинхронным кодом, не то, чтобы трудно, но приходится ломать шаблоны алгоритмического мышления. Я лично наломал столько шаблонов, что ого-го! Го.
Во-вторых, документация на https://developer.mozilla.org/en-US/Add-ons/WebExtensions достаточно хороша, но некоторые нюансы приходится постигать пошастав по коллекции готовых дополнений, https://github.com/mdn/webextensions-examples (вот она действительно хороша), а некоторые и вовсе после несколькичасового б(з)дения над вроде как рабочим кодом (ну вот, всё по документации делаю, даже код только скопировал и чуть-чуть изменил, что надо-то, а?!). Тем не менее, что хотел, то сделал, а значит я молодец делать дела с Web Extension API можно. Кстати, благодаря тому, что Chrome также поддерживает Web Extension API, как и Opera (строго говоря, в документации для многого прямо указано, что это скопировано с Chrome API), если у вас есть на примете дополнения с Хрома, которые вы бы хотели перетащить в Огнелис, то вероятно это вполне осуществимая затея.
Virtuos86
Я на время оставил Rust и погрузился в таинство создания Web Extensions под новые версии Firefox. Как известно (мне), Mozilla собралась закопать XUL и старого [...] читать описание
2261
Блоги Virtuos86
Юмор в том, что \"i32\" это знаковый тип с диапазоном значений от -128 до 127, а индексы в Rust должны быть исключительно положительными. Когда я осознал эту нелепость, я сначала перевел переменные-индексы на использование типа \"u32\", беззнаковых 32-х битных целых. Но здесь вступает другой нюанс. Rust для операции индексации использует значения типа \"usize\". Этот тип платформозависим: на 32-х битных ОС он является аналогом типа \"u32\", на 64-х битных — аналогом типа \"u64\". Это логично, давать возможность использовать максимально большое число для индексации. Rust в операции индексации не приводит автоматически индексы к типу \"usize\", поэтому нужно это делать вручную, что выглядит как:
let v = vec!;
println!(\"{}\", v);
Примечание: если в качестве индекса используется числовой литерал без указания типа, то Rust скомпилирует код, но для его корректности тип литерала выведется как \"usize\", хотя, как я уже отметил выше, по дефолту числовые литералы без указания типа относятся к типу \"i32\":
fn main() {
let index = 1; // при компиляции эта строка будет, условно говоря заменена на \"let index: usize = 1\" или \"let index = 1usize\"
let item = vec!;
println!(\"{:?}\", item);
}
В результате мой код пестрел \"as usize\"-ами. Заменил \"u32\" на \"usize\", стало хорошо. Ну и да, подозреваю, что используй я \"Clippy\", инструмент проверяющий Rust код на наличие \"вредных привычек\" и глупостей, он вероятно обратил бы мое внимание на этот факт.
Virtuos86
Как для скриптокодера для меня многое в диковинку в практике программирования на ЯП со статической типизацией. Так меня осенило как-то, что [...] читать описание
2294
Блоги Virtuos86
Посему я принял нелегкое решение продолжать откапывать стюардессу (вы же знаете этот анекдот?) и писать в свой тутошный бложик. Время творить историю.
P.S. Здешние блоги тоже так себе, и весьма, но что поделать.
Virtuos86
Я с недавних пор начал изучать язык программирования Rust. Хотелось завести отдельный блог для того, чтобы описывать свои злоключения (а их [...] читать описание
2024
Блоги Virtuos86
Как видите, я обещал еще один пост в этом году — я сделал. Что ни говори, большой души человек. Но в этот раз ничего не обещаю.
Virtuos86
В то время, как на дворе 2017-ый год, я с болью в своем многострадальном сердце вынужден констатировать, что под мобильные устройства по-прежнему [...] читать описание
1468
Блоги Virtuos86
Как видите, я обещал еще один пост в этом году — я сделал. Что ни говори, большой души человек. Но в этот раз ничего не обещаю.
Virtuos86
В то время, как на дворе 2017-ый год, я с болью в своем многострадальном сердце вынужден констатировать, что под мобильные устройства по-прежнему [...] читать описание
1677
Блоги Virtuos86
Как известно каждому уважающему меня человеку, я охладел к использованию Python на смартфоне в качестве годного инструмента прикладного программирования в пользу такой замечательной штуки, как DroidScript. Если вы не знаете что это, то посетите его страничку в Google Play Market и наш кружок юных погромистов-любителей здесь на DV, где до сих пор с переменным успехом теплится тусовка мобильных программистов былинных времен.
Но давайте поближе к стремительно хладеющему телу этого поста.
Поскольку даже самые упоротые фанаты программирования на телефоне признали, что удобнее под него разрабатывать на компьютере, то спешу вас обрадовать: в составе DroidScript из коробки ни много, ни мало WiFi Web Editor (с претензией — впрочем, малообоснованной — на IDE)! Как заметно из названия, предполагается, что телефон будет подключен к компьютеру посредством вайфая. Но у меня его нет. Ситуация осложнялась тем, что я использую Linux Mint как операционную систему. Поэтому я обратился за помощью на форум DroidScript. И один добрый человек мне помог. Привожу его хэлп в неизменном (и непереведенном, я же знаю, что вы все сильны в языках) виде.
Warren Downs
Virtuos86, what Linux distribution do you use? Both WIndows and Desktop-oriented Linux distributions like Ubuntu will automatically treat the Android device as a network connection, if it is plugged in via USB as a \"Media Device\" and you use Android\'s USB tethering mode. Then you don\'t need to mess with ADB settings on Linux (or Windows). But you do still have to check \"Use ADB\" in the DroidScript settings, and connect from a Linux browser to the router address assigned, port 8088.
If you already have ADB set up that may be easier for you, but if not, try the following (Detailed instructions):
1. Plug in Android device to Linux computer via USB.
2. Make sure Media Device is the mode being used.
3. In Android Settings | Wireless and Networks | Tethering & Portable Hotspot, check \"USB tethering\".
4. In Linux, at the command line, type \"route -n\' and you should see a new gateway listed, for example \"192.168.42.129\". This is the address of the Android device as seen from Linux. (It should stay the same every time you plug in).
5. In Android, start DroidScript, go to Settings, and check \"Use ADB\".
6. Also in DroidScript, click the \"up\" arrow to the left of the Droid icon. An \"ADB Connect\" dialog should appear and tell you to navigate to 127.0.0.1:8088 in a browser. You could do that using ADB, but since we\'re using USB tethering, you can instead:
5. In a Linux browser, navigate to https://192.168.42.129:8088 (or whatever address you saw for the gateway in step #4).
Я использовал эти прекрасную подробную инструкцию, и у меня всё заработало. Особенно удобно, что благодаря root и GravityBox, у меня в \"шторке\" есть \"плитка\" для включения \"USB tethering\". Подключил телефон к ЭВМ, тыкнул \"плитку\" (телефон по дефолту настроен на подключение как MTP устройство) и обновил закрепленную вкладку в браузере, — всё, можно творить! Хотя, давайте будем честными, программировать что-то полезное — значит, 99.9% времени отлаживать программу и искать баги, а это очень нервное и нервное дело (забыл еще добавить, что оно нервное).
Оставайтесь на связи, обещаю еще одну запись в этом году или в следующем! Ну, на такой мажорной ноте не грех и попрощаться.
Virtuos86
Привет всем! Я как обычно пишу о том, что интересно мне и еще полутора калекам, но делаю это достаточно забавно, так что, если даже вы не из их [...] читать описание
3760
