пятница, 28 декабря 2012 г.

Понятие Layout в Liferay

Layout -- это инстанция страницы портала. Лейауты хранятся в таблице Layouts, у него есть layoutId, праймери ки (plid, который сгенерирован из ownerId and layoutId).

Бывает следующих типов:
1) Портлет -- для размещения на нем портлетов.
2) Ембедед -- как я понял ифрейм.
3) Урл -- как я понял это просто редирект.
4) Артикл -- как я понял джорнал портлет создает страницы с таким типом, если не его вставляют на лейаут, а он с админки генерит.

понедельник, 24 декабря 2012 г.

Полезные фичи гита

Автокомплит для гита
Пользователям виндоус повезло, он идет по-умолчанию. Для маководов и линуксоидов нужно соответсвенно:
cp /path/to/git/sources/contrib/completion/git-completion.bash /opt/local/etc/bash_completion.d/
cp /path/to/git/sources/contrib/completion/git-completion.bash /etc/bash_completion.d/

Если нет доступа к глабальным каталогам, то можно сделать только для себя это:
cp /path/to/git/sources/contrib/completion/git-completion.bash ~/
cat "source ~/.git-completion.bash" > ~/.bashrc 
Теперь табы нам в помощь

Можно создавать алиасы для комманд:
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD --'
Как можно догадаться гит на каждый такой алиаса применяет команду с префиксом git + {то что мы указали}. А если нам вообще нужно вызывать не гит, а какую-то другую утилиту, просто в контексте гита это логично и просто бы воспринималось? Чтобы не добавляляся префискс git, мы должны в тело команды на первом месте поставить знак восклицания:
$ git config --global alias.visual '!gitk'

Работы с удаленными репозиториями(серверами)

Когда мы дулаем клон, какого-нибудь проекта, то указанный урл, считается ремоутом с имененм origin. Мы можем получить по нем информацию
$ git remote
$ git remote -v

Если нам нужно добавить еще один удаленный сервер с которым мы работаем по данному проекту, то
$ git remote add {NEW_REMOTE_NAME} git://github.com/path/to/prj.git
Теперь наши бранчи имеют более сложные имена:

origin/master
...
NEW_REMOTE_NAME/master
...

 Для того, чтобы выбрать то, что есть в удаленке, но не делать мерджи:
git fetch [remote-name]
Если без имени, то origin по-умолчанию.

На самом деле наши гит-пуш имеет более сложную структору, чем та, что мы используем обычно, там просто подставляются поточные аргументы:
git push [remote-name] [branch-name]

Чтобы увидеть, что у нас за сервер скрывается за определенным псевдонимом - урл, что за ветки и п.п:
$ git remote show origin
Чтобы удалить или переименовать зарегистрированный удаленный сервер есть две команды:
$ git remote rename pb paul
$ git remote rm paul

Сохранить креденшиалсы в винде для гитхаба

https://github.com/downloads/anurse/git-credential-winstore/git-credential-winstore.exe

Восстановление ошибочных правок

Если забыл что-то застейджить и уже сделал комит, но не пуш, то не логично делать еще один комит, ведь было бы хорошо обьединить все это в один комит. Чтобы это сделать, делаем вот что:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

Чтобы отстейджить ошибочно застейдженный файл нужно:
git reset HEAD wrong-staged-file.ext
Чтобы сделать реверт по-свновски файла(восстановить его до прежнего состояния из поточной ревизии):
git checkout -- revert-me.ext

пятница, 21 декабря 2012 г.

git log

git log - просмотр истории постранично, Enter - смотреть следующую страницу, q - выйсти из истории
git log -N - вывести N последних комитов.
git log -p - показывать diff измененных файлов.
git log --stat - выводится для каждого комита статистика, сколько файлов было изменено, сколько строк было добавлено, сколько удалено.

git log --pretty=oneline|short|full|fuller - меняет внешний вид логов.
Но самый интересное значение pretty - это формат:
git log --pretty=format:"%h - %an, %ar : %s"
Параметр Описание выводимых данных `%H` Хеш коммита `%h` Сокращенный хеш коммита `%T` Хеш дерева `%t` Сокращенный хеш дерева `%P` Хеши родительских коммитов `%p` Сокращенные хеши родительских коммитов `%an` Имя автора `%ae` Электронная почта автора `%ad` Дата автора (формат соответствует параметру --date= ) `%ar` Дата автора, относительная (пр. "2 мес. назад") `%cn` Имя коммитера `%ce` Электронная почта коммитера `%cd` Дата коммитера `%cr` Дата коммитера, относительная `%s` Комментарий


Параметр Описание `-p` Выводит патч (заплатку/diff) внесенный каждым коммитом. `--stat` Выводит статистику по файлам измененным в каждом коммите. `--shortstat` Отображает только строку с changed/insertions/deletions от вывода команды `--stat`. `--name-only` Выводит список измененных файлов после каждого коммита. `--name-status` Выводит список файлов вместе с информацией о добавлении/изменении/удалении. `--abbrev-commit` Выводит только первые несколько символов контрольной суммы SHA-1 вместо всех 40. `--relative-date` Выводит дату в относительном формате (например, “2 недели назад”) вместо использования полного формата даты. `--graph` Выводит ASCII граф истории ветвлений и слияний рядом с выводом лога. `--pretty` Выводит коммиты в альтернативном формате. Параметры включают oneline, short, full, fuller, и format (где вы можете указать свой собственный формат).


Опция Описание `-(n)` Показать последние n коммитов `--since`, `--after` Ограничить коммиты теми, которые сделаны после указанной даты. `--until`, `--before` Ограничить коммиты теми, которые сделаны до указанной даты. `--author` Показать только те коммиты, автор которых соответствует указанной строке. `--committer` Показать только те коммиты, коммитер которых соответствует указанной строке.

Вы также можете отфильтровать список коммитов по какому-либо критерию поиска. Опция --author позволяет фильтровать по автору, опция --grep позволяет искать по ключевым словам в сообщении. (Заметим, что, если вы укажете и опцию author, и опцию grep, то будут найдены все коммиты, которые удовлетворяют первому ИЛИ второму критерию. Чтобы найти коммиты, которые удовлетворяют первому И второму критерию, следует добавить опцию --all-match.)

четверг, 20 декабря 2012 г.

git mv

В отличии от друших систем контроля версий гит, не сохраняет связи между файлами, которые перемещаются интсументарием системы контроля версий.
Для гита это переименование, и ничего более:
$ git mv README.txt README $ git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # renamed: README.txt -> README #
И эквивалентно это этому:
$ mv README.txt README $ git rm README.txt $ git add README

git rm

git rm file - удалит файл с диска и проиндексирует его как удаленным
git rm --chached logs/\*.log - удалит файлы с индекса, но оставит на диске

git diff

git diff - посомтреть, что изменилось, но не засдейджено(не проиндрексировано)
git diff --chached (а в с 1.6 или --staged) - то, что проиндексировано

Разница между revert, reset и checkout


Given one or more existing commits, revert the changes that the related patches introduce, and record some new commits that record them. This requires your working tree to be clean (no modifications from the HEAD commit).
Note: git revert is used to record some new commits to reverse the effect of some earlier commits (often only a faulty one). If you want to throw away all uncommitted changes in your working directory, you should see git-reset(1), particularly the --hard option. If you want to extract specific files as they were in another commit, you should see git-checkout(1), specifically the git checkout -- syntax. Take care with these alternatives as both will discard uncommitted changes in your working directory.

среда, 19 декабря 2012 г.

JMS

Java Message Service - посредник для обмена сообщениями между приложениями(бинами) в платформе Java EE. Для обмена используется две архитектуры:

Модель «от пункта к пункту» характеризуется следующим:
  • Каждое сообщение имеет только одного адресата
  • Сообщение попадает в «почтовый ящик», или «очередь» адресата и может быть прочитано когда угодно. Если адресат не работал в момент отсылки сообщения, сообщение не пропадёт.
  • После получения сообщения адресат посылает извещение.
Модель «издатель-подписчик» характеризуется следующим:
  • Подписчик подписывается на определённую «тему»
  • Издатель публикует своё сообщение. Его получают все подписчики этой темы
  • Получатель должен работать и быть подписан в момент отправки сообщения
"Взято с вики"

понедельник, 17 декабря 2012 г.

Batch application

