воскресенье, 2 августа 2015 г.

Уменьшение частоты процессора на смартфоне под управлением Cyanogenmod

Так случилось, что несколько лет назад я стал владельцем смартфона Samsung S4 Active. Всем смартфон хорош, вот только производитель в погоне за обывательскими «попугаями» разогнал процессор Snapdragon 600 APQ8064T до частоты 1.9 ГГц, что превратило его в печку, приводя в лучшем случае быстрому разряду аккумулятора, а в худшем — его вздутие с одновременным выдавливанием экрана или же выходом из строя звукового чипа.

На стоковой прошивке частота процессора регулировке не поддавалась даже из под консоли. Вернее регулировка носила очень непродолжительный характер, после чего сбрасывалась на максимальное значение. На CyanogenMod 12.X все наконец-то заработало.

Внимание, все дальнейшие телодвижения вы делаете на свой страх и риск.

Изначально нужно иметь смартфон с установленным CyanogenMod`ом, мозги и прямые руки.

Итак начнем.

Активируем root на смартфоне:
1. «Настройки» → «О телефоне», тыкаем много раз пальцем в «Номер сборки».
2. «Настройки» → «Для разработчиков» → «Режим суперпользователя»

Параметр ядра отвечающий за максимальную частоту процессора:

/sys/power/cpufreq_max_limit

Возможные значения частоты:

/sys/power/cpufreq_table

Для автоматической установки частоты при запуске в /etc/init.d обнаруживаем:

/etc/init.d/90userinit

В котором содержится фрагмент кода для запуска файла:

/data/local/userinit.sh

Данного файла не оказалось, поэтому создадем его. В консоли он создается так:

touch /data/local/userinit.sh

Открываем его в штатном редакторе Cyanogenmod`а и пишем в него:

#!/system/bin/sh
echo 1242000 > /sys/power/cpufreq_max_limit

Где 1242000 — частота процессора для моего смартфона, свои частоты смотрите в /sys/power/cpufreq_table

Выключаем root: «Настройки» → «Для разработчиков» → «ВЫКЛ»

Перезагружаем смартфон и радуемся.


Файл userinit.sh лучше сохранить на карте памяти смартфона, вы тем самым после обновления прошивки избавите себя от массы описанных выше телодвижений. Всего-то придется скопировать userinit.sh в /data/local и перезагрузить смартфон.

суббота, 9 мая 2015 г.

Установка Syncthing на домашний сервер

Syncthing — Программа для синхронизации файлов и резервного копирования по протоколу обмена блоками между устройствами.

Устанавливать syncthing буду на сервер под управлением Debian GNU/Linux Jessie.

  • Для пущей безопасности создаем отдельного пользователя/группу syncthing
adduser --system --group --home /home/syncthing syncthing
  • Создаем скрытый каталог для установки приложения syncthing
mkdir /home/syncthing/.bin
  • Идем на сайт https://syncthing.net/, скачиваем свежую версию syncthing и распаковываем ее в каталог /home/syncthing/.bin
  • На всякий случай зададим права на /home/syncthing
chown -R syncthing:syncthing /home/syncthing
chmod u=rwX,g=rX,o= /home/syncthing
  • Создаем в /etc/systemd/system файл syncthing@.service, содержащий код:
[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=https://github.com/syncthing/syncthing/wiki
After=network.target

[Service]
User=%i
Environment=STNORESTART=yes
ExecStart=/home/syncthing/.bin/syncthing -no-browser -logflags=0
Restart=on-failure
SuccessExitStatus=2 3 4
RestartForceExitStatus=3 4

[Install]
WantedBy=multi-user.target

  • Создаем в /etc/systemd/user файл syncthing.service, содержащий код:
[Unit]
Description=Syncthing - Open Source Continuous File Synchronization
Documentation=https://github.com/syncthing/syncthing/wiki
After=network.target

[Service]
Environment=STNORESTART=yes
ExecStart=/home/syncthing/.bin/syncthing -no-browser -logflags=0
Restart=on-failure
SuccessExitStatus=2 3 4
RestartForceExitStatus=3 4

[Install]
WantedBy=default.target

  • Включаем службу syncthing:
systemctl enable syncthing@syncthing.service
  • Запускаем службу:

systemctl start syncthing@syncthing.service

  • Проверяем /home/syncthing/.config/syncthing/config.xml на следующие опции:
<startBrowser>false</startBrowser> 
т.е. при запуске службы syncthing не запускался браузер.

<address>:8000</address>
порт для подключения к вебинтерфейсу syncthing (я для удобства сделал его равным 8000)
  • Чтоб подключиться к вебинтерфейсу synching набираем в браузере адрес http://ip-адрес-сервера:8000/

Miredo, network-manager & systemd


Miredo - клиент для подключения к протоколу teredo, предназначенному для передачи ipv6 пакетов через ipv4 сеть. Простыми словами, miredo дает возможность получить доступ в ipv6 сети, даже если провайдер этого не позволяет.

Столкнулся с трудностью запуска miredo. Экран загрузки ругался на: Invalid hostname "teredo.remlab.net", miredo запускался, но ipv6 туннель не создавал. Ручной запуск службы позволял работать до первой проблемы с сетью, да и сам режим ручного вмешательства для меня не был вариантом.

Для решения данной проблемы нужно сделать:

  • Выключить службу miredo.service
systemctl disable miredo.service
  • Скопировать файл службы miredo.service из /lib/systemd/sysyem в /etc/systemd/system
  • Отредактировать /etc/systemd/system/miredo.service так, чтобы он запускался только после появления интернета, т. е.: After=network-online.target вместо After=network.target
  • Включить службу miredo.service:
systemctl enable miredo.service
  • Чтобы событие network-online.target работало, необходимо активировать службу NetworkManager-wait-online.service
systemctl enable NetworkManager-wait-online.service
  • Запустить службы:
systemctl start NetworkManager-wait-online.service
systemctl start miredo.service
  • Проверяем работоспособность:
ping6 ipv6.google.com

пятница, 2 августа 2013 г.

Privoxy, TOR и доступ к заблокированным сайтам***


Как понятно из названия, вам понадобятся установленные Privoxy и TOR. Есть готовые сборки данного комплекта, остановимся на том, какие нужно внести изменения.


Изменения в TOR


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

К примеру, можно добавить в конец torrc строку:
ExitNodes {at},{au},{be},{ca},{ch},{cz},{de},{dk},{es},{eu},{fi},{fr},{gb},{ie},{in},{it},{jp},{nl},{no},{pl},{ro},{se},{us}


Изменения в Privoxy


В user.action добавляем следующее:
{+change-x-forwarded-for{block} \
 +client-header-filter{hide-tor-exit-notation} \
 +client-header-filter{privoxy-control} \
 +forward-override{forward-socks4a 127.0.0.1:9050 .} \
 +server-header-filter{privoxy-control} \
}
.onion/
/.*(\?|\&)tor$

Сразу после этого фрагмента должны располагаться URL необходимых вам сайтов.

Если в конец адреса сайта добавить ?tor или &tor - то получен он будет через TOR. Это очень удобно, когда не знаешь, блокирован ли данный сайт или просто его временная недоступность.

Оригинал заметки и все, что бы вы хотели узнать о Privoxy на русском, можете найти на сайте RPFTeam.

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

среда, 1 мая 2013 г.

Энергопотребление OLED — миф и реальность

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

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

Исходное оборудование:
1. Устройство с экраном TFT размером 4 дюйма
2. Устройство с экраном Super AMOLED размером 4.3 дюйма
3. Цифровой измерительный прибор
4. Провод

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

Энергопотребление TFT размером 4 дюйма при различной яркости:
100% - 0.25 А
75% - 0.23 А
50% - 0.20 А
25% - 0.17 А
0% - 0.12 А

Энергопотребление Super AMOLED размером 4.3 дюйма при различной яркости (белое изображение на весь экран).
100% - 0.23 А
75% - 0.20 А
50% - 0.17 А
25% - 0.14 А
0% - 0.11 А

Энергопортебление Super AMOLED размером 4.3 дюйма при различной яркости (черное изображение на весь экран).
100% - 0.06 А
75% - 0.06 А
50% - 0.06 А
25% - 0.06 А
0% - 0.06 А

В итоге имеем чуть меньшее потребление Super AMOLED экрана даже без учета его большего размера (4.3 дюйма против 4 дюйма TFT).

Примечательно, что стандартное меню приложений андроида на максимальной яркости ( Super AMOLED) потребляет всего 0.09 А.

P.S. Да, положив два экрана рядом заметил, что Super AMOLED имеет неправильную цветопередачу.

P.P.S. Названия устройств не афиширую.

суббота, 6 марта 2010 г.

AdBlock - надолго ли?

Написал тут на днях скрипт, импортирующий блэклисты AdBlock'а в Privoxy. Вроде этого должно хватить за глаза, но AdBlock же еще поддерживает CSS фильтры контента - почему бы и их не импортировать?

Открыл подписку от "Морпеха", выбрал шаблон, сбросил счетчик срабатываний AdBlock'а и зашел на сайт, который по идее должен зачистить выбранный шаблон. Но увы, ничего не вышло. Оказалось, что вебмастер, почуяв падение дохода от рекламы подправил соответствующий класс как в шаблонах сайта так и в CSS - приписав к его названию цифру 1.

Интересно, сколько в подписке таких "мертвых" шаблонов? Чем популярнее AdBlock, тем быстрее администраторы сайта почувствуют потери и оставят банерорезку "с носом".

Как сделать невозможным CSS фильтрацию контента AdBlock'ом? Элементарно - нужно внедрять рекламу в блоки со стилями, аналогичными стилям важных частей страницы, выделять особым стилем ее незачем. Захочет кто убить назойливую рекламу - фильтр CSS контента скроет заодно и полезную информацию.

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

То же самое касается и Оперных UsersCSS.

Создание фильтров для privoxy

Для создания фильтров в Privoxy используется синтаксис регулярных выражений. Регулярные выражения в полном объеме изучать конечно не стоит, но в общих чертах ориентироваться необходимо.

Терминология

Фильтр — фрагмент кода, используемый Privoxy для фильтрации контента. Фильтр может состоять из одного или нескольких шаблонов.

Шаблон — фрагмент кода, составленый на основании синтаксиса регулярных выражений. Он непосредственно указывает то, что нужно искать и на что это нужно заменить.

Регулярные выражения (regular expressions, RegExp, RegEx) — формальный язык поиска и замены в текстовых строках.

Создание косметических фильтров, основанных на внедрении кода CSS.

Скрытие фрагментов html страницы широко используется как в Opera, так и в AdBlock. Каким образом это реализуется в Privoxy мы сейчас и рассмотрим.

Для начала в user.filter запишем строчку:

FILTER: site-specific-u Site specific user filters

этой строчкой мы создаем «site-specific-u» фильтр. Все, что последует после этой строчки и до объявления следующего фильтра будет принадлежать «site-specific-u» фильтру.

Шаблон CSS фильтра прост

s@(</head>)@\n<style type="text/css">\n\
[Стиль 1], [Стиль 2], [Стиль 3], [Стиль ...], [Стиль n]\n\
{ display: none !important; outline:1px solid !important }\n\
</style>\n$1@si

пользователю остается только воспользоваться консолью разработчика, имеющегося практически в каждом вменяемом браузере, определиться какой стиль управляет отображением рекламного блока и вписать его в шаблон фильтра. К примеру, рекламный блок на images.google.ru управляется стилем id*="tads" (<div id="tads">), вписав который в шаблон фильтра мы избавимся от рекламного блока навсегда.

Шаблон для скрытия рекламного блока на images.google.ru будет выглядеть следующим образом:

#images.google.ru
s@(</head>)@\n<style type="text/css">\n\
[id*="tads"]\n\
{ display: none !important; outline:1px solid !important }\n\
</style>\n$1@si

Остается только активировать этот фильтр для images.google.ru и все. Шаблоны на основе CSS для других сайтов делаются аналогично.

Создание фильтров контента

Все шаблоны фильтров Privoxy имеют следующее строение:

s/Поиск/Замена/Модификаторы

Модификаторы определяют режим поиска:
g — поиск и замена производится до тех пор, пока условие соблюдается.
i — производится регистронезависимый поиск/замена
s — производится многострочный поиск/замена

Рассмотрим простой вариант, к примеру, нам нужно удалить следующий фрагмент:

<a href="http://site.com/promo/2421.htm"><img src="/img/2421.jpg" /></a>

Шаблон будет выглядеть следующим образом:

s@<a\s+[^>]*site\.com/promo/[^>]*.*</a>@@sig

где:
«<a\s+» - начало тега «а» с гарантированным пробелом
«[^>]*» - любое количество символов за исключением границы открывающего тега «a»
«site\.com/promo/» - ключевой фрагмент адреса
«.*</a>» - любое количество символов до закрывающего тега «a»

Отсутствие символов в замене говорит о том, что найденный шаблон будет удаляться полностью.
Модификаторы «sig» показывают, что поиск должен продолжаться много раз, быть многострочным и регистронезависимым.

Рассмотрим вариант немного сложнее — нам нужно удалить рисунок, но оставить ссылку с описанием из alt тега.

<a href="http://site.com/promo/2421.htm" alt="Promo links"><img src="/img/2421.jpg" /></a>

s@(<a\s+[^>]*site\.com/promo/[^>]*alt="([^"]*)[^>]*>).*(</a>)@$1Blocked: $2$3@sig

где:
в переменную $1 заносится весь открывающий тег «<a ...>»
в переменную $2 заносится содержимое тега «alt="..."»
в переменную $3 заносится закрывающий тег «</a>»

После все эти переменные используются в замене, вначале открывающий тег «<a ...>», затем текст, содержащийся в теге «alt="..."», а затем и закрывающий тег «</a>».

В итоге из графической ссылки мы получили обычную текстовую.

Самый сложный вариант — когда нам надо удалить из контента javascript с определенным ключевым словом.

Сложность состоит в том, что при обычной фильтрации может случиться так, что будет удалено все от открывающего тега первого скрипта до закрывающего тега последнего.

Решается все на редкость просто:
1.Помечается закрывающий тег каждого скрипта специальным символом.
2.Производится фильтрация, ограничением которой служит как раз этот специальный символ.
3.Удаляется из закрывающих тегов скриптов все специальные символы.

Фильтр будет состоять из трех шаблонов, функционал каждого из них описан выше:

s@</(script)@\e</$1@sig
s@<script[^\e]*?banner[^\e]*?\e</\script>@<!-- Blocked ad-script -->@sig
s@\e</(script)@</$1@sig

где «[^\e]*?» как раз и определяет любое количество символов до появления символа ограничения «\e» - обозначающего начало закрывающего тега.

Заключение.

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