Brownian motion

around the essentials…

 

Archive for the Категорія ‘Програмування’

Знову календар нашвидкуруч

Я колись писав, як можна швиденько зробити календар у Inkscape, — а зараз я хочу ще швидше робити ще кращий (як на мене) календар, користуючись PGF у LaTeX.

Отже, імітуємо календарі від ReAl — місяці розташовані саме так, назви днів тижнів — саме отак:

Далі »»

(1 votes, average: 5 out of 5)

Трохи роботи .)

Щойно дописав підтримку IPv6 для свого конфігуратора (Django/Python) шейпера (HTB/Linux).

«Воно жахливе, але працює чудово»™ .)

(No Ratings Yet)

How to cook Pizza with SVG?

Чудова стаття (собі у нотатник): http://y3x.ru/2012/08/how-to-cook-pizza-with-svg/.

(No Ratings Yet)

Gnuplot — малюємо час на отримання результату від Informix’а

Є Asterisk, через який дзвонить купа клієнтів. Є задача — отримати від сервера Informix (не питайте, бо не знаю) кількість секунд, які певний клієнт може наговорити, дзвонячи на певний номер телефону. Тобто, для спрощення, на сервер іде запит [номерА, номерБ], сервер віддає число (>=0).

При цьому є підозра, що під кінець місяця сервер думатиме довше; є також підозра, що ті клієнти, що більше говорять, довше чекатимуть відповіді.

Хочеться це все якось бачити. Для цього у той скрипт, який бере дані з Informix’а, додаємо двійко рядків, щоб писати журнал, у приблизно такому вигляді:

# час, «номер клієнта», куди дзвонив, залишок секунд, час на отримання
# звісно, всі номери <номерБ> різні:
"2012-04-05 17:29:34.455199","01",<номерБ>",0,"0:00:00.078631"
"2012-04-05 17:46:47.482675","02",<номерБ>",0,"0:00:00.895389"
"2012-04-05 17:48:19.594244","02",<номерБ>",0,"0:00:00.029423"
"2012-04-05 17:53:18.827345","02",<номерБ>",0,"0:00:00.033318"
"2012-04-05 18:02:59.955417","02",<номерБ>",0,"0:00:00.042353"
"2012-04-05 18:05:10.750765","02",<номерБ>",0,"0:00:00.031215"
"2012-04-05 18:05:53.240702","02",<номерБ>",0,"0:00:00.029587"
"2012-04-05 18:06:47.190297","03",<номерБ>",0,"0:00:00.063169"
"2012-04-05 18:56:49.293827","02",<номерБ>",0,"0:00:01.110830"
"2012-04-05 19:03:51.475956","02",<номерБ>",0,"0:00:00.032815"
"2012-04-05 19:42:59.389716","02",<номерБ>",0,"0:00:00.034776"

Так, зараз на всі запити сервер віддає нуль, не зважайте .)

Зверніть також увагу, що у журнал падає, насправді, не 01, 02, 03 тощо, а номер телефону, з якого йшла спроба дзвонити, — але я ховаю номер телефону, ховатиму його й на графіку, і у скрипті нижче для цього буде вжито певних заходів (тобто, це робитиму не я, а awk). Тобто, замість номеру телефону awk підставлятиме «номер клієнта».

На графіку хочемо бачити щось таке (по координаті X буде час):

  • червоними хрестиками — час відгуку;
  • синіми колами — час від попереднього дзвінка;
  • для відгуків > 0.5 секунди біля хрестика писатимемо клієнта;
  • і ще якісь усереднення.

Я нижче поясню, чому це не надто ілюстративно для даної задачі, і що варто було б зробити натомість, але — нижче.

Щоб малювати час від попереднього запиту нам мало цих даних — до кожного рядка треба також додати це значення.

Отже, цей скрипт тягне журнал з іншого сервера, прибирає лапки, додає до кожного рядка різницю між часом запису цього рядка (перше поле у журналі) і часом запису попереднього, замість номерів телефонів клієнтів пише абстрактний «номер клієнта» (кожному наступному номеру телефону — який ще не траплявся — дає наступний порядковий номер) і записує «скрипт» для Gnuplot’а.

