Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Ок. Откуда берутся данные? Вот по полочкам разложи, как из этого собирается запрос, как исполняется, откуда берется user и как у него вырастает FirstName, которое становится строкой и склеивается со всем остальным. S>>а я с удовольствием послушаю.
НС>Все просто. Этот запрос компилируется примерно в такой код: НС>
НС>string Lambda(string p1, string p2)
НС>{
НС> return"<div><span>" + p1 + "</span><span>" + p2 + "</span></div>";
НС>}
НС>IEnumerable<string> GetUsers(IDbConnection con)
НС>{
НС> using (var cmd = conn.CreateCommand())
НС> {
НС> cmd.CommandText = "SELECT FirstName, LastName FROM User WHERE IsActive=1";
НС> using (var rdr = cmd.ExecuteReader())
НС> while (rdr.Read())
НС> yield return Lambda(Convert.ToString(rdr[0]), Convert.ToString(rdr[1]));
НС> }
НС>}
НС>
Только что у тебя было user.FirstName и внезапно остался только string с именем?
Только что GetUsers у тебя принимало параметром чтототам и внезапно оно принимает коннект к БД?
НС>>>Сколько терпеть то? Полгода? S>>Ты мне сроки ставишь? НС>Нет, я у тебя о сроках спрашиваю. Что то у тебя парсинг русского барахлит.
То есть ты другой тип начальника — требуешь чтобы я сам себе сроки поставил?
Здравствуйте, alex_public, Вы писали:
P>>>Ты в своем проекте, по крайней мере, не думаешь про рисование окон и доступ к БД. S>>Ну, мне не понравился cppdb и pqxx, нарисовал свою обёртку над pqxx... _>Для доступа к БД из C++ могу посоветовать использовать SOCI. Очень удобный и мощный инструмент.
Я рассматривал его. Предпочел постгресную либу вместо комбайна, ибо с постгреса съезжать не планирую
А вообще, в генту интересное описание пакета
dev-db/soci A db access library for C++ that makes the illusion of embedding SQL queries in the regular C++ code
S>>Вот и я об чём. А мой проект будет вполне себе работать на raspberry pi, при условии конечно что БД будет на нормальном сервере. S>>Иными словами я смогу разделить бюджет на железо не поровну между сервером приложения и сервером БД, а взять действительно мощный сервер для БД, а приложение запустить на чем то попроще. _>А были тесты, что скажем реализация на Python не справится с той же самой задачкой на малинке? )
Справится даже баш. Вопрос в другом — какую нагрузку выдержит. Я не тестировал
_>P.S. Я как раз C++'ик, если что. ))) Но для данной задачки (я так понял что речь идёт о простейшей вебморде к БД, причём внутрикорпоративной, т.е. без особой нагрузки) я бы в начале всё же попробовал менее мощные средства с более простой разработкой.
Мне интересно именно на с++
Здравствуйте, Sheridan, Вы писали:
_>>Для доступа к БД из C++ могу посоветовать использовать SOCI. Очень удобный и мощный инструмент. S>Я рассматривал его. Предпочел постгресную либу вместо комбайна, ибо с постгреса съезжать не планирую
Здравствуйте, Sheridan, Вы писали:
S>Я рассматривал его. Предпочел постгресную либу вместо комбайна, ибо с постгреса съезжать не планирую
Я бы не стал так зарекаться. Кстати, при реально слабых нагрузках тот же sqlite может быть более удобным решением. А потом (при повышение нагрузки) можно и на postgress. Причём в случае SOCI изменения будет в одну строчку.
Ну а вообще SOCI хороша не только своим универсальным доступом, но и просто удобна.
S>А вообще, в генту интересное описание пакета S>
dev-db/soci A db access library for C++ that makes the illusion of embedding SQL queries in the regular C++ code
(и дальше по ветке) было небольшое обсуждение с примерами от меня (в том числе и на тему ORM).
_>>А были тесты, что скажем реализация на Python не справится с той же самой задачкой на малинке? ) S>Справится даже баш. Вопрос в другом — какую нагрузку выдержит. Я не тестировал
Ну так а вдруг и Python потянет нужную нагрузку даже на слабом железе?) Тогда же будет не особо оправдано использовать такой мощный, но при этом совсем не простой инструмент как C++.
S>Мне интересно именно на с++
Нууу если только в качестве интереса... Кстати, советую тогда ещё глянуть например сюда http://vibed.org — здесь оптимизации не сильно отличается от C++ варианта, но при этом удобство разработки и модификации значительно выше.
Здравствуйте, Sheridan, Вы писали:
S>Это значит, что все что мне говорили ранее, типа "код ничто — запросы к БД и в сеть основной тормоз" — лукавство?
Почему лукавство? Вовсе нет. Правильно тебе говорили. Мой опыт тоже это подтверждает.
S>Гигабайты конечно никто пока еще не вытаскивает, но вот перелопатить гигабайты в поиске пары строк — вполне себе будет.
Вот именно. Учти еще, что в принципе база данных может быть где угодно в пространстве. У тебя определена только точка доступа. Так что если ты сидишь на Черном море, а БД — на Белом, то результата придется подождать.
Здравствуйте, Sheridan, Вы писали:
P>>У тебя — нет. А у конторы, где ты работаешь — есть. А то, что ты на нее бесплатно работаешь — проблема твоя, а не ее. S>Мне платят деньги за другое. А программирование — хобби.
Но ты же берешься что-то программировать для своей конторы? Значит, сотрудники на тебя рассчитывают, а ты их подводишь. Отсюда у них убытки. А ты их не видишь, поскольку они не у тебя.
Здравствуйте, Privalov, Вы писали:
S>>Это значит, что все что мне говорили ранее, типа "код ничто — запросы к БД и в сеть основной тормоз" — лукавство? P>Почему лукавство? Вовсе нет. Правильно тебе говорили. Мой опыт тоже это подтверждает. Это
тогда к чему?..
S>>Гигабайты конечно никто пока еще не вытаскивает, но вот перелопатить гигабайты в поиске пары строк — вполне себе будет. P>Вот именно. Учти еще, что в принципе база данных может быть где угодно в пространстве. У тебя определена только точка доступа. Так что если ты сидишь на Черном море, а БД — на Белом, то результата придется подождать.
У меня не настолько глобально. Максимум — на соседнем сервере в стойке
Здравствуйте, Privalov, Вы писали:
P>>>У тебя — нет. А у конторы, где ты работаешь — есть. А то, что ты на нее бесплатно работаешь — проблема твоя, а не ее. S>>Мне платят деньги за другое. А программирование — хобби. P>Но ты же берешься что-то программировать для своей конторы? Значит, сотрудники на тебя рассчитывают, а ты их подводишь. Отсюда у них убытки. А ты их не видишь, поскольку они не у тебя.
Еще раз говорю — денег в этом уравнении нет. Все прекрасно понимают когда и как я это пишу, соответственно и ожидания соответствующие.
Здравствуйте, Privalov, Вы писали:
S>>Ты случаем не пытаешься выразить утверждение в том что не программист шеридан — не программист? о0 P>Это ты где такое взял? Прочитал между строк? Это не ко мне. Я ничего между строк не писал.
Тут весь тред к этому сводится так или иначе. То язык неправильный выбрал, то строки неправильно клею, то "запили тесты", то "составь запрос к БД"...
P>Ты в самом деле не видишь разницу между инструментом и результатом работы?
Вижу
Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, artelk, Вы писали:
A>>Лапша из колбэков?
_>Можно глянуть здесь http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/examples/cpp11_examples.html ) Например на async_tcp_echo_server для простоты.
Лапша из колбэков.
_>А в самом низу там есть ещё и пример на базе сопрограмм.
В одном рабочем потоке?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, artelk, Вы писали:
A>>Boost.coroutine не предлагать — оно однопоточное.
EP>О чём речь? LIVE DEMO EP>Вывод: EP>
EP>Thread ID 139987868124992 in main begin
EP>Thread ID 139987838420736 in coro begin
EP>Thread ID 139987868124992 in coro end
EP>Thread ID 139987868124992 in main end
EP>
EP>
Запускающий поток держится, чтобы управление вернулось именно в него.
В сервисе это нафиг не нужно (в UI да, нужно). Запускающий поток там — это один из потоков пула (т.н. worker thread или iocp thread).
Т.е. хотелось бы, чтобы yield() из примера отпускал поток обратно в пул, а после yield() управление мог взять любой другой поток пула.
К тому, что ты не знаешь заранее, во что упрешься. К тому же тут возможны варианты. Например, данные выводятся медленно по вине БД, а не клиента. А вот если с БД все нормально, тогда клиент (обычно это MiddleWare) может задохнуться, принимая данные. И в этом случае наиболее дешевое и разумное решение — поставить рядом такой же аппарат с такой же софтиной. Но в софтине такой вариант должен быть предусмотрен. И это ни фига не преждевременная оптимизация. Это совершенно штатная ситуация.
Вообще-то тебе удалось в этот раз сбить меня с толку. Я знал, что ты тролль. Сначала-то речь шла о приеме из БД 100500 гигов данных. В этом случае все, скорее всего свалится до начала обработки, соответственно в процессор ты не упрешься. Потом меня отвлекли по работе , и я кое-что пропустил. В случае, когда мы уперлись в БД, это была медленная БД.
Так что да, при нормальной БД ты упрешься в производительность своего приложения гораздо раньше.
S>У меня не настолько глобально. Максимум — на соседнем сервере в стойке
Тогда тем более. БД — шустрая, значит, будь готов.
Здравствуйте, Sheridan, Вы писали:
S>Тут весь тред к этому сводится так или иначе. То язык неправильный выбрал, то строки неправильно клею, то "запили тесты", то "составь запрос к БД"...
А как без тестов-то? У тебя что, все праильно по определению? Время реакции сервера, время генерации страницы? О багах я вообще не упоминаю.
P>>Ты в самом деле не видишь разницу между инструментом и результатом работы? S>Вижу
А тут меня уверяют что с++ и 200 запросов\с не выдержит.
Говорил? А C++ и не должен ничего выдерживать. Это всего лишь язык.
Здравствуйте, Privalov, Вы писали:
S>>Тут весь тред к этому сводится так или иначе. То язык неправильный выбрал, то строки неправильно клею, то "запили тесты", то "составь запрос к БД"... P>А как без тестов-то? У тебя что, все праильно по определению? Время реакции сервера, время генерации страницы? О багах я вообще не упоминаю.
По тестам с натяжкой соглашусь. Остальное?
P>>>Ты в самом деле не видишь разницу между инструментом и результатом работы? S>>Вижу P>
А тут меня уверяют что с++ и 200 запросов\с не выдержит.
P>Говорил? А C++ и не должен ничего выдерживать. Это всего лишь язык.
Все всегда воспринимают всё буквально? Контекст то про cppcms, о чем заголовок топика как бы намекает...
Здравствуйте, alex_public, Вы писали:
_>Ну а вообще SOCI хороша не только своим универсальным доступом, но и просто удобна.
Кхм, извините что вклиниваюсь в беседу, случайно увидел тему, захотелось поделиться историей.
Я на SOCI начал смотреть ещё лет 10 назад, еще когда она только была написана одним человеком Maciej Sobczak. В то время мне нужно было хранить данные в SQLite, но SOCI была только только Simple wrapper для Oracle Call Interface, откуда и происходит ее название. Пришлось делать https://github.com/pmed/sqlitepp
Пару лет назад (когда опять понадобилось возиться с БД из С++) я снова взглянул на SOCI. Автор давно потерял к ней интерес, так что теперь это типичный community open source продукт, с кучей разработчиков и странным (естественно только на мой взгляд) кодом в mysql и postgres backends.
Пришлось искать замену, нашел cppDB, посмотрел в её код, всё выглядело просто и адекватно. С тех пор ее использую и рекомендую, поиск по сайту подтвердит
По теме: у cppCMS безусловно есть своя ниша, там же собственно где и у С++ в 2014 году — где есть ограничения на производительность и(или) энергопотребление. Ваять очередной опердень или сайт с котиками на cppCMS явно не стоит, а у гугла и фейсбука хватает ресурсов на свои продукты.
У автора cppCMS или дофига времени, или синдром NIH, судя по namespace booster. Но надо отдать ему должное за создание Boost.Locale
А Шеридан забивает гвозди микроскопом. Ну раз ему этого хочется, почему бы и нет, если это хобби
EP>>Thread ID 139987868124992 in main begin
EP>>Thread ID 139987838420736 in coro begin
EP>>Thread ID 139987868124992 in coro end
EP>>Thread ID 139987868124992 in main end
EP>>
EP>> A>Запускающий поток держится, чтобы управление вернулось именно в него.
Пример показывает, что запускается корутина в одном потоке, yield'ится, а потом продолжает работу в другом, когда первый уже завершился
Да, корутина запускается каким-то из потоков и работает в потоке (очевидно), и "держит" его во время работы. При этом поток спокойно может передать спящую корутину другому потоку, чтобы она выполнялась в нём. В чём проблема-то?
A>В сервисе это нафиг не нужно (в UI да, нужно). Запускающий поток там — это один из потоков пула (т.н. worker thread или iocp thread). A>Т.е. хотелось бы, чтобы yield() из примера отпускал поток обратно в пул, а после yield() управление мог взять любой другой поток пула.
Не пойму о какой проблеме ты говоришь, опиши задачу конкретнее.
Состояние спящей stackful корутины, это по сути набор регистров + стэк, то есть просто "кусок памяти". Имея этот "кусок памяти" корутину можно продолжить в любом потоке. Это позволяет реализовывать самые разнообразные сценарии.
уже показывал, что stackful coroutine (Boost.Coroutine) мощнее stackless (C# await), потом ты куда-то исчез и теперь рассказываешь про "макаронную фабрику".
Здравствуйте, Sheridan, Вы писали:
S>По тестам с натяжкой соглашусь. Остальное?
А что остальное? Для серверного приложения я не стал бы выбирать C/C++. Только в качестве вспомогательного средства для чего-нибудь низкоуровневого типа JNI.
P>>
А тут меня уверяют что с++ и 200 запросов\с не выдержит.
P>>Говорил? А C++ и не должен ничего выдерживать. Это всего лишь язык. S>Все всегда воспринимают всё буквально? Контекст то про cppcms, о чем заголовок топика как бы намекает...
Так это cppcms выдерживает 200 запросов в секунду? Так бы прямо и писал. А то намеки тонкие какие-то. У меня телепатический модуль в зачаточном состоянии.