클로저


클로저 에 대한 괜찮은 설명을 가져왔다.... 


클로저 clo.sure라는 단어를 들어본 독자라면 람다가 클로저 (Clojure라는 프로그래밍 언어를 가리키는 것이 아니다)의 정의에 부합하는지 궁금할 것이다.

 원칙적으로 클로저란 함수의 비지역 변수를 지유롭게 참조할 수 있는 함수의 인스턴스를 가리킨다. 예를 들어 클로저를 다른 함수의 인수로 전달할 수 있다. 클로저는 클로저 외부에 정의된 변수의 값에 접근하고, 값을 바꿀 수 있다. 자바 8의 람다와 익명 클래스는 클로저와 비슷한 동작을 수행한다. 

람다와 익명 클래스 모두 메서드의 인수로 전달될 수 있으며 자신의 외부 영역의 변수에 접근할 수 있다. 다만 람다와 익명클래스는 람다가 정의된 메서드의 지역 변수의 값은 바꿀 수 없다. 람다가 정의된 메서드의 지역변숫값은 final 변수여야 한다. 덕분에 람다는 변수가 아닌 값에 국한되어 어떤 통작을 수행한다는 사실이 명확해진다. 

이전에도 설명한 것처럼 지역 변숫값은 스택에 존재하므로 자신을 정의한스레드와생존을같이 해야하며 따라서 지역 변수는 final 이어야한다. 가변 지역 변수를 새로운 스레드에서 캡처할 수 있다면 안전하지 않은 동작을 수행할 가능성이 생긴다(인스턴스변수는 스레드가 공유하는 힘에 존재하므로 특별한 제약이 없다).





jackson 라이브러리쪽에보면 있다. ObjectMapper 의 readValue 메서드를 통해서 할 수 있다. 


map -> json 은

Map map = new HashMap();
map.put("1","a");
map.put("2","a");
map.put("3","a");

String json = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new AfterburnerModule());
try {
json = objectMapper.writeValueAsString(map);
} catch (JsonProcessingException e) {
e.printStackTrace();
}

간단한 예제인다. 참고바란다. 



원래 해당제품은 64KB 인데 ... 버그로인해서 32밖에 못쓴다. 이걸 넘게 되면 각종 문제가 발생한다. 한마디로 설정 유실이 생겨서 wifi 2.4 가 안되거나 등등의 문제가 생긴다. 


1. 설정할때마다 status에 가서 용량이 32KB 를 넘는지 확인한다.

2.  Services 에 가서 WAN Traffic Counter 를 끈다. (해당 기록은 로그를 남기는데 이게 용량을 써버린다)

3. 하나하나 설정할때마다 이게 용량을 먹을 수 있을지를 고민하라.

4. 자동리붓기능을 활성하한다. (기록이 남는게 있을시의 초기화를 위함임) 사실 이건 소용이 있을지 없을지 장담못하는데 혹시나해서 해놨다. 개인적으로는 일주일에 한번 가장 안쓰는시간인 월요일 새벽에 했다.

위치는 administration > keep alive 항목을 보라 







맥앱 스토에어 있는 TOAD 를 이용할때, 최근 파일이 열리지 않을 수 있다. 즉 저장해둔 sql 파일등이 안열리는걸 말하는것이고, 

이때 toad 실행파일을 선택 > 오른쪽마우스 > 정보가져오기에서 공유 및 사용 권한 에 있는 wheel 의 권한을 읽기 및 쓰기 로 해두면된다.

수정이 안된다면 아래에 있는 좌물쇠를 클릭해서 잠금해제하고 수정하면된다.



'IT > tools' 카테고리의 다른 글

intellij 에서 git 브랜치 동기화  (0) 2016.11.24
wireshark 옵션....  (1) 2016.11.16
sublimeText 한글 euc-kr converting..  (0) 2014.12.03
typinator 에서 한글 이용하기.  (7) 2014.11.26
sublime text 3 package install  (0) 2014.11.23


2017-09-18 번역서에 있는글이 있어서 올린다.

표현식과 문장 모두 프로그램에서 작성하는 명령어들이며, 컴퓨터로 하여금 특정 일을 수행하도록 명령한다.

차이점은 

문장은 액션을 수행하지만 아무것도 리턴하지 않고

표현식은 액션을 수행하고 결과를 리턴한다. 람다 표현식을 사용하여 프로그래밍할 때 문장보다는 표현식을 생성하여 사용하는것이 낫다.

이유?

1. 문장은 아무것도 리턴하지 않기 때문에 사이드 이펙트를 발생하거나 메모리를 이상한값으로 채울 수 있다.

2. 문장과는 달리 표현식은 두개이상의 표현식을 하나로 조합하여 사용할 수 있음.



from http://lambda-the-ultimate.org/node/1044

Expressions have a value, while statements do not. If you can pass it as an argument to a function, it's an expression. If you can't, it's a statement. Control flow constructs in C-derived languages are generally statements (you can't pass an 'if {}' block as a function parameter). Consequently, those languages tend to provide an expression form for 'if' (like the ternary operator). Of course, the whole point of many functional languages is that everything has a value, and that functions are first-class values, which means that everything is an expression. Statements usually appear in imperative languages, where you wish to write commands that don't necessarily return a value.

구문이 값을 가지지 않을때 표현식은 값을 가진다. 만약 함수에게 아규먼트로 넘겨줄수 있다면 그건 표현식이다. 못한다면? 그건 구문이다. 제어흐름 기반의 C 파생언어들은 보통 구문( 함수파라미터 같은 'if {}' 블럭은 넘기지 못한다.) 이다. 따라서 저러한 언어들은 'if' (삼항연산같은 )를 위해 표현식 폼을 제공하는 경향이 있습니다. 물론 많은 함수언어의 중요 포인트는 모든것은 값을 가지고 함수는 일급함수 값(즉 모든것은 표현식이다)이라는 것이다. 구문은 보통 리턴값이 필요 없는 명령어를 코딩하는 명령형 언어에서 나타난다.


구문( 'if {}' ..조건이 아닌 전체 인..블럭은 함수의 아규먼트로 못넘김) 

함수파라미터처럼 if{} 블럭은 넘기지 못한다 == 구문 


from http://python.xwmooc.org/html/book004.html

3.6  표현식(Expression)

표현식 (expression)은 값, 변수, 연산자 조합니다. 값은 자체로 표현식이고, 변수도 동일하다. 따라서 다음 표현식은 모두 적합하다. (변수 x는 사전에 어떤 값이 대입되었다고 가정한다.)

17
x
x + 17



3.4  문장(Statement)

문장(statement)은 파이썬 인터프리터가 실행하는 코드 단위다. 지금까지 print, assignment 두 종류의 문장을 살펴봤습니다.

print 1
x = 2
print x



Expressions(표현식) 은 이 있고 statements(구문) 은 그렇지 않다. 

function 에게 arguments로 넘겨줄수 있는것이라면 그건 표현식이다. 그럴수 없다면? 구문이다. 

구문도 표현식처럼 값을 줄 수 있는데 그게바로 return문을 이용할때이다!


이게 가장 쉬운 설명인것 같다.

구문은 if {} 이런게 구문이다. 이건 값으로 넘겨줄 수 있는.. 어떤 값이 아니다. 


Statements are commands, expressions are requests

Statements are commands, i.e. 'do this', 'open file', 'set collection size to 1', 'clear collection' etc.

Expressions are requests: 'calculate this', 'give me the contents of this file', 'give me a collection with size 1', 'give me a new collection'.

Superficially, they are both commands, in the sense that expressions are commands to perform calculations. But the real difference lies inside statements and expressions:

