Блог:Виталий Филиппов

Материал из YourcmcWiki
Перейти к: навигация, поиск

Технические вопросы и вменяемые заметки от меня, Виталика.

У меня, конечно, уже есть блог Ljuser.gifsimply_a_man.

2013-10-30 php-apply

Вот пишут люди про PHP ерунду всякую — фрактал плохого дизайна… сравнение нетранзитивное… ещё что-то там… Так вот, это всё фигня и вообще не расстраивает ни разу (разве что соглашусь, что синтаксис и реализация неймспейсов дебильны).

А вот что меня реально всегда расстраивало — так это то, что в PHP классы после загрузки нельзя модифицировать извне. Ну то есть можно — есть runkit, и говорят, что он в последнее время даже работает (когда я его пробовал 2-3 года назад — не работал, крашился). Но он довольно нетривиален, делает всякую магию — копирует байткод функции, меняет переходы… Не факт, что это быстро, и также не факт, что не отвалится в будущем.

Особенно «модификация класса извне» становится актуальна с появлением trait’ов (примесей), которые авторы реализовали, но реализовали как-то косо и по моему ощущению они там ни к селу, ни к городу. Вроде хочется, чтобы trait был таким себе плагинчиком, который можно подоткнуть в класс в любой момент, ан нет — его надо use внутри самого определения класса, да ещё применить довольно странный синтаксис разрешения конфликтов имён:
class X { use Trait1, Trait2 { Trait1::a insteadof Trait2; } }

Если взглянуть немного шире, становится ясно, что зачастую сам класс-то менять, в общем, и не обязательно, достаточно сделать ему apply(), как в js — то есть вызвать внешнюю функцию в контексте произвольного объекта. Но и этого в php сделать нельзя, потому что $this — это не просто первый аргумент функции, как в перле или питоне, а некое поле внутренних структур движка, которое просто так не поменяешь. Ну, и ещё в отличие от js есть protected/private методы.

Так вот — сегодня меня вштырило и я этот apply родил в виде тривиального экстенжна с одной функцией — apply_user_func(object $object, callable $callback, array $args).

С ним можно делать вот так:

class A
{
    var $b = "abc\n";
    private function f_a()
    {
        print "Опа!\n";
    }
}
 
function f()
{
    print $this->b; // нам будет доступно поле класса A
    $this->f_a(); // и его private метод тоже будет доступен
}
 
$a = new A();
apply_user_func($a, 'f', array()); 

Экстенжн реально тривиальный, всего сотня с лишним строчек, из которых НЕ-копипасты — на самом деле вообще строчек 8. Ну, тест ещё 76 строчек, ок. По скорости работает чууть-чуть помедленнее, чем call_user_func_array с аналогичной семантикой, и где-то на 80% медленнее, чем обычный вызов функции.

В общем, можно юзать :) под 5.4 и 5.5 работает.

2013-10-27 Правильный фикс USB для антенны РЭМО Коннект

Собственно, РЭМО Connect 2.0 — это вообще не антенна, а отражатель сигнала в корпусе из дешёвого пластика с гнездом для установки USB модема (3G/4G). Гнездо — тоже банальный пластиковый кожух, в который засунут конец обычного USB удлинителя длиной 3 метра. Являющегося, по сути, проводом этой антенны. Такой, типа, бюджетненький вариант.

Оно, как ни странно, вполне работает и на обещанные +8 дб сигнал усиливает. Я через него йоту подключаю (БС находится в 5-6 км, через лес) и скорость получаю нормальную.

Короче, всё бы хорошо, но вот при подключении к роутеру (TP-LINK TL-MR3420) через эту «антенну» йотовский модем не заводится — видимо, у роутера нежный USB и у модема нежный USB и, несмотря на 2 феррита на проводе (удлинителе), мощности USB сигнала для преодоления 3 метров не хватает…

К счастью, РЭМО к той же антенне прилагает USB хаб и продаёт это под названием Connect 2.2. И если подключить к роутеру хаб, а в хаб воткнуть провод от антенны — таки заводится и работает почти стабильно. Всё равно отваливается — иногда раз в минуту, а иногда раз в час — но работает.

