Честита Баба Марта
Здрави и живи!
… от мен и от чичо

Да си направим Coca-Cola
Ето рецептата
- 3 капки течен екстракт от листата на южноамериканския храст кока
- 85 грама лимонена киселина
- 28.3 грама кофеин
- 30 грама захар
- 9.46 литра вода
- 1.06 литра сок от лайм
- 28.3 грама ванилия
- 42.5 грама карамел
- Tайната съставка 7Х (от нея се слагат 56.7 грама на всеки 19 литра сироп):
- 227 грама алкохол
- 20 капки портокалово масло
- 30 капки лимоново масло
- 10 капки масло от индийско орехче
- 5 капки кориандър
- 10 капки масло нероли
- 10 капки канела
Това е била оригиналната рецепта. Както е известно отдавна няма ни кока ни кола.
JavaScript enclosure
Това е enclosure функцията, която използват в jQuery:
(function (window, undefined) {
// jQuery код
})(window);
Виждал съм и разширена версия на горното:
(function (window, document, undefined) {
// код
})(window, window.document);
Това защо така го правят javascript гурутата няма да пиша, но аз бих се спрял на нещо подобно
(function (window, $, undefined) {
// код
})(window, window.jQuery);
// или дори още по-разширеното:
(function (window, document, $, undefined) {
// код
})(window, window.document, window.jQuery);
защото почти във всичките ми проекти jQuery-то присъства и освен това очаквам функцията да е достъпна и със краткото име $. Това може и да не е така, ако се наложи да преправяш сайт, който използва prototype (или беше нещо друго?) и кратката форма не е свободна.
target=“_blank“ и W3C
При проверка за валидността на XHTML strict документ в сайта на W3C разбрах, че едно от правилата забранява използването на атрибута target в <a> тага, а шефа настояваше някои от линковете да се отварят в нов прозорец. Ето какво измислих:
Вместо да използвам target=“_blank“ слагам class=“blank“ и с jQuery добавям onclick event към DOM, който да отвори линка в нова страница:
$(document).ready(function () {
$('a.blank').click(function () {
window.open($(this).attr('href'));
return false;
});
});
В конкретния случай това ми костваше само 4 реда код, защото имах заредено jQuery и вече имах и $(document).ready(function () {}).
Търсене през SSL
Днес разбрах, че Гугъл пускат търсачка на адрес https://www.google.com, т.е. през SSL за да подобри „privacy“-то. Така трети страни няма да знаят какво ви вълнува в момента. Това е добре, но така или иначе това какво търсите го интересува преди всичко чичо Гугъл и той неуморно записва всичко това в огромната си база от данни. По тази причина, и ако защитата на интимните ви мисли е важно за вас, ще предложа да пробвате мегатърсачката StartPage.com. Те гарантират, че не записват нищо, а резултатите се сервират както от Гугъл така и от другите големи търсачки. Разбира се и те използват SSL. Единствения недостатък поне за мен, е че няма разделяне на резултатите по регионален признак. Т.е. ако ви интересува информация само за и от България ще се наложи да минете през google.bg.
Нова изненада от Гугъл
Гугъл имат ново лого по случай 30-годишнината от създаването на играта PacMan.

Това нямаше да е толкова голяма изненада, ако логото беше само картинка. Но този път логото може да бъде играно! Търсачката превърна първата си страница в игра на PacMan. Играта-лого ще е там 2 дни, така че играйте докато можете ![]()

Допълнение:
От Гугъл са решили, че интереса към играта е бил твърде голям за да стои само 1 ден, и затова са я поместили на адрес: http://www.google.com/pacman/ за да и се наслаждаваме по-дълго.
Цифров сертификат и Ubuntu 10.04
На старата версия на Убунту (09.10) така и не успях да си подкарам Цифровия сертификат от Спектър АД, но сега се справих за 2 минути. Сега ще отделя далеч повече време да опиша стъпките.
Използвам четец за смарт карти OMNIKEY® CardMan 6121 и смарт карта Siemens OS V 4.3 B 32K. И двете са закупени от Спектър АД, но същите се предлагат и от InfoNotary, така че стъпките за притежателите им са еднакви.
Инсталираме демон за смарт карти (четци) pcscd и диагностична програма:
# sudo apt-get install pcsc-tools
# sudo apt-get install pcscd
И още един пакет свързан с Smart Cart
# sudo apt-get install opensc
Това е!
Сега остава да импортираме веригата от сертификати на Спектър от тук http://spektar.org/certificates1.html, като за целта един по един добавяме Spektar Root CA, Spektar Universal CA, Spektar Qualified CA, Spektar NonUniversal C. За всеки сертификат Firefox визуализира прозорец подобен на този:

Аз лично маркирах и трите опции, защото не знаех точно кой от тези 4-ти сертификати за какво служи.
При инфонотари адреса от който могат да се вземат техните 4-ри сертификата е този http://www.infonotary.com/site/?p=doc_g1_2
И идва последната стъпка – добавянето на собствения сертификат, който ще се чете от смарт картата. Във Firefox -> Preferences -> Advanced -> Encryption -> Security Devices

натискаме Load и избираме следния файл: /usr/lib/onepin-opensc-pkcs11.so
Натискаме ОК и сме готови!
p.s. Забравих да спомена, че може да се наложи да се рестартира, защото pcscd не тръгва автоматично.
ufw – Ubuntu firewall
По принцип настройките на Firewall за линункс са истинско предизвикателство. За да бъде една стена ефективна са нужни огромни познания и много внимателна преценка за конкретните нужди. В замяна на това получавате най-добрата възможна защита. За жалост не съм голям разбирач, и въпреки че съм чел в интернет много за iptables, не съм стигнал до никъде. Късмет е че има и не е една и не две програми, които подпомагат писането на правила за iptables, но и при тях се налага да се отдели много време за да ги изучим, а след това се забравят много бързо. В моя конкретен случай това не ме задоволява. Така попаднах на ufw. Там нещата на повърхността са лесни и се помнят също толкова лесно.
За елементарна настройка на стената елементарни команди:
# ufw status – проверяваме сегашното състояние. В моя случай резултатът беше:
Status: inactive
Добавяне на пълна забрана за външен достъп:
# ufw default deny
Добавяне на изключение за SSH:
# ufw allow 22
Добавяне на изключение за Apache:
# ufw allow 80
И активиране на firewall-а:
# ufw enable
А сега резултата, който се вижда с ufw status verbose:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
To Action From
– —— —-
22 ALLOW IN Anywhere
80 ALLOW IN Anywhere
От това се разбира, че защитната стена е активна, записва в лог файл само важни събития, че целия изходящ трафик е разрешен, входящия е забранен с изключение на портове 22 и 80.
За натоварени сървъри може да спрем записа в лог файлове:
# ufw logging off
и т.н.
И за десерт – резултата в IPTables от тези 4-5 команди:
Chain INPUT (policy DROP)
target prot opt source destination
ufw-before-logging-input all — anywhere anywhere
ufw-before-input all — anywhere anywhere
ufw-after-input all — anywhere anywhere
ufw-after-logging-input all — anywhere anywhere
ufw-reject-input all — anywhere anywhere
ufw-track-input all — anywhere anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
ufw-before-logging-forward all — anywhere anywhere
ufw-before-forward all — anywhere anywhere
ufw-after-forward all — anywhere anywhere
ufw-after-logging-forward all — anywhere anywhere
ufw-reject-forward all — anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ufw-before-logging-output all — anywhere anywhere
ufw-before-output all — anywhere anywhere
ufw-after-output all — anywhere anywhere
ufw-after-logging-output all — anywhere anywhere
ufw-reject-output all — anywhere anywhere
ufw-track-output all — anywhere anywhere
Chain ufw-after-forward (1 references)
target prot opt source destination
Chain ufw-after-input (1 references)
target prot opt source destination
ufw-skip-to-policy-input udp — anywhere anywhere udp dpt:netbios-ns
ufw-skip-to-policy-input udp — anywhere anywhere udp dpt:netbios-dgm
ufw-skip-to-policy-input tcp — anywhere anywhere tcp dpt:netbios-ssn
ufw-skip-to-policy-input tcp — anywhere anywhere tcp dpt:microsoft-ds
ufw-skip-to-policy-input udp — anywhere anywhere udp dpt:bootps
ufw-skip-to-policy-input udp — anywhere anywhere udp dpt:bootpc
ufw-skip-to-policy-input all — anywhere anywhere ADDRTYPE match dst-type BROADCAST
Chain ufw-after-logging-forward (1 references)
target prot opt source destination
Chain ufw-after-logging-input (1 references)
target prot opt source destination
Chain ufw-after-logging-output (1 references)
target prot opt source destination
Chain ufw-after-output (1 references)
target prot opt source destination
Chain ufw-before-forward (1 references)
target prot opt source destination
ufw-user-forward all — anywhere anywhere
Chain ufw-before-input (1 references)
target prot opt source destination
ACCEPT all — anywhere anywhere
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
ufw-logging-deny all — anywhere anywhere state INVALID
DROP all — anywhere anywhere state INVALID
ACCEPT icmp — anywhere anywhere icmp destination-unreachable
ACCEPT icmp — anywhere anywhere icmp source-quench
ACCEPT icmp — anywhere anywhere icmp time-exceeded
ACCEPT icmp — anywhere anywhere icmp parameter-problem
ACCEPT icmp — anywhere anywhere icmp echo-request
ACCEPT udp — anywhere anywhere udp spt:bootps dpt:bootpc
ufw-not-local all — anywhere anywhere
ACCEPT all — BASE-ADDRESS.MCAST.NET/4 anywhere
ACCEPT all — anywhere BASE-ADDRESS.MCAST.NET/4
ufw-user-input all — anywhere anywhere
Chain ufw-before-logging-forward (1 references)
target prot opt source destination
Chain ufw-before-logging-input (1 references)
target prot opt source destination
Chain ufw-before-logging-output (1 references)
target prot opt source destination
Chain ufw-before-output (1 references)
target prot opt source destination
ACCEPT all — anywhere anywhere
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
ufw-user-output all — anywhere anywhere
Chain ufw-logging-allow (0 references)
target prot opt source destination
Chain ufw-logging-deny (2 references)
target prot opt source destination
Chain ufw-not-local (1 references)
target prot opt source destination
RETURN all — anywhere anywhere ADDRTYPE match dst-type LOCAL
RETURN all — anywhere anywhere ADDRTYPE match dst-type MULTICAST
RETURN all — anywhere anywhere ADDRTYPE match dst-type BROADCAST
ufw-logging-deny all — anywhere anywhere limit: avg 3/min burst 10
DROP all — anywhere anywhere
Chain ufw-reject-forward (1 references)
target prot opt source destination
Chain ufw-reject-input (1 references)
target prot opt source destination
Chain ufw-reject-output (1 references)
target prot opt source destination
Chain ufw-skip-to-policy-forward (0 references)
target prot opt source destination
DROP all — anywhere anywhere
Chain ufw-skip-to-policy-input (7 references)
target prot opt source destination
DROP all — anywhere anywhere
Chain ufw-skip-to-policy-output (0 references)
target prot opt source destination
ACCEPT all — anywhere anywhere
Chain ufw-track-input (1 references)
target prot opt source destination
Chain ufw-track-output (1 references)
target prot opt source destination
ACCEPT tcp — anywhere anywhere state NEW
ACCEPT udp — anywhere anywhere state NEW
Chain ufw-user-forward (1 references)
target prot opt source destination
Chain ufw-user-input (1 references)
target prot opt source destination
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT udp — anywhere anywhere udp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:www
ACCEPT udp — anywhere anywhere udp dpt:www
Chain ufw-user-limit (0 references)
target prot opt source destination
REJECT all — anywhere anywhere reject-with icmp-port-unreachable
Chain ufw-user-limit-accept (0 references)
target prot opt source destination
ACCEPT all — anywhere anywhere
Chain ufw-user-logging-forward (0 references)
target prot opt source destination
RETURN all — anywhere anywhere
Chain ufw-user-logging-input (0 references)
target prot opt source destination
RETURN all — anywhere anywhere
Chain ufw-user-logging-output (0 references)
target prot opt source destination
RETURN all — anywhere anywhere
Chain ufw-user-output (1 references)
target prot opt source destination
Ubuntu root login
Имам няколко виртуални сървъра от rackspacecloud.com на които върви Ubuntu, но от време на време добавям по още някой за различни тестове. Това са някои от началните стъпки, които предприемам за тях.
За разлика от Desktop версията на Ubuntu, тук в началото имам само root account. За да премахна възможността за root логин през SSH изпълнявам тези стъпки:
Изтеглям и инсталирам всички налични актуализации (като root)
# apt-get update
# apt-get upgrade
Добавям обикновен потребител
# adduser tzappa
Задавам парола и т.н.
Проверявам дали имам отдалечен достъп през SSH за този клиент и ако е така забранявам на root акаунта достъпа през ssh, като редактирам /etc/ssh/sshd_config
PermitRootLogin no
Рестартирам ssh
# /etc/init.d/ssh restart
Сменям паролата на root.
# passwd
Това ми се налага, защото при инсталацията на сървър в Rackspace се генерира автоматична такава и се изпраща на мейла.
Сега за достъп до системата е нужно да се влезе през SSH с обикновен потребител и чак тогава да станем root чрез
$ su -
Това са лесни и много важни стъпки за подобряване на сигурността.
Отново нарушители
Рядко срещана наглост е това да минеш над 500 м по тротоара с буса, за да си паркираш точно пред входа:
Ето го и пътя по който е минал:
Това са други двама, за които това е ежедневие, въпреки че съм им правил забележка. Държа да кажа, че не е като да няма къде да паркират (не че липсата на паркоместа е повод да се нарушава закона), но си е друго пред входа
И чичката който не се съобразява с това, че на детска площадка не е хубаво да се паркира:
И последния виден представител на „органите“ в България паркирал на тротоара, така, че да не може да се мине не само с количка, но и с липсата на такава. Затова пък добре облепил си е колата със стикери – „полиция“, „полюция“ и прочее:
Естествено това не са единствените нарушители, но тях имах желанието и възможността да снимам.









