Пара вопросов.
Авторы документации в курсе о вашем переводе? Если кто-то другой захочет перевести на другой язык, ему придётся собрать все те же грабли? Была тема про перевод, но отчего-то никто в ней не отписывается, а каждый пилит свой велосипед… internals.rust-lang.org/t/translating-rust-documentation/1254
Или не было и звёздочки перед m_b? Это уже двойная забывчивость какая-то. Но и такая лечится одним запуском valgrind/cppcheck:
Cppcheck
user@host [tmp]$ cppcheck --enable=all copy.cxx
Checking copy.cxx...
[copy.cxx:1]: (style) 'class B' does not have a copy constructor which is recommended since the class contains a pointer to allocated memory.
Valgrind
user@host [tmp]$ valgrind ./a.out
==25907== Memcheck, a memory error detector
==25907== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==25907== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==25907== Command: ./a.out
==25907==
==25907== Invalid free() / delete / delete[] / realloc()
==25907== at 0x4C2A8E0: operator delete[](void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==25907== by 0x4006C4: B::~B() (copy.cxx:7)
==25907== by 0x400674: main (copy.cxx:22)
==25907== Address 0x5a12c80 is 0 bytes inside a block of size 40 free'd
==25907== at 0x4C2A8E0: operator delete[](void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==25907== by 0x4006C4: B::~B() (copy.cxx:7)
==25907== by 0x4006FB: A::~A() (copy.cxx:13)
==25907== by 0x400668: main (copy.cxx:22)
Не пользуетесь must-have инструментами — тут уж кто виноват.
1. Запретить «неявный» копирующий конструктор для объектов и то же самое — с оператором присвоения.
Если в классе нет указателей — незачем писать копирующие конструкторы и операторы присвоения, компилятор генерирует их адекватными по умолчанию. И это удобно. Есть указатели — нужно либо указать, что копировать объект нельзя, либо реализовать копирование самому. Это можно прочесть в любой книге по C++ для начинающих.
Реализация запрета оставлена на плечах разработчика и делается одной строкой.
Скрытый текст
// pre-C++11
class B {
public:
B() {
a = new int[10];
}
~B() {
delete[] a;
}
private:
B(const B&) {}
int *a;
};
// C++11
class B {
public:
B() {
a = new int[10];
}
~B() {
delete[] a;
}
B(const B&)=delete;
private:
int *a;
};
Хотя бы заставить разработчика явно написать «разрешаю копирование» в декларации класса, чтобы исключить «недоразумение по умолчанию». Я бы не поленился пару слов написать — это быстрее, чем полдня дебажить.
Одно слово.
Скрытый текст
// C++11
class B {
public:
B() {
a = new int[10];
}
~B() {
delete[] a;
}
B(const B&)=default;
private:
int *a;
};
В большом приложении такой оверхед сожрет весь выигрыш от использования C++.
Маловероятно. В каждом проекте узким горлышком будет своё место, и без профилирования делать такие выводы не стоит. Забыли поставить амперсанд — профайлер вам подскажет. Соглашусь всё же, что это ближе к коду на C#. Но на мой взгляд обе статьи занимаются странным. В любом случае сравнивается две конкретные реализации языков, имеющие нечто общее, но в целом принципиально по-разному устроенные. Что, если взять другую платформу? Другой компилятор и набор опций? Заглянуть наконец-то в профайлер?
Именно так, я это упомянул. На мой взгляд, удобства — достаточный аргумент для использования. В статье почему-то используется пример lxc-macvlan.conf, в котором создаётся сеть. Зачем она для ограничения памяти — непонятно. Можно было его урезать до задания utsname и добавить нужные лимиты.
Хм, и не понял, за что тут наминусовали. Кто-то воспроизвёл все эксперименты без проблем?
Скрытый текст
$ make ptrace-restrict
gcc -g ptrace-restrict.c -o ptrace-restrict
ptrace-restrict.c: In function ‘handle_brk’:
ptrace-restrict.c:55:32: error: ‘struct user_regs_struct’ has no member named ‘ebx’
dbg("brk addr 0x%08X\n", state.ebx);
^
ptrace-restrict.c:19:18: note: in definition of macro ‘dbg’
make big_alloc_linker
gcc -g big_alloc.c -o big_alloc_linker -Wl,-T hack.lst
gcc-4.9.real: error: hack.lst: No such file or directory
$ systemd-run --scope -p MemoryLimit=2M -p MemoryAccounting=yes ./mem
Running as unit run-818.scope.
pp[0] = 0x1473f60
...
pp[511] = 0x465cf50
Killed
Он, к тому же, отслеживает дочерние процессы контролируемого. Что будет, если к нашему big_alloc добавить fork и выделять память в нём? Что-то будет работать — qemu, lxc, я полагаю (systemd работает поверх тех же cgroups). Я хотел испытать пару упомянутых методов, но эксперименты автора не воспроизводимы. ptrace-restrict валится на этапе сборки, для lxc наверное надо контейнер создать, LD_PRELOAD не работает на изначальном примере…
Очередная демонстрация тотальной компьютерной безграмотности. Доверять свои тайны какому-то левому ресурсу, да ещё и отдавать за это деньги — какая-то русская рулетка.
Ну и сама компания хороша. Заработали неплохие деньги на воздухе, и не позаботились обезопасить пользователей.
Компания Avid Life Media пыталась всеми силами замять скандал: например, отправляла жалобы в Twitter на посты, содержавшие информацию из потерянной базы.
Когда это вообще работало? Ни одного случая не слышал, чтобы что-то утекло в сеть и было выпилено или скрыто насовсем.
Если вы программируете на С++, то прочесть эту книгу нужно прямо сейчас.
А если у вас не так много времени, можете взять A Tour of C++ — излагается то же самое, но в сжатом виде (180 страниц против 1300)
«Программирование. Принципы и практика использования C++»
Про эту что-то вообще ни слова. Введение в программирование для начинающих. C++ используется в качестве инструмента, излагаемые принципы не завязаны на язык.
Ещё стоило бы упомянуть серию Effective C++, в частности Effective Modern C++, ориентированную на последние стандарты.
С недавних пор отдельные межгородские атобусы оснащают модемом Мегафона. Внутри автобуса висит бумажка с паролем. Подключился. Через пару часов вместо запрошенной страницы вылезает такая:
screenshot
Предлагается сменить тариф или подключить какой-то пакет на определённую сумму — на моё усмотрение. Не сказать, что совсем уж свобода действий, но всё-таки полагаю я не должен был видеть эту страницу…
неговоря уж о часто ненужном индексе, который в перле можно опустить, а в питоне — вынь да полож.
В Python (и не только) для таких целей служит подчерк:
for _ in range(0, 10):
pass
Насчёт формулировок — дело привычки. Мне поначалу вариант на Perl чересур упрощённым и вследствие непонятным, но после некоторых раздумий согласен, так удобнее. Perl вообще очень богат на различные человеко-ориентированные конструкции:
chdir '/usr/spool/news' or die "Can't cd to spool: $!\n";
print 'ok' if chdir '/tmp';
Python перенял часть, но всё-таки все ему не нужны — идеология «есть только один способ сделать это» неслабо разнится с идеологией «есть более чем один способ сделать это».
Пара вопросов.
Авторы документации в курсе о вашем переводе? Если кто-то другой захочет перевести на другой язык, ему придётся собрать все те же грабли? Была тема про перевод, но отчего-то никто в ней не отписывается, а каждый пилит свой велосипед…
internals.rust-lang.org/t/translating-rust-documentation/1254
Это странно. Что за версия компилятора, какие флаги сборки? Вот пример, у меня он не собирается (gcc 4.9.3):
ideone.com/M535ZN (clang 3.7)
ideone.com/42XEHl (gcc 4.3.2)
Или не было и звёздочки перед m_b? Это уже двойная забывчивость какая-то. Но и такая лечится одним запуском valgrind/cppcheck:
Не пользуетесь must-have инструментами — тут уж кто виноват.
Если в классе нет указателей — незачем писать копирующие конструкторы и операторы присвоения, компилятор генерирует их адекватными по умолчанию. И это удобно. Есть указатели — нужно либо указать, что копировать объект нельзя, либо реализовать копирование самому. Это можно прочесть в любой книге по C++ для начинающих.
Реализация запрета оставлена на плечах разработчика и делается одной строкой.
Работает только начиная с С++11, это да.
Маловероятно. В каждом проекте узким горлышком будет своё место, и без профилирования делать такие выводы не стоит. Забыли поставить амперсанд — профайлер вам подскажет. Соглашусь всё же, что это ближе к коду на C#. Но на мой взгляд обе статьи занимаются странным. В любом случае сравнивается две конкретные реализации языков, имеющие нечто общее, но в целом принципиально по-разному устроенные. Что, если взять другую платформу? Другой компилятор и набор опций? Заглянуть наконец-то в профайлер?
В ролике косяк начиная с 1:14:04 — слайды наполовину прячутся за видео. И ещё можно бы в описании к видео дать ссылку на слайды отдельно. Кому нужно, они здесь: www.slideshare.net/sermp/ranges-calendarnovosibirsk201508
Хм, и не понял, за что тут наминусовали. Кто-то воспроизвёл все эксперименты без проблем?
Он, к тому же, отслеживает дочерние процессы контролируемого. Что будет, если к нашему big_alloc добавить fork и выделять память в нём? Что-то будет работать — qemu, lxc, я полагаю (systemd работает поверх тех же cgroups). Я хотел испытать пару упомянутых методов, но эксперименты автора не воспроизводимы. ptrace-restrict валится на этапе сборки, для lxc наверное надо контейнер создать, LD_PRELOAD не работает на изначальном примере…
Ну и сама компания хороша. Заработали неплохие деньги на воздухе, и не позаботились обезопасить пользователей.
Когда это вообще работало? Ни одного случая не слышал, чтобы что-то утекло в сеть и было выпилено или скрыто насовсем.
Так и пусть будут, отчего нет? Я с историей и областью применения Си хорошо знаком, а вот о Ruby например мало что знаю.
К слову, в статье стоило бы упомянуть хотя бы Дэнниса Ритчи.
Евгений Романов, Колыбельная
Про эту что-то вообще ни слова. Введение в программирование для начинающих. C++ используется в качестве инструмента, излагаемые принципы не завязаны на язык.
Ещё стоило бы упомянуть серию Effective C++, в частности Effective Modern C++, ориентированную на последние стандарты.
pageType
вообще не используется. Можно было и совсем её убрать.Предлагается сменить тариф или подключить какой-то пакет на определённую сумму — на моё усмотрение. Не сказать, что совсем уж свобода действий, но всё-таки полагаю я не должен был видеть эту страницу…
А в целом идея отличная, кот действительно доволен =)
Насчёт формулировок — дело привычки. Мне поначалу вариант на Perl чересур упрощённым и вследствие непонятным, но после некоторых раздумий согласен, так удобнее. Perl вообще очень богат на различные человеко-ориентированные конструкции:
Python перенял часть, но всё-таки все ему не нужны — идеология «есть только один способ сделать это» неслабо разнится с идеологией «есть более чем один способ сделать это».