웹 페이지에 속해 있는 모든 <a> Tag 들의 "href" 의 경로를 원하는 텍스트만 변경하는 구문.
모바일 기기로 웹페이지 접근시 <a> Tag 경로를 변경해야 하거나 할때 사용.

* jQuery  파일이 인클루드 되어야 합니다.

* .replace() 는 일반 자바스크립트
     (페이지내 다른 스크립트로 인해 간혹 실행되지 않는 페이지 있음. )


                var android_url = "";

                $('a').each(function (index) {

                    android_url = $(this).attr("href");
                    android_url = android_url.replace("/mobile/","/mobile_a/");
                    $(this).attr("href", android_url);
                    //alert($(this).attr("href"));
                });


크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/04 18:56 2010/11/04 18:56
, , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5617


8,852미터의 에베레스트를 정복하기 위해서 꼭 필요한 것이 있다.
정상을 1,000미터 앞둔 이에게 가장 중요한 것은
고도가 아니라 태도라는 사실이다.
- 유니타스 브랜드

안 된다고 생각하는 부정적인 태도는 일을 ‘안 되게’ 만듭니다.
그래도 된다고 생각하는 태도가 ‘되게’ 만듭니다.
자신이 어떤 태도를 선택하느냐에 따라
성취할 수 있는 높이가 결정됩니다.
(유영만, ‘다르게 생각하면 답이 보인다’에서 인용)
태도는 마음에 색을 칠하는 붓이라 할 수 있습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/04 09:35 2010/11/04 09:35
, ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5616

노닥거릴 친구

마음을 열고
함께 노닥거려줄
진정한 친구를 만나야 한다.
어디서 만나야 하냐고?
자신이 진정 좋아하는 것을 찾아보자.
하고 싶은 일을 가르치거나, 하는 곳을 찾아서
사람들과 소통해 보자. 사람을 골라 만날 때 우선,
본인이 좋아하는 곳을 찾아나서는 방법이 좋다.
그곳에서 만난 사람과 소통하면서
관계망을 넓혀나가는 것이다.


- 최영선의《마돈나, 결혼을 인터뷰하다》중에서 -


* 역사와 민족을 논하는 친구도 필요합니다.
인생과 사랑을 이야기하는 친구도 있어야 합니다.
그러나 가장 편안한 친구는 함께 '노닥거릴' 친구입니다.
아무 말 하지 않아도, 눈빛만 봐도 통하는 친구.
어느 곳에서 만난 친구인지도 중요합니다.
좋은 곳에서 만나야 좋은 꿈을 나누며
더 멋있게 노닥거릴 수 있습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/04 09:34 2010/11/04 09:34
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5615

SQLite
(1)  데이터베이스의 정의
 : Android에서 데이터베이스로 접근하려면, SQLiteOpenHelper 클래스를 상속한 데이터베이스 헬퍼를 정의하고 이것을 이용한다.  이 헬퍼는 데이터베이스의 생성 및 업그레이드를 관리한다.
 SQLiteOpeHelper 클래스를 상혹한 클래느는 다음의 메소드를 오버라이드한다.
오버라이드하는 메소드 메소드의 호출
onCreate() 메소드
onUpgrade() 메소드
데이터베이스 생성 시 호출.
데이터베이스 업그레이드 시 호출.

(2) 데이터베이스 헬퍼 생성자

   SQLiteOpenHepler 클래스

SQLiteOpenHelper(Context context, String fileName, SQLiteDatabase.CursorFactory factory, int version)
기능 : SQLiteOpenHelper 클래스의 생성자
인수 : context     컨텍스트
           fileName 데이터베이스 파일명
          factory      팩토리
          version     버전
  데이터베이스 이름에는 저장할 곳의 파일명을 지정합니다.
  /data/data/패키지명/databases/데이터베이스 파일명 ( test.db) 에 저장됩니다.
  팩토리는 사용하지 않으면 null을 지정하고, 버전은 1을 지정.

