понедельник, 18 июля 2011 г.

текстовые редакторы

Текстовые редакторы




NetBeans

список функций, code browser, function list → см. Navigator (ctrl+7)

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

ctrl+e/ ctrl+x
удалить строку
ctrl+k
вставить последнее слово (перед курсором)
Alt+Shift + вверх/внизпереместить строку
Shift+Deleteкопирование строки в буфер + удаление
ctrl + Home/End
переместиться в начало/конец документа
ctrl + PageUp/PageDown
перемещение по вкладкам
Ctrl+Shift + C
закомментировать выделенное

NetBeans подсвечивает в коде все вхождения выделенного слова.
При нажатии на ctrl+r, можно поправить все вхождения этого слова.

Настройки

хранятся в C:\Program Files\NetBeans 6.7\etc\netbeans.conf
выставить кодировку utf-8: добавить в netbeans_default_options параметр -J-Dfile.encoding=UTF-8

ассоциация расширений файлов
Tools → Options → Miscellaneous → File → File Associations

игнорировать типы файлов:
в Tools → Options → Miscellaneous → Files → Ignored Files Pattern дописать в конец:
|\.pyc$

Цвета

mark-occurrences/отметить совпадения
Tools → Options → Fonts & Color → Language → Python



Работа с БД

1. Надо установить плагин Database (если он ещё не установлен)
2. Открыть панель Services, на ней правой кнопкой мыши и создать коннекшн.
Для MySQL выбираем драйвер MySQL (Connector/J driver). Далее всё как обычно - логин, пароль. Но: на localhost коннектиться не захотел, указал ему 127.0.0.1.
3. наслаждаемся

Проблемы с alt+tab

После переключения по alt+tab фокус не попадает в окно с редактированием текста. Проблема с использованием стандартной библиотеки swing. Её можно заменить, добавив
--laf javax.swing.plaf.metal.MetalLookAndFeel в netbeans.conf

Обсуждение по теме: http://forums.netbeans.org/topic5465.html

Макросы

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

Eclipse/Aptana

plugin manager: help → Software updates → Find and install → действуем по обстоятельствам

Есть понятие перспективы/представления/view: в правом верхнем углу несколько иконок, в зависимости от перспективы
устанавливается расположение внутренних окон в редакторе (где код, где проводник, где консоль, есть ли консоль).
Горячие клавиши
ctrl+d
удалить строку
ctrl+/
закомментировать выделенный блок

Действия мышью

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


Emacs

Изменить кодировку открытого файла Ctrl+x, Enter, r → ввести название






MySQL DDL

Сущности (DDL - data definition language)

Базы данных

показать все

show databases;

создать
create database db_name;
create database db_name CHARACTER SET utf8 COLLATE utf8_general_ci;

убить

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

переименовать

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Пользователи

http://www.mysql.ru/docs/man/Adding_users.html
создать пользователя и выдать права:
GRANT ALL PRIVILEGES ON dbname.* TO compwiki@localhost IDENTIFIED BY 'my_password' WITH GRANT OPTION;

определить пароль для root-пользователя
(если пароль не был определён):
mysqladmin -u root password NEWPASSWORD
сменить пароль root:
mysqladmin -u root -p'oldpassword' password newpass
Пароли для внешки и для локалхоста могут отличаться. Чтобы сменить пароль для внешки:
UPDATE mysql.user SET Password=PASSWORD('newpasswd') WHERE User='root';
FLUSH PRIVILEGES;

Таблицы

показать список:
show tables
переименовать:
rename table name1 to name2
копировать таблицу
create table db1.table_nm select * from db2.table_nm;

Типы таблиц (engine)

Проверить доступные engine таблиц в СУБД из консоли:
show engine;

engine и внешние ключи
MyISAM не поддерживает
InnoDB поддерживает

Колонки/столбцы

изменить описание
alter table table_nm modify column column_nm int unsigned;
удалить колонку
alter table table_name drop column_name
переименовать
alter table table_nm change column old_name new_name int(11);
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

изменить порядок
ALTER TABLE TableName change ColumnNameToMove longtext AFTER ColumnNameToPutAfter
http://dev.mysql.com/doc/refman/5.0/en/change-column-order.html

