반응형
반응형

몽고 DB의 Replication을 이용하는 경우, 로그 레벨을 production 레벨로 올려도 

쓸데없이 Info 로그가 찍히는 경우가 발생을 한다.


서비스를 오래하는 경우 무자비하게 파일이 커지기 때문에, Rotate기능을 찾던 중,

Mongo Shell에서 커맨드 한번으로 Rotate가 되는 기능을 찾을 수 있었다.


아래와 같이 입력하면 된다.


mongo> use admin
mongo> db.runCommand( { logRotate : 1} )


linux command line이나 bash에서 실행하고 싶은 경우,

위 커맨드를 js 파일로 만들어서 실행이 가능하다.

만약 위 명령어가 rotate.js 라고 가정해보면 아래와 같다.

$ mongo < rotate.js


반응형
,
반응형
요즘 게임 운영 페이지 등을 만드느라, script를 짤일이 자주 생기네요.
전 java는 자신있지만.. 스크립트와 화면 관련된 속성 값은 정말 자신이 없더군요.
최근에 iframe에 웹페이지를 링크시켜서 보여줄 일이 생겨서 찾아 보는 도중에
마침 테두리때문에 고민이었는데, 투명으로 표시해주는 자료를 찾아서 아래와 같이 가져왔답니다. ^^
 
보통은
<iframe allowTransparency = "true" /> 이렇게들 사용하시는데
이것은 W3C Validation (웹표준) 에 어긋나는 문법이라고들 하더군요.
 
따라서 아래와 같이 onload시에 모든 iframe태그를 찾아서 속성을 넣어주는 방식으로 우회해서 사용한답니다.
 


<script type="text/javascript">
onload = function() {
var frames = document.getElementsByTagName('iframe');   // iframe태그를 하고 있는 모든 객체를 찾는다.
for(var i = 0; i < frames.length; i++)  {
frames[i].setAttribute("allowTransparency","true");  // allowTransparency 속성을 true로 만든다.
        }
}
</script>
반응형
,
반응형

최초 초기화 시에 .ajaxStart(), .ajaxStop() 이벤트 등록만으로 구현이 가능하다.

로딩바 이미지는 첨부파일 참고


아래와 같이 div태그를 하나 만들어서 이미지를 등록해두고,


<div id="viewLoading">
 <img src="/img/viewLoading.gif" />
</div>


아래와 같이 스타일 태그를 지정해서 가운데서 돌아가도록 만들어둔다.


<style type="text/css">
div#viewLoading {
        text-align: center;
        padding-top: 70px;
        background: #FFFFF0;
        filter: alpha(opacity=60);
        opacity: alpha*0.6;
}
</style>


이제 로딩바가 항상 돌아가는 상황이 만들어졌고,

최초 진입 시에는 돌아가면 안되기 때문에 hide를 해주고, 위에서 언급한 .ajaxStart(), .ajaxStop() 이벤트를 등록해보자.


<script>
$(document).ready(function() {    // 최초 진입 시 로딩바 div를 hide시킨다.
 $('#viewLoading').hide();
})
.ajaxStart(function() {         // ajax 통신 시작 callback (로딩바 show)
 console.log('start');
      $('#viewLoading').show();
})
.ajaxStop(function() {        // ajax 통신 완료 callback (로딩바 hide)
 console.log('end');      
       $('#viewLoading').hide();
}); 
</script>



이제 $.ajax() 함수를 호출할때마다 로딩바가 돌아가는 것을 볼 수 있다.

IE, Chrome에서 테스트 결과 문제없음.


오랫만에, front-end를 접해보니 하루종일 삽질함;;

반응형
,
반응형

Spring Controller에서 ModelAndView에 addObject로 int속성이 붙은 클래스를 넘겨서

list형태로 select box의 option value에 int속성을 넣어주어야 할 일이 있었는데..


<#list>를 이용해서 forLoop을 돌면서 숫자에 콤마를 붙여버리는 문제가 있었다.

ex) 40000 -> 40,000로 변환되어 표시됨.


해당 값을 javaScript에서는 String으로 인식을 하고, Controller단 API에서도 String으로 인식을 하게 된다.


이런 경우 ?c옵션으로 해결이 가능하다.

아래와 같이 해주면, 원하는대로 값이 표시된다.

<#list tests as test>
     ${test?c}
</#list>
반응형
,
반응형

Spring Boot가 아닌 환경에서는 기존처럼 xml만들고, web.xml 수정하고, decorator.html만 만들어서

대충 추가만 해주면 되는데,


