반응형

출처 : http://stackoverflow.com/questions/3422685/what-is-python-buffer-type-for

Python의 buffer 타입은 무엇을 위한 건가요?

Python에는 buffer타입이 있습니다만 저는 어떻게 그것을 사용해야 할 지 모르겠습니다.

Python doc 설명은 다음과 같습니다.

buffer(object[, offset[, size]])

object 매개변수는 buffer 호출 인터페이스(문자열, 배열, 버퍼등)를 지원하는 객체여야 합니다. 새로운 buffer 객체는 object 매개변수를 참조하도록 만들어질 것입니다. buffer 객체는 객체의 시작부터 (또는 offset 위치부터) slice 될 수 있습니다. 이 slice는 객체의 끝 (또는 size 매개변수로 주어진 길이)까지 확장될 수 있습니다.


2 개의 답변 중 1 개의 답변만 추려냄.

다음은 사용 예시입니다.

>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world

이 경우 buffer는 6번째 위치에서 시작하며 길이가 5인 부분 문자열(sub-string)입니다. 그리고 이는 추가 저장 공간을 필요로 하지 않습니다. 그 이유는 string의 slice를 참조하기 때문 입니다.

이 코드 예시처럼 짧은 문자열에는 매우 유용하지는 않습니다. 하지만 큰 데이터를 사용할 때 필요할 수 있습니다. 이 예시는 변경가능한 bytearray를 사용하였습니다.

>>> s = bytearray(1000000)   # 백만개의 0 값인 바이트배열 
>>> t = buffer(s, 1)         # 인덱스 1의 바이트만 자름
>>> s[1] = 5                 # s에서 두 번째 요소를 5로 세팅
>>> t[0]                     # t에서 첫번째 요소가 s[1]이기도 함
'\x05'

이는 데이터에서 하나 이상의 view가 필요할 때 매우 유용하며 메모리에서 여러개의 복사본을 만들고 싶지 않을 때 유용합니다.

buffer(buffer)는 Python 2.7에도 사용할 수 있지만 Python 3에서 더 좋은 이름인 memoryview(memoryview)로 바뀌었습니다.

또한 C API를 살펴 보지 않고는 자체 객체에 대한 버퍼 인터페이스를 구현할 수 없습니다. 즉, 순수 Python에서는 수행 할 수 없습니다.

반응형
반응형

출처

http://stackoverflow.com/questions/16819222/how-to-return-dictionary-keys-as-a-list-in-python-3-3

Youtube

https://youtu.be/tnJqNEc9knk

Google Colab

https://colab.research.google.com/drive/1PZGbth0ZArjDPkzPBNpT4uCZjRDKPhQ0?usp=sharing

Python에서 dictionary 키를 list로 리턴하는 방법

저는 뭔가 매우 이상하다는 것을 알았습니다. Python 2.7과 Python 3의 오래된 버전에서 뭔가 많이 다른 것이 있습니다.

이전에, dictionary에서 key 값, value 값, item 값을 list로 쉽게 얻을 수 있었습니다.

  • Python 2.7
>>> newdict = {1:0, 2:0, 3:0} 
>>> newdict
{1: 0, 2: 0, 3: 0} 
>>> newdict.keys()
[1, 2, 3]

하지만 Python 3에서는 다음처럼 이렇게 나옵니다.

  • PYTHON 3.3.0
>>> newdict.keys() 
dict_keys([1, 2, 3])

3 개의 답변 중 1 개의 답변만 추려냄.

list(newdict.keys()) 를 시도해 보세요.

이는 dict_keys 객체를 list로 변환할 것입니다.
반면, 당신은 이것이 문제가 되는지 아닌지 스스로에게 물어봐야 합니다. 코드를 Python의 방법으로 작성하는 것은 duck typing(만약 그것이 오리처럼 생겼고, 오리처럼 꽥꽥 운다면 그것은 오리입니다.) 이라 가정합니다. dict_keys 객체는 대부분 list처럼 행동합니다. 예를 들면, 다음 소스처럼 list처럼 작동합니다.

for key in newdict.keys():
    print(key)

1
2
3

답변 후 추가 편집 내용

감사합니다. list(newdict.keys())가 제가 원하는대로 작동합니다.

현재는 다른 것이 저를 괴롭히고 있습니다. 저는 value 값으로 정렬하여 dictionary key 값과 value 값들을 뒤집어(reverse) list로 생성하고 싶습니다. 다음처럼 소스를 작성하였습니다. (다음은 나쁜 예시입니다. 모든 value 값들이 0이기 때문입니다.)

>>> zip(newdict.values(), newdict.keys())
[(0, 1), (0, 2), (0, 3)]

하지만, Python 3에서는 다음처럼 나옵니다.

>>> zip(list(newdict.keys()), list(newdict.values())) <zip object at 0x7f367c7df488>

아, 죄송합니다.

zip() 밖으로 list() 함수를 사용해야 됨을 알았습니다.

list(zip(newdict.values(), newdict.keys())) [(0, 1), (0, 2), (0, 3)]
반응형
반응형

출처 : http://stackoverflow.com/questions/7515266/rounding-problem-with-python

파이썬에서 반올림 문제

파이썬에서 반올림 문제가 있습니다. 제가 다음을 계산하면

32.50 * 0.19 = 6.1749999999999998

가 됩니다. 하지만 이는 6.175가 되어야 합니다. 만약 둘째 자리로 6.1749999999999998을 반올림하면 정확히 6.18을 보여줍니다. 여기까지는 괜찮습니다.

하지만 이를 계산하면

32.50 * 0.19 * 3 = 18.524999999999999

가 됩니다. 이는 18.525가 되어야 합니다. 만약 둘째 자리로 18.524999999999999을 반올림하면 18.52를 보여주어야 합니다.

이 값은 저에게 18.53을 보여주어야 합니다. 제가 무엇을 잘못했는지와 어떻게 이 현상을 고칠 수 있을까요?


7 개의 답변 중 2 개의 답변

당신은 잘못한 게 없고, 파이썬의 잘못도 아닙니다. 몇개의 십진 숫자들은 이진 부동형으로 정확하게 표현을 못할 뿐입니다.

1/3을 십진수로 (0.3333....) 정확히 쓸 수 없는 거처럼, 0.1을 이진수로는(0.000110011...)을 정확히 쓸 수 없습니다.

해결책 A:

print 32.5 * 0.19를 사용합니다. 이는 결과를 자동으로 반올림 합니다.

해결책 B:

예를 들어 통화 값을 계산할 때처럼 정확한 값이 필요하면 Decimal모듈을 사용합니다.

import decimal
D=decimal.Decimal

x=D('32.50')*D('0.19')
print(x)
# 6.1750
print(x.quantize(D('0.01'),rounding=decimal.ROUND_HALF_UP))
# 6.18

y=D('32.50')*D('0.19')*D('3')
print(y)
# 18.5250
print(y.quantize(D('0.01'),rounding=decimal.ROUND_HALF_UP))
# 18.53

해결책 C:

interactive session에서 결과를 자동으로 반올림하는 Python 3.2나 Python 2.7을 사용합니다.

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 32.50 * 0.19
6.175

모든 컴퓨터 과학자들이 알아야 할 부동 소수점 계산에 관한 것.

즉, 부동 소수점은 메모리에 저장되어 있는 방법 때문에 정확한 값이라고 의지하면 안 됩니다.

Python 문서에서 이에 관한 것도 보십시오 - 부동 소수점 산수: 이슈와 한계. 이는 다음 구문을 포함합니다.

