Привидения функций

понедельник, 28 февраля 2011 г.

Зачем в языке программирование отказались от thread.stop() ? А только потому что Java разработчики бояться функций приведений :) Которые застряли между стеком, кучей и виртуальной машиной и будут выполняться ВЕЧНО.

п.с. Кто не знает в чем дело: в системе классов thread есть метод stop который должен остановить поток во время его выполнения. Но данная команда далеко не редко небезопасна поэтому была заменена на метод interrupt который посылает ните сигнал для завершения который можно отловить проверяя нить с помощью метода isInterrupted

Эх проекты , проекты ...

среда, 16 февраля 2011 г.

Ubuntu & частота CPU

четверг, 28 октября 2010 г.

Здесь все коротко и просто:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
я получил:
2500000 2000000
Чтобы задать частоту все ещё проще:
cpufreq-selector -f 2500000
Результат сразу был виден в conky.(Частота была равна 2.0ГГц а стала 2.5ГГц)
Только не забываем для фиксации результата добавить вышеупомянутую строку в rc.local или в автозагрузку GNOME - кому как удобнее.

Gnome. Консервативно. Гламурно. Удобно!

вторник, 12 октября 2010 г.

Для тех что не часто посещает gnome-look.org могу посоветовать тему в связке с иконками для Gnome. Ставиться такое чудо очень просто:
sudo add-apt-repository ppa:tiheum/equinox
sudo apt-get update
sudo apt-get install gtk2-engines-equinox equinox-theme equinox-ubuntu-theme faenza-icon-theme

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



Тема очень удачная. Использую её как на домашней машине так и на нетбуке. Красиво, а главное - очень удобно ! А если ещё немного подпилить получим нечто подобное:
Emerald: sin_n_emelrald.
Conky: за основу взят конфигурация conky_colors и допилена вручную вплоть до скриптов.
Docky: glass_neu
обои: уже не вспомнить откуда :)
шрифт окружения: Lucida Grande
шрифт консоли: Glass TTY VT220
в добавок установлен nautilus-elementary (довольно удобно).
И наконец могу посоветовать забавный Скрипт-игрушка, только пожалейте блог :) (подробнее здесь)

Skype и стандартные всплывающие сообщения в Ubuntu


Пишу чтобы не забыть, а в дальнейшем использовать, надеюсь кому-нибудь тоже будет полезно. Озадачился заменить скайповские попапы на стандартные убунтовские нотификации, уж больно глаз режут. Есть задача, есть желание её решить. Как оказалось решение достаточно несложное. И так, решение.

На ноуте Ubuntu 9.10, репозиторий и сам Skype взят из Ubuntu Tweak. Создание самих нотайсов оказалось делом несложным, вот пример команды:

notify-send "Hello world!"

чтобы появилось notify-send следует установить libnotify-bin:

sudo aptitude install libnotify-bin

В Skype есть настройка уведомлений. Выбираем событие, например «Сообщение получено». Нажимаем кнопку «Больше настроек», отключаем чекбокс «Отображать всплывающее уведомление», а в строке «Запускать следующий скрипт» пишем:

notify-send "%sname: %smessage" -i skype

переменные %sname и %smessage будут заменены в уведомлении на имя контакта и сообщение соответственно. Дополнительны параметр -i skypeуказывает системе установить иконку приложения в окне нотификации, в данном случае иконку Skype.
«Запрос на передачу файла» можно оформить аналогичным способом:

notify-send "%sname передаёт файл %fname (%fsize)" -i skype

По сути всё просто и понятно, следует отредактировать нужные события и настроить параметры notify-send.

Ниже приведён список доступных переменных в строке для событий.

Глобальные параметры:
%type — тип события
%sskype — Skype имя контакта (где это применимо)
%sname — отображаемое имя контакта (где это применимо)

Сообщения в чате:
%smessage — собственно текст сообщения

Передача файла:
%fpath — путь к файлу
%fname — имя файла
%fsize — размер файла (в байтах)
%fprogress — статус загрузки (в байтах)
%fspeed — скорость загрузки (байт в секунду)

UPD: Более симпотично разделить нотайс на заголовок (выводится жирным шрифтом) и сообщение:

notify-send "%sname" "%smessage" -i skype

Ubuntu VS Microsoft ergonomic 4000 keyboard

Проблема такова - триггер "zoom", который расположен в центре клавиатуры из коробки не работает. В ходе раскопок оказалось что стандартный обработчик клавиш не поддерживает коды кнопок которые больше 255, и как показала практика именно коды триггера были больше чем 255:
zoom+   :   0x1a2
zoom-   :   0x1a3

В данном случае нам поможет утилита rawkeybinder написана Романом Исаевым (Roman V. Isaev (roman@isaev.ru) ) за что ему большое спасибо !
Итак приступим.
Для начала скачаем архив:
wget http://www.isaev.ru/rawkeybind/rawkeybind-0.1.tgz
распакуем его
tar -xvf rawkeybind-0.1.tgz
далее соберем у установим его:
cd rawkeybind-0.1/
установив недостающую библиотеку
sudo aptitude install libxtst-dev libxtst6
и выполним установку
./configure && make && sudo make install
далее отредактируем файл настроек
sudo gedit /etc/rawkeybind.conf
куда добавим 2 строки:
0x1a3:0xff54:Microsoft Natural 4000 key down

0x1a2:0xff52:Microsoft Natural 4000 key up
Первое число - код клавиши, второе число - код эмулируемой кнопки ( в нашем случае это клавиша вверх и вниз можно поставить и другие из /usr/include/X11/keysymdef.h )
Теперь осталось добавить утилиту на автозагрузку вместе с "иксами"
echo /usr/local/bin/rawkeybind -f >> ~/.xsessionrc
и перезагрузим XServer:
sudo /etc/init.d/gdm restart
Теперь триггер работает так как мы того хотели. (В windows переназначить функции триггера к сожалению нельзя).
Profit!

