18 нояб. 2020 г.

Форматирование Dart кода


Предвзятость авторов Dart и соответствующего инструментария в мире, где термин master заменяют на primary из-за найденного намека на рабовладельческий строй, просто удивительна. Создается впечатление, что они все еще пишут код на мониторах с разрешением 80x24 символа. На таком размере картинки конечно нужно стремиться ужать все в ширину 20 символов, чтобы еще на список файлов и Flutter Inspector осталось! Что и делает их dartfmt. К сожалению Android Studio разрабатывается теми же авторами. И в окне настроек форматирования Dart уже довольно давно осталась ровно одна опция — длина строки. А, ну еще и ссылка на FAQ (хотя FAQYOU тут звучит как нельзя к месту). 

Лично меня больше всего достает использование пробелов вместо табуляций для выравнивания. И даже при ручной вставке табуляции в Android Studio у нее по умолчанию выставлена ширина в два пробела. Каменный век! Благо, пока еще есть черный ход для исправления этой несправедливости. 

  1. В окне настроек форматирования Preferences/Editor/Code Style/Dart создать копию дефолтной схемы. После перезапуска IDE в директории /$HOME/Library/Application Support/Google/AndroidStudio4.1/codestyles/ (для MS Windows путь будет немного другой) появится файл с именем схемы. Например "My scheme.xml"
  2. В секции codeStyleSettings language="Dart" можно вставить опции по примеру других языков. Например, для Java. У меня сейчас эта секция выглядит так:
<codeStyleSettings language="Dart">
  <option name="RIGHT_MARGIN" value="200" />
  <indentOptions>
    <option name="TAB_SIZE" value="4" />
    <option name="USE_TAB_CHARACTER" value="true" />
    <option name="SMART_TABS" value="true" />
  </indentOptions>
</codeStyleSettings>

Не исключено, что скоро и эту лазейку они прикроют. Тогда придется переходить на Visual Studio Code. Не худший вариант, но заново привыкать. 

17 нояб. 2020 г.

Flutter: “iproxy” cannot be opened because the developer cannot be verified


Сюрпризы флаттера. Каждый день что-то новое. Сегодня macOS (Catalina 10.15.7) при запуске дебажного билда из Android Studio на iPhone начала выдавать ошибку: “iproxy” cannot be opened because the developer cannot be verified. Быстрый гуглёж дал бытрый же фикс в виде команды:

sudo xattr -d com.apple.quarantine /FLUTTER_HOME/bin/cache/artifacts/usbmuxd/iproxy

Потом системных настройках (System Preferences/Security & Privacy/General) я увидел сообщение про блокировку iproxy с кнопкой "Anyway allow". На всякий случай нажал, хотя оно и так уже работало после выполнения команды выше.

25 июл. 2019 г.

Albert: продвинутый launcher для Linux

Albert dropdown screenshot

В дополнение к AutoKey давненько уже подсел на своей линуксовой рабочей станции на запускатель (и не только) приложений Albert. Тулза покрывает функциональность штатного приложения (в Ubuntu оно побогаче, в Mint-е поскромнее) и добавляет массу новых функций, включая расширение плагинами на питоне. Визуально это всплывающая строка вода с выпадающим списком опций.
Из коробки идет выполнение приложений, которые видны в $PATH, поиск файлов по имени, выполнение простых математических вычислений прямо в строке ввода (как в спотлайте и Alfred-е в macOS), которого сильно не хватает в Windows, открытие введенной строки в виде поискового запроса в дефолтном браузере, выполнение терминальных команд. Дефолтные плагины добавляют фичи типа конвертирования единиц измерения, работы со словарем, подыскивания смайликов по введенной строке, и прочие. Сильно рекомендую, ибо после него штатные запускатели кажутся крайне куцими.
Alfred, кстати, еще более комбайный комбайн. Но он только под macOS разрабатывается.

24 июл. 2019 г.

AutoKey: десктопная автоматизация для Linux

