dervish_candela: (Dervish)
1) никогда не пересылать примитивы. всегда иметь общий (для клиента и сервера) заголовочник, где определены имена используемых типов данных (даже если это всего лишь int). пересылать исключительно эти типы по этим именам.
2) при использовании QDataStream(socket), обязательно использовать setVersion. обязательно. альтернатива - формировать блобы самому и использовать socket.write(blob)
3) always flush!
dervish_candela: (Dervish)
https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/
Herb Sutter
семантика различных видов передачи хозяйственного указывателя (*, &, unique_ptr, shared_ptr, etc)

http://scottmeyers.blogspot.ru/2014/07/should-move-only-types-ever-be-passed.html
Scott Meyers
unique_ptr by value vs all sink parameters by rvalue

http://stackoverflow.com/questions/24814696/move-semantics-and-function-order-evaluation
passing unique_ptr sink by value vs rvalue
guaranteed order of initialization of braced-init-list
using constructor delegates

http://web.archive.org/web/20140113221447/http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
Dave Abrahams
та самая статья

http://stackoverflow.com/questions/27021698/moving-stdfunction-into-another-stdfunction-does-not-invoke-move-constructor
yo dawg
so we moved std::finction into std::function

Andrzej's C++
https://akrzemi1.wordpress.com/2011/06/27/unique-ownership-shared-ownership/
обзор идей владения

https://akrzemi1.wordpress.com/2011/08/30/move-constructor-qa/
когда нужен move constructor?

http://stackoverflow.com/questions/17098407/when-are-implicit-move-constructors-not-good-enough
«Another valid reason for providing your move constructor if you want to enable your type that is non-copyable (because it is RAII-like and represents a resource) to be still passed by value where copying is not required, and stored in STL containers.»
dervish_candela: (Dervish)
моя бошка уже немного пухнет, но вот что я понял.

std::move(x) ничего не двигает. оно просто приводит тип к rvalue (&&x), то есть мы явно говорим что объект x нам больше не нужен.

втихую move contructor генерится только для POD (не совсем так, но смысл именно такой).
совершенно точно нельзя передвинуть класс, если у него явно запрещён copy contructor и при этом не определён явно move contructor.

есть некий middle gorund вида const T& ← &&T , то есть rvalue will bind to a const lvalue reference
то есть, класс с нетривиальным конструктором можно передвинуть, если он is_move_contructible<T>, то есть std::is_constructible<T,T&&> (его можно сконструировать из rvalue)
например так работает конструктор копирования из T(const T&) и инициализирцет T из временного выражения &&T

иными словами, подвинуть некопируемый объект нельзя. никак. нихт. нада.
такие классы нужно инстанцировать в хозяйствующий указыватель unique_ptr<T> и передвигать это хозяйство с помощью std::move(unique_ptr<T>)
в частности, никак невозможно и нельзя подвинуть QObject, и это by design, именно потому что правильно скопировать identity class (уникальный объект) просто невозможно по определению.
для этого у них у всех запрещены конструктор T(const T&) и присваиватель T& operator=(const T&) макросом Q_DISABLE_COPY


а вот RVO всё может, потому что он не языковая механика, а компиляторная.
dervish_candela: (Dervish)
прикольная статья которая представляет ооп и функциональное программирование как диалог двух противоположных способов миропознания, начавшийся задолго до появления собственно программирования.
Декарт vs Беркли, fight!
https://medium.freecodecamp.com/descartes-berkeley-and-functional-reactive-programming-18b0b61eac58
dervish_candela: (Dervish)
моё примерное на сегодня понимание. копипащу сюда, разу же написал, чтоб не пропало.

в языке С++ нет модулей (способа группировки сущностей и однозначного выяснения того, где сущность находится), и он пытается это компенсировать огромным количеством механизмов (я насчитал штук 5, что ли), но основные из них - это единицы компиляции, механизм препроцессинга, и объектные файлы (линковка)

грубо говоря, скомпилировать можно только .cpp файл (смысл не в расширения, а в той информации что кладётся в файлы - объявления или реализация).
несмотря на то, что .h файл может казаться главным, на самом деле он кусок говна на палочке: обычно он содержит просто некие объявления сущностей. он ни содержит не реализации сущностей, ни абсолютно никакого указания на то, где эти сущности искать - никому, ни компилятору, ни линкеру. за всё это отвечаешь ты, программист (хахаха).

нормальный процесс выглядит так - препроцессор для каждого .cpp файла тупо сливает в него текст включённых в него .h файлов, и получившийся монстр компилятор компилирует в единицу компиляции.
если вдруг у тебя в .h файле есть реальный код - например функция не только объявлена, но и определена, компилятор согласится с тобой и сгенерирует её определение в этой же единице компиляции.

