Home

Advertisement

Customize

November 2009

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     

Syndicate

RSS Atom
Powered by LiveJournal.com

Previous 20

Nov. 23rd, 2009

Gnome. Индикатор раскладки.

Что-то надоело мне созерцать нечитабельную надпись на панели "Рус" "США"... ну не читабельно, постоянно прихдится глазами искать. Как-то давненько рисовал флажки, но они как-то не вписываются в общую тему Humanity последней убунты. Вооружившись Inkscape'ом быстренько нарисовал свои.



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


Ну и разумеется делиться надо... брать здесь

Tags:

Nov. 20th, 2009

Визуализация процесса разработки.

Есть такой замечательный проект Gource. Благодаря ему можно вот таким очень красивым способом показать процесс "варения" вашего проекта на основе данных Git, SVN, CSV. Разумеется, первым делом я "скормил" ему свой проект и вот что получилось...

Tags:

Nov. 15th, 2009

Google Wave. Preview.

Только что обнаружил у себя в ящике письмо от гугла:
 
Thank you for signing up to give us early feedback on Google Wave. We're happy to give you access to Google Wave and are enlisting your help to improve the product.

Ну что ж, пришло время потестить :) кста...


 
 
Tags: ,

Nov. 14th, 2009

Пятый Элемент! (для моего медиацентра) - HP Compaq 311c.

Можно было начать этот пост со словами "УРАААААААААААААА!", но не буду :) есть одна ложка дегтя. Итак, попорядку...

Притомило меня ждать появления lenovo s12 на базе иона, а уже несколько раз глаз спотыкался о сабжевую железку. Вчера, сидя вечером у монитора ноутбука, пролистывая привычные новостные сайты в очередной раз забрел на обсуждение выбора нетбука и в очередной раз судьба меня навела на эту модельку. Посидев, поковыряв в носу поразмыслив, решился заказать. Бегло пробежав по прайс.ру нашел одну контору, которая доставляет товар и по субботам тоже. Жму "заказ" - с доставкой получилось 15950. Вполне себе ничего. Ну ладно, на этом закончу предысторию.

Нетбук приехал даже до обеда, что весьма порадовало... ведь был целый день на занятие сексом облюбование этой железки. В поставке шла винда ХП-Хоум (боже, я уже 4 винды купил в своей жизни!). Не буду расписывать какие напутственные слова я произнес ей и в каком направлении ей нужно было идти, скажу просто - снес под самый корень.

Известно, что у нетбуков нет CD-привода, посему установка убунты происходила с USB драйва. Расписывать эту процедуру скучно (уже да, скучно, ибо процесс сводится к "далее-далее-финиш"). Ребут. Вспомнив недавние соревнования "у кого длиннее" "кто быстрее запускается" ради любопытсва глянул на часы - холодный старт от появления надписи GRUB до появления приглашения ввода логина/пароля занял 31 секунду. Не понмю, кто в тех соревнованиях победил, но меня эта цифра вполне порадовала.

Далее опять все скучно... все заработало из коробки - звук, видео, вайвай, сеть, синезуб*, Fn-баттоны, веб-камера, саспенд... что там еще...hdmi воркс перфект (подключил к телику напрямую). Секс начался Самое интересное началось когда мне потребовалось вклинить оную железяку в мой мегамедиацентр - это TV(hdmi)-(hdmi)Reciever Yamaha V663-(аккустика) Yamaha 777. Ну там еще IPTV приставка с боку болтается, тоже по hdmi подключена к ресиверу.

Поскольку ресивер ямахи это не просто усилок для колонок, это самый настоящий мегакомбайн (хотя бы посмотрите его заднюю панель), а на пульте от него кнопок чуть больше 60ти и к этому еще нужно добавить 3 режима почти для половины из них, то первым делом я полез доставать мануал от него. Разобрался, подключил. Вот тут начались мои тяжкие муки. Ноут на автодетекте видел все тот же телик, но почему-то с разрешением FullHD. Ну в реале мой телевизор скромнее по возможностям (HD-ready), посему рессивер транслировал все те же 1080 но в интерлейсе. Как я ни крутил и вертел настройки... ни в какую. Более того, звук через ресивер совсем не игрался. Смотрел статус аудио потока на канале - пусто. Потратив где-то полтора-два часа на разные попытки "договориться" с ресивером ни к чему не привели. Тут я вспоминаю, что не так давно вышла новая версия дров для нвидии - 190ая. Ее в репозитарии убунты нет, засим пошел в ланчпадовский PPA, где лежат готовые пакеты последних версий дров. Скачалось, установилось...ребут...в мыслях барабанная дробь[...] хрен, не завелось. Еще разок предпринял попытки поиграться с настройками, но также, безуспешно. Вот собственно это и была ложка дегтя. Сейчас пока, наверное, сделаю прямое подключение к телевизору, а звук выведу через обычный аналог на ресивер. Ведь в мечах было заюзать сию железяку как универсальный плеер - торренты, музыка (MPD, а рулить с ноута на столе Sonata'ой).

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

Да! Одно из главных не сказал :). Ion с Атомом играет FullHD без каких либо признаков задержек. Супер! обратил внимание на CPU - не скажу что он в основном на 800Мгц, но можно сказать так, что в основном на этой частоте и подскакивает до 1.6Ггц, но не наоборот. Кто-то говорил, что атомы тормозные очень и вообще, недожелезяка. Несоглашусь! Очень хороший тандем с ионом! Ни на секунду не пожалел о покупке этой модели нетбука! Так что если кто все-еще томится в выборе, настоятельно рекомендую посмотреть эту модель!

PS: хех... только сейчас обратил внимание, что он у меня без питания уже почти 5 часов :) и это после моих насилований над ним ;), а статус батареи написан - 33.8%. 6ти-целовая батарея весьма недурно держит напругу!

*UPD: в состоянии эйфории показалось, что оно заработало из коробки, нонннет, на нетбуке комбо железка WiFi+Bluetooth. Вайвай работает, а синезуб даже в списке (lspci, lsusb не видно). Хотя вот одна строчка весьма подозрительна:

fantom@mini:~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 5986:0182 Acer, Inc
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

есть подозрение, что это именно синезуб, ведь подобные комбодрайвы как раз-таки и делают таким образом, что один юзает USB, заведенный на разъем PCI, второй - непосредственно PCI шину.

---- Эти строчки уже пишу сильно позже... нашлась таблетка на синезуб - http://forum.ubuntu.ru/index.php?topic=74433.0. Еще когда ставил дрова для вайвая я выбирал из двух вариантов. Выбрал STA. Как оказалось у этой версии синезуб неработает. Нужно выбрать второй, что через ndiswrapper работает


*UPD2: и вот, после пары дней еще одну неудобность встретил - тачпад.



Беда в том, что справа у него "скрол-область" и невольно задеваешь ее ладонью при наборе текста. Да, с точки зрения дизайна оно красиво, но для набора текста не очень удобно, то и дело задеваешь "скролл-область". Да в убунте есть "флажок" для отключения скрола в момент печати, но и здесь встретилась забавная вещь :)... вкладка с оной настройкой отсутствует. Странно, ведь на моем ноуте (Lenovo R61) она присутствует:



слева - настройка мыши на Mini 311c, справа - на Lenovo R61. нашел настройку этого параметра в gconf

/desktop/gnome/peripherals/touchpad/disable_while_typing

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

Nov. 9th, 2009

Убунта 9.10. Феньки :)

Не устоял я перед соблазном "апнуться" до свежей убунты :). Думал сначала выпущу релиз, потом буду систему перетряхивать :). Но, покуда релиз откладывается, сил сдержаться уже не было. Установил. Очень, очень, очень понравился релиз. Как-то вылизан лучше, наверное. Ну это субъективное ощущение. Также очень понравились однотонные иконки трея (сеть, синезуб, вайвай, регулятор громкости). Очень гармоничный однотонный цвет. Емпати (IM клиент) по началу показался даже юзабельным, но ненадолго. До пиджина конечно ему еще далековато, так что вернулся достаточно быстро обратно на пиджин. Также порадовал сервис Ubuntu One - а-ля флешка в инете, только сынтегрирована в окружение десктопа.
Кстати, меня раньше вообще не привлекало дефолтное оформление убунты, но в этот раз все наоборот, мне совсем не хочется его менять на что-либо.  Даже больше... поскольку я пользуюсь MPD+Sonata, а сонатовская иконка в трее выделялась там аляповатым пятном, решил нарисовать свою. 



взять можно здесь, там же есть SVG-исходник, если кому нужно, можете переделать под свой вкус.

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

Nov. 8th, 2009

Релиз GSQL 0.2.2 задерживается.

Я обещал выпустить релиз в конце октября. Увы, не удается по сей день сдержать обещание :(. На работе аврал еще тот, времени и сил попросту не остается. В выходные даже голову нагружать ни чем не хочется. Собственно можно бы было сделать релиз, но я решил, что в него обязательно должен войти плагин Tunel, который у меня до сих пор недописан. Пока ничего не буду обещать. Все-таки надеюсь, что хотя бы до конца ноября планы по релизу воплотятся в жизнь. 

Tags:

Oct. 26th, 2009

Как же оно все-таки переводится?

Где ни спрашивал, никто не может ответить точно, как же это переводится :). Народ, можете помочь?



на сей момент уже 3 трактовки набрал:
 
1) но смысл вроде "бесконечное спокойствие"
2) что там что-то связано с самочувствием
3) сложно разобрать)) но это здравица какая то , чэнюй скорее всего, чтот типа долгой радости без каких то неприятных неожданностей

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

UPD: вот еще один вариант предоставили... "хорошее настроение без границ (без ограничения)".

 

Oct. 19th, 2009

Многопоточность. Баги. Ненависть.

Злополучный баг номер 30. Ловил его в два подхода. Вчера часок и сегодня ажно целых два. Засада в том, что при многопоточности немаловажный фактор (а порой ключевой) это время. При двух/трех/и_тд потоках, работающих параллельно и пользующихся каким-то общим набором данных, всегда есть конкуренция. В таких местах нужно ставить локи. Но у меня соображался в тот момент не дошла то мысли, что проблемный блок будет являться конкурентным. В итоге имел сегфолты в разных местах. GDB в таких случаях не помощник. Ну да ладно. Багу выловил, вылечил. Время ехать дальше... скоро релиз, а у меня еще плагин Tunnel не допилен. Мой бразилский камрад тоже весьма плотно пилит свой кусок, прям не нарадуюсь глядя на его коммиты :). Сегодня в разговоре он заикнулся, что хочет реализовать поддержку gnome-keyring. Разумеется, это не будет в предстоящем релизе, но в 0.3.0 ждите ;).

PS: будет еще один, промежуточный релиз - 0.2.5, но об этом позже.
Tags:

Oct. 5th, 2009

ЛОР... нет, не врач :)

 На, весьма популярном, ресурсе linux.org.ru я уже почти 5 лет посещаю под ником halter. Тут мне ударила моча пришла мысля в мою голову посмотреть инфу по нику halturin. Был приятно удивлен лицезреть себя же самого под этим никнеймом :) Как оказалось, на ЛОРе я зарегистрированный пользователь не с 2005 года, а с 2003го :). Даже умудрился вспомнить пароль от этой учетки :). Разумеется захотелось пользоваться ником, однозначно отражающим мою фамилию :). Обратился к админам ресурса за помощью, поскольку хотелось, чтобы вся хистори ника halter сохранилась бы под ником halturin. Собственно владелец ресурса Maxcom отозвался на мою просьбу и переименовал, за что ему большое мегаспасибо!

Попутно с историей смены никнейма обнаружился (по-крайней мере для меня лично) функционал использования gravatar в случае, если аватар не выставлен, но при этом указан емейл. Очень удобно :).

Sep. 18th, 2009

Это даже больше чем гуглмапс в отдельно взятом месте.


— 16.09.09 15:28 —
Туристы сняли трехмерную карту
Тысячи фотографий пользователей интернета являются отличной основой для создания трехмерных карт. Новый алгоритм соответствующего процесса анализа и обработки фотографий был успешно реализован учеными Вашингтонского университета.

http://www.gazeta.ru/science/2009/09/16_a_3261317.shtml

Sep. 17th, 2009

Новый плагин - Tunnel.

Еще с момента первого релиза проекта GSQL мне с некоторой периодичностью приходили просьбы сделать возможность SSH туннелинга для возможности подключения к базам, которые размещаются на удаленных серверах и доступ к ним имеется лишь в виде SSH.
Поиск нужной библиотеки привел меня на два варианта - libssh и libssh2. Помедитировав над Почитав документацию к API обеих библиотек выбор пал на первый вариант. Субъективно, этот проект мне показался комфортней для моих задач. Но в обоих вариантах был громандный минус... нет нормальной документации. Описание API есть, но этого же не достаточно. Нужно понимание "большой картинки". У libssh во всяком случае имеется несколько примеров использования. На первый взгляд показалось все просто, а "оказалось, что казалось".
От этой библиотеки мне нужен один единственный функционал - форвардинг порта. А именно, проброс удаленного порта на мою машину. Сделал следующий набросок:

static gboolean
do_open_channel (gchar *username, gchar *password, gchar *remote,
guint remote_port, guint local_port)
{
    SSH_SESSION *ssh = ssh_new();
    SSH_OPTIONS *opts = ssh_options_new();
    CHANNEL *ch = NULL;
 
    
    ssh_options_set_port (opts, 22);
    ssh_options_set_host (opts, remote);
    ssh_set_options (ssh, opts);
 
 
    if (ssh_connect(ssh) != SSH_OK)
    {
        g_warning ("Error at connection :%s\n",ssh_get_error (ssh));
        return FALSE;
    }
 
 
    ssh_is_server_known(ssh);
 

    if (ssh_userauth_autopubkey(ssh) != SSH_AUTH_SUCCESS)
    {
        g_warning ("Authenticating with pubkey: %s\n",ssh_get_error(ssh));
 
        if (ssh_userauth_password (ssh, username, password) != SSH_AUTH_SUCCESS)
        {
            g_warning ("Authentication with password failed: %s\n",ssh_get_error (ssh));
            return FALSE;
        }
    }
 
 
 
    ch = channel_new (ssh);
 
 

    if (channel_open_forward (ch, remote, remote_port, "127.0.0.1", local_port) != SSH_OK)
    {
        g_warning ("Error when opening forward:%s\n", ssh_get_error (ssh));
        return FALSE;
    }
 
 
    g_debug ("Chanel is forwarded");
 
 
    return TRUE;
}
 
Подготовили SSH-сессию. Присоединились и авторизовались. Создали канал. Пробросили порт. Все хорошо. Скомрилировалось, собралось, запускаю... в конце выдало "Chanel is forwarded". С криками УРА Запускаю терминал, чтобы посмотреть факт проброса. Захожу на удаленную машину, вижу TCP соединение на remote_port установлено. Далее иду смотреть на локальную... прослушки на localhoste не наблюдаю. Еще раз пошел перечитвать доки, API, гуглить... никаких резалтов не дало. Решил таки обратиться к первоисточнику этой либы. На IRC канале тусовалось человек 8-10, но все были в хроническом анабиозе, ни один из них не удосужился даже "привет" родить. Остался последний вариант - обратиться в список рассылки. Здесь публика оказалась более чем адекватна. Ответ не замедлил себя ждать. Сам автор (Aris Adamantiadis) отписал мне следующее...

Hello Taras,

I am sorry the documentation let you think it would be so easy... In fact channel_open_forward only does half the work, this is connecting to a remote host:port from the ssh server and stream it into a channel. However the port binding and the select loop (to verify if data is arriving and dispatching it) is unfortunately up to you.

Looking at the select_loop in sample.c would be a good start-up for you, even if we should consider writing a working example in the examples directory. The functionnality you expected may be available in the 0.5 release.

Andreas, Maybe we should make clear into the documentation about what I just stated above. I also only see online documentation for the 0.4.0 branch when the stable branch is still 0.3.x. Could you have a look ?
Regards,

Aris
 
A выделил ключевые моменты жирным. Что ж. Жаль, что такой функционал  не доступен сейчас, но утешает тот факт, что он таки появится, хотя и со статусом возможно. Anyway, как говорится, библиотека делает свое дело, а на мои плечи лишь ложится незначительная толика разработки - прослушка, "запись в" и "чтение из" SSH-канала.

PS: да, просьба Ариса к Андреасу практически через час-два уже трансформировалась в ряд "причесываний" раздела документации. Шустрые там ребята и адекватные :).

Tags:

Sep. 3rd, 2009

GSQL. Поддержка PostgreSQL.

 Не так давно в рассылке проекта волонтер из бразилии, Estêvão Samuel Procópio, сообщил, что разрабатывает engine (бекенд) PostgreSQL для проекта. Не скрою своей радости :). Мне было чертовски приятно видеть у людей интерес к GSQL, да и уже много раз мне задавали вопрос, когда появится поддержка этой СУБД. Чуть позже мы с ним пообщались отдельно от рассылки. Договорились, что в предстоящем релизе 0.2.2 его engine будет включен в релиз со статусом "экспериментальная поддержка PostgreSQL". Собственно, я тут уже писал, что "багфикс"-релиз состоится ближе к концу октября. 

Вобщем, ждите новостей ;).
Tags:

Sep. 2nd, 2009

