Уроци

Обхождане на двоично дърво в Java

0

Как се реализира двоично дърво можете да видите в книгата на Светлин Наков, а ето как да се обходи по три начина като 2 не са реализирани в книгата.
Съответно ЛДК (Ляво-Корен-Дясно/Pre-order), КЛД (Корен-Ляво-Дясно/In-order), ЛДК (Ляво-Дясно-Корен/Post-order)

public void printPreOrder(BinaryTreeNode<T> root) {
if (root == null) {
return;
}
printPreOrder(root.getLeftChild());
 
System.out.print(root.value + " ");
 
printPreOrder(root.getRightChild());
}
 
public void printPreOrder() {
printPreOrder(this.root);
}
 
public void printInOrder(BinaryTreeNode<T> root) {
if (root == null) {
return;
}
System.out.print(root.value + " ");
 
printInOrder(root.getLeftChild());
 
printInOrder(root.getRightChild());
}
 
public void printInOrder() {
printInOrder(this.root);
}
 
public void printPostOrder(BinaryTreeNode<T> root) {
if (root == null) {
return;
}
printPostOrder(root.getLeftChild());
if (root.leftChild != null) {
System.out.print(root.leftChild.value + " ");
}
if (root.rightChild != null) {
if (root.rightChild.leftChild != null) {
printPostOrder(root.rightChild);
}
System.out.print(root.rightChild.value + " ");
}
}
 
public void printPostOrder() {
printPostOrder(this.root);
System.out.println(this.root.value);
}

Проблем при сравнение на числа с плаваща запетая при MySQL

2

Докато работих по един клиентски проблем се оказа, че има проблем при „сравнение“ на числата с плаваща запетая поне при MySQL. Може и да не е проблем, но някои хора може да се сблъскат с този проблем.
Да кажем, че искате да направите сайт за аукциони и искате да има графа „аукциони от 1 стотинка“. Това означава, че искате да вземете всички аукциони, които имат начална цена 0.01.
Обикновено вие (както и аз) бихте направили това:
SELECT * FROM auctions WHERE auction_start_price=0.01
Далеч не ви препоръчвам да си пишете така заявките, но това е друг въпрос. Реално няма да има никакви резултати дори в auctions.auction_start_price да има 0.01 в някои от редовете. Затова ще променим заявката така:
SELECT * FROM auctions WHERE ROUND(auction_start_price,2)=0.01
Сега всичко ще е наред. Друго решение е просто да посочите, че auction_start_price<0.02 и всичко щеше да е ок, но в някои случаи, ще е по-добър вариант закръглянето :)

Указатели (референции и дереференции) в C++

0

След първоначалния урок за „референции“ в C++„, който общо взето не говори нищо, реших да направя нов по-пълен „урок“. Ще се опитам да обясня защо те са много важни и къде се използват. Всяка променлива,константа,функция,масив,клас,структура и т.н. е записана в паметта в дадено „депо“.
Ето примерен код:

// Създаваме указател от тип int. Създаденият указател трябва да има същия тип на променливата към, която ще сочи.
int * pointer;
// Създаваме две променливи от тип int.
int ref1,ref2;
// Указателят сочи към адреса на ref1 (Указателят присвоява адреса на ref1 в паметта)
pointer = &ref1;
// Променяме съдържанието на на променливата, към чието място в паметта сочи указателя pointer
* pointer = 10;
// Указателят сочи към адреса на ref2 (Указателят присвоява адреса на ref2 в паметта)
pointer = &ref2;
// Променяме съдържанието на на променливата, към чието място в паметта сочи указателя pointer
* pointer = 20;

Указателите са изключително полезни при c/c++. Така вие имате достъп до паметта. Тук се включва и така наречената указателна аритметика. Това означава, че на даден указател можем да присвоим адреса на паметта на promenliva1. След това увеличаваме стойността на указателя и имаме достъп до promenliva2. Ще ви дам пример с масиви.

// създаваме указател
int * pointer;
// създаваме масив
int arr[5];
// на указателя се записва адреса на първия елемент на масива
pointer = &arr;
// на указателя се записва адреса на втория елемент на масива
pointer++
// на указателя се записва адреса на третия елемент на масива
pointer = &arr[2];
// ще променим стойността на четвъртия елемент на масива
*(pointer+1) = 20;
// ще присвоим на на указателя адреса на петия елемент
pointer = &arr + 4;

Ето така можем да сменяме стойностите на масив, както и на променливи.

Чрез указатели може да се заделя и динамична памет. В другия урок ще обясня за нея.
Могат да се създават указатели и на указатели.

