Как стать автором
Обновить
97
0
Борис Егоров @JIghtuse

Пользователь

Отправить сообщение
Интересны подходы, которые нужно применять, чтобы сделать 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, или твоего личного нового Гуглобука).

И да, ты если разработчик, и ищешь работу, вряд ли ты найдёшь нормальную работу в конторе, которая не использует ФП.
Хуже другое… Если ты найдёшь контору, в которой не используется ФП — ты попал не в ту контору.

И если эта статья оказалась для тебя, просто почитай вот это
Функциональное программирование — Википедия
(я читал это раза 3, прежде чем)

Напомнает легендарную пасту про Python (в кэше гугла, так как с лурком какие-то проблемы).
Вообще в 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)
Куцое словечко def теряется и замыливается — то ли дело человеческая function.
Подсветка синтаксиса вас спасёт. В некоторых языках вообще нет ключевого слова для обозначения функции — люди пользуются.

Раздражает обильное использование символа подчеркивания (кэмел мне милее).
Это фломастеры разного цвета. snake_case часто используется в Си, и на мой взгляд приятнее читается.

Насчёт примера. Не скажу, что всегда можно исправить, но в данном случае можно сделать как-нибудь так:

if self.request.cookies is None:
    return default
return self.request.cookies.get(name, default)


Три строки вместо одной, но читабельнее.
Хорошо, тогда вброшу решение на Python.

print("Your sum is :", sum(range(10)))
sum ведь реализовать надо, а не использовать готовый.
Да, я ошибся, речь вообще шла об ntp и о надёжности не гуглового сервиса. systemd по умолчанию использует серверы Google, народ обсуждал, на что бы переехать другое. Как оказалось, pool.ntp.org не рекомендуют ставить стандартным сервером — это меня удивило, а упоминание Google просто в голове отложилось.

github.com/systemd/systemd/issues/437
Google где-то писал, что эти адреса не для внешнего использования, они не рассчитаны на какую-либо нагрузку. А один из открытых проектов (dnsmasq?) использует их по умолчанию, поэтому нагрузка на них всегда есть.
Ах да, там что-то всё в кучу намешано. Что ж, будем ждать и того, и другого.
На geektimes уже было упоминание, странно, что в «похожих» нет: geektimes.ru/post/241274
Да, так тоже можно, и выглядит проще.
На эту тему у Пелевина есть занятная книга, S.N.U.F.F. Особенно анекдот в начале напомнил. Рекомендую ознакомиться.
Позабавил факт, что скрипты адаптируются под систему и тащат соответствующие файлы:
В Linux осуществлялась отправка содержимого /etc/passwd, .bash_history, .mysql_history, .pgsql_history, файлов из директории .ssh, настроек remina, Filezilla и Psi+, а также текстовых файлов, в именах которых имеются слова pass и access, и любых shell-скриптов.
(opennet).

Интересно, можно ли нагенерить на лету случайных скриптов, чтобы у чуваков место на диске кончилось…
Как бы ни расстраивала политика Mozilla в последнее время, браузера удобнее для себя ещё не нашёл.
На reddit порекомендовали песочницу firejail, решил попробовать. Пакет есть как минимум для Debian Stretch; из коробки поддерживает firefox, thunderbird, chromium, midori, vlc. Вроде пока устраивает.

Кто-нибудь пользуется этой песочницей или аналогами? Какие преимущества/недостатки?
Нужен бот, который будет искать такие вопросы и отвечать «Darude — Sandstorm».
Единственный комментарий по теме поста. Поддерживаю.
Вот вариант без функции, наиболее близок к вашему коду:
Скрытый текст
use std::path::{Path, PathBuf};

struct Model {
    u: f32,
}

impl Model {
    fn new(texture_path: &str) -> Model {
        let buf = PathBuf::from(texture_path);
        let texture_path = format!("{}/{}{}",
                                   buf.parent().unwrap().to_str().unwrap(),
                                   buf.file_stem().unwrap().to_str().unwrap(),
                                   "_diffuse.tga");

        println!("path: {:?}", texture_path);
        // outputs 'path: "/tmp/models/african_head_diffuse.tga"'
        Model{ u: 1.0 }
    }
}

fn main() {
    let model = Model::new("/tmp/models/african_head.obj");
}


На мой взгляд, здесь несколько недостатков:

  • Используются непортируемые разделители директорий /
  • Менее очевидно, что в Model::new передаётся именно путь до файла
  • Меньшая гибкость — когда генерация имени вынесена в отдельную функцию, её легче повторно использовать и менять.
А, теперь я понял, для чего вам конкатенация.

Тогда вот вариант с использованием format! и PathBuf (на gist тоже обновил, ссылка выше):

Скрытый текст
use std::path::{Path, PathBuf};

struct Model {
    u: f32,
}

fn texture_fname(path: &Path) -> PathBuf {
    let fullname = format!("{}{}", path.file_stem().unwrap().to_str().unwrap(), "_diffuse");

    let mut buf = PathBuf::from(path);
    buf.set_file_name(fullname);
    buf.set_extension("tga");
    buf
}

impl Model {
    fn new(texture_path: &Path) -> Model {
        let texture_path = texture_fname(texture_path);

        println!("path: {:?}", texture_path.as_path());
        // outputs 'path: "/tmp/models/african_head_diffuse.tga"'
        Model{ u: 1.0 }
    }
}

fn main() {
    let model = Model::new(Path::new("/tmp/models/african_head.obj"));
}


Вот здесь ещё несколько вариантов: stackoverflow.com/a/30481077/1145239

Я бы на вашем месте просто сменил расширение или складывал в другую директорию.
Для чего вам вообще склеивать 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"));
}


gist mirror
Вы серьезно не понимаете, что время воспитания детей через ограничения информации, которое существовало в прошлом веке и раньше — кончилось

Что характерно, эта техника «воспитания» никогда и не работала. Можно, к примеру, вспомнить о парне по имени Сиддхартха Гаутама, которому до 29 ограничивали поток информации. Но зачем нам знать историю — будем повторять чужие ошибки.

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность