ㅎ....

ㅋㅎ...


오늘은 집에서 공부 좀 해볼까~하고 노트북을 켰는데


po 검은 화면 wer


힘 black screen 힘


부팅이 안 돼효... 아니, 부팅이 제대로 된 건지 안 된건지 알 수 없어효... 화면에 아무것도 안 보이니까...

불현듯 마지막으로 리눅스 업그레이드 한 게 문제일 거라는 생각이 들었다.


이것 저것 검색해봤더니 nvidia 관련 문제일거라는 글들이 있었는데 난 일단 grub 모드로도 진입이 안 돼서 뭘 할 수가 없었다. 부팅될 때 shift 키를 누르면 grub 모드로 들어간다는데 난 뭐 아무리 눌러도 순식간에 지나가버리고 검은 화면만이 날 반겨주었다......ㅠㅠㅠ


그래서 열받아서 ctrl, alt, shift, 1, 2, f1, f2 등의 키를 마구마구 눌러댔는데 어쩌다가  grub 으로 진입 성공.

(이 글을 포스팅 하기 위해 무슨 키였는지 찾으려고 해봤는데, 조합 하나하나씩 다 해봤는데도 어떻게 grub에 진입했는지 모르겠다ㅠㅠ 신께서 도우셨나...)


그래서 grub 메뉴에서 ubuntu용 고급설정으로 들어가서 최신버전 바로 직전의 커널버전으로 부팅 후 최신버전의 커널을 직전 버전으로 다운그레이드하고, 부팅 시 grub 메뉴가 항상 보이도록 설정을 변경해주었음.


정리하면,




1) 부팅 시 어떻게든 GRUB 모드로 진입 (화이팅)

(저처럼 부팅이 아예 안 되는게 아니라면 아래 4번을 먼저 진행하시고 재부팅하시면 됩니다~)


2)  Ubuntu용 고급 설정(영어로는 Advanced 같은 용어 아닐까?) 모드로 들어가서 최신버전이 아닌 커널 버전으로  부팅


3) 커널 다운그레이드 (최신 버전 삭제)

dpkg -l 명령어로 설치되어있는 가장 최신 커널 버전을 확인한 후 삭제해주면 됨.

$ dpkg -l | grep linux-image

$ sudo apt-get purge linux-image-{삭제할커널버전}-generic   linux-image-extra-{삭제할커널버전}-generic


$ dpkg -l | grep linux-headers

$ sudo apt-get purge linux-headers-{삭제할커널버전}    linux-headers-{삭제할커널버전}-generic

나의 경우는 4.4.0-34 버전을 삭제했음.


4) 부팅 시 GRUB 메뉴가 항상 보이도록 설정

$ sudo vi /etc/default/grub

  > GRUB_HIDDEN_TIMEOUT=0  문장을 주석처리(문장 앞에 #을 붙이면 된다)

  > GRUB_TIMEOUT=4              GRUB 메뉴를 표시할 시간(second)를 변경(선택사항)


$ sudo upgrade-grub

GRUB_TIMEOUT=4는 부팅 시 GRUB 메뉴를 4초간 보여주겠다는 뜻이다.

내가 특별히 메뉴를 선택하지 않고 가만히 두면 4초간 기다렸다가 기본으로 선택되어있는 메뉴로 자동 부팅하겠다는 뜻.





다운그레이드 하긴 했지만 사실 이 버전에서도 가끔 화면이 깜박거리는 등의 문제가 있다. 구글링 했을 때 nvidia 관련 얘기가 많이 나온 것으로 봐서 화면이 깜박거리는 문제도 그렇고 검은 화면이 뜨며 부팅이 안 되던 것도 그렇고 nvidia 드라이버와 관련한 것이 아닐까 싶은데 찾아봐야겠다.

스칼라에서 함수 리터럴을 정의할 때, 실제로는 apply라는 메소드를 가진 객체로 정의된다.



예제)

두 int 값이 같은지 비교하여 boolean값을 리턴하는 isEqual이라는 함수를 아래와 같이 정의한다고 할 때


실제로는


이렇게 정의된다는 이야기다.

여기서 Function2는 parameter 2개를 받는 함수라는 뜻이며 [Int, Int, Boolean]은 (Int, Int) => Boolean을 뜻한다.



isEqual 함수를 실행할 땐 아래 첫번째 문장은 실제론 두번째 문장으로 실행된다.

> isEqual(2,2)

> isEqual.apply(2,2)


※스칼라로 배우는 함수형 프로그래밍(폴 키우사노, 루나르 비아르드나손) 책 공부내용 정리



* 순수 함수란?

: 부수 효과(side effect)가 없는 함수.

수학에서 함수를 f(x)=ax+b 등 로 표현하는 것처럼 똑같은 입력 값에 대해 항상 같은 값을 돌려주는 것 외에 다른 기능(변수 값을 갱신한다던지, 자료 구조를 변경한다던지)은 하지 않아야 한다. 

이런 개념을 참조 투명성(referential transparency, RT)라는 개념으로 설명할 수 있다.


* 참조 투명성(referential transparency, RT)

: 모든 프로그램에 대해 어떤 표현식(expression) e를 모두 그 표현식의 결과로 치환해도 프로그램에 아무 영향이 없다면 그 표현식 e는 참조에 투명하다(referentially transparent). 만약 어떤 함수 f(x)가모든 입력값 x에 대해 참조에 투명하면 그 함수 f는 순수하다.




참조에 투명한 예제)

> val x = "Hello"

> val r1 = x + " World"

> val r2 = "Hello" + " World"

> val r3 = x + " World"


위 문장을 순서대로 수행한다고 생각하자. x를 "Hello"를 리턴하는 함수라고 생각하면, r1, r2, r3 모두 그 결과값은 같다. 즉 함수 x를 그 함수의 리턴 값인 "Hello" 치환해도 프로그램에 문제가 없다.



참조에 투명하지 않은 예제)

> val x = new StringBuilder("Hello")

> val r1 = x.append(" World").toString

> val r2 = x.append(" World"),toString


역시 위 문장을 순서대로 수행한다고 생각하자. 함수 x의 리턴값은 new StringBuilder("Hello")이고 r1을 수행하면 결과값은 "Hello World"이다. 


그런데 r2를 수행하면?

r1을 수행한 상태에서 함수 x의 상태값(?)은 변경되었으므로 r2의 수행결과는 "Hello World World"이다. x의 리턴값을 new StringBuilder("Hello")라고 한다면 r2에서 x를 이 값으로 치환했을 때 그 결과는 "Hello World"이므로 두 수행 결과는 다르다.


또한 함수는 같은 입력에 대해 항상 같은 값을 반환해야 하고, 함수를 그 함수의 결과값으로 치환해도 프로그램에 영향이 없어야 한다고 했는데  r1, r2에서 함수 x에 대해 각각 똑같은 입력 append(" World") 을 수행했지만 그 결과값은 서로 다르므로 x는 순수 함수가 아니다.






(아.......배운 내용 포스팅하는 거 되게 귀찮은 일이었구나...하지말까....블로거 분들 존경합니다ㅠㅠ)

'잡동 > etc' 카테고리의 다른 글

SOAP와 REST 간단한 개념정리  (0) 2016.07.06

와 정말 이것때문에 내가 오늘 날린 시간을 생각하면.........부들부들.....

 

급하게 처리해야 하는 일이 있었는데 이것 때문에 한참 시간을 잡아먹었다.

파일을 읽어서 파일의 각 라인을 delimeter로 split한 리스트에 이런 저런 작업을 한 후 리스트를 출력해야 하는 상황이었는데 아무리 해도 '\xed\x95\x9c\xea\xb8\x80' 이런 식으로만 출력되는 것이었다..............ㅠㅠㅠ

즉, 어떤 리스트 li = ['123', '한글'] 이 있을 때 print(li)를 하려고 했던 상황.

파이썬 버전은 2.x (몇이었더라....)


구글링해서 적용해본 내용들


1) 파일 인코딩 형식 설정

: 파일 제일 위에 파일 인코딩 형식을 설정해준다

ex)

# -*- coding: utf-8 -*-


이건 원래 파일에 적용해놨던 내용이었는데, 파이썬 파일 내에서 한글을 사용하는 것 자체(주석을 한글로 단다던지, 상수값에 한글을 사용한다던지)에만 적용되는 것 같았다(추측임.....정확히 알아봐야지 언젠가.....). 혹시 몰라서 euc-kr로도 해봤는데 안 됨.



2) sys.setdefaultencoding 설정

: 파이썬 코드로 직접 디폴트 인코딩값을 설정한다.

import sys


reload(sys)

sys.setdefaultencoding('utf-8')


반드시 reload(sys)를 해야 적용된다.

근데 이것도 효과 없었음. euc-kr로 해봐도 역시 안 됨.



3) encode(), decode() 등의 함수를 적용한다.

: 이건 아예 에러 나면서 안 됨. 어떻게 적용했었는지 기억이 잘 안난다. 



해결


야매로 해결한 느낌이지만 일단 결과물을 먼저 내는게 급했기 때문에 해결방법을 찾은 것만으로도 감지덕지하며 어깨춤을 췄다. 그리고 그 방법은 바로..............

>>> li=['abc','한글']


>>> print(li)

['abc', '\xed\x95\x9c\xea\xb8\x80']


>>> print li[0], li[1]
abc 한글