예를 들어, 둘째 자리로 2.675를 반올림을 시도하면, 다음을 얻을 수 있습니다.
>>> round(2.675, 2)
2.67
빌트인 round 함수에 대한 문서는 가장 가까운 값으로 반올림하고 0에서 멀어지는 쪽으로 올림 혹은 내림 합니다. 십진수 유리수인 2.675는 정확히 2.67과 2.68이기 때문에, 당신은 (이진 근사로) 2.68이 여기 결과로 기대할 것입니다. 하지만 그렇지 않은데 십진수 문자열 2.675는 이진 부동 소수점으로 변환될 때, 이진 근사값으로 대체되는 데 정확한 값은
2.67499999999999982236431605997495353221893310546875 입니다.
이 근사값은 2.68보다는 2.67에 더 가깝기 때문에 내림이 됩니다.

반응형
반응형

Hain(하인) 오픈소스 프로그램 사용 후기

다운로드 홈페이지

https://github.com/appetizermonster/Hain/releases

64비트 운영체제일 경우 (2016년 4월 13일 오후 11:15 시간 기준으로) v0.1.0을 받으시면 되고요. 

32비트 운영체제일 경우 v0.0.4를 받으시면 됩니다.

프로그램 설명

https://github.com/appetizermonster/hain

Electron으로 빌드한 윈도우즈 운영체제를 위한 alt+space launcher(실행을 돕는 프로그램)입니다.

저(이 프로그램을 만드신 분)는 윈도우즈에서 Alfred를 대신하는 프로그램을 꿈꾸었습니다. 그래서 이를 자바스크립트로 만들었고, 이루어냈습니다.

An alt+space launcher for Windows, built with Electron.

I always dreamed an alternative to Alfred on Windows, that is made with JavaScript. so, I made it.

사용후기

저는 개인컴퓨터로는 Macbook을 사용하고 회사에서는 Windows 8을 사용 중에 있습니다. Macbook에서 Alfred프로그램을 사용하고 있어서 저도 Windows 상에서 이러한 종류의 프로그램을 사용하길 꿈꾸고 있었습니다. 우연히, facebook에서 이 프로그램의 존재를 알게 되어 위 홈페이지에서 프로그램을 다운로드 받아 사용하게 되었습니다. 

Alfred에서 alt+space를 누르면 위에처럼 창이 뜹니다. 원하는 프로그램 명을 입력하면 그에 대응하는 프로그램을 찾아줍니다. Hain 프로그램도 Alfred 기능이 똑같이 실행이 되어서 좋았습니다. 또한, /hpm이란 플러그인 기능이 있어서 자바스크립트로 코드를 작성하여 새로운 기능도 만들 수 있습니다.

그리고 오픈소스라 Github에 소스가 올라와 있습니다. 프로그램을 사용하던 중 VirtualBox가 실행이 안되는 버그를 발견하였습니다. 그래서 Github에 issue 등록 기능을 이용하여 버그에 대한 증상을 작성하였습니다. 4월 11일 버그의 원인을 제작하신 분께서 알려주셨습니다. 4월 13일 오늘 버그를 해결한 프로그램을 release 하셨습니다. 바로 확인을 해보니 VirtualBox 프로그램이 잘 실행됨을 확인할 수 있었습니다. 직접 소스를 다루어 본 거는 아니지만 저의 첫번째 오픈소스 활동이라 기쁩니다. 

반응형
반응형

출처 : http://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

크기로 du -h의 출력을 정렬할 수 있나요?

저는 du 출력을 사람이 읽을 수 있는 목록으로 얻고 싶습니다.

하지만, du는 "크기로 정렬"이란 옵션이 없기 때문에 sort로 pipe하는 것은 사람이 읽을 수 있도록 하는 플래그(human readable flag)가 작동하지 않습니다.

예를 들어 다음 명령을 실행하면

du | sort -n -r 

(내림차순으로) 크기로 정렬된 디스크 사용량이 출력됩니다.

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

하지만, 사람이 읽을 수 있도록 하는 플래그(human readable flag)를 사용하여 실행하면 적절하게 정렬되지 않습니다.

du -h | sort -n -r
508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

크기로 du -h를 정렬하는 방법을 아시는 분이 계신가요?


39 개의 답변 중 1개의 답변

2009년 8월에 GNU coreutils 7.5 가 나오고 부터, du -h와 같은 종류의 접미사를 사용하는 -h 파라미터를 sort에서 쓸 수 있습니다.

du -hs * | sort -h

만약 -h를 지원하지 않는 sort를 사용하신다면, GNU Coreutils를 설치할 수 있습니다. 다음은 오래된 Mac OS X 입니다.

brew install coreutils
du -hs * | gsort -h

다음은 sort 매뉴얼 내용입니다.

-h, --human-numeric-sort 사람이 읽을 수 있는 숫자를 비교한다 (예시, 2K 1G)

반응형
반응형

출처

http://stackoverflow.com/questions/750172/change-the-author-of-a-commit-in-git

Git에서 commit의 author(작가)를 변경하기

저는 학교 컴퓨터로 간단한 스크립트를 작성하면서 (집의 컴퓨터에서 복제된 내 pendrive에 있던 저장소에 있는) Git의 변경사항들을 commit하였습니다. 몇 개를 commit하고 나서 저는 root user로 commit했다는 것을 알았습니다.

제 이름으로 이 commit들의 author(작가)를 변경할 수 있는 방법이 있을까요?


39 개의 답변 중 1개의 답변

참고: 이 답변은 SHA1을 변경하므로 이미 push된 branch에서 사용할 때 주의하십시오. 이름의 철자를 수정하거나 오래된 이메일을 업데이트하려는 경우 git을 사용하면 .mailmap을 사용하여 기록을 다시 쓰지 않고도 이 작업을 수행할 수 있습니다. 저의 다른 답변을 참조하십시오.

Interactive Rebase 사용

당신은

git rebase -i -p <변경할 모든 commit 이전의 임의의 HEAD>

합니다. 다음에 rebase 파일에서 당신이 변경할(bad) commit에서 "edit"로 변경합니다. 만약 당신의 첫 번째 commit을 변경하고 싶다면, rebase 파일에 (다른 줄에 있는 포멧에 따라) 첫 번째 줄에 commit할 내용을 추가해야 합니다. 그리고 git에게 각 commit을 변경할 때 마다 다음을 수행합니다.

git commit --amend --author "New Author Name <email@address.com>" 

수정 또는 열었던 편집기를 닫았으면 다음을 수행합니다.

git rebase --continue

이 명령을 rebase를 계속 이어서 합니다.

만약 --no-edit을 추가함으로서 편집기를 열지 않을 수 있고 그 명령은 다음과 같습니다.

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

하나의 commit

몇몇 댓글달은 분들의 글로부터, 만약 가장 최근 commit만 변경하고 싶으시면 rebase 명령은 필요없습니다. 단지, 다음 명령만 수행하면 됩니다.

git commit --amend --author "New Author Name <email@address.com>"

이는 특정 이름의 author(작가)로 바뀌겠지만 committer는 당신이 git config user.namegit config user.email으로 설정했던 사용자로 설정될 것입니다. 만약 committer를 같이 설정하고 싶으시면 다음처럼 쓰시면 됩니다.

git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

commit을 merge하는 것에 대한 참고 사항

