반응형

        SELECT

          WD.WD_IDX, WD.WD_NAME, WDM.MEMCNT

        FROM    

          TABLE1 AS WD

          LEFT OUTER JOIN

          (

              SELECT WD_IDX, COUNT(1) AS MEMCNT FROM TABLE1_SUB AS WDM WHERE WDM.WDM_DEL = 0 GROUP BY WD_IDX

          ) AS WDM ON WD.WD_IDX = WDM.WD_IDX

        WHERE    

          WD.WD_YEAR = 2020

  AND WD.WD_DEL = 0

        ORDER BY

          WD.WD_NAME ASC

 

 

        SELECT

          WD.WD_IDX, WD.WD_NAME, (SELECT COUNT(1) FROM TABLE1_SUB WHERE WD_IDX = WD.WD_IDX)

        FROM    

          TABLE1 AS WD

        WHERE    

          WD.WD_YEAR = 2020

        ORDER BY

          WD.WD_NAME ASC

반응형
Posted by Hippalus
,

반응형

pageSize = 15

SELECT 
   * 
FROM 
( 
   SELECT 
      BOARDIDX, TITLE, USERID, ROW_NUMBER() OVER (ORDER BY BOARDIDX DESC) AS IDX  
   FROM
      BOARD 
) AS RESULTS
WHERE
   IDX BETWEEN ? + 1 AND ?

.Parameters.Append .CreateParameter("@PAGE", adInteger, adParamInput, , (currentPage-1) * pageSize)
.Parameters.Append .CreateParameter("@PAGE2", adInteger, adParamInput, , currentPage * pageSize)

게시판 페이징 쿼리를 짤 때 거추장스럽게 select .... 이후 똑같은 select 쿼리를 not in 안에 넣어 불필요하게 쿼리가 길어지는 방식을 취하는 방식을 종종 볼 수 있다.
굴러만 간다면 좋지만 이런 not in 방식은 심각한 성능 저하를 초래하게 된다.
예를들어 전체 데이터가 100만건이고 분포도가 나쁜 이용자 이름 검색을 통한 게시판 결과를 보려 한다면
첫페이지는 그럭저럭 만족할만한 성능을 보여줄 것이다.
하지만 2페이지, 3페이지... 페이지가 뒤로 갈 수록 그 속도는 보장할 수 없게 된다.
(제 아무리 인덱스를 걸었다 치더라도.)

그냥 ROW_NUMBER()를 이용한다면 페이지가 뒤로 이동하여도 균등한 결과를 보장 받을 수 있을것이다.
쿼리 자체도 길어지지 않으니 사용 안할 이유가 없다.
where조건이 10개만 붙어봐라. 나중에 유지보수 하려면 본인이 하더라도 욕 나온다.

반응형
Posted by Hippalus
,

반응형

<tr>
   
<td><input type="checkbox" name="IDX" class="IDX"></td>
    <td><input type="textbox" name="NUM" class="NUM"></td>
</tr>

        $(".IDX").change(function() {
            if (this.checked) {
                $(this).closest('tr').find("td").find(".NUM").focus();
            }
        });

closest로 현재 checkbox가 속한 tr을 먼저 찾고 td에서 class가 NUM인걸 찾아 focus주면 끝

반응형
Posted by Hippalus
,

반응형

분명 xCode의 앱 이름을 바꿔줬음에도 푸시를 날리면 푸시 아이콘 옆에 앱 이름이 예전 이름으로 표시되는 경우가 존재한다.

이땐 폰 또는 시뮬레이터를 리부팅하면 간단히 해결된다.

 

Xcode: How to change App Name for Notifications Center

Rebooting the device or resetting the simulator seems to fix the issue.

https://stackoverflow.com/questions/26704849/xcode-how-to-change-app-name-for-notifications-center

반응형
Posted by Hippalus
,

반응형

node.js로 만든 서비스를 정기적으로 실행시키기 위해 일반적으로 cron을 쓰던 뭘쓰던간에 서버에 node.js 스크립트를 설치해야 한다.
문제는 서버 특성상 1대가 아닌 다수의 서버인 경우 전산관리자는 친절하게 해당 서버를 일일이 로그인 처리 해주지 않는다란 사실이다.

