Pull to refresh
97
0
Борис Егоров @JIghtuse

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

Send message
Напишите свой Leechcraft — поймёте =)
Отличная работа!

Пара вопросов.
Авторы документации в курсе о вашем переводе? Если кто-то другой захочет перевести на другой язык, ему придётся собрать все те же грабли? Была тема про перевод, но отчего-то никто в ней не отписывается, а каждый пилит свой велосипед…
internals.rust-lang.org/t/translating-rust-documentation/1254
И, не говоря мне ни слова, компилятор честно скопировал объект b.

Это странно. Что за версия компилятора, какие флаги сборки? Вот пример, у меня он не собирается (gcc 4.9.3):

ideone.com/M535ZN (clang 3.7)
ideone.com/42XEHl (gcc 4.3.2)

Или не было и звёздочки перед 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;
};


Работает только начиная с С++11, это да.
В большом приложении такой оверхед сожрет весь выигрыш от использования C++.

Маловероятно. В каждом проекте узким горлышком будет своё место, и без профилирования делать такие выводы не стоит. Забыли поставить амперсанд — профайлер вам подскажет. Соглашусь всё же, что это ближе к коду на C#. Но на мой взгляд обе статьи занимаются странным. В любом случае сравнивается две конкретные реализации языков, имеющие нечто общее, но в целом принципиально по-разному устроенные. Что, если взять другую платформу? Другой компилятор и набор опций? Заглянуть наконец-то в профайлер?
Ещё раз спасибо за организацию, sermp! Лично мне были интересны практически все доклады.

В ролике косяк начиная с 1:14:04 — слайды наполовину прячутся за видео. И ещё можно бы в описании к видео дать ссылку на слайды отдельно. Кому нужно, они здесь: www.slideshare.net/sermp/ranges-calendarnovosibirsk201508
Именно так, я это упомянул. На мой взгляд, удобства — достаточный аргумент для использования. В статье почему-то используется пример 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.
$ 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 не работает на изначальном примере…

government-as-a-service (GAAS) :)
Можно просто перенаправление сюда поставить.
Очередная демонстрация тотальной компьютерной безграмотности. Доверять свои тайны какому-то левому ресурсу, да ещё и отдавать за это деньги — какая-то русская рулетка.

Ну и сама компания хороша. Заработали неплохие деньги на воздухе, и не позаботились обезопасить пользователей.
Компания Avid Life Media пыталась всеми силами замять скандал: например, отправляла жалобы в Twitter на посты, содержавшие информацию из потерянной базы.
Когда это вообще работало? Ни одного случая не слышал, чтобы что-то утекло в сеть и было выпилено или скрыто насовсем.
Вот это да, отличная новость! Intel MKL — мощнейшая библиотека.
Но ведь такую статью можно написать практически про каждый язык программирования.

Так и пусть будут, отчего нет? Я с историей и областью применения Си хорошо знаком, а вот о Ruby например мало что знаю.

К слову, в статье стоило бы упомянуть хотя бы Дэнниса Ритчи.
Напомнило.
Скрытый текст
Спят подружки вредные
Безмятежным сном.
Снятся мышкам хлебные
Крошки под столом,
Буратинам — досточки,
Кошкам — караси,
Всем собакам — косточки,
Программистам — Си.

Евгений Романов, Колыбельная

«Язык программирования С++»
Автор: Бьёрн Страуструп

Если вы программируете на С++, то прочесть эту книгу нужно прямо сейчас.
А если у вас не так много времени, можете взять A Tour of C++ — излагается то же самое, но в сжатом виде (180 страниц против 1300)

«Программирование. Принципы и практика использования C++»
Про эту что-то вообще ни слова. Введение в программирование для начинающих. C++ используется в качестве инструмента, излагаемые принципы не завязаны на язык.

Ещё стоило бы упомянуть серию Effective C++, в частности Effective Modern C++, ориентированную на последние стандарты.
Почему бы и нет? Судя по этому файлику, переменная pageType вообще не используется. Можно было и совсем её убрать.
С недавних пор отдельные межгородские атобусы оснащают модемом Мегафона. Внутри автобуса висит бумажка с паролем. Подключился. Через пару часов вместо запрошенной страницы вылезает такая:
screenshot
image

Предлагается сменить тариф или подключить какой-то пакет на определённую сумму — на моё усмотрение. Не сказать, что совсем уж свобода действий, но всё-таки полагаю я не должен был видеть эту страницу…
Послушный котейка. Некоторые не настолько законопослушны и пытаются взломать систему (из комментария к статье о другой кормилке):
cats vs. feeders



А в целом идея отличная, кот действительно доволен =)
неговоря уж о часто ненужном индексе, который в перле можно опустить, а в питоне — вынь да полож.
В 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 перенял часть, но всё-таки все ему не нужны — идеология «есть только один способ сделать это» неслабо разнится с идеологией «есть более чем один способ сделать это».

Information

Rating
Does not participate
Location
Россия
Registered
Activity