(3) 데이터베이스의 생성 : onCreate() 메소드를 호출
   SQLiteOpenHelper 클래스

void onCreate(SQLiteDatabase db)
기능 : 데이터베이스 생성 시 호출
인수 : db 데이터베이스 객체
  onCreate() 메소드 내에서는 SQL명령으로 테이블을 생성하고 있습니다. test 라는 테이블명에서 id 와 info 라는 컬럼을 갖고 있는 테이블을 생성하는 SQL 명령은 아래와 같습니다. 컬럼의 형은 문자열이므로 컬럼명 뒤에 text라고 기술하고, id 는 다른 ID 와 중복되지 않는 기본키이므로 primary key 라고 추가합니다.
create table id not exists text(id text primary key, info text)                                                       

SQL명령을 실행하려면 SQLtestDatabase 클래스의 execSQL()을 사용합니다.
   SQLiteDatabase 클래스

void execSQL(String Sql)
기능 : SQL 명령의 실행
인수 : sql   SQL명령

(4) 데이터베이스의 업그레이드
  : 데이터베이스는 버전업 시 데이터베이스 구조를 변환하지 않으면 업그레이드가 안 되는 경우가 있습니다. 필요로 하는 버전에 이상이 있을 경우 이 onUpdate() 메소드가 불리므로, 이 메소드 내에서 구버전 번호와 신버전 번호의 정보로부터 데이터베이스 구조의 변환을 실행합니다.
  SQLiteOpenHelper 클래스

void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
기능 : 데이터베이스를 업그레이드한 때
인수 : db                 데이터베이스 객체
           oldVersion 구버전 번호
          newVersion 신버전 번호
  다음으로, SQL명령으로 테이블을 삭제한 후 onCreate() 메소드를 호출하여 테이블을 생성합니다. test 라는 이름의 테이블을 삭제할 SQL명령은 다음과 같습니다.
 drop    table   if    exists   test                                                                                                

(5) 데이터베이스 객체의 취득
  : 메인이 되는 SQLiteEx 클래스의 개체에서는 먼저 정의한 데이터베이스 헬퍼를 이용하는 SQLiteDatabase 형 데이터베이스객체를 구합니다. 프로그램 내에서는 이 객체를 사용해서 데이터베이스의 조작을 실행합니다. 데이터베이스 객체를 구하려면 DBHelper 객첼르 생성한 후 getWritableDatabase() 메소드를 호출합니다.
    SQLiteOpenHelper 클래스

SQLiteDatabase getWritableDatabase()
기능 : 데이터베이스 객체의 취득
인수 :데이터베이스 객체

(6) 데이터베이스의 쓰기
   : 데이터베이스의 쓰기를 실행하려면 Content Values 클래스로 갱신하는 레코드 정보를 작성합니다. Content Values 객체를 생성한 후 put() 메소드로 컬럼명과 값을 세트로 추가합니다.
   ContentValues 클래스

void put(String colName, String value)
기능 : 레코드 정보에 컬럼명과 값 추가
인수 : colName   컬럼명
           value         값
이 프로그램에서는 다음의 칼럼을 추가하고 있습니다.
컬러명   
    값                                                       
id
info
0
텍스트 박스의 문자열
데이터 객체의 update() 메소드에 이 레코드 정보를 건네주는 것에 의해서, id[0]을 갖는 레코드의 info가 텍스트 박스의 문자로 덧쓰게 됩니다.
   SQLiteDatabase 클래스

int update(String tableName, ContentValues values, String where, String[] whereArgs)
기능 : 테이블 레코드의 갱신
인수 : tableName   테이블명
           values           레코드 정보
          where           where 파라미터
          whereArgs  where 파라미터
반환값 : 갱신한 레코드 수
  반환값 레코드 수가 0이 될 때는 id[0] 이 존재하지 않는다고 간주하고, insert() 메소드로 테이블에 레코드를 삽입한다.
  SQLiteDatabase 클래스

long insert(String tableName, String nullColumnHack, ContentValues values)
기능 : 테이블의 레코드 추가
인수 : tableName   테이블명
           nullColumnHack   NULL값
          values           레코드 정보
반환값 : 레코드 ID

(7) 데이터베이스로부터 읽기
    : 데이터베이스로부터 읽기를 실행하려면 데이터베이스 객체의 query() 메소드를 사용합니다.
  SQLiteDatabase 클래스

Cursor query(String tableName, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
기능 : 데이터베이스로부터 읽기
인수 : tableName   테이블명
           columns        컬럼명의 배열
           selection       selection parameter
           selectArgs    selection parameter factor
           groupBy        groupBy parameter
           having           having parameter
           orderBy         orderBy parameter
           limit                limit parameter
반환값 : Cursor 객체
    selection, groupBy, having, orderBy, limit 파라미터는 SQLite의 query 명령 파라미터입니다. 이번에는 id가 0 인것만을 취득하고 싶기 때문에 selection 파라미터에 "id=0" 을 지정하고 있습니다.
  반환값은 Cursor 객체로 구해지는데, Cursor 객체는 내부적으로 다수의 레코드를 저장하고 있습니다.  getCount() 메소드로 레코드 수, getColumnCount() 메소드로 컬럼 수를 구할 수 있습니다.

  Cursor 클래스

int getCount()              
기능 : 레코드 수 구하기
반환값 : 레코드 수
Cursor 클래스

int getColumnCount()                  
기능 : 컬럼 수 구하기
반환값 :컬럼 수
    Cursor 객체는, 자장하는 레코드 안의 조작대상을 지시하는 정보(커서)를 갖습니다.
     커서에서 선두의 레코드를 지시하는 때에는 moveToFirst() 메소드를 부릅니다.
Cursor 클래스

boolean moveToFirst()                  
기능 : 커서에서 선두 레코드를 지시한다.
반환값 : 성공 또는 실패
 그리고 나서, getString() 메소드 등을 부르는 것으로 레코드 내의 컬럼이 지시하는 값을 수하는 것이 가능합니다.
Cursor 클래스

String getString(int colIdx)                     
기능 : String 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : String 형의 값

double getDouble(int colIdx)                 
기능 : double 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : double 형의 값

float getFloat(int colIdx)               
기능 : float 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : float 형의 값

int getInt(int colIdx)               
기능 : int 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : int 형의 값

long getLong(int colIdx)               
기능 : long 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : long 형의 값

short getShort(int colIdx)               
기능 : short 형 값 구하기
인수 : colIdx 컬럼의 위치
반환값 : short 형의 값

여기에서는 컬럼1(0부터 시작하므로 2열 째) 값을 String 형으로 얻고 있습니다.
마지막으로, Cursor 객체의 close() 메소드를 호출하여 Cursor 를 종료합니다.

------------- SQLiteEx.java ------------------------
package com.froglamb.sqliteex;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

public class SQLiteEx extends Activity implements View.OnClickListener{
   
    private final static String DB_NAME = "test.db"; // DB name
    private final static String DB_TABLE = "test";   // table name
    private final static int    DB_VERSION = 1;      // Version
   
    private EditText        editText;
    private Button            btnWrite;
    private Button            btnRead;
    private SQLiteDatabase     db;

    // 초기화
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
       
        // 레이아웃의 생성
        LinearLayout layout = new LinearLayout(this);
        layout.setBackgroundColor(Color.rgb(255, 255, 255));
        layout.setOrientation(LinearLayout.VERTICAL);
        setContentView(layout);
       
        // 텍스트 박스의 생성
        editText = new EditText(this);
        editText.setText("", EditText.BufferType.NORMAL);
        setLLParams(editText, 240, 50);
        layout.addView(editText);
       
        // 쓰기 버튼의 생성
        btnWrite = new Button(this);
        btnWrite.setText("쓰기");
        btnWrite.setOnClickListener(this);
        setLLParams(btnWrite);
        layout.addView(btnWrite);
       
        // 일기 버튼의 생성
        btnRead = new Button(this);
        btnRead.setText("읽 기");
        btnRead.setOnClickListener(this);
        setLLParams(btnRead);
        layout.addView(btnRead);
       
        // 데이터베이스 객체 구하기 (5)
        DBHelper dbHelper = new DBHelper(this);
        db = dbHelper.getWritableDatabase();
    }
   
    // 버튼 클릭 이벤트 처리
    public void onClick(View v){
        if ( v == btnWrite) {
            try {
                String str = editText.getText().toString();
                writeDB(str);
            } catch (Exception e) {
                showDialog(this, "Error", "Write Error");
            }
        } else if ( v == btnRead) {
            try {
                String str = readDB();
                editText.setText(str);
            } catch (Exception e) {
                showDialog(this, "Error", "Read Error");
            }
        }
    }

    // 데이터베이스의 쓰기 (6)
    private void writeDB(String str) throws Exception{
        ContentValues values = new ContentValues();
        values.put("id", "0");
        values.put("info", "info");
        int colNum = db.update(DB_TABLE, values, null, null);
        if( colNum == 0 ) db.insert(DB_TABLE, "", values);
    }
   
    private String readDB() throws Exception{
        Cursor c = db.query(DB_TABLE, new String[] {"id","info"}, "id='0'", null, null, null, null);
        if ( c.getCount() == 0 ) {
            throw new Exception();
        }
        c.moveToFirst();
        String str = c.getString(1);
        c.close();
        return str;
    }

   
    // 데이터베이스 헬퍼 정의 (1)
    private static class DBHelper extends SQLiteOpenHelper{
        // 데이터베이스 헬퍼 생성자 (2)
        public DBHelper(Context context){
            super(context, DB_NAME, null, DB_VERSION);
        }
       
        // 데이터베이스의 생성 (3)
        @Override
        public void onCreate(SQLiteDatabase db){
            db.execSQL(
                    "create table if not exists " +
                    DB_TABLE + " (id text primary key, info text)"
            );           
        }
       
        // 데이터베이스의 업그레이드 (4)
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
            db.execSQL(
                    "drop table if exists " + DB_NAME
            );
            onCreate(db);
        }
    }
   
   
    // 대화상자 표시
    private static void showDialog(final Activity activity, String title, String text){
        AlertDialog.Builder ad = new AlertDialog.Builder(activity);
        ad.setTitle(title);
        ad.setMessage(text);
        ad.setPositiveButton("OK", new  DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int whichButton){
                activity.setResult(Activity.RESULT_OK);
            }
        });
        ad.create();
        ad.show();
    }
   
    // 리니어 레이아웃의 파라미터 지정
    private static void setLLParams(View view){
        view.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    }
   
    // 리니어 레이아웃의 파라미터 지정
    private static void setLLParams(View view, int w, int h){
        view.setLayoutParams(new LinearLayout.LayoutParams(w, h));
    }
   
   
}









크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/03 18:00 2010/11/03 18:00
, , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5614


절대 다가오는 위험으로부터 등을 돌리고 달아나려 해서는 안 된다.
그러면 위험은 배로 늘어난다.
그러나 당황하지 않고 즉시 정면 돌파 한다면 위험은 절반으로 줄어든다.
절대 어떤 것으로부터도 달아나지 마라. 절대로!
- 윈스턴 처칠

당장의 두려움, 당장의 귀찮음을 피하기 위해
현실을 직시하지 않고 회피하거나 뒤로 미루게 되면,
오히려 문제는 더 커지고, 손쓸 수 있는 방법도 점점 더 줄어들게 됩니다.
위험에 떳떳하게 맞서는 용기를 가진 사람에게 하늘은 길을 열어줍니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/03 08:36 2010/11/03 08:36
, ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5613

그때는 몰랐다

그때는 몰랐다.
길을 걷는다는 것과
길을 낸다는 것이 얼마나 다른 일인가를.
사람들은 간혹 내게 묻는다. 이런 아름다운 곳에
사니까 정말 행복하겠다고. 정말 보람있겠다고.
얼마나 좋으냐고. 근심걱정이 없겠다고.
얼추 맞는 말이다. 행복하고, 보람있다.
하지만 '세상에서 가장 평화롭고 행복한' 길을 내면서도,
나는 종종 외로워하고, 때로 분노하고, 절망한다.
사랑에 대한 갈증으로 고통스러워한다.


- 서명숙의《꼬닥꼬닥 걸어가는 이 길처럼》중에서 -


* 결코 남의 이야기 같지가 않아
저도 코끝이 시큰해집니다. 오로지 꿈 하나로
'제주올레' 길을 처음으로 낸 사람의 보람과 행복,
그러나 그에 못지 않은 고독과 고통을 누가 죄다 알겠습니까?
아침편지를 쓰고 옹달샘을 꿈꾸면서도 그때는 잘 몰랐습니다.
꿈을 꾼다는 것과 꿈을 이룬다는 것이 얼마나 다른 일인가를.
보람과 행복도 크지만 외로움과 고통도 크다는 것을.   
함께 가는 동반자의 힘이 얼마나 크고
감사한 일인지를...
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/03 08:35 2010/11/03 08:35
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5612

자바스크립트는 현재 점점 빨라지고 있고 또한 강력해지고 있다. 특히 각종 모바일 디바이스가 보급되면서 모바일 웹에 대한 관심이 커졌고, 이에 따라 자바스크립트 엔진의 성능 역시 발전하고 있다. 팜프리는 이미 모든 애플리케이션을 자바스크립트를 사용해 만들 수 있도록 했고, 아이폰 및 안드로이드에서도 여러 가지 프레임워크를 통해 네이티브 애플리케이션과 같은 UI 및 성능을 보이는 웹 애플리케이션 개발이 가능해졌다. 하지만 이는 모드 클라이언트 사이트에서의 자바스크립트, 쉽게 얘기해서 브라우저에서 동작하는 자바 스크립트를 말한다.

jQuery.js 등의 스크립트 라이브러리를 요즘 많이 사용하고 있는데, node.js 는 서버사이드에서 강력한 성능을 발휘할 수 있는 서버사이드 자바스크립트 라이브러리라고 할 수 있다. 우리는 node.js 를 통해서 자바스크립트의 미래를 짐작해 볼수 있을 것이다.

기존에는 서버사이드에서 스크립트를 돌려서 모든 연산을 수행하고 그 결과값으로 HTML을 만들어서 클라이언트에게 전송했다. 클라이언트는 HTML을 랜더링해서 사용자에게 보여주는 역활을 했고,  자바스크립트는 클라이언트측에서  자잘한 UI기능을 수행하며 감초역활을 했는데, 현재는 서버와 클라이언트의 역활이 상당히 많이 달라졌다.

과거 서버에서의 역활들이 클라이언트로 만히 이동을했다. jQuery등을 사용해서 UI플로우 및 여러 인터렉션과 각종 로직의 상당 부분을 클라이언트 사이드에서 처리한다. 그리고, 요즘 흔히 오픈API라고 불리는 API를 제공하여 서버의 데이터에 대한 접관과 처리를 클라이언트가 제오할수 있도록 했다.

node.js는 구글이 개발해서 현재 크롬 브라우저에 탑재되어 있는 자바스크립트 엔진인 V8을 기반으로 만들어진 서버사이트 스크립트 이다. 오히려 V8의 기능을 자바스크립트를 통해 사용 할수 있도록 만들어진 wrapper라고 말하는 것이 더 정확한 표현일 것이다.
node.js 는 V8이 내부적으로 특정 기능을 수행하는 과정에서 유저가 등록한 callback function 을 호출해 주도록 한다.

창시자 Ryan Dahl이 발표한 design goal을 정리하면,
- Function은 직접 I/O에 연결되지 않는다.
- 저수준(low-level)을 지향하며, 스트리밍으로 모든 것을 처리하되, 데이터 버퍼일을 강제하지 않는다.
- TCP, DNS, HTTP 등의 중요한 프로토콜에 대해 빌트인 된 형대로 지원된다.
- 다양한 HTTP 기능들을 지원한다.
- 클라이언트 사이트 자바스크립트 프로그래밍과 비슷하며, 동시에 과거의 유닉스 시스템 프로그래밍과도 친숙하다.
 
*  프레젠테이션 : http://www.scribd.com/doc/23801896/Node-js-JSConf-2009

사용자 삽입 이미지사용자 삽입 이미지

Home : http://www.nodejs.org/
API : http://www.nodejs.org/api.html




크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/02 22:32 2010/11/02 22:32
, , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5611

[HTML] <canvas> tag

HTML 5 <canvas> Tag


Example

How to display a red square, with the canvas element:

<canvas id="myCanvas"></canvas>

<script type="text/javascript">

var canvas=document.getElementById('myCanvas');
var ctx=canvas.getContext('2d');
ctx.fillStyle='#FF0000';
ctx.fillRect(0,0,80,100);

</script>

Try it yourself »

Definition and Usage

The <canvas> tag is used to display graphics.

The <canvas> tag is only a container for graphics, you must use a script to actually paint graphics.


Differences Between HTML 4.01 and HTML 5

The <canvas> tag is new in HTML 5.


Tips and Notes

Tip: You can write text between the start and end tags, to show older browser that they do not support this tag.

Note: Some browsers already support the <canvas> tag, like Firefox, Chrome, and Opera.


Attributes

New : New in HTML 5.

Attribute Value Description
heightNew pixels Sets the height of the canvas
widthNew pixels Sets the width of the canvas

Standard Attributes

The <canvas> tag also supports the Standard Attributes in HTML 5.


Event Attributes

The <canvas> tag also supports the Event Attributes in HTML 5.

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/02 21:58 2010/11/02 21:58
,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5610

SOA 시대와 웹 프로그래밍 모델

SOA 시대와 웹 프로그래밍 모델
유비쿼터스 컴퓨팅이나 SOA 같은 개념을 현실과 그대로 비교해 보면 거창하게 느껴지기도 하고, 이론적이라고 치부할 수도 있다.
하지만 누군가 상상하고 그린 모습이 미래를 만드는 후보가 되고 끈길지고 열정적인 사람이 매달린 꿈은 곧 현실이 된다.

WOA = REST?
WOA가 곧 REST(Representational State Transfer)는 아니지만, 둘은 구분하기 어려울 정도로 꽤나 닮아 있다. 다음은 위키피디아에서 찾은 WOA 정의다.
Web Oriented Architecture(WOA) is a style of software architecture that extends service-oriented architecture(SOA) to web based applications, and is sometimes considered to be a light-weight wersion of SOA. WOA is also aimed at maximizing the browser and server interactions by use of technologies such as REST and POX(Plain Old XML).
REST는 WOA 를 위해 쓰이는 기술중의 하나일 뿐임을 알 수 있다.

SOFEA(Service-Oriented Front-End Architecture)
SOFEA가 기준으로 삼는 5가지 원칙은 아래와 같다.
1. 표현 층에서 서로 직교하는 세 가지 다른 처리인 애플리케이션 내려받기와 표현흐름, 데이터 교환은 서로 구분해야 한다.
2. 클라이언트 유형을 고려해 내려 받는 방법을 다양하게 해야 한다.
3. 표현 흐름은 서버 개입 없이 클라리언트가 처리한다. 대부분의 웹 프레임워크가 사용하는 프론트 컨트롤러 패턴은 바람직 하지 않다.
4. 표현 층도 반드시 복잡한 데이터 구조와 타입, 데이터 제약을 지원해야 한다. 이상적인 모습은 클라이언트/서버 모델이 아니라  P2P모델을 통한 자연스런 이벤트 통지다.
5. MVC는 표현 층 개발에는 좋은 패턴이지만 프론트 컨트롤러를 사용하는 MVC 구현은 잘못된 방식이다. MVC 컨트롤러는 표현흐름과 데이터교환을 주도하는 핵심 구성요소로 클라이언트 상태 변화를 관장한다.

