LINUX.ORG.RU

Избранные сообщения NeProfessor

Подскажите годную книгу по Opengl ES 2.0

Форум — Development

Сабж.
Плюсом будет наличие примеров для Android, но это не критично. Главное чтоб книга годная была.
Гугл выдает что-то невнятное.

 ,

uRandom
()

Прокачаться в low-latency сетевом программировании и многопоточностях.

Форум — Development

Писал сетевые приложения под linux с использованием select, epoll на C++. Многопоточность использовал pthreads и boost кросс-платформенно.

Хочется прокачаться в низком уровне - какие бывают примитивы синхронизации на уровне ядра: какие в линуксе, какие в винде, какие во фре, всякие там отличия и особенности. Какие бывают разновидности потоков и процессов под всеми этими платформами. Знать про все compare-and-swap, про межпроцессную коммуниацию, особенности шаринга памяти и т.д.

Есть какой-нибудь крутой мануал, где всё старательно собрано в кучу и тема раскрыта по самое небалуйся? Можно на английском, я не жадный.

kiverattes
()

Тёмные углы C и C++

Форум — Development

Изначально даный пост предназначался для habrahabr, но местные модераторы его не пропустили без объяснения причин:

Увы, ваш топик «Тёмные углы C и C++» не был одобрен и не попал в общую ленту. Причин этому может быть много, но просим не терроризировать службу технической поддержки, так как там вашу статью даже не видели. Расстраиваться тоже не стоит - попробуйте опубликовать что-нибудь еще.

С уважением, Хабрахабр

В связи с этим выкладываю его сюда.

Я, как и многие из вас, работаю программистом. Официально моя должность не привязана к какому-либо конкретному языку программирования, что, кстати говоря, прекрасно, ведь для каждой задачи должны быть свои инструменты. Но довольно часто выбора просто нет (например, из-за особенностей реализации той или иной платформы), в связи с чем подавляющее большинство моих проектов пишутся на C++.

Я не гуру C++. Я не могу похвастаться тем, что с уверенностью распознаю любую шаблонную конструкцию данного языка или возьму и вспомню, что возвращает какая-то редко используемая мной функция из стандартной библиотеки без помощи документации.

Думаю, вы со мной согласитесь, что C++ — язык с очень высоким порогом вхождения. Серьёзно! Я изучаю этот язык уже больше 3 лет, и практически каждую неделю открываю в нём что-то новое и удивительное. Именно об этом «новом и удивительном» и пойдёт речь в данной статье.

За то время, пока я изучал C++, у меня потихоньку накапливались интересные задачки, сниппеты и просто необычные куски кода, которыми я делился с коллегами по работе и знакомыми. У нас даже появилась своего рода традиция — каждый рабочий день с того момента, как я пришёл в компанию, я выкладывал по две новых задачки, которые мы старались по возможности обсудить в перерывах. Постепенно их набиралось всё больше и больше, пока, наконец, я не стал забывать некоторые из них. Именно в тот момент я решил предпринять попытку составления сборника так называемых «тёмных углов» C и C++. Я собрал воедино все те куски кода, что видел до сих пор, дополнил их цитатами из различных стандартов и продолжил копить свою «коллекцию». Изначально моей целью было собрать вместе всего 100 задачек, но я и оглянуться не успел, как их стало уже 200, 300 и вот теперь 400. На самом деле, их даже больше, но на данном этапе я решил ограничиться именно этим количеством.

Итак, представляю Вашему вниманию книгу «C and C++ Dark Corners». Конечно, назвать её книгой можно с натяжкой, ведь это, как я уже и сказал, сборник интересных и для кого-то малоизвестных мест C и С++.

Не откладывайте её в сторону после пары-тройки вопросов, ответы на которые Вы уже итак знаете — я уверен, что хоть какие-то из них заставят Вас задуматься, а ответы на другие могут удивить и даже шокировать.

В качестве примера приведу несколько вопросов из книги:

97. Что попадёт в stdout в результате выполнения след. кода и почему?

#include <iostream>
#include <memory>

#include <boost/smart_ptr/scoped_ptr.hpp>

class Foo
{
public:
 ~Foo() { std::cout << "Foo::~Foo() \n"; }
};

class Bar : public Foo
{
public:
 ~Bar() { std::cout << "Bar::~Bar() \n"; }
};

class Baz : public Bar
{
public:
 ~Baz() { std::cout << "Baz::~Baz() \n"; }
};

