LINUX.ORG.RU

Сообщения nozh

 

линукс на десктопе

Пользуюсь линуксом на личном лептопе (Lenovo X230 с 16Gb RAM) и макосью на рабочем (какой-то топовый 15" макбук про). Когда садился за личный лептоп программировать на Go в Gogland, постоянно страдал от тормозов при отрисовке редактора. Всё было настолько плохо, что простого перемещения курсора приходилось ждать по две-три секунды. Я сильно сомневался что дело в Gogland, поскольку IntelliJ IDEA (IDE построенная на той же самой платформе, что и Gogland) работающая на макбуке вообще сколько нибудь заметно не тормозила на гораздо более сложных файлах (тысячи строк говнокода).

Сегодня таки решил разобраться в чём проблема. Оказалось в JDK8 по умолчанию включили код рендеринга через XRender, который в принципе должен рисовать быстрее. Проблема заключается в том, что его поведение немножко отличается от поведения Java2d на других платформах: он не отобразит изменения на экране пока не переполнится буфер команд Xlib, либо пока не будет вызван Toolkit.sync().

В JetBrains считают, что это не их проблема и добавлять Toolkit.sync() не собираются: https://youtrack.jetbrains.com/issue/IDEA-150262

Разработчики OpenJDK тем временем тоже не спешат фиксить эту регрессию поскольку предложенный фикс замедлит рендеринг когда X работает по сети (что конечно является основным юзкейсом для Java программ): https://bugs.openjdk.java.net/browse/JDK-8068529

К счастью всё лечится отключением xrender, достаточно добавить строчку "-Dsun.java2d.xrender=false" в gogland64.vmoptions. Типичный linux desktop экспириенс - без допиливания напильником в нетривиальных местах будешь жрать говно с лопаты.

 ,

nozh
()

Посоветуйте почитать про дизайн сетевых протоколов на основе UDP

сабж.

Хочу написать свой велосипед протокол обмена сообщениями произвольной длинны что бы поверх него реализовать протокол распределённого консенсуса Raft. UDP потому что Raft и сам справляется с потерей либо out-of-order delivery сообщения, плюс полезна возможность отправки мультикастов (для репликации нужно будет рассылать одно и то же сообщение всем нодам кластера).

 ,

nozh
()

IPv4 multicast + linux bridge + LXC - как-то странно работает

Разбираюсь с протоколом Raft, пишу приложение которое шлёт сообщения upd mutlicast-ами. Для того что бы его потестить, создал с помощью LXC два контейнера с дефолтными настройками сети: один конец veth пары втыкается в бридж lxcbr0, другой конец в контейнере получает адрес 10.0.3.XX. На интерфейсе lxcbr0 соответсвенно настраивается адрес 10.0.3.1/24. Сервер, который шлёт мультикасты и клиент, который должен их получать запускаются в контейнерах.

Проблема: все мультикаст пакеты, которые получает клиент, имеют source address 10.0.3.1 вместо адреса сервера. MAC адрес при этом не меняется. Почему так? Как сделать так что бы в source address был IP 10.0.3.54? Вообще, из-за чего это происходит?

Ubuntu 14.04

server_container$ sudo ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:16:3e:ab:53:43
          inet addr:10.0.3.54  Bcast:10.0.3.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:feab:5343/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:67486 errors:0 dropped:0 overruns:0 frame:0
          TX packets:64842 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:64841422 (64.8 MB)  TX bytes:8354230 (8.3 MB)

client_container$ sudo tcpdump -e -i eth0 -n udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:28:03.612988 00:16:3e:ab:53:43 > 01:00:5e:03:1d:47, ethertype IPv4 (0x0800), length 152: 10.0.3.54.5001 > 224.3.29.71.5001: UDP, length 110
09:28:04.974579 00:16:3e:ab:53:43 > 01:00:5e:03:1d:47, ethertype IPv4 (0x0800), length 152: 10.0.3.54.5001 > 224.3.29.71.5001: UDP, length 110
09:28:06.336165 00:16:3e:ab:53:43 > 01:00:5e:03:1d:47, ethertype IPv4 (0x0800), length 152: 10.0.3.54.5001 > 224.3.29.71.5001: UDP, length 110

root@ubuntu:~# ifconfig lxcbr0
lxcbr0    Link encap:Ethernet  HWaddr fe:92:7a:d9:4b:6d
          inet addr:10.0.3.1  Bcast:10.0.3.255  Mask:255.255.255.0
          inet6 addr: fe80::dcac:9ff:fe9d:e7ee/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:96883 errors:0 dropped:0 overruns:0 frame:0
          TX packets:109548 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:8296510 (8.2 MB)  TX bytes:181533376 (181.5 MB)

 , ,

nozh
()

Защита от подключения rogue devices к кабельной сети

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

Какие бывают способы сделать это, и какие из них наиболее вменяемы?

Пока остановились на IPSec с аутентификацией (всмысле каждый пакет будет подписываться hmac-sha1) на каждой машине в режиме transport mode.

Ещё слыхал про IEEE 802.1X Network Login, но товарищ из майкрософта пишет, что не особо он защищает от rogue devices: http://technet.microsoft.com/en-us/library/cc512611.aspx (там есть описание атаки, начинается со слов «Now, here’s how the attack works»).

 , , rogue device

nozh
()

[посоветуйте-тред] Поэзия для быдла

Со школы носил ненависть к поэзии. Но недавно встретил в метро умалишённую старушку, которая я несь вагон вещала стихи в которых критиковала потреблятство, телевизор, кредиты и пр. И вот чудо - мне понравилось, даже остановку свою проехал. :) Вобщем посоветуйте каких-нибудь поэтов, пишущих на остросоциальные злободневные темы.

