В яваскрипт-движках браузеров, есть одна замечательная особенность: когда мы создаем елемент img и присваиваем его свойству сорс какой-нибудь урл, то браузер сразу начинает загружать эту картинку, не дожидаясь вставки этого елемента в страницу. Поэтому слайдер может всегда пользовать одну картинку, которой будет меняться сорс, потому что при его инициализации будут созданные холостые дом-элементы, что позволит браузеру уже иметь в кеше эти картинки, и появление этих урлов в единоличной картинке приведет к тому, что изображение возьмется из кеша, а не загрузиться из сервера.
пятница, 23 марта 2012 г.
среда, 21 марта 2012 г.
понедельник, 19 марта 2012 г.
Методы по работе с классами обьектов
class C
end
class B<C
end
class A<B
end
a.class.ancestors.include?(C) # true
b.respond_to?('class') # true
a.superclass == b.class # ERROR only class object responds to .supperclass
A.superclass == B # true
Ярлыки:
Ruby
Процесс проведения безналичной оплаты
В безналичной оплате принимают участие 5 сторон:
- The cardholder - держатель карты, он же покупатель.
- The card issuer - эмитер карты, банк выступающий на стороне покупателя.
- The merchant - продавец.
- The acquirer, and - эквайер/аквизитор, банк представляющий сторону продавца, который имеет какой-то терминал на стороне клиента способен принять данные из карты покупателя.
- The card Association - Visa, MasterCard и т.п.
Ярлыки:
Payment Systems
Почему замочек может не отображаться для сайтов под https
Вполне реальная ситуация, когда на самом деле сайт передает данные по защищенному соединению, но браузере не показывает в адрессной строке замочек, символизирующий защищенное соединение.
Это возможно в том случае, если:
1. На странице присутсвуют ресурсы (картинки, скрипты, стили, медиа-файлы), которые хостятся на серверах с незащищенным соединением.
2. На сайте присутсвуют фреймы отображающие контент с северов с незащищенным соединением.
Это возможно в том случае, если:
1. На странице присутсвуют ресурсы (картинки, скрипты, стили, медиа-файлы), которые хостятся на серверах с незащищенным соединением.
2. На сайте присутсвуют фреймы отображающие контент с северов с незащищенным соединением.
Ярлыки:
https
воскресенье, 18 марта 2012 г.
RASP
- Debugging is a fact of life!
- Read the error message. Really read it."
- Ask a colleague an informed question."
- Search using StackOverflow, a search engine, etc. "
- Especially for errors involving specific versionsof gems, OS, etc."
- Post on StackOverflow, class forums, etc.
- Others are as busy as you. Help them help you by providing minimal but complete information"
Ярлыки:
Programming mottoes
суббота, 17 марта 2012 г.
Ruby tools
gem -- пакетный менеджер руби. Аналог apt-get и тому подобному, только вот устанавливает он пакеты (модули с конкретным функционалом) в руби среду.
Обысно пакеты билдяться из файлов .gemspec, это файлы на языке YAML, на нем описано информацию о пакете, а также файлы которые нужно установить. Также можно сбилдить пакет непостредственно на языке руби, это обычно применяется в сязке с рейк.
bundle - Ruby Dependency Management. Сначала меня немного смутило, зачем их два? Первый вроде как устанавливает указанный пакет в глобальноем место. А этот устанавливает все что указано в GEMFILE, который находится в директории приложения, и устанавливаются пакеты не в гловальное место, а чаще всего под поточное приложение. Так все приложения на сервере работают со своими версиями библиотек. Вот так в RoR устанавливаеются в поддиректорию приложения:
понятное дело нужно находится в директории приложения где находится GEMFILE и GEMFILE.lock, а также директория vendor.
Сначала в нулевом состоянии приложения мы создаем файл GEMFILE, в котором указываем какие джемы мы хотим использовать, потому выполняем "бандл инстал", и эта утилитка создает файл GEMFILE.lock, в котором записывает точные пакеты и версии которые были установлены. Теперь этот второй файл мы в обязательном порядке добавляем в систему контроля версий, и разработчики на других машинах, загрузив приложение и выполнив "бандл инстал" получаеют точно те же верисии пакетов, что были установлены на машине "первого" разработчика(потому что бандл в первую очередь ищет GEMFILE.lock, и только в случае его отсутвия находит просто джемфайл и если там в списке не указаны версии пакетов, то устанавливает последние). Это обеспечивает совместимость между всей группой разработки.
Так лучше устанавливать на девелоперской машине:
Обысно пакеты билдяться из файлов .gemspec, это файлы на языке YAML, на нем описано информацию о пакете, а также файлы которые нужно установить. Также можно сбилдить пакет непостредственно на языке руби, это обычно применяется в сязке с рейк.
bundle - Ruby Dependency Management. Сначала меня немного смутило, зачем их два? Первый вроде как устанавливает указанный пакет в глобальноем место. А этот устанавливает все что указано в GEMFILE, который находится в директории приложения, и устанавливаются пакеты не в гловальное место, а чаще всего под поточное приложение. Так все приложения на сервере работают со своими версиями библиотек. Вот так в RoR устанавливаеются в поддиректорию приложения:
bundle install --path vendor/bundle
понятное дело нужно находится в директории приложения где находится GEMFILE и GEMFILE.lock, а также директория vendor.
Сначала в нулевом состоянии приложения мы создаем файл GEMFILE, в котором указываем какие джемы мы хотим использовать, потому выполняем "бандл инстал", и эта утилитка создает файл GEMFILE.lock, в котором записывает точные пакеты и версии которые были установлены. Теперь этот второй файл мы в обязательном порядке добавляем в систему контроля версий, и разработчики на других машинах, загрузив приложение и выполнив "бандл инстал" получаеют точно те же верисии пакетов, что были установлены на машине "первого" разработчика(потому что бандл в первую очередь ищет GEMFILE.lock, и только в случае его отсутвия находит просто джемфайл и если там в списке не указаны версии пакетов, то устанавливает последние). Это обеспечивает совместимость между всей группой разработки.
Так лучше устанавливать на девелоперской машине:
bundle install --without productionА еще лучше так:
bundle install --without production --path vendor/bundleТак у нас каждое RoR приложение имеет свои версии пакетов, не машая другим вываливая в глобальное место.
А так на продакшине:
bundle install --deployment
Если есть необходимость узнать куда же был установлен конткретный пакет, то:
bundle show [gemname]
rake - это инструмент для управления задачами. Аналог make, ant.
rack - это интерфейс между вебсервером поддерживающим руби и вебприложением написанным на руби. Он предоставляет простое апи, которое обворачивает в запросы/отвевы вебсервера, его главная цель упрощать. Его идея распростарнилась и на другие языки. Подобный интерфейс называется рек-компетибл, и он стал квазистрандартом для руби.
Вот пример рек-компетибл веб-приложение:
<
app = lambda do |env|
body = "Hello, World!"
[200, {"Content-Type" => "text/plain", "Content-Length" => body.length.to_s}, [body]]
end
run app
Ярлыки:
Ruby
Ruby Module Enumerable
Это миксин.
Имеет следующие неочевидные методы:
.chunk - возвращает ассоциативный массив, в котором находится ключ и массив элементов для которых характерен этот ключ:
Есть два специальных ключа, которые может вернуть блок ожидаемый чанком:
Имеет следующие неочевидные методы:
.chunk - возвращает ассоциативный массив, в котором находится ключ и массив элементов для которых характерен этот ключ:
[3,1,4,1,5,9,2,6,5,3,5].chunk {|n|
n.even?
}.each {|even, ary|
p [even, ary]
}
#=> [false, [3, 1]]
# [true, [4]]
# [false, [1, 5, 9]]
# [true, [2, 6]]
# [false, [5, 3, 5]]
Поскольку первый два числа массива 3,1 в чанке вернули тру, они попали в результующий массив под один ключ тру, потом только 4 попала под фолс и т.д.
А вот у нас есть файл со словарем, в котором находятся в алфавитном порядке определенные слова.
open("/usr/share/dict/words", "r:iso-8859-1") {|f|
f.chunk {|line| line.ord }.each {|ch, lines| p [ch.chr, lines.length] }
}
#=> ["\n", 1]
# ["A", 1327]
# ["B", 1372]
# ["C", 1507]
# ["D", 791]
# ...
Так в результующем массиве под ключем кода буквы находится массив слов, которые начинаются на эту букву.
Есть два специальных ключа, которые может вернуть блок ожидаемый чанком:
-
nil and :_separator specifies that the elements are dropped.
- :_alone specifies that the element should be chunked as a singleton.
Ярлыки:
Ruby
Модули руби
Модули руби - это колекция классовых/обьектных методов, которая не является классом.
Их два вида:
Их два вида:
- их вызывают как глобальные фунции. Такие модули называют неймспейсы:
Math::sin(Math::PI / 2.0)
- второй вид - миксины. Это вариант множественного наследования в руби, аналог интерфейсов Джава. Методы какбы вкрапляются в класс.
class A < B ; include MyModule ; end
– A.foo will search A, then MyModule, then B
– sort is actually defined in module Enumerable, which is mixed into Array by default"
Ярлыки:
Ruby
среда, 14 марта 2012 г.
Ruby Methods
1. Методы определяются ключевыми словами def... end. По названии понятно что метод должен принадлежать какому обьекту. Но мы можем определять метод, не заботясь о том, чтобы его окружало обьявление какого-то класса(тоесть писать функциональную программу), по той причине, что в руби все обьекты, и само приложение тоже является обьектом, поэтому обьявленные вне какого-либо класса методы просто попадают в обьет программы.
2. Методы-предикаты - это методы которые возвращают булиновое значение. В Java такие методы имеют приставку is: isEnabled. В руби же принято ставить таким методам знак вопроса в конце
3. Методы со знаком восклицания. Суть их в том, что они применяют какие-то изменения непосредственно на собственный обьект, а не на его клон который возвращается из них return-ом.
2. Методы-предикаты - это методы которые возвращают булиновое значение. В Java такие методы имеют приставку is: isEnabled. В руби же принято ставить таким методам знак вопроса в конце
if arr.empty? ... end
3. Методы со знаком восклицания. Суть их в том, что они применяют какие-то изменения непосредственно на собственный обьект, а не на его клон который возвращается из них return-ом.
Ярлыки:
Ruby
понедельник, 12 марта 2012 г.
IoC
Inversion of Control - это шаблон проектирования, который спутан с понятием(шаблоном) Dependency Injection. Последний это специфический стиль первого.
В мире ява IoC Containers являются конкурентами EJB, и поэтому часто присутсвует убеждение, что они предоставляют механизм IoC приложению в отличии от EJB. Но EJB имеют всебе больше реализаций механизма IoC, чем эти контейнеры, дело в том, что контенеры предоставляют специфический вид IoC - это DI.
Более веселое название IoC- это "принцип Голливуда": "Don't call us, we'll call you". Вместе с приходом понятия этого механизма, появляется понятие фреймворка, который в отличии от библиотеки, не просто предоставляет методы, которые можно вызывать-использовать, а некий поток приложения, с помощью хуков(или оброботчиков) к которому присоединяется ваш код, который срабатывает на определенных этапов(при возникновении событий). Так и получается, что методология перевернулась с ног на голову, когда наше приложение управляло ходом приложения, и мы сами решали когда и где вызывать опеределенные методы библиотеки. Теперь же мы подписываем оброботчики и передаем управление фрейворку(контейнеру), который сам решает, когда вызывать наш код.
В мире ява IoC Containers являются конкурентами EJB, и поэтому часто присутсвует убеждение, что они предоставляют механизм IoC приложению в отличии от EJB. Но EJB имеют всебе больше реализаций механизма IoC, чем эти контейнеры, дело в том, что контенеры предоставляют специфический вид IoC - это DI.
Более веселое название IoC- это "принцип Голливуда": "Don't call us, we'll call you". Вместе с приходом понятия этого механизма, появляется понятие фреймворка, который в отличии от библиотеки, не просто предоставляет методы, которые можно вызывать-использовать, а некий поток приложения, с помощью хуков(или оброботчиков) к которому присоединяется ваш код, который срабатывает на определенных этапов(при возникновении событий). Так и получается, что методология перевернулась с ног на голову, когда наше приложение управляло ходом приложения, и мы сами решали когда и где вызывать опеределенные методы библиотеки. Теперь же мы подписываем оброботчики и передаем управление фрейворку(контейнеру), который сам решает, когда вызывать наш код.
Ярлыки:
проектирование
воскресенье, 11 марта 2012 г.
Процесс дебагинга в Rails
Сервер нужно запустить так
Потом, если где-то в файлах руби, которые будут исполнятся при определенном запросе и там будет строка
Чтобы продолжить процесс исполнения нужно ввести команду
rails server --debuggerПотом, если где-то в файлах руби, которые будут исполнятся при определенном запросе и там будет строка
debugger, то приложение в этот момент подвиснет и в консоли запущенного сервера можно ввести p [имя переменной], что позволит нам увидеть содержимое переменной в данный момент.Чтобы продолжить процесс исполнения нужно ввести команду
continue.Выражение yield в Ruby
Разница с и без:
Итераторы - это один из способов применения yield. На место оператора yield ставится блок кода, которые решает что делать с тем или иным элемемнтом итерации, или вцелом с самим процессом итерации:
# in some other library def before_stuff ...before code... end def after_stuff ..after code... end # in your code def do_everything before_stuff() my_custom_stuff() after_stuff() end | # in some other library def around_stuff ...before code... yield ..after code... end # in your code def do_everything around_stuff do my_custom_stuff() end end |
class RandomSequence
def initialize(limit,num)
@limit,@num = limit,num
end
def each
@num.times { yield (rand * @limit).floor }
end
end
i = -1
RandomSequence.new(10,4).each do |num|
i = num if i < num
end
Ярлыки:
Ruby
Повторное использование кода через модули и через классы в Ruby
Модули предоставляют повторное использовение через поведение, а классы через наследование.
Механизм mixin:
Механизм inheritance:
Механизм mixin:
:include Enumerable - может применятся для многих разных классовМеханизм inheritance:
class A < B - может применятся только для наследников
Ярлыки:
Ruby
понедельник, 5 марта 2012 г.
Методы руби
Все методы ruby - это ничто иное, как у мение обьекта отвечать на событие с указанным методом как параметр:
my_str.length <==> my_str.send(:length)
Ярлыки:
Ruby
суббота, 3 марта 2012 г.
Обратные ссылки в RegExps
Все группы создают обратные ссылки к которым можно обращаться, это довольно трудозатратный процесс. Чтобы отключаить обратные ссылки для группы нужно пометить группу как (?: )
Ярлыки:
RegExps
Free-Spaceing Mode в регулярках
Это режим когда пробельные символы(пробелы, табы, переносы строк) игнорируются.
Считается, что /abc/ == /a b c/
Включается режим в Ruby //x
Считается, что /abc/ == /a b c/
Включается режим в Ruby //x
Ярлыки:
RegExps
single-line mode в регулярках
Иторически регулярки обрабатывали только строки, что означало смысла в символе переноса(unix: \n windows: \r\n) строки не было, поэтому точка в регулярках означает любой символ, кроме символа конца строки.
Сейчас же регулярки умеют работать даже с файлами, поэтому чтобы точка считала символ конца строки тоже с символом нужно включаить single-line mode
Во всех языках ключается этот режим /s , а вот в руби /m.
Сейчас же регулярки умеют работать даже с файлами, поэтому чтобы точка считала символ конца строки тоже с символом нужно включаить single-line mode
Во всех языках ключается этот режим /s , а вот в руби /m.
Ярлыки:
RegExps
Подписаться на:
Сообщения (Atom)