Читати далі »»

(No Ratings Yet)

WordPress: грати всі долучення

Коментуючи одну з попередніх публікацій, Юрко спонукав таки мене написати короткий код (shortcode) для вставляння програвача з переліком всіх долучених до публікації аудіофрагментів.

Тобто, я хочу до даної публікації доліпити кілька mp3 файлів, підписати їх і у публікації використати якийсь короткий код… Словом, нижче.

У файлі functions.php дописуємо таке:

function get_player( $post ) {
  $urls    = array();
  $titles  = array();
  $artists = array();
 
  $attachments = get_children(
      array('post_parent' => $post->ID,
            'post_type' => 'attachment',
            'post_mime_type' => 'audio/mpeg',
            'order_by' => 'menu_order', 'order' => 'ASC'));
  if( $attachments ) {
    foreach ( $attachments as $att_id => $att ) {
      // allow non-latin chars in file names:
      $url = wp_get_attachment_url($att_id);
      $url = preg_replace('#(.*/)([^/]*)$#e', "'\\1'.rawurlencode('\\2')", $url);
      $url = rawurlencode( $url );
      $urls[] = $url;
 
      $title  = rawurlencode( str_replace(",", ":", $att->post_title) );
      $titles[] = $title;
 
    }
    $player_id = 'audioplayer-' . $post->ID;
    $player = '<p class="audioplayer_container"><div class="np-audioplayer" id="'. $player_id .'">(No Adobe Flash Player?..)</div></p>' . "\n"
            . '<script type="text/javascript">' . "\n"
            . '    AudioPlayer.embed("' . $player_id . "\", {\n"
            . '      soundFile: "' . implode(",", $urls)    . "\" // ,\n"
            . '      titles: "'    . implode(",", $titles)  . "\"\n"
            . "    });\n"
            . "</script>\n";
    return $player;
  }
  return false;
}
 
function playall( $atts ) {
  global $post;
  return get_player($post);
}
 
add_shortcode( "playall", "playall" );

Після цього ми можемо у тілі повідомлення написати [playall]. Ось, для прикладу, я причепив до цього повідомлення три фрагменти:

(No Adobe Flash Player?..)

Всі фрагменти я підписав через відповідний інтерфейс вордпреса, їх порядок також виставив саме там. До речі, якщо закоментувати titles: ..., audioplayer візьме відповідне поле з mp3 id tag. У цьому конкретному випадку він звідти бере інформацію для artists («Neville Marriner – Academy of St Martin in the Fields» у даному випадку).

Чому двічі rawurlencode? Не знаю :-)

До речі, у налаштуваннях вордпресівського Audio Player’а треба вимкнути «криптування» посилань.

(No Ratings Yet)

bc як конвертор основи

Утиліту bc (an arbitrary precision calculator language) можна досить зручно використовувати для конвертування чисел між основами, в тому числі у скриптах:

$ echo "ibase=16; obase=2; 5F" | bc
1011111
 
$ echo "ibase=16; obase=8; 32" | bc 
62
 
$ echo "ibase=10; obase=4; 12" | bc 
30

Може, комусь і згодиться.

(No Ratings Yet)

«Малювалка» трафіку на Пітоні

Свою малювалку трафіку (читай тут) я трохи «заребрендерив» — тепер це SPy Bulk Grapher, або ж SPyBG!-) — і виклав git-сховище на github’і: SPyBG.

Сталося це тому (я ж бо ніколи про це якось і не думав), що виникло бажання дописати деякі можливості, а це буде зручніше робити з нормальним керуванням кодом, з розгалуженнями тощо — а думка зробити сховище публічним (не на bitbucket.org, скажімо) вже й не дискутувалася :О)

(No Ratings Yet)

… я Схему би вивчив уже за одне: зі мною вона українською ;О)

