• Куда переехать для создания команды

    Cyapa
    @Cyapa
    А как вам Новосибирск, например? Технических ВУЗов валом, уровень образования хороший, одни только НГУ и НГТУ чего стоят. Программистов тоже полно, много хороших компаний. Цены приемлемы, квартиру можно найти за пару дней. Инфраструктура хорошо развита, крупнейший город России как ни как. Ну и, как плюс, гостей из южных стран практически нет.
    Ответ написан
    4 комментария
  • Нужен слайдер, как у Газпрома?

    theRandom
    @theRandom
    Посмотрите на этот проект. По крайней мере есть от чего отталкиваться.
    Ответ написан
    Комментировать
  • 5–6 нубских вопросов по работе сети (осторожно! крайняя степень некомпетентности автора!)?

    kyberorg
    @kyberorg
    Ответы:
    пункты 1 и 2. Маска подсети.
    Следующее расширение сделано правильно (/23 или 255.255.254.0).
    Возможно проблемы возникли из-за того, что на локальном компе, откуда настроили роутер сеть осталась с прежней маской (255.255.255.0) со всеми вытекающими последствиями в виде разных broadcast'ов. Но это предположение.
    Не все оборудование умеет работать с масками CIDR. Это те маски, которые между 255.0.0.0, 255.255.0.0, 255.255.255.0. У меня даже linksys один не умел.
    Поэтому, как вариант использовать маску /16 (255.255.0.0)

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

    4. Сервера
    Про шлюз: вполне можно, но тут зависит от того, как вы выходите в интернет.
    Про БД и бекапы: БД виртуализировать не рекомендуется, очень уж там сильное I/O и доп. уровень абстракции будет мешать.
    Про версию: у меня работало и на 2012 и на 2008R2, но не дальше тестов. Боевая сеть работает на VmWare ESXi 5.1. Мне кажется, что 2012й будет лучше, ибо баги выявленные в 2008R2 пофиксили и новых фич (ну и багов, конечно) добавили.
    Про бекапы: в идеале выделить одельную машину под это благое дело, а лучше NAS, который много что умеет.

    5. Wi-fi
    Уточните: а Вы на точках WPS используете?
    Про камаз: можно разжиться повторителями или AP в режиме повторителя. По антеннам: можно использовать сборки с усилителями.
    Ответ написан
    5 комментариев
  • 3D модель дивана на сайте

    Alexufo
    @Alexufo
    противоречивый, сложный, весь компьютерный.
    Идея забавная но по смыслу это 0. Никакое 3D не даст понятия ни о текстуре ни о цвете. Только фотографии на фоне интерьера скажет о товаре чтото. А если нужна фишка ради фишки… конечно же только флеш. На javascript 3D будет нереально тормозить хотя есть движки.
    Из флеш движков alternativa 3D и что то еще забугорное.

    Но я советую не 3D. Лучше генерить изображения Вращать диван особо нет смысла. Лучше 3 положения.
    Ответ написан
    Комментировать
  • Нужен слайдер, как у Газпрома?

    vakunenko
    @vakunenko
    Можно у Лебедева спросить tema@tema.ru
    Ответ написан
    Комментировать
  • Нужен слайдер, как у Газпрома?

    hashspark
    @hashspark
    Вот вариант. Немного надо доработать.
    Ответ написан
    3 комментария
  • Нужен слайдер, как у Газпрома?

    Shultc
    @Shultc
    RnD Developer
    Там не так уж много кода:
    Скрытый текст
    package org.noregret.log {
        import flash.events.*;
        import flash.display.*;
        import flash.system.*;
        import flash.text.*;
        import org.noregret.utils.*;
        import flash.utils.*;
        import flash.external.*;
        import flash.ui.*;
    
        public class LogPanel extends Sprite {
    
            public static const INSTANCE:LogPanel = new (LogPanel)();
    ;
            public static const TYPE_ERROR:String = "errorMessage";
            private static const DEFAULT_SHORTCUT:Array = [Keyboard.CONTROL, Keyboard.SHIFT, Keyboard.SPACE];
            private static const COPY_EVENT:String = "copyToClipboard";
            public static const TYPE_PLAIN:String = "plainMessage";
            public static const TYPE_NOTIFY:String = "notifyMessage";
            public static const TYPE_WARNING:String = "warningMessage";
    
            public static var COLOR_WARNING:uint = 0x990099;
            private static var line_count:uint;
            public static var enableTraceInform:Boolean = false;
            public static var enableTraceErrors:Boolean = false;
            private static var charHash:Object = {};
            private static var keyCodeHash:Object;
            public static var COLOR_DEFAULT:uint = COLOR_PLAIN;
            private static var currentKey:uint;
            public static var COLOR_PLAIN:uint = 0x333333;
            private static var openKey:uint;
            public static var enableTraceAll:Boolean = false;
            public static var enabled:Boolean = true;
            public static var COLOR_NOTIFY:uint = 153;
            private static var messageList:Array;
            public static var FONT:String = "_typewriter";
            public static var maxMessages:Number = 100;
            public static var enableTraceNotify:Boolean = false;
            public static var COLOR_ERROR:uint = 0xFF0000;
            public static var shortcutString:String;
            private static var ERROR_SINGLTONE:Number = 0;
            public static var enableTraceWarnings:Boolean = false;
            private static var KEY_COPY:Number = "c".charCodeAt(0);
    
            private var logTextField:TextField;
    
            public function LogPanel(){
                super();
                if (INSTANCE){
                    throw (new Error((getQualifiedClassName(this) + " is a Singletone!"), ERROR_SINGLTONE));
                };
                logTextField = makeTextField(500, 500);
                logTextField.addEventListener(TextEvent.LINK, onLinkTrigger);
                addChild(logTextField);
                messageList = new Array();
                addEventListener(Event.ADDED_TO_STAGE, onAddToStage);
                visible = false;
                setShortcut(DEFAULT_SHORTCUT);
            }
            public static function setShortcut(... _args):String{
                var code:uint;
                var keyCount:int;
                var key:String;
                var char:String;
                var validateFlag:Boolean;
                var keyNameList:Array;
                var i:int;
                keyCodeHash = {};
                charHash = {};
                if ((_args[0] is Array)){
                    var list:Array = _args[0];
                };
                keyCount = 0;
                key = "";
                char = "";
                validateFlag = false;
                keyNameList = [];
                i = 0;
                for (;(((i < _args.length)) && ((keyCount < 4)));i++) {
                    char = null;
                    if ((_args[i] is String)){
                        char = (_args[i] as String).toLowerCase().substr(0, 1);
                        if (!char.length){
                            continue;
                        };
                        code = char.charCodeAt(0);
                    } else {
                        code = uint(_args[i]);
                    };
                    validateFlag = (((((code > 32)) && ((code <= 160)))) || (KeyboardHelper.isSpecialKey(code)));
                    if (((((((isNaN(code)) || (!(validateFlag)))) || (!((keyCodeHash[code] == null))))) || (!((charHash[char] == null))))){
                    } else {
                        if (char){
                            charHash[code] = keyCount;
                        } else {
                            keyCodeHash[code] = keyCount;
                        };
                        keyNameList.push(KeyboardHelper.getKeyName(code));
                        keyCount++;
                        key = (key + "1");
                    };
                };
                if (keyCount){
                    openKey = parseInt(key, 2);
                } else {
                    return (setShortcut(DEFAULT_SHORTCUT));
                };
                currentKey = 0;
                shortcutString = keyNameList.join("+");
                return (shortcutString);
            }
            public static function warn(message:Object, sender=null):void{
                if (((enableTraceWarnings) || (enableTraceAll))){
                    trace((("*** LogPanel.warn(" + arguments) + ")"));
                };
                add(addSender(message, sender), LogPanel.TYPE_WARNING);
            }
            public static function show():void{
                INSTANCE.visible = true;
                INSTANCE.buildDebugPanel();
                if (INSTANCE.stage){
                    INSTANCE.stage.addChild(INSTANCE);
                };
            }
            public static function error(message:Object, sender=null):void{
                if (((enableTraceErrors) || (enableTraceAll))){
                    trace((("*** LogPanel.error(" + arguments) + ")"));
                };
                add(addSender(message, sender), LogPanel.TYPE_ERROR);
            }
            private static function add(message:String, type:String):void{
                var str:String;
                if (!enabled){
                    return;
                };
                line_count++;
                str = (("<span class='count'>" + StringUtils.trimAndFormat(line_count, 3, 0)) + "</span>: ");
                str = (str + (((("<span class='" + type) + "'>") + message) + "</span>"));
                str = (str + (("<span class='time'> (" + getTimer()) + " msec)</span>"));
                messageList.push(str);
                while (messageList.length > LogPanel.maxMessages) {
                    messageList.shift();
                };
                if (INSTANCE.visible){
                    INSTANCE.buildDebugPanel();
                };
            }
            private static function addSender(message, sender=null):String{
                var msg:String;
                msg = String(message);
                msg = msg.split(">").join(">");
                msg = msg.split("<").join("<");
                if (sender){
                    return ((((("<span class='sender'>" + getQualifiedClassName(sender)) + "</span>: <span class='item'>") + msg) + "</span>"));
                };
                return (msg);
            }
            public static function hide():void{
                INSTANCE.visible = false;
            }
            public static function notify(message:Object, sender=null):void{
                if (((enableTraceNotify) || (enableTraceAll))){
                    trace((("*** LogPanel.notify(" + arguments) + ")"));
                };
                add(addSender(message, sender), LogPanel.TYPE_NOTIFY);
            }
            public static function clear():void{
                messageList = new Array();
                line_count = 0;
                INSTANCE.logTextField.htmlText = getHeaders();
            }
            private static function getHeaders():String{
                var html:String;
                html = "";
                html = (html + "<p class='headers'>");
                html = (html + (("<p class='shortcut'>shortcut = " + shortcutString) + "</p>"));
                html = (html + (("<p class='copy'><a href='event:" + COPY_EVENT) + "'>copy to clipboard</a></p>"));
                html = (html + "<p class='break'></p>");
                html = (html + (((("<p class='player'>Player: <b>" + Capabilities.version) + "</b> ") + Capabilities.playerType) + "</p>"));
                html = (html + (("<p class='os'>OS: <b>" + Capabilities.os) + "</b>, "));
                html = (html + (((("resolution: <b>" + Capabilities.screenResolutionX) + "×") + Capabilities.screenResolutionY) + "</b></p>"));
                html = (html + (("<p class='externalinterface'>ExternalInterface: <b>" + ((ExternalInterface.available) ? "IS" : "IS NOT")) + "</b> available</p>"));
                html = (html + "<p class='break'></p>");
                html = (html + "</p>");
                return (html);
            }
            public static function notifyIncomingParameters():void{
                var message:String;
                var params:Object;
                var name:String;
                message = "Incoming parameters: [";
                if (INSTANCE.stage){
                    params = INSTANCE.root.loaderInfo.parameters;
                    for (name in params) {
                        message = (message + ((("\n  " + name) + "=") + params[name]));
                    };
                    message = (message + "\n]");
                } else {
                    message = (message + "not accessible]");
                };
                notify(message);
            }
            public static function inform(message, sender=null):void{
                if (((enableTraceInform) || (enableTraceAll))){
                    trace((("LogPanel.inform(" + arguments) + ")"));
                };
                add(addSender(message, sender), LogPanel.TYPE_PLAIN);
            }
    
            private function onKeyUpHandler(event:KeyboardEvent):void{
                var position:Number;
                if (!enabled){
                    return;
                };
                position = getKeyPosition(event);
                if (isNaN(position)){
                    return;
                };
                currentKey = (currentKey & (0xFFFFFFFF ^ (1 << position)));
            }
            private function onKeyDownHandler(event:KeyboardEvent):void{
                var position:Number;
                if (!enabled){
                    return;
                };
                position = getKeyPosition(event);
                if (isNaN(position)){
                    return;
                };
                currentKey = (currentKey | (1 << position));
                if (currentKey == openKey){
                    if (visible){
                        hide();
                    } else {
                        show();
                    };
                };
            }
            private function makeTextField(w:uint, h:uint):TextField{
                var TF:TextField;
                TF = new TextField();
                TF.border = true;
                TF.width = w;
                TF.height = h;
                TF.background = true;
                TF.multiline = true;
                TF.wordWrap = true;
                TF.backgroundColor = 0xFFFFFF;
                TF.styleSheet = new StyleSheet();
                TF.styleSheet.setStyle("p", {
                    fontFamily:FONT,
                    letterSpacing:0,
                    marginLeft:5
                });
                TF.styleSheet.setStyle("a", {textDecoration:"underline"});
                TF.styleSheet.setStyle("a:hover", {
                    textDecoration:"underline",
                    color:"#CC0000"
                });
                TF.styleSheet.setStyle(".count", {
                    color:"#999999",
                    fontSize:10
                });
                TF.styleSheet.setStyle(".time", {
                    color:"#559955",
                    fontSize:10
                });
                TF.styleSheet.setStyle(".copy", {
                    color:"#000066",
                    fontSize:11,
                    fontWeight:"bold"
                });
                TF.styleSheet.setStyle(".shortcut", {color:"#000000"});
                TF.styleSheet.setStyle(".headers", {
                    color:"#666600",
                    fontSize:11
                });
                TF.styleSheet.setStyle(".messages", {
                    color:("#" + StringUtils.addLeadingZeros(COLOR_DEFAULT.toString(16), 6)),
                    fontSize:12
                });
                TF.styleSheet.setStyle(".break", {fontSize:8});
                TF.styleSheet.setStyle(("." + TYPE_PLAIN), {color:("#" + StringUtils.addLeadingZeros(COLOR_PLAIN.toString(16), 6))});
                TF.styleSheet.setStyle(("." + TYPE_ERROR), {
                    color:("#" + StringUtils.addLeadingZeros(COLOR_ERROR.toString(16), 6)),
                    fontWeight:"bold"
                });
                TF.styleSheet.setStyle(("." + TYPE_WARNING), {
                    color:("#" + StringUtils.addLeadingZeros(COLOR_WARNING.toString(16), 6)),
                    fontStyle:"italic"
                });
                TF.styleSheet.setStyle(("." + TYPE_NOTIFY), {color:("#" + StringUtils.addLeadingZeros(COLOR_NOTIFY.toString(16), 6))});
                return (TF);
            }
            private function onResize(event:Event=null):void{
                if (((INSTANCE.stage) && (INSTANCE.visible))){
                    logTextField.height = (INSTANCE.stage.stageHeight - 1);
                    logTextField.width = (INSTANCE.stage.stageWidth / 2);
                };
            }
            private function getKeyPosition(event:KeyboardEvent):Number{
                if (isNaN(charHash[event.charCode])){
                    return (keyCodeHash[event.keyCode]);
                };
                return (charHash[event.charCode]);
            }
            private function buildDebugPanel():void{
                var html:String;
                if (INSTANCE.stage == null){
                    return;
                };
                html = getHeaders();
                html = (html + (("<p class=\"messages\">" + messageList.join("<br/>")) + "</p>"));
                logTextField.htmlText = html;
                logTextField.scrollV = logTextField.maxScrollV;
                onResize();
            }
            private function onAddToStage(event:Event):void{
                INSTANCE.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
                INSTANCE.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
                INSTANCE.stage.addEventListener(KeyboardEvent.KEY_DOWN, onCopyKey);
                INSTANCE.stage.addEventListener(Event.RESIZE, onResize);
                logTextField.height = INSTANCE.stage.stageHeight;
                onResize();
            }
            private function copyToClipboard():void{
                buildDebugPanel();
                System.setClipboard(logTextField.text);
            }
            private function onCopyKey(event:KeyboardEvent):void{
                if (!enabled){
                    return;
                };
                if (((event.ctrlKey) && ((event.charCode == KEY_COPY)))){
                    copyToClipboard();
                };
            }
            private function onLinkTrigger(event:TextEvent):void{
                switch (event.text){
                    case COPY_EVENT:
                        copyToClipboard();
                        break;
                };
                copyToClipboard();
            }
    
        }
    }//package org.noregret.log 
    package org.noregret.utils {
    
        public final class StringUtils {
    
            private static var CACHE_ZEROS:String = "0000000000000000000000000000000";
    
            public function StringUtils(){
                super();
            }
            public static function roundAndFormat(value:Number, intLength:Number, floatLength:Number, fractionDelimiter:String="."):String{
                var decimalRange:Number;
                if (((!(isNaN(floatLength))) && ((floatLength > 0)))){
                    decimalRange = Math.pow(10, floatLength);
                    value = (Math.round((value * decimalRange)) / decimalRange);
                };
                return (trimAndFormat(value, intLength, floatLength, fractionDelimiter));
            }
            public static function floorAndFormat(value:Number, intLength:Number, floatLength:Number, fractionDelimiter:String="."):String{
                return (trimAndFormat(value, intLength, floatLength, fractionDelimiter));
            }
            public static function trimAndFormat(value:Number, intLength:Number, floatLength:Number, fractionDelimiter:String="."):String{
                var decimalRange:Number;
                var result:String;
                var heap:Array;
                var str:String;
                if (((isNaN(intLength)) || ((intLength < 0)))){
                    str = String(int(value));
                    intLength = str.length;
                    if (str.charAt(0) == "-"){
                        intLength--;
                    };
                };
                if (((isNaN(floatLength)) || ((floatLength < 0)))){
                    floatLength = 0;
                };
                decimalRange = Math.pow(10, floatLength);
                result = String((Math.floor((value * decimalRange)) / decimalRange));
                heap = result.split(".");
                if ((((heap.length < 2)) && ((floatLength > 0)))){
                    heap.push("");
                };
                heap[0] = StringUtils.addLeadingZeros(heap[0], intLength);
                if (heap.length > 1){
                    heap[1] = StringUtils.addTrailingZeros(heap[1], floatLength);
                };
                return (heap.join(fractionDelimiter));
            }
            private static function getZeros(len:Number):String{
                var count:Number;
                var i:Number;
                if (CACHE_ZEROS.length >= len){
                    return (CACHE_ZEROS);
                };
                count = CACHE_ZEROS.length;
                i = 0;
                while (i < (len - count)) {
                    CACHE_ZEROS = (CACHE_ZEROS + "0");
                    i++;
                };
                return (CACHE_ZEROS);
            }
            public static function addLeadingZeros(value:Object, len:Number):String{
                var str:String;
                var isNegative:Boolean;
                var strLength:Number;
                var lead:String;
                var result:String;
                str = String(value);
                isNegative = (str.charAt(0) == "-");
                strLength = (str.length - ((isNegative) ? 1 : 0));
                if (((isNaN(len)) || ((strLength >= len)))){
                    return (str);
                };
                lead = getZeros(len);
                result = lead.substr(0, (len - strLength));
                if (isNegative){
                    return ((("-" + result) + str.substr(1)));
                };
                return ((result + str));
            }
            public static function ceilAndFormat(value:Number, intLength:Number, floatLength:Number, fractionDelimiter:String="."):String{
                var decimalRange:Number;
                if (((!(isNaN(floatLength))) && ((floatLength > 0)))){
                    decimalRange = Math.pow(10, floatLength);
                    value = (Math.ceil((value * decimalRange)) / decimalRange);
                };
                return (trimAndFormat(value, intLength, floatLength, fractionDelimiter));
            }
            public static function addTrailingZeros(value:String, len:Number):String{
                var trail:String;
                if (((isNaN(len)) || ((value.length >= len)))){
                    return (value);
                };
                trail = getZeros(len);
                return ((value + trail.substr(0, (len - value.length))));
            }
    
        }
    }//package org.noregret.utils 
    package org.noregret.utils {
        import flash.ui.*;
    
        public class KeyboardHelper {
    
            private static const ARROW_HASH:Object = {};
            private static const F_HASH:Object = {};
            private static const NUMPAD_HASH:Object = {};
            private static const CONTROL_HASH:Object = {};
            private static const NAVIGATION_HASH:Object = {};
            private static const KNOWN_LIST:Array = [ARROW_HASH, NUMPAD_HASH, F_HASH, NAVIGATION_HASH, CONTROL_HASH];
            private static const KNOWN_KEYS_HASH:Object = {};
    
            private static var i:int = 0;
            private static var j:String;
    
            public function KeyboardHelper(){
                super();
                trace("KeyboardHelper.KeyboardHelper(): Class is static! You don't need any instances.");
            }
            public static function getKeyName(keyCode:uint, charCode:uint=0):String{
                if (KNOWN_KEYS_HASH[keyCode]){
                    return (KNOWN_KEYS_HASH[keyCode]);
                };
                if (keyCode < 32){
                    return ((((("key " + keyCode) + "(0x") + StringUtils.addLeadingZeros(keyCode.toString(16).toUpperCase(), 2)) + ")"));
                };
                if (keyCode > 160){
                    return (String.fromCharCode(((charCode) || (keyCode))));
                };
                return (String.fromCharCode(keyCode));
            }
            public static function isSpecialKey(keyCode:uint):Boolean{
                return (Boolean(KNOWN_KEYS_HASH[keyCode]));
            }
            public static function isNumpad(keyCode:uint):Boolean{
                return (Boolean(NUMPAD_HASH[keyCode]));
            }
            public static function isF(keyCode:uint):Boolean{
                return (Boolean(F_HASH[keyCode]));
            }
            public static function isNavigation(keyCode:uint):Boolean{
                return (Boolean(NAVIGATION_HASH[keyCode]));
            }
            public static function isArrow(keyCode:uint):Boolean{
                return (Boolean(ARROW_HASH[keyCode]));
            }
    
            ARROW_HASH[Keyboard.UP] = "arrow up";
            ARROW_HASH[Keyboard.DOWN] = "arrow down";
            ARROW_HASH[Keyboard.LEFT] = "arrow left";
            ARROW_HASH[Keyboard.RIGHT] = "arrow right";
            NUMPAD_HASH[Keyboard.NUMPAD_0] = "numpad 0";
            NUMPAD_HASH[Keyboard.NUMPAD_1] = "numpad 1";
            NUMPAD_HASH[Keyboard.NUMPAD_2] = "numpad 2";
            NUMPAD_HASH[Keyboard.NUMPAD_3] = "numpad 3";
            NUMPAD_HASH[Keyboard.NUMPAD_4] = "numpad 4";
            NUMPAD_HASH[Keyboard.NUMPAD_5] = "numpad 5";
            NUMPAD_HASH[Keyboard.NUMPAD_6] = "numpad 6";
            NUMPAD_HASH[Keyboard.NUMPAD_7] = "numpad 7";
            NUMPAD_HASH[Keyboard.NUMPAD_8] = "numpad 8";
            NUMPAD_HASH[Keyboard.NUMPAD_9] = "numpad 9";
            NUMPAD_HASH[Keyboard.NUMPAD_ADD] = "numpad add";
            NUMPAD_HASH[Keyboard.NUMPAD_MULTIPLY] = "numpad multiply";
            NUMPAD_HASH[Keyboard.NUMPAD_DIVIDE] = "numpad divide";
            NUMPAD_HASH[Keyboard.NUMPAD_SUBTRACT] = "numpad subtract";
            NUMPAD_HASH[Keyboard.NUMPAD_ENTER] = "numpad enter";
            NUMPAD_HASH[Keyboard.NUMPAD_DECIMAL] = "numpad decimal";
            F_HASH[Keyboard.F1] = "f1";
            F_HASH[Keyboard.F2] = "f2";
            F_HASH[Keyboard.F3] = "f3";
            F_HASH[Keyboard.F4] = "f4";
            F_HASH[Keyboard.F5] = "f5";
            F_HASH[Keyboard.F6] = "f6";
            F_HASH[Keyboard.F7] = "f7";
            F_HASH[Keyboard.F8] = "f8";
            F_HASH[Keyboard.F9] = "f9";
            F_HASH[Keyboard.F10] = "f10";
            F_HASH[Keyboard.F11] = "f11";
            F_HASH[Keyboard.F12] = "f12";
            F_HASH[Keyboard.F13] = "f13";
            F_HASH[Keyboard.F14] = "f14";
            F_HASH[Keyboard.F15] = "f15";
            NAVIGATION_HASH[Keyboard.PAGE_DOWN] = "page down";
            NAVIGATION_HASH[Keyboard.PAGE_UP] = "page up";
            NAVIGATION_HASH[Keyboard.HOME] = "home";
            NAVIGATION_HASH[Keyboard.END] = "end";
            NAVIGATION_HASH[Keyboard.INSERT] = "insert";
            NAVIGATION_HASH[Keyboard.DELETE] = "delete";
            CONTROL_HASH[Keyboard.CONTROL] = "control";
            CONTROL_HASH[Keyboard.SHIFT] = "shift";
            CONTROL_HASH[Keyboard.CAPS_LOCK] = "caps lock";
            CONTROL_HASH[144] = "num lock";
            while (i < KNOWN_LIST.length) {
                for (j in KNOWN_LIST[i]) {
                    KNOWN_KEYS_HASH[j] = KNOWN_LIST[i][j];
                };
                i++;
            };
            KNOWN_KEYS_HASH[Keyboard.SPACE] = "space";
            KNOWN_KEYS_HASH[160] = "non-breaking space";
            KNOWN_KEYS_HASH[Keyboard.ENTER] = "enter";
            KNOWN_KEYS_HASH[Keyboard.BACKSPACE] = "backspace";
        }
    }//package org.noregret.utils 
    package ru.isky.external {
        import flash.events.*;
        import flash.net.*;
    
        public class ExternalConnector extends EventDispatcher {
    
            private var connectionClient:Object;
            private var connector:LocalConnection;
    
            public function ExternalConnector(){
                super();
            }
            private function onMessageRecieve(message:Array):void{
                var methodName:String;
                var parameters:Array;
                methodName = message[0];
                parameters = message[1];
                dispatchEvent(new ExternalConnectorEvent(ExternalConnectorEvent.ON_MESSAGE, methodName, parameters));
            }
            public function connect(connectionID:String):void{
                var connectionID:* = connectionID;
                connectionClient = new Object();
                connectionClient[SWFConnector.METHOD_NAME] = onMessageRecieve;
                connector = new LocalConnection();
                connector.client = connectionClient;
                try {
                    connector.connect(connectionID);
                } catch(error:ArgumentError) {
                    throw (new Error("Данное соединение занято"));
                };
            }
    
        }
    }//package ru.isky.external 
    package ru.isky.external {
        import flash.display.*;
        import flash.net.*;
    
        public class SWFConnector extends Sprite {
    
            public static const METHOD_NAME:String = "onCallbackHandler";
    
            public function SWFConnector(){
                var commands:* = null;
                var commandList:* = null;
                var commandXML:* = null;
                var paramslist:* = null;
                var parameters:* = null;
                var i:* = NaN;
                var k:* = NaN;
                super();
                commands = root.loaderInfo.parameters["xml_commands"];
                if ((((commands == null)) || ((commands.length == 0)))){
                    throw (new Error("Variable xml_commands must contain commands"));
                };
                try {
                    commandList = new XMLList(commands);
                } catch(error:Error) {
                    throw (new Error(("Content in xml_commands variable is not valid XML:" + commands)));
                };
                i = 0;
                while (i < commandList.length()) {
                    commandXML = commandList[i];
                    parameters = [];
                    paramslist = commandXML..param;
                    k = 0;
                    while (k < paramslist.length()) {
                        parameters[k] = paramslist[k];
                        k = (k + 1);
                    };
                    executeCommand(commandXML, parameters);
                    i = (i + 1);
                };
            }
            private function executeCommand(commandXML:XML, parameters:Array):void{
                var connector:LocalConnection;
                var connection_id:String;
                var method_name:String;
                connector = new LocalConnection();
                connection_id = commandXML.attribute("targetConnectionID");
                method_name = commandXML.attribute("methodName");
                connector.send(connection_id, METHOD_NAME, [method_name, parameters]);
            }
    
        }
    }//package ru.isky.external 
    package ru.isky.external {
        import flash.events.*;
    
        public class ExternalConnectorEvent extends Event {
    
            public static const ON_CONNECTION_BUSY:String = "onConnectionBusy";
            public static const ON_MESSAGE:String = "onMessageRecieved";
    
            public var parameters:Array;
            public var methodName:String;
    
            public function ExternalConnectorEvent(type:String, _methodName:String=null, _parameters:Array=null, bubbles:Boolean=false, cancelable:Boolean=false){
                super(type, bubbles, cancelable);
                methodName = _methodName;
                parameters = _parameters;
            }
        }
    }//package ru.isky.external 
    package ru.isky.multiloader {
        import flash.events.*;
    
        public class DataLoaderEvent extends Event {
    
            public static const ON_ERROR:String = "onError";
            public static const ON_COMPLETE:String = "onComplete";
            public static const ON_PROGRESS:String = "onProgress";
    
            public var error:String;
            public var id:uint;
    
            public function DataLoaderEvent(type:String, _id:uint, _error:String=null, bubbles:Boolean=false, cancelable:Boolean=false){
                super(type, bubbles, cancelable);
                id = _id;
                error = _error;
            }
            override public function toString():String{
                return (((((("id:" + id) + ", error:") + error) + " ") + super.toString()));
            }
    
        }
    }//package ru.isky.multiloader 
    package ru.isky.multiloader {
        import flash.events.*;
    
        public class MultiloaderEvent extends Event {
    
            public static const ON_ITEM_LOADED:String = "onItemLoaded";
            public static const ON_ERROR:String = "onError";
            public static const ON_COMPLETE:String = "onComplete";
            public static const ON_PROGRESS:String = "onProgress";
            public static const ON_START:String = "onStart";
    
            public var progress:Number;
            public var itemID:Number;
            public var error:String;
    
            public function MultiloaderEvent(type:String, _itemID:Number=NaN, _error:String=null, _progress:Number=NaN, bubbles:Boolean=false, cancelable:Boolean=false){
                super(type, bubbles, cancelable);
                itemID = _itemID;
                error = _error;
                progress = _progress;
            }
        }
    }//package ru.isky.multiloader 
    package ru.isky.multiloader {
        import flash.events.*;
    
        public class CustomLoader extends EventDispatcher {
    
            private var started:Boolean;
            protected var loader:Multiloader;
    
            public function CustomLoader(){
                super();
            }
            protected function onMyItemLoaded(item:Object, parameters:Array=null):void{
            }
            protected function refreshLoader():void{
                removeLoader();
                createLoader();
            }
            protected function onItemLoadError(event:MultiloaderEvent):void{
                throw (new Error(event.error));
            }
            protected function onItemLoaded(event:MultiloaderEvent):void{
                onMyItemLoaded(loader.getContentById(event.itemID), loader.getParametersById(event.itemID));
            }
            protected function createLoader():void{
                loader = new Multiloader();
                loader.addEventListener(MultiloaderEvent.ON_ITEM_LOADED, onItemLoaded);
                loader.addEventListener(MultiloaderEvent.ON_START, onStartLoading);
                loader.addEventListener(MultiloaderEvent.ON_PROGRESS, onLoadProgress);
                loader.addEventListener(MultiloaderEvent.ON_COMPLETE, onLoadComplete);
                loader.addEventListener(MultiloaderEvent.ON_ERROR, onItemLoadError);
            }
            protected function onLoadProgress(event:MultiloaderEvent):void{
            }
            protected function removeLoader():void{
                if (loader){
                    loader.removeEventListener(MultiloaderEvent.ON_ITEM_LOADED, onItemLoaded);
                    loader.removeEventListener(MultiloaderEvent.ON_PROGRESS, onLoadProgress);
                    loader.removeEventListener(MultiloaderEvent.ON_COMPLETE, onLoadComplete);
                    loader.removeEventListener(MultiloaderEvent.ON_ERROR, onItemLoadError);
                    loader.clear();
                    loader = null;
                    started = false;
                };
            }
            private function onStartLoading(event:MultiloaderEvent):void{
                if (started){
                    throw (new Error("After second loading use CustomLoader.refreshLoader()"));
                };
                started = true;
            }
            public function destroy():void{
                removeLoader();
            }
            protected function onLoadComplete(event:MultiloaderEvent):void{
            }
    
        }
    }//package ru.isky.multiloader 
    package ru.isky.multiloader {
        import flash.events.*;
        import flash.system.*;
        import flash.net.*;
        import ru.isky.utils.*;
        import flash.utils.*;
    
        public class Multiloader extends EventDispatcher {
    
            private static const STATUS_IDLE:String = "idle";
            public static const DATA_TEXT:String = "TEXT";
            public static const DATA_BITMAP:String = "BITMAP";
            private static const STATUS_BUSY:String = "busy";
            private static const DATA_TYPES:Object = {};
            public static const DATA_SOUND:String = "SOUND";
            public static const DATA_FLASH:String = "FLASH";
            public static const DATA_BINARY:String = "BINARY";
    
            private var loaded:Number = 0;
            private var _added:uint;
            private var start_time:Number;
            private var load_time:Number;
            public var progress:Number = 0;
            private var loaders:Array;
            private var nextid:uint = 0;
            public var dataList:Array;
            private var defaultLoaderContext:LoaderContext;
            private var waitFramesBetweenLoadings:Number = 0;
            private var waitId:uint;
            private var status:String;
    
            public function Multiloader(loaderContext:LoaderContext=null){
                nextid = 0;
                loaded = 0;
                progress = 0;
                waitFramesBetweenLoadings = 0;
                super();
                if (loaderContext == null){
                    defaultLoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
                } else {
                    defaultLoaderContext = loaderContext;
                };
                loaders = new Array();
                dataList = new Array();
                clear();
            }
            private function onItemError(event:DataLoaderEvent):void{
                if (!hasEventListener(MultiloaderEvent.ON_ERROR)){
                    throw (new Error(event.error));
                };
                dispatchEvent(new MultiloaderEvent(MultiloaderEvent.ON_ERROR, event.id, event.error));
            }
            public function get added():Number{
                return (_added);
            }
            public function add(dataType:String, url:String, parameters:Array=null):Number{
                if (url == "null"){
                    throw (new Error("url is null"));
                };
                return (addItem(dataType, new URLRequest(url), parameters));
            }
            private function loadNextItem():void{
                var dataLoader:DataLoader;
                dataLoader = loaders[loaded];
                trace("dataLoader", dataLoader);
                dataLoader.addEventListener(DataLoaderEvent.ON_COMPLETE, onItemLoaded);
                dataLoader.addEventListener(DataLoaderEvent.ON_ERROR, onItemError);
                dataLoader.addEventListener(DataLoaderEvent.ON_PROGRESS, onItemProgress);
                dataLoader.load();
            }
            public function getContentById(id:Number):Object{
                return ((dataList[id] as DataHolder).content);
            }
            private function onItemLoaded(event:DataLoaderEvent):void{
                loaded++;
                dispatchEvent(new MultiloaderEvent(MultiloaderEvent.ON_ITEM_LOADED, event.id));
                if ((((loaded == loaders.length)) && (!((loaded == 0))))){
                    load_time = (getTimer() - start_time);
                    dispatchEvent(new MultiloaderEvent(MultiloaderEvent.ON_COMPLETE));
                } else {
                    if (status != STATUS_IDLE){
                        waitId = EnterFrameUtils.setTimeout(loadNextItem, waitFramesBetweenLoadings);
                    };
                };
            }
            public function getParametersById(id:Number):Array{
                return ((dataList[id] as DataHolder).parameters);
            }
            public function get loadTime():Number{
                return (load_time);
            }
            private function addItem(dataType:String, request:URLRequest, parameters:Array=null):Number{
                if (status != STATUS_IDLE){
                    throw (new Error("add() method must be called before start() method"));
                };
                if (!DATA_TYPES[dataType]){
                    throw (new Error(("unknown dataType:" + dataType)));
                };
                _added++;
                loaders[nextid] = new DataLoader(nextid, dataType, request, parameters);
                dataList[nextid] = (loaders[nextid] as DataLoader).dataholder;
                nextid++;
                return ((nextid - 1));
            }
            public function clear():void{
                var dataLoader:DataLoader;
                var i:Number;
                EnterFrameUtils.clearTimeout(waitId);
                waitFramesBetweenLoadings = 0;
                i = 0;
                while (i < loaders.length) {
                    dataLoader = loaders[i];
                    dataLoader.removeEventListener(DataLoaderEvent.ON_COMPLETE, onItemLoaded);
                    dataLoader.removeEventListener(DataLoaderEvent.ON_ERROR, onItemError);
                    dataLoader.removeEventListener(DataLoaderEvent.ON_PROGRESS, onItemProgress);
                    dataLoader.destroy();
                    dataLoader = null;
                    i++;
                };
                _added = 0;
                progress = NaN;
                start_time = 0;
                load_time = 0;
                loaded = 0;
                loaders = [];
                dataList = [];
                nextid = 0;
                status = STATUS_IDLE;
            }
            public function getDataHolderById(id:Number):DataHolder{
                return (dataList[id]);
            }
            private function onItemProgress(event:DataLoaderEvent):void{
                var newProgress:Number;
                var dataloader:DataLoader;
                var i:Number;
                newProgress = 0;
                i = 0;
                while (i < loaders.length) {
                    dataloader = loaders[i];
                    if (dataloader.dataholder.bytesTotal > 0){
                        newProgress = (newProgress + (((1 / loaders.length) * (1 / dataloader.dataholder.bytesTotal)) * dataloader.dataholder.bytesLoaded));
                    };
                    i++;
                };
                if (newProgress >= 1){
                    newProgress = 1;
                };
                if (newProgress != progress){
                    progress = newProgress;
                    dispatchEvent(new MultiloaderEvent(MultiloaderEvent.ON_PROGRESS, NaN, null, progress));
                };
            }
            public function start(framesTimeoutBetweenLoadings:Number=1):void{
                trace("loader start");
                waitFramesBetweenLoadings = framesTimeoutBetweenLoadings;
                if (status == STATUS_IDLE){
                    if (loaders.length == 0){
                        throw (new Error("Use add() method before start()"));
                    };
                    loadNextItem();
                    status = STATUS_BUSY;
                    start_time = getTimer();
                    dispatchEvent(new MultiloaderEvent(MultiloaderEvent.ON_START));
                } else {
                    throw (new Error("Multiloader уже был запущен"));
                };
            }
            public function close():void{
                var dataLoader:DataLoader;
                var i:Number;
                i = 0;
                while (i < loaders.length) {
                    dataLoader = loaders[i];
                    dataLoader.close();
                    i++;
                };
            }
    
            DATA_TYPES[DATA_TEXT] = true;
            DATA_TYPES[DATA_BITMAP] = true;
            DATA_TYPES[DATA_FLASH] = true;
            DATA_TYPES[DATA_BINARY] = true;
            DATA_TYPES[DATA_SOUND] = true;
        }
    }//package ru.isky.multiloader 
    package ru.isky.multiloader {
        import flash.display.*;
        import flash.net.*;
        import flash.media.*;
    
        public class DataHolder {
    
            private var _loaderInfo:Object;
            private var __datatype:String;
            public var loader:Object;
            private var __url:String;
            public var loadTime:Number;
            public var parameters:Array;
            private var __id:Number;
    
            public function DataHolder(_id:Number, _datatype:String, _url:String, _parameters:Array=null){
                super();
                __datatype = _datatype;
                __url = _url;
                __id = _id;
                parameters = _parameters;
            }
            public function get dataType():String{
                return (__datatype);
            }
            public function get bytesLoaded():Number{
                return (loaderInfo["bytesLoaded"]);
            }
            public function get bytesTotal():Number{
                return (loaderInfo["bytesTotal"]);
            }
            public function get id():Number{
                return (__id);
            }
            private function get loaderInfo():Object{
                if (_loaderInfo == null){
                    if ((((__datatype == Multiloader.DATA_FLASH)) || ((__datatype == Multiloader.DATA_BITMAP)))){
                        _loaderInfo = (loader as Loader).contentLoaderInfo;
                    };
                    if ((((__datatype == Multiloader.DATA_TEXT)) || ((__datatype == Multiloader.DATA_BINARY)))){
                        _loaderInfo = loader;
                    };
                    if (__datatype == Multiloader.DATA_SOUND){
                        _loaderInfo = loader;
                    };
                };
                return (_loaderInfo);
            }
            public function get url():String{
                return (__url);
            }
            public function get content():Object{
                var data:Object;
                if ((((__datatype == Multiloader.DATA_BITMAP)) || ((__datatype == Multiloader.DATA_FLASH)))){
                    data = (loader as Loader).content;
                };
                if ((((__datatype == Multiloader.DATA_TEXT)) || ((__datatype == Multiloader.DATA_BINARY)))){
                    data = (loader as URLLoader).data;
                };
                if (__datatype == Multiloader.DATA_SOUND){
                    data = (loader as Sound);
                };
                return (data);
            }
            public function destroy():void{
                _loaderInfo = null;
                loader = null;
                parameters = null;
            }
    
        }
    }//package ru.isky.multiloader 
    package ru.isky.multiloader {
        import flash.events.*;
        import flash.display.*;
        import flash.net.*;
        import flash.utils.*;
        import flash.media.*;
    
        public class DataLoader extends EventDispatcher {
    
            private var startTime:uint;
            public var dataholder:DataHolder;
            private var dispatcher:IEventDispatcher;
            private var request:URLRequest;
    
            public function DataLoader(_id:Number, _dataType:String, _request:URLRequest, _parameters:Array=null){
                super();
                dataholder = new DataHolder(_id, _dataType, _request.url, _parameters);
                request = _request;
                if ((((dataholder.dataType == Multiloader.DATA_FLASH)) || ((dataholder.dataType == Multiloader.DATA_BITMAP)))){
                    dataholder.loader = new Loader();
                    dispatcher = (dataholder.loader as Loader).contentLoaderInfo;
                };
                if ((((dataholder.dataType == Multiloader.DATA_TEXT)) || ((dataholder.dataType == Multiloader.DATA_BINARY)))){
                    dataholder.loader = new URLLoader();
                    if (dataholder.dataType == Multiloader.DATA_BINARY){
                        (dataholder.loader as URLLoader).dataFormat = URLLoaderDataFormat.BINARY;
                    };
                    dispatcher = (dataholder.loader as URLLoader);
                };
                if (dataholder.dataType == Multiloader.DATA_SOUND){
                    dataholder.loader = new Sound();
                    dispatcher = (dataholder.loader as Sound);
                };
            }
            public function destroy():void{
                close();
                dataholder.destroy();
                dataholder = null;
                request = null;
            }
            private function onErrorHandler(event:IOErrorEvent):void{
                dispatchEvent(new DataLoaderEvent(DataLoaderEvent.ON_ERROR, dataholder.id, event.toString()));
            }
            public function load():void{
                startTime = getTimer();
                dispatcher.addEventListener(Event.COMPLETE, onCompleteHandler);
                dispatcher.addEventListener(IOErrorEvent.IO_ERROR, onErrorHandler);
                dispatcher.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
                try {
                    var _local2 = dataholder.loader;
                    _local2["load"](request);
                } catch(loader_error:Error) {
                    onError(loader_error);
                };
            }
            private function onError(error:Error):void{
                dispatchEvent(new DataLoaderEvent(DataLoaderEvent.ON_ERROR, dataholder.id, error.toString()));
            }
            private function onCompleteHandler(event:Event):void{
                dataholder.loadTime = (getTimer() - startTime);
                dispatcher.removeEventListener(Event.COMPLETE, onCompleteHandler);
                dispatcher.removeEventListener(IOErrorEvent.IO_ERROR, onErrorHandler);
                dispatcher.removeEventListener(ProgressEvent.PROGRESS, onProgressHandler);
                dispatchEvent(new DataLoaderEvent(DataLoaderEvent.ON_COMPLETE, dataholder.id));
            }
            public function close():void{
                try {
                    var _local2 = dataholder.loader;
                    _local2["close"]();
                } catch(error:Error) {
                    onError(error);
                };
            }
            private function onProgressHandler(event:ProgressEvent):void{
                dispatchEvent(new DataLoaderEvent(DataLoaderEvent.ON_PROGRESS, dataholder.id));
            }
            public function unload():void{
                if ((((dataholder.dataType == Multiloader.DATA_BITMAP)) || ((dataholder.dataType == Multiloader.DATA_FLASH)))){
                    try {
                        (dataholder.loader as Loader).unload();
                    } catch(error:Error) {
                        onError(error);
                    };
                };
                dataholder.loader = null;
            }
    
        }
    }//package ru.isky.multiloader 
    package ru.isky.geom.d2 {
        import flash.geom.*;
    
        public class Point2DTools {
    
            public function Point2DTools(){
                super();
            }
            public static function displace(src:Point, displaceX:Number=0, displaceY:Number=0):Point{
                return (new Point((src.x + displaceX), (src.y + displaceY)));
            }
            public static function distance(_P1:Point, _P2:Point):Number{
                var distance:Number;
                var katetA:Number;
                var katetB:Number;
                katetA = Math.abs((_P1.x - _P2.x));
                katetB = Math.abs((_P1.y - _P2.y));
                if (katetA == 0){
                    distance = Math.abs((_P1.y - _P2.y));
                } else {
                    if (katetB == 0){
                        distance = Math.abs((_P1.x - _P2.x));
                    } else {
                        distance = Math.sqrt(((katetA * katetA) + (katetB * katetB)));
                    };
                };
                return (distance);
            }
            public static function rotateAt(targetPoint:Point, centerPoint:Point, angle_rad:Number):Point{
                var radius:Number;
                var currentAngle:Number;
                var newAngle:Number;
                var endX:Number;
                var endY:Number;
                radius = distance(targetPoint, centerPoint);
                currentAngle = (Math.atan2((targetPoint.x - centerPoint.x), (targetPoint.y - centerPoint.y)) * -1);
                newAngle = (currentAngle + angle_rad);
                endX = ((Math.cos(newAngle) * radius) + centerPoint.x);
                endY = ((Math.sin(newAngle) * radius) + centerPoint.y);
                return (new Point(endX, endY));
            }
    
        }
    }//package ru.isky.geom.d2 
    package ru.isky.math {
        import flash.geom.*;
    
        public class RectangleUtils {
    
            public static const SIT_TYPE_INSIDE:String = "inside";
            public static const SIT_TYPE_OUTSIDE:String = "outside";
    
            public function RectangleUtils(){
                super();
            }
            public static function sitRectangle(rectangle0:Rectangle, rectangle1:Rectangle, type:String="inside"):Rectangle{
                var w_prop:Number;
                var h_prop:Number;
                var prop0:Number;
                rectangle0 = rectangle0.clone();
                w_prop = (rectangle0.width / rectangle1.width);
                h_prop = (rectangle1.height / rectangle1.height);
                prop0 = (rectangle0.width / rectangle0.height);
                if ((((w_prop > h_prop)) && ((type == SIT_TYPE_INSIDE)))){
                    rectangle0.width = rectangle1.width;
                    rectangle0.height = (rectangle0.width / prop0);
                } else {
                    rectangle0.height = rectangle1.height;
                    rectangle0.width = (rectangle0.height * prop0);
                };
                return (rectangle0);
            }
    
        }
    }//package ru.isky.math 
    package ru.isky.gazprom.gallery {
        import flash.events.*;
        import flash.display.*;
    
        public class GalleryLoaderEvent extends Event {
    
            public static const ON_COMPLETE:String = "ON_COMPLETE";
            public static const ON_CONFIG_LOADED:String = "ON_CONFIG_LOADED";
            public static const ON_DEFAULT_IMAGE_LOADED:String = "ON_DEFAULT_IMAGE_LOADED";
            public static const ON_ALL_IMAGES_LOAD_PROGRESS:String = "ON_ALL_IMAGES_LOAD_PROGRESS";
    
            public var allImagesProgress:Number;
            public var defaultImage:Bitmap;
    
            public function GalleryLoaderEvent(type:String, _defaultImage:Bitmap=null, _allImagesProgress:Number=0, bubbles:Boolean=false, cancelable:Boolean=false){
                super(type, bubbles, cancelable);
                defaultImage = _defaultImage;
                allImagesProgress = _allImagesProgress;
            }
        }
    }//package ru.isky.gazprom.gallery 
    package ru.isky.gazprom.gallery {
        import flash.events.*;
        import caurina.transitions.*;
        import flash.geom.*;
        import flash.display.*;
        import flash.text.*;
        import ru.isky.utils.*;
    
        public class Preloader extends Sprite {
    
            private var cellsAmount:Number;
            private var image:Bitmap;
            private var randomCells:Array;
            private var lastVisibleAmount:Number = 0;
            public var tf:TextField;
            private var container:Sprite;
            private var previousCell:Sprite;
    
            public function Preloader(defaultImage:Bitmap){
                lastVisibleAmount = 0;
                randomCells = [];
                super();
                image = defaultImage;
                container = new Sprite();
                addChild(container);
                tf = new TextField();
                tf.autoSize = TextFieldAutoSize.LEFT;
            }
            public function updateProgress(value:Number):void{
                var visibleAmount:Number;
                tf.text = (Math.round((value * 100)) + "%");
                visibleAmount = Math.round((value * cellsAmount));
                if (lastVisibleAmount != visibleAmount){
                    lastVisibleAmount = visibleAmount;
                    trace(lastVisibleAmount);
                    showPartImage(lastVisibleAmount);
                };
            }
            private function showPartImage(amount:Number):void{
                var j:Number;
                var i:Number;
                var cell:Sprite;
                j = 0;
                while (j < amount) {
                    i = 0;
                    while (i < cellsAmount) {
                        cell = (container.getChildAt(i) as Sprite);
                        if (i == randomCells[j]){
                            if (cell.alpha != 1){
                                if (Tweener.isTweening(cell) != true){
                                    Tweener.addTween(cell, {
                                        alpha:1,
                                        time:0.5
                                    });
                                };
                            };
                        };
                        i++;
                    };
                    j++;
                };
            }
            public function buildMatrix(amount:Number):void{
                var arr:Array;
                var w_images:Number;
                var h_images:Number;
                var matrixItemWidth:int;
                var matrixItemHeight:int;
                var i:Number;
                var k:Number;
                var j:Number;
                var bitmapData:BitmapData;
                var bmp:Bitmap;
                var spr:Sprite;
                arr = ImagesRectangle.getRectangleSidesQuantity(amount);
                w_images = arr[0];
                trace(w_images);
                h_images = arr[1];
                trace(h_images);
                cellsAmount = (w_images * h_images);
                matrixItemWidth = (image.width / w_images);
                matrixItemHeight = (image.height / h_images);
                i = 0;
                while (i < h_images) {
                    j = 0;
                    while (j < w_images) {
                        bitmapData = new BitmapData(matrixItemWidth, matrixItemHeight, false);
                        bitmapData.copyPixels(image.bitmapData, new Rectangle((j * matrixItemWidth), (i * matrixItemHeight), matrixItemWidth, matrixItemHeight), new Point());
                        bmp = new Bitmap(bitmapData);
                        bmp.x = (j * matrixItemWidth);
                        bmp.y = (i * matrixItemHeight);
                        spr = new Sprite();
                        spr.addChild(bmp);
                        spr.alpha = 0;
                        spr.addEventListener(MouseEvent.MOUSE_OVER, onMouseOverHandler);
                        container.addChild(spr);
                        j++;
                    };
                    i++;
                };
                k = 0;
                while (k < cellsAmount) {
                    randomCells.push(k);
                    k++;
                };
                ArrayUtils.shuffle(randomCells);
                trace(randomCells);
            }
            private function onMouseOverHandler(event:MouseEvent):void{
                var cell:Sprite;
                trace("mouseOver");
                cell = (event.target as Sprite);
                if (cell.alpha <= 0.5){
                    Tweener.addTween(cell, {
                        alpha:0.6,
                        time:2
                    });
                } else {
                    if (cell.alpha != 1){
                        Tweener.addTween(cell, {
                            alpha:0,
                            time:2
                        });
                    };
                };
                previousCell = cell;
            }
    
        }
    }//package ru.isky.gazprom.gallery 
    package ru.isky.gazprom.gallery {
    
        public class ImagesStorage extends DataStorage {
    
            public var data:Array;
    
            public function ImagesStorage(){
                super();
                data = [];
            }
            override public function addData(_data:Object, href:String):void{
                super.addData(_data, href);
                data.push(_data);
            }
    
        }
    }//package ru.isky.gazprom.gallery 
    package ru.isky.gazprom.gallery {
    
        public interface IClonableDisplayObject {
    
            function set x(_arg1:Number):void;
            function set y(_arg1:Number):void;
            function get width():Number;
            function get height():Number;
            function get x():Number;
            function get y():Number;
            function clone():IClonableDisplayObject;
    
        }
    }//package ru.isky.gazprom.gallery 
    package ru.isky.gazprom.gallery {
        import flash.display.*;
    
        public class CloneGrid extends Sprite {
    
            private var item:IClonableDisplayObject;
            private var item_width:Number;
            private var item_height:Number;
            public var rows:Array;
    
            public function CloneGrid(item:IClonableDisplayObject, item_width:Number=NaN, item_height:Number=NaN){
                super();
                rows = [];
                this.item_width = ((item_width) || (item.width));
                this.item_height = ((item_height) || (item.height));
                this.item = item;
            }
            public function addBottomRow():void{
                addRow();
            }
            public function addRightColumn():void{
                addColumn();
            }
            private function removeArray(objects:Array=null):void{
                var target:IClonableDisplayObject;
                var i:Number;
                if (!objects){
                    return;
                };
                i = 0;
                while (i < objects.length) {
                    target = objects[i];
                    removeChild((target as DisplayObject));
                    target = null;
                    i++;
                };
                objects = null;
            }
            private function addColumn(left:Boolean=false):void{
                var newItem:IClonableDisplayObject;
                var row:Array;
                var i:Number;
                if (rows.length == 0){
                    rows.push([getItemCopy()]);
                    return;
                };
                i = 0;
                while (i < rows.length) {
                    row = rows[i];
                    newItem = getItemCopy();
                    if (left){
                        newItem.x = (row[0].x - item_width);
                        newItem.y = row[0].y;
                        row.unshift(newItem);
                    } else {
                        newItem.x = (row[(row.length - 1)].x + item_width);
                        newItem.y = row[0].y;
                        row.push(newItem);
                    };
                    i++;
                };
            }
            public function removeRightColumn():void{
                removeColumn();
            }
            public function addTopRow():void{
                addRow(true);
            }
            private function addRow(top:Boolean=false):void{
                var row:Array;
                var newRow:Array;
                var newItem:IClonableDisplayObject;
                var i:Number;
                if (rows.length == 0){
                    rows.push([getItemCopy()]);
                    return;
                };
                row = rows[0];
                newRow = [];
                i = 0;
                while (i < row.length) {
                    newItem = getItemCopy();
                    if (top){
                        row = rows[0];
                        newItem.x = row[i].x;
                        newItem.y = (row[0].y - item_height);
                    } else {
                        row = rows[(rows.length - 1)];
                        newItem.x = row[i].x;
                        newItem.y = (row[(row.length - 1)].y + item_height);
                    };
                    newRow.push(newItem);
                    i++;
                };
                if (top){
                    rows.unshift(newRow);
                } else {
                    rows.push(newRow);
                };
            }
            public function removeBottomRow():void{
                removeRow();
            }
            private function removeRow(top:Boolean=false):void{
                if (!rows.length){
                    return;
                };
                if (top){
                    removeArray(rows.shift());
                } else {
                    removeArray(rows.pop());
                };
            }
            public function addLeftColumn():void{
                addColumn(true);
            }
            private function getItemCopy():IClonableDisplayObject{
                return ((addChild((item.clone() as DisplayObject)) as IClonableDisplayObject));
            }
            public function removeLeftColumn():void{
                removeColumn(true);
            }
            public function removeTopRow():void{
                removeRow(true);
            }
            private function removeColumn(left:Boolean=false):void{
                var itemIndex:int;
                var row:Array;
                var i:Number;
                if (!rows.length){
                    return;
                };
                itemIndex = (rows[0].length - 1);
                if (left){
                    itemIndex = 0;
                };
                i = 0;
                while (i < rows.length) {
                    row = rows[i];
                    if (left){
                        removeChild(row.shift());
                    } else {
                        removeChild(row.pop());
                    };
                    i++;
                };
                if (row.length == 0){
                    rows = [];
                };
            }
    
        }
    }//package ru.isky.gazprom.gallery 
    package ru.isky.gazprom.gallery {
    
        public class DataStorage {
    
            private var _length:int = 0;
            protected var storage:Object;
    
            public function DataStorage(){
                _length = 0;
                super();
                storage = new Object();
            }
            public function getDataByHref(href:String):Object{
                return (storage[href]);
            }
            public function addData(data:Object, href:String):void{
                if (storage[href] == null){
                    _length++;
                };
                storage[href] = data;
            }
            public function get length():int{
                return (_length);
            }
    
        }
    }//package ru.isky.gazprom.gallery 
    package ru.isky.gazprom.gallery {
        import flash.events.*;
    
        public class ImagesLoaderEvent extends Event {
    
            public static const ON_COMPLETE:String = "onComplete";
            public static const ON_PROGRESS:String = "onProgress";
    
            public var progress:Number;
    
            public function ImagesLoaderEvent(type:String, _progress:Number, bubbles:Boolean=false, cancelable:Boolean=false){
                super(type, bubbles, cancelable);
                progress = _progress;
            }
        }
    }//package ru.isky.gazprom.gallery 
    package ru.isky.gazprom.gallery {
        import flash.geom.*;
        import flash.display.*;
        import ru.isky.utils.*;
    
        public class Gallery extends WEBDocument {
    
            private var galleryLoader:GalleryLoader;
            private var map:Map;
            public var preloader:Preloader;
            private var defaultImage:Bitmap;
    
            public function Gallery(){
                var configHref:String;
                super();
                galleryLoader = new GalleryLoader();
                galleryLoader.addEventListener(GalleryLoaderEvent.ON_DEFAULT_IMAGE_LOADED, onDefaultImageLoaded);
                galleryLoader.addEventListener(GalleryLoaderEvent.ON_ALL_IMAGES_LOAD_PROGRESS, onImagesLoadProgress);
                galleryLoader.addEventListener(GalleryLoaderEvent.ON_COMPLETE, onImagesLoaded);
                configHref = ((root.loaderInfo.parameters["config_href"]) || ("config.xml"));
                galleryLoader.loadConfig(configHref);
            }
            private function onImagesLoaded(event:GalleryLoaderEvent):void{
                removeChild(preloader);
                defaultImage.visible = false;
                map = new Map(new ImagesRectangle(galleryLoader.storage), new Rectangle(0, 0, 710, 350));
                addChild(map);
                map.initExternal();
                map.addCallBacks();
                map.showAll();
            }
            private function onImagesLoadProgress(event:GalleryLoaderEvent):void{
                preloader.updateProgress(event.allImagesProgress);
            }
            private function onDefaultImageLoaded(event:GalleryLoaderEvent):void{
                defaultImage = event.defaultImage;
                preloader = new Preloader(defaultImage);
                preloader.x = (preloader.y = 0);
                addChild(preloader);
                preloader.buildMatrix(galleryLoader.imagesAmount);
                defaultImage.alpha = 0;
            }
    
        }
    }//package ru.isky.gazprom.gallery 
    package ru.isky.gazprom.gallery {
        import flash.events.*;
        import caurina.transitions.*;
        import flash.geom.*;
        import ru.actionsmile.utils.*;
        import flash.display.*;
        import ru.isky.external.*;
        import ru.isky.geom.d2.*;
        import ru.isky.math.*;
        import org.noregret.log.*;
        import flash.utils.*;
    
    Ответ написан
    3 комментария
  • Как рассчитать серверы для фермы RDS?

    @mrHobbY
    -2Gb RAM на каждое ядро (ex 8Gb для Quad-core)
    -2 двухядерных процессора лучше одного четырехядерного
    -64Mb на каждого пользователя + 2гб на OS. Например 100 users*64Mb + 2048=8.4Gb (это минимум)
    -15 сессий на каждое ядро
    -Производительность падает, если процент процессорного времени на ядро постоянно больше 65%
    -Производительность удваивается при 64 разрядах

    ref

    В Вашем случае.
    1000 пользователей = 66 ядер (8 сервера по 8, или 4 по 16)
    Смотрим дальше.
    8 серверов = 150 пользователей на каждом. 150 пользователей *200Mb (приложения)+2000=32Gb на каждый сервер.

    Также почитать стоит technet
    Ответ написан
    5 комментариев
  • АПК для защиты RDP соединений. Какие есть варианты?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    noVNC может лучше использовать?
    Как бонус — рулилка с любого мобильного браузера с поддержкой HTML5 и websockets. (почти все мобилы уже)
    Ответ написан
    2 комментария
  • Free-lance.ru. Как поведет себя арбитраж?

    Freelanceru
    @Freelanceru
    _
    Ответ написан
    Комментировать
  • Посоветуйте спутниковый доступ в интернет

    @muzzle
    25000р. за комплект симметричного оборудования

    Это только оборудование. Деньги потребуются на монтаж (от 40К рублей), оформление (порядка 12К рублей)
    И демократичных тарифов — я пока не видел.
    Ответ написан
    Комментировать
  • Посоветуйте спутниковый доступ в интернет

    @codecity
    А если есть наземный канал связи, скажем модем или тонюсенький DSL?


    Не советую. Теоретическая задержка при доступе через геостационарные спутники около 0.5-1 сек. (получается сигнал с земли до спутника 2 раза проходит + по земле), реальная бывает и до 2 сек. То есть для большинства вещей не подходит, подходит разве что для скачки больших файлов, если нет других вариантов доступа.
    Ответ написан
    Комментировать
  • Организовать связь между двумя нас.пунктами (11 км.)?

    Вы бы для начала бюджет назвали, что бы можно было выбрать класс оборудования для рекомендации…
    Ответ написан
    5 комментариев
  • Организовать связь между двумя нас.пунктами (11 км.)?

    @Anfinagen
    Eще один голос за Ubiquity.Насчет 110 мбит — повеселило.Speedtest уже не тот ага)) Смонтировать можно вопрос в необходимости 100 мбит и в бюджете.
    Ответ написан
    Комментировать
  • Организовать связь между двумя нас.пунктами (11 км.)?

    IlyaEvseev
    @IlyaEvseev
    Opensource geek
    +1 за Ubiquity, но для ваших расстояний имхо лучше подойдёт www.ubnt.com/airfiber
    Ответ написан
    3 комментария
  • Организовать связь между двумя нас.пунктами (11 км.)?

    vakorovin
    @vakorovin
    Разработчик
    Работаю в провайдере, коллега по работе (мы с ним не виделись ни разу, т.к. в разных городах живем), занимается такими установками (подработка). Неделю назад с ним обсуждал этот вопрос, советует nanaiki.ru/products/besprovodnoe_ustrojstvo_ubiquiti_nanobridge_m. Говорит и ребята в этой компании с головой, все расскажут и объяснят и конкретно модель Ubiquiti NanoBridge M2 рекомендует. Говорит 15км при прямой видимости 80-110 Мбит/с выбивал.
    Ответ написан
    3 комментария
  • Готовой linux-дистрибутив

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

    Готовой сборки под ваши требования, естественно, нет. Это как сказать «я хочу пользоваться фотошопом, мозиллой и офисом. посоветуйте готовую винду».
    Ответ написан
    1 комментарий
  • Как/чем проще всего однообразно отредактировать несколько сотен изображений?

    CodeByZen
    @CodeByZen
    php, js, my/mssql, sqlite, html, css, it-consult
    Для первого варианта в irfanView есть батч. Там можно такое сделать.
    Ответ написан
    Комментировать