суббота, 21 июля 2012 г.

How to turn off Firefox newtab miniatures




I hate firefox newtabs, because anyone can see what kind of stuff i was watching before.

To turn off firefox newtab miniatures, type in your browser url: about:config , then in search type: newtab and change browser.newtabpage.enabled to false and browser.newtab.url to about:blank . Restart Firefox and profit! When you open new tab you will see blank tab. See Picture 1

Picture 1 - Firefox configuration



понедельник, 30 января 2012 г.

Qt4 static linking under msvc2010 and cmake project

I am developing production system with Qt4 static linking usage.
It was pain in the ass to provide static linking with application and to build sources under win32. And one of most "practical" solution was to write *.bat script, that will make me and my colleges happy, build project and required libs from console.

How to build qt4 library statically with you hands

  1. downloadfrom nokia ftp qt4 library
  2. unpack it somewher (path without spaces). For example, to c:\qt4
  3. cd into qt4 src dir
  4. run configure.exe --help and see what libs you need
    Your command will looks like:

    configure -platform win32-msvc2010 -static -release -opensource -no-declarative-debug -webkit
  5. build with command: nmake
  6. install: nmake install
  7. add to path variable path to qt4 bin directory: c:\qt4\src\qt-everywhere-opensource-src-4.8.0\bin; See this picture
  8. create qt4 variable. See this picture
Now you can use qmake with your qt4 projects and link statically with qt4 library.

Cmake project, compile from console with build script

But it is for a bit pain in the ass to remember such things. Also, when you use cmake, cmake generates solution file for msvc 2010 and you need to open msvc to compile qt4.

I wrote script, that automaticaly:
  1. download qt4 library from nokia ftp (downloading with win32 wget)
  2. compile it with webkit support
  3. get or update project my from svn
  4. configure with cmake
  5. compile with msvc
For properly build script work you need 7zip for unpacking qt4 library from archive.

You can download latest build script or fetch from svn: https://freeman.svn.sourceforge.net/svnroot/freeman/other/trunk/qt4-msvc-2010-static/


Usage for build script

Open Microsoft Developer console, cd to folder, where build script situated. Then run build.bat. After building of qt4 lib you will have build env to work with your project. Open build script and path to you project and modify it (see comments for my small rss project in build script)

If you have any ideas, write to me :-)

понедельник, 11 июля 2011 г.

php wsdl recache

This is small note to developers, that use wsdl on their application.

Sometimes you update wsdl, for example add new wsdl method, and put into php application. By default php will not reread wsdl file, only when wsdl cache timeout expired. To "clear wsdl cache" you can use this small dirty code, that will remove cached file:


<?php
$verbose = false;

if (defined('STDIN') || isset($_GET['verbose'])) {
    $verbose = true;
}

$cache_dir = ini_get('soap.wsdl_cache_dir');
$file_list = glob($cache_dir.'/wsdl*');

foreach ($file_list as $file_name) {
    if (is_writable($file_name)) {
        unlink ($file_name);

        if ($verbose === true) {
            print 'remove wsdl cached file '.$file_name.'\n';
        }
    } else {
        if ($verbose == true)
            print 'have no access to remove wsdl cache file '.$file_name.'\n';
    }
}


This small script will remove all wsdl cached files. After remove, php will reread your new wsdl file.

I use this file in my php application on update action

пятница, 3 июня 2011 г.

stickr.com - изменение дизайна

Вступленние

Очень часто пользуюсь stickr.com. Действительно класный ресурс. Сочетание микроблогинга и сборщика ссылок, фотографий и так далее. Нарвиться мне это ресурс еще и за кростпостинг - я пишу один раз в sticrk.com и сообщение копируеться в мой твиттер, facebook. Этакая вебвданутось. Вобщем крутая штука, советую.

Недавно stickr.com изменил свой дизайн, хотелось бы сделать пару замечаний, а именно что мне не поравилось в плане юзабилити. Конечно, это личное мнение и не претендует на "мнение експерта", но всё же ;-)
 
Основная проблемма дизайна - Слишком большой height для блоков. Все современные дисплеии - это широкоформатные! На всех дисплеях соотношение height/width в сторону width. Поэтому все twitter - ы и facebook - ки тяготеют в ширь, а не в высь.

