ViM Promo

Gentoo Optimization

http://funroll-loops.info/

10/01/11 01:33

Восход, закат, обои

Давненько я хотел как-то активизировать свои обои на рабочем столе. Один из способов - это мотиватор, который блюрит картинку в зависимости от дальности цели (чем ближе цель - тем меньше блюр). Для этих целей использовался imagemagick и habak. Первый - тулбокс для работы с картинками, имеющий мощное API и не менее мощный набор shell-утилит. Второе - хрень, которая умеет ставить картинку на X root window (читай на рабочий стол) и писать на ней всякий текст.

Была также идея насчет мозаики вебкамер из разных городов там же... Однако сцуко mplayer как и vlc не захотели грабить mjpeg поток, который используется например на харьковских вебках укртелекома :(.

Сейчас же я реализовал привязку картинок к положению светила нашего небесного для того, что бы меньше отрываться от окружающего реального мира :D
Для начала я начал гуглить утилиту для расчета высоты солнца, времени заката и восхода в зависимости от географического положения. Гуглеж, как ни странно, ни к чему не привел. :(. Посему нашлась недопиленная программулина. Я её допилил до работы с getopt (правда не очень все там красиво и правильно в плане дуракоустойчивости, но оно работает).
Программулина сия компилируется gcc с флагом -lm (линковать с математикой :)). Так же я её пропатчил на предмет расчета текущей высоты солнца над горизонтом. Для этого использовал мысль, что солнце по небосводу (видимому и невидимому, т. е. ночью) движется по синусоиде.

Вывод этой программы втупую парсится в bash-скрипте, который позволяет:
суется в cron и работает раз в минуту :) позжее будет tar.bz2

UPDATE:
tar.bz2 не будет. Будет тыц и тыц

2/11/10 18:37

Всё что я думаю о входе кота в мою комнату

26/10/10 00:44

О Gentoo

ППКС

23/10/10 05:10

Что мне выносит мозги каждый божий вечер, блять.(Ларри и его команда, ебучая австралийская пластмассовая газонокосилка)

12/10/10 20:36

Трушный способ перекодировки для экранов WinStar(HD44780)

тыц
Вкратце - ставятся дополнительные кодировки для iconv и юзаются флаги перекодировки для gcc:
-finput-charset=cp1251 -fexec-charset=ks0066-ru
в моем случае - utf8 и ks0066-ru (сие суть вздрочная кодовая страница экрана на базе HD44780):

11/10/10 20:14

Hunter Thompson

8/10/10 15:59

Lulz

16/09/10 18:02

Python. Форматированный вывод структур

Занимаясь дебагом python-кода часто бывает надобность в получении словарей (которые dictionary, которые {}) во вкусном виде :). ну т. е. каша в духе:
{'html_description': u'\n<img src="http://l.yimg.com/a/i/us/we/52/33.gif"/><br />\n<b>Current Conditions:</b><br />\nFair, 18 C<BR />\n<BR /><b>Forecast:</b><BR />\nMon - Mostly Clear. High: 23 Low: 11<br />\nTue - Mostly Sunny. High: 24 Low: 12<br />\n<br />\n<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Kiev__UP/*http://weather.yahoo.com/forecast/UPXX0016_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>\n(provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>\n', 'atmosphere': {'pressure': u'1015.92', 'rising': u'0', 'visibility': u'9.99', 'humidity': u'45'}, 'title': u'Yahoo! Weather - Kiev, UP', 'condition': {'date': u'Mon, 13 Sep 2010 9:30 pm EEST', 'text': u'Fair', 'code': u'33', 'temp': u'18', 'title': u'Conditions for Kiev, UP at 9:30 pm EEST'}, 'forecasts': [{'date': u'13 Sep 2010', 'high': u'23', 'code': u'33', 'low': u'11', 'text': u'Mostly Clear'}, {'date': u'14 Sep 2010', 'high': u'24', 'code': u'34', 'low': u'12', 'text': u'Mostly Sunny'}], 'link': u'http://us.rd.yahoo.com/dailynews/rss/weather/Kiev__UP/*http://weather.yahoo.com/forecast/UPXX0016_c.html', 'location': {'city': u'Kiev', 'region': u'', 'country': u'UP'}, 'units': {'distance': u'km', 'speed': u'km/h', 'temperature': u'C', 'pressure': u'mb'}, 'astronomy': {'sunset': u'7:17 pm', 'sunrise': u'6:29 am'}, 'geo': {'lat': u'50.4', 'long': u'30.45'}, 'wind': {'direction': u'0', 'speed': u'0', 'chill': u'18'}}
нас совершенно не прет... Погуглив на этот счет (искал какой-то стандартный способ форматирования) нашел всякую хиромантию типа нагугленное.
Подумав о немного другой задаче, связанной с той же проблемой, (мне нужна была сериализация данных в базу) я загуглил JSON под python... и нашел что мне надо:
>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
    "4": 5,
    "6": 7
}

Итог для той же хрени:
{
    "astronomy": {
        "sunrise": "6:29 am", 
        "sunset": "7:17 pm"
    }, 
    "atmosphere": {
        "humidity": "45", 
        "pressure": "1015.92", 
        "rising": "0", 
        "visibility": "9.99"
    }, 
    "condition": {
        "code": "33", 
        "date": "Mon, 13 Sep 2010 9:30 pm EEST", 
        "temp": "18", 
        "text": "Fair", 
        "title": "Conditions for Kiev, UP at 9:30 pm EEST"
    }, 
    "forecasts": [
        {
            "code": "33", 
            "date": "13 Sep 2010", 
            "high": "23", 
            "low": "11", 
            "text": "Mostly Clear"
        }, 
        {
            "code": "34", 
            "date": "14 Sep 2010", 
            "high": "24", 
            "low": "12", 
            "text": "Mostly Sunny"
        }
    ], 
    "geo": {
        "lat": "50.4", 
        "long": "30.45"
    }, 
    "html_description": "\n<img src=\"http://l.yimg.com/a/i/us/we/52/33.gif\"/><br />\n<b>Current Conditions:</b><br />\nFair, 18 C<BR />\n<BR /><b>Forecast:</b><BR />\nMon - Mostly Clear. High: 23 Low: 11<br />\nTue - Mostly Sunny. High: 24 Low: 12<br />\n<br />\n<a href=\"http://us.rd.yahoo.com/dailynews/rss/weather/Kiev__UP/*http://weather.yahoo.com/forecast/UPXX0016_c.html\">Full Forecast at Yahoo! Weather</a><BR/><BR/>\n(provided by <a href=\"http://www.weather.com\" >The Weather Channel</a>)<br/>\n", 
    "link": "http://us.rd.yahoo.com/dailynews/rss/weather/Kiev__UP/*http://weather.yahoo.com/forecast/UPXX0016_c.html", 
    "location": {
        "city": "Kiev", 
        "country": "UP", 
        "region": ""
    }, 
    "title": "Yahoo! Weather - Kiev, UP", 
    "units": {
        "distance": "km", 
        "pressure": "mb", 
        "speed": "km/h", 
        "temperature": "C"
    }, 
    "wind": {
        "chill": "18", 
        "direction": "0", 
        "speed": "0"
    }
}

13/09/10 21:51

lftp умеет тянуть торренты!!!!!

Сегодня, балуясь табом в lftp я внезапно обнаружил, что:
lftp :~> help torrent
Использование: torrent [-O <dir>] <file>
lftp :~>
Меня сие позабавило, и я решил попробовать:
lftp :~> torrent -O ~/tmp/ ~/tmp/[rutracker.org].t1387223.torrent 
Name: Gogol Bordello                                                       
dn:525135220 1.46Мб/с up:0 complete:1986/1986 (100%) овп:0s
  peers:27 active:12 complete:11
Seeding in background...
Во истину он крут :). При условии возможности кормить ему команды из параметров шелла - получается такая себе доунлоадилка (а-ля wget). Хотя wget тоже это умеет :)

2/09/10 22:24

Раскладка клавы в Иксах

Сегодня, при апдейте на кейворженные иксы, месу и дрова видяхи (кагбэ задолбали рывки в 3d) я обнаружил, что конфиг переключалки раскладки в xorg.conf ВНЕЗАПНО поломался. Гугл вывел на аналоги с помощью setxkbmap, чем я и воспользовался.