Некоторое время уже пользую утилиту AutoKey на рабочем компе под Linux Mint. Под Ubuntой тоже работает. Думаю, под остальными дистрибутивами тоже пойдет.
Основная фича программки — выполнение различных действий по хоткеям. Поддерживается скриптование на собственном языке и на питоне.
Основной паттерн использования тулзы для меня — вставка некоторых особо часто используемых строк (типа корпоративного почтового адреса при авторизации — он символов 30 занимает) либо редко используемых и потому часто забываемых консольных команд. Для ввода последнего использую функцию контекстного меню, в котором забиты короткие имена для команд. Поскольку текст вставляется через буфер клавиатуры, то работает и в графических приложениях, и в терминальных окнах. Особенно удобно для выполнения рутинных действий на разных серверах раз в месяц. Да и на каждый день тоже — слепой набор хорошо, но нажать 3 клавиши вместо 50 все равно будет быстрее.
Но мой паттерн использования — это процентов 10 от возможностей программки. Благодаря синергии командной строки и графического интерфейса Xorg автоматизировать можно очень многое.
Рекомендую, в общем.

11 авг. 2018 г.

Идея: набор активностей как метод аутентификации

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

1 сент. 2016 г.

Objectve C: немножно макросов для облегчения имплементации протокола NSCoding

Для поддержки протокола NSCoding в Objective C класс должен реализовать два метода для (де)сериализации каждого поля объекта. Ниже привожу набор макросов, которые упрощают этот процесс:

In order to support NSCoding protocol in Objective C class must implement 2 methods to (de)serialize every object's field. Below is set of macro to make it little easy:


#define encObj(__name__) {if(__name__) {[aCoder encodeObject:__name__ forKey:@#__name__];} }
#define encPoint(__name__) [aCoder encodeCGPoint:__name__ forKey:@#__name__];
#define encSize(__name__) [aCoder encodeCGSize:__name__ forKey:@#__name__];

#define encInt(__name__) [aCoder encodeInt:__name__ forKey:@#__name__];
#define encFloat(__name__) [aCoder encodeFloat:__name__ forKey:@#__name__];
#define encDouble(__name__) [aCoder encodeDouble:__name__ forKey:@#__name__];
#define encBool(__name__) [aCoder encodeBool:__name__ forKey:@#__name__];

////////////////////
////////////////////
#define decObj(__name__) __name__ = [[aDecoder decodeObjectForKey:@#__name__] retain];
#define decInt(__name__) __name__ = [aDecoder decodeIntForKey:@#__name__];
#define decFloat(__name__) __name__ = [aDecoder decodeFloatForKey:@#__name__];
#define decDouble(__name__) __name__ = [aDecoder decodeDoubleForKey:@#__name__];
#define decBool(__name__) __name__ = [aDecoder decodeBoolForKey:@#__name__];
#define decPoint(__name__) __name__ = [aDecoder decodeCGPointForKey:@#__name__];
#define decSize(__name__) __name__ = [aDecoder decodeCGSizeForKey:@#__name__];

14 июл. 2016 г.

MacroDroid замечательная тулза для автоматизации Android device

MacroDroid замечательная тулза для автоматизации Android device

Некоторое время назад у меня по разным причинам появилось несколько мобильных номеров, которые сейчас растыканы по нескольким Android девайсам. Таскать их все при себе и каждый день читать пришедшие SMS и пропущенные звонки занятие достаточно утомительное и часто забываемое. Решил сделать форвард SMS и нотификацию о пропущенных звонках на Email. Пошерстил Play Store, но достойной утилиты так и не нашел. Есть либо то, либо то. И каждая с какими-то приколами и глюками. И вдруг наткнулся на уже установленное когда-то приложение MacroDroid. И оказалось, что она умеет не только кучу всего прочего, но и именно то, что мне нужно! В бесплатном варианте утилита имеет ряд ограничений, одно из которых — 5 макросов. Но, во-первых, для конкретной задачи этого вполне достаточно. А во-вторых, стоимость Pro версии — 60 грн (~$2), что ну совсем не цена для такого комбайна. Поэтому крайне рекомендую.
Ну и как резюме — краткий лайфхак. Если у вас есть набор Android телефонов, при определенных требованиях их совсем не обязательно таскать с собой, чтобы быть на связи. Можно сделать форвард SMS и нотификации на email (или посредством той же SMS), которые подключены на одном аппарате. Главное чтобы остальные аппараты были на подзарядке. Или мониторить их состояние тем же MacroDroid.