Снять хитрый дамп трафика? Легко!

Давече потребовалось снять дамп трафика, но с рядом условий. Это должны быть пакеты UDP и порт 1813. Это порт RADIUS'a. 1813 - это аккаунтинговые пакеты (авторизационные приходят на 1812). Самый простой способ - tcpdump.

# tcpdump 'udp port 1813'
 
Ок. Но дальше больше. Мне необходимо снимать аккаунтинговый пакет только определенного типа, коих есть несколько - Start, Alive (Interim-Update), Stop. Собственно мне потребовалось снять именно Alive-пакеты, поскольку было подозрение, что они не доходят до меня. Да, забыл уточнить, это должны быть не просто Alive-пакеты, а Alive- пакеты от originate сессии (тот кто знает о чем речь, тот поймет, здесь собственно излагаю суть подхода). Единственная тулза, которая пришла мне в голову, это ethereal, сейчас она известна под новым именем - wireshark. Замечательна она еще тем, что умеет работать в консоли, что мне и требуется, ибо на удаленном серваке нет X-сервера и нет xlibs на случай если пользоваться X-forwarding'ом. В Debian этот пакет носит название tshark (консольная версия wireshark). Осталось лишь правильно ее запустить. Итак, нам нужны только UDP пакеты пришедшие на порт 1813
 
# tshark 'udp port 1813'
 
как видим, параметры вызова один-в-один с параметрами tcpdump'a. Но прелести идут дальше. Эта "акула" умеет заглядывать внутрь IP-пакета и распознавать его "потроха". Для этого нам нужно описать фильтр отображения (да, это тоже фильтр, но не для ловли, а только для отображения). Собственно вот таким макаром это делается:
 
# tshark 'udp port 1813' -R 'radius.Acct_Status_Type == 3 and radius.h323_call_origin == "h323-call-origin=originate"'
 
Заметьте, поле h323-call-origin. Это одна особенность h323-авапар. Они не просто Attribute-Value-Pair (Пара Атрибут-Значение) обычно называемые AVPair, в значении также имеется и имя аттрибута. Кстати в настройках freeradius'a есть такой параметр with_cisco_vsa_hack, если он выставлен в значение true, то в логах радиуса вы найдете уже приведенный в "нормальный" вид этот AVPair, а именно h323-call-origin=originate, в противном случае - будете иметь полное содержимое этой авапары.

Удобно, не правда ли?
 

Aug. 31st, 2009

Кем я хочу стать когда я буду большим

Только что "кинули" ссылку на вот это... :)))))) я просто лёг!!! :)))))

Сочинение 7-летнего Тараса по теме «Кем я хочу стать когда я буду большим»

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

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

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

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

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

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

Надеюсь, что у меня нет аллергии на офисную пыль, потому что на нашу собаку у меня аллергия. Eсли у меня будет аллергия на офисную пыль, программиста из меня не получится и придется искать настоящую работу.

(с)пёрто здесь


Aug. 27th, 2009

Glib. GHashTable. Некоторые особенности, которые нужно знать.

Хотя вообще-то не совсем особенности, просто на тот момент по всей видимости усталость разровняла остатки извилин в моей голове. Собственно, о чем это я... Для начала приведу код:
 
static GHashTable *hash_details = NULL;
 
GtkListStore *
details_get (gchar *key)
{
GtkListStore *detail = NULL;
 
if (hash_details == NULL)
hash_details = g_hash_table_new (g_str_hash, g_str_equal);
 

detail = (GtkListStore *) g_hash_table_lookup (hash_details,key);
 

if (detail != NULL)
{
printf ("hash   found (%s)%d\n", key, g_str_hash (key));
return detail;
} else
{
printf ("insert hash (%s)%d\n", key, g_str_hash (key));
};
detail = gtk_list_store_new(3,
G_TYPE_STRING, // stock id
G_TYPE_STRING, // name/attribute
G_TYPE_STRING); // comment/value
g_object_ref (G_OBJECT (detail));

g_hash_table_insert (hash_details, key, detail);
 
return detail;
};

собственно, по-порядку... есть хеш-таблица (как видно из кода статическая, ну это не суть). Когда эта ф-я вызывается первый раз, она создает таблицу посредством g_hash_table_new. В эту функцию параметром передается адрес на строковую переменную, которая в последствии будет выступать ключом в этой таблице. На первый взгляд все вроде бы ничего, код правильно выглядит. Но есть одно "но". При вставке в хеш-таблицу, само значение ключа не вставляется, только адрес на переменную. Таким образом, если вызвать эту функцию в цикле вида:


gchar tmp_key[128];
gint i;
for (i=0; i < 5; i++)
{
g_snprintf (tmp_key, 128, "my_own_key_%d", i);
details_get (key);
};

то мы наступим на грабли, вроде тех, что наступил я. Вот как выглядят мои грабли:

insert hash (0x81afb88ANONYMOUS9ANONYMOUS)-1760927547
insert hash (0x81afb88DBSNMP9DBSNMP)-1941766787
hash  found (0x81afb88DIP9DIP)-238168319
hash  found (0x81afb88EXFSYS9EXFSYS)-2019942467
insert hash (0x81afb88OUTLN9OUTLN)-286256565
insert hash (0x81afb88SYS9SYS)650336901
insert hash (0x81afb88SYSTEM9SYSTEM)833930781
insert hash (0x81afb88WMSYS9WMSYS)-1360972071
hash  found (0x81afb88XDB9XDB)175980119
hash  found (0x81afb88ZEUS9ZEUS)140161757

замечу, что согласно логике приложения, здесь должны быть только insert'ы, а в реале я уже на 3-ем "ходу" получил вхождение в хеш-таблицу. Все верно, ибо я пытался вставить "новый" ключ, но адрес этой переменной был прежний. Чтобы решить эту проблему, нужно всего-то лишь, навсего реаллоцировать значение ключа при вставке:

g_hash_table_insert (hash_details, g_strdup (key), detail);

Стоп, стоп, стоп... Да, я знаю, утечка... но давайте попорядку. Итак, как видим, сейчас мы удовлетворили требование "уникальности" указателя на ключ при вставке. Но. Получили другие грабли - мы реаллоцируем key и нигде не остается адреса этого куска памяти, чтобы потом можно было вызвать g_free для ее освобождения. Для контроля такого события разработчикам предоставлена функция

g_hash_table_new_full (GHashFunc hash_func,
GEqualFunc key_equal_func,
GDestroyNotify key_destroy_func,
GDestroyNotify value_destroy_func);

как видим, здесь нам дают возможность указать обработчики при удалении элемента из таблицы, в которых мы сможем явным образом вызвать g_free для нашей строки (ключа), а также и для ассоциированного с этим ключом значения.
 
Итак, подытожим - если у вас контролируются участки памяти, которые вы используете для ключей, помимо этого, адреса на эти участки памяти являются уникальными в своем роде, то можно воспользоваться ф-ей g_hash_table_new, еже ли приведенный "проблемный" пример описывает похожим образом вашу ситуацию, то вам потребуется создавать таблицу с указанием обработчиков (g_hash_table_new_full).

Aug. 26th, 2009

GSQL. Углубляясь в тему новшеств.

Вообще-то, что я пишу здесь, в какой-то мере является черновиком для будущего мануала. Ну не то что бы черновиком... заметками. Так что, думаю, в будущем, эти наброски мы сможем наблюдать в официальном мануале разработчика GSQL :).

В предыдущий раз я описал крупным планом функционал хранения SQL запросов в XML-файле, с возможностью версионности как для самих запросов, так и для объектов. В этом посте я немножно углублюсь в представление самого объекта этого дерева.

Итак... Каждый элемент дерева объектов есть сущность с набором свойств. Если взять текущий вариант класса GSQLNavTree, то можно лицезреть там следующие элементы:
  • id - уникальный идентификатор объекта. формируется при парсинге XML-файла (уникальность обеспечивается средствами GQuark).
  • version - принадлежность к версии (по умолчанию "*", т.е. для всех версий)
  • stockname - имя иконки, для отображения в дереве объектов
  • name - собственно, само имя объекта
  • queries - хэш-таблица (GHashTable) с запросами. этот пункт я разверну чуть ниже более подробно
  • child_id - идентификатор дочерних объектов, в случае если заполнение ветки идет по результату выполнения SQL-запроса.
  • childs - список (GList) дочерних статических объектов. Здесь требуется уточнение. Также, немножко позже опишу подробнее.
Рассмотрим элемент объекта queries. Это hash-таблица. Для чего оно нужно? Взглянем на картинку ниже:

Альбом: lj (нажми для увеличения)