Внешние ключи

Оказывается, что внешние ключи всё-таки нужны.
alter table table_nm
    add constraint fk_table_nm__column_nm foreign key (column_name)
        references table2_nm ( table2_id )
            on update [restrict|cascade|set null]
            on delete [restrict|cascade|set null];

restrict - запретить удаление строки из таблицы table2_nm, если на неё есть ссылка из текущей таблицы table_nm
cascade - соответственно изменить ссылающиеся значения (или удалить ссылающиеся строки)
set null - установить пустую ссылку

Стоит обратить внимание, что не все типы таблиц поддерживают внешние ключи.


Add constraint

alter table mw_class add constraint fk_mw_class__object_id foreign key (object_id)
      references mw_object (object_id) on delete restrict on update cascade;

Drop constraint

alter table mw_gui_object DROP foreign key fk_mw_gui_object__object_id;
Узнать, какие внешние ключи ссылаются на таблицу можно через: information_schema → KEY_COLUMN_USAGE → REFERECES_TABLE_NAME


Ошибки при создании внешних ключей

1. Проверить, что у полей одинаковая пометка unsigned.

Уникальные ключи/индексы

переименовать уникальный ключ нельзя. надо сначала удалить ключ, а потом добавить его снова.
удаление
DROP INDEX index_name ON tbl_name;
либо
alter table table_nm drop index index_name;
если уникальный ключ используется внешиним ключом, то удалить такой уникальный ключ нельзя.
добавление
alter table mw_read_rule add index uk_mw_read_rule__class_id_rr_nm (class_id, rr_nm); # индекс
alter table mw_string_prop add unique key uk_mw_string_prop__str_id_prop_nm_lang_id (str_id, prop_nm, lang_id); # уникальный ключ

Процедуры

создать:
CREATE PROCEDURE proc_name (IN var1 VARCHAR(100), IN var2 VARCHAR(100)) # видимо, должны быть ещё OUT параметры
BEGIN
    .....;
    .....;
END
вызвать:
call proc_name( "vasia", "masia");

Функции

Функция имеет только входящие параметры. На выходе только одно значение - то, что возваращает сама функция.
drop function if exists newColumnPos;
delimiter ;;
create function newColumnPos( tableId int unsigned, pos int unsigned)
  returns int unsigned
  DETERMINISTIC # это слово указывает, что функция будет возвращать одно и то же значение каждый раз при одинаковых входных параметрах
                        # если это не так, то надо указывать reads sql data, ещё есть вариант NO SQL
begin
    return 0;
end;;
delimiter ;

Триггеры

Триггер - это обработчик события "изменение таблицы" (вставка/изменение/удаление строк)
drop trigger tau_mw_gui_string_1;
create trigger tau_mw_gui_string_1 after update
on mw_gui_string_var FOR EACH ROW update mw_gui_lang set ts ='1998.01.01' where lang_id=NEW.lang_id

Чтобы запретить вставку или обновление по триггеру, то надо в триггере вызвать exception.
Обработки пользовательских exception-ов в MySQL нет. Чтобы вызвать exception надо произвести действие, которое вызывает системный exception.
Например, вставка в несуществующую таблицу или вставка null в not null поле.

drop trigger if exists tbi_mw_enum_item;
delimiter ;;
create trigger tbi_mw_enum_item before insert
on mw_enum_item FOR EACH ROW
begin
    if ( exists( select * from mw_enum_item where
        enum_id = NEW.enum_id and enum_key=NEW.enum_key and p1=NEW.p1 and p2=NEW.p2 and p3=NEW.p3))
    then
        call raise_app_error('ERROR_CODE', 'table_nm', 'ERROR_DATA'); # самопальная функция, которая генерит исключение в триггерах
    end if;
end;;
delimiter ;

обозначения внутри триггера:

newвставленная/изменённая запись
old
удалённая запись/запись до изменения


Переменные

Пользовательские переменные (переменные сессии)

Эти переменные храняться до завершения соединения с сервером.
Установить значение переменной:
set @a = 1;
прочитать преременную (значение должно быть определено в рамках текущей сессии):
select @a;

Переменные хранимого кода

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

declare i int default 1;

raise_app_error

CREATE PROCEDURE raise_app_error(IN p_error_code VARCHAR(100), IN p_error_table VARCHAR(100), IN p_error_data VARCHAR(100))
BEGIN
    set @error_code = p_error_code; # эти параметры можно потом где-то просмотреть (наверное, в следующем селекте в том же коннекшене)
    set @error_table = p_error_table;
    set @error_data = p_error_data;
    insert into mysql_app_error values (null); # это поле у таблицы not null
END

Операторы

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

if

if ( exists( select * from mw_enum_item where
        enum_id = NEW.enum_id and enum_key=NEW.enum_key and p1=NEW.p1 and p2=NEW.p2 and p3=NEW.p3))
    then
        enum_id = null;
    [elseif ...... then ..... ]
    [else ...... ]
end if;

for


while

WHILE i < char_lenght(str) DO
    insert into ttt(pole1) values (substring( str, i ));
end while;

repeat until


Полезные функции

nextHi

drop function if exists nextHi;
delimiter ;;
create function nextHi( hi varchar(100) )
  returns varchar(100) DETERMINISTIC
begin
  declare pos INT; # позиция последней точки в строке
  declare i INT; # номер текущего чайлда
  if hi is null then
      return '01';
  end if;
  if position( "." in hi ) then
    set pos = (select LENGTH(hi) - POSITION("." in REVERSE(hi))+1);
  else
    set pos = 0;
  end if;
  set i = (select CONVERT( SUBSTRING( hi, pos+2 ), UNSIGNED INTEGER)+1);
  return concat( "", SUBSTRING( hi, 1, pos ), concat("", length(i)-1, i ));
end;;
delimiter ;


// вроде бы более правильный вариант:
drop function if exists nextHi;
delimiter ;;
create function nextHi( hi varchar(100) )
  returns varchar(100) DETERMINISTIC
begin
 declare c varchar(100); # строковое представление текущего чайлда
 declare i INT; # номер текущего чайлда
  if hi is null then
      return '01';
  end if;
 set c = substring_index(hi,'.',-1);
 set i = substring(c,2)+1;
 return concat( "", left( hi, length(hi)-length(c) ), length(i)-1, i );
end;;
delimiter ;

select nextHi2('01.03.04.115'), nextHi2(''), nextHi2('01'), nextHi2('09');




понедельник, 2 мая 2011 г.

flex

flex

 

Введение

Flex - это framework для Flash.
Сам по себе Flash имеет ограничения, т.к. разрабатывался под web.
Чтобы создавать "полноценные" desktop приложения нужен AIR.
AIR - приложения требуют установленной AIR-машины на целевом компьютере.

Flex:

Основной файл проекта - xml файл. В нём должен быть корневой тег mx:Application
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <!-- разметка, по аналогии с html  -->
        <mx:Label text="Моё первое flex-приложение!"></mx:Label>
</mx:Application>

Air:

Основной файл - так же xml-файл, но корневой тег mx:WindowedApplication.


Скрипты:

Чтобы добавить скрипт, в код добавляется тег mx:Script

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init1(); init2();"> <!-- initialize - указывается функция, которая сработает при старте приложения -->

    <mx:Script> <!-- сейчас мы находимся внутри объекта "Application" и определяем его свойства и методы -->
    <![CDATA[
        /* здесь только импорты, определение переменных и функций.

            внутри фукнций можно уже делать что угодно. */
    ]]>
    </mx:Script>

</mx:Application>


Инструменты

Flex Builder 3

Настройка интерфейса

список функций по текущему файлу: Window → Outline

закладки
добавляются по клику правой кнопкой мыши: Bookmark...
удалить закладку можно только через панель управления закладками:
Window → Other Views... → General → Bookmarks

Горячие клавиши

alt+↑ (или ↓)переместить стоку вверх/вниз
ctrl+alt+↑(или ↓)дублировать строку
ctrl+d
удалить строку
ctrl+f
окно поиска, настройка "продолжить с начала страницы" называется "Wrap search"
ctrl+kнайти следующее вхождение выделенного текста

FlashDevelop

Требует установленного Adobe SDK (и Microsoft .NET 2.0).
Для создания Adobe AIR проектов надо прописать пусть к SDK:
Tools → Programm Settings... (F10) → AS3Context → Flex SDK Location → указать расположение
Далее создаём проект AIR Flex 3 Project
В созданном проекте будет два bat-файла. В обоих надо указать путь к Flex SDK.
Один файл создаёт сертификат с паролем. Сертификат нужен для сборке air-пакета.
Другой файл создаёт air-пакет.

Чтобы после компилирования по F5 автоматически открывался Firefox, нужно в:
верхнее меню → Project → Properties... → Output → Test Movie → Run custom command → Edit → вписать без изменений:
"C:\Program Files\Mozilla Firefox\firefox.exe";"$(OutputDir)\$(OutputName)"

Подключение swc библиотеки:
Project → Properties... → Compiler Options → в одном из (External Links, SWC Include Libraries, SWC Libraries) указать путь к библиотеке.
пример в картинках

отладка в web

запуск трейсера под firefox:
1) установить flash tracer (с официального сайта)
2) установить debug версию flash player
3) в опциях flash tracer указать расположение лог-фала (там написано, где должно лежать)

вывести подробную информацию об объекте в окно трейсера
trace( ObjectUtil.toString(_itemsIndex) );

Основные моменты

Application

Application - это основной объект программы (типа, "главное окно"). В программе может быть только один такой объект.

В Air такой объект называется WindowedApplication.

Приложение и компоненты можно описывать с помощью mxml или с помощью AcrionScript.

mxml

у любого элемента в разметке mxml можно указать id:
    <mx:DataGrid id="asf">
тогда к нему можно будет обратиться из кода flex как к объекту с именем asf

ActionScript

создание объектов

var a:Button = new Button(); // объект создан, но он ещё не размещён на странице
editPanel.addChild(a); // размещаем объект внутри какого-то уже отображённого контейнера


includeInLayout
bool
занимает ли объект место в разметке странице
display
bool
отображается ли объект



Базовые классы Flex

Тут перечислены только те классы, которые есть во Flex, но отсутствуют в ActionScript.

ArrayCollection

ArrayCollection([{"aa":11, "bb":"qwq"},{"aa":22, "bb":"asd"}]);
ArryaCollection - это класс, который наследуется от Array. В нём есть дополнительный возможности. В частности - сортировка. Пример:
var sort:Sort = new Sort();
sort.fields = [new SortField("age", false)];
coll.sor = sort;
coll.refresh();

XML

http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/XML.html
xml.attribute("attrName"); // получить значение xml-атрибута по его имени
то же самое можно получить как:
xml.@attrName;

xml.elements(); // список вложенных элементов XML
xml.children(); // список вложенных элементов с учётом сортировки
xml.toXMLString(); // получить xml в виде строки

задать новое значение атрибуту XML
xml.attribute( attrName )[0] = new XML( newValue );

XMLList

это список объектов XML. на сколько понимаю, через этот объект можно работать с коллекцией XML, находящихся внутри списка.

HTTPService

Объект для отправки форм
public function stepByStepRequest(url:String, resultFunction:Function, params:Object=false):void {
    publicHTTPService = new HTTPService();
    publicHTTPService.url = url;
    if(params) {
        for (var param:String in params) {
            publicHTTPService.request[param] = params[param];
        };
    };
    publicHTTPService.addEventListener(ResultEvent.RESULT, resultFunction);
    publicHTTPService.addEventListener(FaultEvent.FAULT, stepByStepRequestFault);
    publicHTTPService.send();
    cursorManager.setBusyCursor();
}

Переменные окружения (url и пр.)

Путь к текущему исполняемому файлу swf доступен через this.url (видимо не доступен из подключаемых компонентов приложения).