MacroDroid wonderful tool for Android device automation

Some time ago I've got for different reasons set of mobile numbers which now being attached to set of Android phones. Check for new SMSes and missed daily is quite boring and frequently forgotten task. I've decided to make forwarding such events to my email. Digging to Play Store did not provide any worth utility. Any of found had own bugs and glitches. Occasionally I noticed MacroDroid, that I installed long time ago and forgot about it. And I figured out that along with a ton of other stuff it can do exactly what I need! Free version has some limitations, e.g. 5 macroses. Although, it is more than enough for my concrete task, and moreover Pro version costs only about $2 that is not a price for such processor. So, can honestly recommend it.
And small lifehack as final conclusion. If you have set of Android devices with different mobile numbers, it is not mandatory to bring carry them all. You can just make forward all incoming SMSes and missed calls notifications either to email or with same SMS which are configured on single device. The only thing to monitor is battery level of the rest of devices. Moreover it can be done by same MacroDroid.

4 июл. 2016 г.

Wordpress: 500 internal Server error на заглавной странице

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

Столкнулся с тем ошибкой "500 internal server error" при открытии одного из сайтов под управлением Wordpress. Открытие других страниц по прямым ссылкам происходит нормально, а home page дает эту ошибку.
/var/log/apache2/error.log содержит записи "PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted". Все посты на эту тему указывают на то, что нужно увеличить объем доступной PHP памяти. Но у меня ему и так выделено 128MB. На других сайтах на том же хосте все нормально в этом плане.
Полез посмотреть базу сайта. Оказалось, что активная тема в одном из своих PHP-скриптов содержит строку:
add_custom_field('Bannerimage', 1)
, которая выполняется при каждом обращении к базе постов. Это привело к созданию более 44 тысяч записей в таблице wp_postmeta и, соответственно, заполнению всей выделенной памяти.
Судя по всему это какой-то дебажный код, попавший в релизную сборку темы. Строчку удалил, все такие записи из этой таблицы вычистил, сайт проверил. Домашняя страница стала открываться нормально.



Just faced "500 internal server error" error while opening front page of one of Wordpress powered sites. Other pages including admin dashboard are opened successfully by direct links. File /var/log/apache2/error.log contains lines like "PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted". All internet posts point that the reason is low memory accessible to PHP. Although it is already configured 128MB for PHP. Furthermore, other sites on same host work well.
Decided to discover site' database. And figured out that wp_postmeta table contains more than 44K records which contain Bannerimage value. Short search through sources revealed that active theme contains in one of PHP files line like:
add_custom_field('Bannerimage', 1)
, which executed every referencing to posts table. Sequentially all memory was grabbed while reading the table.
Seems it some debug code was left in release build. I've removed the code line, deleted all such records from the table, checked site. Home page now is opened well.

12 июн. 2016 г.

Именная тара от Coca Cola


Некоторое время назад (с год наверное, или два?) Coca Cola стали разливать свой напиток в тару с напечатанными именами и различными мотивирующими определителями типа "Красавчик", "Умница" и т.д. И я не устаю восхищаться гениальности этой выдумки. Никак не изменив сам напиток компания привлекла армию новых покупателей, которые приобретают его ради надписи на бутылке или  банке! Это же гениально! Из простого продукта он сразу стал предметом подарка. Я сам кинул в сетку несколько бутылок с именами членов моего семейства, хотя ни коку, ни пепси не употребляю. И казалось бы что в этом такого? Идея-то проста. Но вот как до нее дойти? Как увидеть, что продукт можно улучшить, изменив то, что к нему вообще никакого отношения не имеет?
Просто гениально!

3 июн. 2016 г.