Поскольку в разных БД, от версии к версии, запросы на получение тех или иных данных меняются порой диагонально, то необходимо учесть этот вариант. Для этих целей я решил использовать хеш-таблицу. Корреляция вида "Version"-"QuerySet". Каждая структура QuerySet содержит сам SQL-запрос, а также набор параметров (binds типа GList) для этого запоса. Как известно, передать параметры можно двумя способами (разумеется, в зависимости от СУБД) - по порядковому номеру и по имени переменной. Например:

select * from table where field1 = :a and field2 > :b
или
select * from table where fiels1 = :1 and field2 > :2

Благодаря тому, что я использую для хранения переменных (binds) список (GList) структур (QueryBindValue), то становится возможным применить сей вариант хранения к обоим вариантам задания параметров. Во-первых, список (GList) является упорядоченым, что позволяет использовать механизм "биндования" по порядковому номеру. Во-вторых, по имени, поскольку я храню имя переменной.
Как это выглядит применительно к моим реалиям (на картине не рабочий SQL-запрос. просто для наглядности):

Альбом: lj (нажмите для увеличения)

Если вы обратили внимание, то увидели в значениях bind-переменных есть макро-имена [itemname] и [parentitemname]. Это необходимо для автоматической подстановки значения в запрос.

Теперь, как и общещал, рассмотрим элемент childs класса GSQLNavTree. Чтобы упростить объеснения приложу еще одну картинку:

Альбом: lj (нажмите для увеличения)

Ну... по порядку... Если объекту Tables (глубина дерева, например, N) указан SQL-запрос, то дочерние объекты (ACCESS_OPERATORS, ACCOUNTS глубина N+1) будут иметь child_id (ORACLE_TABLE). Далее... если при этом еще спосок childs также указан, то всем дочерним элементам (ACCESS_OPERATORS, ACCOUNTS, созданным в результате выполнения SQL-запроса, автоматически присвоится статический список объектов (Columns, Indexes, Triggers, Constraints. глубина N+2). Если же SQL не задан, то, применимо к этому примеру, при "разворачивании" ветки Tables мы получили бы сразу список объектов Columns, Indexes, Triggers, Constraints.

На этом думаю можно завершить погружение в суть хранения и представления объектов GSQLNavTree. Надеюсь объеснил доходчиво :).

Aug. 25th, 2009

Нетбук. Ожидание.

Еще месяц-два назад пускал слюну жаждал появления на прилавках Lenovo S12 (Atom+Ion), периодически поглядывая в инет-магазинах его появления. В начале августа вендоры даже объявили о начале продаж, но и по сей день их не видно даже для предзаказа.

Сегодня узнал о новом девайсе от Nokia - Booklet 3G. Подробный анонс будет 2 сентября на Nokia World. Выглядит внушающе...

Альбом: lj

 
Характеристики Nokia Booklet 3G:
  • 10,1-дюймовый глянцевый HD-дисплей
  • Процессор Intel Atom Z530 с тактовой частотой 1,6 ГГц
  • Жесткий диск объемом 120 Гб
  • Беспроводные модули 3G/HSDPA, Wi-Fi и Bluetooth
  • Поддержка A-GPS
  • Слот для карт памяти SD
  • Web-камера
  • Стереодинамики
  • Разъемы - HDMI, 3xUSB, аудио
  • Толщина - 20 мм
  • Вес - 1,25 кг
Теперь даже не знаю, что я хочу :). Томиться до появления нетбука от нокии или все-таки купить с12.

Tags:

Gnome. Clock. Настройка шрифта.

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

Итак, для начала посмотрим man для функции strftime, поскольку именно она используется для формирования строки отображения. Сей документ можно посмотреть на своей машине или же в инете (хотя бы здесь).
Далее нам потребуется параметры форматирования отображения, т.е. придания стиля. В гноме используется Pango для этих манипуляций. Почитать можно тут.

Теперь можно приступать:
 
  1. правим значение ключа /apps/panel/applets/clock_screen0/prefs/custom_format. например, выставим значение %H:%M (вспоминаем параметры strftime)
  2. правим значение ключа /apps/panel/applets/clock_screen0/prefs/format а именно, выставляем значение "custom", это заставит аплет часов смотреть именно в наш custom_format.
 
Собственно, все. Наслаждаемся. А вот, что получилось у меня:

<span foreground="#466480" rise="7800" style="font-family:Impact;">%a. %d %b</span><span foreground="#466480" font_desc="12.5" rise="1200" style="font-family:Impact;"> %H:%M</span>

Альбом: lj