int main()
{
 std::cout << 1 << '\n';
 {
  Foo* instance = new Baz;
  delete instance;
 }

 std::cout << 2 << '\n';
 {
  std::shared_ptr<Foo> instance(new Baz);
 }

 std::cout << 3 << '\n';
 {
  std::shared_ptr<Foo> instance(false ? new Bar : new Baz);
 }

 std::cout << 4 << '\n';
 {
  boost::scoped_ptr<Foo> instance(new Baz);
 }

 std::cout << 5 << '\n';
 {
  std::unique_ptr<Foo> instance(new Baz);
 }

 std::cout << 6 << '\n';
 {
  std::auto_ptr<Foo> instance(new Baz);
 }
}

A: Первый случай уже обсуждался ранее – здесь UB в чистом виде (как правило, это приводит к тому, что не будет вызван деструктор производного класса).

Второй случай выдаст на экран следующее:

Baz::~Baz()

Bar::~Bar()

Foo::~Foo()

Почему? Что произошло? Ведь мы же ясно видим, что деструкторы у данных классов не являются виртуальными. Или это один из частных случаев UB? На самом деле, тут всё вполне законно и должно работать так, как указано выше. Посмотрим в документацию к std::shared_ptr и boost::shared_ptr:

http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

Proper delete expression corresponding to the supplied type is always selected, this is the reason why the constructors are implemented as templates using a separate parameter Y.

http://www.boost.org/doc/libs/1_51_0/libs/smart_ptr/shared_ptr.htm

This constructor has been changed to a template in order to remember the actual pointer type passed. The destructor will call delete with the same pointer, complete with its original type, even when T does not have a virtual destructor, or is void.

Третий случай выдаст:

Bar::~Bar() Foo::~Foo()

Почему? Ведь мы только что обсуждали поведение std::shared_ptr! Что тут не так? Вспомните поведение тернарного оператора в C++ — он требует, чтобы второй и третий его операнды были одинакового типа. Более того, каст от базового к производному касту без лишних действий не выполнить, в отличие от обратной ситуации:

#include <iostream>

class Base
{
};

class Derived : public Base
{
};

int main()
{
 Base* first;
 Derived* second;

 Base* foo = second; // Ok
 Derived* bar = first; // Error: invalid conversion from 'Base*' to 'Derived*'
}

Наткнуться на данный момент, связанный с тернарным оператором, можно также и в подобном случае:

#include <iostream>
#include <typeinfo>

template <typename T, typename U>
auto foo(bool b, T t, U u)-> decltype(b ? t : u)
{
 return b ? t : u;
}

int main()
{
 auto _1 = foo(true, 0, 'c');
 std::cout << typeid(_1).name() << '\n';
 auto _2 = foo(false, 0, 'c');
 std::cout << typeid(_2).name() << '\n';
}

Переменные _1 и _2 будут одного и того же типа – int.

Именно поэтому Baz в данном случае будет приведён к Bar.

4, 5 и 6 случаи ничем не отличаются от первого – здесь UB. Надо помнить, что поведение std::shared_ptr отличается от остальных умных указателей.

43. Зачем может понадобиться писать так

#define DO_JOIN(FOO, BAR) DO_JOIN1(FOO, BAR)
#define DO_JOIN1(FOO, BAR) FOO##BAR

вместо

#define DO_JOIN(FOO, BAR) FOO##BAR

A: Потому что препроцессор отработает конкатенацию не так, как того ожидал программист, в том случае, если в качестве аргумента(-ов) мы передадим в макрос DO_JOIN другой макрос:

#include <iostream>

#define DO_JOIN(FOO, BAR) DO_JOIN1(FOO, BAR)
#define DO_JOIN1(FOO, BAR) FOO##BAR

#define MY_MACRO 5

int main()
{
 std::cout << DO_JOIN(1, MY_MACRO) << '\n';
}

Output:

15

#include <iostream>

#define DO_JOIN(FOO, BAR) FOO##BAR

#define MY_MACRO 5

int main()
{
 std::cout << DO_JOIN(1, MY_MACRO) << '\n';
}

error: unable to find numeric literal operator 'operator"" MY_MACRO'

Получается, макрос MY_MACRO не успел раскрыться, в результате чего была попытка провести конкатенацию с 1 и MY_MACRO, что, разумеется, привело к ошибке.

ISO/IEC 14882:2011

16.3.1 Argument substitution [cpp.subst]

