bash.im ithappens.me zadolba.li
13128

Непрямое включение

1 марта 2015, 08:00

Секретка в кнопке включения — это хорошо и правильно. Вот только «но» тут не одно.

  1. Корпуса современных аппаратов редко рассчитаны на установку дополнительных элементов, а особо «продвинутые» совмещают кнопку включения питания с чем-то ещё, превращая два контакта в многожильный шлейф.

  2. Удобство использования под вопросом. Вживлять магнит для геркона в кольцо или постоянно носить его в кармане, доставая всякий раз? А в случае утери что делать? В общем, не айс.

  3. Кто и за какую мзду будет вшивать эту «секретку» в телефон, особенно с учётом пункта 1? Где гарантия, что местные Левши и Кулибины сделают всё по уму, а не как левая пятка прикажет? Да и стоимость работ (с учётом специфики) вряд ли обрадует, что резко понижает рентабельность.

Но при правильной реализации такая закладка может сослужить добрую службу. Проверено лично.

В результате работы Homo Rukozhopus (я менял себе разбитое стекло) мой телефон приобрёл особенность: кнопку включения нужно было давить очень сильно (лучше — часовой отвёрткой или зубами). После настройки софта для переназначения клавиш и покупки китайского чехла (без чётко пропечатанных кнопок) плюсы стали очевидными:

  • резко упало количество желающих поиграться: «Не включа-ается!»;

  • на блокпостах (при проверке документов там частенько требуют и телефоны) «сломанный» аппарат ни у кого не вызывает вопросов;

  • если вытащить батарею, без опыта включить телефон очень непросто. Точнее, почти невозможно. Пару раз спасало.

Есть, конечно, и минус такого решения: софт таки тянет батарею и занимает память. Но 5 мегабайт при гигабайте ОЗУ погоды не делают, правда? Да и это точно дешевле, чем покупать новую запчасть.

13127

Набор «Спили сам»

28 февраля 2015, 18:36

Вряд ли кто-то станет рубить дерево молотком. То есть по скудоумию, конечно, может попробовать, но ведь не получится.

Точно так же неудобно рубить дерево обухом топора. Тут вообще почти парадокс. Инструмент-то подходящий. Смотрит такой (ну, назовём его эникеем) на топор, на картинки из мануала — всё ж подходит. Вот дерево, вот инструмент для рубки деревьев, а оно не рубит. Никак. А почему? Да потому, что дерево рубят другой стороной топора.

Мало того, что наш герой рубит деревья молотком или обухом топора, так он ещё и сразу бежит к ближайшему пригорку и с него поднимает крик о том, что вот, дескать, купил молоток, а он не рубит. «Тоже мне кузнец, — говорит герой, — делает молотки, которыми рубить деревья вообще невозможно». Мол, я хотел срубить дерево молотком, а как? Не получается! А про топоры вообще говорить не приходится. И, главное, негодяй такой, совести хватает рассказывать, что топорами хорошо деревья рубить. Да ничего подобного! Купили мы на фирму два топора, я обухом бил-бил по дереву — ничего! Без толку! Лучше бы резиновым фаллоимитатором колотил — больше пользы было бы. Осталось ощущение, будто кузнец лично надо мной надругался.

То ли дело — лобзик из набора «Сделай сам»! Да, долго, да, неудобно, да, ломается постоянно, но ведь работает же! А сломанную пилку я сам заменить могу. В прошлом месяце такую сосну им спилил — закачаешься.

Понаделали, понимаешь, гламурных топоров с блестящими лезвиями, ходят лесорубы, понтуются ими. Нет, чтобы с лобзиками ходили. Да, а кузнец знаете сколько за свои топоры просит? Совести нет совсем! За гламурные блестящие топоры, которыми я не могу ни одного дерева срубить, такие деньжищи!

Я надеюсь, аллегорию все поняли? Разъяснять не нужно, потому что, во-первых, потеряется весь смысл, а во-вторых, тем, кто не понял, разъяснять и не нужно.

13126

Спящий рабочий общаться не хочет

28 февраля 2015, 08:12

Делаем большой интересный серверный проект. В прошлом месяце начальство внезапно постановило: нужно, чтобы сервер умел вставать на паузу! Ну, и ТЗ, как он это должен делать. В частности, перед уходом на паузу сервер должен успеть обработать и выдать все принятые пакеты. Архитектура многопоточная: сетевой поток, занимающийся как отправкой, так и приёмом пакетов, UI-поток, принимающий и обрабатывающий пользовательские команды, SQLworkers, UtilityWorkers и куча рабочих потоков.