Шапка

Шапка стала оочень большой.  И двойной. И ненужной.



  Я сразу узнал эту шапку из twitter. Вот как в twitter

Я считаю, что брать лучшее у флагманов - это хорошо. Но в случае с twitter - неудачное сочетание. В stickr есть вторая шапка, это старая шапка с надписью My Feed. Зачем еще её делать? Что бы под рукой всегда была шапка с myfeed/add/blablalba? Идея хороша, но мне кажеться излишняя. ИМХО. Как я вижу решение:


Или оставить верхний header и снести старый с My Feed.

Теперь перейдём к feed

Зачем такой огромное расстояние по высоте для 3 сообщений без коментариев? Ведь очень сложно постоянно скролиться.


Вот впринципе и всё. Все замечание - сугубо индивидуальные :-) На недобуке "коханоi" стикр читать неудобно :-(

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

суббота, 8 января 2011 г.

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

Oracle 10g release 2 on SLES 10

Oracle 10g on SLES10 have some problems. A lot of big problems. I will show small tricks, how to install oracle database on sles

Installation HOWTO

Go to Novell Sollution and install step by step

Fix permissions

Oracle installer do not property set permissions. Run from oracle user command:

$ chown oracle:dba -R ~/ora*

Web Manager Utility problem
 After  reboot of sles10 you can found intresting surprise - oracle database response, but you can't open any web oracle web utility like http://localhost:1158 . When you run: /etc/init.d/oracle you can see such error message


Can't find needed file: apachectl - Setting START_ORACLE_DB_APACHE = no

In oracle10g release no apache, all web controls goes throw oracle java application. To fix this "small" problem, remove such lines in file /etc/init.d/oracle

# echo -n " - Starting Apache..."
# if [ "${START_ORACLE_DB_APACHE:-no}" = "yes" ]; then
# SSL=""
# if [ ${ORACLE_APACHE_USE_SSL} = "yes" ]; then
# SSL="ssl"
# fi
# export DISPLAY=:42.0; $ORACLE_HOME/Apache/Apache/bin/apachectl start$SSL >& /dev/null
# if [ "$?" != "0" ]; then rc_failed; else rc_failed 0; fi
# rc_status -v -r
# else
# if [ ${START_ORACLE_DB_APACHE:-no} = "cannot" ]; then
# rc_status -s
# else
# rc_status -u
# fi
# fi

# rc_reset


reboot . After reboot, try to start manual web application utils. To start, run from oracle use such command:
$ $ORACLE_HOME/opmn/bin/ons -d
$ $ORACLE_HOME/bin/emctl start dbconsole


If you will get error like:

Em configuration issue: /opt/oracle/product/10.2/db_1/localhost.localdomain_orcl not found 

don't panic. Just create sym link to correct folder. Run:


$ ls /opt/oracle/product/10.2/db_1/


and find folder similar to localhost.localdomain_yourdbname . Then:
$ cd /opt/oracle/product/10.2/db_1/  
$ ln -s ./your_host_name.localdomain_yourdbname localhost.localdomain_orcl

and try to run  "$ emctl start dbconsole" command again. If you will get error like

OC4J configuration issue. /opt/oracle/product/10.2/db_1/oc4j/j2ee/OC4J_DBConsole/OC4J_DBConsole_localhost.localdomain_orcl

create sym link to correct folder.

$ cd /opt/oracle/product/10.2/db_1/oc4j/j2ee/OC4J_DBConsole/
$ ls -l


Then find folder like OC4J_DBConsole_localhost.localdomain_yourdbname
and create sym link:
ln -s OC4J_DBConsole_localhost.localdomain_yourdbname  OC4J_DBConsole_localhost.localdomain_orcl

 Try to start emctl. If all looks good and page http://localhost:1158/em works, you can add in into /etc/init.d/oracle after commented lines  call of emctl command. /etc/init.d/oracle will looks something like that:

.....

    rc_reset

#    echo -n "  - Starting Apache..."
#    if [ "${START_ORACLE_DB_APACHE:-no}" = "yes" ]; then
#       SSL=""
#       if [ ${ORACLE_DB_APACHE_USE_SSL} = "yes" ]; then
#         SSL="ssl"
#       fi
#       export DISPLAY=:42.0; $ORACLE_HOME/Apache/Apache/bin/apachectl start$SSL >& /dev/null
#       if [ "$?" != "0" ]; then rc_failed; else rc_failed 0; fi
#       rc_status -v -r
#    else
#       if [ ${START_ORACLE_DB_APACHE:-no} = "cannot" ]; then
#         rc_status -s
#       else
#         rc_status -u
#       fi
#    fi

#    rc_reset

sudo -u oracle $ORACLE_HOME/opmn/bin/ons -d
sudo -u oracle $ORACLE_HOME/bin/emctl start dbconsole


    echo -n "  - Starting Application Server..."

....

Good luck

среда, 13 октября 2010 г.

postgres внешние ключи

Маленькая заметка о дейтсвиях на foreign keys в Postgres, с картинками о поведении NO ACTION, RESTRICT, CASCADE, SET NULL, SET DEFAULT в постгрес. И так, по порядку:

Для тестов используються две таблици и два sequence для автоинкремента идентификаторов:

Таблица product:

CREATE SEQUENCE products_id_inc
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE products_id_inc OWNER TO postgres;


CREATE TABLE product
(
"name" text NOT NULL,
details text,
price real DEFAULT 0,
id oid NOT NULL DEFAULT nextval('products_id_inc'::regclass),
CONSTRAINT product_pkey PRIMARY KEY (id)
)
WITH (
OIDS=TRUE
);

Таблица product_buyer:


CREATE SEQUENCE products_buyer_id_inc
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

CREATE TABLE product_buyer
(
"name" text NOT NULL,
id oid NOT NULL DEFAULT nextval('products_buyer_id_inc'::regclass),
CONSTRAINT product_buyer_id PRIMARY KEY (id)
)
WITH (
OIDS=TRUE
);


У таблици product_buyer добавленно поле product_id для всязи с таблицей product


ALTER TABLE product_buyer ADD COLUMN product_id oid;
ALTER TABLE product_buyer ALTER COLUMN product_id SET STORAGE PLAIN;
ALTER TABLE product_buyer ALTER COLUMN product_id SET NOT NULL;
ALTER TABLE product_buyer ALTER COLUMN product_id SET DEFAULT 1

Более наглядно база для тестирования выглядит таким образом





Тестовая запись в таблице product

 


NO ACTION

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


ALTER TABLE product_buyer
  ADD CONSTRAINT product_buyer_product_id_fkey FOREIGN KEY (product_id)
      REFERENCES product (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION;

Пример:

Добавим тестовую запись в таблицу product_buyer


А теперь постараемся удалить запись из таблици product. Но Postgres не удалит запись из product таблици, лишь вернёт ошибку о том, что существует запись в таблице product_buyer, указывающая на удаляемую запись.


RESTRICT


Функционально RESTRICT и NO ACTION схожи между собой. Разница лишь в том, что в проверка внешнего ключа при  NO ACTION будет в самую последнюю очередь, тоесть при попытке выполнить транзакцию. А вот при RESTRICT уведомление о ошибке будет выдано сразу. Если транцакции не используються в приложении, то разници нет между NO ACTION и RESTRICT, если транзакции используються - то тут дело архитектуры приложения и ваших предпочтений 



ALTER TABLE product_buyer
  ADD CONSTRAINT product_buyer_product_id_fkey FOREIGN KEY (product_id)
      REFERENCES product (id) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT;

Пример

То же самое что и при NO ACTION 

CASCADE

При удалении записи, будут так же удалены все записи, ссылающиеся наудаляемую. При модификации - модифицированы все записи по внешнему ключу




ALTER TABLE product_buyer
  ADD CONSTRAINT product_buyer_product_id_fkey FOREIGN KEY (product_id)
      REFERENCES product (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE;


Пример:


При удалении записи из таблици product будут удалены записи из таблици product_buyer


До удаления


После удаления


SET NULL

При модификации/удалении записи, на которую ссылаеться поле, выставить значение поля в NULL.

SET DEFAULT

При модификации/удалении записи, на которую ссылаеться поле, выставить значение в DEFAULT VALUE для поля

среда, 15 сентября 2010 г.

gentoo syslog-ng начальная настройка

Достаточно часто пользорватели Линукс, как и я, сталкиваються с задачей сделать что то бысто и не замарачиваться. Такая ситуация у меня возникла с syslog-ng демоном - системой сбора лог информации в gentoo-box

После установки syslog-ng, базовая конфигурация демона логов немного ущербна. Для того, что бы чуточку упростить себе жизнь, ниже представлена базовая настройка для syslog-ng в ОС gentoo

$ cat /etc/syslog-ng/syslog-ng.conf
@version: 3.0
# $Header: /var/cvsroot/gentoo-x86/app-admin/syslog-ng/files/syslog-ng.conf.gentoo.3,v 1.1 2010/04/06 02:11:35 mr_bones_ Exp $
#
# Syslog-ng default configuration file for Gentoo Linux

options {
        chain_hostnames(no);

        # The default action of syslog-ng is to log a STATS line
        # to the file every 10 minutes.  That's pretty ugly after a while.
        # Change it to every 12 hours so you get a nice daily update of
        # how many messages syslog-ng missed (0).
        stats_freq(43200);
};

source src {
    unix-stream("/dev/log" max-connections(256));
    internal();
#    file("/proc/kmsg");
};

source kernsrc { file("/proc/kmsg"); };

# Create message recievers
destination authlog { file("/var/log/auth.log"); };
destination messages { file("/var/log/messages"); };
destination sys_log { file("/var/log/syslog"); };
destination cron { file("/var/log/cron.log"); };
destination daemon { file("/var/log/daemon.log"); };
destination kern { file("/var/log/kern.log"); };
destination lpr { file("/var/log/lpr.log"); };
destination user { file("/var/log/user.log"); };
destination mail { file("/var/log/mail.log"); };

destination mailinfo { file("/var/log/mail.info"); };
destination mailwarn { file("/var/log/mail.warn"); };
destination mailerr { file("/var/log/mail.err"); };

destination newscrit { file("/var/log/news/news.crit"); };
destination newserr { file("/var/log/news/news.err"); };
destination newsnotice { file("/var/log/news/news.notice"); };

destination debug { file("/var/log/debug"); };
destination console { usertty("root"); };
destination console_all { file("/dev/tty12"); };
destination xconsole { pipe("/dev/xconsole"); };

# Create filters
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_user { facility(user); };
filter f_debug { not facility(auth, authpriv, news, mail); };
filter f_messages { level(info..warn)
        and not facility(auth, authpriv, mail, news); };
filter f_emergency { level(emerg); };

filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_crit { level(crit); };
filter f_err { level(err); };
filter f_failed { message("failed"); };
filter f_denied { message("denied"); };

# Connect filters with recievers
log { source(src); filter(f_authpriv); destination(authlog); };
log { source(src); filter(f_syslog); destination(sys_log); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_daemon); destination(daemon); };
log { source(kernsrc); filter(f_kern); destination(kern); };
log { source(src); filter(f_lpr); destination(lpr); };
log { source(src); filter(f_mail); destination(mail); };
log { source(src); filter(f_user); destination(user); };
log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); };
log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); };
log { source(src); filter(f_mail); filter(f_err); destination(mailerr); };

