Что бы такое посмотреть, что бы такое почитать? III

Надо сказать, эта неделя выдалась довольно интересной: несколько отличных статей по C++, обзор состояния C++1Y и пара выступлений о Rust.

Если говорить о C++, то отличился Саттер, выдавший одну интересную статью и небольшую головоломку:

А новости относительно Rust вообще необычайно приятны:

Да, чуть не забыл. Некоторое время назад я наткнулся на сайт с описанием основных структур данных и алгоритмов с информацией о сложности той или иной операции. Удобно сделано!

Что бы такое посмотреть, что бы такое почитать? II

По моему мнению, на данный момент существуют 3 книги посвященные C++, которые должен прочитать любой C++ разработчик, который хочет хорошо знать свой основной рабочий инструмент. Continue reading

Что бы такое посмотреть, что бы такое почитать?

Не знаю кто как, а я на этих выходных смотрю выступление Александреску, в котором он рассказал о том, как он мастерил очередной велосипед на тему Option[T], Some<T> и т.п., но с играми и девочками. С одной стороны, мне нравится идея комбинирования опционального возврата с сообщением об ошибке, с другой стороны, код который необходимо для этого писать выглядит страшновато.

Так же, на днях вышел Rust 0.7, хоть и не содержащий чего-то революционного, но однозначно ломающий все что уже было написано ранее, т.к. содержит в себе переименование главных библиотек языка.

Effective C++11

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

Moving from C++98 to C++11

  • Prefer auto to explicit type declarations.
  • Remember that auto + { expr } ⇒ std::initializer_list.
  • Prefer nullptr to 0 and NULL.
  • Prefer enum classes to enums.
  • Prefer alias templates to typedefs.
  • Declare overriding functions override.
  • Distinguish () and {} when creating objects.
  • Prefer emplacement to insertion.
  • Declare functions noexcept whenever possible.
  • Make const member functions thread-safe.
  • Avoid std::enable_if in function signatures.
  • Handle iterators where copying means moving.

Rvalue References, Move Semantics, and Perfect Forwarding

  • Distinguish universal references from rvalue references.
  • Avoid overloading on universal references.
  • Pass and return rvalue references via std::move, universal references via std::forward.
  • Assume that move operations are not present, not cheap, and not used.
  • Be aware of perfect forwarding failure cases.
  • Understand reference collapsing.

Secrets of the C++11 Threading API

  • Thread construction may throw.
  • Destroying a joinable thread calls terminate.
  • Arguments passed to std::thread, std::async, and std::call_once are unconditionally copied.
  • std::async is really two different functions with somewhat different APIs.
  • Futures from std::async are special.
  • void futures can be used for interthread communication.
  • To poll a future, use wait_for with a zero timeout.
  • Native handles let you go beyond the C++11 API.
  • Clock adjustments affect _until functions.

Lambda Expressions

  • Prefer lambdas to std::bind.
  • Prefer lambdas to variadic arguments for threading functions
  • Beware default captures in member functions.

Smart Pointers

  • Use std::make_shared whenever possible.
  • Prefer pass-by-ref-to-const to pass-by-value for std::shared_ptrs.

Miscellaneous

  • Pass by value when you’ll copy your parameter.
  • Keep abreast of standardization developments.

Universal References in C++11

К сожалению, мне еще не довелось использовать C++11 в каком-либо боевом проекте, так что приходится ограничиваться тестами, да всякими лекциями. В очередной раз наткнулся на показавшуюся мне интересной лекцию, на сей раз от Скотта Мейерса, посвященную универсальным ссылкам (насколько я понял, термин свежеизобретенный, автор сам Майерс). Лекция длинная, и если в кратце, то ее суть вот в чем:

Widget&& var1 = someWidget; // here, "&&" means rvalue reference

auto&& var2 = var1; // here, "&&" does not mean rvalue reference

template<typename T>
void f(std::vector<T>&& param); // here, "&&" means rvalue reference

template<typename T>
void f(T&& param); // here, "&&" does not mean rvalue reference

В то же время, я о потраченных 83 минутах не пожалел.

ARM архитектура

