Ну вот так — не хватило тактов процессора на сборку мусора. Причем например на вашей машине может хватать, а вот на машинке по слабее нет. Если же финализатора нет — то вы увидите баг и на своей машине.
Хм а они связаны :) первый и второй аргумент.
Дело в том что не надо маскировать свои ошибки — если ошибка есть — пусть лучше ударит она по голове вам на девелоперской машине под отладкой, а не пользователю в продакшене.
Ну и что — в коде без ошибок — Dispose вызывается ВСЕГДА кроме краша приложения, но при краше и финализатор не вызовется. С другой стороны финализатор иногда скрывает ошибки программирования — когда Dispose корректно не вызван. Особенно жестко это проявляется в асинхронных и многопоточных приложениях.
Из практики — используйте IDisposable и забудьте про Finalize навсегда. Мало того что для сборки объекта с этим методом нужно 2 сборки мусора вместо одной, так еще и будете периодически ловить очень странные утечки ресурсов в коде. Ловить будете очень долго — гарантирую.
Из практики — недавно поймали именно утечку из финализатора в классе WritableBitmap в WPF. Искали около 2х месяцев с собаками.
Это понятно, но что мешает сделать тот же LINQ для вычисления на GPU? Ясно ведь что используется COM — подобный API + расширения компилятора. Почему бы это не добавить в мейнстрим язык для Microsoft.
А начет веб сервисов — вот представьте что у вас веб сервис по расчету MD5 хеша :)
Ну — да :)
На самом деле конечно нет. Тк возврат денег за Windows это дело очень геморойное. + Windows фактически стандарт де-факто ну и стоит OEM личензия сущие копейки.
С iOS устроийствами все совсем не так — возврат сделать очень просто, а стоимость устройства достаточно высока. Так что тут такой подсчет кажется правильным. Если хотите, то можем сделать еще 10% минус на корпоративных пользователей.
Но цифра все равно впечатляет :)
>Я не поверю, что вы не поняли, что я говорил о флэшовом ютубе.
Естественно понял — только вот разницы между флешем, html5 и ios приложением я лично не вижу. Хороший сервис — все нормально сделано. Я так понимаю что разница есть на тех сервисах где html5 не доступен или нормально не работает.
>Что примечательно: я заметил тут счастливого себя, я заметил тут счастливую компанию Эппл, но не заметил упоминания о счастливых пользователях компании Эппл ;)
А они все в циферках финансовых отчетов. Берем количество проданных устройств, вычитаем количество возвратов, скидываем процентов 5-10 от полученной суммы на тех кто возвращать отказался и вуоля — довольные пользователи. video.mail.ru/bk/maksim909/578/641.html?newbest_from_main=1 — ссылка на ролик :)
>Смотрел ютуб — не ощутил никакой разницы с десктопом.
Не поверите — на iPad мне нравится смотреть ютуб и вимео еще больше чем на десктопе :) Вы попробуйте например в mail.ru громкость внутри ролика поменять.
У немя например на Desire было невозможно пользоваться турбофильмом тк выбор качества был практически невозможен (на стандартном все очень тормозило)
>А кто-то учитывает интересы пользователей, а не говорит им «вам это не нужно».
Ну да — компания Apple решила что пользователям её устройств не нужна фича, качество которой не соответствует стандартам компании. А шо такого? Вот вы посчитали что это фича вам нужна и купили другое устройство — все счастливы. И вы — тем что у вас есть Flash на планшете, и Apple тем что им не звонят покупатели и не задают вопроса — какого хрена все функции моего планшета сделаны просто офигенно, а одна то работает — то не работает.
Угу — а вы лично пробовали использовать Flash на том же адндройде. Лично у меня не получилось даже смотреть пресловутое видео из-за практически полной неюзабельности интерфейса плеера. Каждая компания делает свой выбор — кто-то выпускает горячее как только появляется возможность. Кто-то не выпускает фичу до того момента пока она не будет полностью соответствовать стандартам качества компании.
Дело не в том что Apple решает что пользователю удобно или нет. Дело в том что они не могут заставить Flash работать на iOS так, чтобы он соответствовал внутренним стандартам качества компании.
Тут вообще 2 больших проблемы помимо батарейки
1) Flash предполагает что у вас есть курсор ( сюрпрайз но вот у тач девайсов его нет и как его нормально прикрутить никто не знает), как следствие при отсутствии курсора невозможно сделать например mouse_over или mouse_leave. Так что при выкате такой функциональности все покупатели у которых эти действия не работаю будут наезжать на Apple — что за фигню не рабочую вы тут выкатили. И будут абсолютно правы.
2) Flash это все-таки byte-code и для нормальной работы на мобильных устройствах его VM надо нехило переработать (например дописать систему управления ресурсами в зависимости от системных Event-ов). Учитывая 1й пункт и довольно ужасное качество flash-плеера как таковое (гаврики из Adobe даже нормальное портирование сделать не могут) то имхо Apple — даже если им дадут исходники flash-плеера, вряд-ли будут этим заниматься — гемороя много, а выхлопа нет.
Первый пример по мне читабельней тк явно выражает логику кода:
если пользователь зарегистрирован,
если пользователь имеет право на просмотр записи
если эта запись присутствует в базе данных
то нужно вывести ему эту запись
(кстати про доступность информации из базы — вполне можно вынести проверку доступности именно в тот код, кде доступ происходит — более логично)
Вторая запись мне говорит:
если пользователь не зарегистрирован
соощить обо ошибке
если пользователь не имеет прав
сообщить об ошибке (примерно на этом месте я забываю зачем я вообще
полез в эту функцию)
если записи не существует в базе
сообщить об ошибке
вывести результат
вы говорите об абстрактной читаемости и красоте, а я о практической — которая помогает понимать — что код делает и зачем он был написан.
От большой вложенности стоит спасаться — это факт, но для этого есть другие средства:
1) лучшая локализация места в котором происходи ошибка
2) extract method
Вот сколько уже борюсь с этим — не помогает.
Ваше предложение плохо тем что вы подменяете логику работы кода и ухудшаете его читабельность.
Вместо того чтобы сказать при определенном условии — сделай то-то и то (например — если прошел запрос к базе данных — выведи ответ на веб страницу), а если упало — обработай ошибку. Вы меняете его на если что-то упало — выведи ошибку, а вот если не упало — сделай то-то (если запрос не прошел — выведи ошибку, а если прошел — напечатай информацию). Это намного более непонятно, тк более специфичная или даже исключительная ситуация обрабатывается раньше чем нормальная логика приложения.
Страх, страх — особенно страшна предложенная реализация тк стек будет жрать как невсебя :) ну а вообще можно написать что реализация простейшая и на самом деле надо вот так :)
Мысль в том чтобы учится правильно с самого начала, а не писать костыли на коленке, а потом ломать свое-же сознание при попытке сделать вещь правильно.
+ пример MSDN показывает какую адову часть работы готов взять на себя F# за вас — просчитываете любую другую последовательность — замените формулу в lambda и вуоля — готовый код без багов в реализации рекурсии готов :)
Ох черт — 3 копейки
1)let (f,s) = (3,2) — тоже pattern matching ( по-русски — сопоставление образцу). Форма match — лиш частный случай, pattern matching же используется повсеместно.
2) Unions — такого типа данных в F# нет, есть Discriminated unions — это очень неплохая реализация идеи АДТ (алгебраические типы данных). Делаю поправку тк это люди программирующие на C/C++ могут не понять смысла этого типа данных и запутаться. Сами DU — великолепная вещь, чего только стоит стандартный Option против TryDoSomething.
3)Ну дайте нормальный пример для фибоначи — то что вы показали просто страх какой-то :) MSDN вариант на Seq
let fib = Seq.unfold (fun state ->Some(fst state + snd state, (snd state, fst state + snd state))) (1,1)
fib |> Seq.take 20
for(var i =0; i<10000; i++)
{
new Task( () => {new WriteableBitmap();}).Start();
Console.WriteLine(i);
}
Подобавляейте Thread.Sleep() внутрь цикла. Результаты уверен вас немного удивят :)
Дело в том что не надо маскировать свои ошибки — если ошибка есть — пусть лучше ударит она по голове вам на девелоперской машине под отладкой, а не пользователю в продакшене.
Из практики — недавно поймали именно утечку из финализатора в классе WritableBitmap в WPF. Искали около 2х месяцев с собаками.
А начет веб сервисов — вот представьте что у вас веб сервис по расчету MD5 хеша :)
Вобщем у вас и у меня видимо разные критерии довольности :)
На самом деле конечно нет. Тк возврат денег за Windows это дело очень геморойное. + Windows фактически стандарт де-факто ну и стоит OEM личензия сущие копейки.
С iOS устроийствами все совсем не так — возврат сделать очень просто, а стоимость устройства достаточно высока. Так что тут такой подсчет кажется правильным. Если хотите, то можем сделать еще 10% минус на корпоративных пользователей.
Но цифра все равно впечатляет :)
Естественно понял — только вот разницы между флешем, html5 и ios приложением я лично не вижу. Хороший сервис — все нормально сделано. Я так понимаю что разница есть на тех сервисах где html5 не доступен или нормально не работает.
>Что примечательно: я заметил тут счастливого себя, я заметил тут счастливую компанию Эппл, но не заметил упоминания о счастливых пользователях компании Эппл ;)
А они все в циферках финансовых отчетов. Берем количество проданных устройств, вычитаем количество возвратов, скидываем процентов 5-10 от полученной суммы на тех кто возвращать отказался и вуоля — довольные пользователи.
video.mail.ru/bk/maksim909/578/641.html?newbest_from_main=1 — ссылка на ролик :)
Не поверите — на iPad мне нравится смотреть ютуб и вимео еще больше чем на десктопе :) Вы попробуйте например в mail.ru громкость внутри ролика поменять.
У немя например на Desire было невозможно пользоваться турбофильмом тк выбор качества был практически невозможен (на стандартном все очень тормозило)
>А кто-то учитывает интересы пользователей, а не говорит им «вам это не нужно».
Ну да — компания Apple решила что пользователям её устройств не нужна фича, качество которой не соответствует стандартам компании. А шо такого? Вот вы посчитали что это фича вам нужна и купили другое устройство — все счастливы. И вы — тем что у вас есть Flash на планшете, и Apple тем что им не звонят покупатели и не задают вопроса — какого хрена все функции моего планшета сделаны просто офигенно, а одна то работает — то не работает.
Тут вообще 2 больших проблемы помимо батарейки
1) Flash предполагает что у вас есть курсор ( сюрпрайз но вот у тач девайсов его нет и как его нормально прикрутить никто не знает), как следствие при отсутствии курсора невозможно сделать например mouse_over или mouse_leave. Так что при выкате такой функциональности все покупатели у которых эти действия не работаю будут наезжать на Apple — что за фигню не рабочую вы тут выкатили. И будут абсолютно правы.
2) Flash это все-таки byte-code и для нормальной работы на мобильных устройствах его VM надо нехило переработать (например дописать систему управления ресурсами в зависимости от системных Event-ов). Учитывая 1й пункт и довольно ужасное качество flash-плеера как таковое (гаврики из Adobe даже нормальное портирование сделать не могут) то имхо Apple — даже если им дадут исходники flash-плеера, вряд-ли будут этим заниматься — гемороя много, а выхлопа нет.
если пользователь зарегистрирован,если пользователь имеет право на просмотр записи
если эта запись присутствует в базе данных
то нужно вывести ему эту запись
(кстати про доступность информации из базы — вполне можно вынести проверку доступности именно в тот код, кде доступ происходит — более логично)
Вторая запись мне говорит:
если пользователь не зарегистрирован
соощить обо ошибке
если пользователь не имеет прав
сообщить об ошибке (примерно на этом месте я забываю зачем я вообще
полез в эту функцию)
если записи не существует в базе
сообщить об ошибке
вывести результат
вы говорите об абстрактной читаемости и красоте, а я о практической — которая помогает понимать — что код делает и зачем он был написан.
От большой вложенности стоит спасаться — это факт, но для этого есть другие средства:
1) лучшая локализация места в котором происходи ошибка
2) extract method
Ваше предложение плохо тем что вы подменяете логику работы кода и ухудшаете его читабельность.
Вместо того чтобы сказать при определенном условии — сделай то-то и то (например — если прошел запрос к базе данных — выведи ответ на веб страницу), а если упало — обработай ошибку. Вы меняете его на если что-то упало — выведи ошибку, а вот если не упало — сделай то-то (если запрос не прошел — выведи ошибку, а если прошел — напечатай информацию). Это намного более непонятно, тк более специфичная или даже исключительная ситуация обрабатывается раньше чем нормальная логика приложения.
Мысль в том чтобы учится правильно с самого начала, а не писать костыли на коленке, а потом ломать свое-же сознание при попытке сделать вещь правильно.
+ пример MSDN показывает какую адову часть работы готов взять на себя F# за вас — просчитываете любую другую последовательность — замените формулу в lambda и вуоля — готовый код без багов в реализации рекурсии готов :)
1)let (f,s) = (3,2) — тоже pattern matching ( по-русски — сопоставление образцу). Форма match — лиш частный случай, pattern matching же используется повсеместно.
2) Unions — такого типа данных в F# нет, есть Discriminated unions — это очень неплохая реализация идеи АДТ (алгебраические типы данных). Делаю поправку тк это люди программирующие на C/C++ могут не понять смысла этого типа данных и запутаться. Сами DU — великолепная вещь, чего только стоит стандартный Option против TryDoSomething.
3)Ну дайте нормальный пример для фибоначи — то что вы показали просто страх какой-то :) MSDN вариант на Seq
let fib = Seq.unfold (fun state ->Some(fst state + snd state, (snd state, fst state + snd state))) (1,1)fib |> Seq.take 20
получите 20 первых чисел