-In statements, the programmer tells the computer where to store the results of computations.
: 구문은 프로그래머가 컴퓨터에게 계산의 결과를 어디에 저장할지 말하는것이고...

-In expressions, the programmer does not tell the computer where to store the result of computations, but takes the result in his/her hand, and passes it to other expressions.
: 표현식은 프로그래머가 컴퓨터에게 계산의 결과를 어디에 저장할지 말하지 않는것이다. 그러나 그 결과는 다른 표현식에 전달된다.

The problem created by statements is that the programmer often forgets the right place to store the result of computations, and therefore uses a wrong place, thus creating havoc with a program; whereas in expressions the store does not matter, because the result is to be immediately used in a nearby expression.

It's a very subtle difference, but once someone understands it, he/she automatically understands the real value of functional programming.



'IT > java' 카테고리의 다른 글

map 의 .merge ( java 8 lambda) 값 증가 를 간단히  (0) 2016.09.06
json <-> map  (0) 2016.08.17
java 8 tutorial 한글  (2) 2014.04.09
잘못쓰면 큰일나는 loop 과 객체선언 ... 그리고 성능저하  (0) 2013.09.26
call by ref ? value?  (0) 2013.06.21



from https://github.com/ismailhabib/custom-protocol-detection


(function (window) {


    function _registerEvent(target, eventType, cb) {

        if (target.addEventListener) {

            target.addEventListener(eventType, cb);

            return {

                remove: function () {

                    target.removeEventListener(eventType, cb);

                }

            };

        } else {

            target.attachEvent(eventType, cb);

            return {

                remove: function () {

                    target.detachEvent(eventType, cb);

                }

            };

        }

    }


    function _createHiddenIframe(target, uri) {

        var iframe = document.createElement("iframe");

        iframe.src = uri;

        iframe.id = "hiddenIframe";

        iframe.style.display = "none";

        target.appendChild(iframe);

        return iframe;

    }



    function checkBrowser() {

        var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;

        return {

            isOpera: isOpera,

            isFirefox: typeof InstallTrigger !== 'undefined',

            isSafari: Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0,

            isChrome: !!window.chrome && !isOpera,

            isIE: /*@cc_on!@*/false || !!document.documentMode   // At least IE6

        }

    }


    function getInternetExplorerVersion() {

        var rv = -1;

        if (navigator.appName === "Microsoft Internet Explorer") {

            var ua = navigator.userAgent;

            var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");

            if (re.exec(ua) != null)

                rv = parseFloat(RegExp.$1);

        }

        else if (navigator.appName === "Netscape") {

            var ua = navigator.userAgent;

            var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");

            if (re.exec(ua) != null) {

                rv = parseFloat(RegExp.$1);

            }

        }

        return rv;

    }











// CHROME / BLUR

    function openUriWithTimeoutHack(uri, failCb) {


        var timeout = setTimeout(function () {

            failCb();

            handler.remove();

        }, 1000);


        var handler = _registerEvent(window, "blur", onBlur);


        function onBlur() {

            clearTimeout(timeout);

            handler.remove();

        }


        window.location = uri;

    }





// IE 10 in not win 8+  / BLUR

    function openUriUsingIE10InWindows7(uri, failCb) {

        var timeout = setTimeout(failCb, 1000);

        window.addEventListener("blur", function () {

            clearTimeout(timeout);

        });


        var iframe = document.querySelector("#hiddenIframe");

        if (!iframe) {

            iframe = _createHiddenIframe(document.body, "about:blank");

        }

        try {

            iframe.contentWindow.location.href = uri;

        } catch (e) {

            failCb();

            clearTimeout(timeout);

        }

    }


//IE 9/11   not win 8+  / BLUR

    function openUriWithHiddenFrame(uri, failCb) {


        var timeout = setTimeout(function () {

            failCb();

            handler.remove();

        }, 1000);


        var iframe = document.querySelector("#hiddenIframe");

        if (!iframe) {

            iframe = _createHiddenIframe(document.body, "about:blank");

        }


        var handler = _registerEvent(window, "blur", onBlur);


        function onBlur() {

            clearTimeout(timeout);

            handler.remove();

        }


        iframe.contentWindow.location.href = uri;

    }


// Win 8+

    function openUriUsingIEInWindows8(uri, failCb) {

        if (navigator.msLaunchUri) {

            navigator.msLaunchUri(uri,

                function () {

                    window.location = uri;

                },

                failCb

            );

        }

    }





// FF

    function openUriUsingFirefox(uri, failCb) {

        var iframe = document.querySelector("#hiddenIframe");

        if (!iframe) {

            iframe = _createHiddenIframe(document.body, "about:blank");

        }

        try {

            iframe.contentWindow.location.href = uri;

        } catch (e) {

            if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL") {

                failCb();

            }

        }

    }


// ETC

    function openUriInNewWindowHack(uri, failCb) {

        var myWindow = window.open('', '', 'width=0,height=0');


        myWindow.document.write("<iframe src='" + uri + "'></iframe>");

        setTimeout(function () {

            try {

                myWindow.location.href;

                myWindow.setTimeout("window.close()", 1000);

            } catch (e) {

                myWindow.close();

                failCb();

            }

        }, 1000);

    }











    function openUriUsingIE(uri, failCb) {

        //check if OS is Win 8 or 8.1

        var ua = navigator.userAgent.toLowerCase();

        var isWin8 = /windows nt 6.2/.test(ua) || /windows nt 6.3/.test(ua);


        if (isWin8) {

            openUriUsingIEInWindows8(uri, failCb);

        } else {

            if (getInternetExplorerVersion() === 10) {

                openUriUsingIE10InWindows7(uri, failCb);

            } else if (getInternetExplorerVersion() === 9 || getInternetExplorerVersion() === 11) {

                openUriWithHiddenFrame(uri, failCb);

            } else {

                openUriInNewWindowHack(uri, failCb);

            }

        }

    }



    window.protocolCheck = function (uri, failCb) {

        var browser = checkBrowser();


        function failCallback() {

            failCb && failCb();

        }


        if (browser.isFirefox) {

            openUriUsingFirefox(uri, failCallback);

        } else if (browser.isChrome) {

            openUriWithTimeoutHack(uri, failCallback);

        } else if (browser.isIE) {

            openUriUsingIE(uri, failCallback);

        } else {

            //not supported, implement please

        }

    }

}(window));




