레이블이 시스템인 게시물을 표시합니다. 모든 게시물 표시
레이블이 시스템인 게시물을 표시합니다. 모든 게시물 표시

2009년 10월 22일 목요일

fckeditor와 equation의 플러그인설치에 대해

꽤 괸찮은 웹에디터중 하나가 fckeditor이다 그중에 fckeditor2.6.4.1과

웹에서 수식 편집기로 꽤 괸찮은 것으로 CodeCogs Equation 이 있다.

이둘을 함치고 나면 정말 꽤 괜찮은 수식가능 웹에디터가 탄생한다.

 

참고로 이 글을 그것을 위해 필요한 내용을 정리한것이다.

이글을 쓰는 나는 영어를 못한다. 그래서 영어로 그들과 대화하여 한글화에 도움을 준다든가 설명서를 작성에 도움을 주지는 못하지만 그래도 그럭저럭 영어를 몰라도 대충 글을 요지를 보구 이해를 하는 편이라 영어로 된 설명서를 번역보다는 내가 아는 방법으로 설명하겠당. 자세한 사항은 모두 해당 사이트에 가서 영어로 된것을 구글의 해석기를 돌리면 그래도 꽤 괞찮은 설명서가 될것이다.

그리고 마지막으로 아마도 지금 제가 글을쓰는 것중에서 버전에 따라 라이센스를 바꾸어 버린것이 있다는 사실이다. 웹에디터의 경우는 ckeditor라는 이름으로 바꾸면서 일부 바뀌고 웹수식편집기의 경우 아예 이후 버전은 다운받을 수도 없는거 같다. 혹시 다운받아지거나 라이센스에 대해 정확한 해석이 가능하고 그것을 누구나 이용가능하다는 정확한 판단이 서면 업그레이드한 것을 작성하겠지만 그렇지 않다면 나는 지금 알고 이번전들에서 멈출것이다.

 

먼저 각기 웹에디터와 웹수식 편집기는 앞에서 링크된 주소에 가서 다운받으시기를 바랍니다.

만일 다운받기 힘들다면 이미 적용된 버전을 다운받을 수 있다

여기서 fckeditor_2.6.4.1.tar.gz 이것은 이미 적용된것이다. 따라서 그냥 설치하면 된다.
따로 수정할 것은 추후 나오는 파일관리부분을 수정해주어야한다. 그것은 당신의 서버에 영향을 주거나 전체적인 게시판이나 기타 프로그램과 관련된것이기 때문에 내용을 잘보고 수정하기 바란다. 아래에는 만일 이곳에서 제공하는 것이 의심스럽거나 뭔가 직접해보고 싶은 분을 위해 설명을 첨부해본다.

 

다운 받고 설치하고 기타 등등은 다 해당 파일설명서를 참조해서 하기 바란다.

그럼 이제 둘을 함치는 것만을 설명한다.

1. 웹에디터의 플러그인 형식으로 웹수식편집기가 들어가야한다.

그러기 위해서는 파일이 일부 추가 되거나 수정되어야하다.

먼저 플러그인에 다운 받은 웹수식편집기의 앞축을 푼다. 장소는 아래이다.

fckeditor/editor/plugins

그곳에 예를 equation이란 디렉토리를 만들고 풀었다고 가정한다.

 

그럼 해당 디렉토리에 들어가서 다른 부분은 손을 댈것이 없을거 같구.

fckplugin.js파일을 만들어서 넎어주면 된다.

들어갈 내용은

#######################################################

FCKCommands.RegisterCommand( 'equation' , new FCKDialogCommand( 'equation' , '수식편집기' ,FCKPlugins.Items['equation'].Path +'editor.php' , 640, 460 ) ) ;

// Create the "Find" toolbar button.
var equationItem = new FCKToolbarButton( 'equation', '수식편집기' ) ;
equationItem.IconPath = FCKPlugins.Items['equation'].Path + 'images/equation.gif' ;

FCKToolbarItems.RegisterItem( 'equation', equationItem ) ; // 'My_Find' is the name used in the Toolbar config.

var FCKEquation = new Object() ;
var dialog=null;
var EQUATION_ENGINE='http://codecogs.izyba.com';
var EQUATION_ENGINE_NOW='';//'/cgi-bin/mimetex.cgi';//자체 생성기 변환기가 있으면 적어주기 바람.


FCKEquation.Add = function( text )
{
    var oEQ = FCK.InsertElement( 'IMG' ) ;
    this.SetupEquation( oEQ, text ) ;
}

FCKEquation.SetupEquation = function( img, text )
{
    var parts = text.match( /\\f([\[\$])(.*?)\\f[\]\$]/ );
    if(EQUATION_ENGINE_NOW)
        img.src = EQUATION_ENGINE_NOW+'?'+escape(parts[2]) ;
    else
        img.src = EQUATION_ENGINE+'/gif.latex?'+escape(parts[2]) ;
    img.title='Equation';
    //img._fckequation = escape(text);
    img.alt = text ;
    dialog.Cancel();
    //FCKTools.Cancel();
}

FCK.RegisterDoubleClickHandler(function (element) {
    if (element.title == 'Equation'){
        FCKDialog.OpenDialog('equation', '수식편집기', FCKPlugins.Items['equation'].Path +'editor.php' , 640, 460 );   
    }
}, 'IMG');

######################################################

이거이다.

 

여기서 주의 깊게 볼것이
var EQUATION_ENGINE='http://codecogs.izyba.com';
var EQUATION_ENGINE_NOW='';//'/cgi-bin/mimetex.cgi';//자체 생성기 변환기가 있으면 적어주기 바람.
이것인데 위에 있는것은 원소스의 변환기이고 아래 것은 혹시 여러분이 LaTeX의 변환기를 가지고 있다면 넣어주면 되겠다. 나머지는 원안대로 그대로 가세요.

 

2. 다음은 이 플러그인이 정상적으로 동작하도록 웹수식편집기도  약간 손을 봐야한다.

 

그것은 equation/js/eq_fck.js

이것의 일부가 플러그인 형식과 약간 동떨어져 있어서 수정한다.

#######################################################

try{
    var dialog = window.parent ;
    var oEditor = dialog.InnerDialogLoaded() ;
}catch(e){
    var oEditor = window.opener;
}
var FCKEquation=null;
var eSelected=null;
var EQUATION_ENGINE_NOW='';
// Loads the equations from the fckeditor, or create a default equations for an example
function LoadSelected()
{
  // Look for fckeditor
    if(oEditor && typeof(oEditor.FCKEquation)!='undefined')
    {
    FCKEquation = oEditor.FCKEquation;
        oEditor.dialog = dialog;
        EQUATION_ENGINE_NOW = oEditor.EQUATION_ENGINE_NOW;
        if(FCKEquation)
            eSelected = oEditor.FCKSelection.GetSelectedElement();
   
        if ( eSelected && eSelected.tagName == 'IMG' && eSelected.title =='Equation' )    {
            var comm = eSelected.alt;//unescape( eSelected._fckequation );
            var parts = comm.match( /\\f([\[\$])(.*?)\\f[\]\$]/ );

            document.getElementById('latex_formula').value = parts[2];
            try{
                if(parts[1]=='[')
                    document.getElementById('eqstyle2').checked=true;
                else
                    document.getElementById('eqstyle1').checked=true;   
            }catch(e){}
            changed = true;
            renderEqn(null);   
        }
        else    {
            // Put any default equations in the line below...
            document.getElementById('latex_formula').value = '';
            eSelected == null ;
        }   
    }
}

#######################################################

내용을 보면 대략 짐작이 가겠지만 창을 띄우는 방식이 약간 다름으로 거기에 맞추어 주도록 바꾼것이다. 지금 색칠 된 부분이 내가 바꾼것이다.
이렇게 바꾸는 이유는 두가지이다. 첫번째는 수정된 것이 바로 웹에디터에 붙도록 해주는 것이 하나고. 두번째는 웹에디터에서 두번 크릭시 바로 수식편집기로 연결해서 열리도록 하는것이 그것이다.

 

다음은 equation/js/editor.js

#######################################################

var changed=false;
var orgtxt='';
var EQUATION_ENGINE='http://codecogs.izyba.com';

// Clears the main editor window
function cleartext() {
 var id=document.getElementById('latex_formula'); id.value = ""; id.focus();
 changed=false;
 document.getElementById('copybutton').className='greybutton';
 document.getElementById('renderbutton').className='greybutton';
 document.getElementById('clipboardbutton').className='greybutton'; }

function textchanged() {
    var txt=getEquationStr();
    if(txt!=orgtxt)
    {
        orgtxt=txt;
      document.getElementById('copybutton').className='lightbluebutton';
      document.getElementById('clipboardbutton').className='lightbluebutton';
      document.getElementById('renderbutton').className='bluebutton';
      changed=true;
    }
}

function formatchanged()
{
    var action=false;
    var format=document.getElementById('format');
    if(format) { var type=format.value;
        switch(type) {
            case 'gif' : action=false; break;
            case 'png' : action=false; break;
            case 'pdf' : action=true; break;
            case 'swf' : action=true; break;
        }
    }
    document.getElementById('dpi').disabled=action;
    document.getElementById('dpi').readonly=action;
    changed=true;
    renderEqn();
}

// Tries to inserts text at the cursor position of text area
//  wind = document                <- when inserting text into the current equation editor box 
//  wind = window.opener.document  <- when inserting text into a parent window box
function addText(wind, textbox, txt)
{
    myField = wind.getElementById(textbox);
  // IE
  if (wind.selection) {
    myField.focus();
    sel = wind.selection.createRange();
    sel.text = txt;
  }
  // MOZILLA
  else
  {
        var scrolly=myField.scrollTop;
      if (myField.selectionStart || myField.selectionStart == '0')
    {
      var startPos = myField.selectionStart;
      var endPos = myField.selectionEnd;
            var cursorPos = startPos + txt.length;
      myField.value = myField.value.substring(0, startPos) + txt
                    + myField.value.substring(endPos, myField.value.length);
            pos = txt.length + endPos - startPos;

            myField.selectionStart = cursorPos;
            myField.selectionEnd = cursorPos;
   
            myField.focus();
            myField.setSelectionRange(startPos + pos,startPos + pos);   
    }
    else myField.value += txt;
           
      myField.scrollTop=scrolly;
  }
}

function insertText( txt, pos, inspos )
{
    var insert_pos=(inspos==null)?pos:inspos;
    textchanged()
   
    // pos = optional parameter defining where in inserted text to put the caret
    // if undefined put at end of inserted text
    // if pos=1000 then using style options and move to just before final }
    // startPos = final position of caret in complete text
    if (pos==1000) {pos=txt.length-1};
    if (pos==undefined) { txt+=' '; pos=txt.length;}; // always insert a space after
   
    // my textarea is called latex_formula
    myField = document.getElementById('latex_formula');
    if (document.selection) {
        // IE
        myField.focus();
        var sel = document.selection.createRange();
        // find current caret position
        var i = myField.value.length+1;
        theCaret = sel.duplicate();
        while (theCaret.parentElement()==myField
        && theCaret.move("character",1)==1) --i;
   
        // take account of line feeds
        var startPos = i - myField.value.split('\n').length + 1 ;
   
        if ((txt.substring(1,5) == "left" || txt.substring(insert_pos-1,insert_pos)=='{') && sel.text.length)    {
            // allow highlighted text to be bracketed
            if(txt.substring(1,5) == "left") ins_point=7;
            else ins_point=insert_pos;
               
            if(inspos==null) pos = txt.length + sel.text.length + 1;
            else if(inspos<pos) pos+=sel.text.length;
           
            sel.text = txt.substring(0,ins_point) + sel.text + txt.substr(ins_point);        
        } else { sel.text = txt; }
        // put caret in correct position to start editing
        var range = myField.createTextRange();
        range.collapse(true);
        range.moveEnd('character', startPos + pos);
        range.moveStart('character', startPos + pos);
        range.select();
    }
    else
    {
        // MOZILLA
        if (myField.selectionStart || myField.selectionStart == '0')    {
            var startPos = myField.selectionStart;
            var endPos = myField.selectionEnd;
            var cursorPos = startPos + txt.length;
            if ((txt.substring(1,5) == "left" || txt.substr(insert_pos-1,1)=='{') && endPos > startPos)    {
                // allow highlighted text to be bracketed
               
                if(txt.substring(1,5) == "left") ins_point=7;
                else ins_point=insert_pos;
               
                if(inspos==null) pos = txt.length + endPos - startPos + 1;
                else if(inspos<pos) pos+=endPos - startPos;
               
                txt = txt.substring(0,ins_point) + myField.value.substring(startPos, endPos) + txt.substr(ins_point);           
            }
            myField.value = myField.value.substring(0, startPos) + txt + myField.value.substring(endPos, myField.value.length);
       
            myField.selectionStart = cursorPos;
            myField.selectionEnd = cursorPos;
                   
            // put caret in correct position to start editing
            myField.focus();
            myField.setSelectionRange(startPos + pos,startPos + pos);   
        }
        else myField.value += txt;
    }
    myField.focus();
}

/* ----------- Handle rendering example equation --------------------------- */

// Returns the complete string that describes this particular equation with font sizes etc.
function getEquationStr()
{
    var val=document.getElementById('latex_formula').value;   
    val=val.replace(/^\s+|\s+$/g,"");
    val=val.replace(/\s+/g," ");
           
    var size = document.getElementById('fontsize');
    if(size) { var txt=size.options[size.selectedIndex].value;
        if(txt!='')    val=txt+' '+val; }
   
    if(document.getElementById('compressed').checked) val='\\inline '+val;
   
    if(document.getElementById('dpi')) { var dpi=document.getElementById('dpi').value;
        if(dpi!='100') val='\\'+dpi+'dpi '+val; }
       
    if(document.getElementById('bg')) { var bg=document.getElementById('bg').value; if(bg!='transparent') val='\\bg_'+bg+' '+val; }
    return val;
}



/* Turns off the wait message, once equation is loaded */
var initmessage=true;
function processEquationChange()
{
    if(initmessage) initmessage=false;
    else { var div = document.getElementById('equationcomment'); div.innerHTML = ""; }
}

