728x90

사용자가 직접 클릭하지 않고 자동으로 클릭이 되는 기능을 동작시키고 싶을 때가 있다.

왼쪽 메뉴를 클릭하거나 로그인 버튼을 눌렀을 때 팝업 모달이 자동으로 실행되게 하고 싶은데 처음에는 좀 해맸다.


로직에 대한 기본 이해 부족이었다.

동작 순서를 고려하여 순차적으로 실행되게 해야 한다.


1. 왼쪽 메뉴를 누르면

2. a href 링크의 고유 기능은 이벤트 실행 금지 시킨다. e.preventDefault();

3. 우측 content 에 원하는 걸 load 시킨다.

    $('.memberModify').on('click',function(e){
        var uri = $(this).attr('href');
        if(uri != '#'){
            $('#panel_content').load(uri);
        }
    });

4. load 되는 곳에 특정 키워드가 포함되어 있고 또 클릭을 해야 하는 불편이 있다면...

    $('.memberModify').on('click',function(e){
        e.preventDefault(); // a 링크 실행 방지
        var uri = $(this).attr('href');
        if(uri != '#'){
            $('#panel_content').load(uri,function(){
                if($('#modalLoginClick:contains("눌러주세요")')){
                    $('#modalLoginClick').trigger('click'); // 자동 클릭
                }
            });
        }
    });


trigger 메소드를 사용하면 자동 클릭이 되는 걸 확인할 수 있다.

load 시킨 다음에 자동 클릭이 되어야 정확하게 원하는 결과가 나왔다.


ㅇ trigger(eventType)
  eventType는 이벤트의 타입을 지정하는 문자열로써 click, dblclick, focus, blur 등등 해당 이벤트를 구동한다.




블로그 이미지

Link2Me

,
728x90

이미지 아이콘을 찾아야 할 때 유용하다.


https://www.flaticon.com/


https://www.iconfinder.com/


블로그 이미지

Link2Me

,
728x90

jQuery 에서 검색어를 입력하고 엔터키를 누르면 검색이 실행되도록 하는 코드를 테스트하는데 자꾸 오동작이 발생한다.

한마디로 개념 부족에서 오는 현상이었다.

프로그램은 절대 거짓말 하지 않는다는 지인의 말이 생각난다.

구현하려는 로직과 내가 코딩하는 것의 사이에서 놓치는 점이 무엇인가 다시 고민해보자.


처리하려는 로직을 순서대로 적어본다.

1. 엔터키를 입력할 때까지는 어떠한 것도 하지 않는다.

2. 엔터키가 입력되면 event.preventDefault(); 를 실행하여 자동으로 서밋되는 걸 방지한다.

3. 원하는 결과를 실행한다.


if(parseInt(device_type) === 3){ // PC에서 입력한 코드인지 확인
    // 27 is the ESC key (익스플로어나 크롬에서는 27로 나오고 파이어폭스는 0)
    $('#BBSSearchKeyword').on('keypress', function(event){
        var keycode = (event.keyCode ? event.keyCode : event.which);
        if(keycode == 13){ // 엔터키가 입력될 때까지는 어떤 것도 하지 않는다.
            event.preventDefault(); // 엔터키가 입력되면 이벤트의 기본 동작을 중단한다.
            //event.stopPropagation(); // 현재 이벤트가 상위로 전파되지 않도록 중단한다.
            BBSSearch(uri,where,keyword);
        }
    });
}

크롬브라우저 정상 동작, Firefox 브라우저 정상 동작
익스플로러에서 실행하니까 한글 입력 결과의 텍스트가 깨지면서 정확한 결과를 반환하지 않는다.
코드에서 UTF-8 을 기본으로 인식하는 코드를 추가해줘야 하나보다.

encodeURIComponent : URI로 데이터를 전달하기 위해서 문자열을 UTF-8 인코딩, IE8 이상의 브라우저에서 모두 지원한다.


블로그 이미지

Link2Me

,
728x90

jQuery 에서 값 입력 여부를 체크하는 걸 반복적으로 하니까 좀 귀찮은 거 같아서 간단하게 처리하는 걸 시도했다.


함수 만들기 이전 입력값 체크

if($('select[name=cat1]').val().length == 0){
    alert('카테고리1 선택을 안했습니다.');
    $('select[name=cat1]').focus();
    return false;
}
if($('select[name=cat2]').val().length == 0){
    alert('카테고리2 선택을 안했습니다.');
    $('select[name=cat2]').focus();
    return false;
}
if($('input[name=userID]').val().length == 0){
    alert('아이디를 입력하세요');
    $('input[name=userID]').focus();
    return false;
}
if($('input[name=userNM]').val().length == 0){
    alert('성명을 입력하세요');
    $('input[name=userNM]').focus();
    return false;
}


함수를 만들고 나서 입력값 체크

function CheckErr(vsel,msg){
    var count = vsel.val().length;
    if(count < 1){
        alert(msg);
        vsel.focus();
        return false;
    }
    return true;
}


if(CheckErr($('select[name=cat1]'),'카테고리1 선택을 안했습니다.') == false) return false;
if(CheckErr($('select[name=cat2]'),'카테고리2 선택을 안했습니다.') == false) return false;
if(CheckErr($('input[name=userID]'),'아이디를 입력하세요.') == false) return false;
if(CheckErr($('input[name=userNM]'),'성명을 입력하세요.') == false) return false;


블로그 이미지

Link2Me

,
728x90

PHP 에서 배열 데이터를 json_encode 로 생각없이 넘겨주면 jQuery JSON 에서 처리를 쉽게 해결될 줄 알고 구글링하면서 이것 저것 찾아서 해결하면 금방 잊어버리고 그랬다.

분명히 예전에 했던 것인데 다시 할려고 하니까 시간을 또 허비하고 있다.

뭔가 대충해서 문제가 있는 거 같아서 집중적으로 테스트를 해봤다.


먼저 PHP에서 넘겨주는 데이터 파일을 보자.

 <?php
require_once 'path.php';
require_once $g['path_center'].'config/config.php';
require_once $g['path_class'].'connect.php';
require_once $g['path_class'].'dbDataClass.php';
$c = new DBDataClass;
$sql ="select idx,userNM,telNO,mobileNO,codeID FROM member ";
$sql.="where userID='".$_REQUEST['userID']."'";
$result = mysqli_query($db,$sql);
$R = array();
if($row = mysqli_fetch_assoc($result)):
    array_push($R,$row);
endif;

//echo '<pre>';print_r($R);echo '</pre>';
echo json_encode($R);
//echo json_encode(array('rs' => $R));
?>


보다시피 배열로 만들어진 결과를 json_encode 한 다음에 echo 문으로 출력을 한 것이다.


이제 클라이언트 JSON 처리 파일을 살펴보자.

결과 그림부터 보고 아래 코드를 살펴보면 뭐가 다른지 보인다.

문자열은 중괄호({})로 둘러쌓여 있는데, PHP에서 넘겨온 데이터는 대괄호([])가 있고 중괄호({})가 있는 형태다.

이렇게 데이터 형태가 다른데 이걸 JSON.parse 만 하면 원하는 object 로 되는 줄 알고 처리를 시도했더니 결과가 나오지 않았던 것이다.

이걸 stringify 하여 문자열로 변환한 다음에 split 으로 대괄호 부분을 제거하고 다시 JSON.parse 를 하면 원하는 결과가 나온다.

var obj = JSON.stringify(msg); // 문자열로 변경된다.
var objsplit1 = obj.split(']');
var objsplit2 = objsplit1[0].split('[');
var rs = JSON.parse(objsplit2[1]);
console.log('idx = '+rs.idx);


이렇게 처리하거나 배열로 뽑아내서 원하는 결과를 얻어서 처리하는 방법이 최선이다.

var arr= new Array();
$.each(msg, function(key, obj){
    $.each(obj,function(k,value){
        arr.push(value)
    });
});


<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<h2>JSON Object, String</h2>
<p id="txt"></p>
<p id="obj_parse"></p>
<p id="obj"></p>
<p id="post_msg"></p>
<p id="ajax_msg"></p>
<p id="json2string"></p>
<p id="stringify"></p>
<script>
var txt = '{"name":"홍길동", "age":30, "city":"서울"}';
$('#txt').html('문자열 : '+txt);

var obj = JSON.parse(txt);
$("#obj_parse").html(obj.name + ", " + obj.age);

document.getElementById("obj").innerHTML = obj;
// $("#obj").html(obj); // 출력 결과물이 화면에 표시하지 못한다.

$.post('json.php',{userID:72771381},function(msg){
    console.log(msg); // 결과가 문자열로 넘어온다.
    //document.getElementById("post_msg").innerHTML = msg;
    $('#post_msg').html(msg);
});

$.ajax({
    url: "json.php",
    type: "POST",
    data: {userID:72771381},
    dataType: "JSON",
    success: function (msg) {
        console.log(msg);
        document.getElementById("ajax_msg").innerHTML = msg;
        var obj = JSON.stringify(msg); // 문자열로 변경된다.
        $('#json2string').html(obj);
        var objsplit1 = obj.split(']');
        var objsplit2 = objsplit1[0].split('[');
        console.log(objsplit2[1]);
        var rs = JSON.parse(objsplit2[1]);
        console.log('idx = '+rs.idx);

        var arr= new Array();
        $.each(msg, function(key, obj){
            $.each(obj,function(k,value){
                arr.push(value)
            });
        });
        console.log(arr);
    }
});


var myObject = new Object();
myObject.name = "왈패";
myObject.age = 12;
myObject.pets = ["cat", "dog"];
var myString = JSON.stringify(myObject);
$("#stringify").html(myString);

</script>
</body>
</html>
 


마지막 myObject 를 JSON.stringify 를 하면 맨 처음과 똑같은 형태의 중괄호({})로 둘러쌓인 문자열이 만들어진다는 걸 확인할 수 있다.


결론 PHP 에서 넘어온 JSON 형태는 jQuery 가 처리하려는 형태와 약간 다르므로 이걸 고려해서 파싱처리해야 한다는 것이다.

블로그 이미지

Link2Me

,
728x90

PHP에서 json_encode 로 데이터를 만들어서 jQuery 에서 ajax를 이용하여 원하는 데이터를 처리하는 방법이다.


$sql ="select userNM,telNO,mobileNO,codeID FROM member ";
$sql.="where userID='".$_REQUEST['userID']."'";
$result = mysqli_query($db,$sql);
$R = array();
if($row = mysqli_fetch_assoc($result)):
    array_push($R,$row);
endif;
echo json_encode($R);
 



jQuery ajax 로 결과를 받은 데이터는 JSON object 인데 그냥은 원하는 결과를 파싱할 수가 없다.

실력이 부족해서인지 개념부족인지 여기서 막힌다.

( 참조하면 왜 그런지 알 수 있다 : https://link2me.tistory.com/1595 )

그래서 Array로 변환하여 데이터를 처리했다.


 $('#getStaffData').on('click',function(){
    var userID = $('input[name=userID]').val();
    if(userID.length == 0){
        alert('입력값이 없습니다.');
        $('input[name=userID]').focus();
        return false;
    }

    $.ajax({
        url: "StaffFetchData.php",
        type: "POST",
        data: {userID:userID},
        dataType: "JSON",
        success: function (data) {
            //console.log(data);
            var arr= new Array();
            $.each(data, function(key, obj){
                $.each(obj,function(k,value){
                    arr.push(value)
                });
            });
            console.log(arr);
            $('input[name=userNM]').val(arr[0]);
            $('input[name=telNO]').val(arr[1]);
            $('input[name=mobileNO]').val(arr[2]);
            $('#codeID').val(arr[3]);
        }
    });

});


로컬에서 만든 임의의 데이터와 PHP를 통해 가져온 데이터의 차이점이 있다는 걸 알아야 한다.

Android 에서 JSON 데이터를 파싱처리하고자 한다면 파싱 처리하는 코드를 알아야 처리할 수 있다.

블로그 이미지

Link2Me

,
728x90

정해진 클래스가 아니면 동작이 안된다. bootstrap 3에서 잘 동작하던 걸 MDBootstrap 기반에서 동작되도록 하려면 Class 속성을 정확하게 알아야만 가능한 거 같다.


select 일반 속성을 적용하고자 할 때


<select name="where" class="browser-default custom-select" >
    <option value="unify">통합</option>
    <option value="userNM">성명</option>
    <option value="mNO">휴대폰</option>
</select>


자료 입력을 편하기 위해서 엔터키를 치면 자동으로 검사하는 코드를 추가했더니 먹통이 되는 증상이 보였다.

스마트폰에서는 엔터키를 입력하는 걸 추가하면 안되더라.

그래서 PC에서만 동작하는 코드를 검사하여 추가하는 걸로 코드를 변경했다.

구글링으로 검색해서 찾은 코드로 테스트했더니 잘 안되어서 PHP 코드에서 Device를 검사한 다음에 코드화를 통해서 해당 코드값을 인식하고 자바스크립트 코드는 코드의 하단에 추가하여 순차적으로 읽을 때 PHP 값을 읽을 수 있도록 했다.


<?php require_once 'deviceChk.php';?>

<script>

var device_type = "<?php echo $mtype;?>";

//alert(typeof device_type); // string 으로 인식하는 걸 확인할 수 있다.


if(parseInt(device_type) > 2){ // 정확한 검사를 위해 정수형으로 변환하여 부등 비교를 했음
    $('#BBSSearchKeyword').keypress(function(e){
        e.preventDefault();
        if(e.keyCode == 13 || e.which==13){ // 검색어 입력하고 엔터키를 누르면
            BBSSearch(uri,where,keyword);
        }
    });
}






블로그 이미지

Link2Me

,
728x90

jQuery UI 팝업창이 최상단 정중앙에 오지 않고 이상하게 보이는 증상 때문에 삽질을 엄청했다.


https://jqueryui.com/download/all/ 에서 가장 최신버전을 받아서 홈페이지에 필요한 파일을 옮긴다.

가장 최신버전이 2016.9월에 올라온 버전이다.


<div id="dialog" title="회원 현황"></div>


HTML 파일 하단에 팝업창을 띄울 dialog DIV를 적어준다.


헤더에 다음과 같이 경로에 맞게 두줄을 추가한다.

<link href="css/jquery-ui.css" rel="stylesheet">
<script type="text/javascript" src="js/jquery-ui.js"></script>


테이블에 id를 추가하고 tr 에 uid 값이 기록되도록 코드에 추가한다.

<table id="BBSListTable" class="table table-striped table-bordered table-hover">
<tbody>
<tr id="<?php echo $R['uid']; ?>">


제어를 위한 jQuery 코드를 아래와 같이 작성한다.

$('#BBSListTable tbody tr').click(function() {
    var idx = $(this).attr('id');
    BBSView(idx);
}).mouseover(function() {
    $(this).children().css({
        'backgroundColor' : '#DCDCDC',
        'cursor' : 'pointer'
    });
}).mouseout(function() {
    $(this).children().css({
        'backgroundColor' : '#FFFFFF',
        'cursor' : 'default'
    });
});

function BBSView(idx){
    $('#dialog').load('BBSView.php?idx=' + idx, function() {
        $(this).dialog({
            autoOpen : true,
            title : '회원정보',
            width: 450,
            height: 300,
            draggable: true,
            position: { my: "center", at: "center", of: window },
            buttons : {
                "수정" : function() {
                    gocStaffModifyView(idx);
                },
                "삭제" : function() {
                    gocStaffDelete(idx);
                },
                "닫기" : function() {
                    $(this).dialog("close");
                }
            }
        });
    });
}
 


position: { my: "center", at: "center", of: window } 이 한줄의 옵션을 몰라서 엄청 해멨다.

이 한줄로 고민은 싹 해결되었다.







블로그 이미지

Link2Me

,
728x90

jQuery Paging 처리를 완벽하게 한 것은 아니지만 PHP 와 연동하여 기본적인 처리를 하도록 만들어봤다.

함수는 재귀호출이 가능하다는 점을 활용했다.


https://www.w3schools.com/bootstrap4/bootstrap_pagination.asp 에 Bootstrap 4 Pagination 에 대한 기본 설명이 잘 나왔다. Pagination 은 HTML 코드의 <ul>태그와 <li>태그를 활용하여 모양이 예쁜 Pagination 이 만들어진다.

보통 jQuery 와 연동되는 Pagination 처리에서는 href="#" 으로 해서 해당 URL로 연결되지 않고 jQuery 코드상에서 처리한다.

PHP 코드와 잘 연계하여 Paging 이 처리되는 함수를 만든 다음에 jQuery 와 연동하면 코드를 크게 고려하지 않고도 잘 만들 수 있을 거 같다.


function BBSListTable(where,keyword,curPage){
    $('#panel_content').load('BBSList.php?where='+where+'&keyword='+keyword+'&p='+curPage, function() {
        var curPage = $('#paging .act a').text();
        $('#paging li').click(function(e) {
            e.preventDefault();
            switch($(this).text()){
                case '◁':
                    curPage=parseInt($(this).next().text()) - 1;
                    break;
                case '▷':
                    curPage=parseInt($(this).prev().text()) + 1;
                    break;
                default:
                    curPage = $(this).text();
                    break;
            }
            BBSListTable(where,keyword,curPage); // 재귀호출 가능
        });

        $('#BBSHome').click(function(e){
            e.preventDefault();
            BBSListTable('','','',1);
        });

        $('#BBSSearch').click(function(e){
            var where = $('[name=where]').val();
            var keyword = $('[name=keyword]').val();
            if(keyword =='' || keyword == 'undefined'){
                alert('검색어를 입력하세요');
                $('input[name=keyword]').focus();
                return false;
            }
            BBSListTable(where,keyword,1);
        });

        // 검색어 초기화
        $('#BBSKeywordReset').click(function(){
            $('input[name=keyword]').val('');
        });

    });
}
 





블로그 이미지

Link2Me

,
728x90


GAS(Great American Sound) 라고 하면 봉죠르노 와 고질라, 앰프질라, 토베 등의 앰프들이 연상이 많이 될것 같다. 

거기다 최근에 다시 앰프질라 2000 까지 내놓았으니까 노익장을 과시하는 GAS 인것은 틀림이 없는데 사실 오래전에 도산을 했던 회사이기도 하다. 
  
정말 우연히 얻게 된 것이 사진의 저 테드라 II 프리앰프인데 보기에는 저리 보여도 대단히 고급스럽고 소프트한 사운드를 제공해주는 프리앰프이다. 당시에는 보기 드물게 슬롯 형식으로 기판이 장착되어 있었고 정밀한 볼륨의 만듦새 까지... 
무엇보다도 훌륭한 것은 뛰어난 성능의 포노단이다. 상태가 좋은것이 있다면 한번 써봐도 좋을듯... 
  
라인단도 현대 하이엔드기기에 절대 뒤지지 않는 성능을 가지고 있습니다. 220V에 상태는 깨끗합니다. 테드라2는 1에 비해 약400 불 정도 더 고가로 출시된 모델입니다. 

프리앰프에서는 열이 굉장하며 음의 분리도나 해상력 포커싱/ 정위감 등 하이엔드 프리 크렐이나 MBL 등과 비교하여도 부족함이 없을 정도로 드라이빙 능력이 뛰어나며 프리 무게는 왠만한 파워앰프 무게(12KG)이니 굉장한 물량투입 입니다 
지금도 이 프리를 듣고 있는데 들을수록 소리가 기가 막히다. 
처음들었을 땐 개방감이 좀 떨어지는 것 아닌가하는 생각이 들었으나 차분하고 정숙하면서 섬세함이 너무 뛰어나다. 
  
볼륨은 어테뉴이터 볼륨이고 특이하게 좌/우 따로따로 소리변화를 줄 수 있도록 되어 있다. 
테드라 1은 손잡이가 없으나 테드라2는 손잡이가 있고 외관도 더 고급스럽다. 


막귀라서 그런지 몰라도 선배집에서 들어본 중고가 1천만원이 훌쩍 넘어가는 소리와 울집에서 저렴하게 구성한 조합이랑 소리차이를 거의 느끼지 못하겠다.

2억을 호가하는 스피커를 물리치고 당당히 자리잡았노라고 하신 지인분의 집에서 듣어본 자작스피커 소리는 정말 지금도 있을 수가 없지만 3천만원짜리 앰프를 물리쳤노라 하는 독일산 모앰프 소리도 물려보고 몇가지 물려봤지만 

이정도 가격대로 이만한 소리를 내주는 건 찾기 힘들지 않을까 싶다.
  

2011년도 장터에서 거래되는 가격기준으로 

테드라2 프래임프의 통상적인 장터거래가는 95 ~ 110만원선 
테드라1 프리앰프의 통상적인 장터거래가는 75~90만원선 
토비 프리앰프의 장터거래가는 60만원선 
탈리아 프리앰프의 장터거래가는 35 ~ 45만원선



=========================================================

추억을 간직하고자 네이버 블로그에 기록했던 게시글을 옮겨적은 겁니다.

탈리아 프리앰프를 구입했을 때 고장난 포트가 있어서 팔지도 못하고 부천 수리센터에 수리비로 대신했던 아픈 기억이 새록 새록납니다.

지금은 오디오 열심히 안하지만 수리는 서초국제전자 노용일기사님께 의뢰하고 있습니다.

'음악 > 오디오' 카테고리의 다른 글

Rega DAC 및 스텔로 U3  (0) 2021.07.07
하플러 DH 500 파워앰프(명기)  (1) 2019.01.19
산수이 TU-717 튜너, 데논 3805, 야모 스피커  (0) 2018.12.30
블로그 이미지

Link2Me

,
728x90

미국 하플러 사의 DH-500 파워엠프 입니다. (명기 100선에 올라온 앰프) 


본 글은 2011.7.16일 네이버 블로그에 올렸던 글을 이곳으로 옮겨 적은 것입니다.


혹시 다이나코 앰프를 아시나요 ?
하플러 앰프의 제작자가 진공관 애호가들은 한번씩 거쳐가는 다이나코사의 ST 70 이란 EL34 진공관 푸시풀 앰프로 유명한 David Hafler 입니다

파워앰프는 출력회로 최종단에 MOS-FET라고 부르는 하이브리드 회로를 구성하여 의율을 적게 만든 것이 특징이며 고출력의 파워앰프로서 A 클라스 증폭방식입니다. 출력부에 열이 많아지므로 팬을 설치하여 송풍장치가 방열판을 과열로부터 보호하게 하였습니다. 
  
데이비드 하플러의 최고의 걸작이라는 표현을 받는 제품으로서 하플러란 네임벨류를 각인시켜 놓은 하플러 최고의 명기 파워엠프 입니다. 
저렴한 가격대비 출중한 출력과 부드럽고 섬세한  음색 좋은 댐핑능력이 장점으로 손꼽히며 
프로용과 가정용 버전 2가지로 출시되었지만 앞면패널과 랙의 유무만 제외한다면 내부설계는 같은것 으로 알고있습니다. 
하이앤드 유저분들이 값싸게 사용할수 있고 좋은소리로 보답해줘 파워엠프 명기 리스트엔 손꼽힐정도로 인기있던 제품이였습니다.

현재는 물건이 자주 보이지 않아 귀한 제품이 되었으며. 체널당 250w+250w 의 좋은출력을 지원하므로

업소에서도 많이 사용하는 제품으로 손꼽힙니다. 자체 내부의 팬을 달려있지만 아주 심하게 열을 받지 않는이상 돌아가지 않으므로 소음걱정이나 트렌스험 걱정 전혀안하셔도 됩니다. 

트렌지스터 12구가 채용되었으며 큼직한 상가모 컨덴셔와 미제 트렌스가 눈에 돋보입니다. 
전원은 117V 이며 결선을 변경하면 220V로도 변경 가능합니다. 
케이블 선재를 바꾸면 선재에 따른 소리변화를 그대로 표현해주어 참맛을 느끼게 해줍니다. 
파워케이블, 인터케이블, 스피커케이블 모두 교체에 따른 소리변화가 심할 정도로 그대로 투명하게 전달을 해준다고나 할까요. 
이 앰프를 통해서 파워케이블에 의한 소리변화가 심하다는 것을 느꼈고 골든스트라다 # 302 파워케이블에 물려서 어느정도 에이징이 되고 난 후에는 
소리가 아닌 음악으로 들리더군요. 들어도 더 듣고 싶어지도록 만든다고나 할까요.. 
또한 프리앰프를 고급 프리를 물리면 하이엔드 소리를 들려주고, 싼 프리를 물리면 그 가격대의 적당한 소리를 내주죠. 
  
[와싸다 이석영님의 평가글] 
좌우지간 이 파워의 성능은 앰프기술의 완성은 반세기전에 끝났다"라는 말을 그대로 반영하는듯 별로 흠잡을 때가 없는 음을 재생한다. 우선 이 앰프는 사운드를 재단하듯 도마질하는 정교한 맛이나 깔끔한 배경처리, 개방감이 현저한 고역, 약간 부족한듯 하지만 타이트하게 조여진 저역으로 귀결되는 요즘 하이엔드적 튜닝과는 다소 거리가 먼 편이다. 그렇다고 과도하게 중역대를 부풀려 음악성이라는 미명아래 디테일부족과 밸런스의 부조화를 숨기고 묻어가는 그런류의 앰프는 더욱 아니다. 

이 파워는 우선 푸르른 청량감이 리스너의 기분을 좋게하며 스멀거라며 사운드의 말단까지 퍼지는 잔향감이 뛰어난 앰프로 볼 수 있다. 색채감이 있지만 투명한 색깔이어서 착색이라고 규정하기 어렵고 본래 착색앰프들을 보면 중역대에 그 에너지가 몰려있는 반면 하플러500은 중역대가 외려 살짝 빈듯한 소리로 튜닝되어있다. 

소위 뭉쳐진 허릿살이 보이지 않은 뛰어난 음색이고 하플러220에서 아쉬웠던 저역대의 공허감도 느낄 수 없이 적당한 양감을 가지고 있다고 할 수 있겠다. 즉 중.고역 위주로 튜닝된 앰프가 아니라 전체적인 밸런스가 아주 양호하다고 판단되는 스타일이다. 

이 파워를 듣다 잠깐 빼고 이번엔 B&K의 소나타파워를 물렸더니 개방감. 음장이 확 살아 올라서 또 놀랬었지만 몇 번의 비교청취를 해보니 대드함과 라이브함이 적절하게 믹스된 하플러500쪽의 우위를 들어줄 수 밖에 없었다. B&K에선 젊은 혈기는 느낄 수 있었지만 원숙한 이미지는 찾을 수 없었기 때문이다. 

나온지 꽤 된 파워라서 요즘의 하엔드와 비교하는 건 무리일 수 있겠지만 소리를 음악적으로 풀어내는 재주와 전대역의 밸런스. 브라이트하면서도 결코 거칠거나 싸구려냄새가 나지 않는 이 파워를 접하면 하플러라는 사람의 재능을 다시금 평가하게 될만큼 잔잔한 감동을 받게될 것이다

'음악 > 오디오' 카테고리의 다른 글

Rega DAC 및 스텔로 U3  (0) 2021.07.07
테드라2 프리앰프  (2) 2019.01.19
산수이 TU-717 튜너, 데논 3805, 야모 스피커  (0) 2018.12.30
블로그 이미지

Link2Me

,
728x90

JSON.parse() : JSON 문자열을 JSON object로 변환시켜준다.

$.parseJSON(data); // JSON 문자열을 JSON 객체(JavaScript object) 로 변환시켜 준다

JSON.stringify : JSON object를 JSON 문자열로 변환시켜 준다.



다음 예제를 직접 실행해보면 내용을 이해할 수 있다.

 <!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<form id="form1" runat="server">
    <div>
        <div id="result"></div>
    </div>
</form>

<script>
$(function () {
    // json 객체 정의
    var employee = { "name": "홍길동", "address": "용인시 죽전동", "phone": "555-4567" };

    // JSON.stringify를 사용하여 String으로 변환한다.
    var jsonstring = JSON.stringify(employee);
    $("#result").append('<p>json string: ' + jsonstring + '</p>');

    // JSON.parse function을 사용하여 JSON string을 JSON 객체(object)로 변환
    var jsonobject = JSON.parse(jsonstring); // $.parseJSON(jsonstring) 사용해도 된다.
    var info = '<ul><li>Name:' + jsonobject.name + '</li><li>Street:' + jsonobject.address + '</li><li>Phone:' + jsonobject.phone + '</li></ul>';

    $("#result").append('<p>json object:</p>');
    $("#result").append(info);
});
</script>
</body>
</html>


블로그 이미지

Link2Me

,
728x90

####  find 명령어로 특정 디렉토리 내 특정 파일들의 특정 문자열 일괄 변경하기
find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/변경할문자열/변경된문자열/g' {} \;

# sed는 모든 특수 문자에 '\'을 붙여야 한다.

## 변경할 대상을 찾는다. DB 접속은 $db 로 처리하는 경우다.
mysql_num_rows
mysql_fetch_row
mysql_fetch_assoc
mysql_fetch_array
mysql_query(
mysql_error(
mysql_close(
mysql_insert_id(

find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/mysql_num_rows/mysqli_num_rows/g' {} \;
find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/mysql_fetch_row/mysqli_fetch_row/g' {} \;
find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/mysql_fetch_assoc/mysqli_fetch_assoc/g' {} \;
find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/mysql_fetch_array/mysqli_fetch_array/g' {} \;
find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/mysql_query\(/mysqli_query\(\$db,/g' {} \;
find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/mysql_error\(/mysqli_error\(\$db/g' {} \;
find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/mysql_close\(/mysqli_close\(\$db/g' {} \;
find /var/www/html/center -type f -name '*' -exec perl -pi -e 's/mysql_insert_id\(/mysqli_insert_id\(\$db/g' {} \;



블로그 이미지

Link2Me

,
728x90

DB에서 구한 URL 를 가지고 PHP 를 이용하여 JSON 파일로 만드는 코드 예제다.


<?php
if(isset($_POST['id']) && !empty($_POST['id'])){
    $id=$_POST['id'];
    require_once 'path.php';// root 폴더를 기준으로 상대경로 자동 구하기
    require_once $g['path_class'].'connect.php';
    $sql = "SELECT * FROM menu_items where id='{$id}'";
    $result = mysqli_query($db, $sql);
    if($row=mysqli_fetch_array($result)){
        //echo $row['url'];
        $url = $row['url'];
    }

    if($url !== '#'){
        $data = file_get_contents($url);
        $R = json_decode($data,TRUE); // JSON to Array
        echo json_encode($R); // JSON
    }
}
?>
 


블로그 이미지

Link2Me

,
728x90

출처 : https://stackoverflow.com/questions/17070047/how-to-set-layout-dynamically-in-android


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LayoutParams default_layout_params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    View view1 = inflater.inflate(R.layout.layout1, null);
    addContentView(view1, default_layout_params);          
    View view2 = inflater.inflate(R.layout.layout2, null);
    addContentView(view2, default_layout_params);
    view2.setVisibility(View.INVISIBLE);
    view1.setVisibility(View.VISIBLE);
    view1.bringToFront();
} 


private View view1, view2;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    view1 = getLayoutInflater().inflate(R.layout.layout1, null);
    view2 = getLayoutInflater().inflate(R.layout.layout2, null);
    setContentView(view1);

    someBtn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setContentView(view2);
        }
    });


    someBtn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setContentView(view1);
        }
    });
}


'안드로이드 > Layout' 카테고리의 다른 글

Meterial Design 로그인 Layout 예제  (0) 2020.03.21
ScrollView  (0) 2019.12.20
Android Fragment 기본 예제  (0) 2018.09.11
FloatingActionButton(FAB)  (0) 2018.08.15
LinearLayout weight  (0) 2018.03.01
블로그 이미지

Link2Me

,
728x90

jQuery 로 select 박스가 2개인 것의 값을 제어하는 걸 테스트하고 적어둔다.

 

여기서 알아둘 사항은 Javascript/jQuery 로 현재 URL, 경로 가져오는 방법이다.

//window.location is an object in javascript.
window.location.host             #returns host
window.location.hostname     #returns hostname
window.location.path             #return path
window.location.href             #returns full current url
window.location.port             #returns the port
window.location.protocol       #returns the protocol

// in jquery you can use
$(location).attr('host');          #returns host
$(location).attr('hostname');  #returns hostname
$(location).attr('path');         #returns path
$(location).attr('href');         #returns href
$(location).attr('port');         #returns port
$(location).attr('protocol');   #returns protocol



// To get the URL of the parent window from within an iframe
$(window.parent.location).attr('href');


http://www.abc.com:8082/index.php#tab2?foo=789

Property                                Result
----------------------------------------------------
$(location).attr('host')            www.abc.com:8082
$(location).attr('hostname')    www.abc.com
$(location).attr('port')            8082
$(location).attr('protocol')      http:
$(location).attr('pathname')   index.php
$(location).attr('href')           http://www.abc.com:8082/index.php#tab2
$(location).attr('hash')         #tab2
$(location).attr('search')       ?foo=789

 

 

기본적인 HTML 문법과 PHP를 혼용하여 사용하고 있다.

PHP는 대체문법을 사용하여 깔끔하게 보기좋게 정렬을 하고 있고, 함수화를 통해서 코드를 심플하게 보이도록 구현되어 있다.

 

<?php
include_once "connect.php";
include_once "dbDataClass.php";
$d = new DBDataClass();
$cat1 = isset($_GET['cat1'])? $_GET['cat1'] : 0;
$cat2 = isset($_GET['cat2'])? $_GET['cat2'] : 0;
?>
구분1 <select name="cat1" id="cat1">
    <option value="">+ 구분</option>
    <?php $_CAT1 = $d->getDbArray('menu_items''parent_id=0''*'''01);?>
    <?php while($_CA1 = mysqli_fetch_array($_CAT1)):?>
    <option value="<?php echo $_CA1['id']?>"<?php if($_CA1['id']==$cat1):?> selected<?php endif ?>><?php echo $_CA1['name']?></option>
    <?php endwhile ?>
    </select>
 
    &nbsp;&nbsp;&nbsp;구분2
    <select name="cat2" id="cat2">
    <option value="">+ 구분</option>
    <?php if($cat1):?>
    <?php $_CAT2 = $d->getDbArray('menu_items''parent_id='.$cat1, '*'''01); ?>
    <?php while($_CA2 = mysqli_fetch_array($_CAT2)):?>
    <option value="<?php echo $_CA2['id']?>"<?php if($_CA2['id']==$cat2):?> selected<?php endif ?>><?php echo $_CA2['name']?></option>
    <?php endwhile ?>
    <?php endif ?>
    </select>&nbsp;&nbsp;&nbsp;
    <!--구분 -->
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$('#cat1').on('change',function(){
    var cat1 = $("#cat1 option:selected").val(); // this.value
    location.href = $(location).attr('pathname'+ '?cat1='+cat1;
});
$('#cat2').on('change',function(){
    var cat1 = $("#cat1 option:selected").val();
    var cat2 = $("#cat2 option:selected").val();
    location.href = window.location.pathname + '?cat1='+cat1+'&cat2='+cat2;
});
</script>

 

 아래 코드 예시는 Secure Coding을 고려하여 작성한 코드 중에서 필요한 부분만 발췌하여 적은 것이다.

MDB(Material Design Bootsrap4) 코드를 적용한 select 가 포함되어 있다.

<?php
$link_url = "MemberList.php"// 현재 실행중인 파일명 가져오기
$rowsPage = 10// 한 화면에 표시되는 게시글 수
$curPage = isset($_GET['p']) ? $a->NoFilter($_GET['p']) : 1;
$m = isset($_GET['m']) ? $a->XSSFilter($_GET['m']) :'list';
$cat1 = isset($_GET['cat1']) ? $a->XSSFilter($_GET['cat1']) :'';
 
$g['url_link']=($m?'m='.$m.'&amp;':'').($cat1?'&amp;cat1='.$cat1.'&amp;':'').($where?'where='.$where.'&amp;':'').($keyword?'keyword='.urlencode(stripslashes($keyword)).'&amp;':'');
$g['bbs_reset'= $link_url.'?'.($m?'m='.$m.'&amp;':'');
 
?>
 
<div class="table-responsive text-nowrap">
<p class="h4 mb-4">회원 현황</p>
<div class="float-left info">
    <?php if$keyword ):?><strong>"<?php echo $keyword?>"</strong> 검색결과 : <?php endif?>
    <?php echo number_format($NUM)?>개 (<?php echo $curPage;?>/<?php echo $TPG;?>페이지)
</div>
 
<?php if($_SESSION['authID'== 2):?>
<div class="float-right info">
<select id="cat1" class="browser-default custom-select">
<?php $cats = $a->getDbArray('orgTree''parent_id=0''*'''01);?>
    <option value="">-본부-</option>
    <?php foreach($cats as $C): ?>
        <option value="<?php echo $C['id'];?>"<?php if($C['id']==$cat1):?> selected<?php endif;?>><?php echo $C['name'];?></option>
    <?php endforeach;?>
</select>
</div>
<?php endif;?>
 
<script>
$('#cat1').on('change',function(e){
    e.preventDefault();
    var cat1 = $("#cat1 option:selected").val(); // this.value
    var uri = $('#urlPath').attr('url-path');
    MemberListTable(where,keyword,curPage,uri,cat1);
});
</script>
 

 

 

블로그 이미지

Link2Me

,
728x90

민간투자사업으로 추진할 예정인 서울~세종 고속도로 건설계획을 문재인 정부가 공공사업으로 전환시켰다.


세종 포천 고속도로 사회적 편익 6700억원

- 경부고속도로와 중부 고속도로의 통행량 분산으로 교통 혼잡도 개선

- 혼잡 구간 대폭 감소, 통행속도의 상당한 증가에 따른 운행비 절감, 통행시간 단축

- 세종 - 서울 70분대 단축 => 수도권과 충청권 연계 강화를 통한 균형발전 촉진 및 지역발전에 도움


차선 : 왕복 6차로

속도 : 시속 120km


고속도로 추진 계획이 발표됐던 2015년 전후로 세종시 지역은 시세가 많이 올랐다.

- 세종 - 안성 2019년 착공, 2024년 6월 개통 예정

- 세종시 장군면 용현리에는 국도 43호선과 접속하는 세종 IC 설치

- 세종시 전동면에는 연기 IC 를 설치 , 연기 인근에는 세종시 차원에서 육성하는 북부산업단지가 집중되어 있으므로

  고속도로의 건설과 함께 산업 단지의 위상도 높아질 것


- 성남 - 안성 구간은 71km 로 2022년 개통 예정


- 세종 포천 고속도로는 강변북로와 제2외곽순환고속도로와 각각 합류하는 점이 있으며,

  북쪽은 포천, 남쪽은 안성군 이동면 인근이 될 예정


- 송파 문정지구, 하남 미사지구, 동탄 2신도시, 용인 남사지구, 오포IC, 안성 서운IC(34번 국도), 동안성IC(38번 국도), 세종시 등이 수혜 지역

- 상가나 오피스텔 등 수익형 부동산에 대한 기대감이 높아짐

- 교통이 개선되면 서울을 비롯한 주요 도시로의 접근성이 높아지고 교통이 개선되는 만큼 생활 인프라가 확충돼 주거 환경이 더욱 편리해진다.

- 많은 인구가 유입되는 만큼 수요을 안정적으로 확보할 수 있는 집값이나 임대료, 매매가 등 상승에 영향을 미치기 때문에 교통 호재 수혜를 입는 지역들의 투자가치가 더욱 높아진다.


제2 외곽순환도로


서울 - 세종 고속도로






블로그 이미지

Link2Me

,
728x90

최근에 맥북 프로 2010에서 윈도우10이 설치가 되지 않아서 네이버 중고나라를 계속 검색하고 있었다.

윈도우 10 은 맥북 프로 2012 이후부터 설치가 가능하다고 한다.


먼저, 윈도우7 32비트를 설치했더니 무선환경을 제대로 인식하지 못해서 엄청 불편했다.

그래서 다시 윈도우 8.1 64비트 버전을 설치했다.


설치과정은 맥북 프로 2010은 DVD 에서만 bootcamp가 동작된다는 걸 애플서비스센터를 통해서 알았다.

USB를 준비하고, 윈도우 설치 DVD를 준비해야 한다.

윈도우 파티션이 나눠진 상태에서는 파티션을 제거하고 다시 윈도우 파티션을 나누는 과정으로 진행되더라.


윈도우 8.1은 설치가 잘되고 나서, 무선 Wi-Fi 환경 인식이 바로 된다.

드라이버를 별도 설치하지 않아도 되고 엄청 편하고 좋다.

맥북에서 모든 걸 다 해결하면 좋겠지만 윈도우 환경에서 익숙해진 Autoset9 기반에서의 PHP 개발 테스트, WinSCP(맥용이 없어서 엄청 아쉽다), Putty 를 맥북에서 사용하려고 유료 구매했는데 인식이 안되더라. ㅠㅠ

그래서 윈도우 8.1에서 사용할 수 있어서 편하다.


Desktop I5 6500 CPU 3.2GHz, 메모리 16G, SSD 환경과 비교해서

맥북 프로 2010이 메모리가 좀 작은게 아쉬울 뿐 Android Studio 기반에서 컴파일은 상당히 빨라서 만족스럽다.


개발환경을 고려한다면 맥북 프로 2014 이후 모델로 구입하면 상당히 좋을 거 같다.

'iOS > MACBOOK' 카테고리의 다른 글

맥북 2010 메모리 증설 16G (해외 구매)  (2) 2019.02.10
부팅용 macOS Sierra USB 만들기  (0) 2019.02.10
맥북 프로 윈도우 10 설치  (0) 2016.10.06
맥북 프로 초기 세팅  (0) 2016.10.04
MACBOOK Pro 인식이 잘 안되어서  (0) 2016.10.03
블로그 이미지

Link2Me

,