이렇게 아래 방법으로 출력하니까 한글이 정상적으로 출력되더라 이 말씀!!

ㅎㅎ....영어권 나라에서 태어났으면 좋았을텐데....ㅎㅎㅎ....

ㅎㅎㅎ....



지금은 아직 해야 할 일이 남아있으므로 일단 이 포스팅을 남기는 것으로 만족하고....

이 문제에 대해 추가로 더 확인해봐야 할 사항에 대해서만 일단 작성해놔야지.



공부해야 할 것

* 왜 리스트를 통째로 toString으로 출력하려고 하면 한글이 출력되지 않는데 각각 출력하면 되는 거지?

* 어떤 방법을 써야 리스트를 통째로 출력해도 한글이 출력되지?

* 파이썬 한글 인코딩 관련 공부!


'잡동 > Python' 카테고리의 다른 글

[Flask] 리눅스 우분투 Flask 설치  (0) 2016.07.06
[Python] Exception(예외) 발생시키기  (0) 2016.05.18

로컬 PC에 바로 개발환경을 구축했다가 자칫 뭔가가 꼬이거나 잘못될 경우 번거롭다. 그래서 가상환경에 개발 환경을 세팅하는 방법을 사용하고 있다.


1. 가상 환경 구축

아직 Flask는 python 3.x 버전을 지원하지 않으므로 python 2.5 또는 상위 2.x 버전으로 가상환경을 구축할 것.

$ virtualenv 가상환경이름

ex) virtualenv myvenv


그럼 해당 명령어를 실행한 디렉토리에 지정한 가상환경이름으로 디렉토리가 생성된다. 그 곳이 가상환경이 설정되는 곳!

가상환경 디렉토리명을 변경하면 명령어가 제대로 수행되지 않으므로 변경하지 않아야 한다.


2. 가상환경 실행

$ source 가상환경설치디렉토리/bin/activate

ex) source myvenv/bin/activate


가상환경을 종료하고 싶을 땐 그냥 deactivate 라고 입력하면 된다.



3. flask 설치

$ pip install Flask



4. 끝!

'잡동 > Python' 카테고리의 다른 글

[Python] list 자료형에서 한글 출력  (0) 2016.08.06
[Python] Exception(예외) 발생시키기  (0) 2016.05.18

일단은 이게 무엇이구나~ 라는 정도로만 이해하기 위해 간략하게 작성.

하지만 내가 써놓은 것이 맞는지, 제대로 이해한 것이 맞는지 모르겠다. 역시 직접 써봐야 알 수 있을 것 같다.




SOAP (Simple Object Access Protocol)

XML 형식의 구조화된 데이터를 분산 환경에서 교환할 수 있도록 하는 가벼운 프로토콜. HTTP를 주로 사용하는 듯 하며 다른 프로토콜도 사용 가능. SOAP에는 여러가지 메시지 패턴이 있지만 보통은 RPC 패턴을 사용(사용한다고 표현하는 게 맞는 건가?). 클라이언트가 서버에 메시지를 요청하면 서버는 즉시 메시지를 응답한다.

그렇다면 RPC란?



RPC (Remote Procedure Call)

별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에 있는 함수나 프로시저를 실행할 수 있게 하는 프로세스간 통신 기술. 즉 RPC를 이용하면 사용자는 어떤 프로그램에 대하여 그 프로그램이 로컬에 있건 원격에 있건 사용할 수 있다.



REST (REpresentational State Transfer)

HTTP위에서, SOAP나 쿠키를 통한 세션 트래킹 같은 별도의 전송 계층 없이, 웹 상의 자료를 전송하기 위한 간단한 인터페이스. 웹 상의 자료를 HTTP URI를 통해 표시하고 HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자료에 대한 CRUD(create, read, update, delete) 작업을 수행한다.

REST 원리를 따르는 시스템을 RESTful 이라고 한다.




참고자료

https://ko.wikipedia.org/wiki/SOAP

https://www.w3.org/TR/soap12/

http://www.slideshare.net/WonchangSong1/rpc-restsimpleintro

https://ko.wikipedia.org/wiki/REST

http://regularmotion.kr/rest-and-restful/


'잡동 > etc' 카테고리의 다른 글

[함수형 프로그래밍] 순수 함수, 참조 투명성  (0) 2016.08.07

ㅎㅎㅎㅎㅎㅎㅎㅎ식겁헀다ㅎㅎㅎㅎㅎㅎ


우분투를 16.04로 업그레이드 하고 블로그를 참고해가며 한글입력기를 ibus에서 우분투 기본 값인 fcitx로 변경했다.

신나게 한영 전환키도 한/영 키로 바꾸고 나서 이제 ibus는 필요없겠구나~ 하고 아래 명령어로 ibus를 삭제했다.