log { source(src); filter(f_debug); destination(debug); };
log { source(src); filter(f_messages); destination(messages); };
log { source(src); filter(f_emergency); destination(console); };

# By default messages are logged to tty12...
destination console_all { file("/dev/tty12"); };
# ...if you intend to use /dev/console for programs like xconsole
# you can comment out the destination line above that references /dev/tty12
# and uncomment the line below.
#destination console_all { file("/dev/console"); };

#log { source(src); destination(messages); }

По умолчанию все лог сообщения записываються в файл /var/log/messages. Но анализировать такой огромный файл... ох, дело не простое. Там и сообщения от ядра, и от системных демонов. Можно перенастроить все демоны для ведения своих журналов, но дело хлопотное. Но намного проще, если лог файлы разделены логически. Сказано-сделано ) Логика работы syslog-ng такова - разбить поток лог сообщений с определённым критериям и направить в нужный канал

Первая часть конфигурационного файла, получатели


Синтаксис


destination  { 
                destination-driver(params); destination-driver(params); ... };
Пример



destination d_demo_tcp { tcp("10.1.2.3" port(1999)); };

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




Name Description

file()
Записать сообщение в файл

fifo(), pipe()
Отправить канал через определённый pipe.

program()
Вызвать программу и направить на stdin программы сообщение