(use-modules (ice-9 rdelim))
(use-modules (ice-9 regex))
 
(define конфігфайл "ZyXEL.confg")
 
(define конфіг (open-input-file конфігфайл))
 
(define (знайти-влани)
  (let повторити ((вже-знайдені '()) (влан #f))
       (if (not (eof-object? (peek-char конфіг)))
           (let ((рядок (string-trim-both (read-line конфіг))))
                (if (not влан)
                    (if (string-match "vlan" рядок)
                        (set! влан (list-ref (string-tokenize рядок) 1)))
                    (begin
                        (if (string-match "fixed" рядок)
                            (set! вже-знайдені
                                      (append вже-знайдені (list влан))))
                        (if (string-match "exit" рядок)
                            (set! влан #f))))
                  (повторити вже-знайдені влан))
             вже-знайдені)))
 
(display (string-join (знайти-влани) ","))

Звісно, можна також:

(define якщо if)
(define стань! set!)
(define зліпити-у-рядок string-join)
...

… і користуватися ними. Але то вже занадто :О)

(No Ratings Yet)

Making RtConfig (IRRToolSet) in Ubuntu

Having used IRRToolSet in elder Ubuntu releases (elder compilers, libraries etc), i finally decided to compile it under 9.10 (yes, previously made RtConfig works under 9.10 too, «but anyway»).

But something goes wrong, with several files — illegal conversion and «bad» syntax and the like.

So, if you’ll run into the same problems, hope this patch will help.

Apply patch as usually (in the directory where IRRToolSet-4.8.5 is unpacked):

$ patch -p0 --dry-run < IRRToolSet-4.8.5-ubu-patch.diff

If everything is OK, remove --dry-run switch and run again.

(No Ratings Yet)

Django-based HTB shaper configurator

I’ve decided to make it available after some nice people asked for this.

Now i have no time and, let’s say, health to make it better, so please don’t complain :-)

I guess it maybe would be better to make it available somewhere at code.google.com — i would like to work on this code later, surely.

Anyway. Now — as it now is. With incomplete README:

» Читати далі… »

(2 votes, average: 5 out of 5)

Шейпер як ефективний файрвол

Шейпер із використанням хеш-таблиць може досить ефективно захищати клієнта від атак; ось дивіться.

Зараз наш конфігуратор шейпера генерує, скажімо, такий скрипт для певного клієнта (фрагмент):

#
# Contract I-1082,
# connection 606 (0x25e).
#
# input:
/sbin/tc class add dev clients0 classid 1:25e parent 1:fe10 htb rate 96kbit ceil 128kbit quantum 1500 burst 7500 cburst 12500 prio 50
/sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5c match ip dst X.X.133.92 flowid 1:25e
/sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5d match ip dst X.X.133.93 flowid 1:25e
/sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5e match ip dst X.X.133.94 flowid 1:25e
/sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5f match ip dst X.X.133.95 flowid 1:25e

Припустимо, з адреси 173.204.53.138 іде атака на X.X.133.94 — купа якихось пакетів, багато, весь канал клієнта забитий. (Так, адреса реальна, була реальна атака,-)

Все, що нам треба, — вписати потрібний фільтр у потрібну комірку хеш-таблиці:

» Читати далі — скрипт і коментарі… »

(No Ratings Yet)

“Покращення” сфотографованого тексту

На цей раз маємо задачу: не надто вдало сфотографовані сторінки тексту треба «пристосувати» для друку — підняти контраст, різкість, зробити «виразнішими».

Як завжди, результат можна отримати легким (easy-to-use) та важким (where-am-i?..) шляхом — розглянемо обидва.

(Звичайно ж, це не єдиний алгоритм, яким можна досягти бажаного результату.)

Зміст

  1. «Легкий» — графічний — шлях
  2. «Важкий» — з командного рядка
  3. Висновок

» Читати далі — алгоритми, знімки екрану, пояснення… »

(No Ratings Yet)

Останні публікації

Most Rated

Highest Rated

Теґи

Архіви