Передать параметры из html во flash

    <object id='mySwf' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab' height='100%' width='100%'>
        <param name='src' value='FlashVarTest.swf'/>
        <param name='flashVars' value='firstName=Nick&lastName=Danger'/>
        <embed name='mySwf' src='FlashVarTest.swf' pluginspage='http://www.adobe.com/go/getflashplayer' height='100%' width='100%' flashVars='firstName=Nick&lastName=Danger'/>
    </object>
статья в документации Adobe называется "Passing request data with URL fragments"

Менеджеры

PopUpManager

класс для управления всплывающими окнами
http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=layouts_065_45.html

Полезные функции

Определить ширину текста

import flash.text.TextLineMetrics;       
private function a2():void{
     var bbb:TextLineMetrics = measureText( aaa.text );
     Alert.show( bbb.width.toString() );
}

Взаимодействие с javascript

получить текущий путь

trace( ExternalInterface.call("window.location.href.toString") );
вроде бы этот класс позволяет вызывать любые функции javascript

Полезные функции

print_r

некоторые простенькие объекты может обработать, но, видимо, далеко не все

        private function print_r(theObj:Object,indent:String=""):void {
            if (indent == "") {
                indent = " ";
            } else {
                indent += " ";
            }
            if(theObj is Array || theObj is Object) {
                for(var p:Object in theObj){
                    if(theObj[p] is Array|| theObj[p] is Object){
                        trace("\n"+indent+"["+p+"]("+typeof(theObj[p])+")=>");
                        print_r(theObj[p],indent);
                    } else {
                        trace("\n"+indent+"["+p+"]:"+theObj[p]);
                    }
                }
            }
            trace(String(theObj));
        }

nextHi

public static function getNextHi(hi:String):String
{
    var prefix:String;
    var endPart:String;
    var index:int = hi.lastIndexOf(".");
    if(index == -1){
        endPart = hi;
        prefix = '';
    } else {
        prefix = hi.substr(0, index + 1);
        endPart = hi.substr(index+1);
    }
    endPart = String(Number(endPart.substr(1))+1);
    return  prefix + (endPart.length - 1) + endPart;
}







php. Работа с БД

Работа с БД



Стандартная библиотека MySQL

Кодировка

когда вместо русских букв отображаются ????? ?? ????????, может помочь это:

mysql_query( "SET character_set_client = cp1251;" );
mysql_query( "SET character_set_connection = cp1251;" );
mysql_query( "SET character_set_results = cp1251;" );

ставиться сразу после подключения к БД.


PDO

Класс для унифицированной работы с базами данных.
http://ru2.php.net/pdo

Создать курсор БД

$cursor = new PDO( sprintf( "mysql:host=%s;dbname=%s",
    Config::$dbHost, Config::$dbName),
    Config::$dbUser, Config::$dbPass);

foreach ($cursor->query("select 1") as $row){
    print_r( $row );
}
Параметры соединения указываеются четвёртым аргументом:
$dbh = new PDO($dbtype.':host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass, array(PDO::ATTR_PERSISTENT => true));

Выполнение запросов

Для выполнения запросов есть два метода: prepare и query

            $q = $this->db->prepare( "
insert into advert ( advert_nm, advert_text, homepage, group_id )
values (:title, :text, :homepage, :groupId )
" );
            $q->bindParam(':title', $_POST["adv_title"], PDO::PARAM_STR, 255 ); # есть ещё PDO::PARAM_INT
            $q->bindParam(':text', $_POST["adv_text"], PDO::PARAM_STR, 1024 );
            $q->bindParam(':homepage', $_POST["home_page"], PDO::PARAM_STR, 255 );
            $q->bindValue(':groupId', 1, PDO::PARAM_INT );
            $q->execute();  # после выполнения select можно получить данные через $q->fetch(), fetchall(), fetchObject(), fetchColumn()
                                    ## после выполнения insert -> $this->db->lastInsertId();
            $a = $q->errorInfo();
            if ($a[0]=="00000"){
                header( "Location: /do/" );
            }
Если нужно выполнить несколько запросов подряд, то могут возникнуть запарки: на некоторых серверах PDO может иметь только одно подготовленное выражение.
Прежде чем создавать очередной запрос, нужно удалить (unset) старое подготовленное выражение.

fetchObject

fetchObject возвращает объект типа stdClass. Чтобы получить данные из него, надо обращаться с ним как с объектом:
$res = $q->fetchObject();
print $res->column_nm;

dbSimple

Для начала

http://dklab.ru/lib/DbSimple/
dbSimple не обновлялся с 2006(?) года.
В PHP5 появился класс PDO для работы с БД.

Интерфейс библиотеки (кратко)

Полное описание интерфейса см. в подробной документации.

mixed connect(string $dsn) Соединение с указанной СУБД, используя DSN. mixed select(string $query [,$arg1...]) Выборка двумерного массива (список строк). hash selectRow(string $query [,$arg1...]) Выборка однострочного результата запроса (одна строка). array selectCol(string $query [,$arg1...]) Выборка одноколоночного результата запроса (один столбец). scalar selectCell(string $query [,$arg1...]) Выборка скалярного результата запроса (одна ячейка). mixed selectPage(int &$total, string $query [,$arg1...) Выборка ограниченного двумерного массива с занесением общего числа записей в переменную. mixed query(string $query [,$arg1...]) Вызов не-SELECT запроса; для автоинкрементных полей в INSERT-запросах возвращает ID вставленной записи. mixed transaction([mixed $parameters]) Запускает новую транзакцию. mixed commit() / mixed rollback() Подтверждает/отменяет текущую транзакцию.

среда, 27 апреля 2011 г.

iMacros

iMacros

About

iMacros - это плагин для браузера. Есть версии для FF, IE, Chrome.
Имитирует действия пользователя в браузере с помощью команд-макросов. Макросы записываются в *.iim фалы. Файлы хранятся на диске.
Программа выглядит, как набор команд.

Пример кода:

VERSION BUILD=6650406 RECORDER=FX
TAB T=1
TAB CLOSEALLOTHERS
URL GOTO=http://ya.ru
URL GOTO=javascript:alert('test');

iMacros может работать под управлением JavaScript. Создаются js-файлы, которые могут вызывать iim. Например, в js-файле можно определить переменные, которые будут использоваться в нескольких вызываемых iim-файлах.

Макрокоманды

TAB

закрыть все вкладки браузера, кроме текущей:
TAB CLOSEALLOTHERS
открыть новую вкладку:
TAB OPEN NEW

TAG

обратиться к полю Input и задать ему значение:
TAG POS=1 TYPE=INPUT ATTR=ID:k_name CONTENT={{FIRM}}
получить содержимое страницы внутрь массива iimGetLastExtract (доступен внутри javascript):
TAG POS=1 TYPE=* ATTR=* EXTRACT=TXT

JavaScript

функции

iimPlay('test')
выполнить файл test.iim
iimSet('-var_SERVER', 'http://google.ru')
установить переменную, тогда в iim-файле к ней можно обратиться так:
URL GOTO={{SERVER}}
iimGetLastExtract(1)
обратиться к результату, выдернутому со страницы

объекты

браузер

var br = getBrowser();
var tabs = br.mTabContainer.childNodes; // массив открытых табов браузера
alert(tabs.length); // отобразить количество табов

Решения

Обход по списку ссылок

javascript-файл:
var br = getBrowser();
var tabs = br.mTabContainer.childNodes;
var a = [
    "http://google.ru",
    "http://ya.ru",
    "http://rambler.ru",
    "http://mail.ru",
    "http://yahoo.com"
];
function tt(){
    while ( tabs.length < 3 ){
        iimSet('-var_SERVER', a.pop())
        iimSet('-var_TAB', tabs.length )
        iimPlay( 'test' );
    }
    if (a.length>0){
        setTimeout( tt, 1000 );
    }
}
tt();
iim-файл:
VERSION BUILD=6650406 RECORDER=FX
TAB OPEN NEW
TAB T={{TAB}}
URL GOTO={{SERVER}}

Получение json-строки по URL

js-файл:
iimPlay( "test.iim" );
var myObj = JSON.parse( iimGetLastExtract(1) );
alert(myObj[1]);
iim-файл
URL GOTO={{SERVER}}
TAG POS=1 TYPE=* ATTR=* EXTRACT=TXT