То есть, до частичного фикса РЭМО додумалось :) а вот как этот фикс можно было улучшить — надо было сделать, чтобы хаб стоял непосредственно перед модемом, на конце удлинителя. Я вот его туда только что тупо прикрутил скотчем, и в такой конфигурации оно таки да, не отваливается вообще.

2013-10-05 Сборник ссылок по теме Gimp Save&Export

Ещё раз, вкратце — с версии 2.8 GIMP заставляет пользователей нажимать «Export», а не «Save» для сохранения в любые форматы, кроме XCF. Спецификация этого чрезвычайно дебильного и неоправданного юзабилити-решения вот тут: http://gui.gimp.org/index.php/Save_%2B_export_specification

Причём, что больше всего добивает — любые попытки доказать авторам, что новое поведение неудобно, бесполезны. Видимо, у авторов не по-детски зашкаливает ЧСВ, так как на абсолютно любые аргументы они ответят вам, что:

  • Вам не нужно пользоваться GIMP, так как это слишком сложный и крутой редактор для вас. GIMP — это вам не фоточки редактировать, а суперпрофессиональный инструмент, а вы идите и пользуйтесь аналогами MS Paint.
  • Вас таких недовольных вообще 3 человека (ну может максимум 10) на всё многомиллионное сообщество, а всем остальным фича нравится (опроса, естественно, никто не проводил — вы просто должны поверить, что все довольны).
  • Даже если вас больше — вы не наша целевая аудитория, так что ваши аргументы нас не колышут.

Прочитав тред и окончательно взбесившись от отношения авторов к пользователям, я добрался до кода, сделал патч, а потом решил, что быть вежливым бесполезно и отписался в конец треда, что авторы — moron’ы, а само поведение — total piece of shit.

Но что же можно сделать для отключения этого говна?

Темы/посты с руганью/критикой:

2013-10-03 Disable Gimp Save&Export

My post about gimp Save and Export to http://www.gimpusers.com/forums/gimp-user/14339-hate-the-new-save-vs-export-behavior#message74677

I want to say two things:

  1. The new behaviour is a TOTAL PIECE OF SHIT. And the authors are just MORONS because they argue that if you dislike it, you are an idiot, "misuse" gimp and should only use MSPAINT because of a low IQ. Just like it was with the single-window mode, yeah.
  2. But - Good news, everyone! That bevaviour really fucked me up and I got to the code and patched it. And the patch to DISABLE that piece of shit is very simple - you just need to comment out two if()'s in app/plug-in/gimppluginmanager-file.c (see below or get it from http://svn.yourcmc.ru/viewvc.py/vitalif/trunk/scripts/patch-gimp-unite-save_export.diff?view=co).

After patching, Gimp still suggests you to save the opened *.png or anything in XCF on Ctrl-S, but it does so only the FIRST time, and ALLOWS to actually select any other format.

Patch source:

Gimp authors are MORONS!

Shame on you all for splitting "Save" and "Export" features and
for arguing that everyone who dislikes the new behaviour is an
idiot and should use MSPAINT instead of their super-duper GIMP!

First part -- enable all formats in both save and export:

--- gimp-2.8.6.orig/app/plug-in/gimppluginmanager-file.c
+++ gimp-2.8.6/app/plug-in/gimppluginmanager-file.c
@@ -136,13 +136,13 @@ gimp_plug_in_manager_register_save_handl
   gimp_plug_in_procedure_set_file_proc (file_proc,
                                         extensions, prefixes, NULL);
 
-  if (file_procedure_in_group (file_proc, FILE_PROCEDURE_GROUP_SAVE))
+  //if (file_procedure_in_group (file_proc, FILE_PROCEDURE_GROUP_SAVE))
     {
       if (! g_slist_find (manager->save_procs, file_proc))
         manager->save_procs = g_slist_prepend (manager->save_procs, file_proc);
     }
 
-  if (file_procedure_in_group (file_proc, FILE_PROCEDURE_GROUP_EXPORT))
+  //if (file_procedure_in_group (file_proc, FILE_PROCEDURE_GROUP_EXPORT))
     {
       if (! g_slist_find (manager->export_procs, file_proc))
         manager->export_procs = g_slist_prepend (manager->export_procs, file_proc);

Second part -- do not suggest saving a non-xcf image into xcf format,
even on the first save click.

--- gimp-2.8.6.orig/app/actions/file-commands.c
+++ gimp-2.8.6/app/actions/file-commands.c
@@ -228,6 +228,9 @@ file_save_cmd_callback (GtkAction *actio
     return;
 
   uri = gimp_image_get_uri (image);
+  if (! uri)
+    uri = gimp_image_get_imported_uri (image);
+  uri = g_strdup (uri);
 
   switch (save_mode)
     {
@@ -348,6 +351,8 @@ file_save_cmd_callback (GtkAction *actio
     {
       gimp_display_close (display);
     }
+
+  g_free (uri);
 }
 
 void

Third part - suggest the same type as import/export by default.

--- gimp-2.8.6.orig/app/widgets/gimpfiledialog.c	2012-12-06 03:41:06.000000000 +0400
+++ gimp-2.8.6.orig/app/widgets/gimpfiledialog.c	2013-11-08 22:53:03.095326498 +0400
@@ -571,11 +571,19 @@ gimp_file_dialog_set_save_image (GimpFil
       /* Priority of default type/extension for Save:
        *
        *   1. Type of last Save
-       *   2. .xcf (which we don't explicitly append)
+       *   2. Type of last Export
+       *   3. Type of import source
+       *   4. .xcf (which we don't explicitly append)
        */
       ext_uri = gimp_image_get_uri (image);
 
       if (! ext_uri)
+        ext_uri = gimp_image_get_exported_uri (image);
+
+      if (! ext_uri)
+        ext_uri = gimp_image_get_imported_uri (image);
+
+      if (! ext_uri)
         ext_uri = "file:///we/only/care/about/extension.xcf";
     }
   else /* if (export) */

2013-09-19 Идея для crowdfundingа

Вот есть обычный crowdfunding. Но там для финансирования с идеей должен появиться (будущий) автор проекта.

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

Это мне кажется было бы весьма актуально в контексте всяких опенсорс проектов — стимулировало бы развитие фич, которых например всем хочется, но выступить с инициативой «да, я готов запилить» сам никто изначально не готов. Плюс обмен идеями. Плюс какие-то штуки, теоретически, могли бы не сразу бабло собирать, а вообще подолгу (но всё равно собирать).

2013-09-15 HK-250GT

Тьфу ты, никак не настрою я этот хоббикинговский клон 250го T-Rex’а. FBL сделал, контроллер поставил и он вроде даже пашет, но теперь хвост, сцука, вообще не держит. Беда в том, что в хвосте люфт просто конский, а такой настройки, как задержка, у контроллера (CopterX CX-3X2000) нет. То есть, чтобы он полетел, нужно хвост менять либо на новый Align’овский, либо на что-то в духе Microheli MH-TX2142TST Precision CNC Aluminum Tail Set Pro (TITANIUM) — T-REX 250/SE. Для ремня и то, и то стоит баксов по 60. Для вала Align даже дороже.

То есть, получается, нужно было сразу взять за 300$ нормальный BNF Align TREX 250 Plus DFC, плюс OrangeRX DSM модуль, и не выпендриваться. Ибо 300$ в свой я уже явно влупил… Только разница в том, что Align бы за эти деньги летал, а этот кусок говна — не хочет. У Align и хвост правильный (конструкция хорошая, привод вальный), и голова DFC’шная, и 3GX (что удобно хотя бы потому, что вороха проводов нет), и движок нормальный, и электроника тоже…

Было бы даже лучше, если бы я просто сам собирал HK-250GT с хоббикинга, потому что весь комплект железа стоит 30$, а электроникой закупиться на хоббикинге нормальной легко (движок 10$ + регулятор где-то те же 10$ + сервы цифровые по 4-5$ + фбл голова 20$ + фбл контроллер 55$ + приёмник по вкусу 20$). Хвост, правда, всё равно бы пришлось менять на align (+60$), и всё равно под вопросом была бы беспроблемность этого фбл — эти китайцы всё равно нет-нет, где-нибудь, да налажают. Итого всё равно 225$ — если повезёт и оно таки полетит.

Но я-то вообще дурак — зачем-то взял CopterX 250 за 150$, плюс потом всё равно поменял приёмник (20$), сервы поменял сначала на аналоговые (4*2.5$), потом на цифровые (4*5$), голову всё равно поменял на фбл (20$), соответственно фбл контроллер тоже поставил (50$), это вот его мне почта про*бала и пришлось повторно заказывать (и хз ещё когда за прошлую попытку деньги вернут). Плюс зачем-то взял program box для контроллера и не стал брать usb кабель — мало того что кабель 5$ стоит, а коробочка 32$, так ещё через кабель прошивку обновить можно, а через коробочку, очевидно, нет! Движок я не менял, но работает он со страшным звуком (смазка? не, не слышали). А, ещё что характерно — штатный гироскоп CopterX хороший — из всех, что я пробовал, с этим люфтящим хвостом справлялся только он. Но в смысле ФБЛ толку от этого нет, всё равно сам контроллер за хвост отвечает.

Итого уже 302$ потрачено, а вертолёт всё ещё не летает. :) короче, как ни крути, а за 300$ align — это хорошее предложение.

2013-08-29 Viber для Linux, опеннет, комменты жгут

Сервис бесплатных голосовых звонков Viber выпустил официальный клиент для Linux. На фотке к новости указана некто "Алина":

0 1377760640.png

И комменты...


Скоро будет скайпкапец. Появляются альтернативы.


Хрен редьки не слаще. Если б с открытым кодом, да с возможностью установки на свой сервер, да с выбором метода шифромания, тлгда да.


Плата-клон TDM400P — от 2.5к р., модуль FXO — от 1.3к р.
Asterisk и туева хуча софтфонов — бесплатно.
Strongswan — столько же (если шифрования SIP недостаточно).
Опыт настройки — бесценно.


Миша: Маш, как тебе позвонить?
Маша: Плата-клон TDM400P, модуль FXO, Asterisk, Strongswan…


Миша: хорошо, что есть Алина…

2013-08-24 Что за болезнь? Опенсорсники превращаются в коммерсантов. Балмер ушедший покусал?

Что-то этим летом опенсорсники болеют. Один за другим проекты, бывшие бесплатными, делают либо платными, либо добавляют платные сборки по неслабой цене:

  • Parted Magic — автор, не меняя лицензию, сделал 5$ за скачивание любой сборки. В принципе, без смены лицензии и отсутствии запрета на распространение сборок — это такой себе «принудительный донейт» автору. В общем-то автор, конечно, джедай — хотел всего 1200$ в месяц… на себя и ЖЕНУ. Ему несколько месяцев недодали, и он решил принудительно пособирать.
  • Proxmox VE — лицензия не менялась (AGPLv3), но стали сильно предлагать всем использовать ынтырпрайз-репозиторий обновлений за 50/200/400/800$ в год за каждый CPU (примерно 4/17/33/66$ в месяц, всё что дороже 4$ — с поддержкой разных уровней паршивости).
  • nginx — лицензия BSD, сделали платную версию, 1350$ в год за каждую установку, с некоторыми дополнительными плюшками.
  • RhodeCode — был GPL, стал частично-GPL/частично-проприетарный (что могли, то сделали не-GPL), цена 50$ в месяц (600$ в год) за 50 юзеров, или 300$ в месяц (3600$ в год) за сколько хочешь юзеров. Плюс у них появился хостинг, но как он будет с github и bitbucket конкурировать — понятия не имею.
  • GitLab — был просто MIT, а теперь появится закрытая сборка за 20$ в год за каждого пользователя с шагом 20 пользователей. То есть, например, 400$ в год (33$ в месяц) за 20 юзеров, 1200$ в год (100$ в месяц) за 100 юзеров. Фичи, бывшие открытыми, обещают оставить открытыми навсегда, а что будет в ынтырпрайз-сборке — даже пока не решили.

Самое «интересное» — это когда оказывается, что за изначально платный софт нужно платить один раз при покупке, а за «типа опенсорс», «типа сельфхостед», «типа не-сервис» — нужно платить каждый год, да ещё и в зависимости от количества юзеров / процессоров / ещё какого-нибудь фуфла. По сравнению с этим автор Parted Magic ещё нормально деньги берёт.

Как-то это обидно, когда вдруг оказывается, что опенсорсники-то — не опенсорсники, а какие-то коммерсанты паршивые. Балмер покусал?

UPDATE: О, кстати — а это получается что, RhodeCode, обслуживающий 51 пользователя, авторы оценили почти в 3 РАЗА дороже, чем NGINX PLUS?!!!! У них там совсем крыша поехала?

2013-07-26 О, я по ходу баг в PHP нашёл - утечку памяти?

См. https://bugs.php.net/bug.php?id=65340

При использовании __set() объект почему-то занимает в 2 раза больше памяти O_o

Тестовый скрипт:

<?php
 
// Memory leak somewhere around __set?
 
class A
{
    var $data = array();
    function __get($k)
    {
        return $this->data[$k];
    }
    function __set($k, $v)
    {
        return $this->data[$k] = $v;
    }
}
 
$b = new A();
 
for ($i = 0; $i < 500000; $i++)
    $b->{"a$i"} = 'abc';
var_dump(memory_get_usage()); // int(78318488) - why so big?
$c = clone $b;
unset($b);
var_dump(memory_get_usage()); // int(42220972) - OK
 
unset($c);
$b = new A();
for ($i = 0; $i < 500000; $i++)
    $b->__set("a$i", 'abc');
var_dump(memory_get_usage()); // int(42221492) - OK

Почему-то первое значение потребления памяти почти в 2 раза больше, чем два других.

2013-07-21 Тривиальная фишка, сильно облегчающая жизнь в условиях тотального 3G

3G в мегафоне нормальное — в Москве. Приём хороший. Вот только нужно оно НЕ в Москве. А в МО, например, приём много где не очень. И скорость вроде бы и нормальная — в рамках одного соединения. Но как только соединений становится много, тормоза гарантированы. Как у других опсосов — не знаю, но подозреваю, что вряд ли лучше.

Отсюда — тривиальный хинт: поднимаем туннель домой (ну либо на работу / сервер / ещё куда-нибудь) и лезем через него. Простейший вариант — поднять дома squid и прокидывать к нему соединения путём ssh -L (port forwarding). Либо можно сделать VPN через PPP-SSH и заворачивать в него всё iptables’ом. Либо даже просто OpenVPN поднять.

Облегчает жизнь и увеличивает скорость серфинга весьма глобально.

2013-07-17 roi.ru

Серьёзная часть

На официальном roi.ru есть по идее полезная петиция — за отмену последней дебильной фантазии госдуры на тему интернета:

https://www.roi.ru/poll/petition/biznes/otmenit-zakon-o-proizvolnyh-blokirovkah-internet-resursov-ot-02072013-187-fz-zakon-protiv-interneta/

Кто зареган на госуслугах — голосуйте («за», разумеется). Насколько это полезно — хз, но явно не вредно.

А теперь бугагашечка

И посмотрел я там остальные петиции… Блин, что за олени их пишут? Ладно сформулировать юридически грамотно не можете, фиг с ним. Но хоть бы орфографию с грамматикой проверяли, что ли. Вот, например, такое (дословная копипаста):

«Закон о тишине, проживания в жилых домах»

«Основные цель:
В целях обеспечения комфортного проживания, ограничить строительные и ремонтные работы в многоквартирных домах в выходные дни и не рабочее время с 18.00 до 10.00.
Основные причины, что ремонт затрагивает затяжной характер, который не обеспечивает защиту граждан от отдыха после работы, детей до 14 лет и т. п.
Проблемой первораторго шума в домах до 23.00 остро стоит во всех регионах и это время необходимо снижать.»

ААААААААААААА!!!!! У меня PARSE ERROR!!!!!!!!

Или вот такое:

«Поощрение владельцев велосипедов»

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

Снизить. Ситуацию. Ну да, а то граждане увеличиваются, всё правильно.

Или просто вот такое:

  • «Цена литра бензина в России не выше 10 рублей»
  • «Вынести Ленина из Мавзолея и похоронить»
  • «Возродить СССР»
  • «Легализация короткоствольного огнестрельного оружия»
  • «Обязательный опрос дембелей об обороноспособности страны»
  • «Внесение изменение в работу Почты России»
  • «Легализация проституции»
  • «Минимальная заработная плата 25 000 руб.»

2013-06-03 Заметка - sysctl для iptables TRACE

Без вот этого почёсывания TRACE не пашет!

sysctl net.netfilter.nf_log.2=ipt_LOG

2013-05-23 Всё-таки на Galaxy S4 чёрный цвет не совсем идеален

Хм! А в AMOLED-то на Galaxy S4 чёрный всё-таки не совсем идеальный!

То есть если в тёмной комнате пустить на включённый экран чёрный цвет, будет явно заметно, что он светится, причём красноватым светом.

И самое главное — светится сильнее, чем экран первого Galaxy S!

На первом S чёрный действительно практически идеальный. То есть, тоже капельку светится, но настолько слабо, что заметить это свечение тяжело даже в тёмной комнате. А на S4 достаточно заметно.

Это что ж получается — типа, виден ток утечки транзисторов?

Или это ШИМ никогда до нуля не закрывается, даже на чёрном цвете? Регулировка яркости там вроде ШИМом с частотой 240 герц сделана. О, кстати! А ведь на первом Galaxy и ШИМа тоже не было. ШИМ хорошо видно, если на средней яркости помахать перед экраном карандашом — будет заметен «повторяющийся след» от карандаша. Прикольно.

Ну ладно. Экран всё равно хороший, и контрастность всё равно почти идеальная, пусть и похуже первого Galaxy. Ну и ШИМ — хрен с ним, с ШИМом. 240 герц — это не страшно, по идее. Зато, типа, цвета более правильными быть должны, засчёт возможности их точной регулировки…

2013-05-08 Эксперимент с UBIFS...

Эксперимент с UBIFS на флешке, кстати, не удался.

При первом же нештатном отключении питания ФС мгновенно развалилась. Вероятно, из-за наличия промежуточного уровня в виде block2mtd, которое привело к неатомарности каких-нибудь операций. Это при всей хвалёной крашеустойчивости UBIFS’а. Ну а fsck для него, собственно говоря, вообще отсутствует, так что исправить побившуюся ФС можно только путём полной перезаливки.

Зато пришла в голову идея — а нафига собственно вообще нужны лог-структурированные ФС? По-моему, успех SSD’шек доказывает, что более грамотный подход — совершенно обычная ФС поверх дополнительного уровня трансляции, обеспечивающего лог-структурированность. А такой уровень ведь по идее вполне элементарно реализуется (по крайней мере, для USB флешек). Я вот думаю, может даже попробовать его написать?

2013-05-08 Nepomuk требуется Akonadi

«Nepomuk требуется Akonadi — кто все эти люди?!!11»

Пилять, я вот всё равно считаю, что Akonadi и тем более Nepomuk, Strigi и прочая семантическая муита в KDE 4 — полное дерьмо.

С Akonadi в почтовике KMail вместо ОДНОГО процесса, жрущего 100 % CPU, мы имеем ЧЕТЫРЕ (kmail + akonadiserver + akonadi_maildispatcher_agent + mysqld). Не, я вижу, что оно улучшается со временем: в 4.8 KMail, кроме CPU, сжирал ещё и всю доступную память. В 4.10 он улучшился и теперь жрёт только CPU.

Нахера было этот маразм плодить? Мало тормозов, давайте ещё межпроцессные коммуникации замутим? Например, akonadiserver, насколько я увидел, вообще только дирижирует всем этим оркестром, но при этом жрёт 60 % одного ядра. Кстати, нормально работать с базой данных они тоже не умеют — если включить лог запросов mysql, там будет сплошной «lambda-walk», то есть чтение записей по первичному ключу ПО ОДНОЙ в цикле. Что за идиоты это писали?

А сколько процентов линукс-юзеров использует этот сраный непомук? В гугле первый же вопрос — «КАК ИХ ОТКЛЮЧИТЬ?»

В итоге кроме, блин, ОПЕРЫ (!!!) я пока не могу найти Linux-почтовик, который бы банально справился с моей рабочей почтой (а там всего-то 65к писем на IMAP’е). Thunderbird загрузить её осиливает, но дико жрёт при этом память и намертво зависает при попытке выделить и удалить 10к сообщений, упавших от мониторинга (и по-моему вообще в итоге по OOM сваливался, насколько я помню). KMail, как я уже сказал, жрёт CPU вообще всё время, а с учётом ЧЕТЫРЁХ активных процессов при проверке почты нагружает систему ТАК, что аж курсор мыши подтормаживает.

Причём оно же ещё имеет свойство самозапускаться при некоторых условиях несмотря на StartServer=false в ~/.config/akonadi/akonadiserverrc. Я в итоге его отключил так:

Options="UNIX_SOCKET=/var/run/mysqld/mysqld.sock_XYU_BAM"

Отстой какой-то))