아래의 그림 1, 이는 전통적인 MVC 와 SOFEA가 제시한 MVC 차이를 잘 표현하는 그림이 다.
1. 전통적인 MVC 모델
Figure 1. Classic MVC
2. 웹 2.0의 새로운 아키텍처
Figure 2. Modern Web 2.0 architecture

현재의 문제점은 지금까지의 작업에 묻혀서 생각의 전환이 쉽지않는다는 것과 좀더 나은 프로그램을 하려는 마음이 생기지 않는데에 있다. 작업일정에 쫓기다 보면 계속 동일한 방법만 반복되는게 현실이니까.
방법론이나 프로세스를 꾸준히 발전시켜서 적용하는건 일단은 리더의 문제라고 담아 짊어지려 한다.

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/02 21:30 2010/11/02 21:30
, , , , ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5609

가난뱅이의 역습 - 무일푼 하류인생의 통쾌한 반란!
 
사용자 삽입 이미지
: 한국의 88만원세대, 일본의 버블세대, 유럽의 천유로세대 등 양극화사회에서 점점 가난으로 내몰리는 젊은이들의 생존전략을 유머러스하게 담은 책. 공짜로 살아가는 생활 기술과 가난뱅이의 등골을 빼먹는 사회에 대항하는 반란의 노하우를 유머로 승화시켜 전달하고 있다. 자본주의와 신자유주의에 대항하는 일환으로 재활용가게를 운영하고 있는 저자만의 유쾌하고 기발한 방식으로 양극화가 심화되는 사회에 대소동을 일으켜 가난뱅이들이 창궐하는 세상을 바꾸자고 이야기한다.
싼 집을 얻기 위해 노숙을 하고, 밥값을 아끼기 위해 걸식을 하며, 맥도날드 햄버거 하나로 세끼를 때우기도 하고 때로는 먹튀(먹고 튀는)작전까지 행할 수 밖에 없는 이 시대의 모습을 재미있는 일러스트와 함께 날카롭게 꼬집으며 희화화하였다. 또한 사회의 약자로 착취당하며 살고 있는 가난한 젊은세대가 주체가 되어 지역에서 연대하며 살아가기, 재활용 혁명 등 새로운 공동체를 만드는 실천적인 방법 또한 제시하고 있다.







행복은 혼자 오지 않는다 - 웃기는 의사 히르슈하우젠의 도파민처럼 짜릿한 행복 처방전
 
사용자 삽입 이미지
: 독일의 의사이자 코미디언인 에카르트 폰 히르슈하우젠이 쓴, 행복에 대한 상식을 깨는 책. 의술 없이도 사람들을 건강하게 만들 줄 아는 저자는 유쾌하고 에너지 넘치게 살아가는 법을 차근차근 일러준다. 행복을 좇는 것이 아니라 행복이 스스로 찾아오게끔 하라고 조언하며, 행복을 ‘공동의 행복’, ‘우연의 행복’, ‘순간의 행복’, ‘자기극복의 행복’, ‘충만한 행복’으로 분류해 우리가 스스로 행복해질 수 있는 다양하고 기발한 방법에 대해 말한다.
과연 우리를 진짜로 행복하게 만드는 것은 무엇일까? 이 책은 이 물음에 대한 답을 심리학과 신경생물학적 연구 결과를 기반으로, 의사로서의 지식과 경험을 들어 재밌고 설득력 있게 제시한다. 행복을 갈구하는 우리의 태도를 조급해하지 않고 편안한 마음을 가질 수 있도록 변모시키며, 일상생활과 밀접한 주제들을 유머가 섞인 이야기로 만들어 고유의 행복론을 전한다. 특유의 재치 있는 문체, 행복한 색감의 일러스트와 유머러스한 사진이 재미를 더한다.