1 After the arguments for the invocation of a function-like macro have been identified, argument substitution takes place. A parameter in the replacement list, unless preceded by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is replaced by the corresponding argument after all macros contained therein have been expanded. Before being substituted, each argument’s preprocessing tokens are completely macro replaced as if they formed the rest of the preprocessing file; no other preprocessing tokens are available.

44. Что попадёт в stdout в результате выполнения след. кода?

#include <iostream>
#include <stdexcept>

struct Foo
{
 Foo() { std::cout << "Foo::Foo()" << std::endl; }
 ~Foo () { std::cout << "Foo::~Foo()" << std::endl; }
};

void foo()
{
 Foo bar;
 throw std::runtime_error("Error");
}

int main ()
{
 foo();
}

A: Зависит от реализации.

// 1

Foo::Foo()

// 2

Foo::Foo() Foo::~Foo()

ISO/IEC 14882:2011

15.3 Handling an exception [except.handle]

9 If no matching handler is found, the function std::terminate() is called; whether or not the stack is unwound before this call to std::terminate() is implementation-defined (15.5.1).

Например, в документации к gcc сказано, что раскрутки стека не произойдёт:

The stack is not unwound before std::terminate is called.

Сборник выкладывается на бесплатной основе, желающим помочь каким угодно образом буду безумно признателен и благодарен. По любым вопросам, рекомендациям и пожеланиям Вы можете обращаться на мой электронный ящик nikita.trophimov@gmail.com. Буду рад услышать абсолютно любое мнение по данному поводу.

В книге ещё много чего можно и даже нужно дорабатывать. Обещаю, что если сообщество проявит хоть какой-то интерес к данному проекту, я продолжу развивать его согласно Вашим предпочтениям и пожеланиям, дополнять новыми задачками и исправлять ошибки. У меня есть много мыслей по поводу улучшения «C and C++ Dark Corners» — среди них добавление тематических разделов, workaround'ы для различных компиляторов и т.д. Главное, чтобы этот интерес был не только с моей стороны.

Жду Ваших положительных и отрицательных отзывов, рекомендаций и, конечно, новых задачек.

Внимательно ознакомьтесь с тем, что указано во «введении», и приятного чтения!

 ,

NikitaTrophimov
()

Представление иррациональных чисел без потери точности

Форум — Development

Привет. Задумал совместить важное и нужное с полезным, а именно решил начать изучать haskell, а заодно и написать на нём очередную имэджбоарду набор сценариев/или какой-то проектик (пока не сформировал мысль, что именно это должно быть, возможно, некоторое моделирование каких-нибудь процессов)

Нужны комплексные числа. Действительная и мнимая часть их может быть иррациональной. Числа pi там скорее всего не будет, но будет (sqrt 2), насчёт остальных корней пока не знаю, актуально ли. Ну в идеале чтобы можно было представить числа в любой рациональной степени (2 в степени 1/2, например, что и есть sqrt 2).

Хотелось, чтобы эти степени и корни не вычислялись, а представлялись в памяти как есть (haskell ведь ленивый язык?), и в случае необходимости сами себя упрощали (если я умножаю sqrt 2 на самого себя, я получаю же 2?)

Может быть и не любое иррациональное число можно так представить... но мне и не все нужны, а только простые случаи.

Понятно, почему я не хочу real/float - неизбежные потери точности. Можно постоянно применять округления, но, думаю, тут я могу получить неожиданности. Потери в производительности меня не смущают, не думаю, что они пока актуальны.

Так вот, мой вопрос в том - есть ли что-то уже готовое может быть? Я ничего не нашёл... похоже, придётся делать самому. Стандартный тип Complex вроде как работает с Float/Double либо Int, либо Rational, что немного не то... если я не ошибся?

P.S. Знаю, что, возможно, всё это есть в Maple, и, может быть, даже в mathematica или maxima, но это как-то «не спортивно» что ли. :) Да и не хочется зависеть от математических пакетов.

 ,

BattleCoder
()

Консольный мирок

Галерея — Скриншоты

Vim/irssi/ncmpcpp/за кадром mutt.

Настроил цветовую схему, как она внешне?

>>> Просмотр (1600x900, 444 Kb)

 , , ,

shuck
()

распечатать значение переменной окружения из C-программы

Форум — Development

Нужно выяснить значение переменной окружения. Попробовал так:

 pid_t pid;
    pid = fork();
    if (pid !=0 ) {
        execl("/bin/echo","/bin/echo","\"${VAR1}\"", 0);
    }

печатает ${VAR1}, а не значение VAR1.

Что не так сделал?

 

eiler13
()

Arm,GPIO не все IRQ отрабатывают по IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING

Форум — Development

есть необходимость прочитать данные через GPIO по протоколу wiegand 26 на pcduino. пробовали читать через скетч ардуиновский в непрерывном цикле - читает нормально, но при загрузке процессора пропадают данные. Попробовал написать модуль ядра, с надеждой что ситуация улучшиться.

Делаю два прерывания на data0 и data1 пины GPIO if(request_irq(irq_gpio02, wiegand_data_isr1, IRQF_DISABLED|IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING, «wiegand_data1», &wiegand))

прерывания назначаются и отрабатывают. Но из 26 бит приходит все время разное количество. Уже убрал printk из обрабочика прерывания, все равно пропадаю. Есть подозрение, что установка таймера вызывает задержку и пропадание прерывания. уже и чтение с gpio убрал, анализирую какое прерывание 1 или 0 вызвалось, все равно пропадают биты. Подскажите как правильно работать с GPIO в контексте реалтайма из модуля ядра ?

 , , ,

gabirx
()

Накидайте языков с необычными концепциями, альтернативам ООП.

Форум — Development

Одна концепция — один язык.

По мотивам Подскажите ЯП. (комментарий) .

Lisp, форт, пролог и хаскелл будем считать уже названными.

next_time
()

Нубский вопрос по системным вызовам в целом

Форум — Development

Раньше программировал только под Win32 и естественно впитал местные стереотипы, поэтому извините если вопрос окажется не совсем адекватным. Хочу программировать под Линукс и стал вопрос какие системные библиотеки нужно присоединить к проекту чтобы можно было совершать системные вызовы. Ожидал увидеть нечто аналогичное виндового kernel32.dll но ничего не нашел. Все пути приводили только к стандартной библиотеке языка си, и дальше никуда не вели. Помогите разобраться в этой кухне. Простите за тавтологию, к каким системным библиотекам нужно обращаться?

normann
()

Какое же говнище этот ваш С++

Форум — Development

Решил намедни углубить свои знания по плюсам, чувствуя, что скоро нехило так потребуются по работе. Теперь сижу, обмазываюсь тут всякими трупами страусов, Скоттом Майерсом и другими. Г-пди, как же можно на этом писать, особенно после знания божественных лиспов, хаскелей и прочих матанских агд (sic!). Это какая-то пытка, честное слово, мне натурально мерзко и противно читать как люди пытаются вырезать гланды через задний проход да ещё и хвалятся этим, поглядите, мол, как это круто. Такое ощущение, будто плюсисты все поголовно латентные мазохисты.

template <typename T>
class Rational
{
    public:
    ...
    friend const Rational operator*(const Rational& lhs, const Rational& rhs)
    {
        return Rational(lhs.numerator() * rhs.numerator(), // same impl
            lhs.denominator() * rhs.denominator()); // as in Item 24
    }
}

An interesting observation about this technique is that the use of friendship has nothing to do with a need to access non-public parts of the class. In order to make type conversions possible on all arguments, we need a non-member function (Item 24 still applies); and in order to have the proper function automatically instantiated, we need to declare the function inside the class. The only way to declare a non-member function inside a class is to make it a friend. So that's what we do. Unconventional? Yes. Effective? Without a doubt.

Нафиг так жить, почему нельзя всё было сделать по-человечески, как в нормальных языках? Ненавижу страуса, ненавижу плюсы, ненавижу тех идиотов, которые упорно продолжают куда ни попадя совать этот мёртвородженный язычок. И ниасилил, да.

Перемещено mono из talks

 

mix_mix
()

Хочу создать свой дистрибутив

Форум — Development

Всем привет, посовейтуйте, как мне написать систему из чистого ядра(что мне с ним делать), подключить графическую оболочку, вообщем, чтобы не получилась принципиально новая BolgenOS.(но обои будут крутые, обещаю)

IVaN4B69
()

А посоветуйте алгоритм/структуру данных для быстрейшего поиска точки (точек) в порядке удалённости от заданной в 2D?

Форум — Development

Сабж.

Встаю в любую координату 2D-плоскости и получаю список точек в порядке удалённости от текущей. BST-tree?

kiverattes
()

О титанах лиспа

Форум — Development

Вот начал изучать язык Лисп и прочитал труды Питера Сайбеля (Зайбеля, Зубиля, я не знаю как нада вообще). Ещё есть какой-то Пол Грэм (как я понял, написатель web-магазинов на лиспе, так как PHP слишком ненадежен).

