Встал и пошел
AspectJ для журналирования
Задача: покрутить AOP на как можно более простом примере.
Для этого возьмем:
1) Файл AspectTest.java с подопытным классом
package ajtest;
class AspectTest {
public void printKrivetko() {
System.out.println("Я криветко :)");
}
public void printMedved() {
System.out.println("Я медвед 8]");
}
public static void main(String[] args) {
AspectTest app = new AspectTest();
app.printKrivetko();
app.printMedved();
}
}
2) Файл PrintLogging.aj с простым аспектом
package ajtest;
// наш простой аспект
public aspect PrintLogging {
// наш простой адвайс
after() returning:
call(void AspectTest.print*()) {
System.out.println("^^^ вызыван какой-то метод print*");
}
}
3) Файл build.xml с несложным проектом
<project name="ajtest" default="ajx" basedir=".">
<!-- определяем директории для исходников и скомпилированных классов -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<!-- определяем таск iajc -->
<taskdef
resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
<classpath>
<pathelement location="lib/aspectjtools.jar"/>
</classpath>
</taskdef>
<!-- цель для компиляции основных классов -->
<target name="compile">
<javac srcdir="${src}" destdir="${build}"/>
</target>
<!-- цель для добавления AOP-функциональности -->
<target name="ajx" depends="compile">
<iajc sourceroots="${src}"
destdir="${build}"
classpath="lib/aspectjrt.jar"
/>
</target>
</project>
4) Библиотеки aspectjrt.jar и aspectjtools.jar из последнего стабильного билда.
Все это разложим по директориям:
+ build + src |- + ajtest |- AspectTest.java |- PrintLogging.aj + lib |- aspectjrt.jar |- aspectjtools.jar build.xml
И соберем ant-ом:
ant
Запускаем (сообщения, создаваемые внутри аспекта, отправляются в стандартный вывод):
java -cp build;lib/aspectjrt.jar ajtest.AspectTest
В консоли должно появиться следующее:
Я криветко :)
^^^ вызыван какой-то метод print*
Я медвед 8]
^^^ вызыван какой-то метод print*
It’s working.
Издевательство с url-pattern
Привязка сервлета к URL только двумя убогими способами («строка начинается с …» и «строка заканчивается на…») — это по нынешним временам совершеннейшая дичь. Благо, неравнодушные люди озаботились ситуацией и написали rewrite-filter.
Без специалиста не рыпайся ©
Намедни захотелось мне почитать что-нибудь из психологии. Пошел, как водится, в ближайший книжный магазин и ну искать по авторам. И что же? Фестингер — шиш. Левин — шиш. Фромм — и тот шиш.
То, что компьютерную литературу книготорговцы подбирают по дизайну обложки, мне было давно известно. Но если механизм справедлив и для книжек по психологии, и если так формируется вообще весь ассортимент, то это повод как минимум принять к сведению тревожный сигнал, почесать репу и начать шевелиться. Найти 3-4-5 человек, сведущих в своей области. Дать им определенные бонусы: безобразно большую скидку, любую бесплатную книгу раз в сколько-нибудь времени. И выяснить у них, наконец, какую литературу нужно возить вместо макулатуры, что собирает пыль на полках магазина.
А можно еще радикальнее — начать самим читать.
Перехожу на Spring Framework
В конторе накопилось много ценной информации, которая пока лежит кучами и не приносит отдачи. Перенос ее в базу данных и разработка бизнес-логики — вопрос времени. Рано или поздно придется это делать.
Но уже ясно, что легковесными казуальными решениями не обойтись: во-первых, еще никто не может четко представить задачи и сформулировать детальные требования к проектам, во-вторых, как следствие, настанет момент, когда все эти разнородные костыли будет сложно собрать в систему. Отсюда явно следует, что энтерпрайзу нужно предложить энтерпрайзовое решение. В нашем случае, реализацию бизнес-логики в виде бинов внутри Java EE-контейнера.
Чрезмерную сложность Java EE можно отчасти нивелировать внедрением фреймворка, который позволяет программировать бины, не захламляя код формальными конструкциями. На эту роль идеально подходит Spring Framework.
Кроме того, Spring Framework обещает элегантное решение проблем сквозной функциональности (например, журналирования), готовое MVC для веб-компонентов, аутентификацию / авторизацию и многое другое. Поверхностное чтение документации показало, что в центре внимания находятся как раз-таки насущные проблемы, которые много раз возникали в моих проектах. Это подтверждает (надеюсь) правильность выбора. Остается в который раз запастись терпением и глазными каплями — и в бой.
סמכות רוסית
Смихута в русском языке формально нет. Но выражения типа “твое день рожденья” подозрительно похожи на что-то сопряженное…
Бабушка, вы не устали?
Любой телефонный звонок из нашей конторы сопровождается интересным эффектом. На протяжении всего разговора среди сторонних шумов слышен тихий трындеж неустановленной пенсионерки. Понятно, что таким образом дают о себе знать прелести аналоговой телефонии. Но, право, позавидуешь пожилой леди, способной работать модемом в режиме 24/7. Нечеловеческой мощи бабуля. Я впечатлен.
Аццкий конструктор IPSec
До настройки OpenSwan я думал, что имею представление о Linux-шаманстве. Но это чудо, усыпанное независимыми ручками настройки, тумблерочками и кнопочками, бьет все рекорды. И, что характерно для подобных продуктов, уже отлаженный, рабочий конфиг выглядит настолько очевидным и логичным, что поневоле удивляешься: с чем там можно было бороться столько дней подряд?
Но все закончилось хорошо. IPSec с сертификатами и L2TP-туннель заработали, офисная сеть открылась избранным (roadwarriors).
P.S. Почему у l2tpns нельзя указать локальный IP и как это хозяйство роутить — осталось загадкой. Пришлось ставить обратно l2tpd.
UPD: Судя по рейтингам поста, людей интересует сам конфиг. Исправляю упущение.
Задача: открыть доступ к ресурсам корпоративной сети для сотрудников, которые находятся дома или в командировке.
Подзадача: создать безопасный канал связи между роутером корпоративной сети (внешний адрес, для определенности, 80.80.80.219/29) и компьютером сотрудника.
Листинг /etc/ipsec.conf:
version 2.0
config setup
nat_traversal=yes # для тех, кто за NAT-ом
interfaces=%defaultroute
virtual_private=%v4:80.80.80.216/29 # подсеть, в которую входит наш секурный хост
conn %default
keyingtries=1
compress=yes
disablearrivalcheck=no
authby=rsasig
leftrsasigkey=%cert
rightrsasigkey=%cert
conn roadwarrior-l2tp # имя соединения произвольное, т.к. соединение
# выбирается опенсваном по параметрам
left=80.80.80.219 # должен быть в virtual_private
leftnexthop=80.80.80.217 # инет-роутер подсети
leftcert=mydomain.ru.pem # сертификат должен лежать в /etc/ipsec.d/certs
leftprotoport=17/1701
right=%any # принимаем соединения с любого адреса
rightsubnet=vhost:%no,%priv
rightprotoport=17/1701
pfs=no
auto=add
type=transport
include /etc/ipsec.d/examples/no_oe.conf
conn block
auto=ignore
conn private-or-clear
auto=ignore
conn clear-or-private
auto=ignore
conn clear
auto=ignore
conn packetdefault
auto=ignore
P. P. S. OpenSwan ничего не знает ни о настройках L2TP, ни о топологии внутренней подсети, к которой предполагается открыть доступ через VPN. Подобные тонкости не фигурируют в ipsec.conf. Применительно к L2TP, задача IPSec только в создании безопасного транспорта между двумя хостами.
My desktop’s survivor
Outpost сломался, Comodo Firewall перепугался, Core Force завис.
Wipfw победил их всех. Пусть даже пакетный. Пусть даже без GUI. Как самый юзабельный.
Спасти рядовых козявочек
Полдня играл в миниклиповскую игрушку Scribble. По способности выдумывать затейливую живность разработчики не уступают самому Босху: тут и козявочки (на самом деле это кляксы), которых нужно провести через весь уровень, умудрившись не сжечь и не убить падением со слишком большой высоты, и ходячие груши, и коровы (?) взрывающиеся от приступа клаустрофобии и т.д., и т.п. Управление будто пришло из керлинга: точно так же требуется подправлять движение предметов (козявочек или врагов) и точно так же процесс выглядит совершенно не тривиальным.
Рекомендую.