원래 답변에 약간의 오류가 있었습니다. 현재 HEAD<모든 잘못된 커밋 이전의 일부 HEAD> 사이에 commit을 merge할 경우 git rebase는 이를 병합합니다(그런데 GitHub pull 요청을 사용하는 경우 병합이 엄청나게 많을 것입니다. 기록에 커밋). 이것은 매우 자주 매우 다른 기록으로 이어질 수 있으며(중복된 변경 사항이 "리베이스 아웃"될 수 있으므로) 최악의 경우 git rebase가 어려운 병합 충돌(이미 commit을 merge했을 때 해결되었을 가능성이 있음)을 해결하도록 요청할 수 있습니다. 해결책은 git rebase-p 플래그를 사용하여 기록의 merge 구조를 보존하는 것입니다. git rebase에 대한 맨페이지는 -p 및 -i를 사용하면 문제가 발생할 수 있다고 경고하지만 BUGS 섹션에는 "commit을 편집하고 commit 메시지를 다시 작성하면 잘 작동해야 합니다."라고 나와 있습니다.

위의 명령에 -p를 추가했습니다. 가장 최근 커밋을 변경하는 경우에는 문제가 되지 않습니다.

최신 git 클라이언트용 업데이트(2020년 7월)

-p 대신 --rebase-merge를 사용합니다(-p는 더 이상 사용되지 않으며 심각한 문제가 있음).

반응형
반응형

문제점

맥북을 사용하면서 사파리와 크롬을 사용할 때 https 사이트가 공인인증서가 필요하다고 물어보면서 접속이 되지 않는 문제가 있었습니다. 

또한,  맥북 앱스토어도 접속이 되지 않는 문제가 있었습니다.


해결과정

우선, Mac 서비스 센터를 검색하여 찾아보았습니다.

https://locate.apple.com/kr/ko/service/?pt=4&lat=37.547895&lon=126.941893&address=서울시

전화를 해보니 Mac 서비스 센터에서는 '하드웨어'적인 문제만 해결할 수 있다고 하였습니다.

저는 '소프트웨어'적인 문제이기 때문에 애플고객지원센터 전화번호 '080-333-4000'을 알려주었습니다.


토요일에 해당 전화번호로 전화를 하였습니다.

iCloud를 통해 원격제어를 해 가면서 문제가 무엇인지 직원분께서 찾으면서

직원분이 컴퓨터를 재부팅 하는 등의 지시를 했고 저는 그 지시를 따라하였습니다.

첫 번째 전화에 문제가 해결되지 않자 고객지원센터에서 제 이메일로 번호를 남겨주었습니다.


다시 전화해서 이메일에 남은 번호를 말하자 계속해서 문제를 해결해 나갔습니다.

전의 직원 분이 해결 할 수 없어서 전문 상담사가 내용을 이어받아 처리를 하기 시작하였습니다.

인터넷 뱅킹이 문제가 된거 같아 해당 보안 프로그램을 지워보았지만 문제가 해결되지 않았습니다.

그래서 다음날 다시 전화 하기로 하였습니다.


일요일에 다시 전화를 하였습니다.

다른 전문 상담사를 통해서 처리를 해 나갔고

iCloud의 원격제어를 하며 전문 상담사가 해당 내용을 찾아가면서 지시대로 여러가지를 시도해 보았습니다.

결국은 avast 프로그램의 보안 설정 때문에 문제가 됨을 알았고 해당 프로그램을 닫고 지우자 문제가 해결되었습니다.


후기

문제를 해결하는 데는 오래걸렸지만 전문 상담사가 차근히 찾아가면서 문제를 해결할 수 있어 좋았고 고맙습니다.

또, Mac을 사용하면서 문제가 발생하면 전화하게 될 듯 합니다. 

그리고 토요일 일요일 주말인데도 아침 9시부터 저녁 9시까지 고객지원센터를 운영한다는 점도 놀랍고 좋은 점이라 생각합니다.



반응형
반응형

출처 

http://stackoverflow.com/questions/1186535/how-to-modify-a-specified-commit-in-git

Git에서 특정 commit만 수정하는 방법?

저는 리뷰하면서 commit의 모든 목록을 제출합니다. 만약, 

- HEAD

- Commit3

- Commit2

- Commit1

저는 git commit --amend로 HEAD commit을 수정할 수 있다는 걸 알지만, 어떻게 HEADcommit이 아닌 Commit1을 수정할 수 있을까요?

----

4 개의 답변 중 1개의 답변만 추려냄.

당신은 git rebase를 사용할 수 있습니다. 만약 commit bbc643cd으로 돌아가서 수정하고 싶으시면, 다음을 실행합니다.

$ git rebase --interactive 'bbc643cd^'

기본 편집기로, 수정하고 싶은 commit의 줄에서 'pick'을 'edit'로 변경합니다. 원하는 대로 작업 디렉터리를 변경하고 이전과 같은 메세지로 다음처럼 commit 합니다.

$ git commit --all --amend --no-edit (1)

commit을 변경하고, 다음을 입력하여

$ git rebase --continue

이전 HEAD commit으로 돌아옵니다.

경고 : 이는 모든 자식들까지 포함하여 SHA-1 commit이 바뀌게 됨을 아셔야 됩니다. 다른 말로, 이는 그 지점부터 앞으로 history (commit)을 다시 쓰게 됩니다. 만약 git push --force명령을 사용하여 push를 하면 이를 수행한 저장소는 망가질 수 있습니다.

---

역자주

https://git-scm.com/docs/git-commit

(1) git commit --all --amend --no-edit

--all : -a와 같은 의미로 수정되거나 삭제된 파일을 자동으로 stage 영역으로 올립니다.

--amend : commit을 추가하지 않고 마지막 commit을 수정합니다.

--no-edit : --amend와 결합하여 commit 메세지 변화없이 마지막 commit을 수정합니다.



반응형
반응형

출처 

http://stackoverflow.com/questions/7872846/how-to-read-from-standard-input-non-blocking

자바에서 표준 입력을 non-blocking으로 읽는 방법?

    long end=System.currentTimeMillis()+60*10;
    InputStreamReader fileInputStream=new InputStreamReader(System.in);
    BufferedReader bufferedReader=new BufferedReader(fileInputStream);
    try
    {
        while((System.currentTimeMillis()<end) && (bufferedReader.readLine()!=null))
        {

        }
        bufferedReader.close();
    }
    catch(java.io.IOException e)
    {
        e.printStackTrace();
    }

저는 600밀리초 안에 읽기 위해 위에처럼 시도하였습니다만 bufferedReader가 blocking되어 readline에서 읽기가 되지 않습니다. 제발 도와주세요.

----

5 개의 답변 중 1개의 답변만 추려냄.

역자주 : available() 메소드가 Java 1.5에는 없어서 ready() 메소드를 사용하여 문제를 해결하였습니다.

long end=System.currentTimeMillis()+60*10;
InputStreamReader fileInputStream = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(fileInputStream);
try {
    while ((System.currentTimeMillis() < end)) {
        if (bufferedReader.ready()) {
            System.out.println(bufferedReader.readLine());
        }
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (bufferedReader != null) {
            bufferedReader.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}


반응형
반응형

출처 : http://stackoverflow.com/questions/8494209/modulus-in-django-template

Django Template의 나머지(%) 연산

저는 django에서 나머지 연산자 같은 것을 사용하는 방법을 찾고 있습니다. 제가 하려고 하는 것은 루프문에서 4번째 요소마다 클래스 이름을 추가하는 것입니다.

나머지 연산자를 사용하여 다음처럼 작성하였습니다.

당연히 %가 탬플릿에서 예약된 문자이기 때문에 작동을 안할 것입니다. 이를 할 수 있는 다른 방법이 있을까요?


3 개의 답변 중 1개의 답변만 추려냄.

내장된(build-in) django filter인 divisibleby가 필요합니다.

{% for p in posts %}
    <div class="post width1 height2 column {% if forloop.counter0|divisibleby:4 %}first{% endif %}">
        <div class="preview">

        </div>
        <div class="overlay">

        </div>
        <h2>p.title</h2>
    </div>
{% endfor %}
반응형

+ Recent posts