Все потоки умеют обмениваться данными только через очередь сообщений. Поэтому, как только добавлено новое сообщение в очередь, поток снимается с паузы, шлёт запрос потоку UI — надо ли ему становиться на паузу, потом обрабатывает сообщение и нормально работает, пока не придёт пакет с подтверждением паузы. Но ТЗ есть, так что мы его тупо реализуем, не особо задумываясь.

Реализовали, отправили тестировщикам. На следующий день пришёл ответ.

Я был сильно озадачен результатом применения паузы под серьёзной нагрузкой. Сперва поток UI рассылает всем приказ встать на паузу, затем сам становится на паузу. NetWorker моментально становится на паузу: он очень быстро всё принимает и отправляет. Воркеры так же быстро становятся на паузу, а вот один из SQLworkers при обработке запросов INSERT/UPDATE [имя очень тяжёлой таблицы] может очень долго ждать ответа от БД. И как только он его получит, он сделает запись в лог об этом, разбудив поток UtilityWorker, потом кидает результат в общий пул сообщений, разбудив пул воркеров, потом этот пакет будит NetWorker. В то же время поток UIworker не пробуждается от запроса в очередь сообщений.

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

Теперь поток UI никогда не может встать на паузу.

13125

Я узнала маленький секрет

28 февраля 2015, 08:00

«Секретка» — штука, знакомая многим водителям. Конечно, применять её вместо сигнализации может лишь очень отчаянный человек, но в дополнение — очень эффективно.

А почему же этот приём неведом владельцам смартфонов? Даже простой геркон последовательно с кнопкой разблокировки обескуражит процентов 70 воришек, а это не так уж мало. Ну вот, один секрет — больше не секрет, но можно других напридумывать сколько угодно.

Если бы не одно «но». Гарантийный аппарат установка «секретки» лишит гарантии, а послегарантийные воришек интересуют в меньшей степени.

13124

Загрузка программ и столов

27 февраля 2015, 08:24

Начинал я свою службу на заводе, работал прогером. Отдел был не очень большой: пять-шесть разрабов, четыре механика и сисадмин. Находились мы все в соседнем здании от основного, но наш Великий и Ленивый Админ решил, что он будет сидеть в головном здании и всех местных юзверей заберёт к себе на обслуживание, а механики пущай бегают по складам. Но со временем он очень обленился и заявил: «Идите все лесом! Я админ и буду следить только за серверами, а мышки и клавы пусть меняют механики!» Так и получилось: бедные механики бегали по складам и по всей территории (а она, я вам скажу, была весьма внушительных размеров), а тётки из головного здания были очень капризные. То у них мышка не так двигается, то ей свет в мониторе не нравится.

Дык вот, так как мы сидели в разных кабинетах, то и телефоны у нас были разные, но механиков никогда не было на месте (трудились, бедные). И тогда все эти разъярённые тётки звонили нам, прогерам, и вечно жаловались, требовали, чтоб именно я пришёл и посмотрел, что у них не так. Порой доходило до абсурда.

— Алло, здравствуйте, а придите к нам, у нас свет не работает.

—  Дык звоните электрикам, я здесь при чём?

— Ну-у-у… Компьютер же тоже не работает! Придите и почините!


— У нас нужно сделать перестановку, придите, передвиньте шкаф и стол.

— Эм, уважаемая, а почему вы звоните мне, а не грузчикам?

— Ну, у вас там много мальчишек работает, а грузчиков всего двое и они устают, бедненькие. Да и вообще! Нам нужно передвинуть стол, а на нем стоит кампутар, так что это ваша работа!


И вот мне надоело каждый раз на зов прийти и поменять картридж объяснять разницу между программистом и эникеем. Когда у меня горели сроки, а телефон разрывался, я поднял трубку, и случился такой диалог:

— Здрасте, у меня мышь не двигается, придите и посмотрите.

— Девушка, звоните механикам, мы программисты.

— У меня же мышка в программе не работает, так что почините.

— Я пишу программы и обслуживаю только те, которые я сам написал. Если же это не моя программа, то я не буду к вам идти, тем более если у вас не работает не программа, а мышь.

— А вам сложно, что ли?

— Девушка! Если у вас болит глаз, вы же не идёте к гинекологу и не говорите ему: «Посмотрите, пожалуйста, вы же врач!», а ждёте окулиста, даже если его нет.

Дама бросила трубку. Через двадцать минут ко мне пришёл начальник отдела. А мужик он из тех, кто понимает юмор, так что залетел он со смехом, но по поручению главного инженера (та девочка сразу побежала жаловаться начальству) сделал мне устный выговор за неумение общаться с персоналом. Попросил, чтоб я острил немного повежливее.

13123

Валерьянки за вредность

27 февраля 2015, 08:12

Помощи помощникам? Да что вы знаете про глюки, что вы знаете про боль и страдания? Кому приходилось поддерживать и разбирать чужой код, меня поймёт. Хотя и не знаю этого наверняка, но всеми библиотеками своей души пытаюсь на это надеяться.

Один класс (имя не отражает сущность — кого это волнует?) и сотня функций. Казалось бы, нормально. Нормально?! Ни хрена это не нормально, когда поля класса расположены случайным образом между функциями. Именование переменных, бизнес-правила? Да ну их в большой сочный болт! Метод, внутри которого переменные t, p, x, а некоторые и глобальные — вот что здесь норма.

Вы думаете, это всё? Да я молился, чтоб этом было «всем». Это творение подключалось к базе Аксесса. Банально через датасеты. Банально? Ну да, слишком банально. Один датагрид, пять таблиц, поэтому что? Правильно: надо пять датасетов! Имена… А что имена? Имя как имя: 50 символов, начинается латиницей, продолжается русским капсом (тысяча блудниц!) и заканчивается цифролатиницей. И их пять. Пять таких датасетов в одной форме. На один датагрид. А знаете, какой запрос в каждом из пяти датасетов? Глаза вытекают: SELECT * FROM [dataTableName];.

Про форматирование кода после предыдущего даже писать как-то мелочно.

Функция. Да-да, именно так: Функция. Особая примета: входной параметр — y, выходной — x. 150 строк. Шта? Ладно. Следующая. 230. Шта-а-а? А дальше скромная ФУНКЦИЯ. 320 строк. Мои глаза невозможно было представить, пока я не увидел следующую (правда, всю закомментированную однострочными комментариями) на 400 строк. Я не знаю, как про это говорить.

Похоже, я должен требовать ящик валерьянки в неделю как расходные материалы.

13122

На каждый хитрый винтик

27 февраля 2015, 08:00

Нынче популярны тенденции сравнивать девайсы с инструментами, притом с самыми разнообразными, начиная от высокоточных и заканчивая игрушками для самоудовлетворения. Но любой инструмент наиболее эффективен, когда применяется по назначению. Нет, конечно, и гвозди можно забивать микроскопом, но как-то молотком сподручнее. Да и молоток лучше держать за рукоять, а не пытаться забивать шурупы, схватившись за голову.

Если уж так, то мне милее сравнение устройства не с отдельным инструментом, а скорее с набором в красивом чемодане с вкладками.

Вот автору надо было забить гвоздь (выставить планшет в режиме киоска), а нужного молотка не оказалось на виду. Конечно, для порядку покопавшись в верхнем слое, легче бежать искать молотки в стороне, а не спросить, как найти нужный молоток, и приподнять прокладку. Можно было просто включить Guided Access — и вовсе не обязательно бежать к соседней полке с неизвестным инструментарием.

В связи с этим хочу поделиться и своим случаем.

Гуляя по одному из торговых комплексов одной из европейских столиц в поисках нужного мне заведения, я подошёл к стойке с информацией. Ни одной живой души там не было, да и местным языком я не владею. К счастью, на стойке была пара «яблочных» планшетов, упакованных в пластик, чтоб исключить нажатия аппаратных кнопок. На планшетах запущено приложение для навигации по торговому центру с многоязычным интерфейсом. Отыскав нужный мне пункт, я решил проверить, а вдруг и почту можно глянуть тут же, не отходя от стойки. Щипок по экрану — и вуаля: home screen со всеми плюшками. Сафари, Баш — есть контакт! Быстро пролистнув свежие цитаты, решил не привлекать внимания охраны, вернул приложение обратно. Это, конечно, не интернет на круизном лайнере, но тоже неплохой вариант. Всяко дешевле, чем в роуминге.