а если этот .h файл включён в ещё одну единицу компиляции (в другой .cpp) - компилятор опять согласистя с тобой и снова сгенерирует определение, уже в этой ЕК... и при попытке слинковать это линкер скажет «лол што, у тебя две реализации, не хочу». именно поэтому, насколько я могу понять, происходит вот эта фигня: чтобы писать определения функций в h-файле, приходится им добавлять inline - вместо одной функции в одном объектном файле компилятор намеренно генерирует эту функцию в каждом объектном файле ... при этом не выставляя её наружу для линковки?

http://stackoverflow.com/a/41737096/294763
An inline function is defined in all translation units that use it, while a non-inline function is defined in one translation unit only as required by the one definition rule. That is what an inline declaration of a function means; it relaxes the one definition rule, but also gives the additional requirement of being defined in all translation units that use it (which would not have been possible if the odr wasn't relaxed).

а вот если ты добавляешь в проект дополнительный, уже существующий код, и включил в одну из твоих ЕК .h файл, но не добавил в проект его .cpp файл (то есть не запланировал создание ещё одной ЕК, содержащей не только объявления, но и определения) - компилятор снова мирно согласится с тобой и сгенерирует объявления в твоей ЕК, но при этом НИКТО не знает где взять опеределения сущностей - ни компилятор, ни линкер.
dervish_candela: (Dervish)
как влияет endianness (порядок байтов) на побитовые операции?
а никак.
они, оказывается, не побитовые. bit shifting никуда ничего не двигает.
все «побитовые операции» на самом деле определены как арифметические действия и поэтому совершенно нейтральны относительно byte order!
до тех пор, пока ты не пытаешься получать прямой побайтовый доступ к памяти, любое выражение с битовыми операциями остаётся нейтральным и его результат одинаково определён на любой оконечности, при условии что в выражении используются только беззнаковые целые типы.
dervish_candela: (Dervish)
мне тут недавно написал незнакомый чел с благодарностью за маленький скрипт для вывода таблиц из экселя в компас, который я написал лет 7 назад ^_^
dervish_candela: (Dervish)
Much of a programmer’s job is being told, ... by a compiler ... that their code is incorrect or incomplete. It requires perseverance.
( https://medium.engineering/engineering-interviews-what-we-screen-for-af2d84122417 )
dervish_candela: (Dervish)
если сохранять свой файл в UTF-8 без BOM, то MSVC его даже не испортит, а спокойно проглотит как narrow ascii, и можно писать идентификаторы русскими буквами ^_^

private:
строка имя;
ядро бд;

НЕ ДЕЛАЙТЕ ТАК
dervish_candela: (Dervish)
чем меньше шрифт, тем лучше я воспринимаю его как текст (проще сразу видеть конструкции и идиомы, а не отдельные слова и буквы)
с другой стороны, с толстым шрифтом лучше фокусируются и меньше болят глазки
nyoroooon
dervish_candela: (Dervish)
http://utf8everywhere.org/

ну и соответственно предлагаемое для С++ решение:
http://cppcms.com/files/nowide/html/

впрочем, Qt и Wx уже содержат полноценные инфраструктурные обертки над голым С++, почти полностью прячущие от программиста эти вещи.
dervish_candela: (Dervish)
блин круть
напоминает с/с++ с сильно уменьшенным градусом безумия
у них совершенно прекрасная ownership model обеспечивает статические гарантии отсутствия гонок и утечек, всё это проверяется в compile time!
(на с++ для получения некоего бледного подобия таких гарантий каждый ресурс заворачивают в unique_ptr или shared_ptr, а что делают на С я даже не знаю... молятся?)

реально очень понравилось как они работают с mutable shareable state.
https://doc.rust-lang.org/book/concurrency.html
и очень приятно, что они не пытаются педалировать функциональный фашизм, а успешно сделали безопасным именно С-style программирование.
dervish_candela: (Dervish)
http://klmr.me/slides/modern-cpp/#1
(у меня хром не показывает стрелки «влево-вправо», но это пустые места сразу по бокам от серого прямоугольника.
dervish_candela: (Dervish)
https://medium.com/@matthew_daniels/the-journalist-engineer-c9c1a72b993f
особенно интересна http://ncase.me/polygons/ - очень забавная интерактивная демонстрация о том, как даже очень умеренный индивидуальный bias приводит к сегрегации популяции

что же по факту самого «нам не нужна аналитика, потому что у нас есть крутые визуализации», то это мне кажется фуфелом.
возможно, «крутые визуализации» помогут сделать более убедительным мнение эксперта, сконденсированное до пары абзацев?
dervish_candela: (Dervish)
большая часть «быстрых ответов» обычно иллюстрирует разницу между O(n) и O(n²), но почти никак не затрагивает суть самого понятия сложности и связь между сложностью и временем. Предполагается, что ты проходил это на своём курсе CS. Ага, конечно. Политологию я проходил.
http://stackoverflow.com/questions/487258/what-is-a-plain-english-explanation-of-big-o-notation
https://medium.freecodecamp.com/time-is-complex-but-priceless-f0abd015063c#.3y7zkmsje
ну и чтоб было http://bigocheatsheet.com/
dervish_candela: (Dervish)
"the goal of enterprise software was that there should be no code that actually accomplishes anything. Any actual behaviour that the software might have, should either be an emergent property of the layered design, or else should be table-driven from business rules that the code treats as data. I'm only 50% joking. – Steve Jessop"

из комментария к http://programmers.stackexchange.com/a/329737/234441

sup

Jun. 11th, 2016 02:58 am
dervish_candela: (Dervish)
так как у меня тут закончился испытательный срок, то я даже напишу объяснительную о том, почему ваша лента загажена постиками про С++.
я теперь наконец-то официально тыжпрограммист, что и надо было сделать давным-давно (лет пять назад, наверное). впрочем, фараза "надо было сделать это пять лет назад" практически определяет всю мою жизнь, так что здесь ничего нового. по-видимому, это та работа, которая позволяет мне не чувствовать себя вечно тупым, и на многие вопросы у меня даже есть какие-то ответы кроме "я забыл". помогаю разрабатывать системы космической связи для поднимающейся с колен россии. пишу гуй на С++/Qt и пытаюсь не забыть питон. моя компетенция по всей видимости не так уж плоха, хотя работу найти было трудно и сидеть без денег было очень грустно. я (в общем-то обоснованно) предполагаю, что мой взгляд кажется рекрутёрам потухшим, лишённым энтузиазма и живой искры (также известной как «готовность в анпейд овертайм»), и я с большим трудом отвечаю на вопросы типа "почему вы хотите здесь работать".

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

что касается непосредственно программирования (которое нынче стало так модно называть «разработкой»), то пользуясь случаем передаю лучи любви агентам рационалистов и EFF в комитете стандартизации С++11. эти люди пожертвовали своими душами (и весьма вероятно психическим здоровьем) чтобы сделать нашу жизнь чуточку лучше. конечно, ничего настолько радикального как первоклассные функции или ключ к компилятору чтоб писать без {никому; ненужных; точек с запятой;}, но даже сами лямбды - уже чуть снижают градус безумия. к сожалению, С++ по-прежнему чудовищно многословен, и, ирония, превращает именно объектно-ориентированное программирование в некое душное лимбо из дублирующегося по куче файлов кода (одна маленькая фича? тебе повезло, если она затронет всего треть файлов проекта!) и дюжен двойных двоеточий. Qt делает его почти похожим на настоящий язык, но, конечно, когда ты в очередной раз утыкаешься в то, что объектов в этом якобы объектно-ориентированном языке на самом деле не существует (это просто ворох функций, указателей и состояний), тебе становится немного грустно.

я даже думал поиграться с трансляцией питона в С++, но «censored»

p.s.я тут внезапно осознал, что система сигнал/слот Qt фактически представляет из себя реализацию software transactional memory. к сожалению, чудовищно многословную в применении (как и всё в C++).

Clang

Apr. 11th, 2016 02:09 pm
dervish_candela: (Dervish)
неоднократно натыкаюсь на упоминания некоей штуки «Clang», о которой я ничего не слыхал в интернетах во время моих прошлых приключений с C++.
оказывается, это, насколько я смог понять, единственный компилятор С++, который реально строит из исходного кода AST, и благодаря этому имеет очень продвинутый доклад ошибок (с которым, как известно, всё до сих пор очень плохо).

До сих пор я был уверен, что это всё для красноглазиков, но оказывается, Clang встроен в Qt Creator в качестве опционального анализатора кода!
Включил его, и ахнул. Батюшки светы! Как будто кто-то за плечом стоит, и подсказывает что у тебя в коде не так!
Эта штука не подчёркивает тебе красным всю строку, и мол разбирайся сам, а прям вот пальцем тыкает туда, куда надо, и простыми английскими словами объясняет, почему ошибка.
*______*

1395746715_1838178861.jpg

один минус - медленно. не тормозит, конечно, потому что анализ в отдельном потоке, но обновляется code model в среднем секунда за 5-10, что норм для статического анализа или компиляции, но совсем не норм для использования в роли двжика подсветки и дополнения кода. В идеале бы использовать их одновременно, но к сожалению такой возможности нет.

использование неофициальной, 64-х разрядной сборки QtCreator'а тоже ощутимо задержки не снижает.
dervish_candela: (Dervish)
возможно, некоторые мои интервью бы прошли лучше, если бы я говорил, что ja-ja, люблю и всегда применяю принципы GRASP (которые 100% выбор капитана очевидность)
потому что может быть я даже где-то позволил проскользнуть своему презрительному отношению и сказал без должного уважения и придыхания о ВЕЛИКИХ И УЖАСНЫХ ШАБЛОНАХ ПРОЕКТИРОВАНИЯ GoF, а ведь всегда лучше иметь альтернативное мнение, чем нагло пинать чужую священную корову.

April 2017

S M T W T F S
       1
234 5678
9101112131415
16171819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 23rd, 2017 09:24 am
Powered by Dreamwidth Studios