Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #87


Клуб профессиональных программистов "Весельчак У"
Информационная рассылка сайта и форума.  Выпуск No87 (2010-01-09).

Здравствуйте, уважаемые читатели!

С православным Рождеством вас!



Сегодня в выпуске:



Содержание.



Вводная к JSON.


Сегодня поговорим про формат обмена данными JSON, который вполне может заменить вам XML для ряда задач. Расшифровывается это как JavaScript Object Notation — формат записи объектов на языке JavaScript. Формат до безобразия простой и, что приятно, стандартизирован.  Для общего развития можно почитать Википедию, детально — RFC4627, а я расскажу о его плюсах, минусах и как работать с ним на PHP и JavaScript.

JSON — простой иерархический формат, независимый от языка и платформы. JSON предлагается как альтернатива XML. Конечно, на все 100% заменить XML он не может, т.к. не поддерживает схем проверки, не может самостоятельно информировать о своей кодировке и не имеет понятия атрибутов, но легко его заменит там, где этими недостатками можно пренебречь. Также как и XML, JSON является само документирующимся форматом, описывающим структуру данных и не занимающихся их представлением.


Сравнение с XML.


Зачем нам новый формат, когда есть XML, спросите вы?

Главное преимущество JSON над XML — компактность. В рамках Web у него есть еще одно преимущество: он ведь представляет собой 100% валидный код JavaScript и его легко превратить из текста в данные JavaScript, а работать с полученными структурами проще и удобнее, чем с неповоротливым, хотя и универсальным, DOM (Document Object Model). Думаю, что последнее утверждение верно и для других языков программирования.

Давайте для наглядности рассмотрим такой пример: набор структур, состоящих из id и ФИО.


Так выглядит запись в XML:


Код: (xml)
<peoples>

  <record>
    <id>1</id>
    <surname>Иванов</surname>
    <firstname>Иван</firstname>
    <patronymic>Иванович</patronymic>
  </record>
  <record>
    <id>2</id>
    <surname>Петров</surname>
    <firstname>Петр</firstname>
    <patronymic>Петрович</patronymic>
  </record>
</peoples>

А так выглядит то же самое в JSON:


Код: (javascript)
[

  {
    id: 1,
    surname: "Иванов",
    firstname: "Иван",
    patronymic: "Иванович"
  },
  {
    id: 2,
    surname: "Петров",
    firstname: "Петр",
    patronymic: "Петрович"
  }
]

Одного брошенного взгляда достаточно, чтобы сделать выводы: во-первых, JSON компактнее, во-вторых, легче читается, в-третьих — информативнее, т.к. перечисления (массивы) и именованные свойства (объекты) ограничиваются разными видами скобок.

...


Дальше в статье рассказывается о кодировках, используемых в JSON, об обеспечении безопасности JavaScript, о встроенной в PHP 5 поддержке JSON и недостатках реализации, перечеркивающих основные достоинства JSON, и о том, как обойти эти недостатки, написав собственный кодировщик, соответствующий букве стандарта и совместимый со штатным декодером json_decode().

