The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Компания Google открыла код утилиты для выявления утечек памяти в JavaScript-приложениях

09.08.2012 16:17

Компания Google представила новый открытый инструментарий Leak Finder, предназначенный для выявления утечек памяти в JavaScript-программах. Под утечками памяти подразумевается наличие объектов, которые не освобождаются сборщиком мусора из-за привязки к структурам данных JavaScript-библиотек, но уже не используются в пользовательском приложении. Утилита написана на языке Python и распространяется под лицензией Apache. Использование утилиты производится вкупе с браузером Chrome при помощи протокола удалённой отладки.

  1. Главная ссылка к новости (http://google-opensource.blogs...)
  2. OpenNews: Компания Google выпустила инструмент для оценки интенсивности использования JavaScript-конструкций
  3. OpenNews: Компания Google открыла код системы unit-тестирования проектов на языке JavaScript
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/34534-google
Ключевые слова: google, javascript, debug
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (70) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 19:29, 09/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    >Под утечками памяти подразумевается наличие объектов, которые не освобождаются сборщиком мусора из-за привязки к структурам данных JavaScript-библиотек, но уже не используются в пользовательском приложении.

    Ничего не понял. Разве не этим и должен заниматься сборщик мусора?

     
     
  • 2.6, Xasd (ok), 22:20, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +4 +/
    может сборщик мусора ещё и патчи в ядро linux должен отправлять сам? :-D
     
  • 2.21, Аноним (-), 13:36, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    А чего ему собирать? Это же не классическая утечка, а скорее неоптимальное использование, сборщик это не искусственный интеллект, приложение держит данные (библиотеки используемые в приложении) ну а раз держит то подразумевается что они нужны, вот память и не освобождается, как только станет понятно что эти данные не нужны (программист очистит список и т.п.) память автоматически освободится.
     
     
  • 3.42, Аноним (-), 19:59, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > А чего ему собирать? Это же не классическая утечка, а скорее неоптимальное
    > использование, сборщик это не искусственный интеллект, приложение держит данные

    Так в случае любой утечки примерно такая же ситуация, вид в профиль. В чем состоят 10 отличий? В том что утечки "теперь банановые"? Память то жрется одинаково :)

     
     
  • 4.53, Аноним (-), 20:52, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Жрется то одинаково, но причины разные, чуть ниже подробно описано.
     
     
  • 5.68, Аноним (-), 22:29, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Жрется то одинаково, но причины разные, чуть ниже подробно описано.

    Причины тоже примерно одинаковые, с точностью до сильно некоторых деталей.

     
     
  • 6.72, Аноним (-), 00:50, 11/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    ну этак вы дойдете до идеала вроде все есть все)
     

  • 1.2, Аноним (-), 20:05, 09/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Сейчас 95% яваскриптеров поделит на ноль: они думали что утечек памяти в JS не бывает. А тут вдруг как гром среди ясного неба утилита для борьбы с ними :)
     
     
  • 2.4, Аноним (-), 21:43, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Нужно просто сделать еще 1 язык поверх яваскрипта! Со своим сборщиком мусора, тогда точно не будет утечек!
     
     
  • 3.22, Аноним (-), 14:04, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не надо ничего делать, классических утечек итак нет, а то что конкретный программист вообще перестает следить за тем что делает, никаким языком не лечится.
     
     
  • 4.40, Аноним (-), 19:56, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Не надо ничего делать, классических утечек

    А что такое классическая утечка памяти? И чем отличается от НеКлассической (tm)?

    > итак нет, а то что конкретный программист вообще перестает следить за тем что
    > делает, никаким языком не лечится.

    Внезапно. Оказывается, если вы где-то продолбали некую сущность - она будет висеть в памяти и жрать ее. При том не так уж важен ЯП и конкретная модель управления памятью. Надо же, сюрприз! :)

    p.s.: жила была приблуда. Юзала extJS. Ну так вот, за ночь клала любой браузер. Забыли вкладку? Чпокс - браузер жрет под 2Гб памяти через 8 часиков :)


     
     
  • 5.51, Аноним (-), 20:39, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Вон там ниже по этому поводу уже было Утечка утечке рознь, сишных утечек т е ... большой текст свёрнут, показать
     
     
  • 6.52, Аноним (-), 20:50, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Ну т.е. разница грубо говоря в том что в первом случае человек ошибся с реализацией, а во втором даже и не собирался. Если в первом случае еще както можно ссылаться на сложность языка, то во втором уж чисто вина программиста. Когда у вас кролики с голоду подохли одно дело если у вас на покосе коса сломалась, может в нее вдруг молния ударила, не знаю, но совсем другое если вы даже и не выходили) Ну вот короче както так, надеюсь разница понятна. А результат к сожалению конечно один.
     
  • 5.59, www2 (??), 21:25, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >А что такое классическая утечка памяти? И чем отличается от НеКлассической (tm)?

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

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

    Ваш КО.

     
  • 4.41, Аноним (-), 19:58, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > итак

    Итак ... итак что? Поставьте ему двояк в четверти по русскому языку.

     
     
  • 5.45, Аноним (-), 20:04, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    гуляй
     
     
  • 6.50, Аноним (-), 20:34, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > гуляй

    И этому тоже двойку в четверти за безграмотность.

     
  • 2.9, Аноним (-), 22:46, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще ваш сарказм от незнания Нужно читать историю В реальности, JavaScript я... большой текст свёрнут, показать
     
     
  • 3.12, Xasd (ok), 23:06, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >>Сейчас 95% яваскриптеров поделит на ноль
    > Вообще ваш сарказм от незнания. Нужно читать историю. В реальности, JavaScript является
    > более совершенным языком, чем даже джава. ...

    верно-то оно верно (javascript более програссивный и сложный (гибкий) чем java) -- но вот только много-ли современных школо-программистов об этом знает? :-)

    чать людей кто пишет на javascript -- даже не понимают суть прототипов.

     
  • 3.13, VoDA (ok), 00:13, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Архитектура JavaScript позволяет перееопределять
    > объекты в реальном времени, а не втискиваться в узкие рамки типизации.

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

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


    PS java не идеал, но динамические языки имеют еще больше минусов.

     
     
  • 4.14, Школоло (?), 00:26, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >> Как проверить, что вызывающий код прислал объект правильного типа?

    type of

    Ваш, КО.

     
     
  • 5.19, dmrzh (?), 12:24, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >>> Как проверить, что вызывающий код прислал объект правильного типа?
    > type of
    > Ваш, КО.

    Тогда код будет пестрить проверками type of, особенно если ты пишешь библиотеку и кто угодно может вызывать твой код.

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

     
     
  • 6.23, Аноним (-), 14:13, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Тогда код будет пестрить проверками type of

    Будто в статическом коде этого нет, а с учетом описаний явной типизации так и того возможно больше.

     
     
  • 7.29, VoDA (ok), 15:24, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >> Тогда код будет пестрить проверками type of
    > Будто в статическом коде этого нет

    при статической типизации type of в 95% не нужен - тип описывается типом переменной или парметра. оставшиеся 5% это универсальный код, которых работает с AST или делает downcast.

    в отличии от этого в динамических языках придется или верить в то, что код работает с правильными типами (возможно для малых приложений или небольших скриптов) или фаршировать код пачками type of.

     
     
  • 8.31, Аноним (-), 15:41, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Верить в то, что код работает с правильными типами можно не только в малых прило... текст свёрнут, показать
     
     
  • 9.35, VoDA (ok), 16:53, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Собственно размер этого входа в больших приложениях - огромен Покажи плиз прим... текст свёрнут, показать
     
     
  • 10.37, Аноним (-), 17:52, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Да, а размер деклараций всех типов при статической типизации, и кучи извратов на... текст свёрнут, показать
     
     
  • 11.38, VoDA (ok), 18:35, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Собственно как я и предполагал Собственно вместо того, чтобы компилятор проверя... текст свёрнут, показать
     
     
  • 12.39, Аноним (-), 19:22, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    А то у вас так частенько не делается, да еще плюс своих косяков с метатипами и ш... большой текст свёрнут, показать
     
  • 7.43, Аноним (-), 20:01, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Будто в статическом коде этого нет,

    Нет, потому что компилятор мозг вынесет. И форсить преобразвания типов надо явно. Четко понимая что делаешь. А вот JS вообще довольно раздолбайский по синтаксису язык. И на типы пофиг, и переменные без декларации может объявлять.

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

     
     
  • 8.46, Аноним (-), 20:12, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    В вашем может и нет, а мне приходилось ковырять статику в которой такого хватает... текст свёрнут, показать
     
     
  • 9.54, Аноним (-), 20:57, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    В случае статики надо как минимум возжелать прострелить себе пятку То что это с... большой текст свёрнут, показать
     
     
  • 10.65, Аноним (-), 22:15, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Ды и не спорю же, косяки конечно есть, но и плюсы тоже, реально позволяет при оп... текст свёрнут, показать
     
     
  • 11.67, Аноним (-), 22:25, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Так чтобы были вообще одни минусы - это надо сильно постараться Даже у brainfuc... большой текст свёрнут, показать
     
     
  • 12.69, Аноним (-), 00:23, 11/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    на моей практике честно говоря от языка мало что зависит, мне удобнее перл js pl... текст свёрнут, показать
     
  • 5.25, VoDA (ok), 14:58, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    и вы предлагаете на каждый параметр в каждой функции вешать

    псевдокод:
    if(! obj type of SomeType) throw exception;

    ?

    и это удобство динамической типизации?

     
     
  • 6.30, Школоло (?), 15:25, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Только в том случае, если вы не умеете писать код, использующий динамическую типизацию..
     
     
  • 7.36, VoDA (ok), 16:55, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Только в том случае, если вы не умеете писать код, использующий динамическую
    > типизацию..

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

    Пусть будет простая функция с одним параметром-объектом, который содержит ФИО + тип документа + идентификатор документа (номер паспорта для паспорта).


    И как будет поймана ошибка в вызывающем коде, если название поля фамилия было отрефакторено на другое (lastname -> soname).

     
  • 4.17, dmrzh (?), 12:14, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    +1
     
  • 4.20, Xasd (ok), 12:58, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Для больших приложений это минус. Как сделать контракт между подсистемами, развиваемыми в разных командах или даже компаниях? Как проверить, что вызывающий код прислал объект правильного типа?

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

    и главное возникает вопрос -- а почему вдруг в какуюту функцию передастся объект неправильного типа? потомучто кто-то забудет сделать parseFloat() после document.querySelector() ??? тыг вот такая говноошибка будет сразу замечена при первом тестировании :) !! а другую более серьъёзную ошибку допустить очень трудно при утиной типизации.

     
     
  • 5.26, VoDA (ok), 15:00, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > как раз приложения и становятся большими -- потомучто эти интерпрайзные программы на
    > интэрпрайзных языкы программирования (со статической типизацией) -- содержат хренову
    > тучу кода всяких интерфейсов для типовго согласования... если всё это дерьмищще
    > поудалять то сразу оказывается что программа-то маленькая.

    Да, объем кода реализации контрактов уменьшится. Зато увеличится трудоемкость проверки правильности входящих параметров. Т.е. интерфейсы без кода заменятся на код в КАЖДОЙ функции доступной из вне. Удобно - фигли )))

     
     
  • 6.32, Аноним (-), 15:52, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Вполне удобно, то время которое тратиться на написание проверок компенсируется временем на их выражение в чисто декларативном интерфейсе, плавали, знаем, то там не срастается, то сям, и приходится сидеть и чесать репу, время также уходит.
     
     
  • 7.55, Аноним (-), 20:58, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > не срастается, то сям, и приходится сидеть и чесать репу, время также уходит.

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

     
     
  • 8.60, Аноним (-), 21:34, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Неочевидных багов и в статике хватает... текст свёрнут, показать
     
     
  • 9.66, Аноним (-), 22:19, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Си вообще не то чтобы строго типизированный ЯП Его типы - по сути просто compil... большой текст свёрнут, показать
     
     
  • 10.71, Аноним (-), 00:38, 11/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    да вариантов куча, и нужно выбирать оптимальный под конкретные условия, а не еди... текст свёрнут, показать
     
  • 5.27, VoDA (ok), 15:07, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > и главное возникает вопрос -- а почему вдруг в какуюту функцию передастся
    > объект неправильного типа? потомучто кто-то забудет сделать parseFloat() после document.querySelector()
    > ??? тыг вот такая говноошибка будет сразу замечена при первом тестировании
    > :) !! а другую более серьъёзную ошибку допустить очень трудно при
    > утиной типизации.

    Потому что контракт изменился. Функция принимает на вход объект с полями firstname, secondname, soname (так обозвали ФИО) + passportNumber. Библиотека была доработана и поле фамилии было переименовано из soname в lastname. В java эта ошибка будет выявлена в момент компиляции зависимых проектов - compilation error поскольку старого поля просто нет.

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


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

     
     
  • 6.34, Аноним (-), 15:57, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Статическая типизация тоже не идеал, но проблему согласования типов и полей она
    > решает просто. Плюс рефакторинг поверх статически типизируемых языков работают намного
    > лучше.

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

     
     
  • 7.44, Аноним (-), 20:03, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > некоторых условиях позволяют лишний раз не напрягаться.

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

     
     
  • 8.49, Аноним (-), 20:17, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Могут, да но на практике мне например на том же перле писать да и поддерживать ... текст свёрнут, показать
     
     
  • 9.57, Аноним (-), 21:00, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Дельфя как и паскаль может быть излишне занудны Но к порядку приучают хорошо В... текст свёрнут, показать
     
     
  • 10.61, Аноним (-), 21:40, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Ога, или в вашем ... текст свёрнут, показать
     
     
  • 11.64, Аноним (-), 22:14, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    В моем вы не сможете, увы Объяснить почему, или сами догадаетесь P... текст свёрнут, показать
     

  • 1.3, добрый дядя (?), 21:32, 09/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    О яваскрипте лишь крайне мало знаю, но был уверен что слова утечка и яваскрипт не могут быть в одном предложении...
     
     
  • 2.5, Andrey Mitrofanov (?), 22:20, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Джавваскриптерам мешают джавваскрипт библиотеки! Ну, то есть не са-а-ами библиотеки, а привязка объектов к структурам данных библиотек. Понимаете?!! Вот так всё непросто.:'(
     
     
  • 3.28, Аноним (-), 15:12, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Утечка утечке рознь, сишных утечек (т.е. когда программист сказал что объект ему не нужен - убрал/обнулил ссылку, но память при этом не освободил) в JS нет, а вот когда он совсем не чешется (никак не сообщает о том что данные ему больше не нужны и это невозможно выяснить логически - не очищает уже не нужные списки, не закрывает файлы и т.п.) тогда да, всеравно получается утечка, другого рода как понимаете, но результат тот же.
     
     
  • 4.47, Аноним (-), 20:15, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Утечка утечке рознь, сишных утечек

    Да, ежу понятно что в яваскрипте не может быть сишных утечек. Хотя-бы потому что JS != C :)

     
  • 2.7, Xasd (ok), 22:24, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > О яваскрипте лишь крайне мало знаю, но был уверен что слова утечка
    > и яваскрипт не могут быть в одном предложении...

    function xxx() {
        // ...
        obj.addEventListener(a, b)
        // ...
    }

    теперь при каждом вызове xxx() -- будет утечка ресурсов...

    ну а вообще можно и такое сделать:

    var my_list = []
    function yyy(a) {
        // ...
        my_list.push(a)
        // ...
    }

    вот вам и типичная утечка памяти, при каждом вызове yyy(), если my_list не чистится

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

    а новомодная функция ''objectURL = window.URL.createObjectURL(file);'' -- это вообще рай для мусора :-)

     
     
  • 3.8, Аноним (-), 22:44, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >теперь при каждом вызове xxx() -- будет утечка ресурсов...

    Извините, но это утечка мозга.

     
     
  • 4.10, Аноним (-), 22:47, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >>теперь при каждом вызове xxx() -- будет утечка ресурсов...
    > Извините, но это утечка мозга.

    Возможно стоило дальше расписать пример, что представляют из себя a и b?

     
     
  • 5.11, Xasd (ok), 22:59, 09/08/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Возможно стоило дальше расписать пример, что представляют из себя a и b?

    я и сам не знаю :-D

    ..просто предположил что если очень быстро печатать код -- то можно случайно такое написать :-D :-D

     
  • 4.48, Аноним (-), 20:16, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Извините, но это утечка мозга.

    То же самое можно сказать и про иные утечки памяти :)

     
     
  • 5.56, Аноним (-), 20:59, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Да не скажите, одно дело если человек ошибся из за сложности структуры и особенностей языка, и совсем другое если он откровенно положил.
     
     
  • 6.58, Аноним (-), 21:03, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Да не скажите, одно дело если человек ошибся из за сложности структуры
    > и особенностей языка, и совсем другое если он откровенно положил.

    Знаете, в простых случаях на си тоже сложно откровенно положить :)

    Более того - явная аллокация памяти например позволяет ловить ошибки выделения этой самой памяти. В си если мы хотим блок на 100500 мегов который быть в принципе и не обязан - можно посмотреть: реально такое получить или облом. И сбой выделения можно поймать. А что в JS будет? Ну в общем по этому поводу он и пригоден для написания всякой развлекательной фигни. А например для системных дел где надежность нужна - не подойдет никогда.

     
     
  • 7.62, Аноним (-), 21:50, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Вы таки не поверите, юзается у меня для сбора инфы с контроллеров контроля доступа на режимном предприятии, и ниче, всех устраивает, а на сях писать некому.
     
     
  • 8.63, Аноним (-), 22:12, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Я и не сомневался что совковые предприятия не готовы платить нормальным спецам ... текст свёрнут, показать
     
     
  • 9.70, Аноним (-), 00:26, 11/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    не выебывайся дитё... текст свёрнут, показать
     
  • 2.15, XoRe (ok), 01:37, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > крайне мало знаю
    > но был уверен

    Как мило)
    Вот, спорим, в разговор двух преподов вы с такими словами не вклинитесь?

     

  • 1.16, Анонимусс (?), 08:21, 10/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Ничего вы не понимаете - это не утечки, это особенность такая! Надо просто чаще нажимать F5 и все будет хорошо. И компьютер после рабочего дня выключать (из розетки)
     
     
  • 2.24, Аноним (-), 14:48, 10/08/2012 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Отлично пошутил, молодец.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру