블로그 이미지

카테고리

데꾸벅 (194)
Publisher (39)
Scripter (97)
Programmer (1)
Designer (30)
Integrator (18)
Pattern Searcher (4)
News (2)
강좌 및 번역 (3)

최근에 올라온 글

최근에 달린 댓글


미투데이를 하다가 온라인 회의나 아이디어를 정리할때 사용하면 좋은 사이트를 찾다.

http://linoit.com

어찌보면 레몬펜과 비슷할수 있으나 조금은 느낌이 틀린이유는 무엇일까?

데꾸벅 메모장으로 오시려면 이곳으로 오세요

Post by 넥스트리소프트 데꾸벅(techbug)
, |


기본적으로 grid의 View에 editor와 같이 다른 컴포넌트를 붙이기는 기존 소스보다 컴포넌트를 붙이는 소스가 더 많이 들어가는 경우가 있다.
데꾸벅의 경우도 프로젝트중 각각의 그리드 Row마다 progress bar를 붙여야 하는 경우가 생겼었는데..
포럼글을 뒤지다가 다음과 같은 좋은 사용자 플러그인이 있어 분석을 위해 소스를 까 보았다.



위 그림에서 보는바와 같이 그리드위에 버튼을 만들어 올릴때 new Ext.button이 아닌 new Ext.Action을 사용하여 사용자 플러그인을 사용한 소스이다.
소스 API  및 관련 포럼글 

HTML
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <link rel="stylesheet" type="text/css" href="./css/icons.css">
 <link rel="stylesheet" type="text/css" href="./css/Ext.ux.grid.RowActions.css">
    <link rel="stylesheet" type="text/css" href="../../ext/ext-2.2/resources/css/ext-all.css" />
    <script type="text/javascript" src="../../ext/ext-2.2/adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="../../ext/ext-2.2/ext-all.js"></script>
 <script type="text/javascript" src="./js/Ext.ux.grid.RowActions.js"></script>
 <script type="text/javascript" src="./js/Ext.ux.Toast.js"></script>
 <script type="text/javascript" src="rowactions.js"></script>
</head>
<body></body>
</html>





JS

Ext.BLANK_IMAGE_URL = '';
Ext.ns('Example');
Example.version = '1.0';

Example.Grid = Ext.extend(Ext.grid.GridPanel, {

  initComponent:function() {

   // Create RowActions Plugin
   this.action = new Ext.ux.grid.RowActions({
    header:'Actions'
   ,autoWidth:true
   ,keepSelection:true
   ,actions:[{
     iconIndex:'action1'
    ,qtipIndex:'qtip1'
    ,iconCls:'icon-open'
    ,tooltip:'Open'
   },{
     iconCls:'icon-wrench'
    ,tooltip:'Configure'
    ,qtipIndex:'qtip2'
    ,iconIndex:'action2'
    ,hideIndex:'hide2'
   },{
     iconIndex:'action3'
    ,qtipIndex:'qtip3'
    ,iconCls:'icon-user'
    ,tooltip:'User'
    ,style:'background-color:yellow'
   }]
   ,groupActions:[{
     iconCls:'icon-del-table'
    ,qtip:'Remove Table'
   },{
     iconCls:'icon-add-table'
    ,qtip:'Add Table - with callback'
    ,callback:function(grid, records, action, groupId) {
     Ext.ux.Message.msg('Callback: icon-add-table'
         , 'Group: <b>{0}</b>, action: <b>{1}</b>, records: <b>{2}</b>'
         , groupId
         , action
         , records.length);
    }
   },{
     iconCls:'icon-graph'
    ,qtip:'View Graph'
    ,align:'left'
   }]
   ,callbacks:{
    'icon-plus':function(grid, record, action, row, col) {
     Ext.ux.Message.msg('Callback: icon-plus'
         , 'You have clicked row: <b>{0}</b>, action: <b>{0}</b>'
         , row
         , action);
    }
   }
  });

  this.action.on({
   action:function(grid, record, action, row, col) {
    Ext.ux.Message.msg('Event: action', '클릭한 Row: <b>{0}</b>, 액션: <b>{1}</b>'
        , row
        , action);
   }
   ,beforeaction:function() {
    Ext.ux.Message.msg('Event: beforeaction', '핸들러에서 false반환시 액션취소.');
   }
   ,beforegroupaction:function() {
    Ext.ux.Message.msg('Event: beforegroupaction', '핸들러에서 false반환시 액션취소');
   }
   ,groupaction:function(grid, records, action, groupId) {
    Ext.ux.Message.msg('Event: groupaction', 'Group: <b>{0}</b>, action: <b>{1}</b>, records: <b>{2}</b>', groupId, action, records.length);
   }
  });

  Ext.apply(this, {
    store:new Ext.data.Store({
    reader:new Ext.data.JsonReader({
      id:'company'
     ,totalProperty:'totalCount'
     ,root:'rows'
     ,fields:[
      {name: 'company'}
        ,{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
        ,{name: 'industry'}
        ,{name: 'desc'}
        ,{name: 'action1', type: 'string'}
        ,{name: 'action2', type: 'string'}
        ,{name: 'action3', type: 'string'}
        ,{name: 'qtip1', type: 'string'}
        ,{name: 'qtip2', type: 'string'}
        ,{name: 'qtip3', type: 'string'}
        ,{name: 'hide2', type: 'boolean'}
     ]
    })
    ,proxy:new Ext.data.HttpProxy({url:'jsonData.json'})
    ,sortInfo:{field:'company', direction:'ASC'}
    ,listeners:{
     load:{scope:this, fn:function() {
      this.getSelectionModel().selectFirstRow();
     }}
    }
   })
   ,columns:[
    {id:'company',header: "Company", width: 40, sortable: true, dataIndex: 'company'}
    ,{header: "Industry", width: 20, sortable: true, dataIndex: 'industry'}
    ,{header: "Last Updated", width: 20, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
    ,this.action
   ]
   ,plugins:[this.action]
   ,loadMask:true
   ,viewConfig:{forceFit:true}
  });

  this.bbar = new Ext.PagingToolbar({
    store:this.store
   ,displayInfo:true
   ,pageSize:10
  });

  Example.Grid.superclass.initComponent.apply(this, arguments);
 }


 ,onRender:function() {
  Example.Grid.superclass.onRender.apply(this, arguments);
  this.store.load({params:{start:0, limit:10}});
 }
});

//컴포넌트 등록
Ext.reg('techbuggrid', Example.Grid);

Ext.onReady(function() {
    Ext.QuickTips.init();

    var win = new Ext.Window({
         width:600
  ,minWidth:320
        ,id:'agwin'
        ,height:400
        ,layout:'fit'
        ,border:false
  ,plain:true
        ,closable:false
        ,title:"그리드 Row Action 처리하기"
  ,items:{xtype:'techbuggrid',id:'actiongrid'}
    });
    win.show();
});




사용자 플러그인.JS

Ext.ns('Ext.ux.grid');
if('function' !== typeof RegExp.escape) {
 RegExp.escape = function(s) {
  if('string' !== typeof s) {
   return s;
  }
  return s.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g, '\\$1');
 };
}

Ext.ux.grid.RowActions = function(config) {
 Ext.apply(this, config);
 this.addEvents(
   'beforeaction'
  ,'action'
  ,'beforegroupaction'
  ,'groupaction'
 );
 Ext.ux.grid.RowActions.superclass.constructor.call(this);
};

Ext.extend(Ext.ux.grid.RowActions, Ext.util.Observable, {
  actionEvent:'click'
 ,autoWidth:true
 ,dataIndex:''
 ,header:''
 ,keepSelection:false
 ,menuDisabled:true
 ,sortable:false
 ,tplGroup:
   '<tpl for="actions">'
  +'<div class="ux-grow-action-item<tpl if="\'right\'===align"> ux-action-right</tpl> '
  +'{cls}" style="{style}" qtip="{qtip}">{text}</div>'
  +'</tpl>'
 ,tplRow:
   '<div class="ux-row-action">'
  +'<tpl for="actions">'
  +'<div class="ux-row-action-item {cls} <tpl if="text">'
  +'ux-row-action-text</tpl>" style="{hide}{style}" qtip="{qtip}">'
  +'<tpl if="text"><span qtip="{qtip}">{text}</span></tpl></div>'
  +'</tpl>'
  +'</div>'
 ,hideMode:'visiblity'
 ,widthIntercept:4
 ,widthSlope:21
 ,init:function(grid) {
  this.grid = grid;
  if(!this.tpl) {
   this.tpl = this.processActions(this.actions);
  }
  if(this.autoWidth) {
   this.width =  this.widthSlope * this.actions.length + this.widthIntercept;
   this.fixed = true;
  }
  var view = grid.getView();
  var cfg = {scope:this};
  cfg[this.actionEvent] = this.onClick;
  grid.afterRender = grid.afterRender.createSequence(function() {
   view.mainBody.on(cfg);
   grid.on('destroy', this.purgeListeners, this);
  }, this);

  if(!this.renderer) {
   this.renderer = function(value, cell, record, row, col, store) {
    cell.css += (cell.css ? ' ' : '') + 'ux-row-action-cell';
    return this.tpl.apply(this.getData(value, cell, record, row, col, store));
   }.createDelegate(this);
  }

  if(view.groupTextTpl && this.groupActions) {
   view.interceptMouse = view.interceptMouse.createInterceptor(function(e) {
    if(e.getTarget('.ux-grow-action-item')) {
     return false;
    }
   });
   view.groupTextTpl =
     '<div class="ux-grow-action-text">' + view.groupTextTpl +'</div>'
    +this.processActions(this.groupActions, this.tplGroup).apply()
   ;
  }

  if(true === this.keepSelection) {
   grid.processEvent = grid.processEvent.createInterceptor(function(name, e) {
    if('mousedown' === name) {
     return !this.getAction(e);
    }
   }, this);
  }
  
 }
 ,getData:function(value, cell, record, row, col, store) {
  return record.data || {};
 }

 ,processActions:function(actions, template) {
  var acts = [];

  Ext.each(actions, function(a, i) {
   if(a.iconCls && 'function' === typeof (a.callback || a.cb)) {
    this.callbacks = this.callbacks || {};
    this.callbacks[a.iconCls] = a.callback || a.cb;
   }

   var o = {
     cls:a.iconIndex ? '{' + a.iconIndex + '}' : (a.iconCls ? a.iconCls : '')
    ,qtip:a.qtipIndex ? '{' + a.qtipIndex + '}' : (a.tooltip || a.qtip ? a.tooltip || a.qtip : '')
    ,text:a.textIndex ? '{' + a.textIndex + '}' : (a.text ? a.text : '')
    ,hide:a.hideIndex
     ? '<tpl if="' + a.hideIndex + '">'
      + ('display' === this.hideMode ? 'display:none' :'visibility:hidden') + ';</tpl>'
     : (a.hide ? ('display' === this.hideMode ? 'display:none' :'visibility:hidden;') : '')
    ,align:a.align || 'right'
    ,style:a.style ? a.style : ''
   };
   acts.push(o);

  }, this);

  var xt = new Ext.XTemplate(template || this.tplRow);
  return new Ext.XTemplate(xt.apply({actions:acts}));

 }
 ,getAction:function(e) {
  var action = false;
  var t = e.getTarget('.ux-row-action-item');
  if(t) {
   action = t.className.replace(/ux-row-action-item /, '');
   if(action) {
    action = action.replace(/ ux-row-action-text/, '');
    action = action.trim();
   }
  }
  return action;
 }
 ,onClick:function(e, target) {

  var view = this.grid.getView();

  var row = e.getTarget('.x-grid3-row');
  var col = view.findCellIndex(target.parentNode.parentNode);
  var action = this.getAction(e);

  if(false !== row && false !== col && false !== action) {
   var record = this.grid.store.getAt(row.rowIndex);

   if(this.callbacks && 'function' === typeof this.callbacks[action]) {
    this.callbacks[action](this.grid, record, action, row.rowIndex, col);
   }

   if(true !== this.eventsSuspended && false === this.fireEvent('beforeaction', this.grid, record, action, row.rowIndex, col)) {
    return;
   }
   else if(true !== this.eventsSuspended) {
    this.fireEvent('action', this.grid, record, action, row.rowIndex, col);
   }

  }

  t = e.getTarget('.ux-grow-action-item');
  if(t) {
   var group = view.findGroup(target);
   var groupId = group ? group.id.replace(/ext-gen[0-9]+-gp-/, '') : null;

   var records;
   if(groupId) {
    var re = new RegExp(RegExp.escape(groupId));
    records = this.grid.store.queryBy(function(r) {
     return r._groupId.match(re);
    });
    records = records ? records.items : [];
   }
   action = t.className.replace(/ux-grow-action-item (ux-action-right )*/, '');

   if('function' === typeof this.callbacks[action]) {
    this.callbacks[action](this.grid, records, action, groupId);
   }

   if(true !== this.eventsSuspended && false === this.fireEvent('beforegroupaction', this.grid, records, action, groupId)) {
    return false;
   }
   this.fireEvent('groupaction', this.grid, records, action, groupId);
  }
 }

});

Ext.reg('rowactions', Ext.ux.grid.RowActions);




요기 괜찮은 사용자 플러그인도 함 보세요





















'Scripter > EXTJS' 카테고리의 다른 글

Extjs Core 3.0 Beta 릴리즈  (4) 2009.04.07
Examples Of ExtJS in Action  (2) 2009.03.31
extjs 2.2의 IE에서 iframe document load 버그패치  (0) 2009.01.21
Extjs 3.0 Roadmap  (10) 2008.11.12
Ext2.2 Release  (11) 2008.08.07
Post by 넥스트리소프트 데꾸벅(techbug)
, |

본 강의자료는 복제, 배포가 불가능합니다. by techbug





Internet Explorer 8




Reference Books
  Designing Interfaces  : UI Pattern과 관련된 내용을 익히기에 좋습니다. [관련사이트]

 Ajax Programming 기초부터 중급까지  : 기초가 부족하신 분들이 보시기에 좋습니다. (예제: JSP)

 Ajax Design Patterns : 설계패턴에 대한 전반적인 내용 (예제:php)

 Ajax in Action : Ajax 설계패턴에 대한 전반적인 내용

 Ajax Patterns and Best Practices : 예제파일이 좋습니다.

 Ajax Security : 로그인 보안 및 알고리즘에 대해 설명

 Ajax design pattern for web2.0 : 설계패턴의 전반적인 내용

 Pro Javascipt Design Patterns : 자바스크립트 설계원칙에 대한 내용

 Foundation of Ajax : 테스팅툴이나 ajax기초에 대해서 설명합니다.
 
 
 
 
 
 
 
웹표준 및 jQuery 관련 추천책 
 웹표준교과서

 CSS 마스터전략

 실용예제로 배우는 웹표준

 웹2.0을 이끄는 방탄웹

 웹표준 Ajax DOM 스크립팅

jQuery1.3 작고 강력한 자바스크립트 라이브러리

jQuery in Action (프로그래밍 jQuery)

















'강좌 및 번역' 카테고리의 다른 글

HTML5  (10) 2010.03.02
프로젝트 관리자가 알아야할 97가지 사실  (1) 2009.12.08
Post by 넥스트리소프트 데꾸벅(techbug)
, |



 


프로페셔널 프론트엔드 개발자에게 필요한 기술에 대해서 Yahoo의 Nate Koechley의 얘기를 들어봅시다.
프론트엔드 엔지니어가 어떠한 일을 하는지, 어떤 업무를 해야 하는지.  이들로 인한 효과가 무엇인지에 대해 말해주고 있습니다. 

프론트엔드 기술에 대해서 전혀 모르는 분보다는 쬐금 아시는분들이 듣기에 좋습니다.

간단하게 얘기하자면..

HTML syntax에서 많이들 혼용하는 부분이나 표준적인 코딩, 자신이 생각하는 코딩법 (데꾸벅 주: 사실 동영상에서의 <div id="footer"><p>보다는 <address>가 더 좋습니다.) 등에 대해서 설명하며,
CSS에서는 selector사용법, background-image를 유용하게 사용하는법, 그로인한 효과등을 알려주는군요..

이벤트 핸들러를 이용한 Javascript를 사용할때의 유용한 표현, 분리된 자바스크립트(unobtrusive javascript)에 대한 얘기며, 실제 프론트엔드 기술에서의 Publisher가 아닌 Integrator로써의 역할에 대한 내용을 많이 역설하는군요..

사실 이번에 KOSTA강의에서 UI, UX아키텍쳐 설계에 대해서 강의를 맡게 되었는데 강의내용에 있던 내용들이 많이 있군요..  AJAX 설계방법시 많은 패턴중에 간략하게 설명해 놓은 부분들도 있네요~~

쉽고 간략하게 핵심만 골라 설명해주고 있습니다. 깊이는... 글쎄요~ ^^
다음에 시간이 나면 저두 이런 자료를 하나 만들어 올려야 겠군요..

   












'Pattern Searcher > 어쩌다 쓴 넋두리' 카테고리의 다른 글

온라인 메모장  (6) 2009.04.08
이땅의 개발자에게 필요한 철학  (2) 2008.03.05
Getting Real  (0) 2008.03.04
Post by 넥스트리소프트 데꾸벅(techbug)
, |
출처 : http://boxesandarrows.com/view/ux-design-planning

번역을 할 시간이... .. 나중에 해야겠군요..ㅡ.,ㅡ;

A lot of confusion and misunderstanding surrounds the term "user experience." The multitude of acitivities that can be labeled with these two words span a vast spectrum of people, skills and situations. If you ask for UX design (UXD), what exactly are you asking for? Similary, if someone tells you they are going to provide you with UXD for an application, website or intranet or extranet, what exactly are you going to get?

Is it just one person who is responsible or is it a team of people who are in charge of UXD? In this story I´ll sketch my ideas ofUXD based on my experiences and at the end of this story I will give you my answer.

Let us start at the beginning – UXD starts with experience – experience of the users. And so I will talk about the users first.

 

 

UXD-P – every person is an individual

Every person is an individual. Every person is in possession of different roles. For each individual there will be many roles and each person adopts a different role depending on the circumstances.

roles of experiences

User Roles

Sometimes the individual person holds one role, but mainly he will hold quite a few roles like consumer, customer, user, client, investor, producer, creator, participant, partner, part of a community, member, and so on.

 

 

UXD-P – network of expectations, experiences and knowledge

Every user is multi-faceted – and is considerably more complex than they themselves can imagine – so it´s not very helpful just to talk to the user or ask him what he needs. We have to watch what people do; we have to listen to what people say and to recognize what decisions people make – and by observing we have to evaluate and understand why they do this and that. Why and what kind of visual elements will the user like, prefer and or understand? Why and what kind of mental model, navigation or function do they respond to?



Jakob Nielsen said “To design an easy-to-use interface, pay attention to what users do, not only what they say. Self-reported claims are unreliable, as are user speculations about future behaviour.” (Jakob Nielsen – Alertbox) and I agree – I think no statement can be objective. Perhaps the circumstances are not realistic or not reasonable for the person. Or maybe the person himself is not really in the “situation,” or he is being influenced by other factors (trying to please the tester for example). Or maybe he is trying to succeed with the test rather than trying and failing, which tells us so much more.

When all three perspectives (do, say, make) are explored together, we are able to realize the experience spectrum of the “normal” user/customer we are working for.

Jesse James Garrett said: “User experience is not about how a product works on the inside. User experience is about how it works on the outside, where a person comes into contact with it and has to work with it” (J.J.Garrett – The Elements of User Experience) .

areas of experiences

Experiences

Areas of experiences: different areas which effect the quality of communication

 

 

UXD-P – personal and individual

When we talk about experiences, we take the individual into consideration, including the subjective occurrences felt by the person who has the “confrontation” with what we want them to use. Experiences are momentary and brief – sometimes they are part of a multi-layered process or they are on their own.



Normally such know-how has been learned as a part of something or by itself and will be remembered in the same way – but that’s not always the case – and the person deals with the situation in a different way. If we look at their exeperience as a continuum, the user brings their experiences of the past to the interaction in the present and adds their hopes for the future. That future could be: to interact with their banking in a safe and secure way.

flow of experiences

Flow of Experience

Flow of experience: the individual user/customer is always in the present – they act in the present. They are influenced by former experiences and current expectations.

UXD-P is taking the users’ views, behavior, and interactions, to figure out the emotional relationship between them and the thing we have built. For the most part these "people" and their experiences are unknown. It requires an appreciation of the customer: their journey, their personal history and their experiences.

It is the collective set of experiences, in the online-world, the offline-world, or even tiny little things (i.e. My coffee was cold this morning) that affects their experience of the products and the companies that represent them. It is about appreciating the individual user’s unmet needs, wants, capabilities and desires in a contextual way. It´s a box of experiences including the things the user saw, acted and felt. (BBC Two [12th February 2008, 9pm, BBC Two] had a program on rational thought. Highlights of the program include: Loss complex, Post-decision rationalization, Priming, Precognition. Watch highlights from the programme : http://www.bbc.co.uk/sn/tvradio/programmes/horizon/broadband/tx/decisions/highlights/ )

Experiences and expectations meet in the present. Both are inseperably combined, and every action we take takes both parts into consideration. When a person uses an application, he tries to understand what happens. He will always try to reference this to his past experiences. The moment is also tightly coupled to his expectations of his personal outlook.



At this point of “present” I think of the UX honeycomb of Peter Morville [1] …

honeycromb – Peter Morville

Morville’s "honeycomb"

honeycomb – Peter Morville (P.Morville – Facets of the User Experience)

In the present we have to deliver to the individual user and his specific task the best answers to following questions.


  • Is the application useful for the individual user and his specific task?
  • Is the application usable for the individual user and his specific task?
  • Is the application desirable for the individual user and his specific task?
  • Is the application valuable for the individual user and his specific task?
  • Is the application accessible? Available to every individual user, regardless of disability?
  • Is the target findable for the individual user and his specific task?
  • Is the application credible for the individual user and his specific task?

In the UXD-P the whole team has to take the users’ views of the GUI and the interactions to figure out the emotional relationship between the brand and potential customers. It requires a common appreciation of the customer journey and their personal history: not only with the product and similar products, but also with similar experiences.

 

 

UXD-P – teamwork and cooperation

The first stage in discovering – to invent or design for the experience – is to take a new viewpoint about the people who buy and use the products and services we are designing. This is a birdseye view and from step to step we have to use the "mouseview," which is to say a detailed view from the user’s perspective, as we develop the application we have to switch between these views. Our main desire is to to respect, value, and understand the continuum of experience and expectations our users have .

UXD-P can sometimes be a slippery term. With all the other often used terms that float around: interaction design, information architecture, human computer interaction, human factors engineering, usefulness, utility, usability and user interface design. People often end up asking, “What is the difference between all these fields and which one do I need?” If the UXD is aimed to describe the user’s satisfaction, joy or success with an application, product or website, however we specify it, there are a few key essentials which need to be tackled and I have to point out the UX honeycomb of Peter Morville [1] a second time. Each of these points, as enlightened above, makes up a considerable component of the user experience. Each is made effective due to the design offerings from each of the following elements:

Usefulness is based upon utility and usability. This means the product is able to give exactly the right kind of service and what the user is expecting from it. And it´s the joy of reaching my aims and the joy of doing so easily. The information architecture is in charge of clarity of the information and features, lack of confusion, a short learning curve and the joy of finding. The designing of the interaction is essential for a successful and overall satisfying experience. So the interaction design has to answer the questions of workflow, logic, clarity, and simplicity of the information. Visual design is responsible for the clarity of the information and elements, simplicity of tools and features, pleasant or interesting appearance of the interface, the visual hierarchy, and the joy of look and feel. Accessibility is a common term used to describe how easy it is for people to use applications or other objects. It is not to be mixed up with usability which is used to describe how easily an application, tool or object can be used by any type of user. One meaning of accessibility specifically focuses on people with disabilities: physical, psychological, learning, among others. Even though accessibility is not an element of its own, it is important to notice that accessibility also plays a role on the whole user experience to increase the likelihood of a wide-ranging user experience. People tend to gravitate to something that is easier to use regardless of who it might have been designed for.



The UXD innovation process is a nonlinear spiral of divergent and convergent activities that may repeat over time. Any design process begins with a vision. This applies particularly to the UX process. A vision, however, is not enough to start design. As I mentioned before, we always have different circumstances, users and roles. Therefore, it is critical to accurately understand the end user’s needs and requirements – his whole experience and expectations. The UX process relies on iterative user research to understand users and their needs. The most common failure point in UX processes is transferring the perspective of users to UI design. The key is to define interaction first, without designing it. First, all the research (the user, product and environment) have to be organized and summarized in a user research composition. These lead to user profiles, work activities, and requirements for the users. The user research composition feeds directly into use cases. The use cases show steps to accomplish task goals and the content needed to perform interactions. Completed use cases are validated with the intended user population. This is a checkpoint to see if the vision is being achieved and the value is clear to users and the project team. The next step is to design the user interface, generating directly from the interaction definition. A primary concern with design is to not get locked into a single solution too early. To keep the project on time, this step should be split into two parts: rough layout and exact and detailed design. The rough layout allows experimentation and rapid evaluation. Detailed design provides exacting design and behavior previews of the final application that specify what is to be coded. Iterative user evaluations at both stages are connected to be fast and effective in improving GUI, design feedback, rapid iterative evaluations, and usability evaluations.

UX workflow cycle

Image_7

design workflow – workcycle – workspiral

 



 

 

UXD-P – Gathering the elements

The diagram below presents the relationship of the elements above:

elements of UXD-P

Elements of UXD-P



Lewin’s equation

Lewin’s Equation, B = f (P,E) ( B – Behaviour; f – Function; P – Person; E – Environment ), ...

... is a psychological equation of behaviour developed by Kurt Lewin. It states that behaviour is a function of the person and his or her environment [2].

There is a desired behaviour that we need to encourage, but we have no control over the person, so via interaction design, information architecture and interface design we control the environment and therefore generate the desired behavior. (see reference: books.google.com ).

 

 

UXD-P – many steps to go but every step is worth it

How do we involve our team, customer and our user/consumer? We can start at different points, but I like to think about the circumstances first. Where do we come from? Where are we? Where will we go? And who is “we”? “We” means each person who is involved in the project. Iin the centre of each effort stands the user. To get the user with his personal experiences and expectations into the project, the design team and the customer needs a combining glue / tool / instrument. I believe these are the personas of the “target users/consumers” in the process of UXD-P. If there are no personas the second or third choice are scenarios or the workflows (based on a certain user/person).

The management point of view for the most cases is also the view of our customer. It includes the user’s/consumer’s age, income, gender and other demographics. The perspective of UXD-P is to look at behaviour, goals and attitude.

To get a realistic persona we have to identify first of all the target users. Out of my experiences this is not only the task of our client to define the users and consumers – we have to support him. During the identification and characterization we have to go beyond demographics and try to understand what drives individual users and consumers to do what they do and these as detailed in quantity and quality as necessary and possible – like I mentioned above. The approach and the complexity of the characterization depend on the tasks, project and functionalities. Parallel to the very personal description we need a “picture” of the environment. For each persona we must define their business and/or their private concerns and aims. Do they want to research a product for purchase later? Are they concerned about not wasting time primarily? Do they just want to purchase something online as easy and quick as possible?

Depending on these personas we can formulate, discuss and prove scenarios – from the very beginning of the project, during the project and as check or analysis at the end of the project.

 

 

 

 

 

UXD-P – my blueprint of schedule – "todos" and deliverables

We are always asking and being asked: what are the deliverables. Throughout my career as an IA, UX-planner and designer, as well as during my study of architecture and town planning, I have constantly asked myself following the questions:


  • What kind of project is it? What are the key points?
  • What should our steps and milestones be in the project?
  • What should our/my deliverables be?
  • How can we/I explain the main idea?

I have realized that if I do not answer these questions previous to creating a deliverable, I waste more time and deadlines slip.

The deliverables are not for us. The deliverables are a means of communication with several people: manager, decision maker, client, designer, front-end developers, back-end developers, etc. Sometimes I have the feeling we overlook this from time to time. After I think about the project I have to ask myself, where will my deliverables and other efforts fit within the process of design? The following diagram describes different lines of work that will lead us to some questions each line must accomplish. Depending on these questions and topics I will outline the basis, basics and deliverables for which each skill and ability which is necessary.

Image_6___schedule of UXD-P_small version

Image_6

schedule of UXD-P ___ better view – schedule 1238px x 1030px

 

UXD-P – my conclusion

I studied architecture and town planning. And just like town planning and architecture isn’t just for architects and art lovers, the internet isn’t just for computer users and developers. Similarly, just as the towns and the cities are for the inhabitants and architecture is for the users of a building, so products and applications are for the user, the customer, the member and not for the people who build them.

In every kind of process we should act in a team but in the process of UXD-P it is absolutely essential that we have to think parallel, with the same focus . We have to act in a team, although every team member is a kind of lawyer: lawyer of budget, of the client, of utility, of usability, of look and feel, of brand and finally of the user himself. Because at the end of the project, our user/customer is the final judge.

Good design is not only interface, or look and feel, or technology, or hardware, or how it works. It is every detail, like the structure, the labelling, the border of a button or a little icon. Finally, it is the sum of every element. I believe that a shared vision of a group of creators will have more potential than individual creativity. And that is the point where creativity meets expectation. The point of view on IA and design and the process to get to a well-designed product will be changed by UXD-P.

The persons who use the application or other object that we invent are the real “architects” of the “architecture” – the real “inventor” of the design. The more we know about our users, the more likely we are to meet their needs.

As the capabilities of interactive applications and the internet go forward and grow, more and more consumers use the applications and the various possibilities in new and different ways. We must think about all aspects of user experience.

And I will ask you once again: Is it just one who is responsible or is it the team which is in charge of UXD-P?

Personally, I believe it is the process of planning and designing for User Experiences (and so I think it’s the team which is in charge), but the overview has to have an experienced planner as a kind of captain.

 

The most common cause of an ineffective website (one that doesn’t deliver value to both the business and its intended constituents) is poor design. The products have to follow, to cover the functions and the experiences. The lack of clear organization, navigation and values of brand and mood mean that people will have an unintentional and maybe bad experience, rather than one that will meet the business’s relationship objectives for each individual. User experience design and planning is a fundamental component to the creation of successful digital products, applications and services.

UXD-P is UXdesign and planning- - In my estimation there are distinctions between Design and Planning.

Design is usually considered in the context of arts and other creative efforts. When I think of design in the UX process it focuses on the needs, wants, and limitations of the end user of the designed goods, but mainly on the visual parts and the mood. A designer has to consider the aesthetic-functional parts and many other aspects of an application or a process.

The planning part provides the framework. The term "planning" describes the formal procedures used in such an endeavors, such as the creation of documents, diagrams etc. to discuss the important issues to be addressed, the objectives to be met, and the strategy to be followed. The planning part is responsible for organizing and structuring to support utility, findability and usability.

I strongly believe that both parts – design and planning – have to work closely together. Every team member should have the ability to think cross-functionally and to anticipate consequences of activities in the whole context.

I’ve often seen timelines like this …

Image_8___

and this doesn´t work for UXdesign and planning …

I give a timeline the preference which looks like this:

Image_9___

... to develop a UXdesign and UXplanning.

And in the center of this team and of this process should stand the leading person – the user!

Image_9___basis points of UXD-P

Post by 넥스트리소프트 데꾸벅(techbug)
, |

jQuery pageSlide

Scripter/jQuery / 2009. 1. 12. 13:03

Web2.0이 대두되면서 기존의 레거시한 웹UI보다 조금은 다이나믹하고 다양한 Layout들이 나오기 시작했다.
탑-레프트-컨텐츠-푸터 방식의 eye-tracking이 중시되던 UI에서 기술적으로 많이 향상되기 시작하면서 다양한 메뉴와 UI화면들이 표현되기 시작했다.

마우스에 의한 각각의 메뉴표현 방식 : Ubiquity Pane in Mouse 

구현기술향상에 의한 다양한 UI를  소화하기 위해서 위의 그림과 같이 여러가지 메뉴가 만들어 졌다.
그중에 Firefox Mobile의 메뉴를 jQuery Plugin으로 구현한 소스가 있어 소개한다.
(위 메뉴중 2줄 좌측 Tray Menu)
복잡하고 표현하기 힘든 UI의 경우 잠시 페이지를 숨겼다 오른쪽 panel에서 보여줄때 상당히 유용할듯.(extjs의 panel collapse, expand와 기능이 비슷하나 jQuery pageSlide의 경우는 a 링크에 표현된 페이지를 오른쪽에서 보여준다는 면에서 다르다)

[사용법]
 <script type="text/javascript">   $(document).ready(function() {
       $('a').pageSlide({
           width: "350px"
       });
   });
 </script>

Demo-Source, Project Homepage



Post by 넥스트리소프트 데꾸벅(techbug)
, |

Web 2008 통계

Publisher/WEB2.0 / 2009. 1. 12. 11:05


오늘자(2009/01/09) Ajaxian 포스트중에 2008년 Web에 대한 통계에 대한것을 정리하다.

John Allsopp씨는  extensive state of the web 2008 survey에서 전세계, 다양한 분야의  1,200명의 웹전문가를 대상으로 사용하는 브라우저,OS, 웹사이트 개발시 사용한 기술들에 대해서 정리하였다.

해당 포스트를 보면, 국내사용자를 대상으로 한 설문조사가 아니라서 국내환경과는 조금은 맞지 않는 부분이 있긴 하지만 대부분이 인식하고 있는 부분이라 결과에 대해서는 어느정도 공감하고 있으리라 생각한다.
예상했던 대로 2008년 한해는 UI기술에 대해서 획기적으로 많은 변화와 웹의 미래를 엿볼수 있는 한해가 아니였나 싶다.

비윈도우즈 계열이 50%에 육박했으며 윈도우즈XP는 여전히 무거운 Vista보다 단지 1/4 의 유저많이 사용하고 있었다.
단지 기본브라우저로 IE를 사용하고 있는 사용자는 극히 드물었으며, Firefox가 50%의 시장점유율을 보였으며, Safari3 이 21%, 크롬은 단지 4%의 시장점유율을 보였다.   

웹개발 기술로써는 응답자의 3%는 전혀 웹유효성검증을 하지 않았으며 70%가 항상 유효성 검증을 하고 있었으며 10%의 응답자만이 table로 layout을 그리고 있었으며 90%가 CSS Style을 이용하여 페이지를 그리고 있었다.
자바스크립트 라이브러리에서는 JQuery가 60%로 압도적으로 우세하였다.

플러그인 기술로는 Flash가 60%를 Silverlight가 2%, 애플의 QuickTime이 놀랍게도 20%를 차지하고 있었다. 
개발기술로는 PHP가 63%, Javascript가 55% ASP.NET이 17%, Pythondl 15%, Ruby가 14%로 그 뒤를 잇고 있다.

모바일웹의 도래
기본 레거시 브라우저에 다른 브라우저를 고려한다면 어떤 브라우저를 고려하는가에 대한 응답에 대해서 20%가 모바일에 대해서 고려하고 있었다. 전통적인 래탑이나 데스탑에서 모바일로서 웹이 이동해 가고 있다는 뜻은 아닐까?


설문대상자
응답자중 33%가 디자이너, 거의 반인 48.5%가 개발자이며 그외 18%로 북아메리카, 유럽, 호주,뉴질랜드쪽 응답자가 많았다.



브라우저 및 OS


웹개발시 사용하는 테스트 브라우저
 


마크업기술

사용하는 마크업




마크업의 경우 얼마나 자주 유효성 검증을 하는가?
 

사용하는 DOCTYPE은?


테이블로 레이아웃을 그리는가?

사용하는 속성이 있는 태그는?

사용하고 있는 MicroFormat(RDFa)은?



CSS기술

웹디자인 철학

크로스브라우징

사이트 디자인시 Qurksmode로 사용하는지?

CSS를 사용하는 목적


CSS사용시 자주 사용하는 선택자 및 CSS3중 사용하는것은?

웹폰트를 사용하는지? 사용하면 어떤식으로 사용하는지?

SVG는 사용하는지? CANVAS태그를 사용하는지?

사이트개발시 노트북이나 PC이외의 장치에 대해서는 고려하는지?
이외 장치에 대해 고려하는 응답자중 15%정도가 mobile, 10%가 iPhone(역시 대세인가?) 1%가 Blackberry 5명이 Wii 에 대해서 고려한다고 응답하였다.



Javascript, Ajax, DOM에 대해서

개발시 자바스크립트를 사용하는 목적
응답자중 5%를 제외한 모든 응답자가 자바스크립트를 사용하였다. (나머지 5%는 뭐지??)

Javascript Coding Practices (무간섭 스크립트를 사용하는가?)
마크업과 자바스크립트를 분리하여 사용하는가에 대한 질문 (Unobtrusive Javascript)

W3C DOM 을 엄격히 고수하는가?


Javascript Library and Framwork

사용하는 자바스크립트 라이브러리나 프레임웍은?

Flash, Silverlight, 다른 embedded content

브라우저 플러그인을 사용하여 웹사이트를 구성하는가? 구성한다면 어떤 종류를 많이 사용하는가? 어떠한 목적으로 사용하나?


Back-end 개발언어 및 시스템

서버하드웨어를 구동하는 환경?


사용하는 웹서버는?

서버의 OS는?

많이 사용하는 데이타베이스는?


사용하는 언어는?


사용하는 서버프레임웍은?















아래는 각각의 통계자료에 바탕하여 패키지화한 페이지들이다 시간있을때 한번씩 둘러보는것도 좋을것 같다.


Javascript

  • jQueryDownload | Site | Docs | Plugins
    My favorite Javascript framework with a small footprint at 20k.
  • SWFObject 2.1 Download | Site
    Defacto script for embedding Flash content.
  • OffspringDownload | Site
    Automatically applies .first-child, .last-child, .only-child classes to DOM elements.
  • Dean Edwards IE7 ScriptDownload | Site
    Library makes IE5/6 behave like IE7.
  • NicEditDownload | Site
    Turns any textarea into a WYSIWYG editor.
  • Reflection 2.0Download | Site
    Adds a wet-floor effect to any image.

jQuery Essential Widgets

jQuery Specialized Widgets

  • Custom Checkboxes 1.1.0b2Download | Site
    Easily replace checkboxes and radios with custom graphics.
  • markItUp! 1.1.5Download | Site
    Turns textarea tag into a markup editor with various syntaxes.
  • jEditable 1.5.1Download | Site
    Makes any element a click-to-edit, Ajaxified item.
  • Date Picker 2.1.2Download | Site
    Creates a popup date picker to easily fill in forms.
  • Table Sorter 2.0.3Download | Site
  • Ingrid Datagrids 0.9.1Download | Site
  • Star RatingDownload | Site
    Creates a star rating interface based on a simple form.
  • jMedia 1.01Download | Site
    Flexible multi-media embedding. Supports: Flash, QT, Real, +.
  • BlockUI 2.14Download | Site
    Prevents activity with the window or elements when using AJAX.
  • jCarousel 0.2.3Download | Site
    Scroll items in horizontal or vertical order with controls.
  • Farbtastic 1.2 Color PickerDownload | Site
    HSL color picker widget.

jQuery “Extensions”

  • jQuery MetadataDownload
    Embed metadata in HTML tags. See code for examples.
  • jQuery Easing 1.3Download | Site
    jQuery library for advanced sliding-type animations.
  • Bgiframe 2.1.1Download | Site
    Used when you show elements over a select control in IE6.More Selectors 1.1.3.1Download | Site
    Adds a plethora of interesting selector options.

PHP/MySQL

  • CodeIgniter 1.7.0Download | Site | Docs | Forums
    Easy, documented framework by the devs of ExpressionEngine.
  • pChart 1.2.7Download | Site | Docs
    PHP classes to render high-quality charts.
  • mySQLDumperDownload | Site
    Quality backup solution for large mySQL databases.
  • PHP Development GuidelinesSite
    Best practices for PHP development from the EE guys.
  • PHPMailer 2.3Download | Site | Tutorial
    Send email with attachments, HTML and embedded images.
  • TAR/GZIP/BZIP2/ZIP Archives 2.1Download | Site
    Builds and downloads zip+ files on the fly.
  • ROS PDF ClassDownload | Site
    Module-free creation of PDF documents from within PHP.

Flash Components

  • Open Source FLV PlayerDownload | Site | Docs
    "OS FLV" - Open source, embedable player for Flash video.
  • JW FLV Player 3.12€30 | Download | Site
    SWF file that displays FLV videos. Free for personal use.
  • SlideShowPro$29 | Site | Wiki
    Gallery and slideshow Flash component. 60 options.
  • MonoSlideShow$19.95 | Site | Manual
    Gallery and slideshow SWF file. 150 options.
  • XSPF Flash MP3 Music Player (Slim)Download | Site
    SWF file that plays mp3 songs and playlists.
  • Date Slider 1.1Download | Site
    SWF file that selects a date range.
  • amChartsFree/€85/€275 | Site
    Customizable Flash charts. Free version embeds link to vendor.
  • TWF Flash Uploader€15/€50 | Site
    Nice-looking, configurable, multi-file, Flash uploader.

Miscellaneous Tools

  • Standalone IE6Download | Site
    Download a standalone version of IE6 you can install in XP.
  • Allan Jardine's "Design" BookmarkletSite
    Four overlay tools: Grid, Ruler/Guides, Measurement, Crosshair.
  • XRAY BookmarkletSite
    Select any page element and display its style info.
  • SpriteNavi Menu Tool for FireworksSite
    Takes the work out of creating sprite-based horizontal menus.
  • Create Favicons in PhotoshopMac Plugin | Win Plugin
    Install this PS plugin to add ability to save in .ico format.
  • Javascript Email Enkoder (Spam protection)Site
    Protect email addresses by converting into encrypted JavaScript.

Grid Design

  • 960 Grid SystemDownload | Site
    CSS grid system based on 960px wide design in 2 col widths.
    12 column - 60px wide columns, 20px gutters.
    16 column - 40px wide columns, 10px gutters.
  • Blueprint CSS 0.8Download | Site
    Stylesheet set that combines some of the best thinking on css design. Grids, typography, reset included.
  • GridMaker2 for Photshop CS2+Download | Site
    Photoshop script that creates custom grids.
  • GridMaker2 (columns only)Download
    A modified version that only outputs columns.
  • Grid DesignerSite
    Online tool to design and preview a grid system. This one also includes side margins.
  • Grid CalculatorSite
    Online tool to design and preview a grid system.
  • Syncotype BookmarkletSite
    Overlays a customizable baseline grid on your web page.

Content Generators

  • Ajax Loading GraphicsSite
    Online tool to customize an animated loading graphic.
  • Loader GeneratorSite
    Another tool to customize one of 99 different loading graphics.
  • Stripe GeneratorSite
    Online tool to customize background stripe tiles.
    Also see Stripe Mania.
  • Background Maker (Tiled Backgrounds)Site
    Online tool to make pixel-by-pixel tiled backgrounds.
  • CornerShopSite
    Online tool to generate rounded corner graphics and code.
  • Dummy Text GeneratorSite
    Best tool for generating dummy content. Highly configurable.
  • LipsumSite | Copyable Text
    Generic lorem ipsum copy for roughing in content.
    Also see Lorem2.com and html-ipsum.com

Pixel Icons

Vector Icons

  • ClickBits$49 | Site
    792 arrows & web-related icons in OpenType font format.
  • InfoBits$29 | Site
    188 web-related icons & dingbats in OpenType font format.
  • 165 Vector Icons by GoSquaredSite | Preview
    Free, useful icons in SVG, JPG and Illustrator CS2 format.

Backgrounds & Styles

  • Illustrator - Basic Gradients by GoSquaredSite
    Free, Web2.0-style gradients in SVG or Illustrator CS2 format.
  • Illustrator - Web 2.0 Gradients by dezinerfolioSite
    130 Illustrator gradients. Matches PS gradients below.
  • Photoshop - Web 2.0 Gradients by dezinerfolioSite
    130 Photoshop gradients.
  • Photoshop - Web 2.0 Layer StylesSite
    131 Photoshop layer styles by deszinerfolio.com.
  • Photoshop - Web 2.0 Gradients by EuphorishSite
    70 Photoshop gradients.

Hosting

  • ServInt - My Current Host of Choice$49 | Site
    Well-regarded Virtual Private Server solution starting at $49. This site is hosted there. Better experience for me than MediaTemple. Cheaper than Mosso.
  • BlueHost - Decent low-cost host$6.95 | Site
    Hosting many sites here. Solid host for small to medium traffic. Great customer support and uptime. Unlimited domains.

Browser Compatibility

  • PNG Support in IEDownload | Site | Code
    Enable transparent PNG support in IE.
  • PNG Support in IE (CSS Only)Site | Code
    Enable transparent PNG support in IE6 using only CSS.
  • Whatever:hover in IEDownload | Site | Code
    Enables css :hover support in IE.
  • IE Browser Filtering/TargetingSite | Code
    Some hacks to target different browsers.
  • Misc Browser WorkaroundsCode
    Click the code link to see some collected browser workarounds.

Must-Know CSS Techniques

  • Sliding DoorsSite
    Not just for tabs, this technique is by far the most useful of all.
  • Taming ListsSite
    Transform the meager list into something useful.
  • CSS ResetSite
    Several variations exist here. Resetting all the styles to a baseline helps a lot in styling websites. Season to taste.
    Yahoo YUI Reset | Eric Meyer's Reset
  • Clearing Floats without Extra MarkupSite | Code
    Avoid adding extra markup to your documents using this method to clear floats.

General HTML Techniques

  • Resize a Popup to Fit an Image's SizeSite | Code
    Make a popup window resize perfectly to the image.

Typography

  • FontSquirrel - High Quality FREE FontsSite
    Free, hand-picked, licensed-for-commercial-use fonts.
  • Typical Cross-Browser Font CascadesSite | Sample
    Use these fonts lists when specifiying fonts in your css.
  • Alternative Font CascadesSample
    Interesting alternative cascades.
  • Default Mac FontsSite | Show
  • Default Windows FontsSite | Show

Firefox Extensions

  • Firebug 1.3Install | Site
    Edit, debug, and monitor CSS, HTML, and JavaScript live.
  • Web Developer's ToolbarInstall | Site
    Adds a menu and a toolbar with various developer tools.
  • View Formatted SourceInstall | Site
    Displays formatted source and CSS info for each element.
  • YSlowInstall | Site
    Analyzes pages and tells why they're slow. REQUIRES FIREBUG.
  • Dust-Me Selectors 2.11Install | Site
    Dust-Me Selectors finds unused CSS selectors in your site.
  • UrlParamsInstall | Site
    Displays the GET and POST parameters of a web page.
  • Link CheckerInstall | Site
    Checks all links on a webpage and reports broken ones.

Mac Software

  • MAMP 1.7.2Download | Site
    Installs a self-contained local hosting environment on your Mac. (M)ac, (A)pache, (M)ySQL, (P)HP.
  • VirtualHostX 1.1.1$9 | Download | Site | Tutorial
    Host multiple sites on your Mac. Useful with MAMP.
  • CSSEdit 2.6€29.95 | Download | Site
    The best CSS editor on the market. An absolute must-have.
  • TextMate 1.5.7€39 | Download | Site
    The best text editor ever.
  • Coda 1.6$99 | Download | Site
    Popular all-in-one web development application.

Services

  • DNSstuffSite
    Configure, monitor & fix problems with your domain & email.
  • Bulk Email with Campaign MonitorSite
    Campaign Monitor is an email newsletter sending service geared towards designers. $5 + 1¢ per address per mailing.
  • Domain Names by PickyDomains$50 | Site
    PickyDomains will help you come up with a good/available domain name for only $50.
  • Bust A Name Domain SearchSite
    Two-word combination searches and quick lookups.
  • NameBoy Domain SearchSite
    Good name suggestor tool.
  • Add This Social Bookmarking WidgetSite
    Widget helps visitors bookmark your page on social media sites.
  • ShareThis Social Bookmarking WidgetSite
    Another widget to help visitors bookmark your page on social media sites.
  • Web Development Project EstimatorSite
    Estimate the time and materials required for a proposed web project.
  • SSLmatic - Cheap SSL Certificates$19.99 | Site
    Discounted SSL certs from RapidSSL, GeoTrust and Verisign.

Cheat Sheets

Post by 넥스트리소프트 데꾸벅(techbug)
, |


Beautifully Documented Code를 보다가 일전에 Wiki 관련 Parser에 대해서 관심을 가지게 되었다.
그때는 Java로 된, 혹은 Server side 언어쪽만 찾아봤었는데 이렇게 자바스크립트로 된 파서를 찾아서 꿈쳐둔다.

웹페이지를 퍼블리싱할때 디자인적인 측면이 많이들 강조된다. 타이포나 문장에 대한 배치등 그리드에 대한것도 전적으로 디자이너의 몫으로 넘기기 쉽다. 그러나 사실 이러한 문서 작업은 디자이너들 보다는 퍼블리셔나 산출물작업의 양만으로 따진다면 서버 프로그래머들의 작업량이 더 많다.

사내프로젝트를 진행하다가 든 생각중 하나가 실제 개발자들이 개발에 대한 지식이나 업무에 대해서 공유할수 있는 사이트를 만들어 보고 싶었다. 이슈(Trac, Bugzilla) 소스의 공유(CVS,SVN), 혹은 설계문서나 산출물들을 한곳에서 문서로 관리할수 잇다면 얼마나 좋을까 생각한것이 Wiki였다.  
Wiki를 만든다는것은 엄청난 자원의 손실이며 사실 마음에 드는 Wiki또한 없었다.  

뭐 잡설은 집어치고,  이전 레이텍(Latex)이나 HanTex과 같이 화면상에 문서를 구성할수 있게 실시간으로 스크립트를 이용해서 만들어 준다면 얼마나 좋을까? 바로 Creole Parser가 이러한 것을 가능하게 해주었다.
 





'Scripter > JAVASCRIPT' 카테고리의 다른 글

offsetParent의 모든것!  (0) 2010.02.04
자바스크립트 delete 연산자에 대한 고찰  (8) 2009.11.18
자바스크립트 가이드  (0) 2008.12.03
JsonML 활용하기  (0) 2008.11.12
CSS & JAVASCRIPT 최적화 도구  (0) 2008.10.26
Post by 넥스트리소프트 데꾸벅(techbug)
, |
HTML이나 XHTML1.0에서 XForms namespace를 사용할수 있다. XHTML2.0은 아직은....

XForms Namespace:  XForms Namespace공식사이트
HTML(혹은 XHTML1.0)에서 XForms를 사용하려면 모든 XForms 엘리먼트들을 XForms 네임스페이스로 선언해야 한다. XHTML2.0에서는 이러한 네임스페이스없이도 사용될수 있다고 한다... (W3School)
아래는 XForms 네임스페이스의 사용예이다.

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms">
    <head>
        <xf:model>
            <xf:instance>
                <person>
                    <fname/>
                    <lname/>
                </person>
            </xf:instance>
            <xf:submission id="form1" method="get" action="techbug.php"/>
        </xf:model>
        </head>
   
    <body>
        <xf:input ref="fname">
        <xf:label>First Name</xf:label></xf:input><br />
        <xf:input ref="lname">
        <xf:label>Last Name</xf:label></xf:input><br /><br />
        <xf:submit submission="form1">
        <xf:label>Submit</xf:label></xf:submit>
    </body>
</html>
위 샘플에서는 xf: 를 XForms 네임스페이스 prefix로 사용하고 있다. 그러나 이러한 것은 사용자가 어떠한 걸로 정의하느냐에 따라 다르다. (sample.xhtml 파일로 저장하여 firefox plugin 설치후 확인한다. 단 확장자명은 반드시 .xhtml로 저장해야 한다.)

아래는 국내 모 X-Internet업체의 네임스페이스 사용예이다.
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/2002/01/xforms"
    xmlns:ev="http://www.w3.org/2001/xml-events">
 <xhtml:head>
  <xhtml:title>Untitle</xhtml:title>
  <model id="model1">
   <instance id="instance1">
    <root xmlns="">
     <example>Sample</example>
     <login>
      <userId/>
      <password/>
     </login>
    </root>
   </instance>
  </model>
 </xhtml:head>
 <xhtml:body>
  <input id="input1" ref="/root/login/userId" style="left:155px; top:70px; width:110px; height:20px; "/>
  <input id="input2" ref="/root/login/password" style="left:155px; top:95px; width:110px; height:20px; "/>
  <button id="button1" style="left:270px; top:70px; width:75px; height:45px; ">
   <caption>전송</caption>
  </button>
 </xhtml:body>
</xhtml:html>
위와 같이 처리하면 아래와 같은 화면이 출력된다.


translated by techbug




XForms 예제
아래 예제를 test.html 로 저장하여 각 브라우저에서 본 모양이다.
<xforms>
    <model>
        <instance>
            <person>
                <fname/>
                <lname/>
            </person>
        </instance>
        <submission id="form1" method="get" action="techbug.php"/>
    </model>
    <input ref="fname">
        <label>First Name</label>
    </input>
    <input ref="lname">
        <label>Last Name</label>
    </input>
    <submit submission="form1">
        <label>Submit</label>
    </submit>
</xforms>





위와 같이 XForms를 온라인으로 직접 실행해 보려면 "요기 "를 참조하기 바란다.


샘플파일 :


'Publisher > XForms' 카테고리의 다른 글

Chap02. XForms Model  (0) 2008.12.14
Chap01. XForms 소개  (0) 2008.12.13
Post by 넥스트리소프트 데꾸벅(techbug)
, |

Chap02. XForms Model

Publisher/XForms / 2008. 12. 14. 00:23

XForms Model은 form에서 수집된 데이타를 위한 템플릿을 정의한다.

XForms Framework
HTML Form의 목적은 데이타를 수집하는것이다. XForms도 마찬가지다.
XForms를 이용하며 두가지 다른 부분안에서 인풋데이타를 서술한다.
  • XForm Model (데이타와 로직)
  • XForm UI (데이타 입력 및 화면출력)

XForm Model은 어떠한 폼인지, 어떤 데이타를 포함하는지, 그래도 어떤 기능을 하는지를 정의한다.
XForm UI는 각 컨트롤 객체들이 화면에 출력되고 인풋 필드를 정의한다.


XForms Model
XForms model데이타를 설명하는데 사용되며, data model은 XML전문의 instance이며 <model>엘리먼트안에서 데이타 모델로 정의된다.

[예제]

<model>
    <instance>
        <person>
            <fname/>
            <lname/>
        </person>
    </instance>
    <submission id="form1" action="techbug.php" method="get"/>
</model>

위의 예제에서 보면 XForms는 <instance> 엘리먼트를 이용해서 수집된 데이타를 XML 템플릿으로 정의하며 <submission>엘리먼트를 통해서 데이타를 전송한다.
XForms model은 UI의 비주얼한 부분을 처리하지는 않는다.



XForms Namespace
위의 예제에서는 XForms 네임스페이스를 빼먹었는데 다음 포스트에서 소개한다.

<instance>엘리먼트
XForms model은 수집된 데이타를 정의하는데 <instance>엘리먼트를 사용한다.
위의 예제에서 data instance에서 수집된 데이타는 아래와 같이 값이 바뀌게 된다.
 

        <person>
            <fname></fname>
            <lname></lname>
        </person>

에서 데이타가 입력되면 아래와 같이 바뀐다.

        <person>
            <fname>John</fname>
            <lname>Smith</lname>
        </person>

<submission>엘리먼트 
데이타 전송시 사용되는 엘리먼트이며 어떻게 submit할건지를 결정하며 HTML의 <form>태그와 마찬가지로 id, action, method를 동일한 방식으로 표기한다.



XForms User Interface : controls
데이타의 표현과 입력을 위해 사용된다.  XForms의 UI 앨리먼트들을 XForms에서는 컨트롤(controls)라고 부른다.

 <input ref="fname"><label>First Name</label></input>
<input ref="lname"><label>Last Name</label></input>
<submit submission="form1"><label>Submit</label></submit>

 과 같이 표현하며 각각의  <input>엘리먼트와 <submi>엘리먼트표현된다. 일반 XHTML의 표기법과 약간 다르게 표현된다.


XForms는 하나의 컨테이너를 필요로 한다.
XForms는 단독으로 설계되지 않으며 XForms 문서로써도 기능을 하지 못한다.
Xforms는 또다른 XML문서안에서 실행되어야 하며 XHTML1.0에서 실행될수 있고 XHTML2.0에서도 동작될 예정이다. (데꾸벅 주 : 아직 2008.12월 현재 XHTML2.0 스펙은 W3C권고안에 없다.)

<xforms>
    <model>
        <instance>
            <person>
                <fname/>
                <lname/>
            </person>
        </instance>
        <submission id="form1" action="submit.asp" method="get"/>
    </model>
    <input ref="fname"><label>First Name</label></input>
    <input ref="lname"><label>Last Name</label></input>
    <submit submission="form1"><label>Submit</label></submit>
</xforms>

 과 같이 작성하면 다음 그림과 같이 표현된다.





XForms Processor
위의 예제에서 서브밋시 아래 XML형태로 서버로 전송하게 되며 혹은 텍스트로 전송하게 된다.

<person>
  <fname>Hege</fname>
  <lname>Refsnes</lname>
</person>

혹은 아래와 같이
fname=Hege;lname=Refsnes


translated by techbug

'Publisher > XForms' 카테고리의 다른 글

Chap03. XForms Namespace  (0) 2008.12.14
Chap01. XForms 소개  (0) 2008.12.13
Post by 넥스트리소프트 데꾸벅(techbug)
, |

Maximum URL length

GET방식의 길이제한에 대한 의견이 분분하다. FORM submission에 대한 데이타를 찾아 보다 유용한 정보가 있어 포스팅한다.

GET방식의 길이제한에 대해 서로 틀린 이유는  HTTP프로토콜의 역사(historical)에서 비롯된다.
기존 GET방식은 1024Character였던것들이 브라우저 업데이트및 HTTP 프로토콜의 업데이트에 의해 서로 틀려졌기 때문이다.
그러나 지금 현재 여타 다른 브라우저의 경우에는 GET방식의 URL 길이 제한이 없다. 그러나 IE의 경우에만 예외로 GET방식의 길이 제한이 있다.  그 이유는 MS에서 Internet Explorer의 주소창에 들어가 문자수가 정해져 있기 때문이다.

참조 : http://support.microsoft.com/default.aspx?scid=kb;EN-US;q208427

MS IE의 경우 maximum URL은 POST(주소줄에 표시되는 action URL)이든 GET이든 2,083 character를 가질수 있다. 만일 GET방식을 사용한다면 실제 action주소를 뺀 2,048 character만 적용된다. 그러나 POST방식을 경우 action주소를 제외한 name/value 쌍으로 이루어진 데이타는 길이나 용량제한이 없다.

RFC2616 (Hypertext Transfer Protocaol -- HTTP/1.1 표준스펙)에는 URL길이에 대해서 아무런 명세도 표기되어 있지 않다. 더이상 길이가지고 싸우지 않기를.. ㅡ.,ㅡ;

자세한 정보는 RFC616 의 섹션 3.2.1의 General Syntax를 참조하기 바란다.
ftp://ftp.isi.edu/in-notes/rfc2616.txt

적용브라우저 : IE7, 6, 5.5,  5.01, 4.01 sp2, 4.0 128bit edition 

 
HTML Forms에서 GET, POST method의 다른점도 한번 읽어보시길....


'Integrator > Windows' 카테고리의 다른 글

데꾸벅체 다운로드  (0) 2008.07.09
MS office2007 Excel 파일 각각 따로 열기  (8) 2008.06.27
윈도우 서비스 등록하기  (1) 2008.02.21
Post by 넥스트리소프트 데꾸벅(techbug)
, |

CSSHttpRequest

Scripter/AJAX / 2008. 11. 12. 15:11

XML과 XMLHttpRequest(XHR)의 시대는 물건너 갔는가?
JSON(JSONML)과 CSS만으로 통신을 하다 못해 이제는 CSSHttpRequest까지 나왔다.

CSS의 Hack을 이용한 것으로 cross-domain이 가능하다.
CSSHttpRequest(CHR)은 CSS 통신을 위한 크로스도메인 AJAX 메쏘드이다.

CSSHttpRequest.js
(function(){
    var chr = window.CSSHttpRequest = {};
   
    chr.ID = "__csshttprequest__";
    chr.DELAY = "50";
    chr.counter = 0;
    chr.requests = {};
    chr.timeout = null;
    chr.styleSheet = null;
    chr.styleElement = null;
   
   
    chr.get = function(url, callback) {
        var id = (++chr.counter);
        var s = chr.getStyleSheet();
        var item, index;
       
        // IE
        if(s.addImport) {
            index = s.addImport(url);
            item = s.imports(index);
        }
       
        // W3C
        else if(s.insertRule) {
            index = s.insertRule("@import url(" + url + ");", 0);
            item = s.cssRules[index];
        }
       
        chr.startPoll();
        return chr.requests[id] = {
            id: id,
            index: index,
            item: item,
            styleSheet: item.styleSheet || item,
            callback: callback
        };
    };
       
   
    chr.getStyleSheet = function() {
        if(chr.styleSheet)
            return chr.styleSheet;
       
        var s, e;
        if(document.createStyleSheet) {
            s = document.createStyleSheet();
            e = s.owningElement || s.ownerNode;
        } else {
            e = document.createElement("style");
            s = e.sheet;
        }
       
        e.setAttribute("type", "text/css");
        e.setAttribute("media", "print, csshttprequest");
        e.setAttribute("title", chr.ID);
        e.setAttribute("id", chr.ID);
       
        if(!e.parentNode)
            document.getElementsByTagName("head")[0].appendChild(e);
        if(!s)
            s = e.sheet;
       
        chr.styleSheet = s;
        chr.styleElement = e;
       
        return s;
    };
   
   
    chr.reset = function() {
        var s = chr.getStyleSheet();
        if(s.imports)
            while(s.imports.length)
                s.removeImport(0);
        else if(s.cssRules)
            while(s.cssRules.length)
                s.deleteRule(0);
        chr.requests = {};
    };
   
   
    chr.startPoll = function() {
        if(chr.timeout)
            return;
        chr.timeout = window.setTimeout(chr.poll, chr.DELAY);
    };
   
   
    chr.poll = function() {
        chr.timeout = null;
        var retry = false;
       
        for(var id in chr.requests) {
            var request = chr.requests[id];
            if(id != request.id)
                continue;
            var response = chr.parse(request.item.styleSheet || request.item);
            if(response === undefined)
                retry = true;
            else {
                delete chr.requests[id];
                request.callback(response, request);
            }
        }
       
        if(retry)
            chr.startPoll();
        else
            chr.reset();
    };
   
   
    chr.parse = function(s) {
        if(!s)
            return;
       
        var res = "";
        var d = decodeURIComponent;
       
        // IE
        if(s.imports && s.imports.length) {
            for(var i = 0; i < s.imports.length; i++) {
                var m = s.imports(i).href.match(/about\:chr\:(.+)/);
                if(m && m[1])
                    res += m[1];
            }
            return d(res);
        }
       
        // W3C
        else if(s.cssRules && s.cssRules.length) {           
            var rs = s.cssRules;
            for(var i = 0; i < rs.length; i++) {
                var r = rs[i];
                if(r.type != CSSRule.IMPORT_RULE)
                    continue;
                var m = r.cssText.match(/@import\s+url\("?about\:chr\:([^")]+)"?\)/);
                if(m && m[1])
                    res += m[1];
            }
            return d(res);
        }
    };
})();



XHR이 XML이나 JSON을 타겟으로 삼는다면 CHR은 CSS파일의 @import url()을 이용한다.
CSSJSON 이나 CSSML을 이용한것이 사실 XML/XSLT를 이용한것 보다 화면레더링하기는 사실 더 편하고 관리하기도 쉽다. CSS,JSON을 이용한다면 XML Node찾는것 보다 더 쉽지 않을까?


CHR을 이용하려면 AJAX Wrapper인 CSSHttpRequest.js 을 받아서 아래와 같이 입력한다.
    CSSHttpRequest.get(
        http://www.nb.io/hacks/csshttprequest/hello-world/helloworld.css,
        function(response) { alert(response); }
    );
보는바와 같이 css를 호출한다. 해당 css를 살펴보면
 @import url(about:chr:Hello%20World!);
와 같이 CSS의 about: 을 이용한다.

CHR은 XHR이나 JSONP와 같은 sampe-origin policy (같은 도메인에서 동작)과 다른 범주에 속한다. (흠..번역이..쩝..) JSONP와 같이 CHR도 GET Reqeust밖에 사용하지 못한다.


샘플 :


참조 사이트 :
http://nb.io/hacks/csshttprequest/



'Scripter > AJAX' 카테고리의 다른 글

Ajax Framework 분석  (0) 2009.05.04
HTTP Header에 대하여  (0) 2008.11.08
AJAX에서 즐겨찾기와 뒤로가기를 다루는 방법  (0) 2008.09.24
100라인 Ajax Wrapper  (0) 2008.04.19
어떤 AJAX Framework를 선택할 것인가.  (0) 2008.03.14
Post by 넥스트리소프트 데꾸벅(techbug)
, |