Обо всем этом читайте на нашем сайте в разделе «Web::PHP».

  • Программирование :: Общий
  • в чем пробовали вести документацию по проекту?

    интересует:

    - этап концепта, еще до перевода в uml

    - возможность прикрепить к тексту скетчи

    - возможность загнать в svn

    - возможность конвертнуть в html, pdf
  • Здравствуйте уважаемые.
    Вопрос к пользователям Eclipse Gallileo: где указывать путь к GCC compiller'у?
  • Будьте добры,опишите пожалуйста схему соединения двух компьютеров в режиме ECP LPT - порта
  • Программирование :: Общий :: Алгоритмы и математические задачи.
  • Задача о заявках (расширенная)
    Удовлетворит все заявки в наименьшее количество аудиторий.
    Алгоритм написан, реализован
    Состоит в том, что заявки сортируются не как при обычном Greedy Activity Selector по окончании, а по количеству совместных с ними (по возрастающей)

    Проблема в доказательстве
    Нужно доказать правильность работы алгоритма Обосновать. Прошу помощи. Сама уже не справляюсь  :insane:
    Надо будет код, вставлю
  • Программирование :: С/С++
  • Вроде бы, вспомнил все, что забыл по с++ и stl, но впадаю в ступор при упоминании в движке:
    - синглетонов, фабрик, обзерверов, раии и прочих архитектурных решений
    - а также не понимаю реализации stl шаблонов

    Сейчас появилось время на чтение пары книжек по данной тематике, соответственно выбрал:

    Modern C++ Design: Generic Programming and Design Patterns Applied
    By Andrei Alexandrescu
    February 01, 2001, Pages : 352

    и

    Effective STL
    Author: Scott Meyers

    Лучше начать с них или, может, подобрать что-нибудь посовременнее\попроще\попрактичнее ?

  • Программирование :: С/С++ :: ANSI С/С++
  • Есть у меня два класса:
    Код:
    template <class C>
    class Synchronizer
      {
    private:
        Synchronizer(); // Hidden constructor to realize Singleton pattern
        static Synchronizer<C> *_self;
      public:
        static Synchronizer<C> *Instance();
    };

    class BehaviourController
    {
    public:
        BehaviourController();
    private:
        Synchronizer <BehaviourController>*Sync;
    };
    И, соответственно, реализация:
    Код:
    template <class C>
    Synchronizer<C>::Synchronizer()
      {
        //  stuff
      }

    template <class C>
    Synchronizer<C> *Synchronizer<C>::Instance()
    {
        if(!_self)
        {
            _self = new Synchronizer();
        }
        return _self;
    }
    Тут все нормально, вроде?
    А если делаем вот так:
    Код:
    BehaviourController::BehaviourController()
    {
        Sync=Synchronizer<BehaviourController>::Instance();
    }
    То компилятор верещит вот так:
    Цитировать
    BehaviourController.obj : error LNK2001: unresolved external symbol "public: static class Synchronizer<class BehaviourController> * __cdecl Synchronizer<class BehaviourController>::Instance(void)" (?Instance@?$Synchronizer@VBehaviourController@@@@SAPAV1@XZ)
    Вопрос: Что я делаю не так?
    Я хотел реализовать класс с шаблоном (дальше с ним идет работа) на основе паттерна Singleton. Пока не было шаблона, все было нормально.  :?
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Получено время при помощи функций GetCurrentTime() или GetSystemTime() (какой именно не знаю) запомнено и записано несколько месяцев назад, возможно, больше года. Записано в «нечеловеческом» виде (например: 630153529). Необходимо получить время обратно в «человеческом» виде, т.е. дд.мм.гг. Испробовал много вариантов, безуспешно, время нереальное получается. Может, кто подскажет, как «победить» эту проблемку?
    Использую Visual C++ 2003.

    Спасибо.
  • Программирование :: С/С++ :: Borland C/C++
  • Нужен компонент HTTP клиента, поддерживающий Keep-Alive (последовательные HTTP-запросы в рамках одного TCP-подключения к веб-серверу).

    Вопрос: есть ли таковые компоненты?
  • Туплю,  :-/ что-то:почему всегда ноль?
          
    Код:
     AnsiString in="";
            char key=0;
            do
            {
                    cout<<"Enter a number and press <Enter>:"<<endl;
                    cin>>in.c_str();
                    if(in.Length()==0)
                            }
                            cout<<"You have not entered the number!\a"<<endl;
                            continue;
                            }
                    ...

             }while(key)
    Причем значение введенное выводится нормально
    То есть:
    Код:
    cout<<in.c_str();
    Выводит то, что введено :-/
    Ткните мордой лица в ошибку, пожалуйста. :shuffle:
  • Здравствуйте, собственно сабж.
    Передаю в функцию указатель на TObject, и так, как не хочется отлавливать потом ошибки (функцией будет пользоватся другой человек), хотел-бы проверить его (объекта тип) перед выполнением операций над ним.
    Скажу сразу, что компонент - TListBox а функция, по заполнению массива из значений Item'ов из ListBox. (Понимаю, что чуть бредово - от листбокса лучше отказатся - но человек именно так и пытается написать).
  • Программирование :: Ассемблер
  • Всех с Новым годом!!!

    Есть программа - ищет среди запущенных окон по первой букве окно.
    Но работает, если спереди
    Цитировать
    invoke lstrcmp,offset buff,chr$("$Tsk")
    ,
    если ее убрать, то не находит. Почему?

    Код:
    .386
    .model flat,stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    ;include find.inc
    include \masm32\macros\macros.asm

    EnumWindowsProc PROTO :DWORD, :DWORD

    .data
    .data?

    Wnd dd ?
    buff db 256 dup(?)

    .code

    start:

    Invoke EnumWindows,offset EnumWindowsProc,0

    EnumWindowsProc PROC hwnd:HWND,lParam:LPARAM

                 Invoke GetWindowText,hwnd,offset buff,256
         
    invoke lstrcmp,offset buff,chr$("$Tsk")
    test eax,eax
    cmp byte ptr buff,24h ; сравнение с "$"
    jnz next
    Invoke MessageBox,0,offset buff,0,0
    next:
    ret
    EnumWindowsProc ENDP

    xor edi, edi
    invoke ExitProcess, edi
    ret
    end start
  • Программирование :: Java
  • в основном классе инициализируется commandListener:

    public class TTalk2 extends MIDlet implements CommandListener {
    Код:
        private Command cmdExit;
        private Command cmdLogin;
        private Command cmdTryLogin;
        private Command cmdBack;
        private Display mydisplay;
        private Form myform;
    //    private Form loginForm;

        public TTalk2() {
            cmdExit = new Command("Выход", Command.EXIT, 1);
            cmdLogin = new Command("Подключиться", Command.SCREEN, 2);
            cmdBack = new Command ("Назад", Command.SCREEN, 2);
            cmdTryLogin = new Command ("Вперёд!", Command.SCREEN, 2);
            mydisplay = Display.getDisplay(this);
        }

    далее в CommandAction отлавливается кнопка:

    Код:
            if (c == cmdLogin) {
                Form loginForm = new Form ("Подключение");

                TextField tfLogin = new TextField ("Логин", "", 20, TextField.ANY);
                TextField tfPass = new TextField ("Пароль", "", 20, TextField.PASSWORD);

                loginForm.append(tfLogin);
                loginForm.append(tfPass);

                loginForm.addCommand(cmdBack);
                loginForm.addCommand(cmdTryLogin);
                loginform.setCommandListener(this);

                mydisplay.setCurrent(loginForm);
            }

    всё это работает, но проблема в том, что кнопка "Назад", помещаемая на динамически создаваемую форму, не работает. я так понимаю это потому, что CommandListener у формы loginForm - другой.

    отсюда вопрос, как в создаваемую в CommandAction форму назначить тот же CommandListener, в котором объявлена сама CommandAction?
  • Можно ли заставить java.awt.Label вывести подчёркнутый текст?
  • Программирование :: Программирование 1С
  • Нужно написать обработку для экспорта данных в файл формата xml из 1С. помогите, как создать этот xml?  :confused:
  • Направления программирования :: Drivers
  • В старой модели драйверов, где подключается ntddk.h, использовалась структура PKEYBOARD_INPUT_DATA объявленная в "ntddkbd.h".
    Как я понимаю, это до WDM использовалось. Нашел еще вариант со структурой PCONNECT_DATA, но это связано с классом kbd.
    Суть вопроса - есть ли другие, скажем более обыденные вещи для получения кода нажатой клавиши в модели WDM?

    Пишу простой драйвер-фильтр, который блокирует клавиатуру по нажатию особых клавиш.
  • Направления программирования :: Сети
  • Как узнать внешний IP, который мне выдаётся при включении модема и установлении  соединения ?
  • Направления программирования :: Техно
  • Добрый день. Сейчас занялся изучением СОМ, по книге "Основы СОМ. 2е издание. Дейл Роджерсон". Хотел бы узнать у знающих людей,- кто и где использует сию красоту, как интерфейсы, компоненты, таблицу виртуальных функций, интерефейс IUnknown, 3 функции работы с интерфейсами QueryInterface, AddRef, Release?  :)
    Уж очень всё подробно и классно описано в этой книге, но интерисует- это всё востребовано и работает?
  • Есть сервер , обычный , например простейший ATL.
    Сервер локальный то бишь EXE.
    Проблема  такая:  клиентское приложение  создает объект этого сервера,
    а потом выгружается , но надо что бы сервер продолжал висеть в памяти , и продолжал функционировать.
    Делаю AddRef  , но зараза сервер потом автоматически вызывает 
    Release ровно столько же раз сколько и AddRef.

    Срабатывает только один способ резкое закрытие клиента -
    например вызывать  TerminateProcess(GetCurrentProcess() , 0);
    или если клиент консольны то закрыть окно мышью , тогда сервер продолжает висеть.

    В принципе такой метод ничем не вредит общей задаче , но может есть официальный способ?
    P.S.
    Уже два дня парюсь , все АПИ для блокировки COM перебрал %=/

  • Направления программирования :: Web
  • как луше хранить в базе пароли наприме md5 ()
  • как на php считать xml файл ?
  • Направления программирования :: Web :: HTML/DHTML
  • Извините, если дублирую... Впринципе ничего сложного: мне нужно, чтоб в начале первой строчки для каждого параграфа (<p>) был отступ/табуляция. У меня что-то не получаеться. Пробовал даже <pre>    </pre> - и это не помогло. Помогите пожалуйста.
  • Учимся программировать :: Начинающим
  • Подскажите по заданию, помогите исправить, если что-то на сделала не так. Нужно разработать программу обработки структур, использовать структуру, содержащую поля с информацией: ФИО, дата рождения, номер группы, оценки за семестр. Организовать ввод исходных данных, средний балл каждого учащегося рассчитать по введенным оценкам, отобразить на экране всю введенную информацию.  Вывести анкетные данные учащихся, имеющих оценки ниже 4 по интересующему предмету (вводится с клавиатуры).
    Это то, что я написала
    :
    Код:
    #include <iostream.h>
    #include <conio.h>
    #include <iomanip.h>
    //opredelaem strukturu
    struct Spisok
    {
    char Fam[20];
    char Name[2];
    char birthYear[4];
    char groupNumber[5];
    int Ball[5];
    };
    int main()
    {
    clrscr();
    const int n=2;
    Spisok stud[30]; // sozdaem massiv strok
    int mas[n]={0};
    for (int i=0; i<n; i++)
    {
    cout<< "vvedite familijy inicialy god rozdenija i grupu: \n";
    cout<<"\n";
    cin>>stud[i].Fam>>stud[i].Name>>stud[i].birthYear>>stud[i].groupNumber;
    cout<< "vvedite baly po predmetam: \n";
    cout<<"\n";
    cout<<"matematika | fizika | informatika | etika | psihologija \n";
    for (int j=0; j<5; j++)
    {
    cout<<"\n";
    cin>> stud[i].Ball[j];
    }
    }
    cout<<"\n" ;
    cout<< "srednij ball studentov: \n";
    cout<<"________________________\n";
    // podszet srednego balla
    for (i=0; i<n; i++)
    {
    for (int j=0; j<5; j++)
    mas[i]+=stud[i].Ball[j];
    }
    // vyvod rezultata
    for (i=0; i<n; i++)
    {
    cout<<stud[i].Fam<<" "<<stud[i].Name<< " "<<stud[i].birthYear<<" "<<stud[i].groupNumber << endl;
    double sr= (double) mas[i]/5;
    cout<<setprecision(2)<< sr <<endl;
    cout<<"_________________________\n";
    }
    getch();
    return 0;
    }
    Как теперь вывести анкетные данные учащихся, с оценкой ниже 4 по предмету? :dontknow:


А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное