LilyPond → WordPress: update your sheets easy
Sorry, but this post is not available in English yet
around the essentials…
Sorry, but this post is not available in English yet
Я колись писав, як можна швиденько зробити календар у Inkscape, — а зараз я хочу ще швидше робити ще кращий (як на мене) календар, користуючись PGF у LaTeX.
Отже, імітуємо календарі від ReAl — місяці розташовані саме так, назви днів тижнів — саме отак:
Щойно дописав підтримку IPv6 для свого конфігуратора (Django/Python) шейпера (HTB/Linux).
«Воно жахливе, але працює чудово»™ .)
Чудова стаття (собі у нотатник): http://y3x.ru/2012/08/how-to-cook-pizza-with-svg/.
Є 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 буде час):
Я нижче поясню, чому це не надто ілюстративно для даної задачі, і що варто було б зробити натомість, але — нижче.
Щоб малювати час від попереднього запиту нам мало цих даних — до кожного рядка треба також додати це значення.
Отже, цей скрипт тягне журнал з іншого сервера, прибирає лапки, додає до кожного рядка різницю між часом запису цього рядка (перше поле у журналі) і часом запису попереднього, замість номерів телефонів клієнтів пише абстрактний «номер клієнта» (кожному наступному номеру телефону — який ще не траплявся — дає наступний порядковий номер) і записує «скрипт» для Gnuplot
’а.
Коментуючи одну з попередніх публікацій, Юрко спонукав таки мене написати короткий код (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]
. Ось, для прикладу, я причепив до цього повідомлення три фрагменти:
Всі фрагменти я підписав через відповідний інтерфейс вордпреса, їх порядок також виставив саме там. До речі, якщо закоментувати titles: ...
, audioplayer візьме відповідне поле з mp3 id tag
. У цьому конкретному випадку він звідти бере інформацію для artists
(«Neville Marriner – Academy of St Martin in the Fields» у даному випадку).
Чому двічі rawurlencode
? Не знаю :-)
До речі, у налаштуваннях вордпресівського Audio Player’а треба вимкнути «криптування» посилань.
Утиліту 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 |
Може, комусь і згодиться.
I have rebrandered my snmp traffic grapher (see here) — now it is SPy Bulk Grapher, or SPyBG, hip-hop!-) — and created a repository at github: SPyBG.
This happened (i had not thought of this before, at all) because i started to feel like i want to add some features and decided that this would be much easier with code management, using branches etc-etc — so, whether to make repository open or closed (at bitbucket.org, for instance) was not a question at all :О)
(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) ... |
… і користуватися ними. Але то вже занадто :О)
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.
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:
Hash-tables based shaper can act as an effective firewall; just take a look.
Now our shaper configurator generates, let’s say, this script for a client’s connection (excerpt):
# # 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 |
Now let’s assume we have a lot of DoS traffic from IP 173.204.53.138 to IP X.X.133.94 — a lot of packets, a client’s bandwidth is exhausted. (Yes, that’s real IP, that was a real DoS attack,-)
All we need is to write a filter into a proper hash table cell: