Интересны подходы, которые нужно применять, чтобы сделать Android более динамичным. Задача не такая уж простая — помимо вероятности подключения/отключения практически любого устройства в любой момент времени, нужен какой-никакой уровень безопасности. Любые два устройства должны иметь возможность общаться между собой, при этом сеанс связи должен быть недоступен для прослушивания другим устройствам.
Одна из новых технологий — подсистема ядра greybus. Каждое устройство, которое подключаются к шине, обладает описанием (VID/PID, серийный номер, используемые протоколы) и способно предоставлять его остальной системе. Таким образом решается часть проблемы, но впереди ещё много сложностей.
В этой статье чуть больше подробностей: lwn.net/Articles/648400. Ну и в исходниках, конечно.
А что, толковая статья. Можно sed'ом (я могу обойтись без sed-а, ага) заменить «Git» на другое слово — и готово, можно новую статью публиковать. Я вот пару заготовочек сделал.
Docker
Я могу обойтись без Docker-а, ага
Разработка*
Конечно… Если ты умеешь програмировать, зачем тебе Docker?
Ты вполне умеешь управлять своими машинами с помошью скрипта, и прекрасно понимаешь, какое имя контейнера соответствует состоянию твоего проекта.
Ты вполне в состоянии запустить именно тот контейнер, который содержит то состояние проекта, на которое нужно откатиться, а потом создашь новый контейнер, немного отличающийся от контейнера версии 2.0, и назовёшь его в2.1+фича1_и_2_из в1.арх
Потом, о щастье, в твоём проекте появился поддаван или даже партнёр.
Ты, конечно, сможешь ему объяснить, что имя контейнера нужно читать так:
первые символы номер текущей версии, а какие-то тонкости можно описать в оставшихся символах имени контейнера, или в комментариях к контейнеру.
Просто всё это пройдено разработчиками Linux-а, за много-много лет (с 2013 года, посчитай сам).
И чтобы не придумывать все эти правила, разработчики Linux решили сделать штуку, которая будет понятна всем, кто хочет понять, и даже дать эту штуку любому желающему (даже если ты разработчик не Linux, а, например, 1С, или Postgress, или твоего личного нового Гуглобука).
И да, ты если разработчик, и ищешь работу, вряд ли ты найдёшь нормальную работу в конторе, которая не использует Docker.
Хуже другое… Если ты найдёшь контору, в которой не используется Docker — ты попал не в ту контору.
И если эта статья оказалась для тебя, просто почитай вот это ru.wikipedia.org/wiki/Docker
(я читал это раза 3, прежде чем)
ФП
Я могу обойтись без ФП, ага
Разработка*
Конечно… Если ты умеешь програмировать, зачем тебе ФП?
Ты вполне умеешь управлять своим кодом с помошью объектов, и прекрасно понимаешь, какое имя метода соответствует состоянию твоего объекта.
Ты вполне в состоянии запустить сконструировать объект именно того класса, который содержит то состояние проекта, на которое нужно откатиться, а потом создашь новый метод, немного отличающийся от метода версии 2.0, и назовёшь его в2.1+фича1_и_2_из в1.арх
Потом, о щастье, в твоём проекте появился поддаван или даже партнёр.
Ты, конечно, сможешь ему объяснить, что имя метода нужно читать так:
первые символы номер текущей версии, а какие-то тонкости можно описать в оставшихся символах имени метода, или в комментариях к методу.
Просто всё это пройдено разработчиками, за много-много лет (с 1959 года, посчитай сам).
И чтобы не придумывать все эти правила, разработчики решили сделать штуку, которая будет понятна всем, кто хочет понять, и даже дать эту штуку любому желающему (даже если ты разработчик не Unix, а, например, 1С, или Postgress, или твоего личного нового Гуглобука).
И да, ты если разработчик, и ищешь работу, вряд ли ты найдёшь нормальную работу в конторе, которая не использует ФП.
Хуже другое… Если ты найдёшь контору, в которой не используется ФП — ты попал не в ту контору.
Вообще в Python много мест, которые можно записать очень просто, но в силу незнакомства программистов со стандартной библиотекой код часто выглядит сложнее. Пример из Python Cookbook:
d = {}
for key, value in pairs:
if key not in d:
d[key] = []
d[key].append(value)
С использованием defaultdict:
d = defaultdict(list)
for key, value in pairs:
d[key].append(value)
Да, я ошибся, речь вообще шла об ntp и о надёжности не гуглового сервиса. systemd по умолчанию использует серверы Google, народ обсуждал, на что бы переехать другое. Как оказалось, pool.ntp.org не рекомендуют ставить стандартным сервером — это меня удивило, а упоминание Google просто в голове отложилось.
Google где-то писал, что эти адреса не для внешнего использования, они не рассчитаны на какую-либо нагрузку. А один из открытых проектов (dnsmasq?) использует их по умолчанию, поэтому нагрузка на них всегда есть.
Позабавил факт, что скрипты адаптируются под систему и тащат соответствующие файлы:
В Linux осуществлялась отправка содержимого /etc/passwd, .bash_history, .mysql_history, .pgsql_history, файлов из директории .ssh, настроек remina, Filezilla и Psi+, а также текстовых файлов, в именах которых имеются слова pass и access, и любых shell-скриптов.
Как бы ни расстраивала политика Mozilla в последнее время, браузера удобнее для себя ещё не нашёл.
На reddit порекомендовали песочницу firejail, решил попробовать. Пакет есть как минимум для Debian Stretch; из коробки поддерживает firefox, thunderbird, chromium, midori, vlc. Вроде пока устраивает.
Кто-нибудь пользуется этой песочницей или аналогами? Какие преимущества/недостатки?
Для чего вам вообще склеивать str? Он для этого не предназначен. Его можно сравнить с Сишным char * — просто немодифицируемая последовательность символов.
String предназначен для манипуляции строками. Более того, вам даже он не нужен.
Вы хотите передавать путь до файла в функцию — так и принимайте его! Для манипуляции Path есть тонна удобнейших функций.
std::path::Path usage
use std::path::Path;
struct Model {
u: f32,
}
impl Model {
fn new(file_path: &Path) -> Model {
let texture_path = file_path.with_extension("tga");
println!("path: {:?}", texture_path);
// outputs 'path: "/tmp/models/african_head.tga"'
Model{ u: 1.0 }
}
}
fn main() {
let model = Model::new(Path::new("/tmp/models/african_head.obj"));
}
Вы серьезно не понимаете, что время воспитания детей через ограничения информации, которое существовало в прошлом веке и раньше — кончилось
Что характерно, эта техника «воспитания» никогда и не работала. Можно, к примеру, вспомнить о парне по имени Сиддхартха Гаутама, которому до 29 ограничивали поток информации. Но зачем нам знать историю — будем повторять чужие ошибки.
Одна из новых технологий — подсистема ядра greybus. Каждое устройство, которое подключаются к шине, обладает описанием (VID/PID, серийный номер, используемые протоколы) и способно предоставлять его остальной системе. Таким образом решается часть проблемы, но впереди ещё много сложностей.
В этой статье чуть больше подробностей: lwn.net/Articles/648400. Ну и в исходниках, конечно.
Разработка*
Конечно… Если ты умеешь програмировать, зачем тебе Docker?
Ты вполне умеешь управлять своими машинами с помошью скрипта, и прекрасно понимаешь, какое имя контейнера соответствует состоянию твоего проекта.
Ты вполне в состоянии запустить именно тот контейнер, который содержит то состояние проекта, на которое нужно откатиться, а потом создашь новый контейнер, немного отличающийся от контейнера версии 2.0, и назовёшь его в2.1+фича1_и_2_из в1.арх
Потом, о щастье, в твоём проекте появился поддаван или даже партнёр.
Ты, конечно, сможешь ему объяснить, что имя контейнера нужно читать так:
первые символы номер текущей версии, а какие-то тонкости можно описать в оставшихся символах имени контейнера, или в комментариях к контейнеру.
Просто всё это пройдено разработчиками Linux-а, за много-много лет (с 2013 года, посчитай сам).
И чтобы не придумывать все эти правила, разработчики Linux решили сделать штуку, которая будет понятна всем, кто хочет понять, и даже дать эту штуку любому желающему (даже если ты разработчик не Linux, а, например, 1С, или Postgress, или твоего личного нового Гуглобука).
И да, ты если разработчик, и ищешь работу, вряд ли ты найдёшь нормальную работу в конторе, которая не использует Docker.
Хуже другое… Если ты найдёшь контору, в которой не используется Docker — ты попал не в ту контору.
И если эта статья оказалась для тебя, просто почитай вот это
ru.wikipedia.org/wiki/Docker
(я читал это раза 3, прежде чем)
Разработка*
Конечно… Если ты умеешь програмировать, зачем тебе ФП?
Ты вполне умеешь управлять своим кодом с помошью объектов, и прекрасно понимаешь, какое имя метода соответствует состоянию твоего объекта.
Ты вполне в состоянии запустить сконструировать объект именно того класса, который содержит то состояние проекта, на которое нужно откатиться, а потом создашь новый метод, немного отличающийся от метода версии 2.0, и назовёшь его в2.1+фича1_и_2_из в1.арх
Потом, о щастье, в твоём проекте появился поддаван или даже партнёр.
Ты, конечно, сможешь ему объяснить, что имя метода нужно читать так:
первые символы номер текущей версии, а какие-то тонкости можно описать в оставшихся символах имени метода, или в комментариях к методу.
Просто всё это пройдено разработчиками, за много-много лет (с 1959 года, посчитай сам).
И чтобы не придумывать все эти правила, разработчики решили сделать штуку, которая будет понятна всем, кто хочет понять, и даже дать эту штуку любому желающему (даже если ты разработчик не Unix, а, например, 1С, или Postgress, или твоего личного нового Гуглобука).
И да, ты если разработчик, и ищешь работу, вряд ли ты найдёшь нормальную работу в конторе, которая не использует ФП.
Хуже другое… Если ты найдёшь контору, в которой не используется ФП — ты попал не в ту контору.
И если эта статья оказалась для тебя, просто почитай вот это
Функциональное программирование — Википедия
(я читал это раза 3, прежде чем)
Напомнает легендарную пасту про Python (в кэше гугла, так как с лурком какие-то проблемы).
С использованием defaultdict:
Это фломастеры разного цвета. snake_case часто используется в Си, и на мой взгляд приятнее читается.
Насчёт примера. Не скажу, что всегда можно исправить, но в данном случае можно сделать как-нибудь так:
Три строки вместо одной, но читабельнее.
github.com/systemd/systemd/issues/437
(opennet).
Интересно, можно ли нагенерить на лету случайных скриптов, чтобы у чуваков место на диске кончилось…
На reddit порекомендовали песочницу firejail, решил попробовать. Пакет есть как минимум для Debian Stretch; из коробки поддерживает firefox, thunderbird, chromium, midori, vlc. Вроде пока устраивает.
Кто-нибудь пользуется этой песочницей или аналогами? Какие преимущества/недостатки?
На мой взгляд, здесь несколько недостатков:
Model::new
передаётся именно путь до файлаТогда вот вариант с использованием
format!
иPathBuf
(на gist тоже обновил, ссылка выше):Вот здесь ещё несколько вариантов: stackoverflow.com/a/30481077/1145239
Я бы на вашем месте просто сменил расширение или складывал в другую директорию.
char *
— просто немодифицируемая последовательность символов.String предназначен для манипуляции строками. Более того, вам даже он не нужен.
Вы хотите передавать путь до файла в функцию — так и принимайте его! Для манипуляции Path есть тонна удобнейших функций.
gist mirror
Что характерно, эта техника «воспитания» никогда и не работала. Можно, к примеру, вспомнить о парне по имени Сиддхартха Гаутама, которому до 29 ограничивали поток информации. Но зачем нам знать историю — будем повторять чужие ошибки.