Ubuntu 10.04 x64 и LBP2900


Простой , а самое главное рабочий вариант установки:
Поставить:
sudo apt-get install ia32-libs #(только для 64 bit систем)
Скачать:
wget http://dl.dropbox.com/u/931697/raducotescu-CanonCAPTdriver-release-2.1-0-geb1e844.tar.gz
Распаковать первый и запустить:
sudo ./canonLBP_install.sh LBP2900
После перезагрузки установить принтер LBP2900 по умолчанию а LBP2900-2 отключить но НЕ УДАЛЯТЬ (иначе система повторно установит его).
Всё должно работать без дополнительных изменений.
Остановок работы сервиса печать после нехватки бумаги в лотке не наблюдал.
Если всёже такое случалось, то всегда можно использовать ранее заготовленный скрипт:

#!/bin/bash
sudo /etc/init.d/ccpd restart
sudo /etc/init.d/cups restart
exit 0

Magnet ссылки в Linux


Magnet-ссылки бывают разные, но я на практике использую только 2 типа: для торрентов и для DC++.
То есть xdg-open должен передавать ссылки начинающиеся на “magnet:?xt=urn:tree” в DC++-клиент (в моем случае EiskaltDC++), а ссылки начинающиеся на “magnet:?xt=urn:btih” в торрент-клиенте, которым у меня выступает Ktorrent.
Для этого нужно немного подредактировать наш файл xdg-open.

Спрашиваем у системы где он (использовать терминал):
whereis xdg-open


У меня ответ такой:
xdg-open: /usr/bin/xdg-open


Подредактируем его немного:
sudo kate /usr/bin/xdg-open

У меня система с рабочим окружением KDE, потому я использую Kate. Вы можете использовать любой другой текстовый редактор.
Находим в конце файла строки:
case “$DE” in

и дальше, в зависимости от вашего рабочего окружения редактируем соответствующий блок. Т.к. у меня КДЕ я заменяю блок 
kde)
open_kde "$url"
;;

на блок:
kde)
    if (echo $url | grep '^magnet:?xt=urn:tree') then
        eiskaltdcpp "$url"
    elif (echo $url | grep '^magnet:?xt=urn:btih') then
        ktorrent "$url"
    else 
    open_kde "$url"
    fi
    ;;

Если у вас Gnome заменяем блок 
gnome)
open_gnome "$url"
;;

На наш блок:
gnome)
    if (echo $url | grep '^magnet:?xt=urn:tree') then
        eiskaltdcpp "$url"
    elif (echo $url | grep '^magnet:?xt=urn:btih') then
        ktorrent "$url"
    else 
    open_gnome "$url"
    fi
;;


Немного расшифровки:
если у нас DC-magnet - открывать в eiskaltdcpp (вы можете вписать любую другую DC-программу),
а для torrent-magnet открывать ktorrent (вы можете прописать deluge или любой другой торрент-клиент)

Ubuntu aspire one - контроль "шума"

Все владельцы ноутбуков серии aspire one 100-150 знают каким шумным он бывает, особенно в "жаркие" будни. Так вот разработчики Ubuntu давно решили эту проблему до нас, но только забыли "включить" контроль над кулером. Но негромко "намекнули" на решение проблемы в документации дистрибутива. Решение очень просто:

echo -n “enabled” > sys/class/thermal/thermal_zone0/mode
Но есть небольшое но! Мы имеем непонятные права на запись в файл mode и команда не даст ожидаемого результата (хотя всё может быть :) ). Решение очень тривиально - открыть файл любым текстовым редактором с правами супер пользователя и попробовать вписать в файл единственную строку “enabled”. Как только у вас получиться вписать строку в файл вы сразу услышите ... тишину :)
Теперь охлаждение будет включаться при нагреве свыше 60 градусов по Цельсию, а выключиться - когда температура будет ниже 50. Настройки можно попробовать поменять. Файлы конфигурации лежат в той же папке.

Visual SVN

понедельник, 9 ноября 2009 г.



Насколько сложно разобрать процесс работы программы имея практически все исходники программы? Под исходниками я имею ввиду не обфуцирование .net dllки с красиво, профессионально написанным кодом(естественно без комментариев), которые я без проблем открыл в .net reflectorе. Я с весь вечер убил чтобы разобраться с процессом лицензирования программы. С первого взгляда видно namespace VisualSVN.Core.Licensing. Но, как оказалось все это не так важно как скромная функция


public class Protector : IProtector
{
// Fields
private bool cachedIsRegistered;
private License cachedLicense;
private IDecoder decoder;
private bool licenseIsCached;
private ILicenseStorer privateStorer;
private ILicenseStorer publicStorer;
private RegistrationChangedEventHandler RegistrationChanged;

// Events
public event RegistrationChangedEventHandler RegistrationChanged;

// Methods
public Protector(ILicenseStorer privateStorer, ILicenseStorer publicStorer, IDecoder decoder);
private void CacheLicense(License license);
private void EnsureLicenseCached();
public License GetCurrentLicense();
public bool IsRegistered();
public bool IsValidKey(string key);
private License LoadLicense();
public License ParseKey(string key);
public bool RegisterKey(string key);
}


и вот она заветная

public bool IsRegistered()
{
this.EnsureLicenseCached();
return this.cachedIsRegistered;
}

изменив ее на банальное все работает норм, незачет создаиелям

public bool IsRegistered()
{
return true;
}
in msil
.method public hidebysig newslot virtual final instance bool IsRegistered() cil managed
{
.maxstack 8
L_0000: ldc.i4.1
L_0001: ret
}

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

 
Поверед бай: Dev crowd :)