Бывают очень тяжелые операции:
-  какие-нибудь транзакции, на которые паралельн с которыми нужно выполнить другие операции; большие вычислительные операции и т.п;
- тяжёлые периодические операции( месячные отчеты например);
- синхронизация данных с какими-нибудь внешними данными (тут происходит много валидаций, подгонки формата и т.д.).
Для этого существут Job scheduler, в который через опеределенный интерфейса(Command line interface, EJB interface, Web-services interface, Job management console) мы указываем, какое приложение и с какими данными выполнить, Batch container - в нем выполняются приложения, есть база планироващика и база прилижения, они могут быть обьеденены. Часто приложения находятся на нодах, так называемого грида, за одну транзакцию побочно может быть нужно выполнить что-нибудь на десятках нодах.

воскресенье, 16 декабря 2012 г.

JMX

Java Management eXtentions--технология, которая позволяет создавать внешне управляемые  и расширяемые системы. Система всегда состоит из MBeanServer, из множества MBeans(нескольких типов Dinamic, Standart etc), и JConsole. MBean -- Managed Bean.

В этой системе условно выделяют три слоя.
Probe level -- тут находятся наши управляемые бины
Agent level -- тут находится MBeanServer
Remote Management level -- тут находятся Connectors ( к такому конектору и подключается JConsole, можно также написать что-то свое, чтобы подключаться управлять бинами), и Adpters (это товарищи, которые позволяют подключаться по любым протоколам и использовать нестандратное апи для управления бинами)

JMX является стандартом для виртуальной машины из версии 1.5, поэтому MBeanServer, конекторы/адаптеры, и JConsole входят в HotSpot по-умолчанию,

Чтобы управлять нашим приложением, мы должны для желаемых бинов определить интерфейсы вида {BeanName}MBean, в интерфейсе указать методы, которыми мы хотим чтобы управлялся наш бин. Потом в приложении получить инстанцию MBeanServer  и зарегистировать наш бин в нем.
MyBean bean = new MyBean();//implements interface MyBeanMBean
javax.management.MBeanServer mbs = java.lang.management.ManagementFactory.getPlatformMBeanServer();
javax.management.ObjectName name = new ObjectName("com.mypackage:type=MyBean");
mbs.registerMBean(neab, name);
Мы JConsole сможем в графическом режиме пользоваться указанными в интерфейсе методами.

пятница, 14 декабря 2012 г.

Бранчевание

В гите бранч - это легковестный обьект-ссылка, на какой-то комит. Поэтому в гите бранчевание такое скоростное, они ничего не копирует и не дублирует.
Создание ветки:
git branch {branch_name}
git checkout {branch_name}
или
git checkout -b {branch_name}


Любую таску удобнее всего делать в отдельном браче: Допустим в главном бранче мы имеем следующую историю разработки a-b-c Создали ветку:
git checkout -b bag1
Пофиксили, закомитить еще никто-ничего не успел в главную ветку, значит:
git checkout master
git merge bug1
На выходе красивая история a-b-c-d главной ветки.
Если же кто-то успел что-то закомитить(стало a-b-c-E), и мы не хотели бы делать автомердж и раздваивать историю, то:
git checkout master
git pull
# ага увидели что были комиты
git checkout bug1
git rebase master # пересадить историю изменений a-b-c-E
git checkout master
git merge bug1
Выходит, что на выходе получилась итория мастера a-b-c-E-D, D именно большая потому-что комит получается дублируется.

Если мы не создавали новую ветку и не успели сделать комит, а кто-то уже комитов наделал, то удобнее пользоваться стешем, который прячет изменения, а потом заливает их патчем не портя историю мерджем.

git stash

git stash : добавить текущие незакоммиченные изменения в стек изменений и сбросить текущую рабочую копию до HEAD'а репозитория;
git stash list : показать все изменения в стеке;
git stash show : показать последнее измененеие в стеке (патч);
git stash apply : применить последнее изменение из стека к текущей рабочей копии;
git stash drop : удалить последнее изменение в стеке;
git stash pop : применить последнее изменение из стека к текущей рабочей копии и удалить его из стека;
git stash clear : очистить стек изменений.

Применение стратегии "использовать их код" в случае конфликта

git pull -Xtheirs

Слить проект с удаленного репозитория

git clone -b branchname https://github.com/path/to/project.git local-folder

Если на удаленный сервер улетела кака

Если были сделаны комиты, которые можно восстановить, то делаем смело следующие операции:

git pull
git reset --hard {revision_hash}
git push -f


Если же после нас накомитило кучу людей кучу полезных фишек, тут уже труба... Нужно просто договариваться и всех останавливать и исправлять свою ошибку с принятием отвественности.
Если же мы мерджанули не нужное мы можем этот мерж удалить, делаем мы это так:
git revert -m 1 {revision_with_merge_hash}

среда, 12 декабря 2012 г.

Стадии кода

Итак после того как мы сделали изменения нашего кода, код может попасть в стейджинг простанство, это называется индексирование. Чтобы измения туда попали(добалвенные новые файлы, удаленные старые, редактированные старые) мы выполняем команду:
git add path/to/file
Если в svn это мы метим файлы, которые хотим начать отслеживать системой контроля версий, то в гите это не то, это мы переводим файл в режим стейджинг пространства, то есть это нужно делать не только с новыми файлами, которые мы пока не трекаем, а и с уже отслеживаемыми, но которые мы отредактировали.
Састейдженнные файлы мы можем отправить в локальный репозиторий комитом.
git commit -m "My msg"
Поскольку если изменний было сделанно очень много, и добавлено, и удалено, и отредактировано, то это может быть слишком утомительно проработать каждый файл git add, мы можем использовать команду комита с ключем, который означает все изменений перед комитом застейджить(правки, новые, удаленные)
git commit -a -m "My msg"

Скопировать содержимое файла в буффер

clip < /path/to/file

вторник, 11 декабря 2012 г.

Чтобы скомпилированные файлы идеи сразу попадали в томкат

Если у нас настроен томка через сервер томка идеи, то нужно в vm options указать -Dfile.root .

Создать локально новый бранч и залить его в удаленный репозиторий


Залить на удаленный репозиторий
git push origin MY_NEW_BRANCH

Удалить бранч

git branch -D BAD_BRANCH

Основные "кодовые" имена git

master -- основная ветка разработки
HEAD -- последний комит поточной ветки
origin -- так называется по-умолчанию удаленный репозиторий

Откаться до какого-то конкретного комита(чтобы позорный не был видет)

git reset --hard 13d42dd1f65_COMMIT_HASH_CODE_b35a2319d

Теги в git


Тег(а точнее лекоговесный) в гите, это алиас на какой-то комит.
Если мы сливаем тег, то у нас нет поточного бранча.
Чтобы понять что за тег у нас слит нужно:
git describe --tags

Чтобы увидеть какие у нас создано локальные теги(список локальных тегов):
git tag
Если у нас очень много тегов, то логично из немного фильтрануть
$ git tag -l 'v1.4.2.*'

Теги бывают двух типов:

  • lightweight 
  • annotated

Легковесный тег - это то, что я описал в самом начале, это как бранч, который не имеет дальнейших комитов. Аннотированный - это уже отдельный обьект, который хранится в базе гита, у него своя чексумма, имя, имя комитера, емейл, дата, он также подсисан и провалидирован с помощью GNU Privacy Guard (GPG).
Чтобы создать легковестный, нужно просто:
$ git tag {NAME_OF_LIGHTWEIGHT}
Как мы видим мы к нему не вяжем не отдельного сообщения ничего, у нас просто на чексумму конкретного комита привязывается имя.
Если мы попробуем посмотреть данные этого тега, то увидим данные именно комита, на который он был применен:
$ git show v1.4-lw
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon 
Date:   Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'


Чтобы сделать аннотированный тег нужно:
1) Закомитить наши измения и запушить куда-то
2) Создать тег на этот комит (ключ "а" именно и указывает, что это аннотированный тег):
git tag -a {TAG_NAME} -m "Comment"
Если мы делаем тег на комит, который уже не в HEAD, то нужно еще и указать хеш-код комита
git tag -a {TAG_NAME} -m "Comment" {9fceb02HASH_CODE}
3) Запушить тег:
git push --tags
# OR
git push {remote-name} --tags
Но эта команда запушит все наши локальные теги, если нам не нужны они все на удаленном сервере мы можем запушить конкретный:
git push origin {concrete-tag-name}
4) Перепроверить появился ли он в списке существующих тегов:
git tag
Чтобы увидеть всю информацию аннотированного тега нужно:
$ git show {ANNOT_TAG}



Чтобы развернуть наш тег на другой машине нужно:
git fetch
git checkout NAME_OF_TAG