А какие есть в мире лиспа учёные-теоретики, которых можно прочитать? И почему на сайте lisp.ru фото «полковника» Сандерса? Я не знал, что он внёс вклад ещё и в лисп, очень разносторонний человек

 

lispfuerimmer
()

Пытаюсь разобраться в Haskell

Форум — Development

Привет, ЛОР!
Возможно, мой вопрос довольно глупый, но очень хотелось бы всё-таки разобраться.
По какой причине в Haskell недопустимы конструкции типа Integer + Double? Если я правильно понял, дело в том, что (+) имеет тип Num a => a -> a -> a, т.е. оба аргумента должны быть одного типа. Но по какой причине так сделано, ведь они и так оба являются инстансами Num?

 

Deleted
()

Regexp in C

Форум — Development

Есть две либы, гнушная regex.h и pcre. С какой начать знакомство для новичка Си? И вкратце плюсы/минусы можете рассказать?

Update: прикрутил pcreposix.h — все зашибись. Всем спасибо :)

 , ,

gh0stwizard
()

Python2.7 vs Python3 vs Tcl

Форум — Development

Добрый день, собственно сабж в заголовке. Предполагается написание клент-серверного приложения «для себя» с ориентацией потом применения данной софтины в продакшене. Требования к инструменту: возможность сделать масштабируемый серер приложений, кроссплатформенный, работа с многопоточностью и паралельными вычислениями, библиотеки для работы с TeX/LaTex, .odt, .doc, .docx, .pdf, .xls, реялицонные базы данных, нереляционыне базы данных (с указанием какие именно).

Рассматриваются именно эти языки т.к. необходим набор виджетов Tk, ввиду того, что он: легковесный, кроссплатформенный, настолько примитивный, что позволяет строить свой велосипед если чего-то нет.

 , , ,

i_overdose
()

TagLib 1.9

Новости — Мультимедиа
Группа Мультимедиа

Вышла новая версия популярной библиотеки для работы с метаданными аудио-файлов. Добавлено множество улучшений и исправлений, среди которых можно отметить следующие:

  • поддержка Ogg Opus;
  • поддержка INFO-тегов для WAV-файлов;
  • новые методы MPEG::File для проверки наличия тегов в файле;
  • добавлен API для доступа к свойствам ASF- и MP4-файлов;
  • поддержка идентификаторов MusicBrainz;
  • добавлено чтение обложек MP4-файлов без необходимости указания формата изображения;
  • улучшен парсинг повреждённых FLAC-файлов;
  • поддержка clang;
  • улучшен атомарный подсчёт указателей.

>>> Подробности

 , ,

truetester
()

Xlib графика

Форум — Development

Для создания пиксмапа - XCreatePixmap, для рисования - функи типа XDrawPoint. Для рисования на окнах\других gc - XCopyЧтоТоТам.

Как насчет получения пиксела/указателя на блок памяти для прямого изменения? Если я хочу, например, нарисовать фигуру и размыть картинку по гауссу?

P.S. Может что-нибудь популярно рассказать о XCreateImage и иже с ним?

 

inn
()

7 инструментов командной строки для обработки данных

Форум — Development

Статья от «Hacker News». Кому-то может быть полезным набор инструментов для обработки (научных) данных, освещаемых в статье.

В оригинале название статьи: «7 command-line tools for data science» так-что перевод может быть немного другим (заранее извиняюсь за интерпретацию): выбран обобщенный вариант, дабы избежать научной двусмысленности.

Статья

HN-дискуссия к статье, дополнительные инструменты

Довольно удобный и простой инструмент: jq. Сгодится не только для науки...

 , , , ,

swwwfactory
()

О «серебрянной пуле» или создание универсальной модели

Форум — Development

Здравствуйте.

По примерам MVC, у меня сложилось впечатление, что для каждого набора данных, разработчики делают новую модель, наследуемую от QAbstractItemoModel.

У меня в проекте имеется несколько независимых моделей, которые нужно отображать в виде дерева. Из общего у них только размерность дерева — два. Есть мысль сделать одну модель данных и инициализировать её мультимапом с ключом в качестве элемента верхнего уровня и его[ключа] значениями в качестве детей.

Что скажет уважаемое сообщество, стоит ли овчинка выделки? Какие подводные камни скрываются за этим решением.

 , ,

h0x0d9
()