И много электронных книг в торрентах из того же Amazon? Вот пример Amazon ярко показывает, что можно и контент досталять и зарабатывать. Есть тот же DRM и прочие штуки, которые сильно уменьшают смысл выкладывание в торренты.
Поюс ко всему, что мешает выкладывать сканы книг и оцифрованные «любителями» книги в те же торренты (естественно не всегда с нормальным качетвом). По мне так эти торренты процентов на 90 именно такими оцифрованными бумажными книгами и завалены. А нормальной цифровой копии днём с огнём не сыщешь, причём даже с острым желанием купить эту цифровую копию.
Плюс качество книг, особенно технической литературы такое (мягкая обложка, книги часто склеяны, а не прошиты и пр.), что по ходу издательство пытается заработать ещё раз на мне же, при переиздании, когда у меня предыдущий экземпляр совсем на странички развалится…
«Не богадельня» — это отмазка из разряда, когда ничего делать не хотим…
Блин, заработайте на мне! Только я не хочу певозить груду макулатуры при очередном переезде, а хочу все книги иметь с собой в своём планшете.
С ним нет смысла бороться. Бороться есть смысл за то, что бы читателю было удобнее купить книгу, чем искать ее на торрентах. Нужно сосредоточиться на том, что бы человеку было просто найти ее, легко купить и приятно пользоваться. Тогда успех не заставит себя долго ждать.
Как и с любым типом незаконной деятельности, смысл бороться с этой деятельностью есть, но этим смыслом, а точнее задачей должны заниматься соответсвующие органы, но не теми методами, что предлагают наши законотворцы и исполнители, по сути выбравшие конечных пользователей в качесве крайних.
Движение к тому, что издатель должен думать о том, как в лучшем виде донести продукт до конечного пользователя, поддерживаю обоими руками. Но только, в блоге Питера на Хабре, постоянно возникает вопрос: «А будет ли электронная версия», — на что как правило ответ один: «Мы делаем всё возможное, и пытаемся договориться, но правообладатель (это как правило какой-то зарубежный издатель) пока не велит». Вот это и бесит больше всего: какой-то крупный правообладатель получает монопольное право на распространение книги, и мало того, что сами не делают удобно, так и другим не дают. Или я что-то не понимаю? Где в этой реальности, где приходится сталкиваться постоянно с этим, работает ваш тезис о том, что необходимо
сосредоточиться на том, что бы человеку было просто найти ее, легко купить и приятно пользоваться.
Жёстко планировать ВСЁ — нелегко. Но например важные вещи, которые действительно необходимо сделать в чётко обозначенное время (из разряда: «Позвонить тому-то») приходится задавать жёстко: хошь-не-хошь. Но я имел ввиду именно жёсткое планирование с распространением этой идеологии на все задачи. По мне так это мало того, что сложно, так со временем эффективность этого метода падает, потому что невозможно себя постоянно держать в таких жёстких рамках — только больше устаёшь.
По поводу приоритетов: сразу хочу сказать, что у меня прижилась только скрам-доска, немного модифицированная под себя. Системы с расставлением цветов, всяких там разделений задач на кучи (как самая известная: разделить задачи на 4 категории: важное и срочное, важное и не срочное, неважное и срочное, и нескрочное и неважное) вообще не прижились. Например сортировка, вынесенная в скобочки в предыдущем предложении, приводила к тому, что как правило кучка «важное и несрочное» была забита до отвала, а неважное и несрочное вообще было пустым. Важные и срочные дела тоже просто решались в этот же момент, а не перекладывались… В общем я так и не смог для себя решить, как раскладывать задачи в этой системе, и она тихо отмерла… На скрам доске я каждую задачу по сути сравниваю только с двумя, между которыми потенциально её необходимо втиснуть. Все задачи важны, но как правило не привязаны ко времени. Это, как мне кажется, гораздо проще. Да и за что браться в текущий момент понятно: за самую верхнюю задачу.
Не знаю ни одного человека, у которого получилось бы планировать время жёстко. А вот список реально облегчает жизнь.
Со временем я пришёл к ещё кое к чему, что облегчило жизнь: если задача уже откладывалась несколько раз, и не стало ни лучше, ни хуже, то может её выполнять совсем не нужно — тут отголоски жёсткого планирования, которое я тоже попробовал: всячески старался выполнить вообще все зафиксированне задачи, даже те, что были набраны эмоциально. Результат: задача не выполняется, переносится, сначала расстраиваешься, а потом привыкаешь, и как следсвтие только и делаешь, что автоматом перекладываешь задачу на потом. Теперь, отложив задачу несколько раз, я просто задумываюсь, а нужно ли её вообще и делать сейчас? Если не нужно делать вообще: удаляем. Если нужно, но ко времени выполнение никак не привязано: переносим в личную скрам-доску, обозначив её приоритет по положению, относительно других задач.
Как думаете, мне с моей эмоциональностью стоит посоревноваться с итальянцами или всё же для начала стоит вызвать на дуэль народов Чукотки :)
Ладно… В общем история повторяется, как уже было с обсуждением Нокии 3 года назад, как происходят попытки объяснить людям, сидящим в SVN плюсы git'а, в спорах любителей SQL и noSQL и пр.: все просят «думать», заваливают терминологией (которую порой не понимают), цифрами (которые не умеют анализировать — в этой дискусии этого правда не было), после ответа на один вопрос задают «уточняющие» (наверное чтобы докапаться, где человек споткнётся), пытаются осмеять, подловить на незнании, дают советы и пр. пр., а воз и ныне там…
Ладно… Вот вам напоследок выдержка из комментария настоящего Программиста (ingspree — между прочим тоже на конференциях выступает):
Если посмотреть полную версию, то (я очень надеюсь на это!) должно быть заметно, что я таки стараюсь объяснить, о чëм речь. Большая проблема темы в том, что никто о ней не рассказывает/не пишет понятными словами, все быстро скатываются на специфичную терминологию и считают само собой разумеющимся, что всем понятно, о чëм речь и зачем это.
В принципе вы даже косвенно подтвердили мою уверенность, что многие (но не все) конференции (а особенно по Java) превратились из просветительского и образовательного мероприятия либо в откровенное зарабатывание бабла, либо в самопиар, либо в маркеттинговые плащадки по всё той же продаже «серебряных пуль» для решения проблем уже проданных. Вы же докладчик? Интересно, а на сессии вопросов и ответов вы тоже на все неудобные вопросы, на которые сами ответов не знаете, в Гугл посылаете и сыплете такими красивыми, но такими далёкими от решения практических проблем, теоретическими выкладками? В принципе это довольно давний (что даже школьники в форумах уже давно освоили) и даже уже неинтерсный способ приструнить вопрошающего, а заодно повысить своё самомнение на ровном месте, при этом не дав конечно и толики ответа на то, что спрашивали изначально.
Вы не только не смогли ответить практически ни на один мой вопрос внятно (а не наборами тэгов с посылом «ищи в Гугле»), но также не смогли из контекста обсуждения понять, что я хожу (да-да) на конференции, смотрю на доклады и докладчиков, и в принципе готов получать знания (ну потому что понимаю, что я не такой умный (как вы?) и у меня ещё есть куда развиваться), а моё ощущение от конференций появилось не на ровном месте.
Откуда вы взяли, что я считаю, что «Java задолбала» я вообще не понял: я просто указал на минусы Java (с надеждой и ожиданием разочароваться в своём видении — тут же такие гуру собрались, раз знания в народ на конференциях толкают), а также преподнёс сокращённую историю того, как классно смогли продать «серебряную пулю» под названием Java энтерпрайзу с его «индусами» и любовью к дешёвым (и не очень квалифицированным) работникам, к подхожу «компенсируем качество количеством», а также дал небольшой дайджест, что из этого вышло (сославшись на темы конференций, показывающих проблемы, о которых во время прослушивания изначально красивой сказки никто и подумать не мог).
В общем последнее, что обычно делают люди, когда уже доводов не осталось — это начинают раздавать советы…
В принципе гуру на поверху оказались просто пшиком и шарманщиками, что только и могут с утра до вечера крутить гайку на 12… Жаль :(
По моему все подобные обзоры нужно начинать с того, что за экран у ноута (тип матрицы и разрешение), чтобы не тратить время на бессымсленное чтение или даже пролистывание до самого критичного… Хотя бы потому, что подавляющее большинство времени пользования ноутом мы сморим именно в экран и то говно, что в большинстве своём ставят производители в свои устройства никакой классной начинкой оправдать нельзя.
Дизайнеры захватили Google? :) На самом деле такое ощущение, что проблема интерфейсов Гугл, которая до некоторого времени действительно была довольно актуальна, настолько крепко засела в наборе комплексов гугловчан, что они готовы предлагать всё более и более экспериментальные интерфейсы, чтобы как бы не отставать и всячески следовать за трендом. При этом наболевшие программные проблемы не исправляются. Последнее обновление YouTube тому пример.
лямбда билды доступны для публичного скачивания уже 100 лет.
То же самое про boost lambda можно сказать и присутсвие в C++ этих лямд. Поэтому ваш плач, что у вас GCC 4.5, в которой «ничаво не работает» совершенно неконструктивен — вы просто пошли по пути наименьшего сопротивления, решив не заморачиваться, а просто свалив всю вину за свою некомпетентность на язык.
Уважаемый, обсуждать синтаксис любых языков скучно и не интересно. Язык для меня — это семантика, а не синтаксис. Для синтаксиса есть IDE.
Для написания наверное убогий и многословный синтаксис — это не такая уж и большая проблема, но вот для последующей поддержки — вот это да! Когда к коду возвращаешься через пару лет, или даже кто-то другой начинает в нём разбираться — вот тут и начинается откровенное давление всей этой избыточности, которая к решению задачи по сути не имеет никакого отношения. Да и IDE разные: та же Idea всячески скрывает и сворачивает в Scala и Closure представления огромные и адово избыточные тексты на java, чтобы разработчику было проще их читать. Значит наверное не я один охреневаю от того, сколько же пустой хрени приходится забивать, а потом видеть на java, чтобы всё это хотя бы заработало. В других IDE такой дружественности как-то не заметил, а с моим кодом не только я, но и команда с разными IDE работает.
А вы случаем не из тех, которым скучно создавать для магических чисел именованные и осмысленные финализированные переменные, чтобы во время поддержки было более понятно, какой смысл был вложен в очередной «42» или что хуже «58»? Ведь на этапе написания и так всё понятно, и вообще это проблема того, кто потом в этом говне разбираться будет?
Ну и должен заметить, что услышав слово DSL — я хватаюсь за пистолет (TheShade знает почему) ;)
Надеюсь не чтобы вышибить себе мозги?.. Шутка :) Мне TheShade спросить, или вы сами поясните? Пока эта фраза совершенно бессмысленна и откровенный bullshit. Посмею только предположить, что эта неприязнь скорее всего основана только на вашем негативном опыте. Но тот же issue-трекер YouTrack от JetBrains написан с использованием DSL, и они уже не раз говорили, как этот изначально заложенный в проект механизм позволял им на порядок делать меньше работы, чем если бы они лабали всё на raw-java (что вроде бы делается с JIRA). А ещё можете спросить у Кекса на конференции, как он пишет на Java и для упрощения кода пытается делать этакие небольшие локальные DSL, чтобы не генерить 10 строк кода, когда можно обойтись более лаконичными 2. Может опыт других участников конференции позволит вам обрести катарсис и просветление в этом вопросе?
Мне конечно же нужно решить задачу: нужно гарантировано (обязательно!) вызвать close, как можно ближе к моменту, когда ресурс уже не используется, вызвать один раз (обязательно!), при этом сделать так, чтобы снизить вероятность того, что этот вызов будет забыт при следующей «раздаче костылей» например неожиданным появлением return в середине какой-нибудь функции. Как это делается с помощью WeakReference? Приведите более развёрнуто или ссылку дайте — потому что я про них знаю, но каким боком они мне гарантируют закрытие соединения в момент, когда оно мне уже точно не нужно — я не понимаю.
Про реализацию RAM-машины за пару месяцев (!!!) — вот уж точно вся сила и простота java в одной фразе! :)
Раз вы ещё не поняли, что я неплохо осведомлён про проблемы счётчика ссылок, то вот вам ответы:
1. в той реализации, что привёл я — будем получать откровенную задницу, потому что использовать этот код в многопоточной среде (который был написан за минуту и 5 секунд обдумывания, учитывая то что я на C++ уже довольно долго не программлю на регулярной основе), это всё равно что использовать HashMap вместо ConcurrencyHashMap в той же самой многопоточной среде. Конечно код требует доработки с учётом требования многопоточности (ну не 2 месяца!). Простое, но наверное не самое лучшее решение — это реализовать что-то типа механизма sinchonized функций, чтобы в каждый момент времени только один поток мог что-то менять в разделяемом ресурсе счётчике, благо у нас функции-то элементарные и быстрые, а долгая инициализация и запуск использования ресурса запускается один раз (для реализации этого можно привлечь boost Thread, который например позволит уйти от использования системных вызовов и сделает код мультиплатформенным).
2. смотря какая либа: если это что-то старое и в ней поставляется какое-то api, которое требует после всего этого вызвать какую-то дессериализацию, то ничто не мешает написать обёртку над её api c использованием того же механизма счётчика, который будет автоматом запускать эту дессериализацию, когда обработчик из либы нам не нужен. Если это что-то новое, написанное с использованием стандарта C++11, то тут вообще проблем быть не должно, если конечно разработчик не сраный «индус» (я не о нации — я о типе разработчиков), которые умудряются даже на java такое творить, что волосы встают дыбом на самых причинных местах, если чувак реально писал с использованием стандартной техники — механизм дессериализации для функционала будет вызван автоматом. Надеюсь я вас правильно понял и ответил на этот вопрос, потому что ответил так, как понял пространное «дружить со сторонней либой, поставляемой в бинарниках»… Если не то — уточните вопрос.
3. проблема loop-ов — есть такое. Но никто не обещал «серебряной пули». Разрешается использованием механизма аналогичного weak_prt, например. А вообще крайне сложно что-то действительно универсальное для столь пространной постановки задачи, вырванной из контекста. Думать нужно… а вы что хотели?
А давайте я вам ещё помогу и сам себе задам вопрос: а что будет, если моя мегаумная ссылка в какое-нибудь статическое хранилище попадёт, в котором будет сидеть до посинениязакрытия программы? Да, это тоже проблема :) Мне отвечать? Или я уже сумел показать, что понимаю проблемы и этого подхода.
Ещё раз: я прекрасноо понимаю, что «серебряной пули» нет, но есть механизмы, применение которых оправдано или не очень в той или иной ситуации. Отличие C++ от Java в том, что я могу реализовать эти механизмы используя сам язык и возможности (в подавляющем большинстве случаев), заложенные в нём, на Java такой универсальности нет. С другой стороны механизмы уже заложенные в Java подходят наверное для большинства задач и не приходится «изобретать велосипед» каждый раз, но когда он необходим — возникает проблема, как то написание за 2 месяца эмулятора RAM машины.
Расскажите или ткните носом на то, как использовать WeakReference для автоматического вызова close как можно ближе к моменту, когда ресурс нам уже не нужен — это гораздо интереснее (ну по крайней мере для меня) чем переливать из пустого в порожнее то, что мы и так оба знаем и понимаем.
Я не очень понял, что в вашем понимании является революционными технологиями на java (неужели вы про какой-то там Spring или Maven? — ну я вас умоляю), потому что я-то как раз под революционными технологиями понимал сами основы java, а именно JVM и Garbage Collector. И я прекрасно осознаю, что Java — это не первый язык где они применяются, но именно Java популяризировала эти идеи и сделала массовыми. И да, я не зря написал «для своего времени»: сами идеи-то по-началу создают такой эффект «Вау!», но время и опыт работы уже расставили по своим местам многое: изначальная идея «Написал один раз — запустил где угодно» оказалась не такой уж и жизнеспособной — это в принципе работает только на больших компьютерах (да и то… есть куча нюансов), а в мобильной сфере java по сути не представлена (java на Android — это на самом деле отдельная несовместимая с изначальным JVM от Оракл сущность эксплуатирующая по сути только синтаксис java), а GC (вот уж где все ждали той самой «серебряной пули», которая по сути и продала Java корпорациям и той армии дешёвых индусов в них, которые, как оказалось, даже на Java творить чёрти знает что — сходите на доклад чувака из Plumbr про утечки памяти в java — он там наверняка упомянет, кто был первым их клиентом — не удивлюсь, если то же было в своё время с java — в общем я что-то отвлёкся)… Так вот GC порой бывает слишком неуправляем и приводящий к скрытым ошибкам, которые проявляются только когда продукт уже какое-то время на продакшине, поэтому из года в год, из конференции в конференцию перетекают темы о том как правильно курить GC, да и для некоторых проектов эта технология оказалась какой-то слишком неуправляемой (ну например приведите мне хоть один более или менее популярный браузер, написанный на java, ну или игру уровня графики да хоть да хоть Call of Duty пятилетней давности).
Слушайте, вы меня пытаетесь убедить, что «не всё так просто» (с)… Так я, блин, это и так знаю (я это понял, ещё когда Александреску и Майерса читал). Приведённый мной код — это этакий псевдокод, который позволяет просто концепцию понять. Конечно нужно ещё посидеть, подумать и написать гораздо больше с учётом тех требований, что есть (как то многопоточность, например). Но я напишу это один раз и буду пользовать где это необходимо., а лучше даже писать ничего не буду, а буду пользовать уже написанные инструменты, потому что в C++ это возможно. А в Java? Не уверен… Хотя может я что-то не знаю?
Вы же сейчас хотите, чтобы я вам на коленке и по-быстрому тут чуть ли не boost заново написал, по сути пытаясь в очередной раз показать, что «серебряной пули» нет. Так я и так это знаю!
Мне вот интересно, как написать аналогичный по функционалу счётчик ссылок на Java (да-да, чтобы close автоматом вызывалась, когда она нам не нужна), ведь C++ и Java как бы эквивалентны.
А по поводу лямбд и сборки GCC4.5 — есть boost, в котором лямбды ещё с использованием синтаксиса предоставляемого C++03 реализованы.
Ну и потом, даже передача функции по имени в C++ гораздо более логична и описана в любой книжке по C++. Да, тут тоже не очень красиво, что в этом случае придётся определить именованную функцию функцию за пределами текущей функции…
Хотя можно опять же можно определить структуру или класс внутри функции, а в ней уже статик функцию и передавать её. Это вроде бы не отличается от того, что есть в java… Но тут мы неожиданно вспоминаем про макросы, через которые всю эту тягомотину и кучу текста можно привести к тому, что для нас действительно имеет значение сейчас, а именно передаваемые параметры, возвращаемое значение, логика передаваемой функции…
А ещё есть функторы, а на их основе можно сделать опять же делегаты…
Да короче в C++, даже в старом, есть механизмы, которые мне, как разработчику позволят сделать что-то типа DSL для этой задачи, что в будущем облегчит использование передачи функции в другую функцию, с минимумом текста и прочего булщита, которое совершенно не имеет отношения к решаемой задачи.
В Java я таких механизмов к сожалению не нахожу, поэтому каждый раз приходится писать туеву хучу текста из всяких new, public, static + имя функции, в то время как мне всё это не нужно: я просто хочу, чтобы внутри одной функции выполнялась логика передаваемой. Может я просто чего-то не знаю — если ткнёте носом, как это сделать на Java — буду признателен (помните, что на Гугл я уже забанен:)) ).
ну да, теоретик из меня конечно полное говно… Самоучка — что с меня взять… Но всегда приятно узнавать что-то новое.
А теперь по поводу того, как реализуется счётчики и почему это невозможно нормально сделать в java: например за основу можно взять общеизвестный shared_prt. Аналогично реализуется счётчик для открытой базы: в классе cчётчика реализуем указатель на переменную, в которую как раз и пишется количество копий. Ну что-то типа такого (это псевдокод, который даже скорее всего не компилится, а db — это база данных за которую мы не хотим забыть закрыть, когда нам соединение с ней уже не нужно, т.е. последняя копия уничтожается и счётчик уходит в 0):
На Java это невозможно хотя бы потому что все объекты создаются в heap, а деструктор отсутвует как сущность.
Теперь по поводу убожества с передачей функции в функцию. На java приходится писать минимум какой-то интерфейс, который потом имплементировать минимум в анонимном классе и получается что-то типа (очередная пачка псевдокода):
interface Comparer {
int compare();
}
…
public void foo(Comparer comparer) {...}
…
foo( new Comparer() { public int compare() {… } } ) // что это за хрень такая длинная даже без реализации???
Как это делается в современном C++
void foo(int (*)())
foo([] {...}) // и всё, если я не ошибся с синтаксисом лямбд в C++ (блин, нужно срочно пописать на C++, а то я совсем оджавился)
Да-да, я знаю, что в восьмой появятся вроде как лямбды… Но сейчас-то их нет :) А в C++ есть…
Какое отношение невозможности предсказания того, что алгоритм завершится за конечное число шагов, а не будет бесконечным, имеет к тому, что счётчик ссылок на java если и реализуем, то выглядить скорее всего будет хуже чем то убожество, что получается, когда пытаешься реализовать хоть что-то похожее на механизм передачи методов в другие методы?
блин :( Ну хоть обзор того, что собираешься рассказать, чтобы подогреть интерес… Просто чего тащиться если там только про loop-ссылки и связанное с этим только будет, о чём и так все знают?
Блин, во мне сейчас борятся питонист средней паршивости и хардкорный любитель плюсов! А можно оба?
По поводу конференций сказать много что-то существенное особенно не могу, поэтому далее только рассуждения дилетанта, (осторожно!) возможно глупые.
Я их (конференции) не особо считаю, но по ощущениям их меньше, чем по Java. Но именно это скорее всего и создаёт ощущение какой-то большей основательности и целостности предоставляемого материала на каждой из конференций… Почему их меньше? Ну с моей точки зрения из-за меньшей популярности. Всё, что связано с Java тянется за локомативом под названием JavaEE. Энтерпрайз рулит, а впарить ему что-то ещё, когда там так основательно обосновалась Java, ох как непросто. Плюс ни за одним из этих языков не стоит такой мощи как Оракл. Да, конечно и MS устраивают всякие NativeDays, да и Google активно продвигает и использует внутри себя Python, но для Оракл Java — это в первую очередь продукт, который они всячески продают (не напрямую конечно), в первую очередь конечно же корпоративному рынку, поэтому Оракл конечно же выгодно поддерживать и подпитывать комьюнити, что в том числе делается и через кучу конференций, и через всякие тренинги, и через всякое сертифицирование и прочие мероприятия связанные с Java.
Чтобы не создавалось впечатления, что «Оракл во всём виновата» замечу, что Java конечно популярна не только потому что это Оракл (или ранее Sun) продавила — если бы в Java не было бы кое-каких действительно революционных для совего времени технологий, то как бы Sun не пыжилась — ничего бы не получилось.
Но я говорю не про прекрасное прошлое, а про немного странное настоящее, в котором, как мне кажется, конференций по Java ух как много.
Мне приходится работать и соответсвенно общаться с разными людьми. И поверьте, меня не окружают сплошь идиоты. Я наверное немного переборщил с эмоциональностью моего предыдущего комментария… Сори… Но например даже рассказ про такую элементарную штуку как счётчик ссылок, который, например, можно было бы использовать для автоматического закрытия соединения с базой, но которая по естественным причинам невозможна в java, у людей округляет глаза — для многих свет клином сошёлся на GC (а счётчик ссылок — это то решение, которое используется в Objectove-C, С++ и вроде как Питоне для автоматического возвращения памяти в кучу), а проблему забывания закрытия соединения в лучшем случае решается использованием try-finally конструкций с ручным проставлением close (которые тоже ещё нужно не забыть написать) в каждом месте где происходит открытие соединения.
И на java они вполне себе вменяемо работают. Проблема-то в другом: однажды проглотив эту пилюлю java они теперь ни во что другое смотреть не хотят. А технологии, нереализуемые на java для них просто не существуют. Ну в лучшем случае глянут на какую-нибудь Scala — но она настолько мозг вынесет, что они скорее всего опять убегут в своё комфортный мир Java, найдя 100500 оправданий почему овчинка выделки не стоит. Отсюда и мифы.
И много электронных книг в торрентах из того же Amazon? Вот пример Amazon ярко показывает, что можно и контент досталять и зарабатывать. Есть тот же DRM и прочие штуки, которые сильно уменьшают смысл выкладывание в торренты.
Поюс ко всему, что мешает выкладывать сканы книг и оцифрованные «любителями» книги в те же торренты (естественно не всегда с нормальным качетвом). По мне так эти торренты процентов на 90 именно такими оцифрованными бумажными книгами и завалены. А нормальной цифровой копии днём с огнём не сыщешь, причём даже с острым желанием купить эту цифровую копию.
Плюс качество книг, особенно технической литературы такое (мягкая обложка, книги часто склеяны, а не прошиты и пр.), что по ходу издательство пытается заработать ещё раз на мне же, при переиздании, когда у меня предыдущий экземпляр совсем на странички развалится…
«Не богадельня» — это отмазка из разряда, когда ничего делать не хотим…
Блин, заработайте на мне! Только я не хочу певозить груду макулатуры при очередном переезде, а хочу все книги иметь с собой в своём планшете.
Движение к тому, что издатель должен думать о том, как в лучшем виде донести продукт до конечного пользователя, поддерживаю обоими руками. Но только, в блоге Питера на Хабре, постоянно возникает вопрос: «А будет ли электронная версия», — на что как правило ответ один: «Мы делаем всё возможное, и пытаемся договориться, но правообладатель (это как правило какой-то зарубежный издатель) пока не велит». Вот это и бесит больше всего: какой-то крупный правообладатель получает монопольное право на распространение книги, и мало того, что сами не делают удобно, так и другим не дают. Или я что-то не понимаю? Где в этой реальности, где приходится сталкиваться постоянно с этим, работает ваш тезис о том, что необходимо ?
По поводу приоритетов: сразу хочу сказать, что у меня прижилась только скрам-доска, немного модифицированная под себя. Системы с расставлением цветов, всяких там разделений задач на кучи (как самая известная: разделить задачи на 4 категории: важное и срочное, важное и не срочное, неважное и срочное, и нескрочное и неважное) вообще не прижились. Например сортировка, вынесенная в скобочки в предыдущем предложении, приводила к тому, что как правило кучка «важное и несрочное» была забита до отвала, а неважное и несрочное вообще было пустым. Важные и срочные дела тоже просто решались в этот же момент, а не перекладывались… В общем я так и не смог для себя решить, как раскладывать задачи в этой системе, и она тихо отмерла… На скрам доске я каждую задачу по сути сравниваю только с двумя, между которыми потенциально её необходимо втиснуть. Все задачи важны, но как правило не привязаны ко времени. Это, как мне кажется, гораздо проще. Да и за что браться в текущий момент понятно: за самую верхнюю задачу.
Со временем я пришёл к ещё кое к чему, что облегчило жизнь: если задача уже откладывалась несколько раз, и не стало ни лучше, ни хуже, то может её выполнять совсем не нужно — тут отголоски жёсткого планирования, которое я тоже попробовал: всячески старался выполнить вообще все зафиксированне задачи, даже те, что были набраны эмоциально. Результат: задача не выполняется, переносится, сначала расстраиваешься, а потом привыкаешь, и как следсвтие только и делаешь, что автоматом перекладываешь задачу на потом. Теперь, отложив задачу несколько раз, я просто задумываюсь, а нужно ли её вообще и делать сейчас? Если не нужно делать вообще: удаляем. Если нужно, но ко времени выполнение никак не привязано: переносим в личную скрам-доску, обозначив её приоритет по положению, относительно других задач.
Мне всегда было интересно, как выглядит кармадрочер, а тут вы нарисовались.
Я прямо как бидон сметаны съел.
А вы, скажите, когда друг другу...Ладно, не здесь (это место не для пошлых шуток!) :)Ну зовите ещё друзей! «Кружите меня, кружите!» (с)
Как думаете, мне с моей эмоциональностью стоит посоревноваться с итальянцами или всё же для начала стоит вызвать на дуэль народов Чукотки :)
Ладно… В общем история повторяется, как уже было с обсуждением Нокии 3 года назад, как происходят попытки объяснить людям, сидящим в SVN плюсы git'а, в спорах любителей SQL и noSQL и пр.: все просят «думать», заваливают терминологией (которую порой не понимают), цифрами (которые не умеют анализировать — в этой дискусии этого правда не было), после ответа на один вопрос задают «уточняющие» (наверное чтобы докапаться, где человек споткнётся), пытаются осмеять, подловить на незнании, дают советы и пр. пр., а воз и ныне там…
Ладно… Вот вам напоследок выдержка из комментария настоящего Программиста (ingspree — между прочим тоже на конференциях выступает):Наверное стоит задуматься?
Ну что ж.
В принципе вы даже косвенно подтвердили мою уверенность, что многие (но не все) конференции (а особенно по Java) превратились из просветительского и образовательного мероприятия либо в откровенное зарабатывание бабла, либо в самопиар, либо в маркеттинговые плащадки по всё той же продаже «серебряных пуль» для решения проблем уже проданных. Вы же докладчик? Интересно, а на сессии вопросов и ответов вы тоже на все неудобные вопросы, на которые сами ответов не знаете, в Гугл посылаете и сыплете такими красивыми, но такими далёкими от решения практических проблем, теоретическими выкладками? В принципе это довольно давний (что даже школьники в форумах уже давно освоили) и даже уже неинтерсный способ приструнить вопрошающего, а заодно повысить своё самомнение на ровном месте, при этом не дав конечно и толики ответа на то, что спрашивали изначально.
Вы не только не смогли ответить практически ни на один мой вопрос внятно (а не наборами тэгов с посылом «ищи в Гугле»), но также не смогли из контекста обсуждения понять, что я хожу (да-да) на конференции, смотрю на доклады и докладчиков, и в принципе готов получать знания (ну потому что понимаю, что я не такой умный (как вы?) и у меня ещё есть куда развиваться), а моё ощущение от конференций появилось не на ровном месте.
Откуда вы взяли, что я считаю, что «Java задолбала» я вообще не понял: я просто указал на минусы Java (с надеждой и ожиданием разочароваться в своём видении — тут же такие гуру собрались, раз знания в народ на конференциях толкают), а также преподнёс сокращённую историю того, как классно смогли продать «серебряную пулю» под названием Java энтерпрайзу с его «индусами» и любовью к дешёвым (и не очень квалифицированным) работникам, к подхожу «компенсируем качество количеством», а также дал небольшой дайджест, что из этого вышло (сославшись на темы конференций, показывающих проблемы, о которых во время прослушивания изначально красивой сказки никто и подумать не мог).
В общем последнее, что обычно делают люди, когда уже доводов не осталось — это начинают раздавать советы…
В принципе гуру на поверху оказались просто пшиком и шарманщиками, что только и могут с утра до вечера крутить гайку на 12… Жаль :(
Для написания наверное убогий и многословный синтаксис — это не такая уж и большая проблема, но вот для последующей поддержки — вот это да! Когда к коду возвращаешься через пару лет, или даже кто-то другой начинает в нём разбираться — вот тут и начинается откровенное давление всей этой избыточности, которая к решению задачи по сути не имеет никакого отношения. Да и IDE разные: та же Idea всячески скрывает и сворачивает в Scala и Closure представления огромные и адово избыточные тексты на java, чтобы разработчику было проще их читать. Значит наверное не я один охреневаю от того, сколько же пустой хрени приходится забивать, а потом видеть на java, чтобы всё это хотя бы заработало. В других IDE такой дружественности как-то не заметил, а с моим кодом не только я, но и команда с разными IDE работает.
А вы случаем не из тех, которым скучно создавать для магических чисел именованные и осмысленные финализированные переменные, чтобы во время поддержки было более понятно, какой смысл был вложен в очередной «42» или что хуже «58»? Ведь на этапе написания и так всё понятно, и вообще это проблема того, кто потом в этом говне разбираться будет?
Надеюсь не чтобы вышибить себе мозги?.. Шутка :) Мне TheShade спросить, или вы сами поясните? Пока эта фраза совершенно бессмысленна и откровенный bullshit. Посмею только предположить, что эта неприязнь скорее всего основана только на вашем негативном опыте. Но тот же issue-трекер YouTrack от JetBrains написан с использованием DSL, и они уже не раз говорили, как этот изначально заложенный в проект механизм позволял им на порядок делать меньше работы, чем если бы они лабали всё на raw-java (что вроде бы делается с JIRA). А ещё можете спросить у Кекса на конференции, как он пишет на Java и для упрощения кода пытается делать этакие небольшие локальные DSL, чтобы не генерить 10 строк кода, когда можно обойтись более лаконичными 2. Может опыт других участников конференции позволит вам обрести катарсис и просветление в этом вопросе?
Про реализацию RAM-машины за пару месяцев (!!!) — вот уж точно вся сила и простота java в одной фразе! :)
Раз вы ещё не поняли, что я неплохо осведомлён про проблемы счётчика ссылок, то вот вам ответы:
1. в той реализации, что привёл я — будем получать откровенную задницу, потому что использовать этот код в многопоточной среде (который был написан за минуту и 5 секунд обдумывания, учитывая то что я на C++ уже довольно долго не программлю на регулярной основе), это всё равно что использовать HashMap вместо ConcurrencyHashMap в той же самой многопоточной среде. Конечно код требует доработки с учётом требования многопоточности (ну не 2 месяца!). Простое, но наверное не самое лучшее решение — это реализовать что-то типа механизма sinchonized функций, чтобы в каждый момент времени только один поток мог что-то менять в разделяемом ресурсе счётчике, благо у нас функции-то элементарные и быстрые, а долгая инициализация и запуск использования ресурса запускается один раз (для реализации этого можно привлечь boost Thread, который например позволит уйти от использования системных вызовов и сделает код мультиплатформенным).
2. смотря какая либа: если это что-то старое и в ней поставляется какое-то api, которое требует после всего этого вызвать какую-то дессериализацию, то ничто не мешает написать обёртку над её api c использованием того же механизма счётчика, который будет автоматом запускать эту дессериализацию, когда обработчик из либы нам не нужен. Если это что-то новое, написанное с использованием стандарта C++11, то тут вообще проблем быть не должно, если конечно разработчик не сраный «индус» (я не о нации — я о типе разработчиков), которые умудряются даже на java такое творить, что волосы встают дыбом на самых причинных местах, если чувак реально писал с использованием стандартной техники — механизм дессериализации для функционала будет вызван автоматом. Надеюсь я вас правильно понял и ответил на этот вопрос, потому что ответил так, как понял пространное «дружить со сторонней либой, поставляемой в бинарниках»… Если не то — уточните вопрос.
3. проблема loop-ов — есть такое. Но никто не обещал «серебряной пули». Разрешается использованием механизма аналогичного weak_prt, например. А вообще крайне сложно что-то действительно универсальное для столь пространной постановки задачи, вырванной из контекста. Думать нужно… а вы что хотели?
А давайте я вам ещё помогу и сам себе задам вопрос: а что будет, если моя мегаумная ссылка в какое-нибудь статическое хранилище попадёт, в котором будет сидеть до
посинениязакрытия программы? Да, это тоже проблема :) Мне отвечать? Или я уже сумел показать, что понимаю проблемы и этого подхода.Ещё раз: я прекрасноо понимаю, что «серебряной пули» нет, но есть механизмы, применение которых оправдано или не очень в той или иной ситуации. Отличие C++ от Java в том, что я могу реализовать эти механизмы используя сам язык и возможности (в подавляющем большинстве случаев), заложенные в нём, на Java такой универсальности нет. С другой стороны механизмы уже заложенные в Java подходят наверное для большинства задач и не приходится «изобретать велосипед» каждый раз, но когда он необходим — возникает проблема, как то написание за 2 месяца эмулятора RAM машины.
Расскажите или ткните носом на то, как использовать WeakReference для автоматического вызова close как можно ближе к моменту, когда ресурс нам уже не нужен — это гораздо интереснее (ну по крайней мере для меня) чем переливать из пустого в порожнее то, что мы и так оба знаем и понимаем.
Вы же сейчас хотите, чтобы я вам на коленке и по-быстрому тут чуть ли не boost заново написал, по сути пытаясь в очередной раз показать, что «серебряной пули» нет. Так я и так это знаю!
Мне вот интересно, как написать аналогичный по функционалу счётчик ссылок на Java (да-да, чтобы close автоматом вызывалась, когда она нам не нужна), ведь C++ и Java как бы эквивалентны.
А по поводу лямбд и сборки GCC4.5 — есть boost, в котором лямбды ещё с использованием синтаксиса предоставляемого C++03 реализованы.
Ну и потом, даже передача функции по имени в C++ гораздо более логична и описана в любой книжке по C++. Да, тут тоже не очень красиво, что в этом случае придётся определить именованную функцию функцию за пределами текущей функции…
Хотя можно опять же можно определить структуру или класс внутри функции, а в ней уже статик функцию и передавать её. Это вроде бы не отличается от того, что есть в java… Но тут мы неожиданно вспоминаем про макросы, через которые всю эту тягомотину и кучу текста можно привести к тому, что для нас действительно имеет значение сейчас, а именно передаваемые параметры, возвращаемое значение, логика передаваемой функции…
А ещё есть функторы, а на их основе можно сделать опять же делегаты…
Да короче в C++, даже в старом, есть механизмы, которые мне, как разработчику позволят сделать что-то типа DSL для этой задачи, что в будущем облегчит использование передачи функции в другую функцию, с минимумом текста и прочего булщита, которое совершенно не имеет отношения к решаемой задачи.
В Java я таких механизмов к сожалению не нахожу, поэтому каждый раз приходится писать туеву хучу текста из всяких new, public, static + имя функции, в то время как мне всё это не нужно: я просто хочу, чтобы внутри одной функции выполнялась логика передаваемой. Может я просто чего-то не знаю — если ткнёте носом, как это сделать на Java — буду признателен (помните, что на Гугл я уже забанен:)) ).
А теперь по поводу того, как реализуется счётчики и почему это невозможно нормально сделать в java: например за основу можно взять общеизвестный shared_prt. Аналогично реализуется счётчик для открытой базы: в классе cчётчика реализуем указатель на переменную, в которую как раз и пишется количество копий. Ну что-то типа такого (это псевдокод, который даже скорее всего не компилится, а db — это база данных за которую мы не хотим забыть закрыть, когда нам соединение с ней уже не нужно, т.е. последняя копия уничтожается и счётчик уходит в 0):
struct A {
A() {
a = new int(1);
db.open();
}
~A() {
if( 0 == (--(*a)) ) {
delete a;
db.close();
}
}
A& operator=(const A& src) {
this.~A();
a = src.a;
(*a)++;
}
A(const A& src) {
a = src.a;
(*a)++;
}
private:
int* a;
}
На Java это невозможно хотя бы потому что все объекты создаются в heap, а деструктор отсутвует как сущность.
Теперь по поводу убожества с передачей функции в функцию. На java приходится писать минимум какой-то интерфейс, который потом имплементировать минимум в анонимном классе и получается что-то типа (очередная пачка псевдокода):
interface Comparer {
int compare();
}
…
public void foo(Comparer comparer) {...}
…
foo( new Comparer() { public int compare() {… } } ) // что это за хрень такая длинная даже без реализации???
Как это делается в современном C++
void foo(int (*)())
foo([] {...}) // и всё, если я не ошибся с синтаксисом лямбд в C++ (блин, нужно срочно пописать на C++, а то я совсем оджавился)
Да-да, я знаю, что в восьмой появятся вроде как лямбды… Но сейчас-то их нет :) А в C++ есть…
По поводу конференций сказать много что-то существенное особенно не могу, поэтому далее только рассуждения дилетанта, (осторожно!) возможно глупые.
Я их (конференции) не особо считаю, но по ощущениям их меньше, чем по Java. Но именно это скорее всего и создаёт ощущение какой-то большей основательности и целостности предоставляемого материала на каждой из конференций… Почему их меньше? Ну с моей точки зрения из-за меньшей популярности. Всё, что связано с Java тянется за локомативом под названием JavaEE. Энтерпрайз рулит, а впарить ему что-то ещё, когда там так основательно обосновалась Java, ох как непросто. Плюс ни за одним из этих языков не стоит такой мощи как Оракл. Да, конечно и MS устраивают всякие NativeDays, да и Google активно продвигает и использует внутри себя Python, но для Оракл Java — это в первую очередь продукт, который они всячески продают (не напрямую конечно), в первую очередь конечно же корпоративному рынку, поэтому Оракл конечно же выгодно поддерживать и подпитывать комьюнити, что в том числе делается и через кучу конференций, и через всякие тренинги, и через всякое сертифицирование и прочие мероприятия связанные с Java.
Чтобы не создавалось впечатления, что «Оракл во всём виновата» замечу, что Java конечно популярна не только потому что это Оракл (или ранее Sun) продавила — если бы в Java не было бы кое-каких действительно революционных для совего времени технологий, то как бы Sun не пыжилась — ничего бы не получилось.
Но я говорю не про прекрасное прошлое, а про немного странное настоящее, в котором, как мне кажется, конференций по Java ух как много.
И на java они вполне себе вменяемо работают. Проблема-то в другом: однажды проглотив эту пилюлю java они теперь ни во что другое смотреть не хотят. А технологии, нереализуемые на java для них просто не существуют. Ну в лучшем случае глянут на какую-нибудь Scala — но она настолько мозг вынесет, что они скорее всего опять убегут в своё комфортный мир Java, найдя 100500 оправданий почему овчинка выделки не стоит. Отсюда и мифы.