생각 버리기 연습
사용자 삽입 이미지
 : 일본 열도를 뒤흔든 생각 버리기 연습법을 담은 책. 어떻게 해야 복잡하고 쓸데없는 생각을 버릴 수 있을까? 저자는 우선 우리를 괴롭히는 잡다한 생각의 정체를 바로 알아야 한다고 이야기한다. 잡다한 생각의 근본 원인을 파악했다면, 그 다음은 우리의 일상생활에서 어떻게 적용할지에 대해 알아야 할 것이다. 저자는 이 과정을 말하기, 듣기, 보기 같은 8가지 영역으로 나누고, 우리의 일상생활에서 바로 실천할 수 있는 방법을 제시한다.
예를 들어 ‘말하기’ 영역에서는 자신의 감정을 ‘응시’하는 법에 대해 이야기한다. 만약 분노 에너지가 들끓어 화가 난다고 생각되면, 이 감정을 따옴표로 묶어버린다. 즉 ‘화가 난다’가 아니라 ‘나는 화가 난다고 생각한다’라고 감정을 객관적으로 바라보는 법을 익히는 것이다. 이렇게 일상에서 바로 실천할 수 있는 방법을 몸에 익히면, 우리를 괴롭히는 복잡하고 쓸데없는 생각으로부터 자유로워지게 될 것이다.

 






글로벌 소프트웨어를 꿈꾸다
사용자 삽입 이미지
 : 성공하는 소프트웨어 회사에서 일하고 싶다
국내 소프트웨어 업계는 눈부신 발전을 해 왔다. 특히 기술과 기법에서는 세계 수준에 뒤떨어지지 않는다고 해도 과언이 아니다. 어느 정도 성공도 이뤘다. 그런데 왜 인도나 이스라엘처럼 세계적으로 성공한 글로벌 소프트웨어 회사는 나오지 않을까? 그 이면에 문화적인 요소가 있다. 세계 수준에 근접한 기술과 기법은 그에 걸맞는 균형 잡힌 사고와 문화 수준이 어우러질 때 극대화될 수 있다. 이것은 의식적으로 노력한다고 해서 쉽게 바꿀 수 있는 것이 아니다. 사고와 문화 수준은 회사 구성원 모두에게 내재된 것이며 무의식적인 행동으로 드러나기 때문이다. 무의식적인 행동으로 드러나는 것을 바꾸는 것은 어렵다. 개발 과정에서 항상 문서를 작성하고, 어떤 환경에서도 동료검토하는 것을 당연시 여기는 것은 내재화된 문화에서만 가능하다. 그리고 이런 내재화된 문화는 소프트웨어의 본질에 대한 확고한 신념을 갖고 있을 때 형성될 수 있다. 이런저런 핑계로 하지 않는다면 그것은 표면적인 지식에 불과하다. 문화로 내재화된 것이 아니다. 소크라테스, 데카르트와 같은 선각자들이 가르치려고 했던 것은 본질에 대한 심오한 통찰력이었다. 이 책은 소프트웨어의 문화, 본질, 그리고 통찰력에 관한 책이다.





크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2010/11/02 19:44 2010/11/02 19:44
, , , , , ,
Response
No Trackback , 4 Comments
RSS :
http://tcbs17.cafe24.com/tc/rss/response/5608

« Previous : 1 : ... 82 : 83 : 84 : 85 : 86 : 87 : 88 : 89 : 90 : ... 639 : Next »

블로그 이미지

- 홍반장

Archives

Recent Comments

  1. 1 pHqghUme 01/05
  2. 1 pHqghUme 01/05
  3. 1 pHqghUme 01/05
  4. 1 pHqghUme 01/05
  5. 1 pHqghUme 01/05

Calendar

«   2025/01   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Statistics Graph

Site Stats

Total hits:
256820
Today:
64
Yesterday:
190