C, PHP, VB, .NET

Дневникът на Филип Петров


Архив за март, 2015

* Автоматична автентикация с cookie чрез token

Публикувано на 20 март 2015 в раздел ОСУП.

В предишните примери, в които показвахме автентикация с cookie, ние записвахме името и паролата в това cookie. Основен проблем на първоначалното решение беше, че ги записвахме като най-обикновен текст. В този случай хакер може да открадне бисквитката и моментално да разбере името и паролата на човека. Първоначалното решение на проблема, което предложихме, беше да се криптират със симетричен алгоритъм за криптиране (напр. aes256-cbc) с много дълъг (хардкоднат в приложението ни, или пък защо не – записан в базата от данни и различен за всеки клиент) ключ. В тази статия ще покажем една изцяло различна концепция – няма да записваме име и парола в бисквитката, а вместо това ще записваме уникален token в базата от данни, с който ще автентикираме потребителите. За основа на кода ще използваме този осъвременен вариант на нашата автентикационна система вместо оригиналния пример (въпреки, че ще забележите, че освен key straightening и по-надеждни хеш алгоритми, като цяло кодът е еквивалентен на оригиналния). Оригиналните статии за cookies (1, 23) бяха писани преди да покажем техниките за съхранение на пароли в база от данни. Именно затова в тази статия ще обвържем двете техники в един общ автентикиращ стрипт. Прочети още…

.

 


* Упражнение 2, 2015

Публикувано на 18 март 2015 в раздел ОСУП.

В това упражнение показваме login форма. Паролите са хеширани със salt (уникален ключ за всеки потребител в базата) и pepper (един общ salt в кода). Прочети още…

.

 


* Статични методи на клас Stream

Публикувано на 16 март 2015 в раздел ПИК3 Java.

В тази статия ще разгледаме статичните методи на клас Stream. Ще покажем и два начина за генериране на безкраен поток – чрез Supplier и чрез метод iterate.

Примерите с код, които ще опишем по-долу се надграждат един-друг. В началото трябва да добавите java.util.function.*, java.util.*, java.text.* и java.util.stream.*. Прочети още…

.

 


* Монади с Java 8 Stream

Публикувано на 16 март 2015 в раздел ПИК3 Java.

Във функционалното програмиране понятието „монада“ означава изчисление, което се провежда в поредица от стъпки. Това може да са вержини операции или поредица от операции създадена чрез генератори на функции (примери и за двете показахме по-рано). В тази статия ще се фокусираме върху едно от сериозните нововъведения в Java 8 – клас Stream, чрез който могат да се реализират монади върху списъци и масиви. Още в началото трябва да се отбележи, че под „Stream“ нямаме предвид познатите InputStream и OutputStream, а един изцяло нов клас, който се помещава в пакета java.util.stream. Прочети още…

.

 


* Генератори на функции (Currying) в Java 8

Публикувано на 14 март 2015 в раздел ПИК3 Java.

Ако имаме една функция от няколко входни параметри, която като резултат връща друга функция с по-малко параметри, ще казваме, че имаме „генератор на функции“. Терминът на английски се нарича „currying“ и е важен за функционалното програмиране. Нека разгледаме един пример за генератор на функция, който е написан на по-стара версия на Java (<=7). Нарочно няма да използваме функционалните интерфейси, които са налични в Java 8, а ще си дефинираме сами такъв: Прочети още…

.

 


* Шеста нормална форма

Публикувано на 14 март 2015 в раздел Бази от Данни.

Шеста нормална форма (6НФ) е предложена през 1990 г. от Кристофър Дейт с цел да бъдат разрешени проблеми с дублиране на информация при т.нар. „времеви масиви с информация“ (temporal data). Става въпрос за таблици, в които записваме информация за настоящи и предишни варианти на дадени записи. Нека например разгледаме следната таблица: Прочети още…

.

 


* Затваряния (Closures)

Публикувано на 12 март 2015 в раздел ПИК3 Java.

Един интересен момент при писането на локални класове е свързан с достъпа до променливи и обекти, които са извън блока дефиниращ локалния клас. Оказва се, че локалните класове (и анонимните в частност) имат достъп до локални променливи и референции към обекти, които са извън техния обхват. Това важи също така и за новия по-модерен вариант с ламбда изрази в Java 8 (те са анонимни класове в крайна сметка). Има обаче едно сериозно ограничение – променливите или референциите трябва да са final. Нека дадем един първи елементарен пример: Прочети още…

.

 


* Вградени функционални интерфейси

Публикувано на 11 март 2015 в раздел ПИК3 Java.

В Java 8 има една поредица от вградени функционални интерфейси, които имат важна роля при използването на ламбда изрази в библиотечните функции. Използването на тези интерфейси е силно насърчително (вместо създаването на собствени еквивалентни такива). В предишната статия вече говорихме за добре познатите Comparator, ActionListener и Runnable. Сега ще обърнем внимание на някои от новите интерфейси, които идват с Java 8. Прочети още…

.

 


* Методи по подразбиране

Публикувано на 07 март 2015 в раздел ПИК3 Java.

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

.

 


* Ламбда изрази

Публикувано на 06 март 2015 в раздел ПИК3 Java.

Ламбда изразите са функционалност, която е дълго чакана в Java. Появява се с версия Java 8 и е първата крачка към добавяне на… нека не казваме „елементи“, а по-скоро „еквиваленти“ на функционално програмиране в езика. При положение, че един от основните конкуренти на Java – .Net framework – ги поддържа още с версия 3.5 от 2007 г., може да се каже, че от Oracle (Sun) са доста закъснели. Разбира се това си има и причина – до известна степен ламбда изразите нарушават основната философия на абстрактния модел на интерфейсите в Java (за това няма да пишем сега, а в следваща статия по-подробно). Тук ще разгледаме общата философия на ламбда изразите и начина на работа с тях. Прочети още…

.