sql()*
Направить сообщение в sql ба
*лоступно лишь в syslog-ng Premium Edition.

tcp()
Отправить сообщение на указанный порт по протоколу IPv4 (tcp)

tcp6()
Отправить сообщение на указанный порт по протоколу IPv6 (tcp)

udp()
Отправить сообщение на указанный порт по протоколу IPv4 (udp)

udp6()
Отправить сообщение на указанный порт по протоколу IPv6 (udp)

unix-dgram()
Отправить сообщение на указанный порт по протоколу IPv4 (udp)

unix-stream()
Отправить сообщение через UNIX_STREAM

usertty()
Отправить сообщение на определённую консоль (терминал),
если пользователь залогинен




Вторая часть конфигурационного файла - это фильтры, которые в зависимости от условия идентифицируют сообщение

Синтаксис

filter  { expression; };

Пример:

filter demo_filter { host("example") and message("deny"); }; 

Есть небольшой ньюанс в фильтрах сообщений. В документации к syslog-ng можно найти match директиву. Например:
 
filter demo_filter { match("regexp", "deny"); }; 

И при запуске syslog-ng выше 3 версии в консоле будет такой Warning:

WARNING: the match() filter without the use of the value() option is deprecated and hinders performance, please update your configuration;

В новой версии лучше использовать message директиву, так как match - устарела.