int **p,*p2;
int a=5;
p2 = &a;
p = &p2;

Има и доста други възможности на указателите. Подробности за тях можете да видите тук :)

Оптимизиране на вашата MySQL база данни

4

Тук ще ви дам няколко съвета за оптимизиране на вашите бази данни за по-добро бързодействие:

- Пишете кои полета искате да вземете при дадена SELECT заявка:

Примерно пишете SELECT product_id, product_price, product_name FROM products вместо SELECT * FROM products

- Използвайте колкото се може по-малко функции в дадена заявка

Не използвайте много функции, освен, ако не е супер наложително.

- Иползвайте индекс (index)

Индексите значително подобряват скоростта. Когато имате полета от дадена таблица, които участват често в WHERE клауза, им сложете по един index. Няма точна граница, но нека не са прекалено много. Ако предимно ще ъпдейтвате, триете, добавяте иформация във вашата база данни, то повечето индекси може да я забавят.

- Определяйте добре типовете данни

Примерно опделяйте добре дали дадено поле ще е int, tinyint, smallint, bigint, mediumint. Ако примерно дадено поле ще приема стойности от рода на от 0 до 25 то е хубаво това поле да е tinyint, тъй като приема стойности от -128 до +128, а по-големи числа няма да са ви нужни.

- Не правете подзаявки

Много често се случва, че вместо подзаявка, можете да направите всичко с 1 заявка и в допълнение JOIN.

- Вместо търсене с „Like“ ползвайте Full-Text Search

С големи количества данни like работи изключително бавно. Сами по себе си двете търсения се различават. За да добиете по-добра представа е добре да прочетете документациите и на двете.

Тъй като е малко късно и ме мързи да пиша повече, това ще е засега. Скоро се предполага, че ще напиша още малко за оптимизиране на MySQL базите данни (наблягам на MySQL). Всичко друго – как се организира, структурира, зависи само от вас :)

Грешка с енкодинга при viroshop (ecommerce плугин за WordPress)

0

Наскоро имах поръчка да разширя възможностите на една ecommerce тема за wordpress – viroshop. Сблъсках се с проблема, че кукито се създава чрез javascript и има проблем с енкодинга. Не съм много на „ти“ с енкодингите, но можеби това е стандартен unicode енкодинг. Общо взето всички символи излизат като %u0440 и подобни числа + букви. Ето и функцийка написана от мен за справяне с този проблем.

function fixen($title) {
$search = ‘%u0410,%u0411,%u0412,%u0413,%u0414,%u0415,%u0416,%u0417,%u0418,
%u0419,%u041A,%u041B,%u041C,%u041d,%u041E,
%u041F,%u0420,%u0421,%u0422,%u0423,%u0424,%u0425,%u0426,%u0427,
%u0428,%u0429,%u042A,%u042B,%u042C,
%u042E,%u042F,%u0430,%u0431,%u0432,%u0433,%u0434,%u0435,%u0436,
%u0437,%u0438,%u0439,%u043A,%u043B,
%u043C,%u043D,%u043E,%u043F,%u0440,%u0441,%u0442,%u0443,%u0444,
%u0445,%u0446,%u0447,%u0448,%u0449,
%u044A,%u044C,%u044E,%u044F’;
$replace = ‘А,Б,В,Г,Д,Е,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Ю,Я,а,б,в,
г,д,е,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ь,ю,я’;
$search = explode(‘,’,$search);
$replace = explode(‘,’,$replace);
$title = str_replace($search, $replace, $title);
return $title;
}

Дано е помогнала.

Референции в c++

0

Тук ще ви въведа в референциите в c++. Това са 2 много силни оператора в c++, които трябва да знаете за да продължите своето професионално развитие.
Референцията така да се каже е положението на даден запис в паметта. Примерно създаваме променлива а. За да покажем нейното съдържание просто пишем cout < < a; и готово. Но тази променлива има отредено място в паметта, която се опраделя от операционната система. За щастие ние програмистите не трябва да определяме нейното място, защото щеше да стане наистина доста по-сложно. В някои случаи се налага да видим нейният адрес в паметта и това става чрез специалния оператор &. Примерно пишем.

int a = 15;
int b = a;
int c = &a;

В нашия код a е равно на 15, b=15, но c е равно на адреса на променливата a, който примерно е 0x22ff74.
Това е всичко за референциите в c++. В следващия урок ще ви покажа повечко за дереференциите. Не карам уроците много-много под ред, тъй като трябва да покажа още доста неща преди референциите като основни математически операции, цикли, условни оператори.

C++ – структура на една програма

0

Ето първо малко код

#include <iostream>
using namespace std;
int main ()
{
int a,b;
cout < < „Vuvedi stoinost za a \n“;
cin >> a;
cout < < „Vuvedi stoinost za b \n“;
cin >> b;
cout < < a + b << endl;
system(„pause“);
return 0;
}

Сега ще обясня ред по ред:
#include <iostream> – инклудваме библиотеката iostream – която поддържа функциите cin и cout (за въвеждане и изкарване на информация. вход и изход.). Примерно можем да добавим само библиотеката ostream. Така ще можем да използваме функията cout. Можем също да инклудем и библиотеката istream. Така ще можем да използваме функцията cin.
В c++ има още много библиотеки и в зависимост какво искате да правите, те трябва да се включват. Включването на библиотеки е прието да става единствено в най-горният ред (по друг начин ще ви даде най-вероятно грешка).
using namespace std; – неймспейсовете (namespaces) са кутийки, които съдържат класове, функции, променливи. Ако напишете using namespace std; за всички класове, функции, променливи ще се ползва неймспейса std и няма да пишете примерно:

cout<<mynamespace:promenliva

. Отделно можете да създавате още „кутийки“, които да съдържат променливи, функции и класове и да ги викаш. Така при създаване на 2 променливи в 2 кутиийки те няма да се презапишат взаимно.
int main () { } – това е като основна функция.
int a,b; – декларираме променливите. Т.е. придаваме им какъв тип ще са (int – целочислено число) и какво име ще имат. В нашия случай ние създаваме променливите a и b, които са целочислени числа (16,0,15,-16,99999). На тези две променливи можем да придадем и друг тип – float, double, char и други. За тях може да се зададе и дали са unsigned или signed. Прието е променливите да са signed. Примерно ако a е signed int, то тази промелива може да обхваща числа от -2,147,483,648 до +2,147,483,648. Ако обаче е unsgined ще обхваща числа от 0 до 4,294,967,295. Внимавайте какви типове данни задавате на вашите променливи. Unsigned типовете заемат 2 пъти повече памет от signed. Ако числата ще са малки използвайте short int и т.н.
cout < < „Vuvedi stoinost za a \n“; – изкарва информация в програмата. Примерно:

cout << „Hello World!“ << „This is my first c++ program \n“;
Можем да го запишем и директно
cout << „Hello World! This is my first c++ program \n“;
\n означа нов ред.
cout << „Hello World! This is my first c++ program \n“;
е еквивалентно на
cout << „Hello World! This is my first c++ program“<<endl;

cin >> b; е за въвеждане на информация от потребителя. Примерно при изпълнение на този код от нас ще се иска да въведем число за b и да натиснем enter за да продължи изпълнението на програмата.
system(„pause“); – този ред означава, че програмата няма да се затвори автоматично при изпълнение.
return 0; – връща 0. Т.е. това е краят на програмата!
Е разгледайте кода, посетете официалния сайт на c++, има и доста онлайн уроци! Учетете и се развивайте!

Въведение в C++

Какво е c++?
C++ е език за програмиране от трета генерация.
Защо да изберете c++ ?
Защото пишейки на c++ ще се научите наистина да разбирате що е програмиране и какво представлява. Пишейки на c++ вие ще научите и повече за hardware-a – как рабооти, кое за какво. C++ е както базов, така и език за много напреднали. Т.е. на c++ можете да направите всичко, но за някои неща с други езици ще се справите по-бързо. И нещо по-интересно: PHP е писан на C (като c++ но минуси – по-малко възможни парадигми, проблеми с неймспейсове и т.н.), а facebook ще бъде пренаписан на c/c++ за да работи още по-бързо. Пишейки на c++ вие имате директен достъп до hardware-a на даден компютър и можете да се възползвате от всичката памет!
Ако сте писали на друг език php, java, pascal, basic или там квото друго можете да сте напипали през годините, то ще ви е по-лесно да работите на c++, особено ако сте писали на java макар и моделът малко да се различава.
Първоначално ще ви покажа една проста програмка за въвеждане на 2 числа от клавиатурата и връщане на техния сбор

#include <iostream>
using namespace std;
int main ()
{
int a,b;
cout < < "Vuvedi stoinost za a \n";
cin >> a;
cout < < "Vuvedi stoinost za b \n";
cin >> b;
cout < < a + b << endl;
system("pause");
return 0;
}

Това е една проста програмка. Най-вероятно нищо няма да разберете, но ви уверявам, че след няколко урока ще усвоите добре някои от основните неща в c++.
Само да спомена като допълнение. C++ се изучава в голяма част от училищата и в повечето университети. Така че е във ваш плюс да го научите :)

Хеширане на пароли

1

Ако вие сте начинаещ програмист, ако вие искате да се развивате, то този пост може да се окаже полезен за вас. Защо да хешираме паролите и какво всъщност е хеширането. Най-просто казано хеширането е преобразуването на даден стринг в друг по сложен или не чак толкова сложен математически модел. Защо да го правите? Защото ако някой се добере до вашата база данни и открадне всички пароли в чист вид, имейли, никове, то биха станали много бели – крадене на акаунти, онлайн сметки, имейли и какво ли още не. Когато една парола е хеширана, да се върне обратно е изключително трудно. Особено в нея, ако има някакви специални знаци от рода на $ / * + – ! ? \ & : ; | ‘ “ схващате идеята :) В днешно време разбирането на един прост хеш стринг е изключително лесна задача – брют форс или пък рейнбоу таблици. Т.е. имат ви всички хешове, сравняват в таблица с милиони записи от хешове, при познаване на само един хеш стринг всичко друго става много по-бързо – т.е. бързо ще се доберат до останалите пароли. Тези рейнбоу таблици за предназначени главно за md5 хеширане. Разбира се вие можете да си създадете свои начини за хеширане на паролите, но те със сигурност ще могат да се разбият изключително лесно от някой добър математик. Малко инфо за md5: MD5 е 128 битово хеширане на низ, който бива превърнат в 32 символен стринг от числа и букви. Друг вид хеширане е SHA1 (както и SHA0, SHA2 и в бъдеще SHA3) – то е 160 битово и е значително по-сигурно. При sha1 хеширането рейнбоу таблиците автоматично отпадат, но все още се ползва рядко.
Таааа как да си хешираме паролите? Аз лично ползвам md5, понеже ми върши перфектна работа, при md5 хеширането освен парола използвам и сол. Какво е сол – прибавен стринг към паролата. Така хеша става още по-труден за разбиване. Препоръчително е този стринг да е сравнително дълъг и да съдържа множество различни знаци – числа, букви и специални знаци.
Пример:
$salt=“ReallyLongString|:;.,<>/@$&^*()_=+-*/\!“;
$hash=md5($salt.$pass);
Идеята е да знаете солта за да можете да подсигурете успешното влизане на юзъра в системата. Солта може да е неговото име, време на регистрация, имейл или каквото друго се сетите.
Дано съм ви бил полезен :)

Вземане тип на изображение / image type php

0

Тъй като сега имам проект, в който трябва да се работи повече със снимки – да се копират, преместват, създават, водни знаци, thumb размери, се наложи естествено да знам какъв е техният тип – jpeg, png, gif, bmp.
Аз съм малко тъп програмист от време на време и първоначално написах нещо такова.
if (end(explode('.', $name)) == 'png') {
$newimg = imagecreatefrompng($pic);
} elseif (end(explode('.', $name))== 'gif') {
$newimg = @imagecreatefromgif($pic);
} elseif (end(explode('.', $name)) == 'bmp') {
$newimg =imagecreatefromwbmp($pic);
} else {
$newimg = imagecreatefromjpeg($pic);
}

И някои си викате – е ко, бачка. И тогава идва проблема, когато някой тръгва да качва снимка от друг сайт, където картинката е от рода : imagnamee.jpeg?asd=asdasa или нещо друго. Тогава тръгват сумати и грешки.

Тогава си викам – еми тогава ще съкратя. Какво може да се случи…

if (substr(end(explode('.', $name)), 0, 3) == 'png') {
$newimg = @imagecreatefrompng($pic);
} elseif (substr(end(explode('.', $name)), 0, 3) == 'gif') {
$newimg = @imagecreatefromgif($pic);
} elseif (substr(end(explode('.', $name)), 0, 3) == 'bmp') {
$newimg = @imagecreatefromwbmp($pic);
} else {
$newimg = @imagecreatefromjpeg($pic);
}

Всичко работи естествено. Този проблем го няма! И тогава идва картинка, чието име е image.jpeg, но реално е png. Някой просто си я е променил така. Тогава пак грешки.

И в крайна сметка имало готово решение, което спестява доста главоболия, а имено функцията getimagesize, която връща в масив със съдържание – височина, ширина, битс, майм тайп на снимката :)


$picinfo=getimagesize($pic);

// Сега викаме широчина
echo $picinfo[0];
//сега викаме височина
echo $picinfo[1];
// сега викаме тип
echo $picinfo['mime'];
// Ще върне image/jpeg примерно.

Go to Top