Google AppEngine. Вход бесплатный. Выход - не заложен конструкцией.

Забавный факт обнаружился :). До селе он существовал в виде вопроса в горке моих опилок, а сегодня он нашел свою "половинку" в виде ответа и на выходе получился "факт" :).

Гугл предлагает всем весьма существенный набор WEB-инструментов, среди прочих они дают возможность размещать у них сайты (вобщем услуга хостинга). Работает сие на их движке, нареченным именем - AppEngine. Сказать честно, штука очень удобная, поддерживает Django-сайты. Пишешь себе сайт у себя на компе с использованием их KIT'ового набора, потом одной коммандой заливаешь на сайт. Все просто супер. Но засада начинается когда у вас сдох ноут/комп/винчестер, а бекап как-то не довелось сделать. Гугловцы почему-то посчитали ненужным необязательным дать возможность пользователю получить его исходники обратно. Как-то, ИМХО, не логично, не по фень шую, так сказать.

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

Смысл его прост - он создает tar.gz-архив в каталоге своего сайта и при следующем appcfg.py update этот файл автоматически "улетает" на сервер. Дешево и сердито :), но работоспособно. 

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

Aug. 24th, 2009

Жизненное...

/* не понмю где именно нарыл на просторах рунета, понравилось */

Папа и сын
Как-то раз один человек вернулся поздно домой с работы, как всегда усталый и задёрганный, и увидел, что в дверях его ждёт пятилетный сын.
 
- Папа, можно у тебя кое-что спросить?
- Конечно, что случилось?
- Пап, а сколько ты получаешь?
- Это не твоё дело! - возмутился отец. - И потом, зачем это тебе?
- Просто хочу знать. Пожалуйста, ну скажи, сколько ты получаешь в час?
- Ну, вообще-то, 500. А что?
- Пап- - сын посмотрел на него снизу вверх очень серьёзными глазами. -
Пап, тыможешь занять мне 300?
- Ты спрашивал только для того, чтобы я тебе дал денег на какую-нибудь дурацкую игрушку? - закричал тот. - Немедленно марш к себе в комнату и ложись спать!..Нельзя же быть таким эгоистом! Я работаю целый день, страшно устаю, а ты себя так глупо ведешь.
 
Малыш тихо ушёл к себе в комнату и закрыл за собой дверь. А его отец продолжалстоять в дверях и злиться на просьбы сына. Да как он смеет спрашивать меня о зарплате, чтобы потом попросить денег? Но спустя какое-то время он успокоился и начал рассуждать здраво: Может, ему действительно что-то очень важное нужно купить. Да чёрт с ними, с тремя сотнями, он ведь ещё вообще ни разу у меня не просил денег . Когда он вошёл вдетскую, его сын уже был в постели.
 
- Ты не спишь, сынок? - спросил он.
- Нет, папа. Просто лежу, - ответил мальчик.
- Я, кажется, слишком грубо тебе ответил, - сказал отец. - У меня был тяжелый день, и я просто сорвался. Прости меня. Вот, держи деньги, которые ты просил.
 
 
Мальчик сел в кровати и улыбнулся.
 
- Ой, папка, спасибо! - радостно воскликнул он.
 
Затем он залез под подушку и достал еще несколько смятых банкнот. Его отец,увидев, что у ребенка уже есть деньги, опять разозлился. А малыш сложил вседеньги вместе, и тщательно пересчитал купюры, и затем снова посмотрел на отца.
 
- Зачем ты просил денег, если они у тебя уже есть? - проворчал тот.
- Потому что у меня было недостаточно. Но теперь мне как раз хватит - ответил ребенок.
- Папа, здесь ровно пятьсот. Можно я куплю один час твого времени? Пожалуйста, приди завтра с работы пораньше, я хочу чтобы ты поужинал вместе снами.
 
Мораль
Морали нет. Просто хотелось напомнить, что наша жизнь слишком коротка, чтобы проводить её целиком на работе. Мы не должны позволять ей утекать сквозь пальцы, и не уделять хотя бы крохотную её толику тем, кто действительно нас любит, самым близким нашим людям. Если нас завтра не станет, наша компания очень быстро заменит нас кем-то другим. И только для семьи и друзей это будет действительно большая потеря, о которой они будут помнить всю свою жизнь. Подумай об этом, ведь мы уделяем работе гораздо больше времени, чем семье.
 
PS: 
В какой-то степени увидел себя здесь :(. Задело.


Previous 20

Advertisement

Customize