
F-secure дгд
Как да не го обичаш това прасе:

Тази тлъстотия така се е ояла с памет, че просто няма кой да я засенчи. И това се получава само след 2-3 дни работа на компютъра без да го спирам. Е това се нарича memory leak!
На всичко отгоре като цъкнеш на trаy icon-ата намираш услужливата опция Unload. Която, всъщност, не прави нищо за освобождаване на заетата памет. Единствената оправия е рестарта на един service, който услужливо е кръстен FSGKHS. След това този процес започва от ~30-40 MB memory usage при 130 MB VM Size.
То бива некъдърни програмисти, ама тия са се оляли…
Пламен Пенчев
Всъщност аз не го познавам. Разбрах за проблем му от официалния сайт на община Трявна.
Странното е, че аз нямам навика да се включвам в такива инициативи – нито финансово, да не говорим пък с агитация. Но нещо тук ме жегна.
Може би защото човека е планински спасител. Един от тези, които залагат собственият си живот на карта, борят се с тежки условия и на всичко отгоре поемат тонове обиди – за да спасят човешки живот. ПСС е в голяма степен доброволческа организация и не мога да разбера защото по форуми и сайтове има толкова кал по техен адрес. Аз лично познавам планински спасители и дълбоко уважавам техните усилия да запазят живота на (предимно) неразумни люде, които (в обшия случай) дълбоко са надценили своите сили и после смятат, че някой е длъжен да ги спаси. И не че сред ПСС-арите няма и лоши, но все пак…
Може би защото сме на близки като възраст и някак си мога да се поставя на негово място. Младеж, на 33 години, в разцвета на силите си, претърпял инцидент и сега…? А животът е пред него!
Може би защото зад призива не стои някаква кака, която раздава картички, а БЧК и община Трявна. Някак не ми се вярва да е менте.
А може би защото сумата, която е необходима, е толкова постижима – 4 500 долара! Не става дума за десетки и стотици хиляди, а за някакви си седем бона! Но в Трявна заплатите са едни други…
Не знам защо, но реших да помогна. Ако още някой иска да помогне, банковата сметка според tryavna.bg e
Фонд „Милосърдие”
IBAN: BG05STSA93000004959222
BIC: STSABGSF
За Пламен Стоянов Пенчев
(това, което не са написали, но се разбира от BIC кода, е, че става дума за Банка ДСК)
4
IV…
Чухте ли… май някакъв вот имало?
Това чета в online изданието на вестник СЕГА. Това не е на първа страница, а е петата (!) поред новина за деня в секция „България“. Нарежда се веднага след „София проверява чистотата за конфликт на интереси“. Явно не е най-важното. Просто някакъв си вот.
Ми логично. Вече никой не вярва ни на правителство, ни на опозиция.
И двете страни се надяваха да изкарат дивиденти от този вот. Правителството – чрез отчет на розовите страни на управлението си пред избирателите (Сергей говорил повече от час по време на дебатите). Опозицията – с дребнави и смешни опити да показват зъби.
Сигурно много са се постарали. Там, в парламента. И двете страни са се подготвяли старателно, седмици наред. Управляващите са събирали де що има добри новини: представям си по една тумба чиновници във всяко министерство, които изписват успехите и предават заветната папка един час преди крайния срок на (секретарката на) министъра, за да я даде после той на министър-председателя. Опозицията – обратно, са набирали мощ в хулите си: представям си Костов казва на Абаджиев „остави този компромат, ще го използваме за вота“. Седмици наред кипи излишен труд и се хаби енергията на и без това не-много-енергичните бюрократи.
И всичко това отиде зян. Защото вече никой не ги гледа и слуша.
А колко време мина? (част 2)
И така, от първата част стана ясно, че искам да получа много точно колко време е отнел даден процес, като имам дата на започването и завършванвето му. Първия интересен момент, за който се сетих е какво правим при промяната на часовника през пролетта и есента (т.нар. DST). За щастие Oracle се справя автоматично с този проблем когато се използва „TIMESTAMP WITH LOCAL TIMEZONE“ (TSLTZ) (metalnik note 359119.1).
Понеже ми е много лесно да работя с тип DATE (там нещата са много прости), отначало си направих една функция, която да превръща подадените и TSLTZ в DATE и после – както си знам. Когато се извадят две DATE полета, резултата е дробно число, което се обаработва много лесно: цялата част е разликата между двете дати в дни, а дробната – в части от деня. Т.е. ако умножа (datе2 - datе1) * (24 * 60 * 60), получавам точно разликата в секунди.
Тук има две подробности: първо, така губим точността до секунда и второ, губим DST информацията. С второто се справих като нормализирах TSLTZ до гринуичко време преди да ги обърне в тип DATE:
create or replace function ts_diff_to_second(t1 in timestamp, t2 in timestamp) return number is
-- Gives the difference, in seconds, between 2 timestamps
-- Created by yavor Ivanov
dat1 date;
dat2 date;
utc_t1 timestamp;
utc_t2 timestamp;
res number;
begin
-- first we convert the timestamps to GMT to prevent DST problems
utc_t1 := SYS_EXTRACT_UTC(t1);
utc_t2 := SYS_EXTRACT_UTC(t2);
-- then we convert the timestamps to dates, so we can easily substract them
dat1 := utc_t1;
dat2 := utc_t2;
-- now we substract and convert to seconds
res := (dat2-dat1)*24*60*60;
return(res);
end;
До тук добре. Тази функция работи много хубаво и за повечето практически случаи е достатъчна. Обаче в нашата система доста неща се случват за периоди, по-малки от една секунда. За това задълбах в аритметиката на TSLTZ.
Когато се извадят две TSLTZ полета, резултата не е число, а е от изкелиферчения тип INTERVAL DAY TO SECOND. Характерното за този тип е че ако не си му свикнал, е трудно да боравиш с него 🙂
Първо да видим как изглежда резултата:
SQL> select send_time - receive_time Total_time
2 from documents_proba
3 where idDocument = 4379451;
TOTAL_TIME
-------------------
+000000000 00:00:05
Това идва да ни каже, че между пристигането и изпращането на този документ са минали +000000000 дни, 00 часа, 00 минути и 05 секунди. Първото, което прави впечатление тук е, че пак ни няма милисекундите 🙁
Втори опит:
SQL> select to_char(send_time - receive_time, 'FF') Total_time
2 from documents_proba
3 where idDocument = 4379451;
TOTAL_TIME
---------------------------
+000000000 00:00:05.828000
С това заклинание видяхме четири неща:
– частите от секундата си ги има, не са изгубени
– при първия пример oracle даже не си играе да закръгля, а направо отрязва частите от секундата (5.828 става на 5)
– to_char работи (долу-горе) и за INTERVAL, макар в документацията да не е описано как
– FF, което във форматирането на to_char би трябвало да връща само частите от секундата, наистина ги показва, но показва и всички друго
Тук някой може да си помисли, че съм тръгнал да parse-вам този резултат. Но истината е, че има и по-лесен начин. Има една функция EXTRACT, която със своя странен синтаксис ни позлвоява да получим части от interval (или друг тип) променлива.
Ето следващия пример:
SQL> select extract(second from send_time - receive_time) Total_time
2 from documents_proba
3 where idDocument = 4379451;
TOTAL_TIME
----------
5,828
Както виждате, синтаксиса наистина е… абе нека го кажем „новаторски“. Вместо прости параметри функцията поема нещо като команда на английски – в случая извади_ми(секундите от този_израз). Ето още няколко красиви приемра от документацията:
EXTRACT(month FROM order_date)
EXTRACT(YEAR FROM TO_DATE(hire_date, 'DD-MON-RR'))
EXTRACT(TIMEZONE_REGION FROM TIMESTAMP '1999-01-01 10:00:00 -08:00')
EXTRACT(DAY FROM (SYSDATE - order_date) DAY TO SECOND )
И така… щастлив, че вече си имам секундите, настъпих следващата мотика. Ако интервала между двете TSLTZ полета е, да кажем, 02:34:12.323 (т.е. 2 часа, 34 минути и 12.323 секунди), extract(second from …) ще получим само секундите, т.е. 12.323. А това не е добре. За това функцията трябва да взема дните, часовете и минутите и да ги умножава по каквото трябва. В крайна сметка се получи следната функция:
create or replace function ts_diff_to_second2(t1 in timestamp, t2 in timestamp) return number is
-- Gives the difference, in seconds and up to milisecond, between 2 timestamps
-- Created by yavor Ivanov
dif INTERVAL DAY TO SECOND;
res number;
begin
-- get the difference
dif := t2 - t1;
-- convert every element to seconds
res := extract(day from dif) * 24 * 60 * 60;
res := res + (extract(hour from dif) * 60 * 60);
res := res + (extract(minute from dif) * 60);
res := res + extract(second from dif);
return(res);
end;
А колко време мина?
Покрай проекта за електрическото правителство витае въпроса за отговорността на ЕСОЕД за обработката и доставката на съобщенията документите, които пренася. Тук има две противоречиви изисквания. Първото е, че трябва да прекараме всички документи достатъчно бързо. Има определен интервал, в който можем да доставяме даден документ. Ако изтече, т.е. не успеем да го доставим, се случват лоши неща. Второто е една… хм… интересна закачка, заложена в чл. 18 от наредбата за ЕСОЕД и тълкуването му от МДААР, която не искам да коментирам.
Както и да е. В тази връзка имплементираме в системата много точно отчитане на времето. Първо, часовниците на всички сървъри са синхронизирани адски точно благодарение на СОЕВ – системата за отчитане на единно време, доставена от HP. После, много точно записваме кога един документ е постъпил в ЕСОЕД и кога сме успели да го изпратим (задължени сме по чл. 41 от наредбата). Освен това пазим и кога сме приключили с всички обработки, за да е ясно колко време документа се е бавил при нас и колко сме се опитвали да го изпращаме.
Tова е идеален пример за фундаменталната формула от теорията на опашките
R = S + W
където:
R е времето, което един документ прекарва в ЕСОЕД (response time);
S е времето, което е необходимо на ЕСОЕД за да обработи документа (service time);
W е изчакването на опашката за изпращане (queueing delay).
И докато ние правим всичко възможно да намалим S, ще се окаже, че за някои системи W е далеч по-голямо и в резултат някой може да обвини нас за голямото време R без да сме виновни.
За да запишем максимално точно всеки един момент, аз направих в БД полета от тип TIMESTAMP(6) WITH LOCAL TIME ZONE. Избрах типа TIMESTAMP, защото DATE има точност само до секунда (през нас могат да минават доста документи в една секунда). Така в БД имаме възможност за запис на микросекунди (това е една милионна от секундата). За сега сървърите ни са под Windows и часовника дава само милисекунди, но аз мисля в перспектива… 🙂
Хм. Това въведение в проблема стана твърде дълго. За това ще опиша проблема и решението в следващия пост. Stay tuned!
TimeZone Files, „version 4“
При миграция към Oracle 11g има една малка, но дразнеща мотичка, свързана с timezone файла, използван от БД. Не мога да разбера защо DBUA, който прави толкова много и сложни неща, не се справя с това. Почти съм сигурен, че проблемите са политически, но не мога да схвана какви са.
Както и да е. Ако мигрирате от нещо по-старо от 10.2.0.4 към 11g, трябва първо да си оправите timezone файла. За всички относително съвременни patchsets (примерно 10.2.0.3 или 10.1.0.5) това става лесно с прилагането на patch bundle с opatch. Но ако имате шанса да сте на нещо по-старичко, като 10.1.0.4, нещата загрубяват.
Ето тук е много полезна следната metalink note: Applying „version 4“ Time Zone Files on an Oracle Database. В нея има една красива табличка с линкове и обяснения за коя версия какво се прави.
Enjoy 🙂
5
Пет…