Так что, господа, не ленитесь изучать содержимое своего тулбокса. Кто знает, когда может понадобиться то или иное хитрое свёрлышко или бит в форме девятиконечной звёздочки… И не спешите обкладывать его силиконовыми розовыми прибамбасами.

13121

Помощи помощникам!

26 февраля 2015, 08:24

В среде «настоящих программистов» бытует мнение, что одна известная операционная система ввиду особенностей своей архитектуры склонна к багам и глюкам, а вот другая — ого-го! Надёжная, как танк, хоть и не особо распространённая среди рядовых пользователей. Ну, в общем, что-то в этом есть; во всяком случае, сам я пользуюсь исключительно второй, мне так удобнее. Но история эта будет о том, как непродуманность в деталях может испортить даже надёжную систему.

Сижу, пишу код, отлаживаю. В очередной раз баг: система уходит в бесконечную рекурсию, бодренько выжирая оперативную память и своп. Как должна себя повести программа в таком случае? Выжрав всю память, она должна упасть в «корку» и больше не подняться. Ну, так обычно кривые программы ведут себя на серверах.

Но так будет скучно, неинтересно и без всякой интриги. Ведь в нашей ОС, слегка заточенной для удобства юзера, есть замечательная система, предназначенная для перехвата подобных событий и информирования разработчиков о проблеме!

Программа выкушала всю память, собралась тихо умереть — и вот тут-то на помощь спешит наша система помощи разработчикам. Поскольку написана она на модном нынче змеевидном интерпретируемом языке, просто так запуститься она не может: поднимается интерпретатор, начинают обрабатываться скрипты с кучей библиотек. Но что-то идёт не так: памяти-то нет.

Бида-бида! Мало того, что упала какая-то там программа — теперь падает и наша система помощи. Ей срочно нужно помочь!

Запускается вторая копия: поднимается интерпретатор, начинают обрабатываться скрипты… Удивительно, но памяти опять не хватает.

Несчастная глючная программа уже давно убита, но бой за память продолжается: один за другим стартуют экземпляры системы и погибают в неравной борьбе за ресурсы.

Прекратить это безобразие удалось лишь путём прицельного убийства всех подозрительных процессов. Отправить отчёт об ошибке разработчикам они так и не смогли, но зато хоть работоспособность компьютера восстановилась.

А всё потому, что чрезмерная инициативность железяки — зло!

13120

Сертификат соответствия молотку

26 февраля 2015, 08:12

При прочтении истории «Две коробки отборного геморроя» вспомнилась мне славная цитатка.

Дерево выросло и местами обросло киянками, как спелыми плодами. Достаточно слегка пнуть — и готовый молоток падает тебе в руки. В варианте же с Apple нередки случаи, когда они самопроизвольно превращаются в елду, и хорошо если в резиновую.

Вы говорите о решении задачи? Извольте.

В связи не помню с чем — в общем, по приказу Очень Главных Людей нужно было поставить планшет в количестве двух штук в холле для использования клиентами. Задача была поставлена предельно просто: на планшетах, кроме браузера, клиент ничего не запускает и может лазить только по сайту компании. Для экспериментов тут же были выданы два андроид-планшета, на которых в течение получаса (из которых 20 минут ушло на заведение гугловской учётки и базовую настройку аппаратов) я всё настроил. Пользователь до ввода пароля браузер даже закрыть не может, а перемещаться по нему может только в пределах нашего сайта. Тулза, к слову, совершенно бесплатная, легковесная и простая, как… молоток.

Однако не всё было так радужно, как хотелось бы: андроидовские планшеты кому-то не понравились, были забракованы и заменены на яблочные. Казалось бы, что может быть проще: встроенный родительский контроль позволит заблокировать всё, кроме того, что можно. И действительно, с этим проблем не возникло, а вот с ограничением запуска приложений возникла проблема. Нашли одно-единственное решение, которое требовало джейлбрейка, который мы сделать не могли по причине слишком свежего обновления. Возникло ощущение, что заказал молоток, а тебе подсунули в красивой строгой упаковке облепленное сертификатами соответствия молотку то самое резиновое изделие, да ещё и с моторчиком.

Не хочу утверждать, что Android круче iOS. Вроде бы и так понятно: нам нужно «ехать, а не шашечки». Просто бывают случаи, когда «включил — и работает, как устраивает», а бывает — «включил, настроил — работает так, как надо».