вторник, 10 апреля 2012 г.
Предыстория:
заказчики уже с полгода назад заметили что если в ASP.Net приложении финансовом, разработанном моей командой, добавить скан чека, когда забиваешь суммы в гроссбух, то всё работает, сохраняется, но в попапе при этом выскакивает матюг, что сессия не найдена.
Т.к. проект мы к тому времени разрабатывать закончили и передали на поддержку самому заказчику, плюс приоритет баги был невысок, мы им серьезно и не занимались. К тому же ни на одном из наших серверов проблема не проявлялась хоть тресни. Я выдал пару идей что проверять индусскому мальчегу-программистегу и на том разошлись.
... прошло несколько месяцев, бага ими так пофикшена не была, начальство начало злиться, в результате в приказном порядке велено было поставить меня к станку, чтобы пофиксил бажину.
Как водится, у меня проблема не проявилась, не проявилась они и на их сервере куда я зашел под своим аккаунтом. Только зайдя на него под аккаунтом одного из их девелоперов увидел воочию что падает.
Стал копать.
Копал, копал, перебрал все известные и не очень баги в IE, поигрался с правами аппула и файлов.
В результате получил когнитивный диссонанс, когда от прав на каталоги на сервере проблема то проявлялась на клиенте то нет.
В финальном раунде убил сегодня 6 часов, чтобы понять что за чертовщина творится.
Выяснилось, что проблема проявляется ТОЛЬКО если аккаунт аппула имеет ограниченный доступ, фолдер для файл аплоада тоже имеет ограниченный доступ (но достаточный чтобы добавлять файлы, переименовывать и удалять их и создавать подкаталоги).
Таким образом невинный IE остался необматеренный и я начал мучать код работы с файлами.
Методом последовательного отключения функционала нашел блок при запуске которого все сессии слетали к едрене фене. А окончательно все стало ясно, когда я на работающем приложении в фоне почистил каталог и все сессии моментально грохнулись.
Это похоже на мониторинг файлсистемы а-ля web.config. Вопрос это фича или какой матерый индус мощно зареюзил код чтения конфигов и теперь на любой файл вешается мониторинг при обращении?
Файлы вроде как не мониторятся, а вот каталоги, особенно которые находятся внутри вебаппа - ага. мониторятся. Мегамозги из то ли Редмонта, а то ли бангалорские подумали, что раз изменился каталог доступный по вирт пути то всё, пиндык приложению, боржоми нужно запрещать.
А у заказчика вот такая дурацкая манера размещать все помойки тут же в приложении.
Особо пикантно было то, что проявляется только при определенном сочетании секурити аккаунта под которым запущен ASP.Net пул и прав на сам каталог.
А вот и статья которую нашел уже поняв в чем причина.
Вобщем 10 лет уже под дотнет разрабатываю, но постоянно сюрпризы, ля =)
http://www.aaronblake.co.uk/blog/2009/09/28/bug-fix-application-restarts-on-directory-delete-in-asp-net/
пятница, 17 февраля 2012 г.
Is Android fragmentation a myth?
Вот свеженькое и наболевшее - у нас в приложении выполняется проверка на наличие SD карты и если ее нет, то не давать юзеру работать (ну так надо по требованиям, на SD делается бэкап важных данных).
Сделали для всех девайсов со стандартной прошивкой - дергаем системный вызов getExternalStorageDirectory() - выдает /mnt/sdcard который в точности указывает на сдкарту.
Прибегает заказчик - на Samsung Galaxy Tab не работает. Смотрим - у девайса с вендор ид GT-P1010 вызов отдает все тот же /mnt/sdcard но физически карта замаунчена по пути /mnt/sdcard/external_sd
ну поставили проверку на все семейство galaxy tab, если оно - мы меняем путь на этот хардкод.
Вчера заказчик прибегает опять - закупили новую партию Galaxy Tab 7.0 Plus (GT-P6210) и на ней опять не работает.
Разбираемся - видим: getExternalStorageDirectory() по прежнему отдает /mnt/sdcard
а сама карта радостно замаунчена по пути /mnt/sdcard/extStorages/SdCard
нам не привыкать - сделали подмену и для семейства GT-P6xxx =)
Вобщем великая страна Корея, умом ее точно не понять =))
UPDATE:
Понравился коммент Олега: "Сильны самсунговцы. Вот это - /mnt/sdcard/extStorages/SdCard - вообще порвало. Дальше будет видимо "/mnt/sdcard/extStorages/SdCard/RealSd/True/mamoj_klianus_SD""
вторник, 5 апреля 2011 г.
iOS 4.x - коварная многозадачность
Не разделяю я восторгов общественности по поводу появления многозадачности для юзерских приложений (сама по себе ОС была многозадачной изначально, с предками из знатного рода BSD Unix), но что ж поделать - с такой теперь нам жить.
В связи с тем что реализовали ее не совсем стандартно, то и проблемы, возникающие с ней уникальны только для iOS.
Итак, что было до появления iOS 4.x:
- у приложения был делегат applicationWillTerminate, который вызывался как только юзер нажал кнопку Home, в нем мы корректно обрабатывали выход, сохраняли состояние приложения и отдавали управление ОС. Всё понятно, всё логично.
С выходом iOS 4.x мы получили новые делегаты и двоякое поведение приложения
Сценарий поведения 1:
Если в info.plist приложения параметр UIApplicationExitsOnSuspend установлен в YES - мы по-прежнему можем надеяться на вызов делегата applicationWillTerminate, корректно его обработаем итп, но увы, никакой поддержки многозадачности не получим.
Сценарий поведения 2:
Если в info.plist приложения параметр UIApplicationExitsOnSuspend установлен в NO (либо отсутствует), то
- при нажатии на Home делегат applicationWillTerminate больше никогда не вызывается
- вместо этого приложение каждый раз уходит в фоновый режим и ОС вызывает делегат applicationDidEnterBackground. В этот момент нам рекомендовано сохранить состояние приложения ибо после ухода в фон никто нам уже ничего не гарантирует. Приложение может быть вызывано обратно в интерактивный режим, оно может быть убито явно пользователем из таск панели(причем именно убито с использованием kill) и никаких сообщений не получит, оно может быть убито системой от нехватки памяти, устройство может быть перезагружено итп итд.
Самое важное во всем этом - нам говорят только о том, что приложение больше не активно. Больше нам ни о чем не скажут (ну почти ни о чем)
- Если приложение не было убито/выгружено, то при следующей попытке пользователя его запустить (как из SpringBoard, так и из таск панели) будет вызыван делегат applicationWillEnterForeground.
И вот здесь зарыта собака всего этого поста, а также соль многозадачности iOS - в этом делегате нужно не восстанавливать состояние, которое мы сохранили при вызове, а выполнять ОТКАТ всего того что мы насохраняли в applicationDidEnterBackground!
Объясняю почему:
- приложение всё еще активно, если мы явно ничего не поубивали на уходе в бэкграунд, то все данные в памяти - можно продолжать работать
- большинство приложений под старые версии iOS проектировались и разрабатывались именно с таким учетом, что их запустят, поработают и выйдут из них. Соответственно мало кто заботился о том, чтобы делать загрузку и переинициализацию в произвольный момент времени.
Если же мы начнем загружать данные в applicationWillEnterForeground, то можем столкнуться с необходимостью серьезной доработки кода, подчистке всего того, что не было сделано в старой версии (release, dealloc итп).
Так что выгодно и рекомендовано apple просто убивать сохраненное состояние и продолжать работать.
Если же приложение после ухода в фон было убито, то сохраненное в файле, локальную БД или куда-то еще не денется и штатным образом подхватится при рестарте.
Лично я убил немало так часов, чтобы осознать и осмыслить то, что вскользь описано в официальной документации. Надеюсь, этот пост поможет вам не совершить эту ошибку.
пятница, 9 апреля 2010 г.
iPad vs iPhone 3GS tests
Native performance
| Test | iPad/3.2 | iPhone 3GS/3.0 | Faster by |
|---|---|---|---|
| 100,000 iterations | 0.000035 secs. | 0.000137 secs. | 3.91x |
| 10,000 divisions | 0.000010 | 0.000018 | 1.8x |
| 10,000 sin(x) calls | 0.000012 | 0.000018 | 1.5x |
| 10,000 string allocations | 0.004321 | 0.007915 | 1.83x |
| 10,000 function calls | 0.000338 | 0.000600 | 1.78x |
This first benchmark compares the native performance of the iPad against the iPhone 3GS. The version of the iPhone OS is the one originally released with both devices (3.2 and 3.0, respectively.) The application used to test the devices was a release (optimized) build for ARM v7.
On average, the iPad is about twice as fast as the iPhone 3GS when executing native (Cocoa Touch) applications. Great news for developers, because it gives us much more flexibility when creating our apps.
JavaScript performance
| Test | iPad/3.2 | iPhone 3GS/3.0 | Faster by |
|---|---|---|---|
| 100,000 iterations | 0.011 secs. | 0.017 secs. | 1.55x |
| 10,000 divisions | 0.006 | 0.012 | 2.00x |
| 10,000 sin(x) calls | 0.009 | 0.024 | 1.85x |
| 10,000 string allocations | 0.007 | 0.017 | 2.43x |
| 10,000 function calls | 0.005 | 0.006 | 1.20x |
Oddly, the same 2x improvement is not seen for the same benchmarks when executing JavaScript code in web pages. Again, the iPad with 3.2 is compared against the iPhone 3GS with 3.0. Things have definitely improved, but there was a wide variation in results when performing the tests. I suspect that just-in-time compilation or other similar types of caching are affecting the results.
The raw numbers really don’t matter anyway: the browser experience on the iPad is exceptional (and will only get better.)
Native performance: Original iPhone vs. iPad
| Test | iPad/3.2 | iPhone/2.0 | Faster by |
|---|---|---|---|
| 100,000 iterations | 0.000035 secs. | 0.015 secs. | 428x |
| 10,000 divisions | 0.000010 | 0.004 | 400x |
| 10,000 sin(x) calls | 0.000012 | 0.105 | 8,750x |
| 10,000 string allocations | 0.004321 | 0.085 | 20x |
| 10,000 function calls | 0.000338 | 0.004 | 12x |
четверг, 8 апреля 2010 г.
iPhone OS 4.0 beta - очень сырой релиз
но пару раз дабликликнув на Home в симуляторе (появится список активных приложений), а затем выход из списка по однократному нажатию Home - видим черный экран и статус бар сверху. Все, кирдык.
Установка Firmware на реальный девайс тоже не получилась. Для IPod touch всех модификаций тотально сервер яблок не дает разрешения на установку (при том что имеющаяся прошивка уже снесена).
Только восстановление на предыдущую версию и помогает.
Судя по девфоруму - проблемы есть и у обладателей айфонов, причем с английскими операторами они могут вообще прекратить работать (то ли в симмке что-то расширенное используется, то ли еще чего)
Вобщем до следующего релиза можно отдыхать и курить доки. А яблочные девелоперы до лета будут не спать. А потом не спать до осени чтобы это все еще и на айпад перенести.
Ужс.
P.S. в симуляторе появилась эмуляция TV выхода с различными разрешениями вплоть до 720p - показывается в отдельном окне.
iPhone OS 4.0 анонсирована!
а вот тот факт что SDK и прошивки уже доступны для девелоперов не радовать не может!
Multitasking
In iPhone OS 4.0 and later, applications can perform tasks while running in the background. When the user quits an application, instead of its process being terminated, the application is moved to the background. Shortly after moving to the background, most applications are suspended so that they do not run and consume additional power. However, applications that need to continue running can ask the system for the execution time to do so.
Regardless of whether an application is running in the background or suspended, the fact that the application is still in memory means that relaunching the application takes much less time. An application’s objects (including its windows and views) normally remain in memory and therefore do not need to be recreated when the application is subsequently relaunched by the user. However, if memory becomes constrained, the system may purge background applications to make more room for the foreground application. To appear consistent with the application remaining in the background at all times, an application should store information about its current state when it moves to the background and be able to restore itself to that state upon a subsequent relaunch.
суббота, 3 апреля 2010 г.
Субьективно по впечатлениям уважаемого Alexmak и на его видео - раза в полтора точно (невзирая на резко увеличившийся размер экрана). http://www.youtube.com/watch?v=PTteFA7XGQQ
Вот с RAM пока не все понятно. iFixit, разобрав девайс говорят, что там 512МБ памяти.
Девелоперы, которые писали первые тесты говорят, что функции сообщают им о наличии только 256МБ (как и на IPhone 3GS/IPod Touch3G). Подождем подробностей. То ли половина теперь видеопамять, то ли для совместимости функции пока врут.
Первоисточник: http://forums.macrumors.com/showthread.php?t=888812