from https://support.apple.com/en-us/HT204149

10. What is the difference between an active adapter and a passive adapter?

An active adapter can convert a signal from one connector to another. The Apple Mini DisplayPort to Dual-Link DVI and Apple Mini DisplayPort to VGA adapters are active adapters. A passive adapter acts as a pass-through from one connector type to another and does not convert a signal. The Apple Mini DisplayPort to DVI adapter is an example of a passive adapter.

11. Should I use a passive or active adapter?

On some Apple computers, like the Mac Pro (Mid 2010), you can connect three displays to a single graphics card. In this scenario—to connect to three display to use three ports—use active adapters to connect the Mini DisplayPort ports to your external displays. Two displays can connect via Mini DisplayPort and one via DVI. Note: Learn more about supported display configurations for the Mac Pro. 




2019. 4. 19. 

아래 글은 예전에 쓰긴했는데... 요즘은 또 curl 말고  httpie 를 쓴다.





curl .. wget 대용으로 가능하네.


curl 이라는 툴이 네트웍 request 가능한 툴이다. wget 이 하는것 이상의 것이가능하다. 즉 wget 의 기능도 당연히 가능하다는 소리


curl 주소 -o 저장하기원하는파일명   


-o 는 당연히 output 이라는거 알테고 위의 명령으로 간단히 wget 을 대치 가능하다. 



+ Recent posts