2013-05-01 UBIFS

И оптимальна для флешек всё-таки UBIFS. Так как

  • Наиболее шустрая
  • Поддерживает сжатие — я вот реплику поднял, у меня 2.4гб базы в 800мб реальных пожались
  • Со свежими ядрами и CONFIG_MTD_UBI_FASTMAP=y быстро монтируется (не требуется сканирование всего девайса при монтировании)

2013-05-01 Почему на флешки случайная запись медленная

Я до вчерашнего дня думал, что USB флешки и карточки памяти — это практически голая флеш-память. А оказывается, нет — любая флешка/SDшка/CFка имеет внутри себя тупой, но всё-таки контроллер с тупым, но всё-таки FTL’ем (Flash Translation Layer’ом), который даже умеет какой-то wear leveling.

Тупой контроллер потому, что мелкий и ресурсов у него мало. В частности — мало памяти. Именно из-за этой тупости случайная запись на флешки/SD/CFки так дико тормозит. Из-за малого объёма RAM контроллеру флешки, в отличие от контроллера SSD, негде хранить полную таблицу сопоставления виртуальных и реальных секторов. Поэтому мапятся не сектора, а крупные блоки по где-то мегабайту (бывает и больше), а при записи есть лимит на количество «открытых» блоков.

Как это происходит:

  • Допустим, вы пишете в сектор X.
  • Контроллер отображает блок, которому принадлежит этот сектор, на реальный блок, и «открывает» его — выделяет пустой блок, запоминает, что он «дочерний» для открытого и записывает туда один изменённый вами сектор.
  • Таким макаром можно открыть максимум N разных блоков; N обычно очень маленькое — в районе 3-6. Вот у меня на столе лежит флешка, у которой 6.
  • Дальше если вы пишете следующий сектор из уже открытого блока — он просто записывается в его дочерний блок (что быстро).
  • Если же следующий записываемый сектор принадлежит другому блоку — какой-то из открытых блоков придётся закрывать и сливать содержимое дочернего блока с оригинальным.