На РСДН-е возник заинтересовавший меня вопрос: что бы такого почитать про архитектуру ARM процессоров. Лично меня этот вопрос интересовал давно, но все время находилось что-то более срочное, но сейчас я решил хотя бы поверхностно ознакомится с темой.
Первое что приходит в голову – это полистать ARM* Architecture Reference Manual (документ бесплатен, но требуется предварительная регистрация на сайте). Документ полезный, но вот по увлекательности для чтения несколько не дотягивает до стандарта C++, т.е. просмотреть его можно, но вот при детальном чтении велик риск довольно быстро заснуть.

К куда более увлекательным и полезным можно отнести:

1. ARM assembler от Richard Murray. Краткое введение в ARM ассемблер и архитектуру процессоров. Сайт довольно “олдскульный”, но наполнение скучать не заставит.
2. Introduction to ARM, от David Thomas. Мне понравилось – понятно, кратко, интересно, да и вид сайта современный. Читается легко и риск заснуть минимален.
3. ARM System Developer’s Guide. Книга продается на Amazon за довольно таки большие деньги – $74.10, но судя по отзывам она великолепна. Полистал – действительно книга на высоте, и если есть желание или необходимость разобраться с ARM более-менее прилично, то читать ее нужно.

Внутреннее устройство Mac OS X

Долгое время, единственной книгой по внутреннему устройству Mac OS X была Mac OS X Internals: A Systems Approach. Книга жутко тоскливая и по моим ощущениям на 50% состоящая из исходников XNU. Так вот, похоже что дело идет на поправку, и я только что наткнулся на OS X and iOS Kernel Programming. Пока что успел довольно поверхностно пролистать, но первые ощущения очень положительные.
Бумажная версия, как всегда, есть на Amazon.

NLP

В последнее время я просто разрываюсь между рядом программистских увлечений, в которые входят: Rust, Scala и с недавних пор Natural Language Processing. Пока что, я не пришел к твердому убеждению о том, что область NLP мне действительно интересна, но я получаю огромнейшее удовольствие от просмотра Стэнфордского курса лекций Natural Language Processing, которые ведет профессор Dan Jurafsky и чтения не менее потрясающей книги Steven Bird и соавторов под названием Natural Language Processing with Python.
Причем оба эти источника информации просто идеально дополняют друг друга. Курс лекций дает довольно хорошую теоретическую базу, а книга “Natural Language Processing with Python” показывает как можно применить теоретические знания на практике, используя великолепную библиотеку Natural Language Toolkit.
Рекомендую!

Как перейти из C++ разработки в Java.

Работа – штука занятная. Бывает что пишешь в течении 10 лет на плюсах, знаешь их довольно хорошо, и, вдруг, херась, и ты стал ведущим Java-разработчиком. Причем, ты даже не хотел переквалифицироваться, т.к. работодатели разрывали на куски, да и вообще инструмент нравился. Но, раз уж ввязался, не разрывать же контракт из-за такой мелочи как новый язык программирования.

Тем не менее, после такой неожиданной «переквалификации», остро встает вопрос вхождения в тему. Да, языки похожи, но библиотеки имеют мало чего общего, да и вообще, надо бы понимать что ты делаешь. Конечная цель в моем случае, выглядит приблизительно так: сетевая низкоуровневая разработка + безопасность + немного WEB-морд (Spring + JSP).

Так как долгая разработка сетевых и распределённых приложений на плюсах дает довольно хороший бэкграунд, то, в качестве «Ведения в Java» пришлось прочесть/пролистать не так уж и много. Самое полезное, что я нашел:

  1. The Structure of the Java Virtual Machine. Глупо работать с инструментом, не имея представления о его внутреннем устройстве. Так что начать надо именно с этого.

  2. Memory Management in the Java HotSpotTM Virtual Machine. Терпеть не могу работать с каким-то языком, не зная как же язык обращается с памятью. На мой взгляд, это одно из основных знаний о любом языке программирования

  3. Java for C++ Programmers. Небольшое введение в язык. Все основные вопросы рассматриваются, писать код можно начинать сразу после прочтения.

  4. Effective Java , Second Edition . Joshua Bloch. Чем-то напоминает книги «Эффективное использование C++». По большому счету, чтобы понять Java после C++ этого полностью хватает.

  5. Java Network Programming . Elliotte Rusty Harold . Книга довольно бестолковая, тем не менее это лучшее что я нашел по сетям в Java. Читать не стоит, а пролистать — очень даже.

  6. Java Concurrency in Practice. Brian Goetz, … . Аналогично предыдущей. Читать много и муторно, но пролистать надо.

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