// Triggers the rendering of the equations within the iframe
function renderEqn(callback)
{
    if(!changed) return;
   
    /* First check we have a matching set of brackets */
    var val=document.getElementById('latex_formula').value;   
    val=val.replace(/^\s+|\s+$/g,"");
    if(val.length==0) return;
    var bracket=0;
  for(i=0;i<val.length;i++)
    {
      switch(val[i])
        {
            case '{': bracket++; break;
          case '}': bracket--; break;
        }
    }

    if(bracket==0)
    {       
        /* Set render button to grey, since we're now rendering.. */
        document.getElementById('renderbutton').className='greybutton';
   
        var val=document.getElementById('latex_formula').value;
       
        /* Add to history */
        var sel=document.getElementById('history');
        var j=sel.length;
        sel.length=j+1;
        sel.options[j].text=val.substr(0,15);
        sel.options[j].value=val;
        sel.options[j].title=val;
       
        var img = document.getElementById('equationview');
        val=getEquationStr();   
        sval = val.replace(/"/g,'\\"');
       
        // Figure out the format
        if(document.getElementById('format'))
        {
            var format_index=document.getElementById('format').selectedIndex;
            var format=document.getElementById('format').options[format_index].value;
        } else { var format_index=0; var format='gif'; }
       
        switch(format_index)
        {
            case 0 : // gif
            case 1 : // png
            {   
                var div = document.getElementById('equationcomment');
                div.innerHTML = "Rendering Equation <img src=\"images/wait.gif\" width=\"13\" height =\"13\"/>";   
                img.onload = processEquationChange;
                if(typeof(EQUATION_ENGINE_NOW)!='undefined' && EQUATION_ENGINE_NOW!='')
                    img.src = EQUATION_ENGINE_NOW+'?'+ val ;
                else
                    img.src=EQUATION_ENGINE+'/'+format+'.latex?' + val;
                changed=false;
            } break;
            case 2 : // pdf
            {
                img.onload = '';
                img.src='images/pdf.jpg';
                document.getElementById('download').src='http://www.codecogs.com/pdf.latex?'+val;
                var div = document.getElementById('equationcomment');
                div.innerHTML = '<br/><a target="download" href="http://www.codecogs.com/pdf.latex?'+sval+'"><strong>Click here if the PDF does not downloading.</strong></a>';   
            } break;
            case 3 : // swf
            {
                img.onload ='';
                img.src='images/spacer.gif';
                var div = document.getElementById('equationcomment');
                AC_FL_RunContent('codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0','width', '600','height', '100','src', ('http://www.codecogs.com/swf.latex?'+val),'quality','high','pluginspage','http://www.macromedia.com/go/getflashplayer','align','top','scale','showall','wmode','window','devicefont','false','bgcolor','#ffffff','menu','true','allowFullScreen','true',
'movie', (EQUATION_ENGINE+'/swf.latex?'+val) );
              changed=false;
            } break;
        }
    }
    else
    {
        var div = document.getElementById('equationcomment');
        if(bracket<0)    div.innerHTML = "<br/><span class=\"orange\">You have more <strong>closed '}' brackets</strong> than open '{' brackets</span>";
        else div.innerHTML = "<br/><span class=\"orange\">You have more <strong>open '{' brackets</strong> than closed '}' brackets</span>";
    }
}


/* We don't want to render with every keystroke, so we delay this part
This function will be called with each keystroke
 - n is a tens of second unit
*/
var auton=0;
function renderCountdown()
{
    if(auton>0)
    { auton--; setTimeout('renderCountdown()', 100); }
    else renderEqn(null);
}


function autorenderEqn(n)
{
    if(auton>0 && n>0) auton=n;
    else { auton=n; renderCountdown(); }
}

/* The following code adds a favorite to the favorite drop down.
To achieve this, we must update the users cookies */

function addfavorite(dropdown)
{
    text=document.getElementById('latex_formula').value;
    var sel=document.getElementById(dropdown);
    var num=sel.selectedIndex
  if(num==0 || !confirm("Click Yes to replace the current equation or 'Cancel' to add a new equation"))
    {
        var name = prompt('Please enter a short name for this equation:', '')
        if(name==null || name=='') name=text.substr(0,15);
        /* Add to favorite */
        var j=sel.length;
        sel.length=j+1;
        sel.options[j].text=name;
        sel.options[j].value=text;
        sel.options[j].title=text;
        /* Make sure cookie name is unique to website */
        document.cookie = "eq_"+escape(name.replace(/\+/g,"&plus;").replace(/\s/g,"&space;"))+"="+escape(text.replace(/\+/g,"&plus;"))+"; path=/";
    }
    else
    {
      sel.options[num].value=text;
      sel.options[num].title=text;
      /* Make sure cookie name is unique to website */
      document.cookie = "eq_"+escape(name.replace(/\+/g,"&plus;").replace(/\s/g,"&space;"))+"="+escape(text.replace(/\+/g,"&plus;"))+"; path=/";
    }
}

function deletefavorite(dropdown)
{
    var sel=document.getElementById(dropdown);
    var num=sel.selectedIndex
    if(num>0)
    {
        name=sel.options[num].text;
       
        var mydate = new Date();
        mydate.setTime(mydate.getTime() - 1);
        document.cookie = "eq_"+escape(name.replace(/\+/g,"&plus;").replace(/\s/g,"&space;"))+"=; expires="+mydate.toGMTString()+"; path=/";
        sel.options[num]=null;
    }
}


/* Help to generate a Matrix */
// generate a set of aligned equations - thornahawk
// isNumbered: switches between numbered and not numbered equations
function makeEquationsMatrix(type, isNumbered, isConditional)
{
    if (isNumbered==undefined) isNumbered=false;
    if (isConditional==undefined) isNumbered=false;

  var eqns="\\begin{"+type+((isNumbered)?"":"*")+"}";
    var eqi="\n &"+((isNumbered)?" ":"= ")+((isConditional)?"\\text{ if } x=  ":"");
    var eqEnd="\n\\end{"+type+((isNumbered)?"":"*")+"}";
    var i=0;

    var dim = prompt('Enter the number of lines:', '');

    if (dim != '' && dim != null)    {
        n=parseInt(dim);
        if (!isNaN(n)) {
            for (i=1;i<=n-1;i++) eqns=eqns+(eqi+"\\\\ ");
            eqns=(eqns+eqi)+eqEnd;
            insertText(eqns,type.length+((isNumbered)?0:1)+9);
        }
    }
}

// generate an array of specified dimensions - thornahawk
// type: sets the type of array, e.g. pmatrix
function makeArrayMatrix( type, start, end )
{
    var matr=start+'\\begin{'+type+'matrix}';
    var row="\n";
    var mend="\n\\end{"+type+"matrix}"+end;
    var i=0;
    var dim = prompt('Enter the array dimensions separated by a comma (e.g. "2,3" for 2 rows and 3 columns):', '')

    if (dim!='' && dim!=null)   
    {
        dim=dim.split(',');
        m=parseInt(dim[0]);
        n=parseInt(dim[1]);
       
        if (!isNaN(m) && !isNaN(n))
        {
            for (i=2;i<=n;i++) row=row+' & ';
            for (i=1;i<=m-1;i++) matr=matr+row+'\\\\ ';
       
            matr=matr+row+mend;
            insertText(matr,type.length+start.length+15);
        }
    }
}

function hover(elm, e)
{
    div=document.getElementById('hover');
    if(typeof(EQUATION_ENGINE_NOW)!='undefined' && EQUATION_ENGINE_NOW!='')
        div.innerHTML='<img src="'+EQUATION_ENGINE_NOW+'?\huge '+elm.title+'"/>';
    else
        div.innerHTML='<img src="http://www.codecogs.com/gif.latex?\\200dpi '+elm.title+'"/>';
       
    if(document.all) { div.style.top = (event.clientY-10)+'px'; div.style.left = (event.clientX+20)+'px';    }
    else { if(!e) var e=window.event; div.style.top = (e.pageY-10)+'px'; div.style.left = (e.pageX+20)+'px'; }
  div.style.display='block';
    elm.onmouseout= function() { document.getElementById('hover').style.display='none';}
}


/* This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: Turnea Iulian :: http://www.eurografic.ro */
function iObject() { this.i; return this; }

var myObject=new iObject();
myObject.i=0;
var myObject2=new iObject();
myObject2.i=0;
store_text=new Array();

//store_text[0] store initial textarea value
store_text[0]="";

function countclik(tag) {
  var x=tag.value;
    if(myObject.i==0 || store_text[myObject.i]!=x)
    {
    myObject.i++;
    var y=myObject.i;
    store_text[y]=x;
    }
    myObject2.i=0;
    document.getElementById('redobutton').src="images/redo-x.gif";
    document.getElementById('undobutton').src="images/undo.gif";
}

function undo(box) {
    tag=document.getElementById(box);
  if ((myObject2.i)<(myObject.i)) {
    myObject2.i++;
        if(myObject2.i==myObject.i) {
        document.getElementById('undobutton').src="images/undo-x.gif"; }
        document.getElementById('redobutton').src="images/redo.gif";
  } else {
    alert("Finish Undo Action");
  }
  var z=store_text.length;
  z=z-myObject2.i;
  if (store_text[z]) { tag.value=store_text[z]; }
    else { tag.value=store_text[0]; }
    tag.focus();
}

function redo(box) {
    tag=document.getElementById(box);
  if((myObject2.i)>1) {
    myObject2.i--;
        if(myObject2.i==1){
        document.getElementById('redobutton').src="images/redo-x.gif"; }
        document.getElementById('undobutton').src="images/undo.gif";
  } else {
    alert("Finish Redo Action");
  }
  var z=store_text.length;
  z=z-myObject2.i;
  if (store_text[z]) { tag.value=store_text[z]; }
    else { tag.value=store_text[0]; }
    tag.focus();
}


function updateOpener(target, type)
{
    if(target!='')
    { // *** Traditional mode with plane HTML text box ***
      var text;
        if(type=='phpBB')
        { // Create LaTeX string for insertion into phpBB forum
            text=getEquationStr();
            text = '[tex]' + text + '[/tex]\n';
        }
        else if(type=='html')
        { // Create <img> tag for insertion into html
            text=getEquationStr();
            if(typeof(EQUATION_ENGINE_NOW)!='undefined' && EQUATION_ENGINE_NOW!='')
                text = '<img src="'+EQUATION_ENGINE_NOW+'?'+escape(text)+'" />';
            else
                text = '<img src="'+EQUATION_ENGINE+'/gif.latex?'+escape(text)+'" />';
        }
        else
        { // Create LaTeX string for insertion into CodeCogs of DOxygen C/C++ markup language
            // Note size and
            text=document.getElementById('latex_formula').value;
            var size = document.getElementById('fontsize');
            if(size && size.selectedIndex!=2)
                text=size.options[size.selectedIndex].value+' '+text;
               
            if(document.getElementById('inline').checked)
            {
                if(!document.getElementById('compressed').checked) text='\\displaystyle '+text;
                text = '$' + text + '$ ';
            }
            else
            {
                if(document.getElementById('compressed').checked) text='\\inline '+text;
                text = '\\[' + text + '\\]\n';
            }
        }
        addText(window.opener.document,target,text);
    }
    else
    { // *** Advanced mode with FCKEditor ***
        var text=document.getElementById('latex_formula').value;
        var size = document.getElementById('fontsize');
        if(size && size.selectedIndex!=2)
            text=size.options[size.selectedIndex].value+' '+text;
   
        if (text.length == 0) {
            alert(FCKLang.EquationErrNoEqn) ;
            return false ;
        }   
       
        if(document.getElementById('inline').checked)
        {
            if(!document.getElementById('compressed').checked)    
                text='\\displaystyle '+text;
            text = '\\f$' + text + '\\f$ ';
        }
        else
        {
            if(document.getElementById('compressed').checked)    
                text='\\inline '+text;
            text = '\\f[' + text + '\\f]\n';
        }
       
        if ( eSelected && eSelected._fckequation == text )
            return true ;
        FCKEquation.Add(text);
       
    }   
    window.blur();
    return true ;
}

#######################################################

색칠된 부분이 수정되었는데 이유는 간단한다. 혹시 여러분이 수식 변환기를 직접 설치했다면 그곳으로 걸어서 작업할 수 있도록 한는 것이다. 굳이 수정하지 않아도 동작은 한다. 하지만 수식처리기는 여러분의 서버가 아닌 http://codecogs.izyba.com 에서 처리 될 것이다.리될 것이다.

 

3. 마지막으로 플러그인을 실제 추가하는 것이 있는데 기본적으로 추가 되도록 하는 방법은 있다.

fckconfig.js 에서

 

FCKConfig.PreloadImages = [ FCKConfig.SkinPath + 'images/toolbar.start.gif', FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif' ] ;
FCKConfig.PluginsPath = FCKConfig.BasePath + 'plugins/' ;
라는 라인 다음에 아래 라인을 추가
FCKConfig.Plugins.Add( 'equation' ) ;

또 다름과같이 추가

FCKConfig.ToolbarSets["Default"] = [
    ['Source','DocProps','-','Save','NewPage','Preview','-','Templates'],
    ['Cut','Copy','Paste','PasteText','PasteWord','-','Print','SpellCheck'],
    ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
    ['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField'],
    '/',
    ['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
    ['OrderedList','UnorderedList','-','Outdent','Indent','Blockquote','CreateDiv'],
    ['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
    ['Link','Unlink','Anchor'],
    ['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
    ['equation'],
    '/',
    ['Style','FontFormat','FontName','FontSize'],
    ['TextColor','BGColor'],
    ['FitWindow','ShowBlocks','-','About']        // No comma for the last row.
] ;

이렇게 되면 환경에서 이용가능하게 된다.

 

4. 마지막으로 한글화가 필요하겠다. 그래서 만들어 넣었다
위치는  equation/lang/ko_ko.php 파일로 들어 가겠다.

 

<?php
$lang=array();

$lang['english']='영어';
$lang['french']='프랑스어';
$lang['german']='독일어';
$lang['italian']='이탈리아';
$lang['spanish']='스페인어';

$lang['help']='안녕하세요';

$lang['size_title']='수식의 글씨크기';
$lang['tiny']='Tiny';  // this refers to a font size of tiny
$lang['small']='Small';
$lang['normal']='Normal';
$lang['large']='Large';
$lang['huge']='Huge';

$lang['color']='색';   // Displayed like "Colors...", allowing users to display equations in new colors
$lang['color_title']='수식 색';
$lang['red']='빨강';
$lang['green']='초록';
$lang['blue']='파랑';

$lang['history']='과거기록';  // Displayed like 'History...', shows recent equations a user has typed
$lang['history_title']='지금까지의 사용한 수식목록';

$lang['favorites']='자주이용';  // Displayed like 'Favorites...', shows a used saved (favorite) equations
$lang['favorites_title']='자주이용하는 수식목록';
$lang['favorites_add']='자주이용 목록추가';  // adds an equation to the favorite list
$lang['favorites_delete']='자주이용 목록삭제';  // removes an equation from the favorite list


$lang['inline']='Inline';          // place equations inline within text in the parent document
$lang['inline_title']='Place equations inline with other text (by default equations are placed on a new line)';

$lang['compressed']='Compressed';  // create equations with restricted vertical height
$lang['compressed_title']='Create equations that are vertically compressed, suitable for being inline with other text';

$lang['clear']='깨끗이';
$lang['clear_title']='수식입력창을 깨끗이 한다.';

$lang['render']='변환보기';
$lang['render_title']='선택하면 아래에 입력수식을 보여준다.';

$lang['copy']='문서에 복사';
$lang['copy_clipboard']='클립보드복사';
$lang['click_here']='여기를 크릭';

$lang['intro']='LaTeX으로 수식을 입력하고 변환보기를 크릭하면 이곳에 보여집니다.';

$lang['updated']='마지막 업데이트';  // .. 27/6/2008
$lang['refresh']='(Refresh your browser if you\'ve used an older edition)';
$lang['dev']='Written by Will Bateman with assistance from Steve Mayer.';

// This message appears at the bottom of the screen when the editor is first loaded.
$lang['install']='이 편집기를 당신의 웹사이트에 설치하시려면,';

// Credits
$lang['credits']='Written by <a href="http://www.codecogs.com" target="_blank">Will Bateman</a> and <a href="http://www.mayer.dial.pipex.com/tex.htm" target="_blank">Steve Mayer</a>.';

?>
<select title="Spaces" onchange="insertText(this.options[this.selectedIndex].value); this.selectedIndex=0;">
  <option selected="selected" value="" style="color:#8080ff">띄어쓰기</option>
  <option value="\,">thin</option>
  <option value="\:">medium</option>
  <option value="\;">thick</option>
  <option value="\!">negative</option>
</select>
<select title="Styles" onchange="insertText(this.options[this.selectedIndex].value, 1000); this.selectedIndex=0;">
  <option selected="selected" value="" style="color:#8080ff">글자모양</option>
  <optgroup label="Equation Only">
  <option value="\mathbb{}" title="\mathbb{}">Blackboard</option>
  <option value="\mathbf{}" title="\mathbf{}">Bold</option>
  <option value="\boldsymbol{}" title="\boldsymbol{}">Bold Greek</option>
  <option value="\mathit{}" title="\mathit{}">Italic</option>
 
  <option value="\mathrm{}" title="\mathrm{}">Roman</option>
  <option value="\mathfrak{}" title="\mathfrak{}">Fraktur</option>
  </optgroup>
  <optgroup label="Text Only">
  <option value="\texttt{}" title="\texttt{}">Typewriter</option>
  <option value="\textup{}" title="\textup{}">Upright</option>
  <option value="\textbf{}" title="\textbf{}">Bold</option>
  <option value="\textit{}" title="\textit{}">Italic</option>
  <option value="\textrm{}" title="\textrm{}">Roman</option>
  <option value="\textsl{}" title="\textsl{}">Slanted</option>
  <option value="\textsc{}" title="\textsc{}">SMALL CAPS</option>
  <option value="\emph{}"   title="\emph{}">Emphasis</option>
  </optgroup>
</select>
<select title="Functions" onchange="insertText(this.options[this.selectedIndex].value); this.selectedIndex=0;">
  <option selected="selected" value="" style="color:#8080ff">문자함수&hellip;</option>
  <option value="\arg">arg</option>
  <option value="\deg">degree</option>
  <option value="\det">det</option>
  <option value="\dim">dim</option>
  <option value="\gcd">gcd</option>
  <option value="\hom">hom</option>
  <option value="\ker">ker</option>
  <option value="\partial">partial</option>
  <option value="\Pr">Pr</option>
  <option value="\sup">sup</option> 
  <optgroup label="Logs">
  <option value="\exp">exp</option>
  <option value="\lg">lg</option>
  <option value="\ln">ln</option>
  <option value="\log">log</option>
  <option value="\log_{e}">log e</option>
  <option value="\log_{10}">log 10</option>
  </optgroup>
  <optgroup label="Limits">
  <option value="\lim">limit</option>
  <option value="\liminf">liminf</option>
  <option value="\limsup">limsup</option>
  <option value="\max">maximum</option>
  <option value="\min">minimum</option>
  <option value="\infty">infinite</option>            
  </optgroup> 
  <optgroup label="Trig">
  <option value="\sin">sin</option>
  <option value="\cos">cos</option>
  <option value="\tan">tan</option>
  <option value="\sin^{-1}">sin-1</option>
  <option value="\cos^{-1}">cos-1</option>
  <option value="\tan^{-1}">tan-1</option>
  <option value="\csc">csc</option>
  <option value="\sec">sec</option>
  <option value="\cot">cot</option>
  <option value="\sinh">sinh</option>
  <option value="\cosh">cosh</option>
  <option value="\tanh">tanh</option>
  <option value="\coth">coth</option>
  <option value="\sinh^{-1}">sinh-1</option>
  <option value="\cosh^{-1}">cosh-1</option>
  <option value="\tanh^{-1}">tanh-1</option>
  </optgroup>
  <optgroup label="Complex">
  <option value="\Re">Real</option>
  <option value="\Im">Imaginary</option>
  <option value="\imath">i</option>
  <option value="\jmath">j</option>
  </optgroup>
</select>
<select title="Foreign Characters" onchange="insertText(this.options[this.selectedIndex].value); this.selectedIndex=0;">
  <option selected="selected" value="" style="color:#8080ff">문자기호</option>
  <option value="\oe">&oelig;</option>
  <option value="\OE">&OElig;</option>
  <option value="\ae">&aelig;</option>
  <option value="\AE">&AElig;</option>
  <option value="\aa">&aring;</option>
  <option value="\AA">&Aring;</option>
  <option value="\ss">&szlig;</option>
  <option value="\S">(&sect;) section</option>
  <option value="\P">(&para;) paragraph</option>
  <option value="\o">o</option>
  <option value="\O">O</option>
  <option value="\l">l</option>
  <option value="\L">L</option>
  <option value="\dag">dagger</option>
  <option value="\ddag">double dagger</option>
  <option value="\copyright">&copy;</option>
  <option value="\pounds">&pound;</option>
</select>
<select title="Symbols" onchange="insertText(this.options[this.selectedIndex].value); this.selectedIndex=0;">
  <option selected="selected" value="" style="color:#8080ff">기호</option>
    <option value="\pm" title="\pm">(&plusmn;) plus or minus(더하기빼기)</option>
  <option value="\mp" title="\mp">minus or plus(빼기더하기)</option>
  <option value="\times">(&times;) times(곱샘)</option>
  <option value="\div" title="\div">(&divide;) divided by(나누기)</option>
  <option value="\ast" title="\ast">(&lowast;) asterisk(당구장)</option>
  <option value="\star">(*) star(별)</option>
  <option value="\circ" title="\circ">circle(원)</option>
  <option value="^{\circ}" title="^{\circ}">degree symbol(온:도)</option>
  <option value="\bullet">(&bull;) bullet(원점)</option>
  <option value="\cdot">(&middot;) center dot(점)</option>
  <option value="\uplus">u plus(합집합더하기)</option>
  <option value="\sqcap">square cap(각진교집합)</option>
  <option value="\sqcup">square cup(각진합집합)</option>
  <option value="\vee">(&or;) vee(논리합)</option>
  <option value="\wedge">(&and;) wedge(논리곱)</option>
  <option value="\diamond">(&loz;) diamond(다이아몬드)</option>
  <option value="\bigtriangleup">big triangle up(삼각형)</option>
  <option value="\bigtriangledown">big triangle down(역삼각형)</option>
  <option value="\triangleleft">triangle left(왼삼각형)</option>
  <option value="\triangleright">triangle right(오른삼각형)</option>
  <option value="\lhd">large triangle left(왼삼각형)</option>
  <option value="\rhd">large triangle right(오른삼각형)</option>
  <option value="\oplus">(&oplus;) circle plus(원안더하기)</option>
  <option value="\ominus">circle minus(원안빼기)</option>
  <option value="\otimes">(&otimes;) circle times(원안곱하기)</option>
  <option value="\oslash">circle slash(원안슬래시)</option>
  <option value="\odot">circle dot(원안점)</option>
  <option value="\bigcirc">big circle(큰원)</option> 
  <option value="\dagger">(&dagger;) dagger(십자가)</option>
  <option value="\ddagger">(&Dagger;) double dagger(쌍십자가)</option>
  <option value="\amalg">coproduct</option>
</select>
색칠 된곳이 내가 임으로 번역해 버린것이다.

 

이상으로 마친다.

이 글은 스프링노트에서 작성되었습니다.

2009년 10월 21일 수요일

윈도우 미디어 브로드캐스트 설정방법

윈도우 미디어 서버에서 브로드캐스트를 설정하는 방법

(window 2003 server media broadcast setting)

1 . 미디어서버의 설정

가) 미디어 서버의 설정에서 브로드캐스트를 하기 위한 제어 프로토콜을 사용가능하게 한다.brodecate1.gif

위 그림에서 wms http 서버 제어 프로토콜이 그것이다.

이것의 속성은 아래 그림과 같다.

brodecate2.gif

제어 속성에 보이는 것처럼 관리 포트라는 부분이 있는데 기본적으로 80포트를 설정한다 하지만 본인이 만일 이 서버에 웹서버를 동반해서 싣고 있다면 당연히 충돌할 것이기에 다른포트로 바꾸어서 충돌하지 않도록해주면 된다.

 

나) 다음은 권한의 설정입니다.

이것은 만일 권한을 설정하여 접근을 통제하기 위해서 입니다. 또한 게시지점을 자유롭게 생성도 가능하게 됩니다.

아래처럼 두가지만 사용을 한후 이용할 사용자를 설정하여야합니다.

brodecate2_gif

간단히 설명한다면

  • wms ntfs acl인증 : 주문형 게시지점(멀티캐스트,유니캐스트)에서 접근의 권한을 파일파티션의 접근권한과 동일하게 적용하기 위해서 사용. 때문에 지금설명하는 블로드캐스트연관성이 적습니다. 물론 파일을 브로드캐스트하거나 디렉토리리스트를 브로드캐스트하는경우는 관계가 있겠지만 그렇지 않다면 디폴트로 두고 갑니다.
  • wms ip 주소 인증 : 특정 주소의 컨텐츠에대해 접속을 허용 또는 거부할 수 있도록 하며 서버 및 게시지점 인증 플러그인은 함께 작동. 이것또한 지금 작업하려고 하는것과 연관성이 적습니다. 그래서 패스. 사용안함 디폴트로 둡니다.
  • wms 게시지점 acl인증 : 서버의 모든 게시지점이나 특정 게시 지점의 콘텐츠에 대한 사용자. 서버 또는 그룹의 접속을 허용하거나 거부 하도록 합니다. 때문에 만일 이 서버의 모든 접속에 대해 인증을 요청하려한다면 이것을 선택하시고 나중에 속성을 선택하여 이용할 이용자아이디를 설정 해줍니다. 이것을 상요하지 않음으로 한다면 아마도 모든 사용자가 자유롭게 게시지점을 만들어서 서비스가 가능한 상태가 되어 버립니다.
    좀더 자세히 살펴 보면 아래 그림을 보면서 설명한다면. 원래 디폴트로 Everyone과 Administrators는 반드시 있는거겠지요. 그런데 만일 Everyone에 쓰기와 만드기를 권한을 주면 누구나 서비스 게시지점을 만들게 될겁니다. 하지만 쓰기까지만 해둔다면 만들어진 게시지점에만 올릴수 있게 됩니다. 같은 원리로 사용자 아이디를 추가해서 설정하면 되겠습니다.

brodecates6.gif

 

다) 인증 방법에 관한겁니다.

그다음은 협상인증부분이 남는데 만일 위의 설정으로 하단에 모두 인증을 적용이 끝난다면 협상인증을 체크해서 인증을 필하도록 합니다. 그렇지 않다면 익명사용자 인증처리됩니다. 만일 익명사용자 인증도 하지 않는다면 디렉토리에서 다시 인증되도록 해야합니다. 어찌 됐든지 인증이 필요한 부분이 있다면 해당 부분에서 또는 상위에서라도 협상인증이 있어서 처리되어야 합니다. 가능하면 제일 마지막 부분에서 하는것이 좋을거 같다는 생각이 듭니다.

만일에 여기서 접속과 관련한 모든것이 끝나는 설정이라면 협상인증부분을 처리해야하지만 그렇지 않고 추후 게시점에서 다시 설정을 더 필요로 한다면 굳이 이것을 활성화 할 필요가 없습니다. 게시지점에서 해도 무방합니다. 그리고 일반 이용자누구나 접근하여 플레이 되도록 하려면 익명 상용자 인증을 꼭해두어야 누구나 인증없이 플레이 될수 있습니다. 위에서 언급한 Everyone이 모두 여기에 해당 됩니다.

brodecates4.gif

2. 게시지점의 추가관리

가) 게시지점을 추가 합니다.

게시지점이란 미디어 서버의 디렉토리와 같은 개념이란것은 알것이고 그것을 추가하는 것입니다.

여기서는 브로드캐스트만을 설명하기 때문에 다른부분은 생략하고 넘어갑니다. 게시지점추가(고급)을 선택합니다.brodecate3.gif

그러면 하단이미지에서 보이는 것 처럼 게시지점 형식과 이름 위치를 묻습니다.

여기서 중요한것은 콘텐트 위치입니다. 인코더(풀)와 인코더(푸시)그리고 원격게시지점을 배달하는 것등이 주로 이용될겁니다. 때에 따라서는 파일도 해당 되겠지만 파일의 경우는 그냥 유니캐스트나 멀티캐스트 하기 때문에 브로드캐스트에서는 잘 이용안하겠지요.

  • 인코더(풀) :
    인코딩하고 있는 주소를 가져다가 브로드캐스트하기 때문에 인코딩 컴의 아이피가 통상적으로 미디어서버에서 바로 접근이 가능한 아이피이어야합니다. 만일 ADSL이나 기타 동적할당을 사용하는 인코딩컴에서는 사용하기 힘들겁니다. 그렇다고 불가능하지는 않습니다. 다이나믹DNS등을 이용해서 하는 방법도 있으니까요. 하지만 역시 또한 방화벽이 문제가 될수 있습니다. 보통 집에 라우팅장비를 이용해서 하나의 아이피를 여러대의 컴이 분할 해서 이용하게 된다면 역시 라우팅장비에서 잘 설정해주면 가능하겠지요. 좀 복잡하지만 가능하고 안정적일지는 모르지만 저는 배제합니다. 콘텐트 위치에 브로드캐스트하는 주소를 입력하면 됩니다. 보통 인코딩할때 설정합니다. 그 설정하는 아이피와 포트가 되겠습니다.
  • 인코더(푸시) :
    인코딩하는 주소라기 보다는 그냥 인코딩하는 컴에서 푸싱을 해서 브로드캐스트하도록하는 겁니다.

brodecate4.gif

 

나) 권한 부여가 있습니다.

위에서 설명한 대로입니다. 현재 게시지점에 국한된 인증 방법을 이야기 합니다.

brodecates1.gif

여기서 구체적으로 아이피를 인증하는 방법은 있는 그대로 읽어주면 될거 같아 특별히 설명할것이 거의 없습니다. 좀 설명을 더한다면 거부가 된 주소의 경우는 읽는거까지를 포함함에 주의하면 됩니다. 즉 다시말하면 읽고 쓰기가 아니라 읽는 것 까지 포함해서 제어 됩니다.

brodecates2.gif

 

다) 인증 방법에 대해서는 앞에서 설명을 했으니 더 할 필요가 없는거 같구요. 단지 여기서는 해당 게시지점에 국한시키는 작업입니다. 만일 상위에서 협상인증없이 여기까지 왔다면 이곳에서라도 협상인증을 해서 인증 사용자만을 위한 서비스가 가능하도록 해주라는 겁니다.

brodecate5.gif

 

3. 다음은 엔코더입니다.

가) 푸시서버설정(Push to sercver)
중요한것은 Output이고 그중에서 프시서버입니다. 만일 설정에서 푸시를 선택해서 작업을 계획했다면 필수적이겠습니다.
서버이름(Server name)에 아이피나 도메인네임을 넣고 포드 번호를 주어야합니다.만일 80포트의 경우는 주지않아도 되지만 그이외의 포트는 반드시 입력해주어야합니다. 포트 입력방식은 도메인네임:포트(abc.com:8080 또는 1192.168.0.2:8080)형식이 됩니다.
서비스제공위치점(Publishing point)라는 것은 서버에서의 게시지점입니다.

 

나) 풀엔코딩설정(Pull from encoder)
이것은 서버에서 풀설정이 있었을 겁니다. 그것을 위한것이기도 하고 브로드캐스트 포트이기도합니다. 따라서 이것이 공유된 인터넷주소에 있는 컴에서 엔코딩을 하고 있다면 이주소가 바로 브로드캐스트주소이기도 하다는 겁니다. 하지만 ADSL이용하는 이용자가 이것을 브로드캐스트주소라고 알려주거나 하면 한두사람은 괞찮다지만 셋만 모여도 트래픽이 장난아니게 증가할수 있음으로 이를 브로드캐스트주소로 이용하기는 문제가 있겠지요.

 

다)보관파일설정(Archive to file)
엔코딩하면서 파일을 보관하고자 한다면 설정하는 것으로 파일의 크기제한이라든가 시간별 제한을 걸어서 시간대별로 순서파일을 만들어 보관하도록 설정한다.

brodecate6.gif

다)  인증 : 만일 서버에서 인증을 통해서 데이터를 올리도록 설정하면 실행(Apply)를 선택하면 인증받을 아이디와 패스워드를 묻는다.
만일 맞는 아이디와 패스워드를 입력해주면 준비를 완료하고 시작을 누르면 본격적으로 브로드캐스트에 신호를처리한다.brodecates5.gif

 

이 글은 스프링노트에서 작성되었습니다.

2009년 10월 9일 금요일

리눅스서버 데몬들

리눅스 서버의 데몬들

* acpid
ACPI(Advanced Configuration and Power Interface) 방식의 시스템 전력 관리를 위한 데몬

* anacron
crond와 같은 작업 스케줄러 데몬이지만 crond와는 달리 시스템이 계속 켜져있지 않다고 가정하여 하루보다 작은 단위의 스케줄을 관리

* apmd
APM(Advanced Power Management) 데몬 - 배터리를 필요로 하는 노트북 등 휴대용 데스크톱에서 필요

* atd
crond와 같은 작업 스케줄러 데몬

* auditd => 감사기능을 활성화 하는 데몬이다. auditd 데몬이 실행되는 동안 auditing 변수, syscall 규칙, 파일 시스템 감시 ( watch ) 작업을 수행. 이번에 대해서는 선택은 자유

* autofs
파일 시스템을 자동으로 마운트하기 위한 데몬

* avahi-daemon
네트워크 서비스를 인식하는 멀리캐스트 DNS 서비스 Avahi 데몬

* avahi-dnsconfd
DNS 재설정 기능을 위한 데몬

* bluetooth
블루투스 장치를 사용하기 위한 데몬

* cpuspeed
CPU SPEED 데몬

* crond
작업 스케줄러 cron 데몬

* cups
리눅스의 기본 출력 시스템인 CUPS데몬

* cups-config-daemon
CUPS 설정을 위한 데몬

* dhcdbd
DHCP D-BUS 데몬(DHCP 클라이언트를 D-BUS로 관리하기 위해 필요)

* dhcpd
동적 IP환경에서 인터넷을 사용하기 위한 DHCP 데몬

* dhcrelay
DHCP 중계를 위한 데몬

* diskdump
시스템에 문제가 생겼을 때 메모리에 있던 내용을 디스크 장치에 기록하기 위한 데몬

* functions 데몬 스크립트에서 기본적으로 사용할 함수가 정의되어 있으며 필요에 따라
데몬 스크립트를 생성할 때 사용할 수 있다. 많은 데몬 스크립트가 참조하고
있으며 이것은 필요에 따라 로드되므로 정지 및 시작 할 수 없다.

* gpm
콘솔 환경에서 마우스 지원을 위해 필요한 데몬

* hal daemon
장치를 자동으로 인식하기 위해 필요한 HAL 데몬

* hidd
불루투스 장치를 사용할 때 필요한 불루투수 ID 데몬

* hplip
HP사 제품의 출력을 위한 데몬

* httpd
웹서버 데몬

* iptables
방화벽, 매스커레이드 설정을 위한 iptables 데몬

* irda
적외선 통신을 위한 irda 데몬

* irqbalance
멀티프로세서(둘 이상의 CPU를 사용하는 환경)에서 CPU간의 인터럽트를 분리하기 위한 데몬

* isdn
ISDN 서비스를 위한 데몬

* kdcrotate kerberos 를 지원하지 위한 데몬으로 커버로스를 지원하는 서버로 설정하고자
할 때 사용되며, 커버로스 인증을 사용하지 않는다면 중지

* keytable /etc/sysconfig/keyboard 의 설정된 매핑 정보를 로드하며 시스템 설치할 때
설정값을 사용하므로 중지

* kudzu
새로운 하드웨어가 추가되었을 때 검색을 위한 데몬

* lm_sensors
CPU 온도, 마더보드 온도, 팬 상태, 전압 등의 시스템의 상황을 실시간으로 알 수 있는 lm_sensors 데몬

* lpd 이 시스템을 사용해서 프린트를 한 적이 있는가? 만약 인터넷 서비스를 하고
있다면 프린트 서비스는 하지 말아야 한다. 프린트 서비스를 할 계획이 없다면
중지

* mcstrans => 사람이 읽기 쉬운 형식으로 보안 환경 정보로 번역하는 시스템. ( SELinux 환 경에서... 사용 )

* mdmonitor
RAID상태를 모니터링하기 위한 데몬

* mdmpd
다중 경로의 장치를 모니터링하고 관리하기 위한 데몬

* messagebus
시스템 이벤트를 전송하기 위한 데몬

* microcode_ctl => Intel cpu의 마이크로 코드 업데이트 데몬

* mysqld
MySQL 데이터베이스 데몬

* named
DNS 서버 데몬

* netdump
콘솔을 초기화하기 위한 데몬

* netfs
삼바, NFS, NCP 등 네트워크 파일 시스템을 마운트하기 위한 데몬

* netplugd
네트워크 케이블을 연결했을 때 접속 여부를 리눅스 커널에게 알리기 위한 데몬

* network
네트워크 데몬(네트워크 접속을 위해 반드시 활성화되어야 함)

* NetworkManager, NetworkManagerDispatcher
네트워크 인터페이스를 자동으로 관리하기 위한 데몬

* nfs
유닉스와 리눅스의 기본 네트워크 파일 시스템 NFS 데몬

* nfslock
NFS를 통해 공유되는 파일을 클라이언트가 동시에 수정하는 것을 막기 위해 파일을
잠그는 데몬(NFS를 운영하는데 필요)

* nscd
네밍 서비스에 대한 요청 결과를 캐시해서 다음 요청에 응답하기 위한 데몬
(NIS와 DNS를 운영하는데 필요)

* ntpd
네트워크를 통해 리눅스 서버의 시간 정보를 동기화하기 위한 Network Time Protocol 데몬

* pcmcia 노트북에서 사용하는 인터페이스 pcmcia를 관리하는 데몬으로 pcmcia 장치가
없다면 중지

* pcscd => PC/SC 스마트 카드 데몬이다. 뭐 스마트 카드를 사용하는 컴퓨터가 아니라면 정지하자.

* portmap
원격 시스템 호출에 사용하는 데몬(NFS, NIS를 사요할 때 필요)

* proftpd
FTP 서버 데몬

* psacct
프로세스 통계를 확인하기 위한 psacct 데몬

* rawdevices 캐릭터 장치나 저수준 입출력을 바인드 하는 데몬으로 오라클과 같은 특정
응용프로그램에서 사용할 수 있으나 보통 사용되지 않기에 중지

* rdisc
동적 라우팅에서 라우터를 자동으로 찾기 위한 RDISC 데몬

* readahead
로그인 전에 특정 파일을 사용하기에 앞서 메모리에 미리 불러들여 속도를 높이기 위한 데몬

* readahead_early
모든 데몬이 시작하기 전에 특정 파일을 사용하기에 앞서 메모리에 미리 불러들여 속도를 높이기 위한 데몬

* restorecond => SELinux 데몬과 관련된 서비스이다. 함부로 멈추지 말기를.. SELinux는 이 데몬을 필요로 한다.

* rhnsd 네트워크 사에서 프로그램을 업데이트가 하거나 정보를 찾고자 할 때 기타 등
서버에서는 별로 필요하지 않기에 중지

* rpcgssd
원격 인증을 위한 GSS(General Security Service) 데몬 (NFS version 4 클라이언트를 위해 필요)

* rpcidmapd
원격 이름 매핑을 위한 idmap(IDmapping) 데몬 (NFS version 4를 위해 필요)

* rpcsvcgssd
원격 인증을 위한 GSS(General Security Service) 데몬 (NFS version 4 서버를 위해 필요)

* saslauthd
SASL(Simple Authentication and Security Layer)을 이용한 암호화된 사용자 인증을 위한 데몬

* sendmail
메일 서버 Sendmail 데몬

* smartd
시스템 모니터링을 위한(Self-Monitoring, Analysis and Reporting Technology) 데몬

* smb
삼바 서버 데몬 (smbd와 nmbd를 동작시키기 위한 데몬)

* snmpd
네트워크 관리를 위한 SNMP 데몬

* snmptrapd
SNMP TRAP 데몬

* spamassassin
스팸메일을 거르기 위한 스펨메일 필터 데몬

* squid
프록시 서버 Squid 데몬

* sshd
SSH 서버 데몬

* syslog
시스템 로그를 관리하기 위한 syslog 데몬

* vncserver
원격접속을 위한 VNC 서버 데몬

* winbind
삼바 서버와 윈도우 간에 네트워크 공유를 위해 필요한 데몬

* wpa_supplicant
무선 네트워크 접속에 사용되는 WPA(Wi-Fi proctedted access) 데몬

* xfs
X윈도우의 폰트를 관리하기 위한 데몬

* xinted
xinetd 방식의 네트워크 서비스를 관리하기 위한 슈퍼 데몬

* ypbin
NIS 서버 데몬

* yum

온라인 패키지 관리도구 yum 데몬

이 글은 스프링노트에서 작성되었습니다.

2009년 10월 7일 수요일

윈도우 인스톨 부트용 서비스팩 및 드라이브 핫픽스 적용 시디 만들기

  1. 첫번째 단계에서 먼저 유용한 툴을 가져온다.
    http://www.nliteos.com/에 가서 nLite프로그램을 다운받는다 가장 최근이 것이 이글을 쓸때가 1.4.8이당
  2. 다운받은 프로그램을 설치한다.(예는 생략)
  3. 준비한 OS를 HDD에 일단 옮겨담는다
    이때 작업할 드라이브나 서비스 팩을 미리 받아 두면 작업시 편리 하겠다. 드라이브는 반드시 앞축된것은 풀어서 자신이 적용할 OS에 맞는것만을 선택해야한다.

    oscd001(1).gif

  4. 프로그램을 실행한다.
    oscd002.gif
    실행화면은 상단과 같다. 언어를 선택하면 된다.
  5. 다음을 선택한후 작업할 OS가 들어 있는 디렉토리를 선택한다.
    oscd003.gif
    선택하게 되면 해당 OS의 정보를 다음처럼 출력해준다.
    oscd004.gif
  6. 다음 크릭하면 이전에 설정된 값을 불러 올지 결정한다. 없으면 그냥 가면 된다.
    oscd005.gif
  7. 이제 작업에 추가할 것을 설정하는데.
    통합 : 서비스 팩,핫픽스,업데이트, 드라이브 등 추가하고 싶을 분야를 선택하면 된다.
    제거 : 구성요소에서 추가제거를 하기 위해
    셋업 : 설치시 할수 있는 것들을 나열한다. 만일 무인설치를 한다면 시리얼번호를 입력해주어야한다.
    만들기 : 당근 부팅가능한 시디 이미지를 만든다는것
    oscd006.gif
  8. 통합 작업인데. 그림처럼 서비스팩을 다운받아 선택하면 바로 앞축을 풀고 다시 통합적용작업을 자동으로 알아서 해준다.
    또한 만일 공식 서비스 팩 부분을 선택하면 해당 서비스팩을 다운받을 수 있는 곳으로 연결도 해준다.
    oscd007.gif oscd008.gif
  9. 핫픽스나 업데이트, 드라이버를 선택하여 넣어주면 된다.
    oscd009.gif
  10. 무인설치시 필요한 사항을 미리 입력해둔다.
    oscd010.gif
  11. 설정이 끝나면 자동으로 통합작업을 완료한다.
    oscd011.gif
  12. 마지막으로 시디이미지를 만드는 작업을 설정하면 끝
    oscd012.gif

이 글은 스프링노트에서 작성되었습니다.

2009년 9월 29일 화요일

초간단 raid 5 mdadm으로 만들기

mdadm 소프트 raid로 레벨5 만들기

먼저 하드디스크를 준비해서  설치후

1. 장비별로 파티션을 잡는다. 

파티션의 타입은 fd 값으로 Linux raid auto

 

2. 환경설정파일은 다음과 같다.

파일의 위치는 /etc/mdadm.conf

 

DEVICE /dev/sd[abcdefgh]1
ARRAY /dev/md5 devices=/dev/sda1, /dev/sdb1, /dev/sdc1, /dev/sdd1, /dev/sde1, /dev/sdf1, /dev/sdg1, /dev/sdh1

DEVICE /dev/sd[abcdefgh]1 => abcdefgh는 장치의 나열 1은 두번째 장치의 나열
ARRAY /dev/md5 devices=/dev/sda1, /dev/sdb1, /dev/sdc1, /dev/sdd1, /dev/sde1, /dev/sdf1, /dev/sdg1, /dev/sdh1 ==> /dev/md5 는 raid로 생설될 장치이름, devices=다음에는 각 장치들의 실재 이름을 나열

 

3. 실제 device명을 시스템에 만들어 준다.

 

# mknod /dev/md5 b 9 5

mknod /dev/md5 b 9 5 ==> /dev/md5 raid로 생설되 장치이름 b 블록타입 9 md장치 5레벨 5

 

4. 장치를 연결하여 raid를 구성 시킨다.
# mdadm --create /dev/md5 --level=5 --raid-devices=8 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1
mdadm --create /dev/md5 --level=5 --raid-devices=8 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 ==> --create : 생성, /dev/md5 : raid로 생성될 장치명, --levle=5 : raid 레벨, --raid-devices=8 : raid로 구성될 장치 개수 나머지는 포함될 장치들의 나열

 

이후에 새로 생성시 묻는다 진자로 생성할지 그럼

 

5. 구성된 장치와 상황를 본다.
# mdadm --detail /dev/md5

mdadm --detail /dev/md5 ==> --detail 옵션으로 현재 상태를 반환하기 위한 옵션 /dev/md5 장치를 표시하는 내용

+++++++++++++++++++++++++++++++++++++++++

mdadm: only give one device per ARRAY line: /dev/md5 and /dev/sdb1,
mdadm: only give one device per ARRAY line: /dev/md5 and /dev/sdc1,
mdadm: only give one device per ARRAY line: /dev/md5 and /dev/sdd1,
mdadm: only give one device per ARRAY line: /dev/md5 and /dev/sde1,
mdadm: only give one device per ARRAY line: /dev/md5 and /dev/sdf1,
mdadm: only give one device per ARRAY line: /dev/md5 and /dev/sdg1,
mdadm: only give one device per ARRAY line: /dev/md5 and /dev/sdh1
/dev/md5:
        Version : 00.90.03
  Creation Time : Tue Sep 29 12:22:17 2009
     Raid Level : raid5
     Array Size : 3418687552 (3260.31 GiB 3500.74 GB)
  Used Dev Size : 488383936 (465.76 GiB 500.11 GB)
   Raid Devices : 8
  Total Devices : 8
Preferred Minor : 5
    Persistence : Superblock is persistent

    Update Time : Tue Sep 29 12:22:17 2009
          State : clean, degraded, recovering
 Active Devices : 7
Working Devices : 8
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 64K

 Rebuild Status : 37% complete

           UUID : 44ae596f:1c84dc2b:9c23bff9:bd295ba1
         Events : 0.1

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
       2       8       33        2      active sync   /dev/sdc1
       3       8       49        3      active sync   /dev/sdd1
       4       8       65        4      active sync   /dev/sde1
       5       8       81        5      active sync   /dev/sdf1
       6       8       97        6      active sync   /dev/sdg1
       8       8      113        7      spare rebuilding   /dev/sdh1

++++++++++++++++++++++++++++++++++++++++++

 

6. md장치들의 동작 상태를 본다.

# cat /proc/mdstat

+++++++++++++++++++++++++++++++++++++++++

Personalities : [raid6] [raid5] [raid4]
md5 : active raid5 sdh1[8] sdg1[6] sdf1[5] sde1[4] sdd1[3] sdc1[2] sdb1[1] sda1[0]
      3418687552 blocks level 5, 64k chunk, algorithm 2 [8/7] [UUUUUUU_]
      [=======>.............]  recovery = 37.5% (183166772/488383936) finish=119.0min speed=42745K/sec
     
unused devices: <none>

+++++++++++++++++++++++++++++++++++++++++

 

7. 새로 추가된 장치를 포멧을 한다.
mkfs.ext3 /dev/md5

이 글은 스프링노트에서 작성되었습니다.

2009년 9월 28일 월요일

vncserver 리눅스에 설정하기 보안터널(ssh)을 이용해서 사용

아래 내용 참조
vncserver 설정하기

1. VNC server 구축하기
vnc-server.rpm
vnc.rpm
설치

vnc설정 파일
/etc/sysconfig/vncservers

VNCSERVERS="1:root"
VNCSERVERS[1]="-geometry 800x600"

참고로 보안설정이 있는경우 포트가 열리지 않는다. 따라서 포트를 정확히 알아야하는데.
VNCSERVERS="1:root" 는 포트 번호가 기본적으로 5901번부터 포트가 할당된다.
만일 VNCSERVERS="2:root" 라면 당연히 연결포트는 5902번이 되겠다.

***********만일 보안터널을 이용하려면 이부분을 고쳐준다.**********
VNCSERVERS="1:root"
VNCSERVERS[1]="-geometry 800x600 -nolisten -nohttpd -localhost"
이렇게 해서 로컬이외의 상황에서 vnc로 접근을 하지 않도록 막는다.


설정파일 내용
위의 1:root 부분에서 1은 디스플레이 번호를 의미하며 root는 계정명을 나타낸다.
VNCSERVERS[1]="-geometry 800x600"은 1번 디스플레이 번호에 대한 해상도를 설정하는 것이다. 사용자가 많아서 디스플레이 번호가 2, 3, 4식으로 증가하면 ‘[‘와 ‘]‘사이의 숫자를 변경하여 설정하면 된다.

처음에 vnc서버를 시작하면 서버가 작동이 안되는데 그 이유는 vnc서버 사용자 root가 암호를 필요로 하기 때문이다.

암호를 만들기 위해서 다음의 과정을 따라하자
#cd ~
#mkdir .vnc
#cd .vnc
#vncpasswd ‘패스워드입력’

이제 다시 vnc서비스를 재시작하자
그러면 /root/.vnc 디렉토리 밑에 xstartup파일이 생성될 것이다

[tip1] 이제 밑의 vnc 클라이언트를 이용하여 vnc서버에 접속을 하면은 xwindow를 사용하여 자신만의 윈도우 매니저를 사용한다면 해당하는 윈도우 매니저가 안나오고 기본적인 twm이 시작할 것이다. 자신이 사용하고자 하는 윈도우 매니저가 나타나기를 원할 경우에는 $HOME/.vnc/xstartup 파일에서
#unset SESSION_MANAGER
#exec /etc/X11/xinit/xinitrc
부분의 ‘#’을 지워서 주석을 제거해준다.

[tip2] 루트는 vnc사용자에게 사용할 수 있도록 /etc/sysconfig/vncserver 파일을 설정하고 사용자는 자신의 홈디렉토리에 .vnc디렉토리를 만들고 vncpasswd 명령으로 passwd파일을 만들어야 한다.

ex) /etc/sysconfig/vncserver
VNCSERVERS="1:root 2:test 3:test2"
VNCSERVERS[1]="-geometry 800x600"
VNCSERVERS[2]="-geometry 800x600"
VNCSERVERS[3]="-geometry 800x600"

ex)일반 사용자들의 홈디렉토리에서 패스워드 설정하는 방법
$cd ~
$mkdir .vnc
$cd .vnc
$vncpasswd
Password: 패스워드 입력(6자 이상)
Verify: 패스워드 입력 확인

위의 과정에서 $HOME/.vnc 디렉토리에 passwd파일이 만들어진다.
$ls $HOME/.vnc/
passwd

2. VNC 클라이언트 사용하기
#vncviewer ip-address:디스플레이번호

************************ 만일 보안 터널을 이용해서 접근하려면 ***************
ssh -f -L 내컴에서사용할포트번호임의번호:127.0.0.1:서버에설정된서비스포트번호 ID@server_name -p ssh_port sleep 10; vncviewer 127.0.0.1:내컴에서 사용할포트번호앞에쓴거:디스플레이번호

ssh -f -L 25901:127.0.0.1:5901 ID@server_name -p ssh_port sleep 10; vncviewer 127.0.0.1:25901:1

윈도우용 vnc서버, 클라이언트는 www.tightvnc.com에 가면 다운로드 메뉴에서 찾을 수 있다.


윈도우 explorer에서 vncserver에 접속하는 방법
http://ip-address:5800+display-number
ex)http://191.111.1.1:5801 <-1번 디스플레이번호를 쓰는 루트의 접속



윈도우에서 ssh 터미널을 이용한 vnc 원격데스크탑을 사용하기 위해서 필요한 클라이언트 설정

1. putty 프로그램을 가져와 설치한다.

http://kldp.net/projects/iputty/

2. putty의 환경설정

1) [접속][SSH][X11]
x디스플레이 위치 서버에서 설정한 디스플레이번호 번호입력 (예;1)
2) [접속][SSH][터미널]
원 포트 : 원래 원격터미널에 사용할 서버의 포트를 입력한다. 일반적으로 디스플레이 번호가 1이면 5901번이 된다.
대상 : 내부아이피에 내부 할당할 내부 포트 예제처럼하면 된다.

3) [세션]
세션에 연결할 서버의 아이피와 포트번호를 입력한다. 이것은 ssh서버의 주소와 아이피 되겠다.

3. vnc 뷰어를 다운받아 설치한다.

http://www.realvnc.com/products/download.html

4. vnc 뷰어를 실행시킨다.
그리고 내부아이피와 포트번호로 접속한다.
이때 아이피와 포트는 2-3에서 설정한 대상아이피와 포트번호이다.


2009년 9월 22일 화요일

crontab 사용에 관한 방법

임베디드 시스템(Device Control) :: 네이버 카페


1) 현재 cron deamon이 돌고 있는지 확인
ps -ef | grep cron

2) cron deamon kill
kill -9 "pid of cron"

3) deamon 재실행
/usr/sbin/cron

4) 명령어 위치
/usr/bin/crontab

5) 사용형식
crontab [ -u 사용자ID ] 파일
crontab [ -u 사용자ID ] { -l | -r | -e }


1. 개요
cron(크론)은 원하는 시간에 명령(프로그램)을 시키기 위한 데몬이다.
서버는 늘 깨어있다는 것을 이용한 최대한의 활용법이 될 수 있다.

- 내가 새벽 3시에 서버에 특정 작업을 해줘야하는데 그 때 깨어있을 수 있는가?
- 또는 30분 간격으로 HDD의 사용량을 운영자에게 알리도록 해야한다면?
- 매월 초에 자료를 백업 받고 싶다면?

바로 이럴 때 cron은 최고의 해결책을 제시한다.
cron은 항상 지정한 시간이 되었는지 확인을 하여 해당 명령어을 실행하는 것이다.

시 스템의 최적화의 기법은 일정 시간 단위로 최대한의 성능을 발휘하도록 도와주는 것이다. 즉, 주기적으로 운영 중에 만들어진 필요하지 않는 임시 파일을 정리하거나, 운영체제 운영에 필요한 데이터를 갱신하는 등의 작업을 통해 리눅스가 최적의 상태를 유지할 수 있게 할 수 있다.

2. cron 설정
1) crontab 파일 위치 및 조회
작업 설정 파일을 crontab 파일이라고 부르며, 이 파일의 위치는 OS별로 차이가 있다.

리눅스는 /var/spool/cron/ID, 솔라리스는 /var/spool/corn/crontabs/ID에 위치한다.

그럼 이 파일을 직접 수정해야 하는가? 그렇지 않다. crontab 명령을 통해 설정과 조회를 한다.

crontab 설정 파일을 새롭게 편집하고자 한다면 -e 옵션을 주고, 수정하기 전에 현재 등록된 내용을 보고자 한다면 -l 옵션을 사용하며, 등록된 내용을 삭제하려면 -d 옵션을 사용한다

설정 내용을 조회해 보자(-l 옵션).
$ crontab -l

no crontab for truefeel
설정한 적이 없어 아직 비어있다.

- /etc/crontab 파일
- /etc/rc.d/init.d/crond 스크립트
- /var/spool/cron 디렉토리 내의 크론 설정 파일들

2) crontab 파일 형식
---------- ---------- ---------------------------------------------------
필 드 의 미 범 위
---------- ---------- ---------------------------------------------------
첫 번째 분 0-59
두 번째 시 0-23
세 번째 일 0-31
네 번째 월 1-12
다섯 번째 요일 0-7 (0 또는 7=일요일, 1=월, 2=화, ...)
여섯 번째 명령어 실행할 명령을 한줄로 쓴다.
---------- ---------- ---------------------------------------------------

- 모든 엔트리 필드는 공백으로 구분된다.
- 한 줄당 하나의 명령 (두줄로 나눠서 표시할 수 없음)
- # 으로 시작하는 줄은 실행하지 않는다.

설정을 해보자. (-e 옵션)

crontab -e을 하면 vi 에디터가 나온다(환경변수 EDITOR에 따라 다른 에디터를 사용할 수 있다).

$ crontab -e

# /home 디렉토리를 /BACKUP/home으로 백업해둠

#

# 30분, 새벽 4시와 낮 12시, 모든 일, 모든 월, 모든 요일

30 4,12 * * * /usr/bin/rsync -avxH --delete /home /BACKUP/home &gt; /dev/null 2&gt;&amp;1

#

# 파일/디렉토리 퍼미션 설정

# 40분, 새벽 1시, 매주 일요일

40 1 * * 0 /root/bin/perm_set.sh &gt; /dev/null 2&gt;&amp;1

위는 매일 4:30분과 12:30분에 rsync 명령을, 매주 일요일 1:40분에 perm_set.sh를 실행함을 의미한다.

3) 설정 예

시간 설정에서 몇가지 의미있는 것들을 알아보자.
- '*'표시는 해당 필드의 모든 시간을 의미한다.
- 3,5,7와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.

- 2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다.

- 2-10/3와 같이 하이픈(-)으로 시간 범위를 슬래쉬(/)로 시간 간격을 지정할 수 있다(2~10시까지 3시간 간격으로. 즉, 3, 6, 9시를 의미함).

원하는 시간 형 식
매주 토요일 새벽 2:20 20 2 * * 6 명령어
매일 오후 4,5,6시 0 4-6 * * * 명령어
매일 2시간 간격으로 5분대에 5 */2 * * * 명령어
매월 1일 새벽 1:15 15 1 1 * * 명령어
1,7월 1일 새벽 0:30 30 0 1 1,7 * 명령어

4) /etc/crontab 파일로 설정
매시 1회 자동실행하기 위한 시스템 크론 설정

01 * * * * root run-parts /etc/cron.hourly
- 매일 매시 01분마다 /etc/cron.hourly 디렉토리내에 존재하는 파일들을 실행


매일 1회 자동실행하기 위한 시스템 크론설정

02 4 * * * root run-parts /etc/cron.daily
- 매일 새벽 4시 02분마다 /etc/cron.daily 디렉토리내에 존재하는 파일들을 실행


매주 1회 자동실행하기 위한 시스템 크론설정

22 4 * * 0 root run-parts /etc/cron.weekly
- 매주 일요일 새벽 4시 22분마다 /etc/cron.weekly 디렉토리내에 존재하는 파일들을 실행


매월 1회 자동실행하기 위한 시스템 크론설정

42 4 1 * * root run-parts /etc/cron.monthly
-&gt;매월 1일 새벽 4시 42분마다 /etc/cron.monthly 디렉토리내에 존재하는 파일들을 실행


* root 이외의 사용자에게 crontab 명령어를 이용할 수 있게 하는 방법

- /etc/cron.allow 파일에 사용자의 id를 등록


* 일반사용자의 crontab 명령어사용을 제안하고자 한다면
- /etc/cron.deny 파일에 사용자의 id 를 등록

3. FAQ

1) cron 설정한 후에는 crond 데몬을 재실행해야 하나요?

아닙니다. crontab -e 으로 설정 후 빠져나오면 바로 적용됩니다.
2) truefeel 사용자는 cron을 못 쓰게 하고 싶습니다.
/etc/cron.allow : 허용할 사용자 ID 목록
/etc/cron.deny : 거부할 사용자 ID 목록
cron.allow 파일이 있으면 이 파일에 들어있는 ID만 사용 가능
cron.deny 파일이 있으면 이 파일에 들어있는 ID는 사용 불가
따라서 cron.deny에 truefeel ID를 추가해주면 됩니다.
3) &gt; /dev/null 2&gt;&amp;1 이 무슨 뜻입니까?
지정한 명령어 처리 결과와 발생할지 모르는 에러메시지를 출력하지 않고 모두 버린다는(/dev/null)는
뜻입니다. 만약 결과와 에러를 파일로 저장하려면 /dev/null 대신 파일명을 적어주면 됩니다