Программы беговой дорожки EnergyFIT EF-6606A

Около года назад купили мы беговую дорожку EnergyFIT EF-6606A. Дорожка — так себе. Поскрипывает, пошатывается, сборка не ахти. Пульсомер работает по только ему понятному алгоритму — показания прыгают от 70 до 190. Размерность скоростей почему-то выбрана в 3 км/ч, что совсем не удобно. Скорость обычно изменяется на 1-2 км/ч. Увеличение скорости идет с шагом 0.1 км/ч. Чтобы увеличить скорость на 2 км/ч приходится выбирать следующую фиксированную скорость, а потом 10 раз нажимать кнопку плавного уменьшения скорости. Или крутить колесико на приборной панели.
Колесики эти — отдельная песня. Под ними гений китайской инженерии разместил сверхяркие синие светодиоды, которые слепят пользователя даже в хорошо освещенном помещении. В темноте они вообще шпарят так, что ничего кроме них не видно. Пришлось их сразу закрыть круглыми нашлепками на ножки для мебели. В общем, такое.
Еще одна прелесть этого экземпляра — полное отсутствие описания его функциональности. При том, что дорожка имеет 12 предустановленных программ изменения скорости и три варианта использования, я нигде не нашел хоть какой-нибудь документации к ней. Ни служба поддержки, ни интернет-магазин, где я ее покупал... Скайп, почта, телефоны. Глухо. Пришлось эмпирическим путем разбираться что и как в ней работает. Собственно, результат своих изысканий и помещаю ниже.

Дорожка имеет следующие режимы работы:

  1. полностью ручной: включение, выключение, выбор и изменение скорости производится вручную;
  2. H1 — выбор времени, через которое остановить дорожку;
  3. H2 — выбор расстояния, после которого остановить дорожкку;
  4. H3 — выбор количества калорий, после расхода которого остановить дорожкку;
  5. P1-P12 — автоматическое изменение скорости дорожки в течение определенного времени. По умолчанию программа длится 10 минут. Это число можно поменять в диапазоне от 5 до 99 минут. Заданное время делится на 10 равных промежутков, каждый из которых включает соответствующую скорость. При длительности 10 минут — каждый шаг программы занимает 1 минуту, при 5 минутах — 30 секунд и т.д.
Перечень запрограммированных скоростей:
#P1P2P3P4P5P6P7P8P9P10P11P12
1332332222222
2334366944553
3646565945765
4548664745576
5557788756888
6458677665696
74565755865109
8462453383256
9463353263435
10342342222323
В ходе изучения программ дорожка несколько раз сбоила и не переключала скорость на заявленную, хотя индикатор показывал изменение. 

В общем, позвалить дорожку никак не получается. Однако я рад, что мы купили хоть какую-то. Тем более, с 50% скидкой. За ее полную цену на сайтах (порядка $800) я бы не рекомендовал брать эту модель. Да и этого производителя. 
Несколько слов про преимущества беговой дорожки дома. Более или менее длительное чтение, просмотр фильма, или прослушивание подкаста сложно осуществить в режиме хотьбы или бега в тренажерном зале, а тем паче на улице. Придется отвлекаться на препятствия, светофоры, звуки всякие... А на беговой дорожке можно спокойно поставить ноут, взять iPad в руки, одеть наушники, выбрать удобный режим (хоть ходьбы, хоть бега) и полностью отвлечься от окружающей обстановки. Приятное с полезным. 

Совет от рекрутера

В 258 эпизоде подкаста "Software Engineering Radio" интервьюировали основателя и главного рекрутера в компании "RockIT Recruiting", которая специализируется в найме программеров для IT компаний Сан-Франциско. Кроме всего прочего, он дал интересный совет: "Первое, говорит, что я посоветовал бы своему другу, это никогда не отправлять своё резюме через сайт компании, в которой он бы захотел трудоустроиться. Особенно если это большая компания. У них идет такой поток данных от своих и внешних рекрутеров, что то, что приходит через форму сайта, в 99% случаев вообще не просматривается. А зачастую все входящие резюме фильтруются по отсутствию в них ключевых слов типа Google, Standford, etc."


24 мая 2016 г.

Знания, как расходный материал

Намедни возникла мысль, которая еще не полностью сформировалась, но что-то в ней есть. Не уверен, что это относится к другим профессиям, потому мысль относится к сфере IT. А точнее к разработчикам. Работая над каким-то проектом разработчик все глубже погружается в используемые в нем инструменты, технологии, языки. И чем дольше он занимается этим проектом, тем более узким, или наверное точнее будет сказать заточенным, становится набор его умений. Он не забывает окончательно все, что знал до этого. Основы других языков и областей, общие какие-то принципы и понятия, названия и назначения инструментов, которые не используются в текущем проекте. Однако у него уже не получится просто взять и переключиться на другой, забытый или еще незнакомый инструмент. Особенно вне рамок текущего проекта. Уйдет время на отвыкание от приобретенных привычек и рефлексов, на чтение, пробы, обучение новому.
Возникает аналогия с амортизацией, финансовые и временные расходы на которую необходимо учитывать при использовании автомобиля или любой другой техники. Чем активнее используется, скажем, автомобиль, чем более неровные дороги он покрывает надрывая двигатель, тем дороже и дольше обойдется его ремонт и восстановление. А рано или поздно это придется делать. Или менять его на новый автомобиль. Можно, конечно, делать текущий Т/О достаточно часто, чтобы предотвратить критические поломки. Но это связано с дополнительными затратами на транспортировку к месту ТО, на сам осмотр и т.д. В случае программиста чем дольше он занят на одном проекте, и чем глубже он в него погружен и, соответственно, не имеет возможности отвлечься на развитие в других направлениях, тем больше он упускает новинок. И тем больше ему придется наверстывать, когда по той или иной причине ему таки придется уйти из проекта. Как и в случае с периодическим техосмотром авто программист может (и должен) иногда переключаться на другие активности и направления. Однако, как и в случае с авто, это связано с последующими временными затратами на восстановление "потока" в текущем проекте. Ну и на дорогу туда-сюда. И стоимость этого периода наверстывания так же должен быть включен в стоимость текущей эксплуатации знаний программиста, чтобы потом компенсировать месяц, полгода, год, которые уйдут на разгребание навалившихся новых фреймворков, технологий, версий операционок и языков.

12 мая 2016 г.

Google+-подобные репосты в блоге

Намедни захотелось мне сделать так, чтобы ссылки на страницы, на которые я ссылаюсь в блоге, оформлялись при репосте в социалках типа G+, FB, VK: картинка из статьи, под ней — заголовок статьи, по ним — пара строк текста из начала статьи. Сделать визуальное оформление такого плана не шибко сложно. Главная сложность — обработка содержимого статьи и вычленение из него тех самых составляющих: картинки, заголовка, начала. Это такая себе не тривиальная задача. Чтобы не изобретать велосипедов и использовать готовые решения придумал костыль (а куда без них?). Хотя достаточно удобный и подходит для всех, по крайней мере известных мне, блоговых движков.
  1. В G+ создаем новый пост
  2. вставляем в текст ссылку на нужную статью
  3. дожидаемся пока статья оформится в G+-like style
  4. выделяем готовый блок от картинки до конца текста
  5. копипастим выделенный блок в режиме Compose (не HTML) в предварительно созданный и открытый на редактирование пост в своем блоге.
Получается неплохо. Между своим текстом и скопированным блоком я вставляю HTMLную отбивку HR в HTML режиме. Можно, конечно, какую-то рамку добавлять, но я особого смысла в этом не увидел.
И как бонус (пока по крайней мере) — картинка сохраняется на G+, а не локально в блоге.
Как пример — репост моего вопроса в гуглогруппах на предмет существующей возможности такого оформления постов:


11 мая 2016 г.

Microsoft хочет заменить MSDN и TechNet