Так же меня давно достало тянуться к Esc в vim, и я решил координально соптимизировать кнопы на клаве:
asmer@iridium ~ $ cat /home/asmer/.icewm/startup 
#!/bin/bash
~/.bashrc
setxkbmap -layout 'us,ru' -option 'grp:menu_toggle,grp_led:scroll'
setxkbmap -option "caps:swapescape"
Сие означает, что теперь для переключение раскладки используется абсолютно незаюзанная кнопка Menu (у меня на буке находится возле стрелок), а капс с ескейпом поменяны местами. Т. е. в vim теперь не придется постоянно носится в верхний угол клавы :). Ко всему прочему, на тех терминалах, для которых в свое время разрабатывался VI, приблизительно так и было.
Ссылка в тему
Ко всему прочему станут доступны разнообразные хоткеи, использующие ctrl+shift. (В gimp, например)

30/08/10 17:30

ProFTPd Ебля

Давненько уже юзаю proftpd на серваке. Кузявая, кастомабельная и удобная штука. Сегодня произошел апдейт с 1.3.2d в 1.3.3a на серваке (гента харденовая). Все хорошо, но вдруг, ВНЕЗАПНО, перестал работать anonymous login. Меня это ни-разу не возбудило, начал ковыряться, в гугле - хуй. Слава товарисчу вуглускру, у него все завелось и до апдейта, и после. Оказалось что acl работает не совсем так, как нужно. Посему acl был выпилен из USE и все завелось.

Ко всему прочему, emerge Не захотел собирать proftpd при запущенном proftpd, и попросил его стопнуть!. Вот такая фигня.
Кстати, блог уже гуглиться по запросу asmer blog, asmer vim и т. п. :). Ушел гулять :)

26/08/10 21:37

LULZ

25/08/10 03:02

nmap. ASCII-art

Отакэ вылазит при после configure:
            .       .
            \`-"'"-'/
             } 6 6 {
            ==. Y ,==
              /^^^\  .
             /     \  )  Ncat: A modern interpretation of classic Netcat
            (  )-(  )/
            -""---""---   /
           /   Ncat    \_/
          (     ____
           \_.=|____E
Configuration complete.
   (  )   /\   _                 (
    \ |  (  \ ( \.(               )                      _____
  \  \ \  `  `   ) \             (  ___                 / _   \
 (_`    \+   . x  ( .\            \/   \____-----------/ (o)   \_
- .-               \+  ;          (  O                           \____
(__                +- .( -'.- <.   \_____________  `              \  /
(_____            ._._: <_ - <- _- _  VVVVVVV VV V\                \/
  .    /./.+-  . .- /  +--  - .    (--_AAAAAAA__A_/                |
  (__ ' /x  / x _/ (                \______________//_              \_______
 , x / ( '  . / .  /                                  \___'          \     /
    /  /  _/ /    +                                       |           \   /
   '  (__/                                               /              \/
                                                       /                  \
             NMAP IS A POWERFUL TOOL -- USE CAREFULLY AND RESPONSIBLY

10/08/10 15:11

Карпаты удались. Мы во Львове!!!

Собственно сабж. Остальное - потом :). Скоро фото повыкладываю :). Видели Шипот, г. Стой, озеро Синевир и хуеву гору охуительной природы :). Буду тут висеть пока смогу :)

16/07/10 23:56

Мне нравится

9/07/10 00:07

Протокол скайпа раздуплили!!!!!

Собственно сабж. Жду жаббер-транспорта под скайп :).


Хабр по теме

8/07/10 21:52

Интернет добрался и до нас

Согласно статистике сайта http://www.netindex.com/, Харьков занимает 12 место по средней скорости даунлоада и 15 место по скорости аплоада в МИРЕ. Данные со спидтеста. Я знал, что этот день придет, когда интернет будет крут и дешев :). Осталось дождаться такого же в мобильной сфере.

4/07/10 00:10

tagsRefresh. Засунуть в крон для автообновления ctags.sh

Скачать

8/06/10 18:37

Это вроде как круто. Кто хочет попробовать?

DWARF FORTRESS

8/06/10 18:35

Omni Completion Screencast.ogv

Скачать

8/06/10 15:05

Нормальное автодополнение в ViM

Давненько я хотел сделать из ViM полноценную IDE. Нагуглив пару вагонов конфигов (и плагинов), я сделал из ViM следующее:
В-общем, можно сказать что джентльменский набор у меня был. Но не хватало умного автодополнения для ViM. Словарное было.

Теоретическое отступление

Как это работает. Работа с автодополнением в ViM происходит следующим, unixwayным образом: специальная тулзня генерит специальный файл (файл тэгов), в котором хранится информация о разнообразных идентификаторах в коде (переменные, классы, методы, функции и т. п.). ViM же с помощью специального параметра конфигурации использует этот файл для автодополнения в редакторе.
UNIXWAY это круто, но.... ...Но из такого подхода сейчас выплывают следующая проблема - отсутствие обновления базы тэгов на лету. Если для компилируемых языков обновление базы органично вписывается в makefile компиляции, то для веба это все как-то нетривиально.

Решаем траблу.

Логично в такой ситуации сделать обновление базы тэгов по сохранению файла. Для этого в ViM есть соответствующий хук:
    1 au BufWritePost * silent !~/scripts/tagsUpdate <afile>
Засовываем это в конфиг (~/.vimrc), или же в ~/.vim/ftplugin/php.vim (если используется filetype-plugin, который позволяет использовать разные конфиги для разных типов файлов). Суть хука простая - по сохранению файла вызвать шелл-скрипт, который будет обновлять базу тэгов, и передать ему имя файла. База тэгов может быть одна на целое дерево директорий (обычно одна на проект). ViM же умеет искать эту базу вверх по дереву каталогов от текущего файла. Таким образом пользователь может, с одной стороны не разводить бардак из десятков и сотен tags-файлов, с другой - добится разделения разных несвязанных проектов.

Ниже приведены 3 строки, которые нужны для работы автодополнения:

1 set omnifunc=phpcomplete#CompletePHP
2 au BufWritePost * silent !~/scripts/tagsUpdate <afile>
3 set tags=./tags;
ViM умеет подхватывать обновления в базе тэгов на лету. Т. е., если вы в другом редакторе отредактировали другой файл проекта и перезапустили ctags (тул для сбора базы тэгов), ViM поймет это БЕЗО всяких шевелений с вашей стороны. Ему достаточно, что он нашел файл с тэгами, а обновления он в нем находит САМ :).

Далее, собственно скрипт, который выполняется при сохранении файла в ViM:
 1 #!/bin/bash
 2 CURPATH=`pwd`
 3 TAGS="tags"
 4
 5 dir=${1%/*}
 6 cd $dir
 7
 8 while [ 1 ]; do
 9     if [ -f "$TAGS" ]; 
10     then
11         pwd
12         echo 'tags found'
13         #FILES=`find -newer "$TAGS" | xargs`
14         ctags -a  --fields=iafksS --extra=+q -f "$TAGS" "${CURPATH}/${1}"
15         break
16     fi
17     if [ `pwd` == "/" ];
18     then
19         echo 'tags not found. Exit';
20         break
21     fi
22     cd ..
23 done
24
25 cd ${CURPATH}
Работает это скрипт следующим образом:

Рецепт

  1. Установить всё что надо. Linux, ViM, ctags.
  2. Засунуть в нужный конфиг ViM три строки - имя файла с тэгом и хук на скрипт, а также выбор режим автодополнения
  3. Засунуть скрипт в нужное место. Удостоверится, что путь к нему конфиге ViM верный. Или что скрипт лежит в верном месте.
  4. Создать файл tags. Приходим в папку с проектом, и запускаем ctags БЕЗ -a (без добавления) и с -R (рекурсия). -f tags для стандартного имени tags писать не обязательно.
  5. пользоваться

Ну написал, ну написал.... А ПОЛЬЗОВАТЬСЯ-ТО КАК?

Как-как. С удовольствием :-D. Первое: вызов автодополнения происходит по ctrl-x ctrl-o. Не нравится - перебиндите на шо-нить иное. Это вам не MSVS. У меня - ctrl-f. И еще, хотите увидеть объявление - ctrl-w ctrl-]. И сразу откроется то, на чем сейчас курсор.

и, наконец, ложка говна дегтя

ну вот и всё :)

8/06/10 12:47

День Святого Ебукентия.py

Код:
#!/usr/bin/env python

from relationships import *
from alcohol import shot, beer

def valentines_day(self):
    if self.dating:
        if self.money == 0:
            self.dating = False
        elif self.num_prev_dates == 0:
            self.money -= dinner()
            self.money -= pointless_gift()
        else:
            self.money -= dinner()/sqrt(self.num_prev_dates)
            if randInt(self.num_prev_dates):
                self.money -= pointless_gift()/self.num_prev_dates
    elif self.married:
        if self.years_married < 5:
             self.money -= dinner()/(self.years_married ** 2)
        else:
             pass
    else:
        while self.blood_alcohol < .08:
            self.blood_alcohol += beer()
        while self.blood_alcohol < .22:
            self.blood_alcohol += shot()
        sleep(86400)
source code colored by ViM

8/06/10 00:25

1006052158_Pupka - directory

Pupk.

Скачать

5/06/10 21:58

Как работает V-Twin. Украдено на просторах интернета, для понятности увеличена задержка между кадрами

20/05/10 00:47

Автоматизируем скачку торрентов

Как в принципе знают все мои товарисчи ITшнеги, я любитель unixway. Т. е. я люблю всевозможные варианты использования разнообразных утилит, которые предоставляет стандартное UNIX-окружение.
Достаточно давно я задумался о том, что было бы неплохо скачивать новую серию Хауса не нажимая f5 на лостфильме каждую минуту в ожидании, а возложить это на сервер с торрент-клиентом. Итак...

Как это сделать?

Что же получилось?

#!/bin/bash
P=/root/autotorrent                             #рабочая папка скрипта
PT=/srv/media/download/torrents                 #папка с торрент-файлами для rtorrent
CURP=`pwd`                                      #сохраняем текущую папку
cd $P                                           #переходим в рабочую папку
wget http://lostfilm.tv/rssdd.xml -O rss.xml    #скачиваем rss-ленту.
LINK=`grep /House. rss.xml`                     #выгрепливаем ссылку на торрент-файл
LINK=`echo $LINK | replace '<link>' '' '</link>' ''`
cd $PT                                          #заходим в папку, сканируемую rtorrent
wget -N --load-cookies $P/cookies.txt $LINK     #скачиваем торрент-файл
ls
cd $CURP                                        #возвращаемся в исходный каталог

Комментарии и пояснения

Как видно, скрипт получился элементарный. Главная загвоздка была в том, что для скачки торрент-файла с lostfilm.tv надо быть залогиненым на сайте. Для этого надо дать wget кукисы из залогиненной сессии в браузере. wget использует cookies.txt в формате netscape navigator. Для извлечения кукисов в таком формате из православного FF3 есть правильный плагин.
В рабочей папке скрипта сохраняется rss.xml с сайта и файл с куками. Во имя безопасности и выпилил всё, что не касается lostfilm.tv из cookies.txt.

Скрипт не проверяет, скачан ли уже торрент-файл. Но это проверяет rtorrent.

TODO


Вот и всё. Enjoy!

PS: ну, и конечно же, не забудьте добавить сие в крон.

6/05/10 20:39

ППКС

подпишусь под каждым словом
или почти под каждым.

30/04/10 04:51

Как поймете, обьясните мне, ок?

http://paste2.org/p/638229

29/04/10 01:15

Аськоспамботы совсем охуели

Вот собстно что сегодня ко мне пришло:
[17:53:15] <413574747@icq.asmer.org.ua> Привет, как поживаешь?
[17:53:29] <asmer> ты хто
[17:53:31] <asmer> бот?
[17:53:33] <413574747@icq.asmer.org.ua> вот тебе маленький сюрприз от меня. кинь смску на номер 3381 с текстом 571151 и посмотри что придет. не бойся это стоит как обычная смс,  это реально того стоит, надеюсь тебе понравится :)
[17:53:39] <413574747@icq.asmer.org.ua> Интересную темку хочешь посмотреть? :)
[17:53:43] <asmer> пошел нахуй
[17:53:45] <413574747@icq.asmer.org.ua> Ладно, давай я отключаюсь, позже спишемся :)

14/04/10 17:54

Купи винду!

...убей своих детей

24/03/10 12:41

Где живет НЛО

16/03/10 22:55

Админская душа цветет и пахнет

Уже полтора месяца у нас тут есть второй канал малопонятной конторы maxhet. Да, сайт у них именно maxhet.info, нифига не maxnet. Мне собсно по барабану, благо на прием канал бывает до 50 мегабит, а отдача до 6. (5mb/0.5mb). Так как уже есть велтон, а к локальным городским сетям у меня доверия нет, я решил не отказываться от нашего текущего (и очень стабильного, как в плане скорости, так и в плане наличия интернета как такового) Велтона (1.6 мегабита вход и около 0.8 выход).


Как выяснилось, настройка multipath, т. е. многоканального инета в linux - штука простая. Конечно сделать так, что бы каждый пакет мог ходить разными путями в интернет с одного и того же IP через два канала невозможно без AS (автономной системы) и всякий умных роутинговых вещей типа BGP, OSPF и т. п.

Итак, используем iproute2 для организации multipath-балансированного доступа в тырнет:

первым делом придумываем пару таблиц роутинга и суем их в /etc/iproute2/rt_tables:

...
250	velton
249	maxhet
...


это типа номер таблицы и её имя. Для удобства.

Далее, суем в каждую из них следующие заклинания:

ip route add $LOCAL_NET  dev $LOCAL_IF table $VELTON_TABLE
ip route add $VELTON_NET dev $VELTON_IF src $VELTON_IP table $VELTON_TABLE
ip route add default via $VELTON_GW table $VELTON_TABLE


где $LOCAL_NET - локалка (в моем случае 192.168.1.0/24)
$LOCAL_IF - локальный интерфейс (в моем случае eth0)
$VELTON_TABLE - таблица из /etc/iproute2/rt_tables (в моем случае velton и maxhet)

Вообще первое правило нужно для того, что бы роутились внешние айпишники сервака во внутреннюю сеть. (Я словил немалый butthurt, когда пытался достучаться до своих девелопментских сайтов, которые прекрасно работали снаружи). Без этой фигни нихрена не будет работать ping velton.asmer.org.ua изнутри сети.
Еще два правила собственно устанавливают велтоновскую сеть (так как ppp, я использовал IP адрес пира, т. е. шлюза, с маской 32), что в неё надо ходить с велтоновского IP адреса и что правило надо засунуть в велтоновскую таблицу роутинга. Также там указан дефолтный шлюз для велтоновской таблицы.

Те же правила устанавливаются и для максхетовской таблицы.

После добавляем правила, которые намекают на то, что для пакетов уходящих в сети провайдеров, надо использовать правильные интерфейсы и IP:

ip route add $VELTON_NET dev $VELTON_IF src $VELTON_IP
ip route add $MAXHET_NET dev $MAXHET_IF src $MAXHET_IP

Эти два правила обеспечивают, что ответ на входящий трафик будет отправлен через тот же интерфейс:

ip rule add from $VELTON_IP table $VELTON_TABLE
ip rule add from $MAXHET_IP table $MAXHET_TABLE
Далее идет самое интересное: балансировка нагрузки:

ip route add default scope global nexthop via $VELTON_GW dev $VELTON_IF weight 1 nexthop via $MAXHET_GW dev $MAXHET_IF weight $WEIGHT 

Здесь мы ставим приоритет каналов. Приоритет не по траффику, а, скорее по соединениям. Т. е. жирное соединение на youtube будет равнозначно какому-нибудь краткому соединению на получение страницы с гугла. Однако большое количество соединений нивелирует этот эффект. Ко всему прочему, соединения кэшируются, т. е. если Юречное ходил на youtube.com через велтон, то я через несколько минут тоже пойду туда через велтон. Сие не есть круто, но пока особенных проблем с этим не замечено. В моем случае $WEIGHT = 10, так как в среднем maxhet работает раз в десять быстрее ADSL с Велтона.

UDP
Некоторые товарищи неплохо знают, что я люблю поиграть в urbanterror. Это замечательный `клон КСа` на движке от q3 (координально переработанном). У maxhet'а, кроме всего прочего, есть очень неплохое качество - низкая латентность. Если на velton в лучшем случае пинг в игре около 70-120, то в локалке пинг около 30-60. Поэтому мне было интересно, как будет работать многолучевой роутинг в этом аспекте. Поигравшись немного, я заметил, что пинг действительно стал намного лучше, НО, иногда меня перекидывало на другой канал, и я не мог двигаться в игре. Однако вокруг меня бегали другие игроки. Погуглив, я нашел решение:

iptables -A PREROUTING -i eth0 -t mangle -p udp -s 192.168.1.0/24  -j MARK --set-mark 1
ip rule add from all fwmark 1 table maxhet


Суть решения проста - существует связь между iproute2 и файрволлом iptables. iptables может разрешать, запрещать, натить и делать хрен знает что еще с траффиком, причем можно выбирать отдельные протоколы, порты и прочие условия. Так же iptables может `помечать` пакеты определенным образом. И эту метку может прочитать и учитывать при роутинге iproute2. Итак, первое заклинание `iptables...` говорит, что все пакеты из локальной сети протокола udp надо пометить меткой 1. Может быть еще метка 2. Или 3. И так далее (какой лимит, я хз, но уж точно не меньше 256, а скорее всего 65535..2**32). Тем временем второе заклинание указывает iproute, что все пакеты, помеченные меткой 1 должны отправляться в таблицу maxhet. Это реально помогло :)

НАРУЖА
А как теперь быть с тем, что приходит снаружи на мой доморощенный хостенк?

Да очень просто. Берем ДНС и разворачиваем его на два IP:

...
palladium	IN	A	85.90.221.60
		IN	A	109.86.156.250
...

Был также гуглеж на тему весов в выдаче IP в ДНС, но я толку так и не добился. Вроде как добавление строк `IN A 109.86.156.250` должно добавить веса maxhetовскуму айпишнику, но внешнее тестирование этого не показало. Так же был поднят лимит скорости для внешних айпишников в фтпсервере (proftpd), причесан торрент-клиент (rtorrent таки перестал работать под рутом O_o и обзавелся uTorrent-образной вебмордой), и установлен сервак UrbanTerror (как оказалось очень просто и быстро).

Посмотрим что будет дальше :)

3/03/10 05:51

Генштаб. Карты

Когда-то давно (лет 6 назад), я с помощью Погорелова надыбал карты генштаба. Их было два CD. К ним был корявый просмотр с помощью общей карты Украины, поделенной на части. Года три назад я взял это дело, и немного причесал. Теперь есть минимап, на которой можно кликать в регион Украины, зум, и возможность ходить по картам в разные стороны.


По нынешним временам это всё не очень-то и актуально (благо яндексы и гуглезы решать практически все проблемы веб-картографии), но, тем не менее, сегодня я выложил это на всеобщее оборзение:
тыц

PS: на самом деле я на ноуте место на винте чистил :-D
PPS: кстати, есть еще карта кавказа: тыц
PPPS: за скорость не обессудьте, никак руки не дойдут до разруливания двух каналов в инет.

26/02/10 16:18

Программирование текста в VIM. Часть 1

Многие полезные вещи есть в vim. Однако, в периодических стычках на эту тему со своими знакомыми программистами, многие из них доказывали мне, что большинство этих полезных вещей есть и в других редакторах кода. Сейчас я хочу показать некоторые главные фишки vim, которые являются уникальными. Сегодня мы рассмотрим `основной` режим этого великого программатора текстов. Ибо редактором его назвать сложно. Для начала, советую распечатать и повесить на стену (как я в свое время) следующую шпаргалку):



В основном режиме каждая клавиша на клавиатуре обладает определенной функцией. Многие из этих функций могут комбинироваться. На этом щите зеленым помечены клавиши, которые предназначены для перемещения по тексту(слово вперед, слово назад, поиск символа в строке и т. п.). Это во много перекликается со структурой текста программ или языков разметки, так как в них, как правило, специальные символы отделяют одни структурные элементы от других. Например:
    для текста `<html>` комбинация `f>` позволит сразу же `перепрыгнуть` на конец тэга html, или же
    для `foreach ($foo as $bar)` 2f$ сразу же перейдет к началу переменной $bar. 2 в данном случае обозначает повтор действия f$, то есть переход не к $foo, а $bar
        (ко 2-му вхождению символа $ в строке)
желтые - `прямые` действия, т. е. операции над текстом. Например вставка из буфера, копирование строки, ввод текста в конце строки и т. п. Например:
    для текста `<html>` клавиша `S` сотрет всю строку, установит курсор на начало тэга html (сохраняя сдвиг в коде) и переведет редактор в режим ввода текста.
    для текста `foreach ($foo as $bar)` `D` удалит все символы от курсора и до конца строки
оранжевые - действия, которые требуют дополнительного указания движения после символа действия. Например, замена, удаление или копирование в строке. Например:
    для текста `<html>` f<lct>div поменяют тэг html на div не трогая угловые скобки. Разберем `программу` замены:
        f< - перемещает на символ <
        l - аналог стрелки вправо, однако не требует перемещения рук со символов клавиатуры (т. е. руки могут оставаться в месте, положенном для слепого набора - asdf и jkl;). 
            После этого курсор находится на первом символе тэга (`h` в нашем случае)
        ct> - собственно `оранжевая` команда. Т. е. `c` обозначает изменение текста (change), а вот что конкретно ты хочешь изменить указывается дальнейшей операцией 
            перемещения. `t>` означает `до >` (till), и, следовательно, редактор удаляет весь текст от текущей позиции до конца тэга, после чего происходит 
            переход в режим ввода.
        div - в режиме ввода происходит обычный ввод, и мы вводим слово div в тэге.
Таким образом можно менять практически любые части текста в строке. Например, для PHP, быстрое добавление ключа в foreach:
    foreach ($foo as $bar) - `2f$i$key => <ESC>` 
        2f$ переходим на $bar
        i - переходим в режим ввода перед текущим символом
        `$key => ` - ввод текста, который нам нужен.
        <ESC> - нажимаем кнопу на клаве для того, что бы вернуться в нормальный режим из режима ввода текста

23/02/10 01:44

Задумайтесь

тыц

23/02/10 00:55

Юрец жжот

Юрка, подпиздовывая к телефону и усаживаясь на табуретку с ноутом (активация винды по телефону :):

    Как удобен ноутбук... Как удобен ноутбук...
    Захотел посрать пойти - Нет проблем, иди посри!

17/02/10 23:31

GUI Timeline

тыц

16/02/10 23:00

Поставил статус и что из этого получилось..

Начну я с того, что сегодня на Уркаине выборы. Второй тур. Янык VS Юля. Ну это и так все знают, и, в принципе, это не важно.
Вечером, общаясь в жабере с Котячкой и Лежей я слышал от них что по телеку уже начался срачь, что Юля уже говорит что свое поражение она так просто не оставит, и т. п... А я был голоден, и мне хотелось приготовить чего-нить поесть...
Ну и поставил я себе статут `В ПИЗДУ ВЫБОРЫ!!! ПОШЕЛ ГОТОВИТЬ УЖИН!!!!`... Через несколько минут, один из моих заказчиков мне написал следующее:
...ненужная хуита скипнута...
[20:29:47] <asmer> Hello Miles. Of course, this is possible.
[21:02:50] *** milesbaustin@gmail.com is Away
[21:06:13] *** milesbaustin@gmail.com is Online
[21:57:22] *** milesbaustin@gmail.com is Away
[21:57:35] *** milesbaustin@gmail.com is Online
[22:05:35] <milesbaustin@gmail.com> Your text is in Russian/ I can't read Russian
[22:05:47] <milesbaustin@gmail.com> /Ukrainian
[22:13:14] <asmer> hm
[22:13:15] <asmer> where?
[22:13:24] <asmer> may be some codepage error
[22:13:29] <milesbaustin@gmail.com> В ПИЗДУ ВЫБОРЫ!!!! ПОШЕЛ ГОТОВИТЬ УЖИН!!!!

[22:13:40] <milesbaustin@gmail.com> :)
[22:15:06] <asmer> this is my status. That means  now time for dinner :)
[22:16:29] <asmer> and, also, today is elections for president in Ukraine... and this subject is annoying when everyone talks about it
[22:16:39] <asmer> this too described in my status
[22:18:59] *** milesbaustin@gmail.com is Away
[22:51:17] *** milesbaustin@gmail.com is Online
[22:53:06] <milesbaustin@gmail.com> Я понимаю
[22:54:32] <asmer> :). I'm understand this well :))
[22:54:41] <milesbaustin@gmail.com> :)
...ненужная хуита скипнута...
орал долго :)


Update от 10.02.10 02:38
Гугл транслейт нам сказал следующее в ответ на `В ПИЗДУ ВЫБОРЫ!!!! ПОШЕЛ ГОТОВИТЬ УЖИН!!!!`: Elections in the pussy!! Went to prepare dinner!!.
Так что я Майлзу доставило. Как и мне :-D.
уууужесть.... весча.... гаража....

7/02/10 22:55



6/02/10 18:37

Нашёл охуительный сервис для тестирования верстки в IE

Ну про browsershots.org я думаю все знают. А на это наткнулся на хабре - редкая хрень, которая работает СРАЗУ и безо всяких регистраций!
NetRenderer

3/02/10 04:53

89 год, что думали тогда о Винде

2/02/10 23:54

Юля, ты такая разная!!!

тыц

18/01/10 01:31

УГ

ТО, КАК НЕ НАДО ДЕЛАТЬ FLASH АНИМАЦИЮ

ну это же пиздец. тёма фалломорфирует. гномики блять.

12/01/10 16:43

Dancing Kitty

31/12/09 11:58

Таки въехали

Мы с Юрцем въехали, всё ок :)

10/12/09 22:34

Бывает очень смешно

... когда два человека, к которым я очень тепло отношусь копипастят общение друг с другом из аськи мне одновременно :-D котячка и огуречное - вам привет! :-P

7/12/09 12:54

ssl и иже с ним

Сейчас раздупляюсь с openssl. долго мудрил с компиляцией и gcc, в итоге для компиляции надо всего лишь:
gcc  ssl_client.c  -lssl  -o ssl_client
и никакие конструкции в духе:
asmer@iridium ~/progging/c/ssl $ gcc  ssl_client.c -L/usr/lib -L/lib/ /usr/lib/libssl.a /usr/lib/libcrypto.a   -o ssl_client 
/usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
(.text+0x2e4): undefined reference to `dlsym'
/usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
(.text+0x394): undefined reference to `dlerror'
/usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var':
(.text+0x404): undefined reference to `dlsym'
/usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var':
(.text+0x4b4): undefined reference to `dlerror'
/usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload':
(.text+0x50d): undefined reference to `dlclose'
/usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
(.text+0x5c2): undefined reference to `dlopen'
/usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
(.text+0x62d): undefined reference to `dlclose'
/usr/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
(.text+0x65a): undefined reference to `dlerror'
collect2: выполнение ld завершилось с кодом возврата 1
нафиг не надо :)

26/11/09 14:42

Задачка по физике

"На экзамене по химии в Университете Торонто был поставлен следующий вопрос: является ли Ад экзотермической системой (выделяющей тепло), или эндотермической системой (поглощающей тепло)? Студенты должны были ответить, исходя из своих верований об Аде, и используя закон Бойля: газ охлаждается, расширяясь, и нагревается, сжимаясь.

Единственный студент, получивший пятерку написал следующее:

Во–первых, мы должны выяснить, как меняется масса Ада с течением времени. Поэтому мы должны узнать, с какой интенсивностью Ад наполняется душами, и с какой интенсивностью они его покидают. Мы должны учитывать, что однажды попав в Ад, душа уже никогда его не покинет. Для того, чтобы понять, сколько душ попадает в Ад, давайте изучим, как к этому относятся различные религии. Большинство из них утверждают, что если вы придерживаетесь иного вероисповедания вы обязательно попадете в Ад. Так как религий больше, чем одна, и так как люди обычно придерживаются только одной религии, мы можем утверждать, что все души попадают в Ад. При сохранении существующих уровней рождения и смертности, можно утверждать, что количество душ в Аду увеличивается экспоненциально. Теперь рассмотрим темпы роста объема Ада, так как при сохранении постоянной температуры и давления, объем Ада должен увеличиваться пропорционально количеству попавших в него душ.

Существуют две возможности:

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

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

Если мы примем за аксиому утверждение, которое выразила в отношении меня Тереза, когда я был на первом курсе, что "Прежде Ад должен замерзнуть, чем я пересплю с тобой", а также принимая во внимание тот факт, что я спал с ней прошлой ночью, наиболее верным представляется вариант #2. Следовательно, Ад уже замерз и является эндотермической системой. Так как Ад уже замерз, он не может принимать души дальше, следовательно, Ад прекратил свою деятельность… Рай остался единственным подтверждением существования Высших Сил, что объясняет, почему прошлой ночью Тереза все время кричала "О Боже, о Боже!".

26/11/09 01:11

Еще один отжиг

24/11/09 01:51

Агитка

24/11/09 01:46

Старая хня, но я думаю многие не видели

тыц

18/11/09 22:04

Грипп и майкрософт. Читать всем

Про грипп: смотреть почитать.
Про M$: читать

9/11/09 17:04

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

5/11/09 16:17

Звезда для Хью Лори на аллее Славы в Голливуде

Заходим, голосуем

25/10/09 03:42

Ржачные фотожабы на Яценюка

Спасибо Барбариану

24/10/09 18:44

Заряд позитива с утра

[10:31:26] <Ирка-Данька> я с ней поговорила
[10:31:34] <Ирка-Данька> нно я реально именно охуела
[10:31:44]  ВАУ!!!!!
[10:31:47]  ИРААА!!!!!
[10:31:55]  КАК ТЫ МОЖЕШЬ МАТОМ РУГАТЬСЯ!!!!
[10:31:56] <Ирка-Данька> да, со мной такое бывает
[10:31:57]  НЕУЖЕЛИ!!!!
[10:32:00]  Я АЖ ПРОСНУЛСЯ
[10:32:01] <Ирка-Данька> у Дани спроси
[10:32:08] <Ирка-Данька> и что он мне после этого устраивает

19/10/09 10:32

Че Бурашка! Ня!

17/10/09 13:18

Нелегко арабской женщине

15/10/09 23:19

Правильный чувак

14/10/09 03:45

Поездка в деревню

На последних выходных мы с Котячкой катали к Нюрцу и Дроенковичу в село :). Это было тут: Село Веселое, улица Зеленая. Природа, молоко, поля, баня, шашлык, лес... Отдых что надо. Чуть позже выложу фотки :)

13/10/09 15:10

Первые фотки с ДР


IMG_7141.jpg

IMG_7142.jpg

IMG_7143.jpg

IMG_7144.jpg

IMG_7145.jpg

IMG_7146.jpg

IMG_7147.jpg

IMG_7148.jpg

IMG_7149.jpg

IMG_7150.jpg

IMG_7151.jpg

IMG_7152.jpg

IMG_7153.jpg

IMG_7154.jpg

IMG_7155.jpg

IMG_7156.jpg

IMG_7157.jpg

IMG_7158.jpg

IMG_7159.jpg

IMG_7160.jpg

IMG_7161.jpg

IMG_7162.jpg

IMG_7163.jpg

IMG_7164.jpg

IMG_7165.jpg

IMG_7166.jpg

IMG_7167.jpg

IMG_7168.jpg

IMG_7169.jpg

IMG_7170.jpg

IMG_7171.jpg

IMG_7172.jpg

IMG_7173.jpg

IMG_7174.jpg

IMG_7175.jpg

IMG_7176.jpg

IMG_7177.jpg

2/10/09 19:49

Очень доставляющая подборка демотиваторов. Задумайтесь

тыц

30/09/09 01:04

Парсинг сайтов

Ниже идет проба пера в области html DOM. Очень удобная штука (в сочетании с регэкспами) для обдиралова (скрейпинга) разнообразных сайтов и блоков. Попытка сделать нечто подобное без использования DOM-парсера привела к велосипедостроительству (оное закомментировано).
Сырцы simple html DOM на сурсфорже.

29/09/09 23:40

party.php

Код:
#!/usr/bin/php
<?php
/*    function findTagPair($html, $tag)
    {
        $start = strpos($html, "<$tag");
        $startStr = substr($html,$start+strlen("<$tag"));
        $end = 0;
        $counter = 1;
        do {
            $inner = strpos($startStr,$tag);
            if ($startStr[$inner-1] == '/' && $startStr[$inner-2] == '<'){
                $counter--;
            }
            if ($startStr[$inner-1] == '<'){
                $counter++;
            }
            $startStr = substr($startStr, $inner + strlen("$tag>"));
            $end += $inner + strlen("$tag>");
            //echo '<pre>';print_r( array($start, $inner, $end) );echo '</pre>';
        } while($counter > 0);
        return substr($html, $start, $end + strlen("$tag>"));
    }

    function zavListLineParser($div)
    {
        echo $div;
    }

    function divWalker($div)
    {
        $pos = 0;
        while (strpos(substr($div,4),'div') !== false){
            divWalker(findTagPair(substr($div,4), 'div'));
        }
        if (strpos($div, 'zavlistline') < strpos($div, '>')){
            zavListLineParser($div);
        }
    }


    $filename = '1.htm';
    $html = file_get_contents($filename);

    //echo findTagPair($html, 'div');

    divWalker($html);
*/

require_once ( dirname(__FILE__) . '/simplehtmldom/simple_html_dom.php');

$html = file_get_html("5.htm");

$prev = '';
foreach ( $html->find('div') as $value){
    if ($value->class == 'plli&& ($prev->class == 'zavlistline1|| $prev->class == 'zavlistline0')){
        foreach ($prev->children as $child){
            if ($child->class = 'plli'){
                //echo $child->innertext."\n";
                $title = array_pop($child->find('a'));
                if ($title->innertext != ''){
                    echo "Title: ".$title->innertext."\n";
                }
                $links = $child->find("div");
                foreach ($links as $link){
                    if (count($link->find('a')) == 0){
                        $linkText = $link->innertext;
                        $linkText = str_replace("&nbsp;","", $linkText);
                        $linkText = str_replace("»","", $linkText);
                        $linkText = preg_replace('/[a-zA-Z&]/', "", $linkText);
                        if (preg_match("/[а-яА-Я]/",$linkText) != 0){
                            echo "Link (probably address): ".$linkText."\n";
                        }
                        else {
                            echo "Link (probably phone): ".$linkText."\n";
                        }
                    }
                }
            }
        }
    }
    $prev = $value;
}

source code colored by ViM

29/09/09 23:18

3d движок с фракталом моего детства :)

Ниже идет файл с моим ассемблерным 3d-движком времён 2000 года. На стенках рисуется фрактал Мандельброта. Код к сожалению утерян :(. Для запуска используйте dosbox. Для лентяев. Да и для того, что бы выковырять этот код пришлось использовать интернет-машину времени для ныне дохлого сайта assembler.ru.

27/09/09 15:10

3d.rar

Скачать

27/09/09 15:03

Ющенко

25/09/09 17:23

Хаус, шестой сезон

ХАУС ВЫШЕЛ :).
Уже скачал, но пока смотреть не буду. Меня за это пилят :-D.
Так что звонить мне не надо :)

PS: особое спасибо Wolf & Vugluskr за отмаячивание.

24/09/09 23:21

Новый код блога

Ниже следует весь код блога :).
Теперь для того, что бы вывалить исходник в блог надо просто его скопировать в правильную папку, и он автоматически появится в блоге подсвеченный согласно подсветке ViM.

24/09/09 23:17

style.css

Код:
body {
    background: black;
    color: green;
    /*font-family: Tahoma, Arial, Verdana;*/
    font-family: Tahoma;
    font-size: 14px;
}

a {
    color: lightgreen;
    text-decoration: underline;
    font-weight: bold;
}

pre {
    font-family: monospace;
    font-size: 12px;
    color: lightgreen;
    border: 1px dashed;
    padding: 10px;
}

.codeDiv {
    color: lightgreen;
    border: 1px dashed;
    padding: 10px;
    margin-top: 10px;
    margin-bottom: 10px;
    font-family: monospace;
    font-size: 12px;
    overflow: auto;
    height: 300px;
    font-weight: lighter;
}
source code colored by ViM

24/09/09 23:13

playlist.php

Код:
<?php
header('Content-Type: text/xml');
header('Last-Modified: '.date('r'));
header('Pragma: no-cache');
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
 <trackList>
<?php
    $subpath = 'blog';
    $stamp = $_GET['stamp'];
    chdir($subpath);
    $files = glob($stamp."_*mp3");
    foreach ( $files as $file){
        ?>
            <track>
        <?php
        $splittedFileName = pathinfo($file);
        $subject = substr($splittedFileName['basename'],11,-strlen($splittedFileName['extension'])-1);
        echo "<creator>asmer blog</creator>";
        echo "<title>$subject</title>";
        echo "<location>$subpath/$file</location>";
        ?>
            </track>
        <?php
    }
?>
</trackList>
</playlist>
source code colored by ViM

24/09/09 23:12

index.php

Код:
<?php
    include "header.php";
    $subpath = 'blog';
    $path = getcwd();
    chdir($subpath);
    $files = glob("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_*");
    rsort($files);
    $mp3Stamps = array();
    foreach ($files as $file){
        $stamp = substr($file,0,strpos($file,'_'));
        $splittedFileName = pathinfo($file);
        $subject = substr($splittedFileName['basename'],11,-strlen($splittedFileName['extension'])-1);
        echo "<a name='$stamp'></a>";
        if ($splittedFileName['extension'] == 'txt'){
            echo "<b>$subject</b><br/><br/>";
            echo '<pre>';
            readfile($file);
            echo '</pre>';
        }
        elseif ($splittedFileName['extension'] == 'html&& file_exists(substr($splittedFileName['basename'],0,-strlen($splittedFileName['extension'])-1))){
            continue;
        }
        elseif ($splittedFileName['extension'] == 'html'){
            echo "<b>$subject</b><br/><br/>";
            readfile($file);
        }
        elseif (array_search(strtolower($splittedFileName['extension']),array("png","jpg","gif","bmp","jpeg","tif","tiff")) !== false){
            echo "<b>$subject</b><br/><br/>";
            echo "<img src='{$subpath}/{$file}'>";
        }
        elseif (array_search(strtolower($splittedFileName['extension']),array("c","cpp","h","php","htm","css","py","ry","sql","xml")) !== false){
            echo "<b>{$subject}.{$splittedFileName['extension']}</b><br/><br/>";
            ?>
            <b>Код:</b><br/>
            <?php
            if (!file_exists($file.'.html') || (filemtime($file) > filemtime($file.'.html'))){
                echo 'colorifying sources... This can take a while<br/>';
                system("vim -c ':set nonu' -c ':TOhtml' -c ':wqa!' $file >/dev/null");
            }
            $sourceHtml = file_get_contents($file.'.html');
            $sourceHtml = substr($sourceHtml,strpos($sourceHtml, '<font'),strpos($sourceHtml,'</body>') - strpos($sourceHtml, '<font'));
            ?>
            <div class='codeDiv'>
            <?php echo  $sourceHtml; ?>
            </div>
            <i>source code colored by ViM</i>
            <?php
        }
        elseif ($splittedFileName['extension'] != 'mp3') {
            echo "<b>{$subject}.{$splittedFileName['extension']}</b><br/>";
            echo "<a href='{$subpath}/{$file}'>Скачать</a>";
        }
        if ($splittedFileName['extension'] == 'mp3|| count(glob($stamp."_*mp3")) != 0){
            if (array_search($stamp,$mp3Stamps) !== false){
                continue;
            }
            ?><br/><br/>
            <object data="musicplayer.swf?autostart=false&playlist=playlist.php?stamp=<?php echo $stamp; ?>" type="application/x-shockwave-flash" width="300" height="200">
                <param name="movie" value="musicplayer.swf?autostart=false&playlist=playlist.php?stamp=<?php echo $stamp; ?>">
            </object> 
            <?php
            $mp3Stamps[] = $stamp;
        }
        echo "<p align='right'><i><a href='#$stamp' title='ссылка на ПСТО'>".date("j/m/y H:i",mktime(substr($stamp,6,2),substr($stamp,8,2),0,substr($stamp,2,2),substr($stamp,4,2),substr($stamp,0,2)))."</a></i></p>";
        echo "<hr>";
    }
    chdir($path);
    include "footer.php";