При случайной записи секторов по всей флешке вы почти не попадаете в уже открытые блоки ⇒ каждая операция записи превращается в перезапись полного блока (что медленно). Опять-таки в отличие от SSD, которому пофиг и который группирует в физических блоках сектора из любых мест диска.

И поэтому авторы всяких UBIFS и JFFS2 не совсем правы, когда говорят, что эти ФС не предназначены для блочных устройств, а только для MTD (MTD — это как раз голая флеш-память). Ибо даже если смонтировать флешку в UBIFS через block2mtd, то скорость записи мелких файлов кардинально возрастает и становится вполне похожа на скорость нормальной последовательной записи. Это, может, и не совсем оптимально — UBIFS сама занимается стиранием блоков, а в случае USB флешки этого можно было бы не делать. Но всё равно она сильно быстрее, чем использование обычной НЕ лог-структурированной ФС.

У меня вот идея маленькую реплику MySQL повесить дома на флешку с UBIFS. Дело в том, что когда я прошлый раз пробовал повесить домой реплику с сервера, она меня достала постоянным шуршанием харда :)

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

Размер блока
запускаем flashbench -a /dev/sdc, смотрим на вывод. Начиная с какого-то размера блока число в последней колонки становится сильно меньше — значит размер блока равен оному из предыдущей строки. Этот размер и надо использовать в драйвере block2mtd.
Лимит блоков
запускаем, варьируя Y путём деления отрезка пополам flashbench -e 4M --open-au --open-au-nr=Y /dev/sdc. 4M здесь — размер блока, полученный в предыдущем пункте (необязателен, но с ним удобнее). Пока Y <= лимиту блоков, скорость в зависимости от размера записываемого блока падать не будет. Как только Y превысит лимит блоков, скорость сразу начнёт падать в зависимости от размера записываемого блока почти линейно.