понедельник, 10 декабря 2012 г.

Мониторить логи с нескольких файлов одновременно



> tail -n100 -f  /path/to/logs/* | grep "^ERROR:\|^Cause by"

Ключевые моменты:
* -- мониторить все файлы с логами
\| -- оператор или
^ -- начало строки

Переключиться на локальную другую ветку



>git branch
Получим список локальных бранчев:



>branch_1
  branch_2
  branch_3


Теперь в принципи само переключение:

git checkout branch_2

Залить комит из другой ветки в поточную (cherry-pick)

git cherry-pick dfgkdjhfgkjdhfHESHCODE_OF_NEEDED_COMMIT_FROM_NEEDEDBRANCHsdfs
git cherry-pick BRANCH_WHERE_LAST_COMMIT_NEEDED
git cherry-pick TAG_NAME

Git alternative for svn revert



git checkout -- path/to/file

понедельник, 3 декабря 2012 г.

Определение библиотек тегов типа *.tag не через tagdir, а через uri

web.xml
<?xml version="1.0"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
 version="2.4">
    ...
    <jsp-config>
        <taglib>
            <taglib-uri>http://myurl.com/mytags</taglib-uri>
            <taglib-location>/WEB-INF/tld/mytags.tld</taglib-location>
        </taglib>
    </jsp-config>
</web-app>

WEB-INF/tld/mytags.tld:
<?xml version="1.0" encoding="ISO-8859-1"?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">

    <tlib-version>1.0</tlib-version>
    <short-name>mytags</short-name>
    <uri>http://playtech.com/gala-tags</uri>


    <tag-file>
        <name>registrationFormPasswordRow</name>
        <path>/WEB-INF/tags/registration/registrationFormPasswordRow.tag</path>
    </tag-file>

    <tag-file>
        <name>registrationFormRow</name>
        <path>/WEB-INF/tags/registration/registrationFormRow.tag</path>
    </tag-file>

    <tag-file>
        <name>validationResult</name>
        <path>/WEB-INF/tags/registration/validationResult.tag</path>
    </tag-file>

</taglib>

понедельник, 26 ноября 2012 г.

Как проинсталировать Java EE на виндоувсе

Почему-то не находится sdk, для этого нужно явно указать пусть к нему при запусте инсталятора:


>java_ee_sdk-6u4-jdk7-windows-x64-ml.exe -j "C:/Program Files/Java/jdk1.7.0_09"

суббота, 17 ноября 2012 г.

The Essentials of Filters

Это резервная копия статьи из http://www.oracle.com/technetwork/java/filters-137243.html


четверг, 15 ноября 2012 г.

Spring MVC когда передача в модели параметра не простого типа

<form:form modelAttribute="userDataUpdatingSettings" id="orgSettingsForm" action="${userDataUpSave}" method="POST">
...
    <form:select path="email.condition" items="${attributeConditionValues}" />
    ...
И так userDataUpdatingSettings это объект нашего бина, email это поле бина, а email.condition это поле поля email, но оно не элементарного типа, а классового.
Так мы получим ексепшин при попытке сохранить это поле в модель.

среда, 14 ноября 2012 г.

Получение вебконтента

Можно тегом.
<liferay-ui:journal-article articleId="${preferences.headerWebContentId}" groupId="<%= ((ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY)).getPortletGroupId() %>" />

А можно через cервис:
String str = article =JournalArticleLocalServiceUtil.getArticleByUrlTitle(groupId, "webcontent title");


четверг, 25 октября 2012 г.

Как мы можем передавать properties при запуске приложения

* Первый самый известный способ это через файлы *.properties, которые мы читаем из нашего приложения

* Через параметры командной строки
java -Dmy.property=myPropertyValue -Dmy.property2=myPropertyValue2 AppName

* Добавлением параметра в системную переменную JAVA_OPT

set "JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF8 -Duser.timezone=GMT -Xmx1024m -XX:MaxPermSize=256m"

среда, 24 октября 2012 г.

org.springframework.util.ReflectionUtils

Волшебная штука позволяет например перебрать все поля класса:


ReflectionUtils.doWithFields(MyClass.class, new ReflectionUtils.FieldCallback() {
      @Override
      public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
        String fieldVale = (String) field.get(null);
        MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
        //..other code
      }
    });

вторник, 23 октября 2012 г.

lambdaj

http://code.google.com/p/lambdaj/

Библиотека, которая предоставляет как-будто поддержку передачи функций в параметры в джава. Дает возможность исключить перебор в циклах, применять красивое фильтрирование и т.д.

понедельник, 22 октября 2012 г.

Кастомные поля в лайфрее

Их можно создавать для юзера и для организаций. Они еще называются Expandos.
Чтобы к ним обратиться из кода нужно также иметь определенные права.

String customAttr = (String)user.getExpandoBridge().getAttribute("customAttr");
Вместо строки мы можем сохранять/получать любой обьект, которые реализцет интерфейс серилизации.

воскресенье, 21 октября 2012 г.

Передача параметров в джава методы

Простые типы всегда передаются по значению.
Обьекты тоже передаются по значению, но ели внутри обьекту менять  его состояния через его методы или доступные поля, то эти измения остаются. Если же мы переприсвоели аргументу новые обьект, то с наружи сохранится все-равно предыдущий обьект.

пятница, 19 октября 2012 г.

Как вставить в документ значение поточного времени. Привязка макроса по нажатию кнопки на это.

1. Чтобы вставить время нужно Вставка->Поля->Время.  Так поточное время вставить в место, где стоит каретка.

среда, 17 октября 2012 г.

Отлючение фильтров минификатора скриптов и стилей через урл


Нужно добавить в параметры урла:

?js_fast_load=0&css_fast_load=0

понедельник, 15 октября 2012 г.

Встраивание портлеты в вебконтент

Для этого существует тег < runtime-portlet name="47" instance="4433" queryString=""/>, его вставляют в вебконтент, потом некий фильтр его находит и обеспечивает там вывод его результата.

воскресенье, 14 октября 2012 г.

Полиморфизм, два вида

Полиморфизм представлен в двух его видах:

1) Подтипы -- классический для объектно-ориентированного программирования, представлен в виде наследования, где мы можем передавать в места где ожидаются родительский тип(класс) наследников этого типа.
2) Обобщения(дженерики) -- пришел с функционального программирования, когда мы определяем что определенная функция может работать с любым типом, выполняя какие-то внутри обобщенные операции, для которых не важен тип. 

суббота, 13 октября 2012 г.

разница между полями класса определенными def и val

val - если там експрешин, то он выполняется только один раз, при создании инстранции.
def - ели тут експрешин, то он выполняется каждый раз когда, происходит обращение к полю.

пятница, 5 октября 2012 г.

Создание нового юзера и базы данных с одинаковыми именами и правами

CREATE DATABASE IF NOT EXISTS  `mydatabase` ;

CREATE USER 'username'@'hostname' IDENTIFIED BY  'password';
GRANT USAGE ON `mydatabase`.* TO  'username'@'hostname' IDENTIFIED BY  'password' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

CREATE USER 'username'@'Host.IP.X.X' IDENTIFIED BY  'password';
GRANT USAGE ON `mydatabase`. * TO  'username'@'Host.IP.X.X' IDENTIFIED BY  'password' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT ALL PRIVILEGES ON `mydatabase`.* TO  'username'@'hostname';
GRANT ALL PRIVILEGES ON `mydatabase`.* TO  'username'@'Host.IP.X.X';

пятница, 28 сентября 2012 г.

Альтернатива получения ленги из скриплета

<%@page import="com.liferay.portal.kernel.language.LanguageUtil"%>

<%= LanguageUtil.get(pageContext, "main.input.lbl.postcode") %>

среда, 26 сентября 2012 г.

FOF & HOF


First Order Functions - функции, которые принимают в аргументы простые типы и обьекты, и возвращают тоже их.
Higher Order Functions - функции, которые могут также принимать и возвращать другие функции.

Linear Recursion & Tail Recursion. В чем отличие.

Линейной рекурсией считается рекурсивный вызов функцией саму себя или другую функцию и при этом использование результата этого вызова в какой-то финальной операции, результат которой и будет результатом функции. Классический пример линейной рекурсии факториал:

def factorial(n: Int): Int =
   if (n == 0) 1 else n * factorial(n - 1)


Хвостовой рекурсией считается рекурсивный вызов функцией саму себя или другую функцию,результат которой и будет результатом этой функции, то есть результат внутреннего вызова больше не вступает ни в какую операцию. Хвостовая рекурсия это классическая подмена циклов рекурсией. Вот пример на том же факториале:
def factorial(n: Int): Int = {
    def loop(acc: Int, n: Int): Int = {
      if (n == 0) acc
      else loop(acc * n, n - 1)
    }
    loop(1, n)
}
В чем же смысл менять такое компактное определение функции на столь громоздкое? А смысл есть -- дело в том, что например в JVM есть ограничение для вызова линейной рекурсии -- это где-то 2000 итераций, после чего стек переполниться. Здесь нам и приходит на выручку хвостовая рекурсия, которая не имеет ограничения. То есть если у нас есть риск рекурсивных вызовов больше 2000, то нужно всегда применять хвостовую рекурсию.

Почему же происходит переполнение стека? Дело в том, что если результат внутреннего вызова из самой себя функции не вступает ни в какую другую операцию, то мы можем использовать тот же function’s stack frame, в случае линейной рекурсии под каждый циклический вызов создается свой фрейм.

В Scala существует возможность перестраховаться и гарантированное не создать случайно линейно рекурсии:


def factorial(n: Int): Int = {
    @tailrec // Так все ок
    def loop(acc: Int, n: Int): Int = {
      if (n == 0) acc
      else loop(acc * n, n - 1)
    }
    loop(1, n)
}

@tailrec // А так компилятор будет ругаться
def factorial(n: Int): Int =
   if (n == 0) 1 else n * factorial(n - 1)
 

Остаток от деления меньшего числа на большее

Прикольно никогда не задумывался -- но остаток от деления меньшего числа на большее, будет этим меньшим числом:)

14 % 21 == 14

суббота, 22 сентября 2012 г.

Какие обьекты определяются



ObjectDescription
accountThe user’s Account object. This object maps to the Account table in the Liferay database.
colorSchemeAn object representing the current color scheme in the theme that is being rendered by the portal.
companyThe current Company object. This represents the portal instance on which the user is currently navigating.
contactThe user’s Contact object. This object maps to the Contact table in the Liferay database.
layoutThe page to which the user has currently navigated.
layoutTypePortletThis object can be used to programmatically add or remove portlets from a page.
localeThe current user’s locale, as defined by Java.
permissionCheckerAn object that can determine--given a particular resource--whether the current user has a particular permission for that resource.
plidA portal layout ID. This is a unique identifier for any page that exists in the portal, across all portal instances.
portletDisplayAn object that gives the programmer access to many attributes of the current portlet, including the portlet name, the portlet mode, the ID of the column on the layout in which it resides, and more.
realUserWhen an administrator is impersonating a user, this variable tracks the administrator’s User object.
scopeGroupIdBy default, contains the groupId for the community or organization in which this portlet resides. If the scopeable attribute is set to true, this may contain a unique scope identifier for custom scopes, such as the page scope that was introduced in Liferay Portal 5.2, if the portlet has been configured to use a custom scope.
themeAn object representing the current theme that is being rendered by the portal.
themeDisplayA runtime object that contains many useful items, such as the logged-in user, the layout, logo information, paths, and much more. timeZone The current user’s time zone, as defined by Java.
userThe User object representing the current user.n

MVCPortlet. Сообщения после екшина

После какждого успешного екшина в портлету реализованную классом MVCPortlet, выводится в верху страницы зеленное сообщение, чтобы его убрать нужно в портлет.хмл
<init-param>
   <name>add-process-action-success-action</name>
   <value>false</value>
</init-param>


пятница, 21 сентября 2012 г.

Liferay Permissions

О правах также указано в портлетной спецификации.
В соответсвии с этой спецификацией мы встретим
portlet.xml   security-role-ref>role-name=user

но у лайфрея есть своя Liferay's Permissions System, именно она используется всеми портлетами лафрея напрямую, без использования портлетных АПИ прав.
Если хочется именно по стандарту то это так (getRemoteUser (), isUserInRole(), getUserPrincipal () ):
if (renderRequest.isUserInRole("power-user")) {

     // ….

}
Но опять же лучше использовать Liferay's Permissions System напрямую.
Добавление пермишинов состоит из 4-х главных шагов (DRAC)
  • Define ресурсы и их права
  • Register ресурсы в системе прав. Этот этап еще называется "adding resources"
  • Associate ресурсы с правами.
  • Check права до возвращения ресурсов.
Ресурсами считаются:

  1. portlets (пермишины реализованы по другому чем для двух остальных).
  2. Java classes.
  3. Файлы.
Настройка портлетов в Liferay's Permissions System на сорсах портала находится тут:
portal-impl/src/resource-actions/

Вот пример blogs.xml


Русурсы о правах:
http://www.liferay.com/documentation/liferay-portal/6.0/development/-/ai/security-and-permissions
http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/Using+Liferay%27s+Permission+System+from+a+portlet
http://www.liferay.com/community/wiki/-/wiki/Main/Permissioning+Explained
http://www.liferay.com/community/wiki/-/wiki/1071674/Liferay+Portal+Permission+Algorithms

понедельник, 17 сентября 2012 г.

Scala Build Tool

Чтобы интерпретатор Scala был в OS, нужно установить Scala Distribution. После этого мы можем пользоваться командой scala в командной строке.

Но если нам нужно компилировать и запускать приложения, работать в интерактивном режиме, то для этого подойдет и sbt, как я понял это более легкая утилита.

Запускается командой sbt

Имеет следующие внутренние команды:

console     запускает REPL(read-eval-print loop).Это интерактивная среда скала, мы можем вводить команды/код и мгновенно получать их обработку/ответы. Чтобы выйти из REPL и вернуться в командную среду sbt, нужно нажать Ctrl+d

compile     компилирует проект, если sbt запустить, когда поточный каталог проект.

run            запускает проект, если поточная директория проект скала, и наверно если он уже откомпилированный. Запуск произойдет, если в проекте есть объект с методом main, или объект реализует App. 

воскресенье, 16 сентября 2012 г.

Разбираемся с путаниной между настройками портела и его аргументами модели

И так все, что касается настроек портлета, сохраняется в объекте класса PortletPreferences.
Доступ к объекту можно получить из:
renderRequest.getPreferences();
actionRequest.getPreferences();


Что-то получается так:
String somePref = (String) prefs.getValue("prefName", "dafault value");

Что-то сохраняется вот так:

prefs.setValue("name", "some value");
prefs.store();

И так что касается модели сохраняется во всяких репозиториях (реляционные базы данных, носкули, хмли, файлы, все что угодно), что никак не относится портлет апи.

Стандартная связка jsp-вьюшки и класса реализующего портлет-апи

Чтобы диспетчиризировать обработанный запрос в конкретную jsp-вьюшку нам нужно:
1) Внести необходимые во вьюшке атрибуты в renderRequest обьект.

2) получить с помощью метода getPortletContext() контекст портлета.

3) получить из контекста реквест-диспетчер, при этом чтобы получить диспетчер в метод нужно указать путь к вьюшке:
getPortletContext().getRequestDispatcher(path);

4) Передать диспетчеру renderRequest, renderResponse:
portletRequestDispatcher.include(renderRequest, renderResponse);

Теперь в нашей вьюшке используются переданные атрибуты и генерится хтмл-код и отправляется браузеру.

Структура портлета

1. Должен присутствовать обязательно класс реализующий портлет апи.
2. Дескриптор portlet.xml. Он определяет какой же все-таки класс реализует портлет апи( или интерфейс javax.portlet.Portlet или уже его реализацию абстрактный класс  javax.portlet.GenericPortlet); какие связки ресурсов у нас есть(файлы ленгов) и где они находятся; определяются также моды портлета и их майм-типы.
3. web.xml- это деплоймент дескриптор определяющий веб-ресурсы (сервлеты и подобное), которые будут выполнятся в этом приложении, но не класс-портлет.

portlet.xml имеет вот такой интересный тег portlet-app>support он поддерживает два тега-детей mime-type и portlet-mode

Так вот у портлета может быть три режима, ориентируясь на которые мы можем выводить разный контент в респонс:

  • VIEW
  • EDIT
  • HELP
Файл ленгов. Кстати в случае лайфрея, как портала, у нас есть уже ряд предопределенных имен для параметров локали, которые лайфрей попытается найти в ленг-файле. Например титл портлета определяется параметром javax.portlet.title
Кстати имя ленг-файла Languages-ext.properties, а конкретной локали Languages-ext_{LOCAL}.properties. Из чего у меня по крайней мере возникает вопрос зачем там вставка ext?
Так вот эта вставка означает что это файл расширение, что означает, что есть где-то и оригинальный, параметры которого мы этим файлом перегружаем или создаем новые параметры. Называется он( понятно также, но без вставки), находится вот где на сервере:
{TOMCAT_HOME}\webapps\ROOT\WEB-INF\lib\portal-impl.jar#Language.properties 


Есть также дескрипторы индивидуально лайфреевские, а не спецификации портлетс 2.0.

liferay-display.xml - определяет категорию в которой будет находится наш новосоздаваемый портелет, можна указывать как существующие категории, которые названы в Languages.properties, либо новосозданные, которые находятся в Languages-ext.properties
<display>
  < category name="category.chapter01.helloWorld">
    < portlet id="HelloWorldPortlet" />
  < /category>
< /display>
liferay-portlet.xml - тоже самое что портлетс.хмл + фичи, характерные только для лайфрея: Вот два нововведенных тега:
<instanceable>true</instanceable>
<remoteable>true</remoteable>
Последний говорит, что портлет выставляется удаленным WSRP producer(Web Services for Remote Portlets).

пятница, 14 сентября 2012 г.

Понятие локального и удаленного сервиса в сервисбилдере

Ну нужно переносить знаний фронтенда на это понятие; это  не означает, что просто дб или на этой же машине, что и контейнер, или нет; это означает в этом ли приложение используется сервис или в другом(на этой или другой машине). В последнем варианте используется WSDL протокол.


среда, 5 сентября 2012 г.

Обращение к символу в строке

var str = "123";

В принципе можно и так:
var с = str[0];
Но все же ie7 не поймет, нужно пользоваться кросбраузерным вариантом:
var с = str.charAt(0);

понедельник, 3 сентября 2012 г.

Как делать максимально легкую тему в 6.0.6?


1) Нужно сделать хук, в идеале в одном плагине с темой, пока у меня это не получалось
не хотело деплоить этот хук.

2) Порталу нужно позаносить две новые джееспешки
сp %Path_to_root%/ROOT/html/common/themes/top_head.jsp 
 %Path_to_our_hook_resdir%/html/common/themes/top_head_mytheme.jsp

сp %Path_to_root%/ROOT/html/portal/css.jsp
 %Path_to_our_hook_resdir%/html/portal/css_mytheme.jsp
3) Нужно в теме в init_custom.vm  переопределить $top_head_include
 Это значение по-умолчанию #set ($top_head_include = "$dir_include/common/themes/top_head_mytheme.jsp")

 4)В %Path_to_our_hook_resdir%/html/common/themes/top_head_mytheme.jsp находим строчку
 <link css.jsp="css.jsp" href="<%= HtmlUtil.escape(PortalUtil.getStaticResourceURL(request, themeDisplay.getCDNHost() + themeDisplay.getPathContext() + " html="html" portal="portal">" rel="stylesheet" type="text/css" />
 и меняеем ее на
 <link css_mytheme.jsp="css_mytheme.jsp" href="<%= HtmlUtil.escape(PortalUtil.getStaticResourceURL(request, themeDisplay.getCDNHost() + themeDisplay.getPathContext() + " html="html" portal="portal">" rel="stylesheet" type="text/css" />

 5) Теперь в %Path_to_our_hook_resdir%/html/portal/css_mytheme.jsp мы выкидываем все лишнее.

 Можно ли зафигарить другой фреймворк со своим ресетом, но при это воспользоваться частью стилей из css.jsp ?
 Пока я пытался зафигарить туда бутстрап, но у него много сиесеса3 который парсер jsp не мог глотнуть.
 Так что нужно понимать что все ресеты которые мы применим в теме, сбросят все что совпадет с css_mytheme.jsp

 Так этот метод максимально подходит для тех случаев, когда вообще никакой сиесес из лайфрея не нужен в теме.

воскресенье, 2 сентября 2012 г.

Приколом с класспазом через командную строку


Про CLASSPATH

Чтобы определенные классы из определенных библиотек были доступны при выполнении
приложения в ява машине, нужно чтобы библиотеки находились
в том же каталоге где и код приложения, или же нужно чтобы
пыть к библиотекам был указан в системной переменной CLASSPATH.

Шпаргалка по форматированию стандартного вывода JAVA


Где StsOut.printf это обертка для

out.printf(new java.util.Locale("en", "US"), format, args);
out.flush();

А вот короткое пояснение формата:

Как добиться чтобы сервлет обслуживал в один момент времени только одного клиента?

Нужно обьявить, что наш сревлет не только расширяет HttpServlet, но и реализовывает SingleThreadModel интерфейс, так контейнер не будет передавать запрос клиента, пока предыдущий не обработан.

В чем разница между Scriptlet и El? И возможны ли между ними коммуникации?

Scriptlet - ява код прям в странице. Заключается в <% %>. Когда внутри скриплета создаются переменные они стают локальными(и по всей видимости приватными) переменными страницы. Да мы можем на этой страницы к ним обращаться в рамках сприптлета.

Exression Language - это переменные определенного скоупа, которые доступны через выражение ${...}, среди скоупов есть и скоуп page, но даже в этом скоупе переменная не является локальной для класса страницы. Поэтому мы просто так не можем в скриптлете обратиться к переменной из этих скоупов, в том числе и скоупа страницы. Скоупы бывают: page, request, session, application.

Плагин IntelliLang

Этот плагин позволяет в теле любого тега распознать какой-то язык и предоставить по нем подсветку, автокомплит и т.д.
Также он может распознавать код в строках явы и предоставлять удобный бокс для редактирования кода, сам же код строке будет максимально удобно представлен для ява кода в виде именно строки.

Также мы можем с помощью анотаций метить что-то в методах явы и будут добавляться всякие префиксы и заменяться константы до этапа компляции, тоесть будет компиляция так сказать кода идеи, а потом уже явы:)


Я применил эту штуку для проектов на liferay, установил, что тело тега script немспейса aui, понимать как javascript.

Вообще потенциально сильная штука и с ней нужно разбираться.

суббота, 1 сентября 2012 г.

include-and-override в *.properties файлах

Очень бы хотелось, чтобы этот параметр перегружал из другого файла параметры, которые находятся выше него, а все что идет за ним перегружало бы уже его перегрузки, но к сожалению это не так. По факту он перегружает все что находится в поточном файле без разницы за его подключением это находится, или до.

Выход перегрузить его перегрузки -- это указать параметры в другом файле, который лайфрей сканирует после поточного файла.

среда, 29 августа 2012 г.

Как перекрыть flash

Чтобы дивы и всякие меню попапы могли перекрывать флеш, ему нужно установить определенный параметр:

     
      
 
 

четверг, 23 августа 2012 г.

lilne-heght как носитель множителя

line-height
Размер строки, обычно он больше размера шрифта. При установке множителем расчитывается каждый раз относительно текущего шрифта, при установке в единицах измерения — фиксируется.
font-size
Размер шрифта. Если сделать блок такой же высоты, как шрифт, то хвосты букв будут вылезать из-под него.
font: 125%/1.5 FontFamily
Даёт возможность одновременно задать размер, высоту строки и, собственно, сам шрифт.

четверг, 16 августа 2012 г.

вторник, 14 августа 2012 г.

Еклипс и обновляемый pom.xml

Каждый раз когда мы добавляем новую депенденси в pom.xml, мы должны выполнить комманду, чтобы добавить депенднси в еклипсовые класспазы:

 mvn eclipse:eclipse

Как искать только в выделенных каталогах?

Когда нажимал на лупу поиска, то часто задавал себе вопрос: почему чекбокс искать только в выбранных всегда неактивный, и как его сделать активным? Но так и ничего не пробовал особо для того чтобы это поискать.

И вот простое его решение: "выделить только нужные каталоги в табе и нажать на лупу":-)))))

понедельник, 13 августа 2012 г.

Единицы измерения в js

В сиесес существуют следующие единицы измерения:
px - пиксели, все просто 1пиксел это точка размеры которой не меняются. Самые стабильные размеры.
em - 1em это размер шрифта поумолчанию в браузере. Обычно это 16px. Эти размеры привязаны всегда к размеру шрифта, даже если в них выставляется ширина какого-то бокса. Как я даже понял если у какого родителя этого бокса установлен размер шрифта, то именно этот размер уже будет считаться 1-м емом.
% - это процентная часть от чего-то родительского -- то ли размера, то ли шрифта(если мы выставляем размер шрифта) от его родительского.

Есть еще расширения, вот например так называемая группа "пиксельная":
1mm(мм) = 3.8px
1cm(см) = 38px
1pt(пункт) = 4/3 px
1pc(пика) = 16px

А вот шрифтовое расширение:
1ex — высота буквы "x" в текущем шрифте.

А вебкит еще и поддерживает черновик стандарта W3:
vw — 1% ширины окна
vh — 1% высоты окна
vmin — наименьшее из (vw, vh)


четверг, 9 августа 2012 г.

Что добавляется в css свойство content

Таки можна туда вставить нон-брейк спейс, но нужно указать не него через юникод:
.age-label:after {
 content:'\00A0';
}
 

четверг, 2 августа 2012 г.

Отступ между инлайн-блоками

Отступ может вылазить, если между инлайн-блок элементами находится пробел между тэгами, иле есть переход на новую строку.

среда, 1 августа 2012 г.

moden clearfix

Как в Twitter Bootstrap
.clearfix {
  *zoom: 1;
}

.clearfix:before,
.clearfix:after {
  display: table;
  content: "";
}

.clearfix:after {
  clear: both;
}

пятница, 27 июля 2012 г.

Деплой плагина ext

Когда деплоим ext нужно делать рестарт сервера.

Зависимости между модулями в IntelijIDEA

То что мы в зависимостях 1го модуля подвязуем 2й, в зависимостях которого находится библиотека необходимая  1му, не решит нам проблему с доступом до библиотеки, ее нужно явно подвязывать).

Первая настройка liferay 6.1

В этой версии лайфрея мы уже при первом запуске можем указать имя портала, имя и имейл админа, выбрать базу и заполнить ее креденшиалсы.
Все это сохраняется в bundle/portal-setup-wizard.properties

Зависимости модуля

Всегда меня выводила неоднозначность понимания, что за Scope выбирается для зависимости, покопавшись в хелпе идеи нашел вот определение:

Скоуп Зависимость доступна в класспазе на следующих этапах: Детально о скоупе
Compileкомпиляции и выполненияЗначение по-умолчанию. Решает зависимость, которая доступна в класспазе для модуля как на этапе компиляции, так и на этапе выполнения.
Testпри запуске в режиме тестированияЭтот пункт стоит выбирать, когда зависимость нужно толька для тетов, и в условиях нормальной работы приложения не используется. Когда этот скоуп выбран зависимость решается и доступна в класспазе во время тестовой компиляции и тестового выполния.
RuntimeвыполненияЭтот скоуп определяет, что зависимость будет нужна в класспазе только в момент выполнения приложения и никак не в момент его компиляции.
ProvidedкомпиляцииЭта опция подразумевает, что зависимость будет в класспазе на этапе компиляции, но не на этапе выполнения приложения. Этот скоуп полезен, когда приложение выполняется в неком контейнере, у которого в класспазе будет доступна эта зависимость.
Зацепившись за это, посмотрел, что делает чекбокс Export, пока не догнал в перевод, сейчас нет времени думать, разберусь попозже:
 
If this option is selected, a library is included in the compilation classpath of the dependent modules, as well as the classpath of the module which it is attached to. If this option in not selected, a library is only included in the compilation classpath of a module which it is attached to. A library is always included in the runtime classpath regardless of the state of the Export check box.

среда, 25 июля 2012 г.

Репозитории Maven

http://search.maven.org/ -- этот называется центральным репозиторием мавена. Тут есть сторока поиска тоже! 

http://mvnrepository.com - тут есть строка поиска через которую мы можем найти интересующую нас библиотеку и скачать ее руками.

http://download.java.net/maven/2/ - еще один довольно древний репозиторий

http://repo.springsource.org - спринговые репозитории, в которых можно найти не только спригфреймворк, эти репозитории подготовлены как для мавена, так и для айви и гредла.


Как загрузить в локальный репозиторий библиотеку

Это обычно делать не нужно, потому что когда мы указываем в проекте зависимость все загрузиться само. Но например в поточном проекте не используется мавен, но мне интересно, чтобы библиотеки были для всех проектов в одном месте на диске, библиотеки лучше разделять, чем качать под каждый проект дубликаты.

Вот поэтому мне понадобилась библиотека, которой не оказалось загруженной. Чтобы это сделать, выполняем команду:


mvn dependency:get -DrepoUrl=something -Dartifact=group:artifact:version



Вот живой пример:


mvn dependency:get -DrepoUrl=http://repo.springsource.org/release
      -Dartifact=org.springframework:spring-orm:3.0.5.RELEASE


воскресенье, 1 июля 2012 г.

Как работать и не работать с window scroll event

Если хотим затормозить работу страницы делаем так:

// antipattern
$(window).scroll(function () {
 $('.foo').something();
});
Лучше не выполнять тяжеловестные операции на столь часто срабатывающее событие. Нужно минимизировать выполнение этого кода:

суббота, 30 июня 2012 г.

Как кешировать селекторы для обработчиков событий



// antipattern
$('.list-item').click(function () {
 $('.photo').hide();
});


// preferred
var photo;
$('.list-item').click(function () {
 photo = photo || $('.photo');
 photo.hide();
});
http://shichuan.github.com/javascript-patterns/ https://github.com/shichuan/javascript-patterns/blob/master/jquery-patterns/cache-selector.html

Делегирование с помощью .live()

Чтобы понять что такое .live(), достаточно показать, что является его эквивалентом:

$(selector).live(events, data, handler);                // jQuery 1.3+
$(document).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(document).on(events, selector, data, handler);        // jQuery 1.7+

empty(), remove(), detach() - что? куда? и почему?

.empty() -- уничтожает детей элемента в обвертке jquery, у которого вызывают этот метод.
.remove() -- вынимает из дом-дерева элемент, при этом все события и данные нацепленные джейквери на него и его детей сразу же удаляются.
.detach() -- этот товарищ самый интересный, он вынимает элемент из дом-дерева, но ни данные ни события из этого сегмента не уничтожаются, он подходит для тех случаев, когда мы вынимаем элемент временно. Мы можем вынять впринципе и ремувом, если нам ни данные, ни события на под-дереве не важны.

Вот применения последнего для продуктивности манипуляции с дом-деревом:

var table = $('#some-table');
var parent = table.parent();

table.detach();
table.addLotsAndLotsOfRows();
parent.append(table);

Свойство context у объектов jquery

$ob.context - если при выборке контекст не был указан, то это document, если же был указан, то он.

closest

.closest - метод, который аналогичный .parents потому что идет по дереву вверх, но:
- начинает тестить с себя, ;
- как только находит подходящий элемент останавливается, парентс же проходит к самому корню собрав все узлы, а потом отфильровывает элементы по селектору, первым в массиве находится ближайший родитель.

Тестирование алгоритмов работы с массивами

По началу на двух первых тестах даже расстроился - думал фигня вообще и не стоит заморачиваться как работать с массивами, но последний, который считается лучшим, поистине оказался лучшим)

И так тестировал на Winodws 7 64bit Home Pre RU, Sony Vaio VPCEJ i5, 8 гб ОЗУ

классный сайт с патернами джаваскрипта

четверг, 28 июня 2012 г.

Как победить назойливый кеш в лайфрее?

Проследить чтобы стояло свойство:


com.liferay.portal.servlet.filters.cache.CacheFilter=false

вторник, 26 июня 2012 г.

Как проинициализировать статический обьект несколькими методами если поле статическое

static List headerNames = new ArrayList();

static {
   headerNames.add("title");
   headerNames.add("description");
   headerNames.add("user-name");
   headerNames.add("modified-date");
}

пятница, 22 июня 2012 г.

Ленги в портлете и js

Чтобы js Liferay.Language.get('lang.var.name') посталяло ленги контекста портлета нам нужно сделать следующее. Дело в том, что аяксом эти переменные придут только в случае если ленги в контексте ROOT.
Чтобы получать ленги из портлета, нужно чтобы скрипт был в отдельном js файле, так на него применится фильтр LanguageFilter, который поменяет все функции обращения к серверу за ленгами в скрипте на значения ленгов.

Только вот обязательно, чтобы в portlet.xml было указанно, что в портлете ленги:
...
 localization/language
....

воскресенье, 17 июня 2012 г.

Разница между разными инклюдами jsp

Взято из форума лайфреяhttp://www.liferay.com/community/forums/-/message_boards/message/14327817:

<%@include%>
Is the jsp include directive. The content of the file you are including is added at translation time. Eg. when the JSP file is compiled. So any code in the include is treated exactly as when had it been written inline in the jsp that does the include

<jsp:include>
Is the jsp include tag. The contents of the path you are including are added at request time. You can also parameterize the request that's made by nesting jsp:param elements in this tag. You can only include paths that are relative to your servlet context (eg. in your own war file)

<liferay-util:include>
Is the liferay inlude tag, afaik its kind of like jsp:include but let's you include files from other servlet contexts then your own, via it's servletContext attribute or portletId. 
Make sure you have in portal-ext.properties
    theme.jsp.override.enabled=true
"liferay-util:include" tag checks this value in Liferay v.6.1.0 CE GA1...

And then there's a bunch of others also related to including, you did not mention yet. Like and . What you should use depends on the situation.



суббота, 16 июня 2012 г.

Состав директории репозитория в Windows

Все библиотеки, которые размещены в центральных репозиториях мавена, лежат по своим папкам, внутри в папке может содержаться еще папки версий. Сама же папка репозитория состоит из следующих файлов:

1. _maven.repositories - метафайл (тут я так понимаю детализируется на каком из удаленных цетральных репозиториев обитает этот артифакт).
2. библиотеки.jar - скомпиленная либа.
3. библиотеки.pom - дескриптор проекта.
4.  библиотеки-сорцы.jar - сорцы

5. библиотеки.jar.sha1
6. библиотеки.pom.sha1
7.  библиотеки-сорцы.jar.sha1


Последние это ключи для ssh соединения с удаленными репозиториями откуда и пришел данный в локальную машину.

Еще могут быть файлы с именами 2,3,4 и их расширениями + постфикс .lastUpdated. Это текстовые файлы в которых находится дата попыток загрузок и урлы из которых были неудачные попытки загрузки, последний походу будет удачный, или неудачный, если нет артифакта рядом со своим файлом ластапдейт. В случае если не загрузился ресурс то бедет еще и пустой файл с постфиксом .jar-not-available.


Файл настроек мавена

Живет этот файл в двух вариантах в двух местах:
$M2_HOME/conf/settings.xml
${user.home}/.m2/settings.xml
Первые глобальные с ними мерджатся настройки конкретного юзера и последние перегружают те же значение предыдущего.

 В нем находятся настройки не касающиеся конкретного проекта и которые часто не должен видеть внешний мир. Это:
- расположение локального репозитория (интрасеть),
- расположение альтернативных удаленных серверов (я так понимаю если центральные по какой-то причине не доступны),
- аутентификационная информация.


Вот общая структура файла:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository/>
  <interactiveMode/>
  <usePluginRegistry/>
  <offline/>
  <pluginGroups/>
  <servers/>
  <mirrors/>
  <proxies/>
  <profiles/>
  <activeProfiles/>
</settings>
activeProfiles тег указывает какие из указанных в profiles теге, являются всегда активными, активные профили перегрузят профилям конкретного проекта с такими же айшками как у них значения совпадающих параметров. Проектные профили размещают в pom.xml или profiles.xml

понедельник, 11 июня 2012 г.

Как в виндоусе из виндоус екплорера запустить cmd

Зажимаем шифт и вызываем контекстное меню на папке, которая будет поточной в открывшемся cmd

воскресенье, 10 июня 2012 г.

Eclipse Plugin for Velocity templates engine

http://veloeclipse.googlecode.com/svn/trunk/update/ - добавить этот урл и инсталировать с него

среда, 6 июня 2012 г.

Устанвка хотдеплея в еклипсе через мавен

Чтобы мавен проект начал работать с хотдеплоем ресурсов в еклипсе нужно выполнить мавен-цель mvn -Dwtpversion=2.0 eclipse:eclipse.

Потом этот проект либо открыть екслипсом, липо переоткрыть и обязательно запустить как ран-сервер в нужном сервере. После этого изменения в джееспе и яваскриптах с цсс после сохранения в IDE будут сразу прилетать на сервер.

WTP - webbased tools projects, это группа плагинов еклиспса, которые позволяют хотдеплойи


Походу вот оно что делает, создает файл в каталине:
 tomcat-6.0.29\conf\Catalina\localhost\edetailing-admin-portlet.xml
А поэтому файлу каталина при запуске прослушивает указанный класс в своем контексте, и по каким-то там наверно событиям реагирует и обновляет содержимое указанного приложения.

Вот что внутри:
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="F:\wksps\eDetailing\bundles\tomcat-6.0.29\webapps\edetailing-admin-portlet" reloadable="true" source="org.eclipse.jst.jee.server:edetailing-admin-portlet"/>

Встраивание портлета в тему

Можно встраивать как инстансебл портлет, так и нонинстансебл. Во втором случае проще в том плане, что не нужно добалвлять суфикс _INSTANCE_ + айди инстанции.

Вот пример для инстансебл, как более сложного варианта:

#set ($VOID = $velocityPortletPreferences.setValue('display-style', '1'))
#set ($VOID = $velocityPortletPreferences.setValue('portlet-setup-show-borders', 'false'))
#set ($instanceId = 'E3j7')
#set ($queryString = "param1=value1¶m2=value2")
#set ($myPortletId = "73_INSTANCE_${instanceId}")
#set $theme.runtime($myPortletId, $queryString, $velocityPortletPreferences.toString())
#set ($VOID = $velocityPortletPreferences.reset())
Кодовое слово $VOID позволяет то что возвращает метод не выводить в ответ сервера, заглатывать это в "черную дыру".

пятница, 1 июня 2012 г.

Полезные ссылки в Liferay

Ссылка на портлет логина -- home?p_p_id=58&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&saveLastPath=0&_58_struts_action=%2Flogin%2Flogin

вторник, 22 мая 2012 г.

Полезные команды виндоус

eventvwr.msc - запустить журнал событий. В нем реестрируются все события, которые происходят в виндоус, и если были какие-то неполадки, то они находятся в логах этого журнала.

services.msc - запуск консоли сервисов, где можно запускать, останавливать и перезапускать сервисы.

mstsc - запуск Remote Desktop

пятница, 11 мая 2012 г.

Как добавить XDebug к Zend Server

Альтернатива хранимкам

Хранимки не нужно создавать, когда их ничто не выполняет, и когда мы руками что-то периодически фиксим, то удобнее просто хранить внешний файл с скуель-скриптами и его выполнять.

А как же создание переменных? - я сам у себя спрашивал.
А вот так:


select `id` into @myid from `kc_orders` where `kc_order_num` = 102101054; select * from kc_orders_accounts where `kc_order_id` = @myid;

четверг, 3 мая 2012 г.

Синтаксис вебпротокола mailto

По этому протоколу формируются ссылки, нажимая на которые вызывается емейл-клиент уже с предзаполненным новым письмом.

Мы можем указывать:
1) один емейл.
2) мультирассылку на много емейлов.
3) cc и bcc (но рекомендуется лучше пользоваться пунктом 2).
4) указывать тему.
4) И даже текст сообщения.



Contact Us

среда, 2 мая 2012 г.

JAXB2

Java Architecture for XML Binding -- набор инструментов для ява, которые помогают, парсить дефиниции схем, генерить соответсвующие ява-классы, которые можно использовать для построения документов соотвествующих этой схеме и подальшей их гененерации в хмл.

JAXB2 -- это следующая версия, которая помогает все делать еще проще.

JAXB2 идет в связке с инструментарием для работы с вебсервисами JWSDP2.0(Java Web Services Developers Pack 2.0)

вторник, 10 апреля 2012 г.

JPA allocationSize

Это аргумент аннотации @SequenceGenerator. Так что же он означает?
Когда мы пишем например



@Id @Column(name = "ITEM_ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="ItemIdSeqGenerator") @SequenceGenerator(name="ItemIdSeqGenerator", sequenceName="ITEM_ID_SEQ", allocationSize=10) private long itemId;

пятница, 6 апреля 2012 г.

Наследование, перегрузка методов и их областей видимости

Видимость перегружаемого методода нельзя ПОНИЖАТЬ, можно только повышать.



class A {
   public void myMeth(){...}

   private void otherOneMeth() {...}
}

class B extends A {
   private void  myMeth (){...}// alarm! компилятор ругнется

   public void otherOneMeth() {...}// а так ок
}

четверг, 5 апреля 2012 г.

ключевое слово transient

transient - переходящий


Если стоит возле поля, то означает, что пока будет серелизовываться,
 если не стоит то не серелизуется.

volatile

volatile - летучий

ключевое слово в Java, которым помечают поля в классах, поле может быть как обьектом, так и обычным типом (в отличии от synchronized, которое может быть примененено только на поля классовых типов)

Это ключевое слово означает, что поле бедут доступно и изменяемо раными потоками, каждый из потоков не позволяет себе кеширование, и каждый раз обращается непосредственно к памяти поля.

Таблица отличий между volatile и synchronized

Characteristic Synchronized Volatile
Type of variable Object Object or primitive
Null allowed?NoYes
Can block?YesNo
All cached variables synchronized on access?YesFrom Java 5 onwards
When synchronization happensWhen you explicitly enter/exit a synchronized blockWhenever a volatile variable is accessed.
Can be used to combined several operations into an atomic operation?YesPre-Java 5, no. Atomic get-set of volatiles possible in Java5.

среда, 4 апреля 2012 г.

Доступ к приватным полям обьектов из обьектов того же класса

Если в метод обьекта передать параметр того же класса, то все приватные методы будут доступны внутри этого метода(потому что это один и тот же класс)

Тоже самое касается статического метода класса, которые получает обьект того же класса.



class A {
    private int field;

    public void method1(A a){
        System.out.println(a.field);  // works
    }

    static public void method2(A a){
         System.out.println(a.field);  //works
    }

воскресенье, 1 апреля 2012 г.

Настройка екслипса под лайфрей

Первое, что хотелось бы поднять, это размещение библиотек в плагине для разработки под лайфрей:
Есть библиотеки, которые будут находиться в среде где будет развернут скомпилированный плагин, и поэтому такие библиотеки нужны только для процесса компиляции, в варнике же они не нужны, размещать их нужно сдесь:
/myportlet/lib
Если мы собираем проект антом, то в его билд файле этот путь указывается параметре classpath команды javac.

Есть же такие библиотеки, которые мы применили в нашем плагине, но они до этого не использовались в лайфрее, поэтому их тоже нужно поместить в варник, чтобы они были доступными и в среде(на сервере где развернут лайфрей). Размещать их нужно тут:
/myportlet/WEB-INF/lib

Когда настраиваем сервер в данном случае томка, то ему в параметры виртуальной машинынужно дописать следующие:


-Xms128m устанавливаем больше стандартного размер кучи, которую инициализирует JVM при старте приложения

-Xmx512m # повышаем максимально возможный размер кучи(за которой следит gc и очищает в случае необходимости) JVM

-XX:MaxPermSize=256m # повышаем максимальный размер перманентной памяти(которую не чистит gc), тут храняться классы, в куче же хранятся объекты этих классов



Чтобы помочь еклипсу запустить сервер, нужно во вкладке класспаз окна настройки сервера добавить джарники из либ томката: servlet-api.jar, el-api.jar, and jsp-api.jar, а также всю папку в этих же либах ext

И нужно добавить времени на старт сервера и на его остановку, 180 и 120 сек соответсвенно. Филдсет таймаут.

пятница, 23 марта 2012 г.

Предзагрузка картинок

В яваскрипт-движках браузеров, есть одна замечательная особенность: когда мы создаем елемент img и присваиваем его свойству сорс какой-нибудь урл, то браузер сразу начинает загружать эту картинку, не дожидаясь вставки этого елемента в страницу. Поэтому слайдер может всегда пользовать одну картинку, которой будет меняться сорс, потому что при его инициализации будут созданные холостые дом-элементы, что позволит браузеру уже иметь в кеше эти картинки, и появление этих урлов в единоличной картинке приведет к тому, что изображение возьмется из кеша, а не загрузиться из сервера.

среда, 21 марта 2012 г.

PSP

PSP - Payment Service Provider.

понедельник, 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

Процесс проведения безналичной оплаты


В безналичной оплате принимают участие 5 сторон:
  1. The cardholder - держатель карты, он же покупатель.
  2. The card issuer - эмитер карты, банк выступающий на стороне покупателя.
  3. The merchant - продавец.
  4. The acquirer, and - эквайер/аквизитор, банк представляющий сторону продавца, который имеет какой-то терминал на стороне клиента способен принять данные из карты покупателя.
  5. The card Association -  Visa, MasterCard и т.п.

Почему замочек может не отображаться для сайтов под https

Вполне реальная ситуация, когда на самом деле сайт передает данные по защищенному соединению, но браузере не показывает в адрессной строке замочек, символизирующий защищенное соединение.
Это возможно в том случае, если:
1. На странице присутсвуют ресурсы (картинки, скрипты, стили, медиа-файлы), которые хостятся на серверах с незащищенным соединением.
2. На сайте присутсвуют фреймы отображающие контент с северов с незащищенным соединением.

воскресенье, 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"


суббота, 17 марта 2012 г.

Ruby tools

gem -- пакетный менеджер руби. Аналог apt-get и тому подобному, только вот устанавливает он пакеты (модули с конкретным функционалом) в руби среду.
Обысно пакеты билдяться из файлов .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 Module Enumerable

Это миксин.
Имеет следующие неочевидные методы:

.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.

Модули руби

Модули руби - это колекция классовых/обьектных методов, которая не является классом.

Их два вида:

  •  их вызывают как глобальные фунции. Такие модули называют неймспейсы:




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"

среда, 14 марта 2012 г.

Ruby Methods

1. Методы определяются ключевыми словами def... end. По названии понятно что метод должен принадлежать какому обьекту. Но мы можем определять метод, не заботясь о том, чтобы его окружало обьявление какого-то класса(тоесть писать функциональную программу), по той причине, что в руби все обьекты, и само приложение тоже является обьектом, поэтому обьявленные вне какого-либо класса методы просто попадают в обьет программы.


2. Методы-предикаты - это методы которые возвращают булиновое значение. В Java такие методы имеют приставку is: isEnabled. В руби же принято ставить таким методам знак вопроса в конце
if arr.empty?

...

end


3. Методы со знаком восклицания. Суть их в том, что они применяют какие-то изменения непосредственно на собственный обьект, а не на его клон который возвращается из них return-ом.

понедельник, 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". Вместе с приходом понятия этого механизма, появляется понятие фреймворка, который в отличии от библиотеки, не просто предоставляет методы, которые можно вызывать-использовать, а некий поток приложения, с помощью хуков(или оброботчиков) к которому присоединяется ваш код, который срабатывает на определенных этапов(при возникновении событий). Так и получается, что методология перевернулась с ног на голову, когда наше приложение управляло ходом приложения, и мы сами решали когда и где вызывать опеределенные методы библиотеки. Теперь же мы подписываем оброботчики и передаем управление фрейворку(контейнеру), который сам решает, когда вызывать наш код.

воскресенье, 11 марта 2012 г.

Процесс дебагинга в Rails

Сервер нужно запустить так rails server --debugger

Потом, если где-то в файлах руби, которые будут исполнятся при определенном запросе и там будет строка debugger, то приложение в этот момент подвиснет и в консоли запущенного сервера можно ввести p [имя переменной], что позволит нам увидеть содержимое переменной в данный момент.

Чтобы продолжить процесс исполнения нужно ввести команду continue.

Выражение yield в Ruby

Разница с и без:
# 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


Итераторы - это один из способов применения yield. На место оператора yield ставится блок кода, которые решает что делать с тем или иным элемемнтом итерации, или вцелом с самим процессом итерации:
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

Модули предоставляют повторное использовение через поведение, а классы через наследование.
Механизм mixin: :include Enumerable - может применятся для многих разных классов
Механизм inheritance: class A < B - может применятся только для наследников

понедельник, 5 марта 2012 г.

Методы руби

Все методы ruby - это ничто иное, как у мение обьекта отвечать на событие с указанным методом как параметр:
my_str.length    <==>    my_str.send(:length)

суббота, 3 марта 2012 г.

Обратные ссылки в RegExps

Все группы создают обратные ссылки к которым можно обращаться, это довольно трудозатратный процесс. Чтобы отключаить обратные ссылки для группы нужно пометить группу как (?:   )

Free-Spaceing Mode в регулярках

Это режим когда пробельные символы(пробелы, табы, переносы строк) игнорируются.
Считается, что /abc/ == /a b c/

Включается режим в Ruby //x

single-line mode в регулярках

Иторически регулярки обрабатывали только строки,  что означало смысла в символе переноса(unix: \n windows: \r\n) строки не было, поэтому точка в регулярках означает любой символ, кроме символа конца строки.
Сейчас же регулярки умеют работать даже с файлами, поэтому чтобы точка считала символ конца строки тоже с символом нужно включаить single-line mode
Во всех языках ключается этот режим /s , а вот в руби /m.