Spring Boot는 내부적으로 해주는 일이 많다보니,

FilterRegistrationBean이라는 것을 사용해서, SiteMesh설정이 되어 있는 Filter를 등록해주어야 한다.


SiteMeshFilter 설정

public class SiteMeshFilter extends ConfigurableSiteMeshFilter {

    @Override
    protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
       builder.addDecoratorPath("/*", "/decorator/decorator.ftl");
    }
}




Spring Boot Application 설정


@SpringBootApplication
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
    
    @Bean
    public FilterRegistrationBean siteMeshFilter() {
        FilterRegistrationBean filter = new FilterRegistrationBean();
        filter.setFilter(new SiteMeshFilter());
  
        return filter;
    }
}
별도의 xml이 필요없어서 좋다.


반응형
,
반응형

플랫폼 팀이 해야할 실시간 동접 그래프 구현을 안해주길래..

직접 만들어보는걸로 하고..

이것저것 찾다보니 jquery를 이용해서 차트를 그릴 수 있는 훌륭한 라이브러리인 jqplot을 사용해보기로 하였다.

http://www.jqplot.com/

front쪽은 잘 만들어진거 잘 가져다만 써도 거의 모든게 해결이 되는것 같음..


일단 기본 프레임워크 Spring Boot로 잡고, ui표현은 가장 익숙한 jquery + freemarker를 사용하기로 하였다.


가지고 있는 API가 현재 서버에 소켓이 몇 개 붙어있는지 정도만 가져올 수 있는 API였기 때문에,

지난 시간의 동접 파악을 위해 dbms를 이용해야 한다.


dbms는 mysql 깔고 이리저리 귀찮게 하지 않기 위해, embedded hsqldb를 사용하였고,

쿼리 작성도 귀찮아서 spring jpa를 사용하였다. 

findAll을 이용해서 데이터를 가져오려고 생각해보니, 데이터 제한이 있어야 될 것 같아서 날짜로 내림차순 후 top keyword를 사용하여

개수 제한을 두어, 데이터 량이 넘치면 차트가 서서히 밀리도록 구현함.


이제 문제는 데이터 수집인데.. 이것도 별도 데몬을 띄워서 스케줄링으로 돌리긴 너무나도 귀찮아서

Spring Boot가 올라갈 때 Quartz세팅을 하여, 올라가는 순간부터 API를 호출하여 데이터를 수집하는 방식으로 하였다.


이제 남은건 차트 표현인데, 너무나도 간단하게 잘 만들어져 있음.


최초에 API를 통해서 x, y좌표의 데이터를 배열형식으로 리턴받아, jqplot에 전달을 하고,

setTimeout + ajax call을 적용하여, ui단에서 실시간으로 갱신이 되도록 하였다.


위에서 설명한걸 소스로 표현하면, 대충 아래와 같은 느낌임. (UI단만;)


<link href="css/jquery.jqplot.min.css" rel="stylesheet" />
 
<script src="js/jquery-2.1.4.min.js"></script> 
<script src="js/jquery.jqplot.min.js"></script>
<script src="js/jqplot.dateAxisRenderer.min.js"></script>
<script src="js/jqplot.highlighter.min.js"></script>

<script>
  var plot;
  var chartData = [[0,0]];    // 초기화를 []로 해주면 차트가 안그려짐. ㅠㅠ
  
  $(document).ready(function() {
      renderChart();
      update();
  });
  
  function renderChart() {
      plot = $.jqplot('chart', [chartData], {
          title: 'Current User'
          , axes: {
              xaxis: {
                 renderer:$.jqplot.DateAxisRenderer     // X축을 날짜로 표현할 것이다.
                 , tickOptions: {
                     formatString: '%m-%d %H:%M:%S'   // 이건 다 아시는 dateformat임.
                     , showLabel: false           // 데이터가 많아지면 X축이 보이지도 않을 정도가 되서 제거
                     , showGridline: false        // 데이터 많아지면 세로라인때문에 눈이 아프더군.. 그래서 제거
                 }
                , tickInterval:'5 minutes' // X축 간격을 5분 주기로 띄운다.     
             }
          }
          , series: [{
             color: '#5FAB78'
          }]
          , highlighter: {        // X축이 뭔지는 알아야 되니깐 마우스 오버 기능을 활용하기 위해 추가함
              show: true,
              sizeAdjust: 7.5           
          }
          , cursor: {
              show: false
          }
      });
  }
  
  function getChartData() {
      $.ajax({
         url: 'getCurrentUser'
         , type: 'GET'
         , success: function(data, textStatus, jqXHR) {
             chartData = data;
           
             plot = $.jqplot('chart', [chartData], {
               title: 'Current User'
               , axes: {
                   xaxis: {
                      renderer:$.jqplot.DateAxisRenderer
                      , tickOptions: {
                          formatString: '%m-%d %H:%M:%S'
                          , showLabel: false
                          , showGridline: false
                      }
                      , tickInterval:'5 minutes'
                   }             
               }
               , series: [{
                   color: '#5FAB78'
               }]
               , highlighter:{
                   show: true,
                   sizeAdjust: 7.5           
               }
               , cursor: {
                   show: false
               }
             }).replot();    // 다시 그릴 땐 replot을 활용해야 함.
          }
          , error: function(e) {
             console.log(e);
          }
      });
  }
  
  function update() {
      getChartData();
      setTimeout(update, 1000 * 60 * 2);      // 2분 주기로 갱신
  }
 </script>



body에는 <div id="chart"></div> 이런거 하나 추가해주면 된다.


주석 달려있는 것들만 삽질한 부분이고, 나머지는 그냥 아무거나 붙여다가 적용해도 문제없음.


생각대로 표시가 안되는게 있으면, 무조건 js 파일 누락이니, 다시 확인해야 함. 

반응형
,
반응형

millisecond 형태의 숫자를 Date (yyyymmdd) 형태로 바꾸어서 보여주어야 하는 경우가 있었다. 


new Date(millisecond)와 같이 변환을 하면되는데, 나는 yyyymmdd만 보고 싶은데 어떤 시간대인지까지 모든 정보가 포함되어 표시가 되게 된다.


문자열 자르는게 익숙한 분들은 그렇게 하면되는데, 난 문자열 가지고 이리저리 조잡하게 하는걸 싫어하기 때문에, 알아본 결과 Date에 내장함수처럼 포함을 시켜버리는게 가장 편했던 것 같다.


Date.prototype.yyyymmdd = function() {         
         var yyyy = this.getFullYear().toString();                                    
         var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
         var dd  = this.getDate().toString();             
                             
         return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};  


 


이런 형태로 선언해 놓으면, date 타입을 가진 모든 객체에서 위 함수가 이용이 가능하다. 

하지만 이것도 결국 내부적으로는 문자열 자르는 조잡한걸 한다는게 함정. 

 

예전 유지보수 할 때 prototype이 뭔가 했었는데, 이제야 알게 된 것 같다. 

반응형
,
반응형

ajax통신을 마친 이후, success callback에서 현재 객체(this)의 상태값을 바꾸어야 하는 경우가 있을 수 있다.


하지만, jquery에서 제공하는 $.ajax의 경우 success callback을 등록하면, this에 response데이터가 들어간다.


이런 경우에 context: this라고 $.ajax통신 시에 argument로 포함해서 던지면,

proxy 형태로 가져올 수 있도록 처리가 되어, callback에서도 사용가능하도록 세팅이 된다.


아래와 같이!



$.ajax({
      url: 'item/get'
      , type: 'post'
      , dataType: 'text'
      , data: data
      , context: this    // 이걸 추가해야됨.
      , success: function(response) {
                   // 여기서 this를 사용하고 싶음!
      }
      , error: function(e) {
           console.log(e);
     }
});
반응형

'개발 > Front-End' 카테고리의 다른 글

[Jqplot] 실시간 차트 구현  (0) 2016.06.10
[Javascript] 날짜 포맷 변환  (0) 2016.06.10
[CSS] 텍스트 말줄임  (0) 2016.06.10
[HTML] favicon 추가  (0) 2016.06.10
[JavaScript] byte formatter  (0) 2016.06.10
,
반응형

아래와 같이 스타일을 추가한다.


<style>
    .vf_ellipsis { 
         overflow:hidden; 
         text-overflow:ellipsis; 
         -o-text-overflow:ellipsis; 
         -ms-text-overflow:ellipsis; 
         white-space:nowrap; 
         position:relative; 
         float:left;
         width:auto; 
         max-width:360px; 
    }
</style>



실제 사용은 <p class="vf_ellipsis">입력 텍스트</p>


텍스트가 너무 길어지면 ... 으로 표시되어, UI가 깔끔해진다.

반응형
,
반응형
<link rel="shortcut icon" type="image/png" href="favicon.ico"/>

HEAD 태그에 위 구문만 넣어주면 된다.

href에는 웹주소도 가능함.


사이즈는 16 * 16에 png형식으로 만들어주어야 함.

반응형
,
반응형