2013-04-29 Побочный эффект

Ё-маё!

Оказывается, эти УРОДСКИЕ гугловые редиректы (google.com?url=…) не только отслеживают все ваши клики, а ещё и портят заголовок Referer! Раньше было очень удобно — поисковые запросы, по которым пришли на твой сайт, можно было собрать прямо из логов апача.

А сейчас — Х*Й! Потому что при переходе там адрес именно google.com?url=…, а в нём параметра ?q=… НЕТ! И это я уж не говорю о том, что тупо по клику правой кнопкой мыши «Копировать ссылку» невозможно — получаешь мусор вместо нужной ссылки.

Козлы. Ну и яндекс — тоже козлы, они так же делают.

Короче, срочно всем ставить мой юзерскрипт, который это дурацкое поведение отключает:

Работает в FF+Greasemonkey, Chrome, Opera.

2013-04-29 Чувак-лифтомотор

Вот такой клёвый чувак-лифтомотор водится у нас на работе, на инструкциях пользования пассажирскими лифтами ТЕХНОЛИФТ:

Technolift.svg

Это я его векторизовал с исходника:

Technolift-photo.jpg

2013-04-20 LALR(1)

Хе-хе. Переписал свой шаблонизатор 4-ый раз с 2006-го года — теперь на LALR(1). Поводом послужило упирание в глубину стека при рекурсивном спуске :-D смешно, да. До этого шаблонизатор был сначала стырен с phpBB (он там вообще примитивный был), потом переписан на регэкспы, потом на поиск подстроки, а потом всё-таки добавились операторы, появилась грамматика и я его переписал ещё раз — на рекурсивный спуск. Теперь вот до LALR(1) с помощью PHP-генератора парсеров LIME (типа, по мотивам lemon’а сделанного) добрался.

Так что ещё одной отличительной чертой моего шаблонизатора, кроме простоты и быстроты (кэшируется там всё хорошо), теперь является то, что он парсится вменяемой грамматикой. Причём парсится именно весь файл целиком, несмотря на то, что некорректные директивы просто пропускаются, а это требует взаимодействия лексического и синтаксического анализаторов. И реально весь язык и транслятор, кроме вызовов функций, описан LIME-грамматикой.

То есть — лексический анализатор понимает, когда находится внутри директивы, а когда вне, и возвращает соответственно просто куски шаблона литералами, либо прочие лексемы внутри директив, а также пропускает текущую директиву при возникающих ошибках разбора, отлавливая их. Для чего, кстати, пришлось допилить сам LIME — см. https://github.com/vitalif/lime — и окончательно прочувствовать алгоритм работы LALR(1). :) он вроде был курсе на 2-ом, но я его тогда как-то не особо прочувствовал. Или не было?.. Не помню точно.

А ещё я как-то не осознавал, что первым теорию формальных языков Хомский, который лингвист, придумал (ну или структурировал, по крайней мере).

Дока, кстати, тут — Шаблонизатор VMX::Template.