따라서 비로그인 상태에서도 해당 스크립트가 동작되길 바란다면 윈도우의 작업 스케줄러에 등록하여 비로그인 상태에서도 윈도우가 부팅되면 자동 실행되도록 처리하는 추가 작업이 필요하다.

일단 당연히 트리거 탭에선 시작할 때로 선택해주고 동작탭에선 아래처럼 프로그램 시작을 선택해준다.

흔히 실수하는 두가지가 있는데 하나는 이렇게 윈도우 작업 스케줄러의 프로그램/스크립트 부분을 node가 아닌 cmd로 해버릴경우 당연히 아무런 동작을 하지 않는다.

프로그램/스크립트 부분엔 node(그럴일 없겠지만 만약 node의 path가 설정되지 않았다면 node의 전체경로로 등록하여야 함)
인수 추가(옵션) 부분엔 해당 node 스크립트가 존재하는 폴더의 .js까지 모두 적어주면 정상 동작한다.

한가지 긴가 민가 한부분이 존재하는데 작업스케줄러에서 스케줄러 등록시 작업 만들기가 아닌 기본 작업 만들기로 해야 정상 동작이 하는것 같다.(삽질을 해대서 확실치 않음)

 

끝으로 일반탭에선 작업등록자를 사용자 또는 그룹 변경을 눌러 로그인 작업자가 아닌 SYSTEM으로 등록시켜주길 바란다.

반응형
Posted by Hippalus
,

반응형

참 ms는 ㅂ읍ㅅ읏 스러움.

지들 사이트 각종 kb링크들은 죄 깨지고 방치된게 부지기수고

프래임워크 역시 설치조차 못하는 상황이 빈번하다.

Windows 10. Install .NET Framework 3.5 error 0x800F0954

 

  1. regedit 실행 후 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU “UseWUServer” 를 0 으로 변경
  2. 리부팅
  3. 제어판 > 프로그램 > 프로그램 및 기능의 windows 기능 켜기/끄기에서 .NET Framework 3.5(.net 2.0 및 3.0 포함) 체크 후 인스톨(누구는 하위 펼치기를 눌러 http 체크 항목 두개를 다 체크하라지만 안해도 됨)
  4. regedit 실행 후 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU “UseWUServer” 를 1로 원상복구 변경 
  5. 리부팅

잘 좀 하자

 

 

반응형
Posted by Hippalus
,

반응형

동적으로 추가한 selectbox가 바뀔 때 해당 TD안에 다른 동적으로 추가시킨 textbox(username)의 내용을 바꾸는 스크립트

<select class="SELECTBOX_CLASSNAME">....

<input type="text" class="USERNAME"...>

        $(document).on('change','.SELECTBOX_CLASSNAME', function() {

            if ($(this).val() == "1000") {

                $(this).parent().find($(".USERNAME")).val(" ");

            }

        });

반응형
Posted by Hippalus
,

반응형

            $(".USETYPECD").each(function() {

                ROOMNUM += $(this).attr("name") + "|";

                if ($(this).has("option:selected")) {

                    USETYPECD += $(this).val() + "|";

                }

            });

반응형
Posted by Hippalus
,

반응형

       $("#DATE").datepicker();

 

        $.datepicker.setDefaults({

            defaultDate: "<%=Year(Now()) %>-<%=Month(Now()) %>-<%=Day(Now()) %>",

            dateFormat: 'yy-mm-dd',

            showOtherMonths: true,

            selectOtherMonths: true,

            prevText: '이전 달',

            nextText: '다음 달',

            monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],

            monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],

            dayNames: ['일', '월', '화', '수', '목', '금', '토'],

            dayNamesShort: ['일', '월', '화', '수', '목', '금', '토'],

            dayNamesMin: ['일', '월', '화', '수', '목', '금', '토'],

            showMonthAfterYear: true,

            yearSuffix: '년'

        });

반응형
Posted by Hippalus
,

반응형

$("#SELECTBOXID option:selected").val()

반응형
Posted by Hippalus
,