nozh
()

Ищу почтовый клиент удобный для чтения почтовых рассылок

Сейчас пользуюсь Evolution, он ответы на письма организовывает в деревья. Когда в рассылке начинается какая-нибудь дискуссия, это дерево выростает до размеров больше моего экрана. Соответственно, находить новые сообщения становится неудобно, приходится постоянно прокручивать список сообщений вверх-вниз.

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

nozh
()

Человек, страдающий от БАС, написал патч для гнома используя азбуку Морзе

https://bugzilla.gnome.org/show_bug.cgi?id=78514#c19

Для Ъ:
Adrian Hands, страдающий от бокового амиотрофического склероза (болезнь сопровождается параличами и атрофией мышц), написал патч для гнома используя азбуку Морзе, т.к. не мог двигать руками, и тем более набирать текст на клавиатуре. Он успел дожить до момента принятия патча в код гнома, вот одно из его последних писем своему сыну:

On Sun, Jan 30, 2011 at 12:16 PM, Adrian Hands <handsadrian@gmail.com> wrote:
> ACCEPTed
> COMMITed
> RESOLVEd
> BOO-YAH!
>
> commit 0b209b1ff16e863e60a1d86413aa57c5fbde76b0
> Author: Adrian Hands <handsadrian@gmail.com>
> Date:   Fri Dec 31 14:34:58 2010 +0100
>
>    Add Copy Image and Copy Path to clipboard functionality
>
>    Fixes bug 78514.
>
>  data/eog-ui.xml  |    9 +++++++
>  src/eog-window.c |   63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 72 insertions(+), 0 deletions(-)

I have the coolest Dad in the world!

nozh
()

[javascript] Результат выполнения блока

В ECMAScript Language Specification есть такое понятие, как Block (стр. 86):

Syntax
Block : { StatementList_opt }
StatementList : Statement StatementList Statement
Semantics

The production Block : { } is evaluated as follows:
1. Return (normal, empty, empty).

The production Block : { StatementList } is evaluated as follows:
1. Return the result of evaluating StatementList.

The production StatementList : Statement is evaluated as follows:
1. Let s be the result of evaluating Statement.
2. If an exception was thrown, return (throw, V, empty) where V is the exception. (Execution now proceeds as if no exception were thrown.)
3. Return s.

The production StatementList : StatementList Statement is evaluated as follows:
1. Let sl be the result of evaluating StatementList.
2. If sl is an abrupt completion, return sl.
3. Let s be the result of evaluating Statement.
4. If an exception was thrown, return (throw, V, empty) where V is the exception. (Execution now proceeds as if no exception were thrown.)
5. If s.value is empty, let V = sl.value, otherwise let V = s.value.
6. Return (s.type, V, s.target).

Насколько я понял этот текст, результатом интерпретации выражения { foo(); bar(); 10 } будет 10. Когда пишу такое выражение в REPL-е хромиума или фаербага, то в ответ получаю 10, что совпадает с моим пониманием спецификации.

Вопросы:

1. Почему результатом интерпретации { foo(); bar(); 10 } + 1 является 1?

2. Можно получить результат интерпретации блока через eval: eval('{ foo(); bar(); 10 }') + 1 == 11. Можно ли как-нибудь без eval-а обойтись?

Если интересно, для чего мне это нужно: хочу исправить баг в библиотеке clojurejs. Из (alert (if true (do (alert) «boom») «bam»)) она генерирует alert((true ? alert(); «boom»; : «bam»)), что неправильно. Если бы что-то типа этого alert((true ? { alert(); «boom» } : «bam»)) парсилось и работало, то фикс был бы тривиальным.

 

nozh
()

RSS подписка на новые темы