В третей части конфигурационного файла - связывание фильтров с получателями


Синтаксис

log {
    source(s1); source(s2); ... 
    filter(f1); filter(f2); ... 
    destination(d1); destination(d2); ... 
    flags(flag1[, flag2...]);
};


Пример

source s_localhost { tcp(ip(127.0.0.1) port(1999) ); };
destination d_tcp { tcp("10.1.2.3" port(1999); localport(999)); };
log { source(s_localhost); destination(d_tcp); }
 

В нашем конф. файле связывание весьма простое - источники src и kernel-src + определённый фильтр = получатель

Ссылки:
  1. http://www.gentoo.org/doc/ru/security/security-handbook.xml?part=1&chap=3&style=printable
  2. http://sial.org/howto/logging/syslog-ng/
  3. http://www.balabit.com/sites/default/files/documents/syslog-ng-v2.0-guide-admin-en.html/ch03s04.html

четверг, 2 сентября 2010 г.

Проверка счёта через 3G модем Huawei E1550 в gentoo для провайдера Укртелеком

Нашёл очень простое решение, написаное на php для получение счёта. Полностью скопипасчено с http://uglyweb.info/lj/balance.php.txt

Вот сам скрипт:


function decodePDU($in) {
  $b = 0; $d = 0;
  $out = "";
  foreach (str_split($in, 2) as $ss) {
    $byte = hexdec($ss);
    $c = (($byte & ((1 << 7-$d)-1)) << $d) | $b;
    $b = $byte >> (7-$d);
    $out .= chr($c);
    $d++;
    if ($d == 7) {
      $out .= chr($b);
      $d = 0; $b = 0;
    }
  }
  return $out;
}

function encodePDU($in) {
  $out = "";
  for ($i = 0; $i < strlen($in); $i++) {
    $t = $i%8+1;
    if ($t == 8) 
      continue;
    $c = ord($in[$i])>>($i%8);
    $oc = $c;
    $b = ord($in[$i+1]) & ((1 << $t)-1);
    $c = ($b << (8-$t)) | $c;
    $out .= strtoupper(str_pad(dechex($c), 2, '0', STR_PAD_LEFT));
  }
  return $out;
}

$f = fopen ("/dev/ttyUSB2", "rw+");
fputs($f, "AT+CUSD=1,".encodePDU("*100#").",15\r\n");

while ($s = fgets($f)) {
  if (substr($s, 0, 5) == "+CUSD") {
    $s = decodePDU(substr(trim($s), 10, -3));
    echo $s."\n";
    if (strpos($s, "1 - Dalee") !== false) {
      fputs($f, "AT+CUSD=1,".encodePDU("1").",15\r\n");
    }
    else
      break;
  }
 }

fclose($f);

?>