Monday, 25 August 2008
Обратно на работа Публикувано от saiman
в Размисли и страсти в
10:52
Коментари (0) Проследявания (0) Обратно на работа
След 4 дни в Созопол и няколко дни във Варна, все още не се чувствам достатъчно отпочинал. До година не една, а две седмици за лятото ... и може би не в Созопол. Не че беше лошо, но си го представях по-тихо и по-различно от лудницата, която цари в по-големите градове/курорти. Е пообърках се лекичко, беше претъпкано с хора и коли, а думичката "разходка", можеше да се опише с - "опит да си направиш път през тълпата". Иначе плажовете бяха хубави, особено този на къмпинг "Златна рибка", най-хубавият от четирите плажа на които ходих (Златна рибка, Смокини и двата плажа в Созопол). Града също си заслужава да бъде разгледан, особено ако също като мен ако не сте посещавали преди това Созопол. Не можаха да ми убягнат някой дразнещи "подробности", например сринатата в средата крепостна стена от строящ се хотел ...
Thursday, 14 August 2008Маймунска мисъл
Тук мисля да събирам мислите на една маймуна програмист и когато станат прекалено много ще издам книга, от която ще спечеля много пари. Вече съм говорил със "Стършел" да отпечатат книгата, когато стане готова. Предвид "възможностите" на въпросната маймуна съм сигурен, че до няколко седмици, ще пуснем книгата за печат. Ще се радвам ако някой от вас сподели други оригинални маймунски мисли, по този начин, много ще ми помогнете с книгата.
"Използването на функцията eval() води до сериозно увеличаване на производителността ..." Ето няколко съвета, за това как да станем по-умни и умело да реализираме и оптимизираме един проект по "маймунски". ПРЕДУПРЕЖДЕНИЕ: Не опитвайте това у дома си ! Най-важното е да напишем проекта на един ред. По този начин ще спестим много дисково пространство, защото когато е на един ред няма да има нови редове и spaces. Важно е защото, ако го напишем на един ред, ще покажем също, че сме много умни. Още една техника, която трябва да използваме, за да покажем колко сме умни е използването само на алгоритмични if's. Използването на тези if ни прави по-умни и пести, така важното за нас дисково пространство. За финал, най-важната техника, функцията eval. След като съберем всичко на един ред е добре, да го обвием в един eval. По този начин проекта ще стане много по производителен, защото eval техниката подобрява производителността. Много е важно също така да сложим и вложени eval вътре в кода. Всеки един вложен eval вдига нашата производителност, а още по-хубаво ще стане ако сложим един цикъл от 1 до i = 1000, който вкарва вложени eval във вложен eval, така с увеличаването на числото i ставаме все по-производителни. Wednesday, 13 August 2008
Проблеми с ezComponents - ... Публикувано от saiman
в PHP, Компютри в
12:04
Коментари (0) Проследявания (0) Проблеми с ezComponents - Configuration
Използвам въпросния компонент в един проект, за четене на конфигурационни параметри от един ini файл. Така се случи, че като параметър вкарах едно по-голямо integer число и каква изненада, числото беше "намаляло"
Thursday, 7 August 2008epay.bg интеграция
Това е класа, за който споменах преди време. Идеята е да се капсулират детайлите и в бъдеще, ако ми се наложи пак да го интегрирам по-лесно. Добре е преди това да се обясни как работят нещата - глобално, а това се случва на няколко стъпки:
- Клиент идва в магазина (сайта който разработваме) и поръчва продукт. Ние създаваме една форма, която сочи към epay.bg и има няколко hidden полета, които описват поръчката. Когато клиента натисне на бутона информацията от формата, заедно с него (клиента) отиват на epay.bg. - Epay.bg чете, това което сме пратили и го показва на клиента. За него остава само да потвърди плащането, което не е задължително да стане веднага, т.е. може да го потвърди и по-късно. - След като клиента потвърди, epay.bg изпраща request към нас, за да ни уведоми, че това плащане е осъществено. Ние го отбелязваме като такова, а клиента бива redirectнат обратно към магазина, на предварително зададена от нас страница. Ето и какво ни трябва, за да минем успешно през стъпките: КИН - клиентски идентификационен номер, получава се от epay.bg и ни идентифицира пред тях. секретна дума - Също се взима от epya.bg и се използва се за хеширане на информацията, която изпращаме. url ok - Подва се заедно с url cancel в стъпка 1. Epay.bg го използва, за да прапрати клиента на него при успешна поръчка. url cancel - Клиента се препраща тук, в случай че откаже плащането. expiration time - С него указваме, колко време има клиента за да плати поръчката. Ако това време изтече поръчката автоматично се отказва. response страници - Това нещо се попълва в сайта на epay. След като влзете в него с регистрираните от вас потр. име и парола. Използва се от epay - на него изпраща потвържденията от стъпка 3 За се справим със задачата, ще са ни необходими две странички - една от която да попълваме информацията за плащането и да изпращаме клиента към epay.bg (checkout.php) и една към която да се обръща epay, с информация за направените преди това заявки (response.php). checkout.php <?php $request_id = 1; // has to be unique for each request $total = 100; // the sum for charging $exp_time = 3600 * 2; // 2 hours $payment = new Payment('KIN', 'SECRET_WORD', 'http://mysite.com/ok/', 'http://mysite.com/cancel/'); $input_fields = $payment->get_form_data($request_id, $total, $exp_time, 'test payment'); $form_url = $payment->get_form_url(true); // true means work in test mode - you will access epay.bg development url for testing ?> <form method="post" action="<?php echo $form_url?>" name="checkoutForm"> <?php foreach ($input_fields as $value) { echo $value; } ?> <input type="submit" value="submit" /> </form> response.php <?php $payment = new Payment('KIN', 'SECRET_WORD', 'http://mysite.com/ok/', 'http://mysite.com/cancel/'); $payment->handle_response($_POST['encoded'], $_POST['checksum']); ?> Важно е да се спомене, че $request_id трябва да е уникално при всяко обръщане към epay.bg, то се използва и от epay, когато се обръщат към нас, за да идентифицира поръчката. handle_response() в response.php трябва да се погрижи за обработката на данните изпратени от epay.bg. Класа който използваме тук - Payment наследява EpayPayment и дефинира четири метода: validate_request_id, handle_valid_request, handle_error_request и handle_not_recognise_request. payment.php <?php class Payment extends EpayPayment { protected function validate_request_id($request_id) { $dbh = DbInstance::get(); $query = "SELECT COUNT(*) FROM orders WHERE id = ? AND status = 0"; $stmt = $dbh->prepare($query); $stmt->execute(array($request_id)); $result = $stmt->fetchColumn(); unset($stmt); if ($result == 1) { return self::response_valid; }else { return self::response_no; } } protected function handle_valid_request($request_id, $status, $pay_date, $stan, $bcode) { if ($status == 'PAID') { $dbh = DbInstance::get(); $query = "UPDATE orders SET status = 1 WHERE id = ?"; $stmt = $dbh->prepare($query); $stmt->execute(array($request_id)); unset($stmt); } } protected function handle_error_request($request_id) { return true; } protected function handle_not_recognise_request($request_id) { return true; } } validate_request_id() трябва да валидира номера на поръчката. Проверяваме дали имаме записана поръчка, с такъв номер при нас и в зависимост от това определяме дали е валидна или не. handle_valid_request() Се изпълнява за всяка една валидна поръчка, т.е. платена от клиента, когато тя е такава променяме статуса на поръчката, за да отбележим, че е платена. epay_payment.php <?php abstract class EpayPayment { const response_valid = 1; // request id is Ok const response_error = 2; // error occured for the given request id const response_no = 3; // request id is not recognised const submit_url = 'https://www.epay.bg/'; const submit_url_dev = 'https://devep2.datamax.bg/ep2/epay2_demo/'; protected $min; protected $secret; protected $url_ok; protected $url_cancel; // you have to validate the request_id here and // return response_valid, response_error or response_no const abstract protected function validate_request_id($request_id); abstract protected function handle_valid_request($request_id, $status, $pay_date, $stan, $bcode); abstract protected function handle_error_request($request_id); abstract protected function handle_not_recognise_request($request_id); /** * * @param string $min Merchant identification number * @param string $secret Secret string defined for the given merchant **/ public function __construct($min, $secret, $url_ok = false, $url_cancel = false) { if (!isset($min) || !isset($secret)) { throw new Exception(<u>_CLASS_</u> . ' ' . <u>_METHOD_</u> . ' invalid argumets passed.'); } $this->min = $min; $this->secret = $secret; $this->url_ok = $url_ok; $this->url_cancel = $url_cancel; } /** * Accepts response from the epay for a given order * and sends message which confirms that the response * is recieved * * @param string $encoded Should be $_POST['encoded'] variable * @param string $checksum Should be $_POST['checksum'] variable * **/ public function handle_response($encoded, $checksum) { if (!isset($encoded) || !isset($checksum)) { throw new Exception(<u>_CLASS_</u> . ' ' . <u>_METHOD_</u> . ' invalid argumets passed.'); } $hmac = $this->hmac($encoded, $this->secret); if ($hmac == $checksum) { $data = base64_decode($encoded); $lines_arr = split("\n", $data); $info_data = ''; foreach ($lines_arr as $line) { if (preg_match("/^INVOICE=(\d+):STATUS=(PAID|DENIED|EXPIRED)(:PAY_TIME=(\d+):STAN=(\d+):BCODE=([0-9a-zA-Z]+))?$/", $line, $regs)) { $invoice = $regs[1]; $status = $regs[2]; $pay_date = $regs[4]; $stan = $regs[5]; $bcode = $regs[6]; // process $invoice, $status, $pay_date, $stan, $bcode here switch ($this->validate_request_id($invoice)) { case self::response_valid: $info_data .= "INVOICE=$invoice:STATUS=OK\n"; $this->handle_valid_request($invoice, $status, $pay_date, $stan, $bcode); break; case self::response_error: $info_data .= "INVOICE=$invoice:STATUS=ERR\n"; $this->handle_error_request($invoice); break; case self::response_no: $info_data .= "INVOICE=$invoice:STATUS=NO\n"; $this->handle_not_recognise_request($invoice); break; default: $info_data .= "INVOICE=$invoice:STATUS=ERR\n"; $this->handle_error_request($invoice); break; } } } echo $info_data, "\n"; } } /** * Return's the epay.bg URL * * @param boolean $test_mode * @return string $url **/ public function get_form_url($test_mode = false) { if ($test_mode) { return self::submit_url_dev; } else { return self::submit_url; } } /** * Returns array with input hidden fields which should be * assigned to a form with submir url generated with get_form_url() * * @param integer $request_id Unique request id (invoice number) * @param float $sum Total sum for charging * @param integer $exp_time In seconds * @param string $description Transaction description **/ public function get_form_data($request_id, $sum, $exp_time, $description = '') { if (!isset($request_id) || !isset($sum) || !is_numeric($sum)) { throw new Exception(<u>_CLASS_</u> . ' ' . <u>_METHOD_</u> . ' invalid argumets passed.'); } $exp_date = date('d.m.Y', time() + $exp_time); $data = "MIN=$this->min\nINVOICE=$request_id\nAMOUNT=$sum\nEXP_TIME=$exp_date\nDESCR=$description"; $encoded = base64_encode($data); $checksum = $this->hmac($encoded, $this->secret); $result = array(); $result[] = "<input type=hidden name=PAGE value='paylogin' />"; $result[] = "<input type=hidden name=ENCODED value='$encoded' />"; $result[] = "<input type=hidden name=CHECKSUM value='$checksum' />"; $result[] = "<input type=hidden name=URL_OK value='$this->url_ok' />"; $result[] = "<input type=hidden name=URL_CANCEL value='$this->url_cancel' />"; return $result; } /* md5 and sha1 only */ protected function hmac($data,$passwd, $algo = 'sha1'){ $algo=strtolower($algo); $p=array('md5'=>'H32','sha1'=>'H40'); if(strlen($passwd)>64) $passwd=pack($p[$algo],$algo($passwd)); if(strlen($passwd)<64) $passwd=str_pad($passwd,64,chr(0)); $ipad=substr($passwd,0,64) ^ str_repeat(chr(0x36),64); $opad=substr($passwd,0,64) ^ str_repeat(chr(0x5C),64); return($algo($opad.pack($p[$algo],$algo($ipad.$data)))); } } Tuesday, 5 August 2008
Впечатления от ... Публикувано от saiman
в Размисли и страсти в
19:01
Коментари (0) Проследявания (0) Впечатления от supportа на epay.bg
Днес интегрирах epay.bg на един сайт, задачата не беше особено сложна, но се наложи на два пъти да си говорим със supportа по телефона. Евала на хората, които бачкат там - отговориха адекватно, с желание и с много търпение на всичките ми въпроси. Рядко се случва да попаднеш на такъв support.
Та във връзка с интегрирането, капсулирах по-специфичните неща в един клас, така че да ми е по-лесно при повторно интегриране някъде. Иска ми се да го пусна тук, може да е полезен на някой, само време да намеря ... Wednesday, 30 July 2008
Батмане .. батмане ... Публикувано от saiman
в Размисли и страсти в
11:44
Коментари (0) Проследявания (0) Батмане .. батмане ...
Преди 2 дни ходих на кино с мисълта че ми се гледа нещо, но не знаех какво. Та отидох в мола и започнах да се взирам в плакатите, за да си избера нещо за гледане, оказа се сложно. Даваха Хелбой, Ханкок, Хрониките на Нараня, Батман и тази тази простотия с А. Джоли, забравих и името ... където "фалцираха куршума". Нищо не бях гледал от изброените филми и нищо не ме грабна, все пак реших да гледам Батман - след като ще е боза, поне да е класическа. И така взех си най-големите пуканки и още бира (преди това бях изпил няколко) и се подготвям за филма. Мисля си - така и така ще е тъпотия, поне да хапна и пийна като хората.
Оказа се, че съм в грешка. Филма беше много добър. Така ме грабна, че не го усетих кога свърши, а беше 2 часа и половина дълъг. Препоръчвам го на всеки който се чуди какво да гледа, наистина си заслужава да се види. Това с Батман се оказа попадение, предвид последните няколко пъти, когато ходих на кино и излизах безкрайно отегчен след поредната американска боза. Батман е филма - гледайте го. Wednesday, 23 July 2008ПИБ - още бъгове в електронното банкиране
И не само там ...
Преди 2 месеца и половин, разбрах че имам кредитна карта. Ще попитате защо казвам "разбрах" - много просто, никога не съм подавал молба за кредитна карта и никога не съм искал кредитна карта. Най-интересното е, че никога не съм се подписвал някъде за такава карта, а имам такава. Както и да е - решили хората да ми дадат - дали, можеше поне да ми кажат, че са ми дали, че да си я взема, ако случайно искам да я ползвам ама не ... Отварям аз един ден ел. банкиране, тъкмо бяха преминали на новото, супер функционално и невероятно добро ел. банкиране и какво да видя ? Кредитна карта ?! Отивам в най-близкият клон, опитвайки се като опитен разузнавач да изкопча малко информация от служителката там ама не. И тя нищо не знае, нямаше смисъл да прилагам мъчения Днес погледнах датата на която бях подал молбата и се оказа, че два месеца са минали. Влизам си в ел. банкиране да видя, закрили ли са я или не ... и какво да видя - стои си, ако им вярваш на банкирането де ... След един разговор по телефона с картов център на ПИБ, се оказа че картата е закрита, предложи ми жената да говоря, с тези от ел. банкиране, но учтиво и отказах - няма смисъл. Tuesday, 22 July 2008FreeBSD Ports - Зависимости между портовете
Днес се наложи да си поиграя малко с ports системата във FreeBSD. Трябваше да разбера за даден пакет, от кои пакети зависи и кои пакети зависят от него. Оказа се че имам доста инсталирани пакети (свързани с perl) които на практика не се използват и смело ги деинсталирах. Дали утре няма да гръмне нещо, ще разбера скоро ... Интересното тук е програмката pkg_glob, която е част от пакета portupgrade. Именно тя ми свърши работа за решаването на горният проблем.
Ето и пример: [root]# pkg_glob -Rr p5-Carp-Clan* Горното извикване ни показва всички пакети свързани с p5-Carp-Clan. Понеже не знаем точната версия на p5-Carp-Clan инсталирана в момента използваме * накрая, за да укажем търсеният пакет. Използваме -R за да кажем pkg_glob да ни покаже всички пакети от които зависи p5-Carp-Clan и -r за да покаже пакетите които зависят от него. Дотук всичко е добре, с изключение на това, че не са сортирани както трябва. За целта можем да ползваме pkg_sort и се получава следното нещо:
Вече подредено е доста по-разбираемо. От това което се вижда става ясно, че p5-Carp-Clan е необходим на p5-Bit-Vector-6.4_1, p5-Date-Calc-5.5.1 и pflogsumm-1.1.2,1, а за да работи се нуждае само от perl-5.8.8_1. Редакция: Може да се използва и pkg_info с параметри -Rr име на пакет. Пример: [root]# pkg_info -rR p5-Carp-Clan* Предимството е, е го има в base и не е необходимо да се инсталира portupgrade. Friday, 18 July 2008
Архивиране с gtar Публикувано от saiman
в *BSD, Linux, PHP, Компютри в
12:24
Коментари (0) Проследявания (0) Архивиране с gtar
Преди има няма месец, бях изправен пред "проблема" с архивирането, а именно - удобен начин, за архивиране на важната информация. След известно време ровене в Интернет попаднах на една статия Създаване на резервни копия с TAR. Интересно беше не толкова самата статия, колкото един от коментарите към нея, на Георги Андонов, който разясняваше няколко примерни "политики на архивиране".
Накратко, знаем че с tar могат да се създават инкрементални архиви. Хубав пример за това какво представляват инкременталните архиви е следното: Имаме една директория с множество файлове в нея. Архивираме я с tar и полученият архив е с големина 10 MB. След време тази директория променя съдържанието си - добавени са нови файлове например. Вместо да я архивираме отново по същият начин, за да имаме актуално резервно копие, ние създаваме инкрементален архив, на база създаденият вече от нас архив. Новият архив, ще съдържа само разликите в периода от създаването на първият архив до създаването на инкременталният архив. Хубавото тук е, че понеже архивираме само новите неща, големината на този втори архив ще зависи само от това колко големи са разликите и ако те са малки, архива също ще е малък. Въпроса е какво печелим, архивирайки по този начин: време - когато трябва да архивираме по-малко файлове времето за създаването на архива е по-малко. дисково пространство - тъй като архивираме само разликите, пространство което ще ни е необходимо да ги запазим е по-малко в сравнение с това да архивираме отново цялата директория. Недостатък тук е процеса по възстановяване на информацията. Ако възникне проблем, първо трябва да разархивираме първият архив и след това вторият, който ще промени вече разархивираният първи архив, така че да възстановим директорията до състоянието и в което сме я архивирали последно. Сега вече се намесват и "политиките на архивиране", те имат за цел да ни предложат стратегия, която да използваме при създаването на инкрементални архиви, така че съотношението между време за архивиране, големина на архивите и време за възстановяване да е максимално удобна за нас. Във въпросният коментар бяха показани няколко примерни стратегии, аз се спрях на първата - Месечна. Числото в скоби е седмицата от месеца. Горе са показани дните от седмицата, а номерата за всеки ден показват от кое "ниво" е инкременталният архив. Ето какво пише авторът на коментара за тази стратегия: П В С Ч П С Н (1) 0 (2) 2 2 2 2 1 (3) 3 3 3 3 2 (4) 4 4 4 4 3 (5) 5 5 5 5 4 Относно "Нивата": Ниво 0 е пълен архив. Нива 1, 2, 3, ... (обикновено до 9) са инкрементални. Те не са точно дефинирани. Използват се за съставяне на "подходяща за нас" стратегия. Всеки архив от ниво Х съдържа само данните, променени от последния архив на Ниво Х или по-малък от Х. Пример: - Понеделник: Архив ниво 0 (Пълен архив) - Вторник: Архив ниво 3 (Данните променени от Понеделник до сега) - Сряда: Архив ниво 5 (Данните променени от Вторник до сега) - Четвъртък: Архив ниво 2 (Данните променени от Понеделник до сега) Ето и самата стратегия: - Първият петък на месеца се прави пълен архив. - Дневните архиви съдържат данните променени в текущия ден. - Седмичните архиви (Петък) съдържат данните променени в текущата седмица. - Събота и неделя не се правят архиви Възстановяване при срив: Най-лошият случай е "Срив в последния петък на месеца". Възстановяването на системата изглежда така: - Архив 0 от първия Петък. - Архив 1 от втория Петък. - Архив 2 от третия Петък. - Архив 3 от четвъртия Петък. - Архив 5 от последния Понеделник. - Архив 5 от последния Вторник. - Архив 5 от последната Сряда. - Архив 5 от последния Четвъртък. Данните от последния Петък са загубени. Предимства и недостатъци: - Бързо се създават архивите. - Бавно се възстановяват. И така, след като реших какво ще използвам за архивиране, реших да напиша кратък php скрипт, който да автоматизира описаното. Резултата е скрипта показан по-долу. Преди всичко, трябва да се променят константите в началото на файла, така че да отговарят на системата, на която ще работи скрипта. Всички константи започващи с BIN_ задават пътя до използваните програми. MYSQL_ROOT_PASSWORD съдържа root паролата за досътп до mysql, използва се за да се включи в архива и копие на базата от данни. Скрипта разчита на това, че имате създадена директорията /var/sqldumps/ в която да съхрани dump-а от базата. BACKUP_INCLUDE сочи до текстов файл в който на всеки нов ред е описана директорията, която искаме да архивираме. По този начин можем да зададем списък от директории и/или файлове, които искаме да се включат в архива ни. BACKUP_EXCLUDE е подобен на BACKUP_INCLUDE, разликата е, че пази пътя до файловете, които не искаме да влизат в архива. Например ако имаме директория, в която искаме да архивираме всичко, с изключение на един файл, вместо да изреждаме всички файлове от директорията в BACKUP_INCLUDE, по-добре ще е да добавим самата директория, а в BACKUP_EXCLUDE да посочим файла, който не искаме да се архивира. BACKUP_LOCATION е директорията в която ще се направи архива. Примерен BACKUP_INCLUDE файл: /var/www/vhosts Първото стартиране на скрипта трябва да се направи ръчно с параметър --init, който ще генерира всички архиви от началото на месеца. След това можете да го извиквате без параметър, най-добре през cron. backup.php <?php define("BIN_MYSQLDUMP", "/usr/local/bin/mysqldump"); define("BIN_TAR", "/usr/local/bin/gtar"); define("BIN_CP", "/bin/cp"); define("BIN_RM", "/bin/rm"); define("MYSQL_ROOT_PASSWORD", "myrootpassword"); define("BACKUP_INCLUDE", "/root/etc/backup.include"); define("BACKUP_EXCLUDE", "/root/etc/backup.exclude"); define("BACKUP_LOCATION", "/var/backup"); function usage(){ echo "Usage: backup.php [--init]\n"; echo "Create backup for today if no parameters are passed.\n"; echo "--init Creates all backups from the beginig of the month until today\n"; exit(); } function mysql_dump(){ exec(BIN_MYSQLDUMP . " -u root -A -p" . MYSQL_ROOT_PASSWORD . " > /var/sqldumps/mysql_backup.sql"); } function copy_snar($snar_old, $snar_new){ exec(BIN_CP . " /var/backup/$snar_old /var/backup/$snar_new"); } function tar_exec($archive_name, $snar_name){ exec(BIN_TAR . " --create \ --gunzip \ --exclude-from=" . BACKUP_EXCLUDE . " \ --files-from=" . BACKUP_INCLUDE . " \ --file=" . BACKUP_LOCATION . "/$archive_name \ --listed-incremental=" . BACKUP_LOCATION . "/$snar_name"); } function rm_exec(){ exec(BIN_RM . " -rf " . BACKUP_LOCATION . "/*.snar"); } function backup($date = false){ if ($date == false) { $date = date('d'); } // get the day of the week $day = date('N', mktime(0, 0, 1, date('m'), $date)); // get the first friday $first_day_of_the_month = date('j', mktime(0, 0, 0, date('m'), 1)); switch (date('N', mktime(0, 0, 1, date('m'), $first_day_of_the_month))){ case 1: $number_of_days_to_friday = 4; break; case 2: $number_of_days_to_friday = 3; break; case 3: $number_of_days_to_friday = 2; break; case 4: $number_of_days_to_friday = 1; break; case 5: $number_of_days_to_friday = 0; break; case 6: $number_of_days_to_friday = 6; break; case 7: $number_of_days_to_friday = 5; break; } $first_friday = $first_day_of_the_month + $number_of_days_to_friday; // get the week $first_week = date('W', mktime(0, 0, 0, date('m'), $first_friday)); $todays_week = date('W', mktime(0, 0, 0, date('m'), $date)); $week = $todays_week - $first_week + 1; // callculate the tar level $level = $week; if ($day == 5){ $level = $level - 1; }elseif ($week == 1){ $level = 5; } $archive_name = date('Ymd', mktime(0, 0,0 , date('m'), $date)) . '.' . $level . '.tar.gz'; $snar_name = $level . '.snar'; // copy snar files only on monday and friday if ($day == 1) { $snar_old_name = $level - 2 . '.snar'; copy_snar($snar_old_name, $snar_name); }else if ($day == 5 && $first_friday != $date) { $snar_old_name = $level - 1 . '.snar'; copy_snar($snar_old_name, $snar_name); }else if ($day == 5 && $first_friday == $date) { // remove all snar files rm_exec(); } // create archives only in working days if ($day >= 1 && $day <= 5) { tar_exec($archive_name, $snar_name); } } // start if (isset($argv[1]) && $argv[1] == '--init') { mysql_dump(); $first_day_of_the_month = date('j', mktime(0, 0, 0, date('m'), 1)); switch (date('N', mktime(0, 0, 1, date('m'), $first_day_of_the_month))){ case 1: $number_of_days_to_friday = 4; break; case 2: $number_of_days_to_friday = 3; break; case 3: $number_of_days_to_friday = 2; break; case 4: $number_of_days_to_friday = 1; break; case 5: $number_of_days_to_friday = 0; break; case 6: $number_of_days_to_friday = 6; break; case 7: $number_of_days_to_friday = 5; break; } $first_friday = $first_day_of_the_month + $number_of_days_to_friday; for ($i = $first_friday; $i <= date('j'); $i++){ backup($i); } }else if (!isset($argv[1])) { mysql_dump(); backup(); }else { usage(); } Wednesday, 16 July 2008ПИБ
Сигурен съм, че много се е изписало по темата, все пак и аз искам да добавя нещо, а именно един кратък диалог между мен и една госпожа или госпожица - Живка Пушкарова се казва, която се занимава с това да отговаря на въпроси свързани с електронното банкиране на ПИБ от блога им. Така и не успях да разбера на каква позиция работи в банката и от нея ли идват нещата, които ги пише или някой и "подсказва" ...
Аз - 09.07.2008 в 15:28 Щом сте на разположение, разяснете следното: Защо трябва да въвеждам едно и също нещо 2 пъти. След като този swift код, се съдържа в IBAN-а и аз веднъж съм вкарал IBAN-а ЗАЩО трябва да вкарвам и swift. Този велик софтуер сътворен от вас, няма ли възможност САМ да вземе swifta използвайки вече записаният от мен IBAN ? Живка Пушкарова - 10.07.2008 в 16:54 Здравейте saiman, Ръчното въвеждане на SWIFT кодът е необходимо, за да се провери неговата валидност. Проверката се въвежда, поради динамичното закриване и откриване на клонове на банки /всеки банков клон е със самостоятелен SWIFT код/, както и при сливане на банки. С поздрав, Живка Пушкарова Аз - 10.07.2008 в 16:59 “Проверката се въвежда, поради динамичното закриване и откриване на клонове на банки /всеки банков клон е със самостоятелен SWIFT код/, както и при сливане на банки.” Добре де: 1) въвеждам IBAN 2) Вие извиличате от IBAN-а SWIFT, без да се налага аз да го въвеждам !!! 3) Имате SWIFT и проверявате дали е валиден, ако не е … правите каквото правите. Казвате, че има грешка, че клона е закрит, че IBAN-а е невалиден или каквото там се прави. Къде е проблема тук ? Живка Пушкарова - 14.07.2008 в 16:45 Здравейте saiman, Това, което предлагате, може да бъде реализирано в софтуерните разработки. Въпросът е какви ресурси ще отнеме и дали има смисъл да бъде правено. В конкретният случай, ако бъде реализирана работата на програмата по предложения от Вас начин, ще се забави скоростта на извършване на транзакции, зареждане на страницата, преминаване от едно меню в друго. Затова сме избрали най-добрият оптимален вариант като скорост и функционалност на системата. С поздрав, Живка Пушкарова Аз - 14.07.2008 в 17:40 Коментарът е задържан за одобрение. Значи първо “Ръчното въвеждане на SWIFT кодът е необходимо, за да се провери неговата валидност”, т.е. няма как да стане без да се вкара този swift код. В един момент се оказва, че можело да се направи да работи без да се въвежда swift код от потребителят, НО “ще се забави скоростта на извършване на транзакции, зареждане на страницата, преминаване от едно меню в друго”. Kое точно ще се забави: - скоростта на извършване на транзакции - зареждането на страницата или - преминаване от едно меню в друго Колко време отнема една substring операция и как е свързана тя със скоростта на извършване на транзакции, зареждането на страницата и менютата ? Както се забелязва отговорите на въпросната дама, са повече от неадекватни. Също предполагам се забелязва, че последният ми коментар (въпрос) е "задържан", чудя се защо са го направили този блог ? Нали искат да разберат, какво мислят клиентите на банката, какъв е смисъла да цензурират част от въпросите или коментарите ? Въобще въпроси много, а отговори малко. Аз лично за себе си намерих отговор на няколко въпроса, а именно: Професионалисти ли са ПИБ ? Заслужава ли си човек, да продължава да работи с тази банка, надявайки се да има разрешение на проблемите, които създава новото им електронно банкиране ? За мен отговора и на двата въпроса е не. Ще видя какво предлагат другите банки и в скоро време надявам се, ще сменя сегашната. Междувременно, ще се радвам някой да сподели опита си с конкурентни на ПИБ банки. Wednesday, 16 July 2008
Вместо здрасти ... Публикувано от saiman
в Размисли и страсти в
10:17
Коментари (4) Проследявания (0) Вместо здрасти ...
Този блог си стои така от доста време, в смисъл инсталиран без каквото и да е съдържание. Веднъж си мислех да пиша нещо, но отново не ми остана време и го отсвирих. Днес обаче е по-различно, след една особено интересна дискусия в блога на ПИБ, реших че е време да напиша това което мисля, без да има кой да ми го цензурира, изреже, съкрати и т.н.
|