Pull to refresh
8
Karma
0
Rating
Сергей Скобликов @mgsxx

User

QEverCloud: Evernote SDK для Qt

QEverCloud: Evernote SDK для Qt

Конечно генерил, я же не мазохит ;)

Могу выложить, но парсер/генератор писались сугубо под себя и сугубо под мою задачу. Если парсер Thirft еще можно приспособить, то генератор кода заметно нужно будет менять. А комментариев там нет как класс.

QEverCloud: Evernote SDK для Qt

Эксперимент есть эксперимент. Наверное, попробую сделать асинхронный вариант API. Я правда пока сомневаюсь, что сам я найду ему применение, но, может, кому-то и пригодится. Время покажет.

QEverCloud: Evernote SDK для Qt

Не вижу смысла продолжать дискуссию с неадекватным собеседником. Я бы резче выразился, но правила хабры запрещают срачи.

QEverCloud: Evernote SDK для Qt

Хотелось много чего сказать, но я ограничусь одним тезисом: полезно читать перед тем как писать.

Прочитайте еще раз мою заметку, гляньте исходники QEverCloud. Надеюсь, вам станет понятно, что целью QEverCloud является заменить предлагаемые Evernote сгенеренные thrift компилятором файлы, которые громко именуются Evernote SDK for C++, а не написать конкретную прикладную программу.

В рамках этой цели предлагаемые вам исходники не представляют интереса — там этот самый Evernote SDK for C++ во всю используется, а не заменяется.

Все дальнейшее в программе по поводу Evernote мало интересно с точки зрения общего SDK, предназначенного для любых программ с самыми разнообразными задачами и архитектурой. QAbstractItemModel в качестве API к Evernote? Даже не смешно. Как решение задач конкретной программы — почему бы и нет, но как SDK к Evernote (а именно это есть тема заметки) — идея явно не очень здравая.

Более того, ваш глубокомысленный тезис о «другие пользователи опередили» имеет неявный подтекст, что предлагаемый мною подход к написанию программ — многопоточность с вынесением обращений к Evernote в отдельные потоки — неверен. Что явно говорит о том, что вы не потрудились ознакомится с темой, перед тем как писать. Ибо в приведенных вами исходниках используется именно этот подход, против которого EuroElessar привел массу разумных и интересных контраргументов, пусть с ними и можно поспорить. Вы уж определитесь, что вы хотите сказать.

Так что я ваш тезис о хороших идеях как-то не понял. В приведенных вами исходниках я их не нашел ничего нового и особого интересного.
Если вам хочется конструктивной дискуссии — пожалуйста, конкретику в студию. Какие хорошие с вашей точки зрения идеи вы хотели бы видеть в QEverCloud, но не видите? Или может вы хотели бы реализовать хорошую идею с помощью QEverCloud, но не можете из-за каких-то ограничений библиотеки?

QEverCloud: Evernote SDK для Qt

Ссылка на исходники?

QEverCloud: Evernote SDK для Qt

Да, но не в 2010. В 2010 очень много чего нет… и в 2012 тоже много не хватает. Вот какого хрена в 2012 даже сырых (raw) строк нет? Загадка.

Увы, но MSVC2010 все еще бывает актуальным. И когда уже оно подохнет…

QEverCloud: Evernote SDK для Qt

Как общаться с тем потоком из гуя? Все равно придется городить асинхронное API, т.е. опять приходим к начальной проблеме

Зато на более высоком уровне, более соответствующем логике конкретной программы. Я не назвал бы это изначальной проблемой. К тому же, общение между потоками в Qt не есть большая проблема. Все готово, сигналы/слоты между потоками работают.

Многопоточность — это накладные расходы, лишняя память, лишние context switch'и. Асинхронное API, основанное на event loop почти всегда быстрее.

Это верно, но, насколько я понимаю, по сравнению с затратами на сетевые вещи все эти расходы теряют значимость.

QEverCloud: Evernote SDK для Qt

«Я не понимаю никакого бонуса выноса синхронных методов в отдельный поток, с точки зрения API будет хуже, чем event loop-based API, писать сложнее, использовать тоже сложнее.»
Это субъективно. Моему субъекту, например, все кажется прямо наоборот.

Вашему примеру для полноты картины не хватает последовательности вызовов Evernote. В качестве гипотетического случая: три раза createNote, строго один за другим. В синхронном API это выглядит проще некуда:

ns->createNote(note);
ns->createNote(note);
ns->createNote(note);


А в асинхронном?

QEverCloud: Evernote SDK для Qt

Понятно. Ну, значит нужно выносить наружу.

QEverCloud: Evernote SDK для Qt

«Вообще мне кажется плохим тоном инициализировать qsrand из библиотеки — этим должно заниматься приложение.»

В принципе, я согласен. Лезть исподтишка библиотекой в глобальное состояние — оно действительно некрасиво. Но в данном случае, имхо, это не то чтобы совсем страшно. Если программист вызовет qsrand() где-нибудь в main, то мои закулисые манипуляции потеряют эффект, а если нет — то ему, по видимому, все равно, qrand/rand он не использует и я ему не мешаю.

Гораздо неприятнее будет, если программист забудет вызвать qsrand() и в таком виде отдаст свою программу пользователям. Дыра в безопасности, которую моя библиотека некрасивыми средствами пытается закрыть.

QEverCloud: Evernote SDK для Qt

Я думал об этом, но пришел к выводу, что в случае с Thrift вообще и Evernote в частности такая модель не стоит того гембеля, что она привносит. Согласитесь, асинхронность превратит код в лапшу.

Thrift по своей идеологии имитирует вызов локальных функций, и Evernote этой идеологии всецело придерживается. Почти всегда перед тем, как выполнять следующий запрос к Evernote, нужно знать результат предыдущего. Как следствие, основное преимущество асинхронной модели — параллелизируемость на уровне отдельных запросов — сводится практически на нет.

Имхо проще и в целом так же эффективно будет реализовывать логически связанные последовательности запросов (как то же создание заметки) в виде синхронных вызовов, выполняемых в отдельном потоке. Тогда отдельные последовательности параллелизируются, код удобочитаем, и интерфейс = главный поток «замирать» не будет.

Если народ захочет асинхронности, то можно и сделать… но я пока не ощутил в ней насущной необходимости.

QEverCloud: Evernote SDK для Qt

«Заморозку» интерфейса можно решить многопоточностью. Распараллеливание на уровне отдельных обращений к Evernote таким образом не получится, но оно по логике самого API в целом неосуществимо.

QEverCloud: Evernote SDK для Qt

Т.е. претензии собственно к синхронности, а не к конкретно ее реализации через QEventLoop.

QEverCloud: Evernote SDK для Qt

Фейспалм. Фиксю.

«Сейчас все адекватные компиляторы уже умеют c++11 в достаточной степени» — это если не поминать MSVC незлым тихим словом.

QEverCloud: Evernote SDK для Qt

Не поделитесь, чем конкретно такой подход мешает реализации реальных проектов? Не сочтите за иронию, мне действительно интересно знать ваше мнение.

QEverCloud: Evernote SDK для Qt

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

QDialog::open — да, забыл про него. Видимо потому, что никогда не использую :)
Пофиксю при случае.

По поводу «256 возможных значений» не понял. Можете ткнуть носом в конкретную строку? Я такого бага не вижу.

std::mt19937_64 — это, если я не ошибаюсь, c++11. Библиотека под c++03.

Пожалуй, надо бы фанктор прикрутить в параметры authenticate для генерации nonce.

QEverCloud: Evernote SDK для Qt

Хм… Видимо, Evernote в принципе не предназначен для реальных сложных проектов. Все SDK им предлагаемые — синхронные.

Кстати, если серьезно: ничто не мешает мне сделать асинхронный вариант API, немного поменяв генератор кода. Единственный вопрос: как оно, это асинхронное API, дожно выглядеть? У вас похоже, есть ответ на этот вопрос. Не поделитесь ответом?

QEverCloud: Evernote SDK для Qt

Именно так это и было сделано.

QEverCloud: Evernote SDK для Qt

На счет хитрого бага несколько раз прочитал, но не уверен, что я понял суть.

Чтобы даты заметки были одинаковыми я бы просто задавал created и updated при создании заметки. В QEverCloud это бы выглядело где-то так:

quint64 time = QDateTime::currentMSecsSinceEpoch();
Note note;
note.created = time;
note.updated = time;
note.title =…
note.content =…
noteStote->createNote(note);

Как это в Java API будет и какие там еще баги подстерегают — этого я уже не скажу…
1

Information

Rating
Does not participate
Location
Одесса, Одесская обл., Украина
Date of birth
Registered
Activity