Опять Microsoft. Теперь они анонсируют сервис документации https://docs.microsoft.com, который вроде бы должен заменить собой MSDN и TechNet. В анонсе говорится, что ресурс будет опенсорсный, статьи можно будет править, комментировать, версионировать. То есть такая себе msWiki. Правда пока что сервис встречает пользователя фразой "Sign up for a 30-day trial of the Enterprise Mobility Suite". Слабо верится, что MS откажется от MSDN как от источника прибыли за счет подписки. Скорее всего будет платная VIP-зона, и бесплатная Fan-зона. Как оно сейчас и есть. Только дизайн будет другой. Ну, время покажет.


24 апр. 2016 г.

Microsoft урезает место на OneDrive.

Бизнес вносит коррективы в современный словарь. Термины "Навсегда", "Безлимит", "Бесплатно" значат совсем не то, что ожидается. 
Ну и, как всегда, бесплатный сыр — только в мышеловке. Рассчитывать на что-то бесплатное в долгосрочной перспективе смысла нет. Это еще, кстати, подтвердил недавний анонс закрытия проекта RoboVM. Сначала заявили, что они опенсорсные и бесплатные. Народ ломанулся их адоптить. Потом, что опенсорс закрывается и остается только лицензирование. Народ посерьезнее купил лицензии, чтобы продолжить свои разработки. А потом и вообще решили закрыться. И даже те предприятия, которые купили лицензию, не смогут на нем базировать свои долгосрочные проекты.

А тут и Microsoft подтянулся.


Microsoft OneDrive storage changes - OneDrive
As the OneDrive storage limit changes start to take effect, this article has information and details about the changes and what they might mean for you.

support.office.com

16 апр. 2016 г.

Репост: Переживания цивилизованного человека.

Статейка про природу нашего беспокойства. Для хомо сапиенс характерно больше беспокоиться и переживать за будущее, чем за кратковременное настоящее. В отличие от менее развитых существ. Чем более цивилизовано общество, тем меньше его членам нужно заботиться о сиюминутном выживании, но тем больше они вынуждены переживать за свое и сородичей будущее. Образование, перспективы, зарплата, семья... И чем меньше уровень цивилизованности, тем короче тот период времени, за который человек пытается заглянуть. Причем это заметно и в современном обществе. Чем спокойнее и стабильнее живет страна (тот же СНГ), тем дальше начинают загадывать ее граждане — на 10, 20 и более лет. В 90е загадывать на год-два вперед было уже сложно.
В отличие о людей, у животных таких проблем нет. Поймал оленя, съел, валяешься под деревом и ни о чем не думаешь. Только пытаешься сам не стать съеденным.





Let’s pretend for a moment that you are a giraffe. You live on the grasslands of the African savannah. You have a neck that is 7 feet long (2.1 meters). Every now and then, you spot a group of humans driving around on a safari taking pictures of you.

29 мар. 2016 г.

Unicode последовательности и NSString. Unicode composed sequence and NSString.

Завязался с оперированием эмотиконками из набора Unicode символов строке NSString. Одна из сложностей с Unicode в том, что он бывает не только UTF-8, но и UTF-16, и UTF-32. В данном случае стояла задача удаления последней эмотиконки из строки текста. Посимвольное удаление не работает, поскольку даже при том, что для этих значков используется UTF-32 (то есть длина символа понятна — 4 байта), существую так называемые Композиционные последовательности Unicode (вольный перевод). Например, такой неоднозначный значок как "👨‍👨‍👦‍👦"(Family: MAN, MAN, BOY, BOY) состоит из 7 символов: U+1F468 U+200D U+1F468 U+200D U+1F466 U+200D U+1F466. Соответственно, чтобы удалить одну иконку, нужно удалять до 7 символов. Причем от иконки к иконке их количество меняется. У NSString для этих случаев есть набор методов для работы с такими последовательностями. Они описываются в статье "NSString and Unicode", поэтому их все я тут описывать не буду. Конкретная задача удаления последней иконки, вне зависимости от количества составляющих ее Unicode символов была решена так:

NSRange rng = [str rangeOfComposedCharacterSequenceAtIndex:[str length]-1];
        str = [str substringToIndex:rng.location];

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