source code colored by ViM

24/09/09 23:11

header.php

Код:
<html>
    <head>
        <title>asmer's blog</title>
        <meta charset='utf-8'>
        <link rel=stylesheet href="style.css" TYPE="text/css">
    </head>
    <body>
        <p align='right'>
            <a href='http://www.vim.org' style='border: 0px;'><img src='http://www.vim.org/images/vim_ex_line.png' style='border: 0px;'></a>
        </p>

source code colored by ViM

24/09/09 23:10

footer.php

Код:
        <center>
            <a href='http://www.vim.org'><img src='http://www.vim.org/images/vim.vialle.love.anim.gif'></a>
        </center>
    </body>
</html>
source code colored by ViM

24/09/09 23:09

Раскраска кода в блоге

Собственно добавил в блог поддержку колоризации кода. Работает просто, дешево и сердито, как и всё в этом блоге. Для раскраски используется ViM, из-за чего колоризация может тупить. Однако так же используется прозрачный механизм кэширования, что сводит тупняки на нет :). Предыдущее сообщение - и есть тест колоризации.

24/09/09 23:07

index.php

Код:
<?php
    include "header.php";
    $subpath = 'blog';
    $path = getcwd();
    chdir($subpath);
    $files = glob("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_*");
    rsort($files);
    $mp3Stamps = array();
    foreach ($files as $file){
        $stamp = substr($file,0,strpos($file,'_'));
        $splittedFileName = pathinfo($file);
        $subject = substr($splittedFileName['basename'],11,-strlen($splittedFileName['extension'])-1);
        echo "<a name='$stamp'></a>";
        if ($splittedFileName['extension'] == 'txt'){
            echo "<b>$subject</b><br/><br/>";
            echo '<pre>';
            readfile($file);
            echo '</pre>';
        }
        elseif ($splittedFileName['extension'] == 'html'){
            echo "<b>$subject</b><br/><br/>";
            readfile($file);
        }
        elseif (array_search(strtolower($splittedFileName['extension']),array("png","jpg","gif","bmp","jpeg","tif","tiff")) !== false){
            echo "<b>$subject</b><br/><br/>";
            echo "<img src='{$subpath}/{$file}'>";
        }
        elseif (array_search(strtolower($splittedFileName['extension']),array("c","cpp","h","php","htm","css","py","ry","sql","xml")) !== false){
            echo "<b>$subject</b><br/><br/>";
            echo "<b>Код:</b><br/>";
        }
        elseif ($splittedFileName['extension'] != 'mp3') {
            echo "<b>{$subject}.{$splittedFileName['extension']}</b><br/>";
            echo "<a href='{$subpath}/{$file}'>Скачать</a>";
        }
        if ($splittedFileName['extension'] == 'mp3|| count(glob($stamp."_*mp3")) != 0){
            if (array_search($stamp,$mp3Stamps) !== false){
                continue;
            }
            ?><br/><br/>
            <object data="musicplayer.swf?autostart=false&playlist=playlist.php?stamp=<?php echo $stamp; ?>" type="application/x-shockwave-flash" width="300" height="200">
                <param name="movie" value="musicplayer.swf?autostart=false&playlist=playlist.php?stamp=<?php echo $stamp; ?>">
            </object> 
            <?php
            $mp3Stamps[] = $stamp;
        }
        echo "<p align='right'><i><a href='#$stamp' title='ссылка на ПСТО'>".date("j/m/y H:i",mktime(substr($stamp,6,2),substr($stamp,8,2),0,substr($stamp,2,2),substr($stamp,4,2),substr($stamp,0,2)))."</a></i></p>";
        echo "<hr>";
    }
    chdir($path);
    include "footer.php";
source code colored by ViM

24/09/09 20:05

Место на корневом разделе и opt

Классически ставить на раздел `/` больше гига у меня лично не принято. Но, однако, бывают и подъебосы. Пример - urban-terror и прочее проприетарное поделие, которое ставится в /opt. Или java.
Однако unixway спасает нас и в этой, неприятной ситуации. Можно перенести /opt в места попросторнее (у меня, например, в /var):
asmer@iridium ~ $ df -h
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/sda5             981M  190M  742M  21% /
udev                   10M  204K  9,9M   2% /dev
/dev/sda6              14G   13G  867M  94% /usr
/dev/sda7             9,2G  6,5G  2,3G  74% /var
/dev/sda8             120G  108G  6,8G  95% /home
Как видно, на / у нас есть только 200 метров (до переноса opt было еще меньше и не хватало места для установки urban-terror), a на /var место имеется
Решаем проблему:
cp -pvrf /opt /var/         # копируем /opt на другой раздел /var с сохранением всех прав доступа и принадлежности файлов (флаг -p)
rm -rf /opt/*               # удаляем всё из /opt - освобождаем место на /
mount /var/opt /opt -o bind # монтируем /var/opt в /opt
Теперь осталось сие упузырить в автомонтирование при загрузке(sudo vim /etc/fstab):
/var/opt                /opt          auto            defaults,bind     0 0

24/09/09 19:11

Иголки finished

зафигачил 300 шт :).

24/09/09 18:44

Иголки

сабж творю (200 шт.) Полчаса не задрачивать.

24/09/09 17:47



24/09/09 13:58

Wall-e

Посмотрел Wall-E. Оценил. Всем советую. Pixar - жжот. Единственное что людей как-то недостаточно кайфово прорисовали. Остальное очень даже выглядит (роботы, ландшафты)

22/09/09 17:33

Обьявление

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

22/09/09 05:38

Частичное обретение блогом дизайна

Решил подсветить дизайн в попсовом стиле черно-зеленых терминалов 60х годов. Прибил css, хидер, футер (с иконкой вима). Покрутил шрифты.

22/09/09 05:05

Обновленный код

 1 <?php
 2     //include "header.php";
 3     $subpath = 'blog';
 4     $path = getcwd();
 5     chdir($subpath);
 6     $files = glob("[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_*");
 7     rsort($files);
 8     $mp3Stamps = array();
 9     foreach ($files as $file){
10         $stamp = substr($file,0,strpos($file,'_'));
11         $splittedFileName = pathinfo($file);
12         $subject = substr($splittedFileName['basename'],11,-strlen($splittedFileName['extension'])-1);
13         echo "<a name='$stamp'>";
14         if ($splittedFileName['extension'] == 'txt'){
15             echo "<b>$subject</b><br/><br/>";
16             echo '<pre>';
17             readfile($file);
18             echo '</pre>';
19         }
20         elseif ($splittedFileName['extension'] == 'html'){
21             echo "<b>$subject</b><br/><br/>";
22             readfile($file);
23         }
24         elseif (array_search(strtolower($splittedFileName['extension']),array("png","jpg","gif","bmp","jpeg","tif","tiff")) !== false){
25             echo "<b>$subject</b><br/><br/>";
26             echo "<img src='{$subpath}/{$file}'>";
27         }
28         elseif ($splittedFileName['extension'] != 'mp3') {
29             echo "<b>{$subject}.{$splittedFileName['extension']}</b><br/>";
30             echo "<a href='{$subpath}/{$file}'>Скачать</a>";
31         }
32         if ($splittedFileName['extension'] == 'mp3|| count(glob($stamp."_*mp3")) != 0){
33             if (array_search($stamp,$mp3Stamps) !== false){
34                 continue;
35             }
36             ?><br/><br/>
37             <object data="musicplayer.swf?autostart=false&playlist=playlist.php?stamp=<?php echo $stamp; ?>" type="application/x-shockwave-flash" width="300" height="200">
38                 <param name="movie" value="musicplayer.swf?autostart=false&playlist=playlist.php?stamp=<?php echo $stamp; ?>">
39             </object> 
40             <?php
41             $mp3Stamps[] = $stamp;
42         }
43         $mp3s = glob($stamp."_*mp3");
44         if (count($mp3s) > 0){
45
46         }
47         echo "<p align='right'><i><a href='#$stamp' title='ссылка на ПСТО'>".date("j/m/y H:i",mktime(substr($stamp,6,2),substr($stamp,8,2),0,substr($stamp,2,2),substr($stamp,4,2),substr($stamp,0,2)))."</a></i></p>";
48         echo "<hr>";
49     }
50     //echo '<pre>';print_r( $fileArr );echo '</pre>';
51     chdir($path);
52     //include "footer.php";




 1 <?php
 2 header('Content-Type: text/xml');
 3 header('Last-Modified: '.date('r'));
 4 header('Pragma: no-cache');
 5 echo '<?xml version="1.0" encoding="UTF-8"?>';
 6 ?>
 7 <playlist version="1" xmlns="http://xspf.org/ns/0/">
 8  <trackList>
 9 <?php
10     $subpath = 'blog';
11     $stamp = $_GET['stamp'];
12     chdir($subpath);
13     $files = glob($stamp."_*mp3");
14     foreach ( $files as $file){
15         ?>
16             <track>
17         <?php
18         $splittedFileName = pathinfo($file);
19         $subject = substr($splittedFileName['basename'],11,-strlen($splittedFileName['extension'])-1);
20         echo "<creator>asmer blog</creator>";
21         echo "<title>$subject</title>";
22         echo "<location>$subpath/$file</location>";
23         ?>
24             </track>
25         <?php
26     }
27 ?>
28 </trackList>
29 </playlist>

21/09/09 21:03

Плеер и IE

Дошла инфа что не фурыкает плеер в IE... Долго гуглил и матюкался, в итоге выяснилось, что просто забыл одну кавычку :(. Ща вроде всё работает :)

21/09/09 19:14

Апдейт блога и Роб Дуган

Я дописал в блог музыкальный функционал (откуда стырено). Правда вместо 39 строк теперь их в сумме 93, но ниже находится обещанный Роб Дуган.

21/09/09 04:56

Дни Рождения Друзей

Сегодня ДР Лежи. Собсно с 26-летием его :). Охренеть - растем, стареем :).
А неделю назад было ДР Димки Богуна...
И в обоих случаях мы все были удивительно трезвы. Пили, ели, отдыхали... но нифига от этого не менялись...
Сегодня выпили в 2.5 человека бутылку коньяка и съели полторы `пиццы`, выпили 2 литра сока. Трезвы. Юрец завтыкал после вчерашнего в urban terror, не спал нихрена, урулил по-раньше (около 3 ночи). Мы допили бутылку вдвоем.
Скоро и мое :)

21/09/09 04:31

Роб Дуган. Музыка.

С удовольствием слушаю Rob Dougan - Furious Angels (как всегда, по кругу подряд днями). Музня очень осенняя. И голос у солиста (самого Дугана?) очень подходит.

Для тех, кто в танке - Дуган автор Clubbed To Death (Kurayamino Version) - неубиваемой темы из первой матрицы и блейда 3.

20/09/09 04:14

ШОЗАНАХ?

- ЧТО ЭТО ВСЁ ТАКОЕ?!
- Это - Восток, о диамант моей души
©Лесь Подервьянский
Так что это всё такое? - Это аццкая хуйня, которая вызвана вечным стремлением Ваныча выебнуться. Я не хочу ставить wordpress. Я не хочу наворотов. Я не вижу смысла во вбивании нужного и не нужного в вебинтерфейсы. Мне нахуй не нужно хранить это всё в mysql. У меня есть VIM (почти всегда). У меня есть доступ к серваку (всегда, когда есть VIM и инет). Если что - я придумаю, как эту хрень редактировать с мобилы, причем малой кровью. Поэтому код сего поделия весит 39 строк с 3 строками комментариев, и мне им удобно пользоваться. Эта хрень уже сейчас позволяет выложить файлы, картинки, html и текст. Она была написана за час с отладкой на коленке. Думаю будут еще тэги, и, возможно, комменты. А так же еще куча всякого - и у меня получится ВОРДПРЕСС!!!! :-D.

Бывает микроблоггинг, бывает макроблоггинг, а это просто высерблоггинг. Всем чмоки в этом чятике.

20/09/09 04:05

Глюки dcopserver и kdeinit

Странные глюки с dcopserver и kdeinit (нихуя не пахало из-за того, что не работал dcopserver, а именно kmix, amarok, kbluetooth) были обусловлены переполнением / раздела...

Мораль - следите за местом на разделах... OS крайне редко пишет об этой проблеме - обычно просто странно глючит.

20/09/09 03:50

В нашем полку прибыло!

Сегодня у меня был install-day. Ну т. е. я поперся к небезывестному Юрцу и мы (в составе меня, Лежи и оной жертвы Open Source) в течении часов 8 постепенно поднимали ему систему (kubuntu 9.04). Кубунта была скачены с торрентов, захуйкана на болванину, после чего доблестно установлена. Потом мы накатили 4.3 кеды. Ну т. е. мы подумали что мы их накатили. На самом деле мы не более чем попортили родные 4.2. В тоже время 4.3 не встали, что вызвало тонну приколов типа поломатых кедов, в которых можно из шелла запустить браузер для гугления, который тут же собой сверху закрывает шелл. Альт-Таб, альт-ф4 нихуя не пашет, слава Я-цам работает выход за иксы (ктрл-альт-ф2 и так далее). После установки ключей apt резко начал доверять источнику 4.3 кедов и они таки были водружены на место. Для этого пришлось переписывать заклинания для apt-key на листик и потом оттуда писать в текстовой консоли.
Без проблем установили дрова для nvidia. После чего перестал тупит фуллскрин в ютубе.
Как всегда была ебля с mp3 тэгами (йобана cp1251). Почему-то непофиксилась easytag, ну да хуй с ней. Кто-нибудь знает, как выпилить из amarok2 апплеты? Нахуй они в середине окна?
Накрутили всевозможные эффекты, цацкались и лялькались с ними. Да вот незадача - нихуя не работает fullscreen в видеоплеерах с ними (mplayer кстати шелловый наиболее успешен в этом смысле). В итоге решили что смотреть фильмы важнее понтов, и выкрутили понты нафиг.
Оценил работу NTFS в linux. Майкрософт удалось заразить с помощью этой Fucking System тормозами и глюками даже святую © FOSS систему. Однако в итоге у Юрки ваще не осталось NTFS - все, шо надо перенесли на православную ext3.
Ну и посмотрели на игрухи в линах. /me думает посмотреть (и порубить) в warsow и urbant error. :).

А самое интересное - новообращенный получил удовольствия от вступления в секту. :-D.

20/09/09 03:28

Код моего супер блога, сделанного за часок

 1 <?php
 2     //include "header.php";
 3     $subpath = 'blog';
 4     $path = getcwd();
 5     chdir($subpath);
 6     $files = glob("[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]_*");
 7     $fileArr = array();
 8     foreach ($files as $file){
 9         $fileArr[substr($file,0,strpos($file,'_'))] = $file;
10     }
11     krsort($fileArr);
12     foreach ($fileArr as $stamp => $file){
13         $splittedFileName = pathinfo($file);
14         $subject = substr($splittedFileName['basename'],11,-strlen($splittedFileName['extension'])-1);
15         echo "<a name='$stamp'>";
16         if ($splittedFileName['extension'] == 'txt'){
17             echo "<b>$subject</b><br/>";
18             echo '<pre>';
19             readfile($file);
20             echo '</pre>';
21         }
22         elseif ($splittedFileName['extension'] == 'html'){
23             echo "<b>$subject</b><br/>";
24             readfile($file);
25         }
26         elseif (array_search(strtolower($splittedFileName['extension']),array("png","jpg","gif","bmp","jpeg","tif","tiff")) !== false){
27             echo "<b>$subject</b><br/>";
28             echo "<img src='{$subpath}/{$file}'>";
29         }
30         else {
31             echo "<b>{$subject}.{$splittedFileName['extension']}</b><br/>";
32             echo "<a href='{$subpath}/{$file}'>Скачать</a>";
33         }
34         echo "<p align='right'><i>".date("j/m/y H:i",mktime(substr($stamp,6,2),substr($stamp,8,2),0,substr($stamp,2,2),substr($stamp,4,2),substr($stamp,0,2)))."</i></p>";
35         echo "<hr>";
36     }
37     //echo '<pre>';print_r( $fileArr );echo '</pre>';
38     //include "footer.php";

20/09/09 03:17

Первый мой урок по VIM, не совсем удачный, но показывает скорость, с которой VIM позволяет работать

20/09/09 02:56

uniconvertor-1.1.4.tar.gz

Скачать

20/09/09 02:53

Аватарка из Ленор (сражение с неведомой хуйней из унитаза :-D)

20/09/09 02:37

Это уже HTML пост в блог :)

и это тоже можно

20/09/09 02:32

1

Это первый пост в мой блог

20/09/09 02:28