※ 주의! 함부로 따라하지 마세요......

sudo apt-get remove --purge ibus

삭제하는데 생각보다 오래 걸리고 너무 많은 것이 삭제되는 것 같아서 좀 느낌이 이상했지만 뭐 넘어갔다.

그리고 나서 시스템 설정 메뉴를 눌렀는데 안 되더라구?^^ 이상해서 로그아웃하고 재로그인했다. 


그랬더니 내 눈에 보이는 화면은



?????????????? 

메뉴바며 런처며 다 사라져 있었다. 놀라서 황급히 검색해보니 

ibus에 걸려있는 많은 dependency들 때문에 ibus는 함부로 삭제하면 안 된다는 글들이 있었다.....^^ 우분투알못 인증...



이 사태를 해결하기 위해 일단 마음을 진정시키고 열심히 구글링해서 이것저것 시도해보았다.



1차 시도 (구글링 결과 이것저것 짜깁기)

1) sudo apt-get install ubuntu-desktop 

                                     unity-control-center 

                                     unity-control-center-signon

                                     gnome-control-center-unity

2) shutdown -r now

해결 안 됨.



2차 시도 (http://askubuntu.com/questions/475296/unity-launcher-and-top-panel-disappeared-in-14-04)

1) sudo service lightdm restart

2) sudo apt-get install --reinstall ubuntu-desktop

3) sudo apt-get install unity

해결 안 됨.



3차 시도 (http://askubuntu.com/questions/17381/unity-doesnt-load-no-launcher-no-dash-appears/76951#76951)

이번엔 왠지 될 것 같다는 촉이 왔음.

1) ctrl + alt + F1

2) sudo apt-get install compizconfig-settings-manager

3) DISPLAY=:0 ccsm &

4) ctrl + alt + F7 (GUI 화면으로 돌아감)

5) 실행된 CompizConfig setting manager에서 Unity Plugin을 Enable

    (그리고 데스크톱 항목에 있는 나머지도 뭔진 모르지만 일단 다 Enable)

6) 그럼 OpenGL을 사용하겠냐는 창을 시작으로 뒤에 뭐가 계속 나오는데, 전부 사용하겠다고 체크

7) sudo reboot



안 됨ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ망연자실 했다.

하지만 왠지 저 CompizConfig setting manager를 이용하면 해결될 것 같았다.

그래서  GUI 상에서 터미널을 실행해서 (마우스 우클릭 - 터미널 실행) ccsm을 실행



그랬더니! 아까는  Ubuntu Unity Plugin(캡쳐화면 오른쪽 하단) 앞에 체크박스가 있었는데 이번엔 없어져있었다. 

그래서 Ubuntu Unity Plugin을 클릭. 



그리고 왼쪽에 Ubuntu Unity Plugin을 사용을 체크. 그랬더니 무슨 창이 떴는데

잘 기억은 안 나지만 다른 거 무시하고 Unity Plugin을 사용하겠다는 내용을 클릭했던 것 같다.


결과는

ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 감격

밀고 다시 깔아야 싶어서 심장이 철렁했었는데 친절하게 3번 해결 방법을 올려주신 어떤 분 덕분에 해결되었다.ㅠㅠㅠㅠ


내 생각엔 앞에서 시도했던 1번과 2번도 문제 해결에 도움이 된 것 같다. 

모르겠어 사실..... 그냥 해결돼서 좋아...



아 으아ㅏ아아아아 글 다 썼는데 날아갔어....귀찮아ㅠㅠ

 

Description:

[ id, email ] 형식의 element를 갖는 리스트에서 id의 마지막 캐릭터가 '_' 인 element의 리스트를 리턴하는 문제.

입력 값과 리턴 값의 형식은 아래와 같다.

input   :  [ [ "foo", "foo@foo.com" ], [ "bar_", "bar@bar.com" ] ]

output :  [ [ "bar_", "bar@bar.com" ] ]

 

 

 

My Solution:

어떻게 해서든 lambda를 사용해서 풀고 싶었다.

처음에는 function을 선언해서 문제를 해결한 후에 그걸 lambda 형식으로 변경함.

아래는 처음에 짰던 코드.

 

 

 

 

Solution by Others:

slice(-1) 을 하면 훨씬 간결하구나. 어레이의 인덱스에 음수값을 사용하는 것이 아직 익숙하지 않다.

그리고 난 true, false를 리턴하는 문장을 직접 작성했는데 여기서는 비교연산의 결과를 바로 리턴한다.

난 왜 매번 이 생각을 못하지? 다음번에는 꼭 기억해야지.

 

 

 

배운점:

* slice() 메소드

* true / false 를 리턴할 일이 있으면 비교 연산의 결과를 바로 리턴할 수 있는지 생각해보기

+ Recent posts